@cognite/reveal 3.0.0-alpha.2 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/core/cad.d.ts +4 -4
- package/core/index.d.ts +6 -7
- package/core/src/index.d.ts +13 -19
- package/core/src/internals.d.ts +10 -15
- package/core/src/public/RevealManager.d.ts +61 -64
- package/core/src/public/createRevealManager.d.ts +23 -23
- package/core/src/public/migration/Cognite3DViewer.d.ts +485 -559
- package/core/src/public/migration/NotSupportedInMigrationWrapperError.d.ts +11 -11
- package/core/src/public/migration/RenderController.d.ts +4 -4
- package/core/src/public/migration/types.d.ts +199 -253
- package/core/src/public/types.d.ts +25 -47
- package/core/src/storage/RevealManagerHelper.d.ts +59 -58
- package/core/src/utilities/Spinner.d.ts +27 -27
- package/core/src/utilities/ViewStateHelper.d.ts +49 -37
- package/core/src/utilities/index.d.ts +6 -8
- package/core/src/utilities/reflection.d.ts +7 -7
- package/core/utilities.d.ts +4 -4
- package/extensions/datasource.d.ts +9 -9
- package/extensions/datasource.js +5 -8
- package/extensions/datasource.map +1 -1
- package/index.d.ts +13 -9
- package/index.js +195 -167
- package/index.map +1 -1
- package/package.json +18 -17
- package/packages/cad-geometry-loaders/index.d.ts +7 -13
- package/packages/cad-geometry-loaders/src/CadLoadingHints.d.ts +11 -11
- package/packages/cad-geometry-loaders/src/CadModelBudget.d.ts +21 -19
- package/packages/cad-geometry-loaders/src/CadModelUpdateHandler.d.ts +44 -42
- package/packages/cad-geometry-loaders/src/sector/ModelStateHandler.d.ts +12 -12
- package/packages/cad-geometry-loaders/src/sector/SectorDownloadScheduler.d.ts +22 -22
- package/packages/cad-geometry-loaders/src/sector/SectorLoader.d.ts +32 -31
- package/packages/cad-geometry-loaders/src/sector/culling/ByScreenSizeSectorCuller.d.ts +23 -23
- package/packages/cad-geometry-loaders/src/sector/culling/ByVisibilityGpuSectorCuller.d.ts +51 -51
- package/packages/cad-geometry-loaders/src/sector/culling/OrderSectorsByVisibilityCoverage.d.ts +106 -107
- package/packages/cad-geometry-loaders/src/sector/culling/RenderAlreadyLoadedGeometryProvider.d.ts +9 -0
- package/packages/cad-geometry-loaders/src/sector/culling/SectorCuller.d.ts +33 -33
- package/packages/cad-geometry-loaders/src/sector/culling/WeightFunctionsHelper.d.ts +50 -50
- package/packages/cad-geometry-loaders/src/sector/culling/computeNdcAreaOfBox.d.ts +12 -12
- package/packages/cad-geometry-loaders/src/sector/culling/computeSectorCost.d.ts +7 -7
- package/packages/cad-geometry-loaders/src/sector/culling/createV8SectorCuller.d.ts +7 -7
- package/packages/cad-geometry-loaders/src/sector/culling/takensectors/TakenSectorMapBase.d.ts +11 -11
- package/packages/cad-geometry-loaders/src/sector/culling/takensectors/TakenV8SectorMap.d.ts +17 -17
- package/packages/cad-geometry-loaders/src/sector/culling/takensectors/TakenV8SectorTree.d.ts +24 -24
- package/packages/cad-geometry-loaders/src/sector/culling/takensectors/TakenV9SectorMap.d.ts +20 -20
- package/packages/cad-geometry-loaders/src/sector/culling/takensectors/index.d.ts +5 -5
- package/packages/cad-geometry-loaders/src/sector/culling/transformBoxToNDC.d.ts +5 -5
- package/packages/cad-geometry-loaders/src/sector/culling/types.d.ts +83 -83
- package/packages/cad-geometry-loaders/src/sector/rxSectorUtilities.d.ts +12 -12
- package/packages/cad-geometry-loaders/src/utilities/PromiseUtils.d.ts +28 -28
- package/packages/cad-geometry-loaders/src/utilities/rxOperations.d.ts +6 -6
- package/packages/cad-model/index.d.ts +12 -0
- package/{core/src/utilities → packages/cad-model/src}/BoundingBoxClipper.d.ts +23 -23
- package/{core/src/datamodels/cad → packages/cad-model/src}/CadManager.d.ts +48 -43
- package/packages/cad-model/src/CadModelFactory.d.ts +16 -0
- package/{core/src/datamodels/cad → packages/cad-model/src}/CadModelSectorLoadStatistics.d.ts +38 -38
- package/{core/src/public/migration → packages/cad-model/src}/Cognite3DModel.d.ts +337 -340
- package/packages/cad-model/src/GeometryFilter.d.ts +20 -0
- package/packages/cad-model/src/InternalRevealCadOptions.d.ts +13 -0
- package/packages/cad-model/src/WellKnownUnit.d.ts +7 -0
- package/{core/src/utilities → packages/cad-model/src}/callActionWithIndicesAsync.d.ts +4 -4
- package/{core/src/datamodels/cad → packages/cad-model/src}/createCadManager.d.ts +10 -9
- package/{core/src/datamodels/cad → packages/cad-model/src}/picking.d.ts +28 -28
- package/packages/cad-parsers/index.d.ts +20 -21
- package/packages/cad-parsers/src/cad/CadSectorParser.d.ts +15 -15
- package/packages/cad-parsers/src/cad/LevelOfDetail.d.ts +8 -8
- package/packages/cad-parsers/src/cad/filterInstanceMesh.d.ts +6 -6
- package/packages/cad-parsers/src/cad/filterPrimitivesCommon.d.ts +5 -5
- package/packages/cad-parsers/src/cad/filterPrimitivesV8.d.ts +9 -9
- package/packages/cad-parsers/src/cad/filterPrimitivesV9.d.ts +6 -6
- package/packages/cad-parsers/src/cad/primitiveGeometries.d.ts +30 -31
- package/packages/cad-parsers/src/cad/triangleMeshes.d.ts +6 -6
- package/packages/cad-parsers/src/cad/types.d.ts +56 -56
- package/packages/cad-parsers/src/metadata/CadMetadataParser.d.ts +7 -7
- package/{core/src/datamodels/cad/sector → packages/cad-parsers/src/metadata}/CadModelClipper.d.ts +10 -10
- package/packages/cad-parsers/src/metadata/CadModelMetadata.d.ts +54 -54
- package/packages/cad-parsers/src/metadata/CadModelMetadataRepository.d.ts +16 -16
- package/packages/cad-parsers/src/metadata/parsers/CadMetadataParserGltf.d.ts +8 -6
- package/packages/cad-parsers/src/metadata/parsers/CadMetadataParserV8.d.ts +6 -6
- package/packages/cad-parsers/src/metadata/parsers/types.d.ts +62 -60
- package/packages/cad-parsers/src/metadata/types.d.ts +53 -52
- package/packages/cad-parsers/src/sector/RootSectorNode.d.ts +13 -12
- package/packages/cad-parsers/src/sector/SectorNode.d.ts +22 -21
- package/packages/cad-parsers/src/utilities/SectorScene.d.ts +23 -21
- package/packages/cad-parsers/src/utilities/SectorSceneFactory.d.ts +9 -9
- package/packages/cad-parsers/src/utilities/computeBoundingBoxFromAttributes.d.ts +10 -10
- package/packages/cad-parsers/src/utilities/float32BufferToMatrix.d.ts +12 -12
- package/packages/cad-parsers/src/utilities/types.d.ts +71 -74
- package/packages/cad-styling/index.d.ts +20 -13
- package/{core/src/datamodels/cad/styling → packages/cad-styling/src}/AssetNodeCollection.d.ts +47 -45
- package/packages/cad-styling/src/CdfModelNodeCollectionDataProvider.d.ts +26 -0
- package/packages/cad-styling/src/CombineNodeCollectionBase.d.ts +34 -33
- package/packages/cad-styling/src/IntersectionNodeCollection.d.ts +20 -19
- package/{core/src/datamodels/cad/styling → packages/cad-styling/src}/InvertedNodeCollection.d.ts +27 -25
- package/packages/cad-styling/src/NodeAppearance.d.ts +85 -85
- package/packages/cad-styling/src/NodeAppearanceProvider.d.ts +38 -36
- package/packages/cad-styling/src/NodeCollection.d.ts +26 -0
- package/packages/cad-styling/src/NodeCollectionDeserializer.d.ts +26 -0
- package/{core/src/datamodels/cad/styling → packages/cad-styling/src}/PopulateIndexSetFromPagedResponseHelper.d.ts +30 -30
- package/{core/src/datamodels/cad/styling → packages/cad-styling/src}/PropertyFilterNodeCollection.d.ts +57 -55
- package/packages/cad-styling/src/SerializedNodeCollection.d.ts +8 -0
- package/{core/src/datamodels/cad/styling → packages/cad-styling/src}/SinglePropertyFilterNodeCollection.d.ts +53 -51
- package/packages/cad-styling/src/TreeIndexNodeCollection.d.ts +40 -39
- package/packages/cad-styling/src/UnionNodeCollection.d.ts +19 -18
- package/packages/cad-styling/src/prioritized/AreaCollection.d.ts +39 -39
- package/packages/cad-styling/src/prioritized/BoxClusterer.d.ts +29 -29
- package/packages/cad-styling/src/prioritized/ClusteredAreaCollection.d.ts +17 -17
- package/packages/cad-styling/src/prioritized/EmptyAreaCollection.d.ts +18 -18
- package/packages/cad-styling/src/prioritized/types.d.ts +7 -7
- package/packages/camera-manager/index.d.ts +8 -6
- package/packages/camera-manager/src/CameraManager.d.ts +73 -84
- package/packages/camera-manager/src/CameraManagerHelper.d.ts +42 -0
- package/packages/camera-manager/src/ComboControls.d.ts +112 -101
- package/packages/camera-manager/src/DefaultCameraManager.d.ts +136 -0
- package/packages/camera-manager/src/Keyboard.d.ts +17 -17
- package/packages/camera-manager/src/types.d.ts +75 -64
- package/packages/data-source/index.d.ts +6 -6
- package/packages/data-source/src/CdfDataSource.d.ts +19 -19
- package/packages/data-source/src/DataSource.d.ts +25 -25
- package/packages/data-source/src/LocalDataSource.d.ts +15 -15
- package/packages/logger/index.d.ts +5 -5
- package/packages/logger/src/Log.d.ts +5 -5
- package/packages/metrics/index.d.ts +4 -5
- package/packages/metrics/src/MetricsLogger.d.ts +21 -21
- package/packages/metrics/src/types.d.ts +7 -7
- package/packages/model-base/index.d.ts +8 -0
- package/{core/src/public/migration → packages/model-base/src}/CogniteModelBase.d.ts +17 -17
- package/packages/{cad-parsers/src/metadata → model-base/src}/MetadataRepository.d.ts +7 -7
- package/{core/src/public/migration → packages/model-base/src}/NodeIdAndTreeIndexMaps.d.ts +4 -4
- package/{core/src/datamodels/base → packages/model-base/src}/SupportedModelTypes.d.ts +4 -4
- package/packages/{cad-geometry-loaders/src/utilities → model-base/src}/types.d.ts +36 -25
- package/packages/modeldata-api/index.d.ts +12 -13
- package/packages/modeldata-api/src/CdfModelDataProvider.d.ts +17 -17
- package/packages/modeldata-api/src/CdfModelIdentifier.d.ts +15 -15
- package/packages/modeldata-api/src/CdfModelMetadataProvider.d.ts +20 -20
- package/packages/modeldata-api/src/LocalModelDataProvider.d.ts +10 -10
- package/packages/modeldata-api/src/LocalModelIdentifier.d.ts +14 -14
- package/packages/modeldata-api/src/LocalModelMetadataProvider.d.ts +16 -16
- package/packages/modeldata-api/src/ModelIdentifier.d.ts +12 -12
- package/packages/modeldata-api/src/ModelMetadataProvider.d.ts +18 -18
- package/packages/modeldata-api/src/applyDefaultModelTransformation.d.ts +6 -6
- package/packages/modeldata-api/src/types.d.ts +47 -47
- package/packages/modeldata-api/src/utilities.d.ts +7 -7
- package/packages/nodes-api/index.d.ts +6 -6
- package/packages/nodes-api/src/NodesApiClient.d.ts +50 -50
- package/packages/nodes-api/src/NodesCdfClient.d.ts +24 -24
- package/packages/nodes-api/src/NodesLocalClient.d.ts +30 -30
- package/packages/nodes-api/src/types.d.ts +10 -10
- package/packages/pointclouds/index.d.ts +13 -0
- package/{core/src/public/migration → packages/pointclouds/src}/CognitePointCloudModel.d.ts +120 -121
- package/packages/pointclouds/src/PointCloudBudget.d.ts +14 -0
- package/{core/src/datamodels/pointcloud → packages/pointclouds/src}/PointCloudFactory.d.ts +9 -9
- package/packages/pointclouds/src/PointCloudIntersection.d.ts +26 -0
- package/{core/src/datamodels/pointcloud → packages/pointclouds/src}/PointCloudManager.d.ts +26 -26
- package/{core/src/datamodels/pointcloud → packages/pointclouds/src}/PointCloudMetadata.d.ts +14 -14
- package/{core/src/datamodels/pointcloud → packages/pointclouds/src}/PointCloudMetadataRepository.d.ts +14 -14
- package/{core/src/datamodels/pointcloud → packages/pointclouds/src}/PointCloudNode.d.ts +62 -62
- package/{core/src/datamodels/pointcloud → packages/pointclouds/src}/PotreeGroupWrapper.d.ts +39 -39
- package/{core/src/datamodels/pointcloud → packages/pointclouds/src}/PotreeNodeWrapper.d.ts +38 -38
- package/{core/src/datamodels/pointcloud → packages/pointclouds/src}/createPointCloudManager.d.ts +6 -6
- package/{core/src/datamodels/pointcloud → packages/pointclouds/src}/picking.d.ts +29 -29
- package/{core/src/datamodels/pointcloud → packages/pointclouds/src}/types.d.ts +114 -114
- package/packages/rendering/index.d.ts +14 -17
- package/packages/rendering/src/CadMaterialManager.d.ts +39 -37
- package/packages/rendering/src/GeometryBatchingManager.d.ts +31 -30
- package/packages/rendering/src/InstancedMeshManager.d.ts +20 -20
- package/packages/rendering/src/rendering/EffectRenderManager.d.ts +99 -99
- package/packages/rendering/src/rendering/NodeAppearanceTextureBuilder.d.ts +51 -51
- package/packages/rendering/src/rendering/RenderMode.d.ts +15 -15
- package/packages/rendering/src/rendering/createSimpleGeometryMesh.d.ts +6 -6
- package/packages/rendering/src/rendering/matCapTextureData.d.ts +5 -5
- package/packages/rendering/src/rendering/materials.d.ts +23 -23
- package/packages/rendering/src/rendering/primitives.d.ts +12 -12
- package/packages/rendering/src/rendering/shaders.d.ts +101 -101
- package/packages/rendering/src/rendering/types.d.ts +76 -76
- package/packages/rendering/src/sector/CadNode.d.ts +57 -63
- package/packages/rendering/src/transform/NodeTransformProvider.d.ts +13 -13
- package/packages/rendering/src/transform/NodeTransformTextureBuilder.d.ts +23 -23
- package/packages/rendering/src/transform/TransformOverrideBuffer.d.ts +21 -21
- package/packages/rendering/src/utilities/types.d.ts +26 -26
- package/packages/sector-loader/index.d.ts +6 -6
- package/packages/sector-loader/src/GltfSectorLoader.d.ts +12 -0
- package/packages/sector-loader/src/GltfSectorRepository.d.ts +19 -14
- package/packages/sector-loader/src/SectorRepository.d.ts +10 -9
- package/packages/sector-loader/src/V8SectorRepository.d.ts +26 -25
- package/packages/sector-loader/src/v8/SimpleAndDetailedToSector3D.d.ts +20 -20
- package/packages/sector-loader/src/v8/arrays.d.ts +5 -5
- package/packages/sector-loader/src/v8/groupMeshesByNumber.d.ts +8 -8
- package/packages/sector-loader/src/v8/sectorUtilities.d.ts +16 -16
- package/packages/sector-parser/index.d.ts +5 -5
- package/packages/sector-parser/src/DracoDecoderHelper.d.ts +32 -0
- package/packages/sector-parser/src/GltfSectorParser.d.ts +19 -18
- package/packages/sector-parser/src/constants.d.ts +6 -0
- package/packages/sector-parser/src/reveal-glb-parser/GlbMetadataParser.d.ts +14 -14
- package/packages/sector-parser/src/reveal-glb-parser/primitiveGeometries.d.ts +12 -12
- package/packages/sector-parser/src/types.d.ts +106 -98
- package/packages/tools/index.d.ts +15 -15
- package/packages/tools/src/AxisView/AxisViewTool.d.ts +32 -32
- package/packages/tools/src/AxisView/types.d.ts +98 -98
- package/packages/tools/src/Cognite3DViewerToolBase.d.ts +25 -25
- package/packages/tools/src/DebugCameraTool.d.ts +20 -20
- package/packages/tools/src/DebugLoadedSectorsTool.d.ts +23 -23
- package/packages/tools/src/ExplodedViewTool.d.ts +12 -12
- package/packages/tools/src/Geomap/Geomap.d.ts +17 -17
- package/packages/tools/src/Geomap/GeomapTool.d.ts +23 -23
- package/packages/tools/src/Geomap/MapConfig.d.ts +195 -195
- package/packages/tools/src/HtmlOverlay/BucketGrid2D.d.ts +28 -28
- package/packages/tools/src/HtmlOverlay/HtmlOverlayTool.d.ts +160 -160
- package/packages/tools/src/Timeline/Keyframe.d.ts +39 -39
- package/packages/tools/src/Timeline/TimelineTool.d.ts +79 -79
- package/packages/tools/src/Timeline/types.d.ts +13 -13
- package/packages/tools/src/types.d.ts +4 -4
- package/packages/utilities/index.d.ts +32 -28
- package/packages/utilities/src/CameraConfiguration.d.ts +10 -10
- package/packages/utilities/src/DeferredPromise.d.ts +17 -17
- package/packages/utilities/src/IndexSet.d.ts +1 -1
- package/packages/utilities/src/NumericRange.d.ts +22 -22
- package/packages/utilities/src/RandomColors.d.ts +34 -34
- package/packages/utilities/src/WebGLRendererStateHelper.d.ts +15 -15
- package/packages/utilities/src/assertNever.d.ts +7 -7
- package/packages/utilities/src/cache/MemoryRequestCache.d.ts +24 -22
- package/packages/utilities/src/cache/MostFrequentlyUsedCache.d.ts +19 -19
- package/packages/utilities/src/cache/RequestCache.d.ts +13 -13
- package/packages/utilities/src/calculateVolumeOfMesh.d.ts +4 -0
- package/packages/utilities/src/counterMap.d.ts +5 -5
- package/packages/utilities/src/datastructures/DynamicDefragmentedBuffer.d.ts +33 -35
- package/packages/utilities/src/determinePowerOfTwoDimensions.d.ts +11 -11
- package/packages/utilities/src/disposeAttributeArrayOnUpload.d.ts +17 -17
- package/packages/utilities/src/events/EventTrigger.d.ts +13 -13
- package/packages/utilities/src/events/InputHandler.d.ts +34 -25
- package/packages/utilities/src/events/clickOrTouchEventOffset.d.ts +13 -13
- package/packages/utilities/src/events/index.d.ts +6 -6
- package/packages/utilities/src/indexset/IndexSet.d.ts +26 -26
- package/packages/utilities/src/indexset/IntermediateIndexNode.d.ts +26 -26
- package/packages/utilities/src/indexset/LeafIndexNode.d.ts +16 -16
- package/packages/utilities/src/isMobileOrTablet.d.ts +4 -4
- package/packages/utilities/src/networking/isTheSameDomain.d.ts +11 -11
- package/packages/utilities/src/objectTraversal.d.ts +8 -8
- package/packages/utilities/src/packFloat.d.ts +6 -6
- package/packages/utilities/src/revealEnv.d.ts +10 -10
- package/packages/utilities/src/three/AutoDisposeGroup.d.ts +17 -17
- package/packages/utilities/src/three/BoundingBoxLOD.d.ts +27 -27
- package/packages/utilities/src/three/isBox3OnPositiveSideOfPlane.d.ts +10 -10
- package/packages/utilities/src/three/toThreeBox3.d.ts +6 -6
- package/packages/utilities/src/three/unionBoxes.d.ts +5 -0
- package/packages/utilities/src/three/visitBox3CornerPoints.d.ts +12 -12
- package/packages/utilities/src/transformCameraConfiguration.d.ts +6 -6
- package/packages/utilities/src/types.d.ts +11 -11
- package/packages/utilities/src/workers/WorkerPool.d.ts +14 -14
- package/{core/src/utilities → packages/utilities/src}/worldToViewport.d.ts +30 -30
- package/tools.d.ts +7 -7
- package/tools.js +98 -74
- package/tools.map +1 -1
- package/core/src/datamodels/base/index.d.ts +0 -6
- package/core/src/datamodels/base/types.d.ts +0 -14
- package/core/src/datamodels/cad/CadModelFactory.d.ts +0 -13
- package/core/src/datamodels/cad/rendering/RenderAlreadyLoadedGeometryProvider.d.ts +0 -10
- package/core/src/datamodels/cad/styling/NodeCollectionDeserializer.d.ts +0 -26
- package/core/src/datamodels/cad/styling/index.d.ts +0 -8
- package/core/src/datamodels/pointcloud/index.d.ts +0 -5
- package/core/src/migration.d.ts +0 -8
- package/packages/cad-geometry-loaders/src/sector/culling/OccludingGeometryProvider.d.ts +0 -6
- package/packages/cad-styling/src/NodeCollectionBase.d.ts +0 -54
- package/packages/modeldata-api/src/CdfModelOutputsProvider.d.ts +0 -16
- package/packages/modeldata-api/src/Model3DOutputList.d.ts +0 -17
- package/packages/rendering/src/cameraconfig.d.ts +0 -12
package/index.js
CHANGED
|
@@ -1,491 +1,519 @@
|
|
|
1
|
-
!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var
|
|
1
|
+
!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var r=t();for(var n in r)("object"==typeof exports?exports:e)[n]=r[n]}}("undefined"!=typeof self?self:this,(function(){return function(e){var t={};function r(n){if(t[n])return t[n].exports;var i=t[n]={i:n,l:!1,exports:{}};return e[n].call(i.exports,i,i.exports,r),i.l=!0,i.exports}return r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)r.d(n,i,function(t){return e[t]}.bind(null,i));return n},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="https://apps-cdn.cogniteapp.com/@cognite/reveal-parser-worker/1.3.0/",r(r.s=71)}([function(e,t){e.exports=require("three")},function(e,t,r){"use strict";
|
|
2
2
|
/*!
|
|
3
3
|
* Copyright 2021 Cognite AS
|
|
4
4
|
*/
|
|
5
|
-
function
|
|
5
|
+
function n(e,t){if(t(e))for(let r=0;r<e.children.length;r++)n(e.children[r],t)}function i(e,t){if(void 0===e)return;const{position:r,target:n}=e;return r.applyMatrix4(t),n.applyMatrix4(t),{position:r,target:n}}r.d(t,"y",(function(){return n})),r.d(t,"x",(function(){return i})),r.d(t,"e",(function(){return c})),r.d(t,"g",(function(){return u})),r.d(t,"q",(function(){return p})),r.d(t,"m",(function(){return f})),r.d(t,"j",(function(){return m})),r.d(t,"o",(function(){return h})),r.d(t,"f",(function(){return y})),r.d(t,"u",(function(){return k})),r.d(t,"d",(function(){return N})),r.d(t,"a",(function(){return E})),r.d(t,"b",(function(){return B})),r.d(t,"w",(function(){return D})),r.d(t,"s",(function(){return F})),r.d(t,"z",(function(){return z})),r.d(t,"t",(function(){return G})),r.d(t,"k",(function(){return U})),r.d(t,"l",(function(){return W})),r.d(t,"h",(function(){return H})),r.d(t,"i",(function(){return Y})),r.d(t,"p",(function(){return q})),r.d(t,"v",(function(){return L})),r.d(t,"r",(function(){return Q})),r.d(t,"n",(function(){return X})),r.d(t,"A",(function(){return K})),r.d(t,"B",(function(){return $})),r.d(t,"c",(function(){return ee}));var o=r(0);
|
|
6
6
|
/*!
|
|
7
7
|
* Copyright 2021 Cognite AS
|
|
8
|
-
*/class a{static color(e){const t=a._colors.get(e);if(void 0!==t)return t;const
|
|
8
|
+
*/class a{static color(e){const t=a._colors.get(e);if(void 0!==t)return t;const r=a.generateRandomColor();return a._colors.set(e,r),r}static colorRGB(e){const t=a.color(e);return[Math.floor(255*t.r),Math.floor(255*t.g),Math.floor(255*t.b)]}static colorCSS(e){const[t,r,n]=a.colorRGB(e);return`rgb(${t}, ${r}, ${n})`}static generateRandomColor(){const e=Math.random(),t=.4+.6*Math.random(),r=.3+.4*Math.random();return(new o.Color).setHSL(e,t,r)}}
|
|
9
9
|
/*!
|
|
10
10
|
* Copyright 2021 Cognite AS
|
|
11
11
|
*/
|
|
12
|
-
function s(e,t){const
|
|
12
|
+
function s(e,t){const r=t.getBoundingClientRect();if(e instanceof MouseEvent)return{offsetX:e.clientX-r.left,offsetY:e.clientY-r.top};if(e.changedTouches.length>0){const t=e.changedTouches[0];return{offsetX:t.clientX-r.left,offsetY:t.clientY-r.top}}return{offsetX:-1,offsetY:-1}}
|
|
13
13
|
/*!
|
|
14
14
|
* Copyright 2021 Cognite AS
|
|
15
|
-
*/a._colors=new Map;class
|
|
15
|
+
*/a._colors=new Map;class c{constructor(){this._listeners=[]}subscribe(e){this._listeners.push(e)}unsubscribe(e){const t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1)}unsubscribeAll(){this._listeners.splice(0)}fire(...e){this._listeners.forEach(t=>t(...e))}}var l=r(14),d=r.n(l);
|
|
16
16
|
/*!
|
|
17
17
|
* Copyright 2021 Cognite AS
|
|
18
18
|
*/
|
|
19
|
-
|
|
19
|
+
function f(e,t){throw new Error(t||"Unexpected object: "+e)}
|
|
20
20
|
/*!
|
|
21
21
|
* Copyright 2021 Cognite AS
|
|
22
|
-
*/
|
|
22
|
+
*/class u{constructor(e){this._events={click:new c,hover:new c},this.onHoverCallback=d()(e=>{this._events.hover.fire(s(e,this.domElement))},100),this.domElement=e,this.setupEventListeners()}on(e,t){switch(e){case"click":this._events.click.subscribe(t);break;case"hover":this._events.hover.subscribe(t);break;default:f(e)}}off(e,t){switch(e){case"click":this._events.click.unsubscribe(t);break;case"hover":this._events.hover.unsubscribe(t);break;default:f(e)}}dispose(){p(this._events)}setupEventListeners(){const{domElement:e}=this;let t=!1,r=0,n=!1;const i=new o.Vector2,a=o=>{this.handleClickEvent(o,i,t,n,r),t=!1,n=!1,e.removeEventListener("mouseup",a),e.removeEventListener("touchend",a),e.addEventListener("mousemove",this.onHoverCallback)},c=o=>{t=!0,n=!0,r=o.timeStamp;const{offsetX:c,offsetY:l}=s(o,e);i.set(c,l),e.addEventListener("mouseup",a),e.addEventListener("touchend",a),e.removeEventListener("mousemove",this.onHoverCallback)};e.addEventListener("mousedown",c),e.addEventListener("touchstart",c),e.addEventListener("mousemove",this.onHoverCallback)}isProperClick(e,t,r,n,i){const{offsetX:o,offsetY:a}=s(e,this.domElement),c=e.timeStamp-i,l=Math.abs(o-t.x)+Math.abs(a-t.y)>u.maxMoveDistance;return r&&n&&c<u.maxClickDuration&&!l}handleClickEvent(e,t,r,n,i){this.isProperClick(e,t,r,n,i)&&this._events.click.fire(s(e,this.domElement))}}function p(e){for(const t of Object.keys(e))e[t].unsubscribeAll()}
|
|
23
23
|
/*!
|
|
24
24
|
* Copyright 2021 Cognite AS
|
|
25
25
|
*/
|
|
26
|
-
function p(e,t){throw new Error(t||"Unexpected object: "+e)}
|
|
27
26
|
/*!
|
|
28
27
|
* Copyright 2021 Cognite AS
|
|
29
28
|
*/u.maxMoveDistance=8,u.maxClickDuration=250;class m{constructor(e,t){if(t<0)throw new Error("Range cannot have negative number of elements");this.from=e,this.count=t,this.toInclusive=e+t-1}static createFromInterval(e,t){return new m(e,t-e+1)}*values(){for(let e=this.from;e<=this.toInclusive;++e)yield e}toArray(){return Array.from(this.values())}equal(e){return this.from===e.from&&this.count===e.count}contains(e){return e>=this.from&&e<=this.toInclusive}intersects(e){return this.from<=e.toInclusive&&this.toInclusive>=e.from}intersectsOrCoinciding(e){return this.from<=e.toInclusive+1&&this.toInclusive+1>=e.from}intersectionWith(e){return this.intersects(e)?m.createFromInterval(Math.max(this.from,e.from),Math.min(this.toInclusive,e.toInclusive)):void 0}isInside(e){return this.from>=e.from&&this.toInclusive<=e.toInclusive}union(e){return m.createFromInterval(Math.min(this.from,e.from),Math.max(this.toInclusive,e.toInclusive))}forEach(e){for(let t=this.from;t<=this.toInclusive;++t)e(t)}toString(){return"("+this.from+", "+this.toInclusive+")"}static isNumericRange(e){if(!e)return!1;const t=e;return void 0!==t.from&&void 0!==t.count&&void 0!==t.toInclusive}}
|
|
30
29
|
/*!
|
|
31
30
|
* Copyright 2021 Cognite AS
|
|
32
|
-
*/function h(e){const t=Math.max(1,v(Math.sqrt(e)));return{width:t,height:Math.max(1,v(e/t))}}const
|
|
31
|
+
*/function h(e){const t=Math.max(1,v(Math.sqrt(e)));return{width:t,height:Math.max(1,v(e/t))}}const b=Math.log(2);function v(e){return Math.pow(2,Math.ceil(Math.log(e)/b))}var g=r(2),A=r.n(g);class _{constructor(e,t){this.left=e,this.right=t,this.maxSubtreeDepth=Math.max(this.left.maxSubtreeDepth,this.right.maxSubtreeDepth)+1,this.range=m.createFromInterval(this.left.range.from,this.right.range.toInclusive),this.count=this.left.count+this.right.count}static fromIndexNodesAndBalance(e,t){return e.range.from>t.range.toInclusive+1?new _(t,e).balance():e.range.toInclusive+1<t.range.from?new _(e,t).balance():void A()(!1,"Internal error in IndexSet: Overlapping nodes")}traverse(e){this.left.traverse(e),this.right.traverse(e)}contains(e){return!!this.range.contains(e)&&(this.left.contains(e)||this.right.contains(e))}addRange(e){if(!e.intersectsOrCoinciding(this.range)){if(e.from<this.range.from){const t=this.left.addRange(e);return _.fromIndexNodesAndBalance(t,this.right)}{const t=this.right.addRange(e);return _.fromIndexNodesAndBalance(this.left,t)}}const t=e.intersectsOrCoinciding(this.left.range),r=e.intersectsOrCoinciding(this.right.range);if(t&&r){const[t,r]=this.left.soak(e),[n,i]=this.right.soak(e),o=r.union(i);if(void 0===t&&void 0===n)return new x(o);if(void 0===t&&void 0!==n)return n.addRange(o);if(void 0===n&&void 0!==t)return t.addRange(o);return _.fromIndexNodesAndBalance(t,n).addRange(o)}return t?_.fromIndexNodesAndBalance(this.left.addRange(e),this.right):r?_.fromIndexNodesAndBalance(this.left,this.right.addRange(e)):this.left.maxSubtreeDepth<this.right.maxSubtreeDepth?_.fromIndexNodesAndBalance(this.left.addRange(e),this.right):_.fromIndexNodesAndBalance(this.left,this.right.addRange(e))}removeRange(e){if(!e.intersects(this.range))return this;const[t,r]=this.soak(e);let n=void 0,i=void 0;if(r.from<e.from&&(n=m.createFromInterval(r.from,e.from-1)),r.toInclusive>e.toInclusive&&(i=m.createFromInterval(e.toInclusive+1,r.toInclusive)),void 0===t)return void 0!==n&&void 0!==i?_.fromIndexNodesAndBalance(new x(n),new x(i)):null!=n?new x(n):null!=i?new x(i):void 0;{let e=t;return void 0!==n&&(e=e.addRange(n)),void 0!==i&&(e=e.addRange(i)),e}}balance(){const e=this.left.maxSubtreeDepth,t=this.right.maxSubtreeDepth;if(t+2<=e){const e=this.left.rotateSmallerRight();return new _(e,this.right).rotateRight().balance()}if(e+2<=t){const e=this.right.rotateSmallerLeft();return new _(this.left,e).rotateLeft().balance()}return this}clone(){return _.fromIndexNodesAndBalance(this.left.clone(),this.right.clone())}hasIntersectionWith(e){return!!e.range.intersects(this.range)&&(this.range.isInside(e.range)?e.hasIntersectionWith(this):!(!this.left.range.intersects(e.range)||!this.left.hasIntersectionWith(e))||!(!this.right.range.intersects(e.range)||!this.right.hasIntersectionWith(e)))}soak(e){let[t,r]=[this.left,e],[n,i]=[this.right,e];if(this.right.range.isInside(e)&&this.left.range.isInside(e))return[void 0,e];this.left.range.intersectsOrCoinciding(e)&&([t,r]=this.left.soak(e)),this.right.range.intersectsOrCoinciding(e)&&([n,i]=this.right.soak(e));const o=r.union(i);if(null==n)return[t,o];if(null==t)return[n,o];return[_.fromIndexNodesAndBalance(t,n),o]}rotateRight(){return"right"in this.left?new _(this.left.left,new _(this.left.right,this.right)):this}rotateLeft(){return"left"in this.right?new _(new _(this.left,this.right.left),this.right.right):this}rotateSmallerLeft(){if(this.left.maxSubtreeDepth>this.right.maxSubtreeDepth){let e=this.rotateRight();return e=e.rotateSmallerLeft(),e}return this}rotateSmallerRight(){if(this.right.maxSubtreeDepth>this.left.maxSubtreeDepth){let e=this.rotateLeft();return e=e.rotateSmallerRight(),e}return this}}
|
|
33
32
|
/*!
|
|
34
33
|
* Copyright 2021 Cognite AS../NumericRange
|
|
35
|
-
*/class
|
|
34
|
+
*/class x{constructor(e){this.range=e,this.maxSubtreeDepth=0,this.count=e.count}static fromInterval(e,t){return new x(m.createFromInterval(e,t))}traverse(e){e(this.range)}contains(e){return this.range.contains(e)}addRange(e){return this.range.intersectsOrCoinciding(e)?new x(this.range.union(e)):_.fromIndexNodesAndBalance(this,new x(e))}removeRange(e){if(!e.intersects(this.range))return this;if(this.range.isInside(e))return;let t=void 0,r=void 0;return this.range.from<e.from&&(t=m.createFromInterval(this.range.from,e.from-1)),this.range.toInclusive>e.toInclusive&&(r=m.createFromInterval(e.toInclusive+1,this.range.toInclusive)),null!=t&&null!=r?_.fromIndexNodesAndBalance(new x(t),new x(r)):null!=t?new x(t):null!=r?new x(r):void 0}hasIntersectionWith(e){return e.range.intersects(this.range)}soak(e){return this.range.intersectsOrCoinciding(e)?[void 0,this.range.union(e)]:[this,e]}clone(){return new x(this.range)}}class y{constructor(e){if(null==e)this.rootNode=void 0;else if(m.isNumericRange(e))this.addRange(e);else for(const t of e)this.add(t)}forEachRange(e){this.rootNode&&this.rootNode.traverse(e)}add(e){const t=new m(e,1);this.addRange(t)}addRange(e){this.rootNode?this.rootNode=this.rootNode.addRange(e):this.rootNode=new x(e)}remove(e){const t=new m(e,1);this.removeRange(t)}removeRange(e){this.rootNode&&(this.rootNode=this.rootNode.removeRange(e))}contains(e){return!!this.rootNode&&this.rootNode.contains(e)}get count(){return this.rootNode?this.rootNode.count:0}toRangeArray(){const e=[];return this.forEachRange(t=>{e.push(t)}),e}toIndexArray(){const e=[];return this.rootNode&&this.forEachRange(t=>{t.forEach(t=>{e.push(t)})}),e}toPlainSet(){const e=this.toIndexArray();return new Set(e)}invertedRanges(){const e=this.toRangeArray(),t=[];for(let r=0;r<e.length-1;r++)e[r].toInclusive+1>=e[r+1].from||t.push(m.createFromInterval(e[r].toInclusive+1,e[r+1].from-1));return t}unionWith(e){return this.rootNode?e.forEachRange(e=>{this.rootNode=this.rootNode.addRange(e)}):this.rootNode=e.rootNode,this}differenceWith(e){return this.rootNode&&e.forEachRange(e=>{var t;this.rootNode=null===(t=this.rootNode)||void 0===t?void 0:t.removeRange(e)}),this}hasIntersectionWith(e){if(e instanceof y)return void 0!==this.rootNode&&void 0!==e.rootNode&&this.rootNode.hasIntersectionWith(e.rootNode);if(e instanceof Map){for(const t of e.keys())if(this.contains(t))return!0;return!1}for(const t of e)if(this.contains(t))return!0;return!1}intersectWith(e){if(this.rootNode&&e.rootNode){if(this.rootNode.range.from<e.rootNode.range.from){const t=m.createFromInterval(this.rootNode.range.from,e.rootNode.range.from-1);if(this.rootNode=this.rootNode.removeRange(t),!this.rootNode)return this}if(this.rootNode.range.toInclusive>e.rootNode.range.toInclusive){const t=m.createFromInterval(e.rootNode.range.toInclusive+1,this.rootNode.range.toInclusive);this.rootNode=this.rootNode.removeRange(t)}e.invertedRanges().forEach(e=>{this.rootNode&&(this.rootNode=this.rootNode.removeRange(e))})}else this.rootNode&&(this.rootNode=void 0);return this}clear(){this.rootNode=void 0}clone(){const e=new y;return this.rootNode&&(e.rootNode=this.rootNode.clone()),e}}
|
|
36
35
|
/*!
|
|
37
36
|
* Copyright 2021 Cognite AS
|
|
38
|
-
*/function
|
|
37
|
+
*/function k(e,t,r){const n=S(e);if(0==n)return;const i=T(0,-e);let o=M(I(n));const a=n/w(o);a<1&&(o-=1),o+=127,t[r]=128*i+M(o*w(-1)),t[r+1]=128*C(o,2)+C(M(128*a),128),t[r+2]=M(C(M(a*w(15)),w(8))),t[r+3]=M(w(23)*C(a,w(-15)))}function T(e,t){return t<e?0:1}function w(e){return Math.pow(2,e)}function C(e,t){return e-t*M(e/t)}function M(e){return Math.floor(e)}function I(e){return Math.log(e)/Math.log(2)}function S(e){return Math.abs(e)}
|
|
39
38
|
/*!
|
|
40
39
|
* Copyright 2021 Cognite AS
|
|
41
|
-
*/class N{constructor(e,t){this._numFilled=0,this._batchIdCounter=0,this._batchMap=new Map,this._type=t;const
|
|
40
|
+
*/class N{constructor(e,t){this._numFilled=0,this._batchIdCounter=0,this._batchMap=new Map,this._type=t;const r=Math.pow(2,Math.ceil(Math.log2(e)));this._bufferView=new t(r)}get length(){return this._numFilled}get bufferView(){return this._bufferView}add(e){let t=!1;if(this._numFilled+e.length>this._bufferView.length){const r=Math.pow(2,Math.ceil(Math.log2(this._numFilled+e.length)));this.allocateNewBuffer(r),t=!0}this._bufferView.set(e,this._numFilled);const r=this.createBatch(e),n=this._numFilled;this._numFilled+=e.length;return{batchId:r,bufferIsReallocated:t,updateRange:{byteOffset:n,byteCount:e.length}}}remove(e){const t=this._batchMap.get(e);if(!t)throw new Error("batch does not exist in buffer");this._bufferView.copyWithin(t.from,t.from+t.count,this._numFilled),this._numFilled-=t.count;const r=t.from,n=this._numFilled-t.from;this._currentTail===t&&(this._currentTail=t.prev);const i=t.prev,o=t.next;i&&(i.next=o),o&&(o.prev=i);let a=o;for(;a;)a.from-=t.count,a=a.next;return this._batchMap.delete(e),{byteOffset:r,byteCount:n}}getRangeForBatchId(e){const t=this._batchMap.get(e);if(!t)throw new Error("batch does not exist in buffer");return{byteOffset:t.from,byteCount:t.count}}createBatch(e){const t={from:this._numFilled,count:e.length,prev:this._currentTail,next:void 0};this._currentTail&&(this._currentTail.next=t),this._currentTail=t;const r=this._batchIdCounter;return this._batchIdCounter++,this._batchMap.set(r,t),r}allocateNewBuffer(e){const t=new this._type(e);t.set(this._bufferView),this._bufferView=t}}
|
|
42
41
|
/*!
|
|
43
42
|
* Copyright 2021 Cognite AS
|
|
44
|
-
*/const
|
|
43
|
+
*/const R=new o.BufferGeometry;class E extends o.Group{constructor(){super(...arguments),this._isDisposed=!1,this._referenceCount=0}reference(){this.ensureNotDisposed(),this._referenceCount++}dereference(){if(this.ensureNotDisposed(),0===this._referenceCount)throw new Error("No references");0==--this._referenceCount&&this.dispose()}dispose(){this.ensureNotDisposed(),this._isDisposed=!0;for(const e of this.children)e instanceof o.Mesh&&void 0!==e.geometry&&(e.geometry.dispose(),e.geometry=R),e instanceof o.BufferGeometry&&e.dispose();this.clear()}ensureNotDisposed(){if(this._isDisposed)throw new Error("Already disposed/dereferenced")}}
|
|
45
44
|
/*!
|
|
46
45
|
* Copyright 2021 Cognite AS
|
|
47
|
-
*/const
|
|
46
|
+
*/const P={camPos:new o.Vector3,bounds:new o.Box3};class B extends o.Object3D{constructor(e){super(),this._activeLevel=0,this._levels=[],this.isLOD=!0,this.autoUpdate=!0,this._boundingBox=e.clone(),this.type="BoundingBoxLOD"}setBoundingBox(e){this._boundingBox.copy(e)}addLevel(e,t=0){this._levels.push({object:e,distance:Math.abs(t)}),this._levels.sort((e,t)=>t.distance-e.distance),e.visible=!1,this.add(e)}getCurrentLevel(){return this._levels.length>0?this._levels.length-this._activeLevel-1:0}update(e){this.updateCurrentLevel(e)}updateCurrentLevel(e){const t=this._levels,{camPos:r,bounds:n}=P;n.copy(this._boundingBox).applyMatrix4(this.matrixWorld);const i=e instanceof o.PerspectiveCamera?e.zoom:1;if(t.length>0){r.setFromMatrixPosition(e.matrixWorld);const o=n.distanceToPoint(r)/i;t[this._activeLevel].object.visible=!1,this._activeLevel=t.findIndex(e=>o>=e.distance),this._activeLevel=this._activeLevel>=0?this._activeLevel:t.length-1,t[this._activeLevel].object.visible=!0}}}
|
|
48
47
|
/*!
|
|
49
48
|
* Copyright 2021 Cognite AS
|
|
50
|
-
*/function
|
|
49
|
+
*/function D(e,t){return(t=null!=t?t:new o.Box3).min.set(e.min[0],e.min[1],e.min[2]),t.max.set(e.max[0],e.max[1],e.max[2]),t}
|
|
50
|
+
/*!
|
|
51
|
+
* Copyright 2022 Cognite AS
|
|
52
|
+
*/
|
|
51
53
|
/*!
|
|
52
54
|
* Copyright 2021 Cognite AS
|
|
53
|
-
*/
|
|
55
|
+
*/
|
|
56
|
+
const O={tmpVector:new o.Vector3};function z(e,t){const{tmpVector:r}=O;r.set(e.min.x,e.min.y,e.min.z),t(r),r.set(e.min.x,e.min.y,e.max.z),t(r),r.set(e.min.x,e.max.y,e.min.z),t(r),r.set(e.min.x,e.max.y,e.max.z),t(r),r.set(e.max.x,e.min.y,e.min.z),t(r),r.set(e.max.x,e.min.y,e.max.z),t(r),r.set(e.max.x,e.max.y,e.min.z),t(r),r.set(e.max.x,e.max.y,e.max.z),t(r)}function F(e,t){let r=!1;return z(e,e=>{r=r||t.distanceToPoint(e)>=0}),r}
|
|
54
57
|
/*!
|
|
55
58
|
* Copyright 2021 Cognite AS
|
|
56
|
-
*/function
|
|
59
|
+
*/function G(){let e=!1;var t;return t=navigator.userAgent||navigator.vendor||window.opera,(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(t)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(t.substr(0,4)))&&(e=!0),e}
|
|
57
60
|
/*!
|
|
58
61
|
* Copyright 2021 Cognite AS
|
|
59
|
-
*/class
|
|
62
|
+
*/class U{constructor(e){this._originalState={},this._renderer=e,this._originalState={}}setClearColor(e,t){this._originalState={clearColor:this._renderer.getClearColor(new o.Color),clearAlpha:this._renderer.getClearAlpha(),...this._originalState},this._renderer.setClearColor(e,t)}setSize(e,t){this._originalState={size:this._renderer.getSize(new o.Vector2),...this._originalState},this._renderer.setSize(e,t)}set localClippingEnabled(e){this._originalState={localClippingEnabled:this._renderer.localClippingEnabled,...this._originalState},this._renderer.localClippingEnabled=e}set autoClear(e){this._originalState={autoClear:this._renderer.autoClear,...this._originalState},this._renderer.autoClear=e}setRenderTarget(e){this._originalState={renderTarget:this._renderer.getRenderTarget(),...this._originalState},this._renderer.setRenderTarget(e)}resetState(){void 0!==this._originalState.autoClear&&(this._renderer.autoClear=this._originalState.autoClear),void 0!==this._originalState.clearColor&&this._renderer.setClearColor(this._originalState.clearColor,this._originalState.clearAlpha),void 0!==this._originalState.localClippingEnabled&&(this._renderer.localClippingEnabled=this._originalState.localClippingEnabled),void 0!==this._originalState.size&&this._renderer.setSize(this._originalState.size.width,this._originalState.size.height),void 0!==this._originalState.renderTarget&&this._renderer.setRenderTarget(this._originalState.renderTarget),this._originalState={}}}var V=r(25);
|
|
60
63
|
/*!
|
|
61
64
|
* Copyright 2021 Cognite AS
|
|
62
|
-
*/const
|
|
65
|
+
*/const L={publicPath:""};
|
|
63
66
|
/*!
|
|
64
67
|
* Copyright 2021 Cognite AS
|
|
65
|
-
*/var
|
|
68
|
+
*/var j=r(11);
|
|
66
69
|
/*!
|
|
67
70
|
* Copyright 2021 Cognite AS
|
|
68
|
-
*/class
|
|
71
|
+
*/class W{constructor(){this.workerList=[];const e=this.determineNumberOfWorkers();for(let t=0;t<e;t++){const e={worker:Object(V.wrap)(this.createWorker()),activeJobCount:0,messageIdCounter:0};this.workerList.push(e)}(async function(e){let t;try{t=await e.getVersion()}catch(e){t="1.1.0"}const r="1.3.0",[n,i,o]=r.split(".").map(e=>parseInt(e,10)),[a,s,c]=t.split(".").map(e=>parseInt(e,10)),l=`Update your local copy of @cognite/reveal-parser-worker. Required version is ${r}. Received ${t}.`;if(n!==a)throw new Error(l);if(s<i)throw new Error(l);if(s===i&&c<o)throw new Error(l)}
|
|
69
72
|
/*!
|
|
70
73
|
* Copyright 2021 Cognite AS
|
|
71
|
-
*/)(this.workerList[0].worker).catch(e=>
|
|
74
|
+
*/)(this.workerList[0].worker).catch(e=>j.a.error(e)),this.workerObjUrl&&URL.revokeObjectURL(this.workerObjUrl)}static get defaultPool(){return W._defaultPool=W._defaultPool||new W,W._defaultPool}createWorker(){const e=(L.publicPath||r.p)+"reveal.parser.worker.js",t={name:"reveal.parser #"+this.workerList.length};if(function(e,t=location.origin){const r=e=>!e.match(/^.*\/\//);if(r(t))throw new Error("isTheSameDomain: the second argument must be an absolute url or omitted. Received "+t);if(r(e))return!0;try{const r=[e,t].map(e=>e.startsWith("//")?"https:"+e:e).map(e=>new URL(e));return r[0].host===r[1].host}catch(r){return console.error(`can not create URLs for ${e} and ${t}`,r),!1}}(e))return new Worker(e,t);if(!this.workerObjUrl){const t=new Blob([`importScripts(${JSON.stringify(e)});`],{type:"text/javascript"});this.workerObjUrl=URL.createObjectURL(t)}return new Worker(this.workerObjUrl,t)}async postWorkToAvailable(e){const t=this.workerList.reduce((e,t)=>e.activeJobCount>t.activeJobCount?t:e,this.workerList[0]);t.activeJobCount+=1;return await(async()=>{try{return await e(t.worker)}finally{t.activeJobCount-=1}})()}determineNumberOfWorkers(){return Math.max(2,Math.min(4,window.navigator.hardwareConcurrency||2))}}class Z{constructor(e){this._value=e,this._lastAccessTime=Date.now()}get value(){return this.touch(),this._value}get lastAccessTime(){return this._lastAccessTime}touch(){this._lastAccessTime=Date.now()}}class H{constructor(e=50,t,r=10){this._data=new Map,this._maxElementsInCache=e,this._defaultCleanupCount=Math.max(r,1),this._removeCallback=t}has(e){return this._data.has(e)}forceInsert(e,t){this.isFull()&&this.cleanCache(this._defaultCleanupCount),this.insert(e,t)}insert(e,t){if(this._data.size<this._maxElementsInCache)this._data.set(e,new Z(t));else if(this._maxElementsInCache>0)throw new Error("Cache full, please clean Cache and retry adding data")}remove(e){if(void 0!==this._removeCallback){const t=this._data.get(e);void 0!==t&&this._removeCallback(t.value)}this._data.delete(e)}get(e){const t=this._data.get(e);if(void 0!==t)return t.value;throw new Error(`Cache element ${e} does not exist`)}isFull(){return this._data.size>=this._maxElementsInCache}cleanCache(e){const t=Array.from(this._data.entries());t.sort((e,t)=>t[1].lastAccessTime-e[1].lastAccessTime);for(let r=0;r<e;r++){const e=t.pop();if(void 0===e)return;this.remove(e[0])}}resize(e){this._maxElementsInCache=e,this._defaultCleanupCount=Math.max(e*H.CLEANUP_COUNT_TO_CAPACITY_RATIO,1),this.isFull()&&this.cleanCache(this._data.size-this._maxElementsInCache)}clear(){if(void 0!==this._removeCallback)for(const e of this._data.values())this._removeCallback(e.value);this._data.clear()}}H.CLEANUP_COUNT_TO_CAPACITY_RATIO=.2;
|
|
72
75
|
/*!
|
|
73
76
|
* Copyright 2021 Cognite AS
|
|
74
|
-
*/
|
|
77
|
+
*/
|
|
78
|
+
class Y{constructor(e,t){this._cache=new Map,this._retrieves=new Map,this._capacity=e,this._disposeCallback=t}get(e){const t=this._retrieves.get(e)||0;return this._retrieves.set(e,t+1),this._cache.get(e)}set(e,t){return this._cache.has(e)||this._capacity<this._cache.size?(this._cache.set(e,t),!0):(this._cache.set(e,t),this.ensureWithinCapacity(),this._cache.has(e))}remove(e){this._retrieves.delete(e);const t=this._cache.get(e);return void 0!==t&&(void 0!==this._disposeCallback&&this._disposeCallback(t),this._cache.delete(e),!0)}clear(){if(void 0!==this._disposeCallback)for(const e of this._cache.values())this._disposeCallback(e);this._retrieves.clear(),this._cache.clear()}ensureWithinCapacity(){if(this._capacity>=this._cache.size)return;const e=Array.from(this._cache.keys()).map(e=>({key:e,retrivalCount:this._retrieves.get(e)||0})).sort((e,t)=>e.retrivalCount-t.retrivalCount).slice(0,this._cache.size-this._capacity).map(e=>e.key);for(const t of e)this.remove(t)}}
|
|
75
79
|
/*!
|
|
76
80
|
* Copyright 2021 Cognite AS
|
|
77
|
-
*/function
|
|
81
|
+
*/function q(){this.array=null}function Q(e,t){const r=e.get(t);void 0===r?e.set(t,1):e.set(t,r+1)}function X(e,t){const r=e.get(t);A()(void 0!==r),r<=1?e.delete(t):e.set(t,r-1)}r(17),r(27);
|
|
78
82
|
/*!
|
|
79
83
|
* Copyright 2021 Cognite AS
|
|
80
|
-
*/
|
|
84
|
+
*/
|
|
85
|
+
const J={renderSize:new o.Vector2,position:new o.Vector3};function K(e,t,r=new o.Vector3){const{position:n}=J;n.copy(t),n.project(e);const i=(n.x+1)/2,a=(1-n.y)/2;return r.set(i,a,n.z)}function $(e,t,r,n=new o.Vector3){K(t,r,n);const{renderSize:i}=J;e.getSize(i);const a=e.domElement,{width:s,height:c}=a.getBoundingClientRect();return n.x=Math.round(n.x*s),n.y=Math.round(n.y*c),n}
|
|
86
|
+
/*!
|
|
87
|
+
* Copyright 2022 Cognite AS
|
|
88
|
+
*/class ee{constructor(){this._state="pending",this._promise=new Promise((e,t)=>{this._resolve=e,this._reject=t})}get state(){return this._state}finally(e){return this._promise.finally(e)}then(e,t){return this._promise.then(e,t)}catch(e){return this._promise.catch(e)}resolve(e){this._resolve(e),this._state="fulfilled"}reject(e){this._reject(e),this._state="rejected"}}Symbol.toStringTag},function(e,t){e.exports=require("assert")},function(e,t,r){"use strict";r.d(t,"b",(function(){return b})),r.d(t,"a",(function(){return _})),r.d(t,"f",(function(){return T})),r.d(t,"e",(function(){return w})),r.d(t,"c",(function(){return C})),r.d(t,"d",(function(){return k})),r.d(t,"m",(function(){return z})),r.d(t,"n",(function(){return F})),r.d(t,"o",(function(){return U})),r.d(t,"p",(function(){return G})),r.d(t,"l",(function(){return L})),r.d(t,"g",(function(){return j})),r.d(t,"t",(function(){return Z})),r.d(t,"i",(function(){return Q})),r.d(t,"w",(function(){return Y})),r.d(t,"r",(function(){return K})),r.d(t,"v",(function(){return J})),r.d(t,"h",(function(){return W})),r.d(t,"u",(function(){return H})),r.d(t,"s",(function(){return $})),r.d(t,"k",(function(){return te})),r.d(t,"q",(function(){return m})),r.d(t,"j",(function(){return fe}));var n=r(0),i=r(1),o=r(28),a=r.n(o);
|
|
81
89
|
/*!
|
|
82
90
|
* Copyright 2021 Cognite AS
|
|
83
91
|
*/
|
|
84
|
-
class s{constructor(e,t,n,
|
|
92
|
+
class s{constructor(e,t,r,n,i){this.version=e,this.maxTreeIndex=t,this.root=n,this.sectors=i,this.unit=r}get sectorCount(){return this.sectors.size}getSectorById(e){return this.sectors.get(e)}getAllSectors(){return[...this.sectors.values()]}getSectorsContainingPoint(e){const t=[];return Object(i.y)(this.root,r=>!!r.subtreeBoundingBox.containsPoint(e)&&(t.push(r),!0)),t}getSectorsIntersectingBox(e){const t=[];return Object(i.y)(this.root,r=>!!r.subtreeBoundingBox.intersectsBox(e)&&(t.push(r),!0)),t}getBoundsOfMostGeometry(){var e;return this._cachedBoundsOfMostGeometry=null!==(e=this._cachedBoundsOfMostGeometry)&&void 0!==e?e:this.computeBoundsOfMostGeometry(),this._cachedBoundsOfMostGeometry}getSectorsIntersectingFrustum(e,t){const r=(new n.Matrix4).multiplyMatrices(e,t),o=(new n.Frustum).setFromProjectionMatrix(r),a=[];return Object(i.y)(this.root,e=>!!o.intersectsBox(e.subtreeBoundingBox)&&(a.push(e),!0)),a}computeBoundsOfMostGeometry(){if(0===this.root.children.length)return this.root.subtreeBoundingBox;const e=[],t=[];Object(i.y)(this.root,r=>(0===r.children.length&&(t.push(r.subtreeBoundingBox.min.toArray(),r.subtreeBoundingBox.max.toArray()),e.push(r.subtreeBoundingBox,r.subtreeBoundingBox)),!0));const r=Math.min(t.length,4),o=a()(t,r,"kmpp",10),s=new Array(o.idxs.length).fill(0),c=s.map(e=>new n.Box3);o.idxs.map(e=>s[e]++);const l=s.reduce((e,t,r)=>(t>e.count&&(e.count=t,e.idx=r),e),{count:0,idx:-1}).idx;o.idxs.forEach((t,r)=>{s[t]++,c[t].expandByPoint(e[r].min),c[t].expandByPoint(e[r].max)});const d=c.filter((e,t)=>!(t===l||!e.intersectsBox(c[l])));if(d.length>0){const e=c[l].clone();return d.forEach(t=>{e.expandByPoint(t.min),e.expandByPoint(t.max)}),e}return c[l]}}
|
|
85
93
|
/*!
|
|
86
94
|
* Copyright 2021 Cognite AS
|
|
87
|
-
*/function
|
|
95
|
+
*/function c(e){const t=new Map,r=[];e.sectors.forEach(e=>{var i;const o=function(e){const t=function(e){if(!e.facesFile)return{quadSize:-1,coverageFactors:{xy:-1,yz:-1,xz:-1},recursiveCoverageFactors:{xy:-1,yz:-1,xz:-1},fileName:null,downloadSize:e.indexFile.downloadSize};return{...e.facesFile,recursiveCoverageFactors:e.facesFile.recursiveCoverageFactors||e.facesFile.coverageFactors}}(e),r=e.boundingBox,i=r.min.x,o=r.min.y,a=r.min.z,s=r.max.x,c=r.max.y,l=r.max.z;return{id:e.id,path:e.path,depth:e.depth,subtreeBoundingBox:new n.Box3(new n.Vector3(i,o,a),new n.Vector3(s,c,l)),estimatedDrawCallCount:e.estimatedDrawCallCount||0,estimatedRenderCost:e.estimatedTriangleCount||0,indexFile:{...e.indexFile},facesFile:t,children:[]}}(e);t.set(e.id,o),r[e.id]=null!==(i=e.parentId)&&void 0!==i?i:-1});for(const e of t.values()){const n=r[e.id];if(-1===n)continue;t.get(n).children.push(e)}const i=t.get(0);if(!i)throw new Error("Root sector not found, must have ID 0");!function e(t,r){!function(e){return-1===e.facesFile.coverageFactors.xy}(t)?t.children.forEach(r=>e(r,t.facesFile)):(t.facesFile.coverageFactors.xy=r.recursiveCoverageFactors.xy,t.facesFile.coverageFactors.yz=r.recursiveCoverageFactors.yz,t.facesFile.coverageFactors.xz=r.recursiveCoverageFactors.xz,t.facesFile.recursiveCoverageFactors.xy=r.recursiveCoverageFactors.xy,t.facesFile.recursiveCoverageFactors.yz=r.recursiveCoverageFactors.yz,t.facesFile.recursiveCoverageFactors.xz=r.recursiveCoverageFactors.xz,t.children.forEach(t=>e(t,r)))}
|
|
88
96
|
/*!
|
|
89
97
|
* Copyright 2021 Cognite AS
|
|
90
|
-
*/(
|
|
98
|
+
*/(i,i.facesFile);const o=null!==e.unit?e.unit:"Meters";return new s(e.version,e.maxTreeIndex,o,i,t)}function l(e){if(!e.sectors||0===e.sectors.length)throw new Error("No sectors found in scene JSON file");const t=new Map,r=[];e.sectors.forEach(e=>{var i;const o=function(e){const t=d(e.boundingBox);let r,i;e.geometryBoundingBox?(r=d(e.geometryBoundingBox),i=t):(r=t,i=new n.Box3);return{id:e.id,path:e.path,depth:e.depth,subtreeBoundingBox:i,geometryBoundingBox:r,estimatedDrawCallCount:e.estimatedDrawCallCount,estimatedRenderCost:e.estimatedTriangleCount||0,downloadSize:e.downloadSize||0,maxDiagonalLength:e.maxDiagonalLength||0,minDiagonalLength:e.minDiagonalLength||0,sectorFileName:e.sectorFileName,children:[]}}(e);t.set(e.id,o),r[e.id]=null!==(i=e.parentId)&&void 0!==i?i:-1});for(const e of t.values()){const n=r[e.id];if(-1===n)continue;t.get(n).children.push(e)}const i=t.get(0);if(!i)throw new Error("Root sector not found, must have ID 0");if(i.subtreeBoundingBox.isEmpty())for(const e of t.values())f(e);const o=null!==e.unit?e.unit:"Meters";return new s(e.version,e.maxTreeIndex,o,i,t)}function d(e){return new n.Box3(new n.Vector3(e.min.x,e.min.y,e.min.z),new n.Vector3(e.max.x,e.max.y,e.max.z))}function f(e){if(e.subtreeBoundingBox.isEmpty())if(0!==e.children.length)for(const t of e.children)f(t),e.subtreeBoundingBox.union(t.subtreeBoundingBox);else e.subtreeBoundingBox.copy(e.geometryBoundingBox)}
|
|
91
99
|
/*!
|
|
92
100
|
* Copyright 2021 Cognite AS
|
|
93
|
-
*/
|
|
101
|
+
*/class u{parse(e){const t=e.version;switch(t){case 8:return c(e);case 9:return l(e);case void 0:throw new Error('Metadata must contain a "version"-field');default:throw new Error(`Version ${t} is not supported`)}}}
|
|
94
102
|
/*!
|
|
95
103
|
* Copyright 2021 Cognite AS
|
|
96
|
-
*/const
|
|
104
|
+
*/const p=new Map([["meters",1],["meter",1],["m",1],["centimeters",.01],["centimeter",.01],["cm",.01],["millimeters",.001],["millimeter",.001],["mm",.001],["micrometers",1e-6],["micrometer",1e-6],["kilometers",1e3],["kilometer",1e3],["km",1e3],["feet",.3048],["ft",.3048],["inches",.0254],["inch",.0254],["yards",.9144],["yard",.9144],["miles",1609.34],["miles",1609.34],["mile",1609.34],["mils",254e-7],["mil",254e-7],["microinches",2.54e-8],["microinch",2.54e-8]]);function m(e){return e=null!=e?e:"meters",p.get(e.toLowerCase())}var h=r(6);
|
|
97
105
|
/*!
|
|
98
106
|
* Copyright 2021 Cognite AS
|
|
99
|
-
*/class
|
|
107
|
+
*/class b{constructor(e,t,r="scene.json"){this._currentModelIdentifier=0,this._cadSceneParser=new u,this._modelMetadataProvider=e,this._modelDataProvider=t,this._blobFileName=r}async loadData(e){const t=await this.getSupportedOutput(e),r=this._modelMetadataProvider.getModelUri(e,t),o=this._modelMetadataProvider.getModelMatrix(e,t.format),a=this._modelMetadataProvider.getModelCamera(e),s=await r,c=await this._modelDataProvider.getJsonFile(s,this._blobFileName),l=this._cadSceneParser.parse(c),d=function(e,t){var r;const i=null!==(r=m(e))&&void 0!==r?r:1;if(void 0===i)throw new Error(`Unknown model unit '${e}'`);return(new n.Matrix4).makeScale(i,i,i).multiply(t)}(l.unit,await o),f=(new n.Matrix4).copy(d).invert(),u=await a;return{modelIdentifier:""+this._currentModelIdentifier++,modelBaseUrl:s,geometryClipBox:null,format:t.format,formatVersion:t.version,modelMatrix:d,inverseModelMatrix:f,cameraConfiguration:Object(i.x)(u,d),scene:l}}async getSupportedOutput(e){const t=await this._modelMetadataProvider.getModelOutputs(e),r=[{format:h.d.GltfCadModel,version:9},{format:h.d.RevealCadModel,version:8}],n=r.map(e=>t.find(t=>t.format===e.format&&t.version===e.version)).filter(e=>void 0!==e);if(0===n.length){const e=t.map(e=>`${e.format} v${e.version}`).join(", "),n=r.map(e=>`${e.format} v${e.version}`).join(", ");throw new Error(`Model does not contain any supported CAD model outputs, got [${e}], but only supports [${n}]`)}return n[0]}}var v=r(2),g=r.n(v);
|
|
100
108
|
/*!
|
|
101
109
|
* Copyright 2021 Cognite AS
|
|
102
110
|
*/
|
|
103
|
-
class
|
|
111
|
+
class A{createSectorScene(e,t,r,n){g()(8===e||9===e,"Only version 8 and 9 is currently supported");const o=new Map;return Object(i.y)(n,e=>(o.set(e.id,e),!0)),new s(e,t,r,n,o)}}
|
|
104
112
|
/*!
|
|
105
113
|
* Copyright 2021 Cognite AS
|
|
106
|
-
|
|
114
|
+
*/class _{constructor(e){this._geometryClipBox=e}createClippedModel(e){const t=function e(t,r){const n=t.subtreeBoundingBox,i=t.subtreeBoundingBox.clone();if(i.intersect(r),i.isEmpty())return;{const o=[];for(let n=0;n<t.children.length;n++){const i=e(t.children[n],r);void 0!==i&&o.push(i)}const a=y(i)/y(n),s=Math.min(1,1-1/(1+10*a));return{...t,children:o,estimatedDrawCallCount:Math.ceil(s*t.estimatedDrawCallCount),estimatedRenderCost:Math.ceil(s*t.estimatedRenderCost),subtreeBoundingBox:i}}}(e.scene.root,this._geometryClipBox);if(void 0===t)throw new Error("No sectors inside provided geometry clip box");const r=new Map;Object(i.y)(t,e=>(r.set(e.id,e),!0));const n=(new A).createSectorScene(e.scene.version,e.scene.maxTreeIndex,e.scene.unit,t);return{...e,scene:n,geometryClipBox:this._geometryClipBox.clone()}}}const x={size:new n.Vector3};function y(e){const{size:t}=x;return e.getSize(t),t.x*t.y*t.z}
|
|
115
|
+
/*!
|
|
116
|
+
* Copyright 2021 Cognite AS
|
|
117
|
+
*/var k;!function(e){e[e.Discarded=0]="Discarded",e[e.Simple=1]="Simple",e[e.Detailed=2]="Detailed"}(k||(k={}));
|
|
107
118
|
/*!
|
|
108
119
|
* Copyright 2021 Cognite AS
|
|
109
120
|
*/
|
|
110
|
-
class
|
|
121
|
+
class T extends n.Group{constructor(e,t,r){super(),this._lod=k.Discarded,this._updatedTimestamp=Date.now(),this.name=`Sector ${t} [id=${e}]`,this.sectorId=e,this.sectorPath=t,this.bounds=r,this.depth=function(e){let t=0;for(let r=0;r<e.length;++r)t+="/"===e[r]?1:0;return t-1}
|
|
111
122
|
/*!
|
|
112
123
|
* Copyright 2021 Cognite AS
|
|
113
|
-
*/(t)}get levelOfDetail(){return this._lod}get group(){return this._group}get updatedTimestamp(){return this._updatedTimestamp}updateGeometry(e,t){this.resetGeometry(),this._group=e,void 0!==this._group&&this._group.reference(),this._lod=t,this._updatedTimestamp=Date.now(),this.visible=this._lod!==
|
|
124
|
+
*/(t)}get levelOfDetail(){return this._lod}get group(){return this._group}get updatedTimestamp(){return this._updatedTimestamp}updateGeometry(e,t){this.resetGeometry(),this._group=e,void 0!==this._group&&this._group.reference(),this._lod=t,this._updatedTimestamp=Date.now(),this.visible=this._lod!==k.Discarded,this.updateMatrixWorld(!0)}dereference(){void 0!==this._group&&this._group.dereference()}resetGeometry(){void 0!==this._group&&(this._group.dereference(),this.remove(this._group)),this._group=void 0,this._lod=k.Discarded,this._updatedTimestamp=Date.now()}}class w extends T{constructor(e){const t=e.scene.root.subtreeBoundingBox.clone();t.applyMatrix4(e.modelMatrix),super(0,"/",t);const{scene:r,modelMatrix:n}=e;this.sectorNodeMap=new Map,function e(t,r,n,i){const o=t.subtreeBoundingBox.clone();o.applyMatrix4(i);const a=new T(t.id,t.path,o);a.name="Sector "+t.id,r.add(a),a.matrixAutoUpdate=!1,a.updateMatrixWorld(!0),n.set(t.id,a);for(const r of t.children)e(r,a,n,i)}
|
|
114
125
|
/*!
|
|
115
126
|
* Copyright 2021 Cognite AS
|
|
116
|
-
*/(
|
|
127
|
+
*/(r.root,this,this.sectorNodeMap,n),this.matrixAutoUpdate=!1,this.setModelTransformation(n)}dereferenceAllNodes(){for(const[e,t]of this.sectorNodeMap)t.dereference()}setModelTransformation(e){this.matrix.copy(e),this.updateMatrixWorld(!0)}getModelTransformation(e=new n.Matrix4){return e.copy(this.matrix)}}class C{constructor(e=i.l.defaultPool){this.workerPool=e}parseI3D(e){return this.parseDetailed(e)}parseF3D(e){return this.parseSimple(e)}parseCTM(e){return this.parseCtm(e)}async parseSimple(e){return this.workerPool.postWorkToAvailable(async t=>t.parseQuads(e))}async parseDetailed(e){return this.workerPool.postWorkToAvailable(async t=>t.parseSector(e))}async parseCtm(e){return this.workerPool.postWorkToAvailable(async t=>t.parseCtm(e))}}
|
|
117
128
|
/*!
|
|
118
129
|
* Copyright 2021 Cognite AS
|
|
119
|
-
*/
|
|
120
|
-
function C(e){return Array.from(e.values()).reduce((e,t)=>Math.max(e,t.offset+t.size),0)}function w(e,t,n,r){if(null===r)return e;const o=t.get("instanceMatrix");v()(void 0!==o);const i=C(t),a=o.offset;return Object(T.a)(e,i,r,(e,t,r,o)=>{Object(y.d)(r,a,t,e,n,o)})}function M(e,t,n,r="radiusA",o="radiusB"){if(null===n)return e;const i=t.get("centerA"),a=t.get("centerB"),s=t.get(r),d=t.get(o);v()(void 0!==i&&void 0!==a&&void 0!==s&&void 0!==d);const l=C(t);return Object(T.a)(e,l,n,(e,t,n,r)=>{Object(y.a)(n,i.offset,a.offset,s.offset,d.offset,t,e,r)})}function I(e,t,n){if(null===n)return e;const r=t.get("vertex1"),o=t.get("vertex2"),i=t.get("vertex3"),a=t.get("vertex4");v()(void 0!==r&&void 0!==o&&void 0!==i&&void 0!==a);const s=C(t);return Object(T.a)(e,s,n,(e,t,n,s)=>{Object(y.e)(r.offset,o.offset,i.offset,a.offset,n,t,e,s)})}function S(e,t,n,r="horizontalRadius",o="verticalRadius"){if(null===n)return e;const i=t.get("center"),a=t.get(r),s=t.get(o),d=t.get("height");v()(void 0!==i&&void 0!==a&&void 0!==s&&void 0!==d);const l=C(t);return Object(T.a)(e,l,n,(e,t,n,r)=>{Object(y.b)(i,a,s,d,n,t,e,r)})}
|
|
130
|
+
*/const M={centerA:new n.Vector3,centerB:new n.Vector3,sphere:new n.Sphere,box:new n.Box3};function I(e,t,r,n,i,o,a,s){const{centerA:c,centerB:l,sphere:d,box:f}=M;function u(t,r=0){const n=(a*o+t)/e.BYTES_PER_ELEMENT;return e[n+r]}c.set(u(t,0),u(t,1),u(t,2)),l.set(u(r,0),u(r,1),u(r,2));const p=u(n),m=u(i);return d.set(c,p),d.getBoundingBox(s),d.set(l,m),d.getBoundingBox(f),s.expandByPoint(f.min),s.expandByPoint(f.max),s}const S={vertex1:new n.Vector3,vertex2:new n.Vector3,vertex3:new n.Vector3,vertex4:new n.Vector3};function N(e,t,r,n,i,o,a,s){const{vertex1:c,vertex2:l,vertex3:d,vertex4:f}=S;function u(e,t=0){const r=(a*o+e)/i.BYTES_PER_ELEMENT;return i[r+t]}return c.set(u(e,0),u(e,1),u(e,2)),l.set(u(t,0),u(t,1),u(t,2)),d.set(u(r,0),u(r,1),u(r,2)),f.set(u(n,0),u(n,1),u(n,2)),s.setFromPoints([c,l,d,f]),s}const R={instanceMatrix:new n.Matrix4};function E(e,t,r,n,i,o){const{instanceMatrix:a}=R,s=(n*r+t)/e.BYTES_PER_ELEMENT;return a.set(e[s+0],e[s+4],e[s+8],e[s+12],e[s+1],e[s+5],e[s+9],e[s+13],e[s+2],e[s+6],e[s+10],e[s+14],e[s+3],e[s+7],e[s+11],e[s+15]),o.copy(i).applyMatrix4(a),o}const P={center:new n.Vector3,size:new n.Vector3};function B(e,t,r,n,i){const{size:o}=P,a=2*Math.max(e,t,r);return o.set(a,a,a),i.setFromCenterAndSize(n,o),i}
|
|
121
131
|
/*!
|
|
122
132
|
* Copyright 2021 Cognite AS
|
|
123
133
|
*/
|
|
124
|
-
|
|
134
|
+
function D(e,t,r,i){const o=e.length/t,a=new Float32Array(e.buffer,e.byteOffset,e.byteLength/Float32Array.BYTES_PER_ELEMENT),s=new n.Box3,c=new Uint8Array(e.length);let l=0;for(let n=0;n<o;++n)if(i(n,t,a,s),r.intersectsBox(s)){const r=e.subarray(n*t,(n+1)*t);c.set(r,l*t),l++}return c.slice(0,l*t)}
|
|
125
135
|
/*!
|
|
126
136
|
* Copyright 2021 Cognite AS
|
|
127
|
-
*/
|
|
137
|
+
*/function O(e){return Array.from(e.values()).reduce((e,t)=>Math.max(e,t.offset+t.size),0)}function z(e,t,r,n){if(null===n)return e;const i=t.get("instanceMatrix");g()(void 0!==i);const o=O(t),a=i.offset;return D(e,o,n,(e,t,n,i)=>{E(n,a,t,e,r,i)})}function F(e,t,r,n="radiusA",i="radiusB"){if(null===r)return e;const o=t.get("centerA"),a=t.get("centerB"),s=t.get(n),c=t.get(i);g()(void 0!==o&&void 0!==a&&void 0!==s&&void 0!==c);return D(e,O(t),r,(e,t,r,n)=>{I(r,o.offset,a.offset,s.offset,c.offset,t,e,n)})}function G(e,t,r){if(null===r)return e;const n=t.get("vertex1"),i=t.get("vertex2"),o=t.get("vertex3"),a=t.get("vertex4");g()(void 0!==n&&void 0!==i&&void 0!==o&&void 0!==a);return D(e,O(t),r,(e,t,r,s)=>{N(n.offset,i.offset,o.offset,a.offset,r,t,e,s)})}function U(e,t,r,n="horizontalRadius",i="verticalRadius"){if(null===r)return e;const o=t.get("center"),a=t.get(n),s=t.get(i),c=t.get("height");g()(void 0!==o&&void 0!==a&&void 0!==s&&void 0!==c);return D(e,O(t),r,(e,t,r,n)=>{!function(e,t,r,n,i,o,a,s){const{center:c}=P;function l(e,t=0){const r=(a*o+e.offset)/i.BYTES_PER_ELEMENT;return i[r+t]}const d=l(t),f=l(r),u=l(n);c.set(l(e,0),l(e,1),l(e,2)),B(d,f,u,c,s)}(o,a,s,c,r,t,e,n)})}
|
|
128
138
|
/*!
|
|
129
139
|
* Copyright 2021 Cognite AS
|
|
130
140
|
*/
|
|
131
|
-
|
|
141
|
+
const V={p:new n.Vector3,instanceMatrix:new n.Matrix4,baseBounds:new n.Box3,instanceBounds:new n.Box3};function L(e,t,r,n){if(null===n)return r;const{p:i,instanceMatrix:o,baseBounds:a,instanceBounds:s}=V;a.makeEmpty();for(let n=r.triangleOffset;n<r.triangleOffset+r.triangleCount;++n){const r=t[3*n+0],o=t[3*n+1],s=t[3*n+2];i.set(e[r+0],e[r+1],e[r+2]),a.expandByPoint(i),i.set(e[o+0],e[o+1],e[o+2]),a.expandByPoint(i),i.set(e[s+0],e[s+1],e[s+2]),a.expandByPoint(i)}let c=0;const l=r.treeIndices.length,d=new Float32Array(r.instanceMatrices.length),f=new Float32Array(l),u=new Uint8Array(4*l);for(let e=0;e<l;++e)if(p=r.instanceMatrices,m=e,o.set(p[m+0],p[m+4],p[m+8],p[m+12],p[m+1],p[m+5],p[m+9],p[m+13],p[m+2],p[m+6],p[m+10],p[m+14],p[m+3],p[m+7],p[m+11],p[m+15]),s.copy(a).applyMatrix4(o),n.intersectsBox(s)){const t=r.instanceMatrices.subarray(16*e,16*(e+1)),n=r.colors.subarray(4*e,4*(e+1)),i=r.treeIndices[e];d.set(t,16*c),u.set(n,4*c),f[c]=i,c++}var p,m;if(l===c)return r;return{triangleCount:r.triangleCount,triangleOffset:r.triangleOffset,instanceMatrices:d.slice(0,16*c),colors:u.slice(0,4*c),treeIndices:f.slice(0,c)}}
|
|
142
|
+
/*!
|
|
143
|
+
* Copyright 2021 Cognite AS
|
|
144
|
+
*/const{boxGeometry:j,boxGeometryBoundingBox:W}=(()=>{const e=function(){const e=[-.5,-.5,-.5,-.5,-.5,.5,-.5,.5,-.5,-.5,.5,.5,.5,-.5,-.5,.5,-.5,.5,.5,.5,-.5,.5,.5,.5],t=function(){const e=[1,3,2,6,4,5],t=[];for(let r=0;r<e.length;r++){const n=(r+1)%e.length;t.push(0),t.push(e[r]),t.push(e[n]),t.push(7),t.push(e[n]),t.push(e[r])}return t}(),r=new Float32Array(e),i=new n.BufferAttribute(r,3,!1),o=new n.BufferGeometry;return o.setIndex(t),o.setAttribute("position",i),o}();try{const t={index:e.getIndex(),position:e.getAttribute("position")};return e.computeBoundingBox(),{boxGeometry:t,boxGeometryBoundingBox:e.boundingBox}}finally{e.dispose()}})(),{quadGeometry:Z,quadGeometryBoundingBox:H}=(()=>{const e=new n.PlaneBufferGeometry(1,1,1,1);try{const t={index:e.getIndex(),position:e.getAttribute("position"),normal:e.getAttribute("normal")};return e.computeBoundingBox(),{quadGeometry:t,quadGeometryBoundingBox:e.boundingBox}}finally{e.dispose()}})(),{trapeziumGeometry:Y,trapeziumGeometryBoundingBox:q}=(()=>{const e=[0,0,0,1,1,1,2,2,2,3,3,3];return{trapeziumGeometry:{index:new n.BufferAttribute(new Uint16Array([0,1,3,0,3,2]),1),position:new n.BufferAttribute(new Float32Array(e),3)},trapeziumGeometryBoundingBox:(new n.Box3).setFromArray(e)}})(),{coneGeometry:Q,coneGeometryBoundingBox:X}=(()=>{const e=[];e.push(-1,1,-1),e.push(-1,-1,-1),e.push(1,1,-1),e.push(1,-1,-1),e.push(1,1,1),e.push(1,-1,1);const t=new Uint16Array([1,2,0,1,3,2,3,4,2,3,5,4]);return{coneGeometry:{index:new n.BufferAttribute(t,1),position:new n.BufferAttribute(new Float32Array(e),3)},coneGeometryBoundingBox:(new n.Box3).setFromArray(e)}})(),{torusLodGeometries:J}=(()=>{const e=(e,t)=>[e,2*t*Math.PI];return{torusLodGeometries:[{tubularSegments:9,radialSegments:18},{tubularSegments:5,radialSegments:12},{tubularSegments:4,radialSegments:5}].map(({tubularSegments:t,radialSegments:r})=>function(e,t,r=((e,t)=>[e,t,0])){const i=[],o=[],a=1/e,s=1/t;for(let n=0;n<=t;n++)for(let t=0;t<=e;t++){const[e,o,c]=r(t*a,n*s);i.push(e||0,o||0,c||0)}for(let r=1;r<=t;r++)for(let t=1;t<=e;t++){const n=(e+1)*r+t-1,i=(e+1)*(r-1)+t-1,a=(e+1)*(r-1)+t,s=(e+1)*r+t;o.push(n,i,s),o.push(i,a,s)}return{index:new n.Uint16BufferAttribute(o,1),position:new n.Float32BufferAttribute(i,3)}}(r,t,e))}})(),{nutGeometry:K,nutGeometryBoundingBox:$}=(()=>{const e=new n.CylinderBufferGeometry(.5,.5,1,6);try{e.applyMatrix4((new n.Matrix4).makeRotationX(-Math.PI/2));const t={index:e.getIndex(),position:e.getAttribute("position"),normal:e.getAttribute("normal")};return{nutGeometry:t,nutGeometryBoundingBox:(new n.Box3).setFromArray(t.position.array)}}finally{e.dispose()}})();var ee=r(5);
|
|
132
145
|
/*!
|
|
133
146
|
* Copyright 2021 Cognite AS
|
|
134
|
-
*/(e,
|
|
147
|
+
*/function te(e,t,r){if(!r)return e;if(t===ee.b.InstanceMesh||t===ee.b.TriangleMesh){const t=e.boundingBox;return!t||t.intersectsBox(r)?e:void 0}const o=oe(e,n.InterleavedBufferAttribute);let a;switch(t){case ee.b.BoxCollection:a=function(e,t){return se(e,ie,t)}(o,r);break;case ee.b.CircleCollection:a=function(e,t){return se(e,ne,t)}(o,r);break;case ee.b.ConeCollection:case ee.b.EccentricConeCollection:a=function(e,t){return ce(e,t,"a_radiusA","a_radiusB")}(o,r);break;case ee.b.EllipsoidSegmentCollection:a=function(e,t){return function(e,t){const{center:r}=de;return ae(e,(t,n,i,o)=>{const a=e.get("a_horizontalRadius").getX(t),s=e.get("a_verticalRadius").getX(t),c=e.get("a_height").getX(t),l=e.get("a_center");return r.set(l.getX(t),l.getY(t),l.getZ(t)),B(a,s,c,r,o)},t)}(e,t)}(o,r);break;case ee.b.GeneralCylinderCollection:a=function(e,t){return ce(e,t,"a_radius","a_radius")}(o,r);break;case ee.b.GeneralRingCollection:case ee.b.QuadCollection:a=function(e,t){return se(e,ne,t)}(o,r);break;case ee.b.TorusSegmentCollection:a=function(e,t){return function(e,t){const{boundingBox:r}=le;return ae(e,(t,n,i,o)=>{const a=e.get("a_radius").getX(t),s=e.get("a_tubeRadius").getX(t);r.min.set(-a-s,-a-s,-s),r.max.set(a+s,a+s,s);const c=e.get("a_instanceMatrix");return E(i,c.offset*c.array.BYTES_PER_ELEMENT,n,t,r,o)},t)}(e,t)}(o,r);break;case ee.b.TrapeziumCollection:a=function(e,t){return function(e,t){return ae(e,(t,r,n,i)=>{const o=e.get("a_vertex1"),a=e.get("a_vertex2"),s=e.get("a_vertex3"),c=e.get("a_vertex4"),l=o.array.BYTES_PER_ELEMENT;return N(o.offset*l,a.offset*l,s.offset*l,c.offset*l,n,r,t,i)},t)}(e,t)}(o,r);break;case ee.b.NutCollection:a=function(e,t){return se(e,ie,t)}
|
|
135
148
|
/*!
|
|
136
149
|
* Copyright 2021 Cognite AS
|
|
137
|
-
|
|
150
|
+
*/(o,r);break;default:Object(i.m)(t)}return 0!==a.length?function(e,t,r){const i=new n.BufferGeometry;return oe(t,n["BufferAttribute"]).forEach((e,t)=>{i.setAttribute(t,e)}),i.setIndex(t.getIndex()),r.forEach((t,r)=>{const o=t.data.stride,a=t.array.BYTES_PER_ELEMENT,s=re.get(a),c=new n.InstancedInterleavedBuffer(new s(e.buffer),o);i.setAttribute(r,new n.InterleavedBufferAttribute(c,t.itemSize,t.offset,t.normalized))}),i}(a,e,o):void 0}const re=new Map([[1,Uint8Array],[4,Float32Array]]),ne=new n.Box3(new n.Vector3(-.5,-.5,-1e-4),new n.Vector3(.5,.5,1e-4)),ie=new n.Box3(new n.Vector3(-.5,-.5,-.5),new n.Vector3(.5,.5,.5));function oe(e,t){return new Map(Object.entries(e.attributes).filter(e=>e[1]instanceof t).map(e=>[e[0],e[1]]))}function ae(e,t,r){const n=e.values().next().value,i=n.array;return D(new Uint8Array(i.buffer,i.byteOffset,i.byteLength),n.data.stride*i.BYTES_PER_ELEMENT,r,t)}function se(e,t,r){return ae(e,(r,n,i,o)=>{const a=e.get("a_instanceMatrix");return E(i,a.offset*a.array.BYTES_PER_ELEMENT,n,r,t,o)},r)}function ce(e,t,r,n){return ae(e,(t,i,o,a)=>{const s=e.get("a_centerA"),c=e.get("a_centerB"),l=e.get(r),d=e.get(n),f=s.array.BYTES_PER_ELEMENT;return I(o,s.offset*f,c.offset*f,l.offset*f,d.offset*f,i,t,a)},t)}const le={boundingBox:new n.Box3};const de={center:new n.Vector3};function fe(e,t,r,o){const a=[],s=e.filter(e=>null===o||function(e,t){const{p:r,box:n}=ue;n.makeEmpty();for(let t=0;t<e.vertices.length;t+=3)r.set(e.vertices[t+0],e.vertices[t+1],e.vertices[t+2]),n.expandByPoint(r);return t.intersectsBox(n)}
|
|
151
|
+
/*!
|
|
152
|
+
* Copyright 2021 Cognite AS
|
|
153
|
+
*/(e,o));for(const e of s){const o=new n.BufferGeometry,s=new n.Uint32BufferAttribute(e.indices.buffer,1).onUpload(i.p),c=new n.Float32BufferAttribute(e.vertices.buffer,3).onUpload(i.p),l=new n.Uint8BufferAttribute(e.colors.buffer,3).onUpload(i.p),d=new n.Float32BufferAttribute(e.treeIndices.buffer,1).onUpload(i.p);o.setIndex(s),o.setAttribute("color",l),o.setAttribute("position",c),o.setAttribute("treeIndex",d),o.boundingBox=t.clone(),o.boundingSphere=new n.Sphere,t.getBoundingSphere(o.boundingSphere);const f=new n.Mesh(o,r);f.name="Triangle mesh "+e.fileId,f.userData.treeIndices=new Map;for(const t of e.treeIndices)Object(i.r)(f.userData.treeIndices,t);a.push(f)}return a}const ue={p:new n.Vector3,box:new n.Box3}},function(e,t){e.exports=require("rxjs/operators")},function(e,t,r){"use strict";r.d(t,"a",(function(){return g})),r.d(t,"b",(function(){return n}));var n,i=r(0),o=r(2),a=r.n(o),s=r(1);function c(e,t=!0){const r=new i.PlaneBufferGeometry(1,1,1,1);return e.setIndex(r.getIndex()),e.setAttribute("position",r.getAttribute("position")),t&&e.setAttribute("normal",r.getAttribute("normal")),e.computeBoundingBox(),e.boundingBox}function l(e){const t=[];t.push(-1,1,-1),t.push(-1,-1,-1),t.push(1,1,-1),t.push(1,-1,-1),t.push(1,1,1),t.push(1,-1,1);const r=new Uint16Array([1,2,0,1,3,2,3,4,2,3,5,4]);return e.setIndex(new i.BufferAttribute(r,1)),e.setAttribute("position",new i.BufferAttribute(new Float32Array(t),3)),(new i.Box3).setFromArray(t)}function d(e){const t=[{tubularSegments:9,radialSegments:18},{tubularSegments:5,radialSegments:12},{tubularSegments:4,radialSegments:5}],r=
|
|
138
154
|
/*!
|
|
139
155
|
* Copyright 2021 Cognite AS
|
|
140
156
|
*/
|
|
141
|
-
const s=(
|
|
157
|
+
function(e,t,r=((e,t)=>[e,t,0])){const n=[],o=[],a=1/e,s=1/t;for(let i=0;i<=t;i++)for(let t=0;t<=e;t++){const[e,o,c]=r(t*a,i*s);n.push(e||0,o||0,c||0)}for(let r=1;r<=t;r++)for(let t=1;t<=e;t++){const n=(e+1)*r+t-1,i=(e+1)*(r-1)+t-1,a=(e+1)*(r-1)+t,s=(e+1)*r+t;o.push(n,i,s),o.push(i,a,s)}return{index:new i.Uint16BufferAttribute(o,1),position:new i.Float32BufferAttribute(n,3)}}(t[0].radialSegments,t[0].tubularSegments,(e,t)=>[e,2*t*Math.PI]);return e.setIndex(r.index),e.setAttribute("position",r.position),(new i.Box3).setFromArray(r.position.array)}function f(e,t){switch(e){case n.BoxCollection:!function(e){const t=new i.BoxBufferGeometry(1,1,1,1,1,1);e.setIndex(t.getIndex()),e.setAttribute("position",t.getAttribute("position")),e.setAttribute("normal",t.getAttribute("normal")),e.computeBoundingBox(),e.boundingBox}(t);break;case n.CircleCollection:c(t);break;case n.ConeCollection:case n.EccentricConeCollection:case n.EllipsoidSegmentCollection:case n.GeneralCylinderCollection:l(t);break;case n.GeneralRingCollection:c(t,!1);break;case n.NutCollection:!function(e){const t=new i.CylinderBufferGeometry(.5,.5,1,6);t.applyMatrix4((new i.Matrix4).makeRotationX(-Math.PI/2)),e.setIndex(t.getIndex()),e.setAttribute("position",t.getAttribute("position")),e.setAttribute("normal",t.getAttribute("normal")),(new i.Box3).setFromArray(t.getAttribute("position").array)}(t);break;case n.QuadCollection:c(t);break;case n.TrapeziumCollection:!function(e){const t=[0,0,0,1,1,1,2,2,2,3,3,3];e.setIndex(new i.BufferAttribute(new Uint16Array([0,1,3,0,3,2]),1)),e.setAttribute("position",new i.BufferAttribute(new Float32Array(t),3)),(new i.Box3).setFromArray(t)}(t);break;case n.TorusSegmentCollection:d(t);break;case n.InstanceMesh:case n.TriangleMesh:break;default:Object(s.m)(e)}}
|
|
142
158
|
/*!
|
|
143
159
|
* Copyright 2021 Cognite AS
|
|
144
|
-
|
|
160
|
+
*/!function(e){e[e.BoxCollection=0]="BoxCollection",e[e.CircleCollection=1]="CircleCollection",e[e.ConeCollection=2]="ConeCollection",e[e.EccentricConeCollection=3]="EccentricConeCollection",e[e.EllipsoidSegmentCollection=4]="EllipsoidSegmentCollection",e[e.GeneralCylinderCollection=5]="GeneralCylinderCollection",e[e.GeneralRingCollection=6]="GeneralRingCollection",e[e.QuadCollection=7]="QuadCollection",e[e.TorusSegmentCollection=8]="TorusSegmentCollection",e[e.TrapeziumCollection=9]="TrapeziumCollection",e[e.NutCollection=10]="NutCollection",e[e.TriangleMesh=11]="TriangleMesh",e[e.InstanceMesh=12]="InstanceMesh"}(n||(n={}));class u{constructor(){this._textDecoder=new TextDecoder}parseGlbMetadata(e){this.verifyGlbHeaders(e);const{length:t,json:r}=this.parseJson(e),{length:n,byteOffsetToBinContent:i}=this.parseBinHeaders(e,u.CHUNK_HEADER_BYTE_SIZE+t);return{json:r,byteOffsetToBinContent:i,binContentLength:n}}verifyGlbHeaders(e){const t=new DataView(e,0,u.GLB_HEADER_BYTE_SIZE),r=this._textDecoder.decode(new Uint8Array(e,0,4)),n=t.getUint32(4,!0);a()("glTF"===r,"Unknown file format"),a()(2===n,`Unsupported glTF version{${n}}`)}parseJson(e){const t=new DataView(e,u.GLB_HEADER_BYTE_SIZE,u.CHUNK_HEADER_BYTE_SIZE).getUint32(0,!0),r=this._textDecoder.decode(new Uint8Array(e,u.GLB_HEADER_BYTE_SIZE+4,4));a()("JSON"===r);const n=new Uint8Array(e,u.GLB_HEADER_BYTE_SIZE+u.CHUNK_HEADER_BYTE_SIZE,t),i=JSON.parse(this._textDecoder.decode(n));return a()(void 0!==i,"Failed to assign types to gltf json"),{type:r,length:t,json:i}}parseBinHeaders(e,t){const r=new DataView(e,u.GLB_HEADER_BYTE_SIZE+t,u.CHUNK_HEADER_BYTE_SIZE).getUint32(0,!0),n=this._textDecoder.decode(new Uint8Array(e,u.GLB_HEADER_BYTE_SIZE+t+4,4));return a()(n.includes("BIN")),{type:n,byteOffsetToBinContent:u.GLB_HEADER_BYTE_SIZE+t+u.CHUNK_HEADER_BYTE_SIZE,length:r}}}u.GLB_HEADER_BYTE_SIZE=12,u.CHUNK_HEADER_BYTE_SIZE=8;const p=new Map([["SCALAR",1],["VEC2",2],["VEC3",3],["VEC4",4],["MAT2",4],["MAT3",9],["MAT4",16]]),m=new Map([[5120,Int8Array],[5121,Uint8Array],[5122,Int16Array],[5123,Uint16Array],[5125,Uint32Array],[5126,Float32Array]]);var h=r(29),b=r.n(h);
|
|
161
|
+
/*!
|
|
162
|
+
* Copyright 2022 Cognite AS
|
|
163
|
+
*/
|
|
164
|
+
class v{constructor(){this._dracoDecoderModule=b()().then(e=>({module:e,decoder:new e.Decoder})),this._dracoDataTypes=this._dracoDecoderModule.then(e=>{const{module:t}=e;return new Map([[5120,t.DT_INT8],[5121,t.DT_UINT8],[5122,t.DT_INT16],[5123,t.DT_UINT16],[5125,t.DT_UINT32],[5126,t.DT_FLOAT32]])})}async decodeDracoBufferToDracoMesh(e){const{module:t,decoder:r}=await this._dracoDecoderModule,n=new t.DecoderBuffer;n.Init(e,e.length);const i=r.GetEncodedGeometryType(n);a()(i===t.TRIANGULAR_MESH);const o=new t.Mesh,s=r.DecodeBufferToMesh(n,o);if(!s.ok()||0===o.ptr)throw new Error("Failed to decode draco mesh. Error: "+s.error_msg());return o}async decodeDracoMeshToGeometryBuffers(e,t,r,n){const{module:i,decoder:o}=await this._dracoDecoderModule,a=this.decodeIndex(o,t,i),s=this.getAttributeDescriptors(e,o,n,r,t),{decodedVertexBufferView:c,vertexBufferDescriptor:l}=await this.decodeVertexBuffer(i,o,t,s);return{vertexBufferDescriptor:l,vertexBufferView:c,indexBufferView:a}}async decodeVertexBuffer(e,t,r,n){const i=n.map(e=>e.componentSize*e.numberOfComponents).reduce((e,t)=>e+t)*r.num_points(),o=e._malloc(i),a=await this._dracoDataTypes,s=r.num_points(),c=this.computeVertexBufferDescriptor(n,a,s,t,r,o),l=new Uint8Array(e.HEAP8.buffer,o,i),d=new Uint8Array(new ArrayBuffer(i));return this.copyLinearToInterleaved({buffer:l,attributeByteLengths:Object.values(c).map(e=>e.byteStride),numPoints:r.num_points()},d),e._free(o),{decodedVertexBufferView:d,vertexBufferDescriptor:c}}computeVertexBufferDescriptor(e,t,r,n,i,o){let a=0,s=0;return e.reduce((e,c)=>{const{componentSize:l,numberOfComponents:d,dracoAttribute:f,gltfAccessor:u}=c,p=t.get(u.componentType),m=l*d*r;n.GetAttributeDataArrayForAllPoints(i,f,p,m,o+a),u.byteOffset=s;const h=l*d;return a+=m,e[c.attributeName]={byteStride:h,byteOffset:s},s+=l*d,e},{})}getAttributeDescriptors(e,t,r,n,i){return Object.keys(r).map(o=>{const a=e.accessors[r[o]];return{attributeName:o,numberOfComponents:p.get(a.type),componentSize:m.get(a.componentType).BYTES_PER_ELEMENT,gltfAccessor:a,dracoAttribute:t.GetAttributeByUniqueId(i,n[o])}})}decodeIndex(e,t,r){const n=3*t.num_faces();let i,o;if(t.num_points()<=65536){const a=n*Uint16Array.BYTES_PER_ELEMENT;i=r._malloc(a),e.GetTrianglesUInt16Array(t,a,i),o=new Uint16Array(r.HEAPU16.buffer,i,n).slice()}else{const a=n*Uint32Array.BYTES_PER_ELEMENT;i=r._malloc(a),e.GetTrianglesUInt32Array(t,a,i),o=new Uint32Array(r.HEAPU32.buffer,i,n).slice()}return r._free(i),o}copyLinearToInterleaved(e,t){a()(e.buffer.byteLength<=t.byteLength);const r=e.attributeByteLengths.reduce((e,t)=>e+t,0);let n=0;e.attributeByteLengths.forEach(i=>{for(let o=0;o<e.numPoints;o++){const a=n*e.numPoints+o*i,s=o*r+n;t.set(e.buffer.subarray(a,a+i),s)}n+=i})}}
|
|
145
165
|
/*!
|
|
146
166
|
* Copyright 2021 Cognite AS
|
|
147
|
-
*/var c=n(
|
|
167
|
+
*/class g{constructor(){this._glbMetadataParser=new u,this._dracoDecoderHelper=new v}async parseSector(e){const t=this._glbMetadataParser.parseGlbMetadata(e),r=t.json;return this.traverseDefaultSceneNodes(r,t,e)}async traverseDefaultSceneNodes(e,t,r){const n=[],i=e.scenes[e.scene].nodes;return await Promise.all(i.map(t=>e.nodes[t]).map(async e=>{const i=await this.processNode(e,t,r);void 0!==i&&n.push(i)})),n}async processNode(e,t,r){var o;const s=null===(o=e.extensions)||void 0===o?void 0:o.EXT_mesh_gpu_instancing,c=e.mesh;if(void 0===s&&void 0===c)return;const l=s?new i.InstancedBufferGeometry:new i.BufferGeometry,d=n[e.name],f={bufferGeometry:l,geometryType:d,glbHeaderData:t,instancingExtension:s,meshId:c,data:r};switch(d){case n.InstanceMesh:return a()(void 0!==f.instancingExtension),this.processInstancedTriangleMesh(f);case n.TriangleMesh:a()(void 0===f.instancingExtension),await this.processTriangleMesh(f);break;default:a()(void 0!==f.instancingExtension),this.processPrimitiveCollection(f)}return{type:d,geometryBuffer:l}}async processInstancedTriangleMesh(e){var t,r;const{bufferGeometry:o,glbHeaderData:s,meshId:c,data:l}=e,d=s.json;a()(void 0!==c);const f=d.meshes[c];a()(1===f.primitives.length),a()(void 0!==(null===(t=f.extras)||void 0===t?void 0:t.InstanceId));const u=f.primitives[0],{vertexBuffer:p,byteOffset:m,byteLength:h}=await this.getVertexBuffer(d,s,l,u,o);this.setPositionBuffer(p,m,h,o);const b=this.getSharedBufferView(e.glbHeaderData.json,e.instancingExtension.attributes),v=e.glbHeaderData.byteOffsetToBinContent+(null!==(r=b.byteOffset)&&void 0!==r?r:0),{byteLength:g,byteStride:A}=b;return this.setInterleavedBufferAttributes(e.glbHeaderData.json,e.instancingExtension.attributes,e.data,v,g,A,e=>"a"+e,e.bufferGeometry,i.InstancedInterleavedBuffer),{type:n.InstanceMesh,geometryBuffer:e.bufferGeometry,instanceId:f.extras.InstanceId.toString()}}processPrimitiveCollection(e){var t;a()(null!==e.instancingExtension,"Primitive does not contain the instanced gltf extension"),f(e.geometryType,e.bufferGeometry);const r=this.getSharedBufferView(e.glbHeaderData.json,e.instancingExtension.attributes),n=e.glbHeaderData.byteOffsetToBinContent+(null!==(t=r.byteOffset)&&void 0!==t?t:0),{byteLength:o,byteStride:s}=r;this.setInterleavedBufferAttributes(e.glbHeaderData.json,e.instancingExtension.attributes,e.data,n,o,s,e=>"a"+e,e.bufferGeometry,i.InstancedInterleavedBuffer)}async processTriangleMesh(e){const{bufferGeometry:t,glbHeaderData:r,meshId:n,data:o}=e,s=r.json;a()(void 0!==n);const c=s.meshes[n];a()(1===c.primitives.length);const l=c.primitives[0],{vertexBuffer:d,byteOffset:f,byteLength:u,byteStride:p}=await this.getVertexBuffer(s,r,o,l,t);this.setInterleavedBufferAttributes(s,l.attributes,d,f,u,p,(function(e){switch(e){case"COLOR_0":return"color";case"POSITION":return"position";case"_treeIndex":return"treeIndex";default:throw new Error}}),t,i.InterleavedBuffer)}async getVertexBuffer(e,t,r,n,o){var a,s;let c,l,d,f;const u=t.byteOffsetToBinContent,p=null===(a=n.extensions)||void 0===a?void 0:a.KHR_draco_mesh_compression;if(void 0!==p){const t=e.bufferViews[p.bufferView],a=u+t.byteOffset,s=t.byteLength,m=new Int8Array(r,a,s),h=await this._dracoDecoderHelper.decodeDracoBufferToDracoMesh(m),{indexBufferView:b,vertexBufferView:v,vertexBufferDescriptor:g}=await this._dracoDecoderHelper.decodeDracoMeshToGeometryBuffers(e,h,p.attributes,n.attributes);o.setIndex(new i.BufferAttribute(b,1)),c=v.buffer,l=v.byteOffset,d=v.byteLength,f=Object.values(g).reduce((e,t)=>e+t.byteStride,0)}else{this.setIndexBuffer(t,n,r,o);const i=this.getSharedBufferView(e,n.attributes);c=r,l=u+(null!==(s=i.byteOffset)&&void 0!==s?s:0),d=i.byteLength,f=i.byteStride}return{vertexBuffer:c,byteOffset:l,byteLength:d,byteStride:f}}setIndexBuffer(e,t,r,n){var o;const a=e.json,s=e.byteOffsetToBinContent,c=a.accessors[t.indices],l=a.bufferViews[c.bufferView];l.byteOffset=null!==(o=l.byteOffset)&&void 0!==o?o:0;const d=m.get(c.componentType),f=new d(r,s+l.byteOffset,l.byteLength/d.BYTES_PER_ELEMENT),u=p.get(c.type);n.setIndex(new i.BufferAttribute(f,u))}setPositionBuffer(e,t,r,n){const o=Float32Array.BYTES_PER_ELEMENT,a=new Float32Array(e,t,r/o);n.setAttribute("position",new i.BufferAttribute(a,3))}getSharedBufferView(e,t){const r=Object.values(t).map(t=>e.accessors[t].bufferView);a()(r.length>0);const n=r[0];for(let e=1;e<r.length;e++)a()(r[e]===n,"Unexpected number of unique buffer views");return e.bufferViews[n]}setInterleavedBufferAttributes(e,t,r,n,i,o,a,s,c){const l=Object.values(t).map(t=>e.accessors[t].componentType),d=this.getUniqueComponentViews(l,r,n,i,o,c);this.setAttributes(t,e,d,a,s)}setAttributes(e,t,r,n,o){Object.keys(e).forEach(s=>{var c;const l=t.accessors[e[s]],d=null!==(c=l.byteOffset)&&void 0!==c?c:0,f=r[l.componentType],u=p.get(l.type);a()(void 0!==u);const h=m.get(l.componentType);a()(void 0!==h);const b=h.BYTES_PER_ELEMENT;a()(void 0!==b);const v=new i.InterleavedBufferAttribute(f,u,d/b),g=n(s);o.setAttribute(g,v)})}getUniqueComponentViews(e,t,r,n,i,o){const a=[...new Set(e)].map(e=>{const a=m.get(e),s=new a(t,r,n/a.BYTES_PER_ELEMENT);return{componentType:e,interleavedBuffer:new o(s,i/a.BYTES_PER_ELEMENT)}});return Object.assign({},...a.map(e=>({[e.componentType]:e.interleavedBuffer})))}}
|
|
148
168
|
/*!
|
|
149
169
|
* Copyright 2021 Cognite AS
|
|
150
|
-
*/
|
|
170
|
+
*/},function(e,t,r){"use strict";r.d(t,"a",(function(){return n})),r.d(t,"b",(function(){return i})),r.d(t,"c",(function(){return l})),r.d(t,"e",(function(){return u})),r.d(t,"f",(function(){return p})),r.d(t,"g",(function(){return m})),r.d(t,"d",(function(){return o}));class n{constructor(e){this.client=e,this.authenticationPromise=e.authenticate()}get headers(){return this.client.getDefaultRequestHeaders()}async getBinaryFile(e,t){const r=`${e}/${t}`,n={...this.client.getDefaultRequestHeaders(),Accept:"*/*"};return(await this.fetchWithRetry(r,{headers:n,method:"GET"}).catch(e=>{throw Error("Could not download binary file")})).arrayBuffer()}async getJsonFile(e,t){return(await this.client.get(`${e}/${t}`).catch(e=>{throw Error("Could not download Json file")})).data}async fetchWithRetry(e,t,r=3){let n;for(let i=0;i<r;i++)try{await this.authenticationPromise;const r=await fetch(e,t);if(401===r.status){this.authenticationPromise=this.client.authenticate();continue}return r}catch(e){void 0!==n&&(n=e)}throw n}}class i{constructor(e,t){this.revealInternalId=Symbol(`${e}/${t}`),this.modelId=e,this.revisionId=t}toString(){return`${i.name} (${String(this.revealInternalId)})`}}var o,a=r(0);
|
|
151
171
|
/*!
|
|
152
172
|
* Copyright 2021 Cognite AS
|
|
153
|
-
|
|
173
|
+
*/!function(e){e.EptPointCloud="ept-pointcloud",e.RevealCadModel="reveal-directory",e.GltfCadModel="gltf-directory",e.AnyFormat="all-outputs"}(o||(o={}));
|
|
154
174
|
/*!
|
|
155
175
|
* Copyright 2021 Cognite AS
|
|
156
|
-
*/
|
|
176
|
+
*/
|
|
177
|
+
const s=(new a.Matrix4).set(1,0,0,0,0,0,1,0,0,-1,0,0,0,0,0,1);function c(e,t){switch(t){case o.RevealCadModel:case o.GltfCadModel:e.premultiply(s);break;case o.EptPointCloud:break;default:throw new Error("Unknown model format '"+t)}}
|
|
157
178
|
/*!
|
|
158
179
|
* Copyright 2021 Cognite AS
|
|
159
|
-
*/class
|
|
180
|
+
*/class l{constructor(e){this._client=e}async getModelMatrix(e,t){if(!(e instanceof i))throw new Error(`Model must be a ${i.name}, but got ${e.toString()}`);const{modelId:r,revisionId:n}=e,o=await this._client.revisions3D.retrieve(r,n),s=new a.Matrix4;return o.rotation&&s.makeRotationFromEuler(new a.Euler(...o.rotation)),c(s,t),s}async getModelCamera(e){if(!(e instanceof i))throw new Error(`Model must be a ${i.name}, but got ${e.toString()}`);const{modelId:t,revisionId:r}=e,n=await this._client.revisions3D.retrieve(t,r);if(n.camera&&n.camera.position&&n.camera.target){const{position:e,target:t}=n.camera;return{position:new a.Vector3(e[0],e[1],e[2]),target:new a.Vector3(t[0],t[1],t[2])}}}async getModelUri(e,t){if(!(e instanceof i))throw new Error(`Model must be a ${i.name}, but got ${e.toString()}`);return`${this._client.getBaseUrl()}${this.getRequestPath(t.blobId)}`}async getModelOutputs(e){if(!(e instanceof i))throw new Error(`Model must be a ${i.name}, but got ${e.toString()}`);const{modelId:t,revisionId:r}=e,n=`/api/v1/projects/${this._client.project}/3d/models/${t}/revisions/${r}/outputs`,a=await this._client.get(n,{params:{format:o.AnyFormat}});if(200===a.status)return a.data.items.filter(e=>Object.values(o).includes(e.format));throw new Error(`Unexpected response ${a.status} (payload: '${a.data})`)}getRequestPath(e){return`/api/v1/projects/${this._client.project}/3d/files/${e}`}}var d=r(19);
|
|
160
181
|
/*!
|
|
161
182
|
* Copyright 2021 Cognite AS
|
|
162
|
-
*/
|
|
183
|
+
*/async function f(e){const t=await fetch(e);if(!t.ok){const e={};throw t.headers.forEach((t,r)=>{e[t]=r}),new d.HttpError(t.status,t.body,e)}return t}
|
|
163
184
|
/*!
|
|
164
185
|
* Copyright 2021 Cognite AS
|
|
165
|
-
*/}
|
|
186
|
+
*/class u{get headers(){return{}}async getBinaryFile(e,t){return(await f(`${e}/${t}`)).arrayBuffer()}async getJsonFile(e,t){return(await f(`${e}/${t}`)).json()}}
|
|
166
187
|
/*!
|
|
167
188
|
* Copyright 2021 Cognite AS
|
|
168
|
-
*/
|
|
189
|
+
*/class p{constructor(e){this.revealInternalId=Symbol(e),this.localPath=e}toString(){return`${p.name} (${this.localPath})`}}
|
|
169
190
|
/*!
|
|
170
191
|
* Copyright 2021 Cognite AS
|
|
171
|
-
*/
|
|
172
|
-
const o={centerA:new r.Vector3,centerB:new r.Vector3,sphere:new r.Sphere,box:new r.Box3};function i(e,t,n,r,i,a,s,d){const{centerA:l,centerB:c,sphere:u,box:p}=o;function m(t,n=0){const r=(s*a+t)/e.BYTES_PER_ELEMENT;return e[r+n]}l.set(m(t,0),m(t,1),m(t,2)),c.set(m(n,0),m(n,1),m(n,2));const h=m(r),f=m(i);return u.set(l,h),u.getBoundingBox(d),u.set(c,f),u.getBoundingBox(p),d.expandByPoint(p.min),d.expandByPoint(p.max),d}const a={vertex1:new r.Vector3,vertex2:new r.Vector3,vertex3:new r.Vector3,vertex4:new r.Vector3};function s(e,t,n,r,o,i,s,d){const{vertex1:l,vertex2:c,vertex3:u,vertex4:p}=a;function m(e,t=0){const n=(s*i+e)/o.BYTES_PER_ELEMENT;return o[n+t]}return l.set(m(e,0),m(e,1),m(e,2)),c.set(m(t,0),m(t,1),m(t,2)),u.set(m(n,0),m(n,1),m(n,2)),p.set(m(r,0),m(r,1),m(r,2)),d.setFromPoints([l,c,u,p]),d}const d={instanceMatrix:new r.Matrix4};function l(e,t,n,r,o,i){const{instanceMatrix:a}=d,s=(r*n+t)/e.BYTES_PER_ELEMENT;return a.set(e[s+0],e[s+4],e[s+8],e[s+12],e[s+1],e[s+5],e[s+9],e[s+13],e[s+2],e[s+6],e[s+10],e[s+14],e[s+3],e[s+7],e[s+11],e[s+15]),i.copy(o).applyMatrix4(a),i}const c={center:new r.Vector3,size:new r.Vector3};function u(e,t,n,r,o){const{size:i}=c,a=2*Math.max(e,t,n);return i.set(a,a,a),o.setFromCenterAndSize(r,i),o}function p(e,t,n,r,o,i,a,s){const{center:d}=c;function l(e,t=0){const n=(a*i+e.offset)/o.BYTES_PER_ELEMENT;return o[n+t]}const p=l(t),m=l(n),h=l(r);return d.set(l(e,0),l(e,1),l(e,2)),u(p,m,h,d,s)}},function(e,t){e.exports=require("@tweenjs/tween.js")},function(e,t,n){"use strict";n.d(t,"a",(function(){return o}));var r=n(0);
|
|
192
|
+
*/class m{getModelUri(e){if(!(e instanceof p))throw new Error(`Model must be a ${p.name}, but got ${e.toString()}`);return Promise.resolve(`${location.origin}/${e.localPath}`)}async getModelMatrix(e){if(!(e instanceof p))throw new Error(`Model must be a ${p.name}, but got ${e.toString()}`);const t=new a.Matrix4;return c(t,o.RevealCadModel),t}getModelCamera(e){if(!(e instanceof p))throw new Error(`Model must be a ${p.name}, but got ${e.toString()}`);return Promise.resolve(void 0)}async getModelOutputs(e){var t;const r=await this.getModelUri(e),n=null!==(t=await async function(e){let t;try{t=(await(await f(e+"/scene.json")).json()).version}catch(e){return}switch(t){case 8:return Promise.resolve({blobId:-1,format:o.RevealCadModel,version:8});case 9:return Promise.resolve({blobId:-1,format:o.GltfCadModel,version:9});default:return}}(r))&&void 0!==t?t:await async function(e){let t;try{t=await(await f(e+"/ept.json")).json()}catch(e){return}return t?Promise.resolve({blobId:-1,format:o.EptPointCloud,version:-1}):void 0}(r);if(n)return[n];throw new Error("Only point cloud or CAD models (version 8 and 9) are supported)")}}
|
|
173
193
|
/*!
|
|
174
194
|
* Copyright 2021 Cognite AS
|
|
175
|
-
*/
|
|
176
|
-
function o(e,t,n,o){const i=e.length/t,a=new Float32Array(e.buffer,e.byteOffset,e.byteLength/Float32Array.BYTES_PER_ELEMENT),s=new r.Box3,d=new Uint8Array(e.length);let l=0;for(let r=0;r<i;++r)if(o(r,t,a,s),n.intersectsBox(s)){const n=e.subarray(r*t,(r+1)*t);d.set(n,l*t),l++}return d.slice(0,l*t)}},function(e,t){e.exports=require("mixpanel-browser")},function(e,t,n){"use strict";n.d(t,"a",(function(){return i})),n.d(t,"b",(function(){return a}));var r=n(0);
|
|
195
|
+
*/},function(e,t){e.exports=require("glslify")},function(e,t){e.exports=require("rxjs")},function(e,t,r){"use strict";r.d(t,"a",(function(){return c}));var n=r(13),i=r.n(n),o=r(11);const{VERSION:a,MIXPANEL_TOKEN:s}={VERSION:"3.0.0",WORKER_VERSION:"1.3.0",MIXPANEL_TOKEN:"8c900bdfe458e32b768450c20750853d",IS_DEVELOPMENT_MODE:!1};class c{constructor(e,t,r){i.a.init(s,{disable_cookie:!0,disable_persistence:!0,ip:!1,property_blacklist:["$city","$region","mp_country_code","$geo_source","$timezone","mp_lib","$lib_version","$device_id","$user_id","$current_url","$screen_width","$screen_height","$referrer","$referring_domain","$initial_referrer","$initial_referring_domain"]}),i.a.reset(),i.a.identify("reveal-single-user"),this._sessionProps={VERSION:a,project:"unknown",application:"unknown",sessionId:"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,(function(e){const t=16*Math.random()|0;return("x"==e?t:3&t|8).toString(16)}))},e&&(this._sessionProps.project=e),t&&(this._sessionProps.application=t),this.innerTrackEvent("init",r)}static init(e,t,r,n){if(void 0===globalThis.revealMetricsLogger&&e){const e=new c(t,r,n);globalThis.revealMetricsLogger={metricsLogger:e}}}innerTrackEvent(e,t){const r={...this._sessionProps,...t};i.a.track(e,r)}static trackEvent(e,t){globalThis.revealMetricsLogger&&globalThis.revealMetricsLogger.metricsLogger.innerTrackEvent(e,t)}static trackCreateTool(e){c.trackEvent("toolCreated",{toolName:e})}static trackLoadModel(e,t,r){c.trackEvent("loadModel",{...e,modelIdentifier:t,modelVersion:r})}static trackCadModelStyled(e,t){c.trackEvent("cadModelStyleAssigned",{nodeCollectionClassToken:e,style:t})}static trackError(e,t){o.a.error(e),void 0!==e?this.trackEvent("error",{message:e.message||e,name:e.name,stack:e.stack,...t}):this.trackEvent("error",{name:"unknown",...t})}static trackCameraNavigation(e){c.trackEvent("cameraNavigated",e)}}
|
|
177
196
|
/*!
|
|
178
197
|
* Copyright 2021 Cognite AS
|
|
179
|
-
*/
|
|
180
|
-
const o={renderSize:new r.Vector2,position:new r.Vector3};function i(e,t,n=new r.Vector3){const{position:i}=o;i.copy(t),i.project(e);const a=(i.x+1)/2,s=(1-i.y)/2;return n.set(a,s,i.z)}function a(e,t,n,a=new r.Vector3){i(t,n,a);const{renderSize:s}=o;e.getSize(s);const d=e.domElement,{width:l,height:c}=d.getBoundingClientRect();return a.x=Math.round(a.x*l),a.y=Math.round(a.y*c),a}},function(e,t){e.exports=require("lodash/debounce")},function(e,t){e.exports=require("lodash/cloneDeep")},function(e,t){e.exports=require("lodash/range")},,function(e,t){e.exports=require("@cognite/sdk-core")},function(e,t,n){"use strict";var r=n(15);n.d(t,"d",(function(){return r.b}));var o=n(22);n.d(t,"a",(function(){return o.a}));var i=n(1);n.d(t,"c",(function(){return i.l})),n.d(t,"b",(function(){return i.d}));n(5);
|
|
198
|
+
*/},function(e,t){e.exports=require("@cognite/potree-core")},function(e,t,r){"use strict";var n=r(26);
|
|
181
199
|
/*!
|
|
182
200
|
* Copyright 2021 Cognite AS
|
|
183
|
-
*/},function(e,t,n){"
|
|
201
|
+
*/t.a=n},function(e,t){e.exports=require("@tweenjs/tween.js")},function(e,t){e.exports=require("mixpanel-browser")},function(e,t){e.exports=require("lodash/debounce")},function(e,t){e.exports=require("lodash/range")},function(e,t){e.exports=require("lodash/cloneDeep")},function(e,t){e.exports=require("lodash/chunk")},,function(e,t){e.exports=require("@cognite/sdk-core")},function(e,t,r){(function(e){function r(e,t){for(var r=0,n=e.length-1;n>=0;n--){var i=e[n];"."===i?e.splice(n,1):".."===i?(e.splice(n,1),r++):r&&(e.splice(n,1),r--)}if(t)for(;r--;r)e.unshift("..");return e}function n(e,t){if(e.filter)return e.filter(t);for(var r=[],n=0;n<e.length;n++)t(e[n],n,e)&&r.push(e[n]);return r}t.resolve=function(){for(var t="",i=!1,o=arguments.length-1;o>=-1&&!i;o--){var a=o>=0?arguments[o]:e.cwd();if("string"!=typeof a)throw new TypeError("Arguments to path.resolve must be strings");a&&(t=a+"/"+t,i="/"===a.charAt(0))}return(i?"/":"")+(t=r(n(t.split("/"),(function(e){return!!e})),!i).join("/"))||"."},t.normalize=function(e){var o=t.isAbsolute(e),a="/"===i(e,-1);return(e=r(n(e.split("/"),(function(e){return!!e})),!o).join("/"))||o||(e="."),e&&a&&(e+="/"),(o?"/":"")+e},t.isAbsolute=function(e){return"/"===e.charAt(0)},t.join=function(){var e=Array.prototype.slice.call(arguments,0);return t.normalize(n(e,(function(e,t){if("string"!=typeof e)throw new TypeError("Arguments to path.join must be strings");return e})).join("/"))},t.relative=function(e,r){function n(e){for(var t=0;t<e.length&&""===e[t];t++);for(var r=e.length-1;r>=0&&""===e[r];r--);return t>r?[]:e.slice(t,r-t+1)}e=t.resolve(e).substr(1),r=t.resolve(r).substr(1);for(var i=n(e.split("/")),o=n(r.split("/")),a=Math.min(i.length,o.length),s=a,c=0;c<a;c++)if(i[c]!==o[c]){s=c;break}var l=[];for(c=s;c<i.length;c++)l.push("..");return(l=l.concat(o.slice(s))).join("/")},t.sep="/",t.delimiter=":",t.dirname=function(e){if("string"!=typeof e&&(e+=""),0===e.length)return".";for(var t=e.charCodeAt(0),r=47===t,n=-1,i=!0,o=e.length-1;o>=1;--o)if(47===(t=e.charCodeAt(o))){if(!i){n=o;break}}else i=!1;return-1===n?r?"/":".":r&&1===n?"/":e.slice(0,n)},t.basename=function(e,t){var r=function(e){"string"!=typeof e&&(e+="");var t,r=0,n=-1,i=!0;for(t=e.length-1;t>=0;--t)if(47===e.charCodeAt(t)){if(!i){r=t+1;break}}else-1===n&&(i=!1,n=t+1);return-1===n?"":e.slice(r,n)}(e);return t&&r.substr(-1*t.length)===t&&(r=r.substr(0,r.length-t.length)),r},t.extname=function(e){"string"!=typeof e&&(e+="");for(var t=-1,r=0,n=-1,i=!0,o=0,a=e.length-1;a>=0;--a){var s=e.charCodeAt(a);if(47!==s)-1===n&&(i=!1,n=a+1),46===s?-1===t?t=a:1!==o&&(o=1):-1!==t&&(o=-1);else if(!i){r=a+1;break}}return-1===t||-1===n||0===o||1===o&&t===n-1&&t===r+1?"":e.slice(t,n)};var i="b"==="ab".substr(-1)?function(e,t,r){return e.substr(t,r)}:function(e,t,r){return t<0&&(t=e.length+t),e.substr(t,r)}}).call(this,r(22))},,function(e,t){var r,n,i=e.exports={};function o(){throw new Error("setTimeout has not been defined")}function a(){throw new Error("clearTimeout has not been defined")}function s(e){if(r===setTimeout)return setTimeout(e,0);if((r===o||!r)&&setTimeout)return r=setTimeout,setTimeout(e,0);try{return r(e,0)}catch(t){try{return r.call(null,e,0)}catch(t){return r.call(this,e,0)}}}!function(){try{r="function"==typeof setTimeout?setTimeout:o}catch(e){r=o}try{n="function"==typeof clearTimeout?clearTimeout:a}catch(e){n=a}}();var c,l=[],d=!1,f=-1;function u(){d&&c&&(d=!1,c.length?l=c.concat(l):f=-1,l.length&&p())}function p(){if(!d){var e=s(u);d=!0;for(var t=l.length;t;){for(c=l,l=[];++f<t;)c&&c[f].run();f=-1,t=l.length}c=null,d=!1,function(e){if(n===clearTimeout)return clearTimeout(e);if((n===a||!n)&&clearTimeout)return n=clearTimeout,clearTimeout(e);try{n(e)}catch(t){try{return n.call(null,e)}catch(t){return n.call(this,e)}}}(e)}}function m(e,t){this.fun=e,this.array=t}function h(){}i.nextTick=function(e){var t=new Array(arguments.length-1);if(arguments.length>1)for(var r=1;r<arguments.length;r++)t[r-1]=arguments[r];l.push(new m(e,t)),1!==l.length||d||s(p)},m.prototype.run=function(){this.fun.apply(null,this.array)},i.title="browser",i.browser=!0,i.env={},i.argv=[],i.version="",i.versions={},i.on=h,i.addListener=h,i.once=h,i.off=h,i.removeListener=h,i.removeAllListeners=h,i.emit=h,i.prependListener=h,i.prependOnceListener=h,i.listeners=function(e){return[]},i.binding=function(e){throw new Error("process.binding is not supported")},i.cwd=function(){return"/"},i.chdir=function(e){throw new Error("process.chdir is not supported")},i.umask=function(){return 0}},function(e,t){},function(e,t,r){"use strict";var n=r(1);r.d(t,"b",(function(){return n.m})),r.d(t,"a",(function(){return n.e})),r.d(t,"c",(function(){return n.B}));r(6);
|
|
184
202
|
/*!
|
|
185
203
|
* Copyright 2021 Cognite AS
|
|
204
|
+
*/},function(e,t){e.exports=require("comlink")},function(e,t){e.exports=require("loglevel")},function(e,t){e.exports=require("lodash/map")},function(e,t){e.exports=require("skmeans")},function(e,t,r){(function(t,n,i,o){var a,s=(a=(a="undefined"!=typeof document&&document.currentScript?document.currentScript.src:void 0)||t,function(e){var t,s,c=void 0!==(e=e||{})?e:{};c.ready=new Promise((function(e,r){t=e,s=r}));var l=!1,d=!1;c.onRuntimeInitialized=function(){l=!0,d&&"function"==typeof c.onModuleLoaded&&c.onModuleLoaded(c)},c.onModuleParsed=function(){d=!0,l&&"function"==typeof c.onModuleLoaded&&c.onModuleLoaded(c)},c.isVersionSupported=function(e){if("string"!=typeof e)return!1;const t=e.split(".");return!(t.length<2||t.length>3)&&(1==t[0]&&t[1]>=0&&t[1]<=5||!(0!=t[0]||t[1]>10))};var f,u={};for(f in c)c.hasOwnProperty(f)&&(u[f]=c[f]);var p,m,h,b,v,g=[],A="object"==typeof window,_="function"==typeof importScripts,x="object"==typeof n&&"object"==typeof n.versions&&"string"==typeof n.versions.node,y="";x?(y=_?r(20).dirname(y)+"/":i+"/",p=function(e,t){var n=ie(e);return n?t?n:n.toString():(b||(b=r(23)),v||(v=r(20)),e=v.normalize(e),b.readFileSync(e,t?null:"utf8"))},h=function(e){var t=p(e,!0);return t.buffer||(t=new Uint8Array(t)),I(t.buffer),t},m=function(e,t,n){var i=ie(e);i&&t(i),b||(b=r(23)),v||(v=r(20)),e=v.normalize(e),b.readFile(e,(function(e,r){e?n(e):t(r.buffer)}))},n.argv.length>1&&n.argv[1].replace(/\\/g,"/"),g=n.argv.slice(2),c.inspect=function(){return"[Emscripten Module object]"}):(A||_)&&(_?y=self.location.href:"undefined"!=typeof document&&document.currentScript&&(y=document.currentScript.src),a&&(y=a),y=0!==y.indexOf("blob:")?y.substr(0,y.replace(/[?#].*/,"").lastIndexOf("/")+1):"",p=function(e){try{var t=new XMLHttpRequest;return t.open("GET",e,!1),t.send(null),t.responseText}catch(t){var r=ie(e);if(r)return function(e){for(var t=[],r=0;r<e.length;r++){var n=e[r];n>255&&(n&=255),t.push(String.fromCharCode(n))}return t.join("")}(r);throw t}},_&&(h=function(e){try{var t=new XMLHttpRequest;return t.open("GET",e,!1),t.responseType="arraybuffer",t.send(null),new Uint8Array(t.response)}catch(t){var r=ie(e);if(r)return r;throw t}}),m=function(e,t,r){var n=new XMLHttpRequest;n.open("GET",e,!0),n.responseType="arraybuffer",n.onload=function(){if(200==n.status||0==n.status&&n.response)t(n.response);else{var i=ie(e);i?t(i.buffer):r()}},n.onerror=r,n.send(null)}),c.print||console.log.bind(console);var k,T=c.printErr||console.warn.bind(console);for(f in u)u.hasOwnProperty(f)&&(c[f]=u[f]);u=null,c.arguments&&(g=c.arguments),c.thisProgram&&c.thisProgram,c.quit&&c.quit,c.wasmBinary&&(k=c.wasmBinary);c.noExitRuntime;var w,C={Memory:function(e){this.buffer=new ArrayBuffer(65536*e.initial)},Module:function(e){},Instance:function(e,t){this.exports=function(e){for(var t,r=new Uint8Array(123),n=25;n>=0;--n)r[48+n]=52+n,r[65+n]=n,r[97+n]=26+n;function i(e,t,n){for(var i,o,a=0,s=t,c=n.length,l=t+(3*c>>2)-("="==n[c-2])-("="==n[c-1]);a<c;a+=4)i=r[n.charCodeAt(a+1)],o=r[n.charCodeAt(a+2)],e[s++]=r[n.charCodeAt(a)]<<2|i>>4,s<l&&(e[s++]=i<<4|o>>2),s<l&&(e[s++]=o<<6|r[n.charCodeAt(a+3)])}r[43]=62,r[47]=63;var o=new ArrayBuffer(16),a=new Int32Array(o),s=new Float32Array(o);function c(e){s[2]=e}function l(e){return a[e]}return new Float64Array(o),function(e){var r=e.a,n=r.buffer;r.grow=function(e){e|=0;var i=0|gn(),c=i+e|0;if(i<c&&c<65536){var l=new ArrayBuffer(h(c,65536));new Int8Array(l).set(o),o=new Int8Array(l),a=new Int16Array(l),s=new Int32Array(l),d=new Uint8Array(l),f=new Uint16Array(l),u=new Uint32Array(l),p=new Float32Array(l),m=new Float64Array(l),n=l,r.buffer=n,t=d}return i};var o=new Int8Array(n),a=new Int16Array(n),s=new Int32Array(n),d=new Uint8Array(n),f=new Uint16Array(n),u=new Uint32Array(n),p=new Float32Array(n),m=new Float64Array(n),h=Math.imul,b=Math.fround,v=Math.abs,g=Math.clz32,A=Math.min,_=Math.max,x=Math.floor,y=Math.ceil,k=(Math.trunc,Math.sqrt),T=e.abort,w=e.b,C=e.c,M=e.d,I=e.e,S=e.f,N=5254912,R=0;function E(e,t,r,n){var i=0,a=0,c=0,l=0,p=0,m=0,b=0,v=0,g=0,A=0,_=0,x=0,y=0,k=0,T=0,w=0,C=0,M=0,I=0,S=0;if(!e)return 1;e:if(!((0|(c=s[r+20>>2]))>=(0|(v=s[r+12>>2]))&(i=s[r+16>>2])>>>0>=u[r+8>>2]|(0|c)>(0|v))){v=d[i+s[r>>2]|0],c=(i=i+1|0)?c:c+1|0,s[r+16>>2]=i,s[r+20>>2]=c;t:switch(0|v){case 0:m=e,c=t,A=n,e=0,n=0,N=v=N+-64|0,s[v+56>>2]=0,s[v+48>>2]=0,s[v+52>>2]=0,s[v+40>>2]=0,s[v+44>>2]=0,s[v+32>>2]=0,s[v+36>>2]=0,s[v+24>>2]=0,s[v+28>>2]=0,s[v+16>>2]=0,s[v+20>>2]=0,s[v+8>>2]=0,s[v+12>>2]=0;r:if(ce(v+8|0,r)&&!(!ze(v+8|0,r)|(s[v+20>>2]?0:m))){if($t(r,0,0),m)for(k=c<<2,T=s[v+36>>2],C=s[v+48>>2],M=s[v+24>>2];;){n:if(!((p=s[v+56>>2])>>>0>16383))for(e=s[v+52>>2];;){if((0|e)<=0)break n;if(e=e-1|0,s[v+52>>2]=e,p=d[e+C|0]|p<<8,s[v+56>>2]=p,!(p>>>0<16384))break}if(t=T+((b=s[M+((e=4095&p)<<2)>>2])<<3)|0,s[v+56>>2]=(h(s[t>>2],p>>>12|0)+e|0)-s[t+4>>2],!((0|c)<=0)){if(e=0,!d[r+36|0]|b>>>0>32)break r;if(b){for(I=-2&b,S=1&b,i=n+c|0,t=s[r+32>>2];;){if(g=s[r+28>>2],y=s[r+24>>2],p=0,e=t,a=0,x=0,1!=(0|b))for(;(l=(e>>>3|0)+y|0)>>>0>=g>>>0?l=0:(l=d[0|l],t=e+1|0,s[r+32>>2]=t,l=l>>>(7&e)&1,e=t),l=l<<p|a,a=0,(w=(e>>>3|0)+y|0)>>>0<g>>>0&&(a=d[0|w],t=e+1|0,s[r+32>>2]=t,a=a>>>(7&e)&1,e=t),w=1|p,p=p+2|0,a=l|a<<w,(0|I)!=(0|(x=x+2|0)););if(l=A+(n<<2)|0,S&&((x=g)>>>0>(g=(e>>>3|0)+y|0)>>>0?(g=d[0|g],t=e+1|0,s[r+32>>2]=t,e=g>>>(7&e)&1):e=0,a|=e<<p),s[l>>2]=a,(0|i)==(0|(n=n+1|0)))break}n=i}else We(A+(n<<2)|0,0,k),n=n+c|0}if(!(m>>>0>(_=c+_|0)>>>0))break}o[r+36|0]=0,n=s[r+20>>2],e=0,t=(c=(e=(t=s[r+32>>2]+7|0)>>>0<7?1:e)<<29|t>>>3)+s[r+16>>2]|0,e=(e>>>3|0)+n|0,s[r+16>>2]=t,s[r+20>>2]=t>>>0<c>>>0?e+1|0:e,e=1}return(t=s[v+36>>2])&&(s[v+40>>2]=t,ee(t)),(t=s[v+24>>2])&&(s[v+28>>2]=t,ee(t)),(t=s[v+8>>2])&&(s[v+12>>2]=t,ee(t)),N=v- -64|0,e;case 1:break t;default:break e}t=0;t:if(!((0|(c=s[r+20>>2]))>=(0|(i=s[r+12>>2]))&(a=s[r+16>>2])>>>0>=u[r+8>>2]|(0|i)<(0|c))){i=d[a+s[r>>2]|0],c=(a=a+1|0)?c:c+1|0,s[r+16>>2]=a,s[r+20>>2]=c;r:switch(i-1|0){case 4:if(N=a=N+-64|0,s[a+56>>2]=0,s[a+48>>2]=0,s[a+52>>2]=0,s[a+40>>2]=0,s[a+44>>2]=0,s[a+32>>2]=0,s[a+36>>2]=0,s[a+24>>2]=0,s[a+28>>2]=0,s[a+16>>2]=0,s[a+20>>2]=0,s[a+8>>2]=0,s[a+12>>2]=0,!(!ce(a+8|0,r)|(s[a+20>>2]?0:e))&&ze(a+8|0,r))if(e)for(r=s[a+36>>2],c=s[a+48>>2],m=s[a+24>>2],l=s[a+56>>2];;){n:if(!(l>>>0>16383))for(t=s[a+52>>2];;){if((0|t)<=0)break n;if(t=t-1|0,s[a+52>>2]=t,l=d[t+c|0]|l<<8,s[a+56>>2]=l,!(l>>>0<16384))break}if(A=s[m+((t=4095&l)<<2)>>2],l=(h(s[(i=r+(A<<3)|0)>>2],l>>>12|0)+t|0)-s[i+4>>2]|0,s[a+56>>2]=l,s[(_<<2)+n>>2]=A,t=1,(0|(_=_+1|0))==(0|e))break}else t=1;(e=s[a+36>>2])&&(s[a+40>>2]=e,ee(e)),(e=s[a+24>>2])&&(s[a+28>>2]=e,ee(e)),(e=s[a+8>>2])&&(s[a+12>>2]=e,ee(e)),N=a- -64|0;break t;case 8:v=e,N=i=N+-64|0,s[i+48>>2]=0,s[i+40>>2]=0,s[i+44>>2]=0,s[i+32>>2]=0,s[i+36>>2]=0,s[i+24>>2]=0,s[i+28>>2]=0,s[i+16>>2]=0,s[i+20>>2]=0,s[i+8>>2]=0,s[i+12>>2]=0,s[i>>2]=0,s[i+4>>2]=0;n:{i:if(f[r+38>>1]&&Tt(1,i+12|0,r)){if(p=s[i+12>>2],t=s[i>>2],p>>>0>(e=s[i+4>>2]-t>>2)>>>0?(ct(i,p-e|0),p=s[i+12>>2]):e>>>0<=p>>>0||(s[i+4>>2]=t+(p<<2)),e=1,!p)break n;for(y=s[r+8>>2],_=s[r+12>>2],x=s[i>>2],a=0;;){if(e=0,(0|_)<=(0|(c=s[r+20>>2]))&y>>>0<=(t=s[r+16>>2])>>>0|(0|c)>(0|_))break n;k=s[r>>2],g=d[k+t|0],c=(e=t+1|0)?c:c+1|0,b=e,s[r+16>>2]=e,e=c,s[r+20>>2]=e,t=g>>>2|0,l=0;o:{a:{s:{c:switch(0|(c=3&g)){case 0:break a;case 3:break c;default:break s}if(e=0,(t=t+a|0)>>>0>=p>>>0)break n;We(x+(a<<2)|0,0,4+(252&g)|0),a=t;break o}for(;;){if((0|e)>=(0|_)&b>>>0>=y>>>0|(0|e)>(0|_))break i;if(p=d[b+k|0],e=(b=b+1|0)?e:e+1|0,s[r+16>>2]=b,s[r+20>>2]=e,t|=p<<(l<<3|6),(0|c)==(0|(l=l+1|0)))break}}s[x+(a<<2)>>2]=t}if(!((a=a+1|0)>>>0<(p=s[i+12>>2])>>>0))break}if(_=i+16|0,y=s[i>>2],e=s[i+16>>2],(a=(t=s[i+20>>2]-e|0)>>2)>>>0<=8191?ct(_,8192-a|0):32768!=(0|t)&&(s[i+20>>2]=e+32768),a=s[(e=i+28|0)>>2],(t=s[i+32>>2]-a>>3)>>>0<p>>>0)lt(e,p-t|0),a=s[e>>2];else if(t>>>0>p>>>0&&(s[i+32>>2]=(p<<3)+a),!p)break i;for(l=0,e=0;;){if(b=s[(c=y+(l<<2)|0)>>2],t=e,s[4+(g=(l<<3)+a|0)>>2]=e,s[g>>2]=b,(e=(c=s[c>>2])+e|0)>>>0>8192)break i;if(!(e>>>0<=t>>>0)){if(g=s[_>>2],b=0,x=7&c)for(;s[g+(t<<2)>>2]=l,t=t+1|0,(0|x)!=(0|(b=b+1|0)););if(!(c-1>>>0<=6))for(;s[(c=g+(t<<2)|0)>>2]=l,s[c+28>>2]=l,s[c+24>>2]=l,s[c+20>>2]=l,s[c+16>>2]=l,s[c+12>>2]=l,s[c+8>>2]=l,s[c+4>>2]=l,(0|(t=t+8|0))!=(0|e););}if((0|p)==(0|(l=l+1|0)))break}A=8192==(0|e)}e=A}n:if(!(!e|(s[i+12>>2]?0:v))&&ht(1,i+56|0,r)&&(a=(e=s[r+8>>2])-(t=s[r+16>>2])|0,c=s[i+60>>2],A=s[r+20>>2],!((0|c)==(0|(l=s[r+12>>2]-(A+(e>>>0<t>>>0)|0)|0))&a>>>0<(e=s[i+56>>2])>>>0|c>>>0>l>>>0||(c=c+A|0,c=(a=e+t|0)>>>0<e>>>0?c+1|0:c,s[r+16>>2]=a,s[r+20>>2]=c,(0|e)<=0)))){r=t+s[r>>2]|0,s[i+40>>2]=r;i:if((c=d[0|(a=r+(t=e-1|0)|0)])>>>0<=63)s[i+44>>2]=t,e=63&d[0|a];else{o:switch((c>>>6|0)-1|0){case 0:if(e>>>0<2)break n;t=e-2|0,s[i+44>>2]=t,e=d[1+(e=(e+r|0)-2|0)|0]<<8&16128|d[0|e];break i;case 1:if(e>>>0<3)break n;t=e-3|0,s[i+44>>2]=t,e=d[2+(e=(e+r|0)-3|0)|0]<<16&4128768|d[e+1|0]<<8|d[0|e];break i}t=e-4|0,s[i+44>>2]=t,e=d[2+(e=(e+r|0)-4|0)|0]<<16|d[e+3|0]<<24&1056964608|d[e+1|0]<<8|d[0|e]}if(a=e+32768|0,s[i+48>>2]=a,!(a>>>0>8388607))if(v)for(c=s[i+28>>2],e=0,A=s[i+16>>2];;){i:if(!(a>>>0>32767))for(;;){if((0|t)<=0)break i;if(t=t-1|0,s[i+44>>2]=t,a=d[t+r|0]|a<<8,s[i+48>>2]=a,!(a>>>0<32768))break}if(l=s[A+((m=8191&a)<<2)>>2],a=(h(s[(p=c+(l<<3)|0)>>2],a>>>13|0)+m|0)-s[p+4>>2]|0,s[i+48>>2]=a,s[(e<<2)+n>>2]=l,m=1,(0|v)==(0|(e=e+1|0)))break}else m=1}(e=s[i+28>>2])&&(s[i+32>>2]=e,ee(e)),(e=s[i+16>>2])&&(s[i+20>>2]=e,ee(e)),(e=s[i>>2])&&(s[i+4>>2]=e,ee(e)),N=i- -64|0,t=m;break t;case 9:v=e,N=i=N+-64|0,s[i+48>>2]=0,s[i+40>>2]=0,s[i+44>>2]=0,s[i+32>>2]=0,s[i+36>>2]=0,s[i+24>>2]=0,s[i+28>>2]=0,s[i+16>>2]=0,s[i+20>>2]=0,s[i+8>>2]=0,s[i+12>>2]=0,s[i>>2]=0,s[i+4>>2]=0;n:{i:if(f[r+38>>1]&&Tt(1,i+12|0,r)){if(p=s[i+12>>2],t=s[i>>2],p>>>0>(e=s[i+4>>2]-t>>2)>>>0?(ct(i,p-e|0),p=s[i+12>>2]):e>>>0<=p>>>0||(s[i+4>>2]=t+(p<<2)),e=1,!p)break n;for(g=s[r+8>>2],_=s[r+12>>2],y=s[i>>2],a=0;;){if(e=0,(0|_)<=(0|(t=s[r+20>>2]))&g>>>0<=(l=s[r+16>>2])>>>0|(0|t)>(0|_))break n;x=s[r>>2],c=d[x+l|0],e=t,e=(t=l+1|0)?e:e+1|0,b=t,s[r+16>>2]=t,s[r+20>>2]=e,t=c>>>2|0,l=0;o:{a:{s:{c:switch(0|(k=3&c)){case 0:break a;case 3:break c;default:break s}if(e=0,(t=t+a|0)>>>0>=p>>>0)break n;We(y+(a<<2)|0,0,4+(252&c)|0),a=t;break o}for(;;){if((0|e)>=(0|_)&b>>>0>=g>>>0|(0|e)>(0|_))break i;if(p=d[b+x|0],c=e,c=(e=b+1|0)?c:c+1|0,b=e,s[r+16>>2]=e,e=c,s[r+20>>2]=e,t|=p<<(l<<3|6),(0|k)==(0|(l=l+1|0)))break}}s[y+(a<<2)>>2]=t}if(!((a=a+1|0)>>>0<(p=s[i+12>>2])>>>0))break}if(_=i+16|0,y=s[i>>2],e=s[i+16>>2],(a=(t=s[i+20>>2]-e|0)>>2)>>>0<=32767?ct(_,32768-a|0):131072!=(0|t)&&(s[i+20>>2]=e+131072),a=s[(e=i+28|0)>>2],(t=s[i+32>>2]-a>>3)>>>0<p>>>0)lt(e,p-t|0),a=s[e>>2];else if(t>>>0>p>>>0&&(s[i+32>>2]=(p<<3)+a),!p)break i;for(l=0,e=0;;){if(b=s[(c=y+(l<<2)|0)>>2],t=e,s[4+(g=(l<<3)+a|0)>>2]=e,s[g>>2]=b,(e=(c=s[c>>2])+e|0)>>>0>32768)break i;if(!(e>>>0<=t>>>0)){if(g=s[_>>2],b=0,x=7&c)for(;s[g+(t<<2)>>2]=l,t=t+1|0,(0|x)!=(0|(b=b+1|0)););if(!(c-1>>>0<=6))for(;s[(c=g+(t<<2)|0)>>2]=l,s[c+28>>2]=l,s[c+24>>2]=l,s[c+20>>2]=l,s[c+16>>2]=l,s[c+12>>2]=l,s[c+8>>2]=l,s[c+4>>2]=l,(0|(t=t+8|0))!=(0|e););}if((0|p)==(0|(l=l+1|0)))break}A=32768==(0|e)}e=A}n:if(!(!e|(s[i+12>>2]?0:v))&&ht(1,i+56|0,r)&&(c=(e=s[r+8>>2])-(t=a=s[r+16>>2])|0,A=s[i+60>>2],l=s[r+20>>2],!((0|A)==(0|(e=s[r+12>>2]-(l+(e>>>0<t>>>0)|0)|0))&c>>>0<(t=s[i+56>>2])>>>0|e>>>0<A>>>0||(e=l+A|0,e=(c=t+a|0)>>>0<t>>>0?e+1|0:e,s[r+16>>2]=c,s[r+20>>2]=e,(0|(e=t))<=0)))){r=a+s[r>>2]|0,s[i+40>>2]=r;i:if((c=d[0|(a=r+(t=e-1|0)|0)])>>>0<=63)s[i+44>>2]=t,e=63&d[0|a];else{o:switch((c>>>6|0)-1|0){case 0:if(e>>>0<2)break n;t=e-2|0,s[i+44>>2]=t,e=d[1+(e=(e+r|0)-2|0)|0]<<8&16128|d[0|e];break i;case 1:if(e>>>0<3)break n;t=e-3|0,s[i+44>>2]=t,e=d[2+(e=(e+r|0)-3|0)|0]<<16&4128768|d[e+1|0]<<8|d[0|e];break i}t=e-4|0,s[i+44>>2]=t,e=d[2+(e=(e+r|0)-4|0)|0]<<16|d[e+3|0]<<24&1056964608|d[e+1|0]<<8|d[0|e]}if(a=e+131072|0,s[i+48>>2]=a,!(a>>>0>33554431))if(v)for(c=s[i+28>>2],e=0,A=s[i+16>>2];;){i:if(!(a>>>0>131071))for(;;){if((0|t)<=0)break i;if(t=t-1|0,s[i+44>>2]=t,a=d[t+r|0]|a<<8,s[i+48>>2]=a,!(a>>>0<131072))break}if(l=s[A+((m=32767&a)<<2)>>2],a=(h(s[(p=c+(l<<3)|0)>>2],a>>>15|0)+m|0)-s[p+4>>2]|0,s[i+48>>2]=a,s[(e<<2)+n>>2]=l,m=1,(0|v)==(0|(e=e+1|0)))break}else m=1}(e=s[i+28>>2])&&(s[i+32>>2]=e,ee(e)),(e=s[i+16>>2])&&(s[i+20>>2]=e,ee(e)),(e=s[i>>2])&&(s[i+4>>2]=e,ee(e)),N=i- -64|0,t=m;break t;case 10:v=e,N=i=N+-64|0,s[i+48>>2]=0,s[i+40>>2]=0,s[i+44>>2]=0,s[i+32>>2]=0,s[i+36>>2]=0,s[i+24>>2]=0,s[i+28>>2]=0,s[i+16>>2]=0,s[i+20>>2]=0,s[i+8>>2]=0,s[i+12>>2]=0,s[i>>2]=0,s[i+4>>2]=0;n:{i:if(f[r+38>>1]&&Tt(1,i+12|0,r)){if(p=s[i+12>>2],t=s[i>>2],p>>>0>(e=s[i+4>>2]-t>>2)>>>0?(ct(i,p-e|0),p=s[i+12>>2]):e>>>0<=p>>>0||(s[i+4>>2]=t+(p<<2)),e=1,!p)break n;for(y=s[r+8>>2],_=s[r+12>>2],x=s[i>>2],a=0;;){if(e=0,(0|_)<=(0|(c=s[r+20>>2]))&y>>>0<=(t=s[r+16>>2])>>>0|(0|c)>(0|_))break n;k=s[r>>2],g=d[k+t|0],c=(e=t+1|0)?c:c+1|0,b=e,s[r+16>>2]=e,e=c,s[r+20>>2]=e,t=g>>>2|0,l=0;o:{a:{s:{c:switch(0|(T=3&g)){case 0:break a;case 3:break c;default:break s}if(e=0,(t=t+a|0)>>>0>=p>>>0)break n;We(x+(a<<2)|0,0,4+(252&g)|0),a=t;break o}for(;;){if((0|e)>=(0|_)&b>>>0>=y>>>0|(0|e)>(0|_))break i;if(p=d[b+k|0],c=e,c=(e=b+1|0)?c:c+1|0,b=e,s[r+16>>2]=e,e=c,s[r+20>>2]=e,t|=p<<(l<<3|6),(0|T)==(0|(l=l+1|0)))break}}s[x+(a<<2)>>2]=t}if(!((a=a+1|0)>>>0<(p=s[i+12>>2])>>>0))break}if(_=i+16|0,y=s[i>>2],e=s[i+16>>2],(a=(t=s[i+20>>2]-e|0)>>2)>>>0<=65535?ct(_,65536-a|0):262144!=(0|t)&&(s[i+20>>2]=e+262144),a=s[(e=i+28|0)>>2],(t=s[i+32>>2]-a>>3)>>>0<p>>>0)lt(e,p-t|0),a=s[e>>2];else if(t>>>0>p>>>0&&(s[i+32>>2]=(p<<3)+a),!p)break i;for(l=0,e=0;;){if(b=s[(c=y+(l<<2)|0)>>2],t=e,s[4+(g=(l<<3)+a|0)>>2]=e,s[g>>2]=b,(e=(c=s[c>>2])+e|0)>>>0>65536)break i;if(!(e>>>0<=t>>>0)){if(g=s[_>>2],b=0,x=7&c)for(;s[g+(t<<2)>>2]=l,t=t+1|0,(0|x)!=(0|(b=b+1|0)););if(!(c-1>>>0<=6))for(;s[(c=g+(t<<2)|0)>>2]=l,s[c+28>>2]=l,s[c+24>>2]=l,s[c+20>>2]=l,s[c+16>>2]=l,s[c+12>>2]=l,s[c+8>>2]=l,s[c+4>>2]=l,(0|(t=t+8|0))!=(0|e););}if((0|p)==(0|(l=l+1|0)))break}A=65536==(0|e)}e=A}n:if(!(!e|(s[i+12>>2]?0:v))&&ht(1,i+56|0,r)&&(a=(e=s[r+8>>2])-(t=s[r+16>>2])|0,c=s[i+60>>2],A=s[r+20>>2],!((0|c)==(0|(l=s[r+12>>2]-(A+(e>>>0<t>>>0)|0)|0))&a>>>0<(e=s[i+56>>2])>>>0|c>>>0>l>>>0||(c=c+A|0,c=(a=e+t|0)>>>0<e>>>0?c+1|0:c,s[r+16>>2]=a,s[r+20>>2]=c,(0|e)<=0)))){r=t+s[r>>2]|0,s[i+40>>2]=r;i:if((c=d[0|(a=r+(t=e-1|0)|0)])>>>0<=63)s[i+44>>2]=t,e=63&d[0|a];else{o:switch((c>>>6|0)-1|0){case 0:if(e>>>0<2)break n;t=e-2|0,s[i+44>>2]=t,e=d[1+(e=(e+r|0)-2|0)|0]<<8&16128|d[0|e];break i;case 1:if(e>>>0<3)break n;t=e-3|0,s[i+44>>2]=t,e=d[2+(e=(e+r|0)-3|0)|0]<<16&4128768|d[e+1|0]<<8|d[0|e];break i}t=e-4|0,s[i+44>>2]=t,e=d[2+(e=(e+r|0)-4|0)|0]<<16|d[e+3|0]<<24&1056964608|d[e+1|0]<<8|d[0|e]}if(a=e+262144|0,s[i+48>>2]=a,!(a>>>0>67108863))if(v)for(c=s[i+28>>2],e=0,A=s[i+16>>2];;){i:if(!(a>>>0>262143))for(;;){if((0|t)<=0)break i;if(t=t-1|0,s[i+44>>2]=t,a=d[t+r|0]|a<<8,s[i+48>>2]=a,!(a>>>0<262144))break}if(l=s[A+((m=65535&a)<<2)>>2],a=(h(s[(p=c+(l<<3)|0)>>2],a>>>16|0)+m|0)-s[p+4>>2]|0,s[i+48>>2]=a,s[(e<<2)+n>>2]=l,m=1,(0|v)==(0|(e=e+1|0)))break}else m=1}(e=s[i+28>>2])&&(s[i+32>>2]=e,ee(e)),(e=s[i+16>>2])&&(s[i+20>>2]=e,ee(e)),(e=s[i>>2])&&(s[i+4>>2]=e,ee(e)),N=i- -64|0,t=m;break t;case 11:v=e,N=i=N+-64|0,s[i+48>>2]=0,s[i+40>>2]=0,s[i+44>>2]=0,s[i+32>>2]=0,s[i+36>>2]=0,s[i+24>>2]=0,s[i+28>>2]=0,s[i+16>>2]=0,s[i+20>>2]=0,s[i+8>>2]=0,s[i+12>>2]=0,s[i>>2]=0,s[i+4>>2]=0;n:{i:if(f[r+38>>1]&&Tt(1,i+12|0,r)){if(p=s[i+12>>2],t=s[i>>2],p>>>0>(e=s[i+4>>2]-t>>2)>>>0?(ct(i,p-e|0),p=s[i+12>>2]):e>>>0<=p>>>0||(s[i+4>>2]=t+(p<<2)),e=1,!p)break n;for(y=s[r+8>>2],_=s[r+12>>2],x=s[i>>2],a=0;;){if(e=0,(0|_)<=(0|(c=s[r+20>>2]))&y>>>0<=(t=s[r+16>>2])>>>0|(0|c)>(0|_))break n;k=s[r>>2],g=d[k+t|0],c=(e=t+1|0)?c:c+1|0,b=e,s[r+16>>2]=e,e=c,s[r+20>>2]=e,t=g>>>2|0,l=0;o:{a:{s:{c:switch(0|(c=3&g)){case 0:break a;case 3:break c;default:break s}if(e=0,(t=t+a|0)>>>0>=p>>>0)break n;We(x+(a<<2)|0,0,4+(252&g)|0),a=t;break o}for(;;){if((0|e)>=(0|_)&b>>>0>=y>>>0|(0|e)>(0|_))break i;if(p=d[b+k|0],e=(b=b+1|0)?e:e+1|0,s[r+16>>2]=b,s[r+20>>2]=e,t|=p<<(l<<3|6),(0|c)==(0|(l=l+1|0)))break}}s[x+(a<<2)>>2]=t}if(!((a=a+1|0)>>>0<(p=s[i+12>>2])>>>0))break}if(_=i+16|0,y=s[i>>2],e=s[i+16>>2],(a=(t=s[i+20>>2]-e|0)>>2)>>>0<=262143?ct(_,262144-a|0):1048576!=(0|t)&&(s[i+20>>2]=e- -1048576),a=s[(e=i+28|0)>>2],(t=s[i+32>>2]-a>>3)>>>0<p>>>0)lt(e,p-t|0),a=s[e>>2];else if(t>>>0>p>>>0&&(s[i+32>>2]=(p<<3)+a),!p)break i;for(l=0,e=0;;){if(b=s[(c=y+(l<<2)|0)>>2],t=e,s[4+(g=(l<<3)+a|0)>>2]=e,s[g>>2]=b,(e=(c=s[c>>2])+e|0)>>>0>262144)break i;if(!(e>>>0<=t>>>0)){if(g=s[_>>2],b=0,x=7&c)for(;s[g+(t<<2)>>2]=l,t=t+1|0,(0|x)!=(0|(b=b+1|0)););if(!(c-1>>>0<=6))for(;s[(c=g+(t<<2)|0)>>2]=l,s[c+28>>2]=l,s[c+24>>2]=l,s[c+20>>2]=l,s[c+16>>2]=l,s[c+12>>2]=l,s[c+8>>2]=l,s[c+4>>2]=l,(0|(t=t+8|0))!=(0|e););}if((0|p)==(0|(l=l+1|0)))break}A=262144==(0|e)}e=A}n:if(!(!e|(s[i+12>>2]?0:v))&&ht(1,i+56|0,r)&&(a=(e=s[r+8>>2])-(t=s[r+16>>2])|0,c=s[i+60>>2],A=s[r+20>>2],!((0|c)==(0|(l=s[r+12>>2]-(A+(e>>>0<t>>>0)|0)|0))&a>>>0<(e=s[i+56>>2])>>>0|c>>>0>l>>>0||(c=c+A|0,c=(a=e+t|0)>>>0<e>>>0?c+1|0:c,s[r+16>>2]=a,s[r+20>>2]=c,(0|e)<=0)))){r=t+s[r>>2]|0,s[i+40>>2]=r;i:if((c=d[0|(a=r+(t=e-1|0)|0)])>>>0<=63)s[i+44>>2]=t,e=63&d[0|a];else{o:switch((c>>>6|0)-1|0){case 0:if(e>>>0<2)break n;t=e-2|0,s[i+44>>2]=t,e=d[1+(e=(e+r|0)-2|0)|0]<<8&16128|d[0|e];break i;case 1:if(e>>>0<3)break n;t=e-3|0,s[i+44>>2]=t,e=d[2+(e=(e+r|0)-3|0)|0]<<16&4128768|d[e+1|0]<<8|d[0|e];break i}t=e-4|0,s[i+44>>2]=t,e=d[2+(e=(e+r|0)-4|0)|0]<<16|d[e+3|0]<<24&1056964608|d[e+1|0]<<8|d[0|e]}if(a=e- -1048576|0,s[i+48>>2]=a,!(a>>>0>268435455))if(v)for(c=s[i+28>>2],e=0,A=s[i+16>>2];;){i:if(!(a>>>0>1048575))for(;;){if((0|t)<=0)break i;if(t=t-1|0,s[i+44>>2]=t,a=d[t+r|0]|a<<8,s[i+48>>2]=a,!(a>>>0<1048576))break}if(l=s[A+((m=262143&a)<<2)>>2],a=(h(s[(p=c+(l<<3)|0)>>2],a>>>18|0)+m|0)-s[p+4>>2]|0,s[i+48>>2]=a,s[(e<<2)+n>>2]=l,m=1,(0|v)==(0|(e=e+1|0)))break}else m=1}(e=s[i+28>>2])&&(s[i+32>>2]=e,ee(e)),(e=s[i+16>>2])&&(s[i+20>>2]=e,ee(e)),(e=s[i>>2])&&(s[i+4>>2]=e,ee(e)),N=i- -64|0,t=m;break t;case 12:v=e,N=i=N+-64|0,s[i+48>>2]=0,s[i+40>>2]=0,s[i+44>>2]=0,s[i+32>>2]=0,s[i+36>>2]=0,s[i+24>>2]=0,s[i+28>>2]=0,s[i+16>>2]=0,s[i+20>>2]=0,s[i+8>>2]=0,s[i+12>>2]=0,s[i>>2]=0,s[i+4>>2]=0;n:{i:if(f[r+38>>1]&&Tt(1,i+12|0,r)){if(p=s[i+12>>2],t=s[i>>2],p>>>0>(e=s[i+4>>2]-t>>2)>>>0?(ct(i,p-e|0),p=s[i+12>>2]):e>>>0<=p>>>0||(s[i+4>>2]=t+(p<<2)),e=1,!p)break n;for(g=s[r+8>>2],_=s[r+12>>2],y=s[i>>2],a=0;;){if(e=0,(0|_)<=(0|(t=s[r+20>>2]))&g>>>0<=(l=s[r+16>>2])>>>0|(0|t)>(0|_))break n;x=s[r>>2],c=d[x+l|0],e=t,e=(t=l+1|0)?e:e+1|0,b=t,s[r+16>>2]=t,s[r+20>>2]=e,t=c>>>2|0,l=0;o:{a:{s:{c:switch(0|(k=3&c)){case 0:break a;case 3:break c;default:break s}if(e=0,(t=t+a|0)>>>0>=p>>>0)break n;We(y+(a<<2)|0,0,4+(252&c)|0),a=t;break o}for(;;){if((0|e)>=(0|_)&b>>>0>=g>>>0|(0|e)>(0|_))break i;if(p=d[b+x|0],c=e,c=(e=b+1|0)?c:c+1|0,b=e,s[r+16>>2]=e,e=c,s[r+20>>2]=e,t|=p<<(l<<3|6),(0|k)==(0|(l=l+1|0)))break}}s[y+(a<<2)>>2]=t}if(!((a=a+1|0)>>>0<(p=s[i+12>>2])>>>0))break}if(_=i+16|0,y=s[i>>2],e=s[i+16>>2],(a=(t=s[i+20>>2]-e|0)>>2)>>>0<=524287?ct(_,524288-a|0):2097152!=(0|t)&&(s[i+20>>2]=e+2097152),a=s[(e=i+28|0)>>2],(t=s[i+32>>2]-a>>3)>>>0<p>>>0)lt(e,p-t|0),a=s[e>>2];else if(t>>>0>p>>>0&&(s[i+32>>2]=(p<<3)+a),!p)break i;for(l=0,e=0;;){if(b=s[(c=y+(l<<2)|0)>>2],t=e,s[4+(g=(l<<3)+a|0)>>2]=e,s[g>>2]=b,(e=(c=s[c>>2])+e|0)>>>0>524288)break i;if(!(e>>>0<=t>>>0)){if(g=s[_>>2],b=0,x=7&c)for(;s[g+(t<<2)>>2]=l,t=t+1|0,(0|x)!=(0|(b=b+1|0)););if(!(c-1>>>0<=6))for(;s[(c=g+(t<<2)|0)>>2]=l,s[c+28>>2]=l,s[c+24>>2]=l,s[c+20>>2]=l,s[c+16>>2]=l,s[c+12>>2]=l,s[c+8>>2]=l,s[c+4>>2]=l,(0|(t=t+8|0))!=(0|e););}if((0|p)==(0|(l=l+1|0)))break}A=524288==(0|e)}e=A}n:if(!(!e|(s[i+12>>2]?0:v))&&ht(1,i+56|0,r)&&(c=(e=s[r+8>>2])-(t=a=s[r+16>>2])|0,A=s[i+60>>2],l=s[r+20>>2],!((0|A)==(0|(e=s[r+12>>2]-(l+(e>>>0<t>>>0)|0)|0))&c>>>0<(t=s[i+56>>2])>>>0|e>>>0<A>>>0||(e=l+A|0,e=(c=t+a|0)>>>0<t>>>0?e+1|0:e,s[r+16>>2]=c,s[r+20>>2]=e,(0|(e=t))<=0)))){r=a+s[r>>2]|0,s[i+40>>2]=r;i:if((c=d[0|(a=r+(t=e-1|0)|0)])>>>0<=63)s[i+44>>2]=t,e=63&d[0|a];else{o:switch((c>>>6|0)-1|0){case 0:if(e>>>0<2)break n;t=e-2|0,s[i+44>>2]=t,e=d[1+(e=(e+r|0)-2|0)|0]<<8&16128|d[0|e];break i;case 1:if(e>>>0<3)break n;t=e-3|0,s[i+44>>2]=t,e=d[2+(e=(e+r|0)-3|0)|0]<<16&4128768|d[e+1|0]<<8|d[0|e];break i}t=e-4|0,s[i+44>>2]=t,e=d[2+(e=(e+r|0)-4|0)|0]<<16|d[e+3|0]<<24&1056964608|d[e+1|0]<<8|d[0|e]}if(a=e+2097152|0,s[i+48>>2]=a,!(a>>>0>536870911))if(v)for(c=s[i+28>>2],e=0,A=s[i+16>>2];;){i:if(!(a>>>0>2097151))for(;;){if((0|t)<=0)break i;if(t=t-1|0,s[i+44>>2]=t,a=d[t+r|0]|a<<8,s[i+48>>2]=a,!(a>>>0<2097152))break}if(l=s[A+((m=524287&a)<<2)>>2],a=(h(s[(p=c+(l<<3)|0)>>2],a>>>19|0)+m|0)-s[p+4>>2]|0,s[i+48>>2]=a,s[(e<<2)+n>>2]=l,m=1,(0|v)==(0|(e=e+1|0)))break}else m=1}(e=s[i+28>>2])&&(s[i+32>>2]=e,ee(e)),(e=s[i+16>>2])&&(s[i+20>>2]=e,ee(e)),(e=s[i>>2])&&(s[i+4>>2]=e,ee(e)),N=i- -64|0,t=m;break t;case 17:t=X(e,r,n);break t;case 0:case 1:case 2:case 3:case 5:case 6:case 7:a=0,N=m=N+-64|0,s[m+48>>2]=0,s[m+40>>2]=0,s[m+44>>2]=0,s[m+32>>2]=0,s[m+36>>2]=0,s[m+24>>2]=0,s[m+28>>2]=0,s[m+16>>2]=0,s[m+20>>2]=0,s[m+8>>2]=0,s[m+12>>2]=0,s[m>>2]=0,s[m+4>>2]=0;n:if(!(!ce(m,r)|(s[m+12>>2]?0:e))&&ht(1,m+56|0,r)&&(i=(t=s[r+8>>2])-(c=A=s[r+16>>2])|0,v=s[m+60>>2],l=s[r+20>>2],!((0|v)==(0|(c=s[r+12>>2]-(l+(t>>>0<c>>>0)|0)|0))&i>>>0<(t=s[m+56>>2])>>>0|c>>>0<v>>>0||(c=l+v|0,c=(i=t+A|0)>>>0<t>>>0?c+1|0:c,s[r+16>>2]=i,s[r+20>>2]=c,(0|t)<=0)))){c=A+s[r>>2]|0,s[m+40>>2]=c;i:if((i=d[0|(A=c+(r=t-1|0)|0)])>>>0<=63)s[m+44>>2]=r,t=63&d[0|A];else{o:switch((i>>>6|0)-1|0){case 0:if(t>>>0<2)break n;r=t-2|0,s[m+44>>2]=r,t=d[1+(t=(t+c|0)-2|0)|0]<<8&16128|d[0|t];break i;case 1:if(t>>>0<3)break n;r=t-3|0,s[m+44>>2]=r,t=d[2+(t=(t+c|0)-3|0)|0]<<16&4128768|d[t+1|0]<<8|d[0|t];break i}r=t-4|0,s[m+44>>2]=r,t=d[2+(t=(t+c|0)-4|0)|0]<<16|d[t+3|0]<<24&1056964608|d[t+1|0]<<8|d[0|t]}if(l=t+16384|0,s[m+48>>2]=l,!(l>>>0>4194303))if(e)for(t=s[m+28>>2],A=s[m+16>>2];;){i:if(!(l>>>0>16383))for(;;){if((0|r)<=0)break i;if(r=r-1|0,s[m+44>>2]=r,l=d[r+c|0]|l<<8,s[m+48>>2]=l,!(l>>>0<16384))break}if(i=s[A+((a=4095&l)<<2)>>2],l=(h(s[(v=t+(i<<3)|0)>>2],l>>>12|0)+a|0)-s[v+4>>2]|0,s[m+48>>2]=l,s[(b<<2)+n>>2]=i,a=1,(0|(b=b+1|0))==(0|e))break}else a=1}(e=s[m+28>>2])&&(s[m+32>>2]=e,ee(e)),(e=s[m+16>>2])&&(s[m+20>>2]=e,ee(e)),(e=s[m>>2])&&(s[m+4>>2]=e,ee(e)),N=m- -64|0,t=a;break t;case 13:case 14:case 15:case 16:break r;default:break t}t=X(e,r,n)}a=t}return a}function P(e){var t,r=0,n=0,i=0,o=0,a=0,c=0,l=0,f=0,p=0,m=0,h=0,b=0;N=t=N-16|0;e:{t:{r:{n:{i:{o:{a:{s:{c:{l:{d:{if((e|=0)>>>0<=244){if(3&(r=(o=s[2881])>>>(n=(l=e>>>0<11?16:e+11&-8)>>>3|0)|0)){e=(a=s[11572+(r=(i=n+(1&(-1^r))|0)<<3)>>2])+8|0,(0|(n=s[a+8>>2]))!=(0|(r=r+11564|0))?(s[n+12>>2]=r,s[r+8>>2]=n):(h=11524,b=Mr(i)&o,s[h>>2]=b),r=i<<3,s[a+4>>2]=3|r,s[4+(r=r+a|0)>>2]=1|s[r+4>>2];break e}if((m=s[2883])>>>0>=l>>>0)break d;if(r){n=e=(r=(0-(e=(0-(e=2<<n)|e)&r<<n)&e)-1|0)>>>12&16,n|=e=(r=r>>>e|0)>>>5&8,n|=e=(r=r>>>e|0)>>>2&4,c=s[11572+(e=(n=((n|=e=(r=r>>>e|0)>>>1&2)|(e=(r=r>>>e|0)>>>1&1))+(r>>>e|0)|0)<<3)>>2],(0|(r=s[c+8>>2]))!=(0|(e=e+11564|0))?(s[r+12>>2]=e,s[e+8>>2]=r):(o=Mr(n)&o,s[2881]=o),e=c+8|0,s[c+4>>2]=3|l,a=(r=n<<3)-l|0,s[4+(i=c+l|0)>>2]=1|a,s[r+c>>2]=a,m&&(n=11564+((r=m>>>3|0)<<3)|0,c=s[2886],(r=1<<r)&o?r=s[n+8>>2]:(s[2881]=r|o,r=n),s[n+8>>2]=c,s[r+12>>2]=c,s[c+12>>2]=n,s[c+8>>2]=r),s[2886]=i,s[2883]=a;break e}if(!(p=s[2882]))break d;for(n=e=(r=(p&0-p)-1|0)>>>12&16,n|=e=(r=r>>>e|0)>>>5&8,n|=e=(r=r>>>e|0)>>>2&4,r=s[11828+(((n|=e=(r=r>>>e|0)>>>1&2)|(e=(r=r>>>e|0)>>>1&1))+(r>>>e|0)<<2)>>2],i=(-8&s[r+4>>2])-l|0,n=r;(e=s[n+16>>2])||(e=s[n+20>>2]);)i=(a=(n=(-8&s[e+4>>2])-l|0)>>>0<i>>>0)?n:i,r=a?e:r,n=e;if(f=s[r+24>>2],(0|(a=s[r+12>>2]))!=(0|r)){e=s[r+8>>2],s[e+12>>2]=a,s[a+8>>2]=e;break t}if(!(e=s[(n=r+20|0)>>2])){if(!(e=s[r+16>>2]))break l;n=r+16|0}for(;c=n,a=e,(e=s[(n=e+20|0)>>2])||(n=a+16|0,e=s[a+16>>2]););s[c>>2]=0;break t}if(l=-1,!(e>>>0>4294967231)&&(l=-8&(e=e+11|0),p=s[2882])){i=0-l|0,o=0,l>>>0<256||(o=31,l>>>0>16777215||(e=e>>>8|0,e<<=c=e+1048320>>>16&8,o=28+((e=((e<<=n=e+520192>>>16&4)<<(r=e+245760>>>16&2)>>>15|0)-(r|n|c)|0)<<1|l>>>e+21&1)|0));f:{u:{if(n=s[11828+(o<<2)>>2])for(e=0,r=l<<(31==(0|o)?0:25-(o>>>1|0)|0);;){if(!((c=(-8&s[n+4>>2])-l|0)>>>0>=i>>>0||(a=n,i=c))){i=0,e=n;break u}if(c=s[n+20>>2],n=s[16+((r>>>29&4)+n|0)>>2],e=c?(0|c)==(0|n)?e:c:e,r<<=1,!n)break}else e=0;if(!(e|a)){if(a=0,!(e=(0-(e=2<<o)|e)&p))break d;n=e=(r=(e&0-e)-1|0)>>>12&16,n|=e=(r=r>>>e|0)>>>5&8,n|=e=(r=r>>>e|0)>>>2&4,e=s[11828+(((n|=e=(r=r>>>e|0)>>>1&2)|(e=(r=r>>>e|0)>>>1&1))+(r>>>e|0)<<2)>>2]}if(!e)break f}for(;i=(n=(r=(-8&s[e+4>>2])-l|0)>>>0<i>>>0)?r:i,a=n?e:a,e=(r=s[e+16>>2])||s[e+20>>2];);}if(!(!a|s[2883]-l>>>0<=i>>>0)){if(o=s[a+24>>2],(0|a)!=(0|(r=s[a+12>>2]))){e=s[a+8>>2],s[e+12>>2]=r,s[r+8>>2]=e;break r}if(!(e=s[(n=a+20|0)>>2])){if(!(e=s[a+16>>2]))break c;n=a+16|0}for(;c=n,r=e,(e=s[(n=e+20|0)>>2])||(n=r+16|0,e=s[r+16>>2]););s[c>>2]=0;break r}}}if((n=s[2883])>>>0>=l>>>0){i=s[2886],(r=n-l|0)>>>0>=16?(s[2883]=r,e=i+l|0,s[2886]=e,s[e+4>>2]=1|r,s[n+i>>2]=r,s[i+4>>2]=3|l):(s[2886]=0,s[2883]=0,s[i+4>>2]=3|n,s[4+(e=n+i|0)>>2]=1|s[e+4>>2]),e=i+8|0;break e}if((f=s[2884])>>>0>l>>>0){r=f-l|0,s[2884]=r,e=(n=s[2887])+l|0,s[2887]=e,s[e+4>>2]=1|r,s[n+4>>2]=3|l,e=n+8|0;break e}if(e=0,p=l+47|0,s[2999]?n=s[3001]:(s[3002]=-1,s[3003]=-1,s[3e3]=4096,s[3001]=4096,s[2999]=t+12&-16^1431655768,s[3004]=0,s[2992]=0,n=4096),(n=(c=p+n|0)&(a=0-n|0))>>>0<=l>>>0)break e;if((i=s[2991])&&i>>>0<(o=(r=s[2989])+n|0)>>>0|r>>>0>=o>>>0)break e;if(4&d[11968])break o;d:{f:{if(i=s[2887])for(e=11972;;){if((r=s[e>>2])>>>0<=i>>>0&i>>>0<r+s[e+4>>2]>>>0)break f;if(!(e=s[e+8>>2]))break}if(-1==(0|(r=er(0))))break a;if(o=n,(e=(i=s[3e3])-1|0)&r&&(o=(n-r|0)+(e+r&0-i)|0),o>>>0<=l>>>0|o>>>0>2147483646)break a;if((i=s[2991])&&i>>>0<(a=(e=s[2989])+o|0)>>>0|e>>>0>=a>>>0)break a;if((0|r)!=(0|(e=er(o))))break d;break i}if((o=a&c-f)>>>0>2147483646)break a;if((0|(r=er(o)))==(s[e>>2]+s[e+4>>2]|0))break s;e=r}if(!(-1==(0|e)|l+48>>>0<=o>>>0)){if((r=(r=s[3001])+(p-o|0)&0-r)>>>0>2147483646){r=e;break i}if(-1!=(0|er(r))){o=r+o|0,r=e;break i}er(0-o|0);break a}if(r=e,-1!=(0|e))break i;break a}a=0;break t}r=0;break r}if(-1!=(0|r))break i}s[2992]=4|s[2992]}if(n>>>0>2147483646)break n;if(-1==(0|(r=er(n)))|-1==(0|(e=er(0)))|e>>>0<=r>>>0)break n;if((o=e-r|0)>>>0<=l+40>>>0)break n}e=s[2989]+o|0,s[2989]=e,e>>>0>u[2990]&&(s[2990]=e);i:{o:{a:{if(c=s[2887]){for(e=11972;;){if(((i=s[e>>2])+(n=s[e+4>>2])|0)==(0|r))break a;if(!(e=s[e+8>>2]))break}break o}for((e=s[2885])>>>0<=r>>>0&&e||(s[2885]=r),e=0,s[2994]=o,s[2993]=r,s[2889]=-1,s[2890]=s[2999],s[2996]=0;n=11564+(i=e<<3)|0,s[i+11572>>2]=n,s[i+11576>>2]=n,32!=(0|(e=e+1|0)););n=(i=o-40|0)-(e=r+8&7?-8-r&7:0)|0,s[2884]=n,e=e+r|0,s[2887]=e,s[e+4>>2]=1|n,s[4+(r+i|0)>>2]=40,s[2888]=s[3003];break i}if(!(8&d[e+12|0]|i>>>0>c>>>0|r>>>0<=c>>>0)){s[e+4>>2]=n+o,n=(e=c+8&7?-8-c&7:0)+c|0,s[2887]=n,e=(r=s[2884]+o|0)-e|0,s[2884]=e,s[n+4>>2]=1|e,s[4+(r+c|0)>>2]=40,s[2888]=s[3003];break i}}u[2885]>r>>>0&&(s[2885]=r),n=r+o|0,e=11972;o:{a:{s:{c:{l:{d:{for(;;){if((0|n)!=s[e>>2]){if(e=s[e+8>>2])continue;break d}break}if(!(8&d[e+12|0]))break l}for(e=11972;;){if((n=s[e>>2])>>>0<=c>>>0&&(a=n+s[e+4>>2]|0)>>>0>c>>>0)break c;e=s[e+8>>2]}}if(s[e>>2]=r,s[e+4>>2]=s[e+4>>2]+o,s[4+(p=(r+8&7?-8-r&7:0)+r|0)>>2]=3|l,n=(o=n+(n+8&7?-8-n&7:0)|0)-(f=l+p|0)|0,(0|o)==(0|c)){s[2887]=f,e=s[2884]+n|0,s[2884]=e,s[f+4>>2]=1|e;break a}if(s[2886]==(0|o)){s[2886]=f,e=s[2883]+n|0,s[2883]=e,s[f+4>>2]=1|e,s[e+f>>2]=e;break a}if(1==(3&(e=s[o+4>>2]))){c=-8&e;l:if(e>>>0<=255){if(i=s[o+8>>2],e=e>>>3|0,(0|(r=s[o+12>>2]))==(0|i)){h=11524,b=s[2881]&Mr(e),s[h>>2]=b;break l}s[i+12>>2]=r,s[r+8>>2]=i}else{if(l=s[o+24>>2],(0|o)==(0|(r=s[o+12>>2])))if((i=s[(e=o+20|0)>>2])||(i=s[(e=o+16|0)>>2])){for(;a=e,(i=s[(e=(r=i)+20|0)>>2])||(e=r+16|0,i=s[r+16>>2]););s[a>>2]=0}else r=0;else e=s[o+8>>2],s[e+12>>2]=r,s[r+8>>2]=e;if(l){i=s[o+28>>2];d:{if(s[(e=11828+(i<<2)|0)>>2]==(0|o)){if(s[e>>2]=r,r)break d;h=11528,b=s[2882]&Mr(i),s[h>>2]=b;break l}if(s[l+(s[l+16>>2]==(0|o)?16:20)>>2]=r,!r)break l}s[r+24>>2]=l,(e=s[o+16>>2])&&(s[r+16>>2]=e,s[e+24>>2]=r),(e=s[o+20>>2])&&(s[r+20>>2]=e,s[e+24>>2]=r)}}o=o+c|0,n=n+c|0}if(s[o+4>>2]=-2&s[o+4>>2],s[f+4>>2]=1|n,s[n+f>>2]=n,n>>>0<=255){r=11564+((e=n>>>3|0)<<3)|0,(n=s[2881])&(e=1<<e)?e=s[r+8>>2]:(s[2881]=e|n,e=r),s[r+8>>2]=f,s[e+12>>2]=f,s[f+12>>2]=r,s[f+8>>2]=e;break a}if(e=31,n>>>0<=16777215&&(e=n>>>8|0,e<<=a=e+1048320>>>16&8,e=28+((e=((e<<=i=e+520192>>>16&4)<<(r=e+245760>>>16&2)>>>15|0)-(r|i|a)|0)<<1|n>>>e+21&1)|0),s[f+28>>2]=e,s[f+16>>2]=0,s[f+20>>2]=0,a=11828+(e<<2)|0,(i=s[2882])&(r=1<<e)){for(e=n<<(31==(0|e)?0:25-(e>>>1|0)|0),r=s[a>>2];;){if(i=r,(-8&s[r+4>>2])==(0|n))break s;if(r=e>>>29|0,e<<=1,!(r=s[16+(a=i+(4&r)|0)>>2]))break}s[a+16>>2]=f,s[f+24>>2]=i}else s[2882]=r|i,s[a>>2]=f,s[f+24>>2]=a;s[f+12>>2]=f,s[f+8>>2]=f;break a}for(n=(i=o-40|0)-(e=r+8&7?-8-r&7:0)|0,s[2884]=n,e=e+r|0,s[2887]=e,s[e+4>>2]=1|n,s[4+(r+i|0)>>2]=40,s[2888]=s[3003],s[(n=(e=(a+(a-39&7?39-a&7:0)|0)-47|0)>>>0<c+16>>>0?c:e)+4>>2]=27,e=s[2996],s[n+16>>2]=s[2995],s[n+20>>2]=e,e=s[2994],s[n+8>>2]=s[2993],s[n+12>>2]=e,s[2995]=n+8,s[2994]=o,s[2993]=r,s[2996]=0,e=n+24|0;s[e+4>>2]=7,r=e+8|0,e=e+4|0,r>>>0<a>>>0;);if((0|n)==(0|c))break i;if(s[n+4>>2]=-2&s[n+4>>2],a=n-c|0,s[c+4>>2]=1|a,s[n>>2]=a,a>>>0<=255){r=11564+((e=a>>>3|0)<<3)|0,(n=s[2881])&(e=1<<e)?e=s[r+8>>2]:(s[2881]=e|n,e=r),s[r+8>>2]=c,s[e+12>>2]=c,s[c+12>>2]=r,s[c+8>>2]=e;break i}if(e=31,s[c+16>>2]=0,s[c+20>>2]=0,a>>>0<=16777215&&(e=a>>>8|0,e<<=i=e+1048320>>>16&8,e=28+((e=((e<<=n=e+520192>>>16&4)<<(r=e+245760>>>16&2)>>>15|0)-(r|n|i)|0)<<1|a>>>e+21&1)|0),s[c+28>>2]=e,i=11828+(e<<2)|0,(n=s[2882])&(r=1<<e)){for(e=a<<(31==(0|e)?0:25-(e>>>1|0)|0),r=s[i>>2];;){if(n=r,(0|a)==(-8&s[r+4>>2]))break o;if(r=e>>>29|0,e<<=1,!(r=s[16+(i=n+(4&r)|0)>>2]))break}s[i+16>>2]=c,s[c+24>>2]=n}else s[2882]=r|n,s[i>>2]=c,s[c+24>>2]=i;s[c+12>>2]=c,s[c+8>>2]=c;break i}e=s[i+8>>2],s[e+12>>2]=f,s[i+8>>2]=f,s[f+24>>2]=0,s[f+12>>2]=i,s[f+8>>2]=e}e=p+8|0;break e}e=s[n+8>>2],s[e+12>>2]=c,s[n+8>>2]=c,s[c+24>>2]=0,s[c+12>>2]=n,s[c+8>>2]=e}if(!((e=s[2884])>>>0<=l>>>0)){r=e-l|0,s[2884]=r,e=(n=s[2887])+l|0,s[2887]=e,s[e+4>>2]=1|r,s[n+4>>2]=3|l,e=n+8|0;break e}}s[2879]=48,e=0;break e}r:if(o){n=s[a+28>>2];n:{if(s[(e=11828+(n<<2)|0)>>2]==(0|a)){if(s[e>>2]=r,r)break n;p=Mr(n)&p,s[2882]=p;break r}if(s[o+(s[o+16>>2]==(0|a)?16:20)>>2]=r,!r)break r}s[r+24>>2]=o,(e=s[a+16>>2])&&(s[r+16>>2]=e,s[e+24>>2]=r),(e=s[a+20>>2])&&(s[r+20>>2]=e,s[e+24>>2]=r)}r:if(i>>>0<=15)e=i+l|0,s[a+4>>2]=3|e,s[4+(e=e+a|0)>>2]=1|s[e+4>>2];else if(s[a+4>>2]=3|l,s[4+(o=a+l|0)>>2]=1|i,s[i+o>>2]=i,i>>>0<=255)r=11564+((e=i>>>3|0)<<3)|0,(n=s[2881])&(e=1<<e)?e=s[r+8>>2]:(s[2881]=e|n,e=r),s[r+8>>2]=o,s[e+12>>2]=o,s[o+12>>2]=r,s[o+8>>2]=e;else{e=31,i>>>0<=16777215&&(e=i>>>8|0,e<<=c=e+1048320>>>16&8,e=28+((e=((e<<=n=e+520192>>>16&4)<<(r=e+245760>>>16&2)>>>15|0)-(r|n|c)|0)<<1|i>>>e+21&1)|0),s[o+28>>2]=e,s[o+16>>2]=0,s[o+20>>2]=0,r=11828+(e<<2)|0;n:{if((n=1<<e)&p){for(e=i<<(31==(0|e)?0:25-(e>>>1|0)|0),l=s[r>>2];;){if((-8&s[(r=l)+4>>2])==(0|i))break n;if(n=e>>>29|0,e<<=1,!(l=s[16+(n=(4&n)+r|0)>>2]))break}s[n+16>>2]=o}else s[2882]=n|p,s[r>>2]=o;s[o+24>>2]=r,s[o+12>>2]=o,s[o+8>>2]=o;break r}e=s[r+8>>2],s[e+12>>2]=o,s[r+8>>2]=o,s[o+24>>2]=0,s[o+12>>2]=r,s[o+8>>2]=e}e=a+8|0;break e}t:if(f){n=s[r+28>>2];r:{if(s[(e=11828+(n<<2)|0)>>2]==(0|r)){if(s[e>>2]=a,a)break r;h=11528,b=Mr(n)&p,s[h>>2]=b;break t}if(s[f+(s[f+16>>2]==(0|r)?16:20)>>2]=a,!a)break t}s[a+24>>2]=f,(e=s[r+16>>2])&&(s[a+16>>2]=e,s[e+24>>2]=a),(e=s[r+20>>2])&&(s[a+20>>2]=e,s[e+24>>2]=a)}i>>>0<=15?(e=i+l|0,s[r+4>>2]=3|e,s[4+(e=e+r|0)>>2]=1|s[e+4>>2]):(s[r+4>>2]=3|l,s[4+(a=r+l|0)>>2]=1|i,s[i+a>>2]=i,m&&(n=11564+((e=m>>>3|0)<<3)|0,c=s[2886],(e=1<<e)&o?e=s[n+8>>2]:(s[2881]=e|o,e=n),s[n+8>>2]=c,s[e+12>>2]=c,s[c+12>>2]=n,s[c+8>>2]=e),s[2886]=a,s[2883]=i),e=r+8|0}return N=t+16|0,0|e}function B(e,t,r,n){var i,c=0,l=0,f=0,p=0,m=0,h=0,b=0,v=0,g=0,A=0,_=0,x=0,y=0;if(N=i=N-80|0,c=s[r+36>>2],s[i+72>>2]=s[r+32>>2],s[i+76>>2]=c,l=s[r+28>>2],s[(c=i- -64|0)>>2]=s[r+24>>2],s[c+4>>2]=l,c=s[r+20>>2],s[i+56>>2]=s[r+16>>2],s[i+60>>2]=c,c=s[r+12>>2],s[i+48>>2]=s[r+8>>2],s[i+52>>2]=c,c=s[r+4>>2],s[i+40>>2]=s[r>>2],s[i+44>>2]=c,Y(e,i+40|0,i+24|0),!s[e>>2])if(b=e+4|0,o[e+15|0]<0&&ee(s[b>>2]),1==d[i+31|0]){N=p=N-16|0;e:{t:switch(d[i+32|0]){case 0:Kt(c=ur(48)),s[c>>2]=9896,s[i+8>>2]=0,s[i+12>>2]=0,s[i>>2]=0,s[i+4>>2]=0,s[i+16>>2]=c;break e;case 1:Kt(c=ur(52)),s[c+48>>2]=0,s[c>>2]=8204,s[i+8>>2]=0,s[i+12>>2]=0,s[i>>2]=0,s[i+4>>2]=0,s[i+16>>2]=c;break e}l=ur(32),c=d[1664]|d[1665]<<8|d[1666]<<16|d[1667]<<24,o[l+24|0]=c,o[l+25|0]=c>>>8,o[l+26|0]=c>>>16,o[l+27|0]=c>>>24,c=d[1660]|d[1661]<<8|d[1662]<<16|d[1663]<<24,f=d[1656]|d[1657]<<8|d[1658]<<16|d[1659]<<24,o[l+16|0]=f,o[l+17|0]=f>>>8,o[l+18|0]=f>>>16,o[l+19|0]=f>>>24,o[l+20|0]=c,o[l+21|0]=c>>>8,o[l+22|0]=c>>>16,o[l+23|0]=c>>>24,c=d[1652]|d[1653]<<8|d[1654]<<16|d[1655]<<24,f=d[1648]|d[1649]<<8|d[1650]<<16|d[1651]<<24,o[l+8|0]=f,o[l+9|0]=f>>>8,o[l+10|0]=f>>>16,o[l+11|0]=f>>>24,o[l+12|0]=c,o[l+13|0]=c>>>8,o[l+14|0]=c>>>16,o[l+15|0]=c>>>24,c=d[1644]|d[1645]<<8|d[1646]<<16|d[1647]<<24,f=d[1640]|d[1641]<<8|d[1642]<<16|d[1643]<<24,o[0|l]=f,o[l+1|0]=f>>>8,o[l+2|0]=f>>>16,o[l+3|0]=f>>>24,o[l+4|0]=c,o[l+5|0]=c>>>8,o[l+6|0]=c>>>16,o[l+7|0]=c>>>24,o[l+28|0]=0,s[p>>2]=-1,Ot(c=4|p,l,28),h=o[p+15|0],s[i>>2]=s[p>>2],f=i+4|0,(0|h)>=0?(h=s[c+4>>2],s[f>>2]=s[c>>2],s[f+4>>2]=h,s[f+8>>2]=s[c+8>>2]):Ot(f,s[p+4>>2],s[p+8>>2]),s[i+16>>2]=0,o[p+15|0]<0&&ee(s[p+4>>2]),ee(l)}N=p+16|0;e:if(c=s[i>>2]){if(s[e>>2]=c,o[i+15|0]>=0){t=s[4+(e=4|i)>>2],s[b>>2]=s[e>>2],s[b+4>>2]=t,s[b+8>>2]=s[e+8>>2];break e}Ot(b,s[i+4>>2],s[i+8>>2])}else{c=s[i+16>>2],s[i+16>>2]=0,s[c+44>>2]=n,N=p=N-32|0,s[c+32>>2]=r,s[c+40>>2]=t,s[c+4>>2]=n,Y(e,r,p+16|0);t:if(!s[e>>2])if(l=e+4|0,o[e+15|0]<0&&ee(s[l>>2]),t=d[p+23|0],(0|vn[s[s[c>>2]+8>>2]](c))==(0|t))if(r=d[p+21|0],o[c+36|0]=r,n=d[p+22|0],o[c+37|0]=n,2==(0|r))if((0|(t=t?2:3))==(0|n)){if(a[s[c+32>>2]+38>>1]=512|t,!(a[p+26>>1]>=0)){N=h=N-16|0,n=ur(36),s[(t=n)+4>>2]=0,s[t+8>>2]=0,s[t+24>>2]=0,s[t+28>>2]=0,s[(t=t+16|0)>>2]=0,s[t+4>>2]=0,s[n>>2]=n+4,s[n+32>>2]=0,s[n+12>>2]=t,s[h>>2]=0,r=s[c+32>>2],N=v=N-16|0,t=0;r:if(n&&(s[h>>2]=r,s[v+12>>2]=0,t=0,yt(1,v+12|0,r))){if(_=s[v+12>>2])for(;;){n:{if(yt(1,v+8|0,s[h>>2])){if(t=ur(28),s[t+4>>2]=0,s[t+8>>2]=0,s[(r=t+16|0)>>2]=0,s[r+4>>2]=0,s[t>>2]=t+4,s[t+12>>2]=r,s[t+24>>2]=s[v+8>>2],D(h,t))break n;rr(t+12|0,s[t+16>>2]),dr(t,s[t+4>>2]),ee(t)}t=0;break r}if(N=f=N-16|0,s[f+8>>2]=t,t){if((r=s[n+28>>2])>>>0<u[n+32>>2])s[f+8>>2]=0,s[r>>2]=t,s[n+28>>2]=r+4;else{r=0;n:{i:{o:{if(m=s[n+24>>2],(t=1+(A=s[n+28>>2]-m>>2)|0)>>>0<1073741824){if(g=(m=s[n+32>>2]-m|0)>>1,t=m>>2>>>0<536870911?t>>>0>g>>>0?t:g:1073741823){if(t>>>0>=1073741824)break o;r=ur(t<<2)}if(g=s[f+8>>2],s[f+8>>2]=0,s[(m=(A<<2)+r|0)>>2]=g,A=(t<<2)+r|0,g=m+4|0,(0|(r=s[n+28>>2]))==(0|(t=s[n+24>>2])))break i;for(;y=s[(r=r-4|0)>>2],s[r>>2]=0,s[(m=m-4|0)>>2]=y,(0|t)!=(0|r););if(s[n+32>>2]=A,r=s[n+28>>2],s[n+28>>2]=g,t=s[n+24>>2],s[n+24>>2]=m,(0|t)==(0|r))break n;for(;m=s[(r=r-4|0)>>2],s[r>>2]=0,m&&(rr(m+12|0,s[m+16>>2]),dr(m,s[m+4>>2]),ee(m)),(0|t)!=(0|r););break n}nn(),T()}qt(1326),T()}s[n+32>>2]=A,s[n+28>>2]=g,s[n+24>>2]=m}t&&ee(t)}t=s[f+8>>2],s[f+8>>2]=0,t&&(rr(t+12|0,s[t+16>>2]),dr(t,s[t+4>>2]),ee(t))}else s[f+8>>2]=0;if(N=f+16|0,(0|(x=x+1|0))==(0|_))break}t=D(h,n)}if(N=v+16|0,t?(r=s[c+4>>2],t=s[r+4>>2],s[r+4>>2]=n,t&&It(t),s[e>>2]=0,s[e+4>>2]=0,s[e+8>>2]=0,s[e+12>>2]=0):(t=ur(32),r=d[1693]|d[1694]<<8,o[t+24|0]=r,o[t+25|0]=r>>>8,r=d[1689]|d[1690]<<8|d[1691]<<16|d[1692]<<24,f=d[1685]|d[1686]<<8|d[1687]<<16|d[1688]<<24,o[t+16|0]=f,o[t+17|0]=f>>>8,o[t+18|0]=f>>>16,o[t+19|0]=f>>>24,o[t+20|0]=r,o[t+21|0]=r>>>8,o[t+22|0]=r>>>16,o[t+23|0]=r>>>24,r=d[1681]|d[1682]<<8|d[1683]<<16|d[1684]<<24,f=d[1677]|d[1678]<<8|d[1679]<<16|d[1680]<<24,o[t+8|0]=f,o[t+9|0]=f>>>8,o[t+10|0]=f>>>16,o[t+11|0]=f>>>24,o[t+12|0]=r,o[t+13|0]=r>>>8,o[t+14|0]=r>>>16,o[t+15|0]=r>>>24,r=d[1673]|d[1674]<<8|d[1675]<<16|d[1676]<<24,f=d[1669]|d[1670]<<8|d[1671]<<16|d[1672]<<24,o[0|t]=f,o[t+1|0]=f>>>8,o[t+2|0]=f>>>16,o[t+3|0]=f>>>24,o[t+4|0]=r,o[t+5|0]=r>>>8,o[t+6|0]=r>>>16,o[t+7|0]=r>>>24,o[t+26|0]=0,s[e>>2]=-1,Ot(e+4|0,t,26),ee(t),s[h+8>>2]=0,It(n)),N=h+16|0,s[e>>2])break t;o[l+11|0]>=0||ee(s[l>>2])}if(0|vn[s[s[c>>2]+12>>2]](c))if(0|vn[s[s[c>>2]+20>>2]](c))if(0|vn[s[s[c>>2]+24>>2]](c))s[e>>2]=0,s[e+4>>2]=0,s[e+8>>2]=0,s[e+12>>2]=0;else{if(t=jt(p,1451),s[e>>2]=-1,o[t+11|0]>=0){t=s[p+4>>2],s[l>>2]=s[p>>2],s[l+4>>2]=t,s[l+8>>2]=s[p+8>>2];break t}if(Ot(l,s[t>>2],s[t+4>>2]),o[t+11|0]>=0)break t;ee(s[t>>2])}else{if(t=jt(p,1696),s[e>>2]=-1,o[t+11|0]>=0){t=s[p+4>>2],s[l>>2]=s[p>>2],s[l+4>>2]=t,s[l+8>>2]=s[p+8>>2];break t}if(Ot(l,s[t>>2],s[t+4>>2]),o[t+11|0]>=0)break t;ee(s[t>>2])}else t=ur(48),o[t+32|0]=d[1518],r=d[1514]|d[1515]<<8|d[1516]<<16|d[1517]<<24,n=d[1510]|d[1511]<<8|d[1512]<<16|d[1513]<<24,o[t+24|0]=n,o[t+25|0]=n>>>8,o[t+26|0]=n>>>16,o[t+27|0]=n>>>24,o[t+28|0]=r,o[t+29|0]=r>>>8,o[t+30|0]=r>>>16,o[t+31|0]=r>>>24,r=d[1506]|d[1507]<<8|d[1508]<<16|d[1509]<<24,n=d[1502]|d[1503]<<8|d[1504]<<16|d[1505]<<24,o[t+16|0]=n,o[t+17|0]=n>>>8,o[t+18|0]=n>>>16,o[t+19|0]=n>>>24,o[t+20|0]=r,o[t+21|0]=r>>>8,o[t+22|0]=r>>>16,o[t+23|0]=r>>>24,r=d[1498]|d[1499]<<8|d[1500]<<16|d[1501]<<24,n=d[1494]|d[1495]<<8|d[1496]<<16|d[1497]<<24,o[t+8|0]=n,o[t+9|0]=n>>>8,o[t+10|0]=n>>>16,o[t+11|0]=n>>>24,o[t+12|0]=r,o[t+13|0]=r>>>8,o[t+14|0]=r>>>16,o[t+15|0]=r>>>24,r=d[1490]|d[1491]<<8|d[1492]<<16|d[1493]<<24,n=d[1486]|d[1487]<<8|d[1488]<<16|d[1489]<<24,o[0|t]=n,o[t+1|0]=n>>>8,o[t+2|0]=n>>>16,o[t+3|0]=n>>>24,o[t+4|0]=r,o[t+5|0]=r>>>8,o[t+6|0]=r>>>16,o[t+7|0]=r>>>24,o[t+33|0]=0,s[e>>2]=-1,Ot(l,t,33),ee(t)}else t=ur(32),r=d[1544]|d[1545]<<8,o[t+24|0]=r,o[t+25|0]=r>>>8,r=d[1540]|d[1541]<<8|d[1542]<<16|d[1543]<<24,n=d[1536]|d[1537]<<8|d[1538]<<16|d[1539]<<24,o[t+16|0]=n,o[t+17|0]=n>>>8,o[t+18|0]=n>>>16,o[t+19|0]=n>>>24,o[t+20|0]=r,o[t+21|0]=r>>>8,o[t+22|0]=r>>>16,o[t+23|0]=r>>>24,r=d[1532]|d[1533]<<8|d[1534]<<16|d[1535]<<24,n=d[1528]|d[1529]<<8|d[1530]<<16|d[1531]<<24,o[t+8|0]=n,o[t+9|0]=n>>>8,o[t+10|0]=n>>>16,o[t+11|0]=n>>>24,o[t+12|0]=r,o[t+13|0]=r>>>8,o[t+14|0]=r>>>16,o[t+15|0]=r>>>24,r=d[1524]|d[1525]<<8|d[1526]<<16|d[1527]<<24,n=d[1520]|d[1521]<<8|d[1522]<<16|d[1523]<<24,o[0|t]=n,o[t+1|0]=n>>>8,o[t+2|0]=n>>>16,o[t+3|0]=n>>>24,o[t+4|0]=r,o[t+5|0]=r>>>8,o[t+6|0]=r>>>16,o[t+7|0]=r>>>24,o[t+26|0]=0,s[e>>2]=-5,Ot(l,t,26),ee(t);else t=ur(32),r=d[1571]|d[1572]<<8,o[t+24|0]=r,o[t+25|0]=r>>>8,r=d[1567]|d[1568]<<8|d[1569]<<16|d[1570]<<24,n=d[1563]|d[1564]<<8|d[1565]<<16|d[1566]<<24,o[t+16|0]=n,o[t+17|0]=n>>>8,o[t+18|0]=n>>>16,o[t+19|0]=n>>>24,o[t+20|0]=r,o[t+21|0]=r>>>8,o[t+22|0]=r>>>16,o[t+23|0]=r>>>24,r=d[1559]|d[1560]<<8|d[1561]<<16|d[1562]<<24,n=d[1555]|d[1556]<<8|d[1557]<<16|d[1558]<<24,o[t+8|0]=n,o[t+9|0]=n>>>8,o[t+10|0]=n>>>16,o[t+11|0]=n>>>24,o[t+12|0]=r,o[t+13|0]=r>>>8,o[t+14|0]=r>>>16,o[t+15|0]=r>>>24,r=d[1551]|d[1552]<<8|d[1553]<<16|d[1554]<<24,n=d[1547]|d[1548]<<8|d[1549]<<16|d[1550]<<24,o[0|t]=n,o[t+1|0]=n>>>8,o[t+2|0]=n>>>16,o[t+3|0]=n>>>24,o[t+4|0]=r,o[t+5|0]=r>>>8,o[t+6|0]=r>>>16,o[t+7|0]=r>>>24,o[t+26|0]=0,s[e>>2]=-5,Ot(l,t,26),ee(t);else t=ur(64),r=d[1448]|d[1449]<<8,o[t+48|0]=r,o[t+49|0]=r>>>8,r=d[1444]|d[1445]<<8|d[1446]<<16|d[1447]<<24,n=d[1440]|d[1441]<<8|d[1442]<<16|d[1443]<<24,o[t+40|0]=n,o[t+41|0]=n>>>8,o[t+42|0]=n>>>16,o[t+43|0]=n>>>24,o[t+44|0]=r,o[t+45|0]=r>>>8,o[t+46|0]=r>>>16,o[t+47|0]=r>>>24,r=d[1436]|d[1437]<<8|d[1438]<<16|d[1439]<<24,n=d[1432]|d[1433]<<8|d[1434]<<16|d[1435]<<24,o[t+32|0]=n,o[t+33|0]=n>>>8,o[t+34|0]=n>>>16,o[t+35|0]=n>>>24,o[t+36|0]=r,o[t+37|0]=r>>>8,o[t+38|0]=r>>>16,o[t+39|0]=r>>>24,r=d[1428]|d[1429]<<8|d[1430]<<16|d[1431]<<24,n=d[1424]|d[1425]<<8|d[1426]<<16|d[1427]<<24,o[t+24|0]=n,o[t+25|0]=n>>>8,o[t+26|0]=n>>>16,o[t+27|0]=n>>>24,o[t+28|0]=r,o[t+29|0]=r>>>8,o[t+30|0]=r>>>16,o[t+31|0]=r>>>24,r=d[1420]|d[1421]<<8|d[1422]<<16|d[1423]<<24,n=d[1416]|d[1417]<<8|d[1418]<<16|d[1419]<<24,o[t+16|0]=n,o[t+17|0]=n>>>8,o[t+18|0]=n>>>16,o[t+19|0]=n>>>24,o[t+20|0]=r,o[t+21|0]=r>>>8,o[t+22|0]=r>>>16,o[t+23|0]=r>>>24,r=d[1412]|d[1413]<<8|d[1414]<<16|d[1415]<<24,n=d[1408]|d[1409]<<8|d[1410]<<16|d[1411]<<24,o[t+8|0]=n,o[t+9|0]=n>>>8,o[t+10|0]=n>>>16,o[t+11|0]=n>>>24,o[t+12|0]=r,o[t+13|0]=r>>>8,o[t+14|0]=r>>>16,o[t+15|0]=r>>>24,r=d[1404]|d[1405]<<8|d[1406]<<16|d[1407]<<24,n=d[1400]|d[1401]<<8|d[1402]<<16|d[1403]<<24,o[0|t]=n,o[t+1|0]=n>>>8,o[t+2|0]=n>>>16,o[t+3|0]=n>>>24,o[t+4|0]=r,o[t+5|0]=r>>>8,o[t+6|0]=r>>>16,o[t+7|0]=r>>>24,o[t+50|0]=0,s[e>>2]=-1,Ot(l,t,50),ee(t);N=p+32|0,s[e>>2]||(o[b+11|0]<0&&ee(s[b>>2]),s[e>>2]=0,s[e+4>>2]=0,s[e+8>>2]=0,s[e+12>>2]=0),vn[s[s[c>>2]+4>>2]](c)}e=s[i+16>>2],s[i+16>>2]=0,e&&vn[s[s[e>>2]+4>>2]](e),o[i+15|0]>=0||ee(s[i+4>>2])}else t=ur(32),r=d[1590]|d[1591]<<8|d[1592]<<16|d[1593]<<24,o[t+16|0]=r,o[t+17|0]=r>>>8,o[t+18|0]=r>>>16,o[t+19|0]=r>>>24,r=d[1586]|d[1587]<<8|d[1588]<<16|d[1589]<<24,n=d[1582]|d[1583]<<8|d[1584]<<16|d[1585]<<24,o[t+8|0]=n,o[t+9|0]=n>>>8,o[t+10|0]=n>>>16,o[t+11|0]=n>>>24,o[t+12|0]=r,o[t+13|0]=r>>>8,o[t+14|0]=r>>>16,o[t+15|0]=r>>>24,r=d[1578]|d[1579]<<8|d[1580]<<16|d[1581]<<24,n=d[1574]|d[1575]<<8|d[1576]<<16|d[1577]<<24,o[0|t]=n,o[t+1|0]=n>>>8,o[t+2|0]=n>>>16,o[t+3|0]=n>>>24,o[t+4|0]=r,o[t+5|0]=r>>>8,o[t+6|0]=r>>>16,o[t+7|0]=r>>>24,o[t+20|0]=0,s[e>>2]=-1,Ot(b,t,20),ee(t);N=i+80|0}function D(e,t){var r,n=0,i=0,a=0,c=0,l=0,f=0,p=0,m=0,h=0,b=0,v=0,g=0,A=0,_=0,x=0;N=r=N-48|0,n=ur(8),s[n+4>>2]=t,s[n>>2]=0,t=n+8|0,s[r+40>>2]=t,s[r+36>>2]=t,s[r+32>>2]=n;e:{t:{r:{n:{for(;;){if(m=s[4+(t=t-8|0)>>2],l=s[t>>2],s[r+36>>2]=t,l){s[r+24>>2]=0,s[r+16>>2]=0,s[r+20>>2]=0,n=1,t=s[e>>2],a=s[t+8>>2];i:if(!((0|(f=s[t+12>>2]))<=(0|(i=s[t+20>>2]))&(c=s[t+16>>2])>>>0>=a>>>0|(0|i)>(0|f))){if(a=d[c+s[t>>2]|0],i=(c=c+1|0)?i:i+1|0,s[t+16>>2]=c,s[t+20>>2]=i,Se(r+16|0,a),a){if(i=s[e>>2],b=fr(r+16|0),c=s[i+20>>2],t=a,v=(p=s[i+16>>2])+a|0,f=s[i+12>>2],c=a>>>0>v>>>0?c+1|0:c,v>>>0>u[i+8>>2]&(0|f)<=(0|c)|(0|c)>(0|f))break i;ye(b,p+s[i>>2]|0,a),n=s[i+20>>2],n=(a=t+s[i+16>>2]|0)>>>0<t>>>0?n+1|0:n,s[i+16>>2]=a,s[i+20>>2]=n}m=ur(24),s[(t=m)+4>>2]=0,s[t+8>>2]=0,s[(t=t+16|0)>>2]=0,s[t+4>>2]=0,s[m>>2]=m+4,s[m+12>>2]=t,N=a=N-32|0;o:if((0|(h=$e(c=l+12|0,n=r+16|0)))!=(0|(A=l+16|0)))m&&(rr(m+12|0,s[m+16>>2]),dr(m,s[m+4>>2]),ee(m));else{s[a+16>>2]=n;a:{s:{if(t=s[c+4>>2])for(f=(l=(i=d[n+11|0])<<24>>24<0)?s[n>>2]:n,l=l?s[n+4>>2]:i,n=c+4|0;;){c:{l:{d:{f:{u:{p:if(p=(b=(i=(v=(i=d[t+27|0])<<24>>24<0)?s[t+20>>2]:i)>>>0<l>>>0)?i:l){if(g=t+16|0,!(g=Mt(f,v=v?s[g>>2]:g,p))){if(i>>>0>l>>>0)break p;break u}if((0|g)>=0)break u}else if(i>>>0<=l>>>0)break f;if(i=s[t>>2])break c;break s}if(i=Mt(v,f,p))break d}if(b)break l;break a}if((0|i)>=0)break a}if(n=t+4|0,!(i=s[t+4>>2]))break a;t=n}n=t,t=i}t=c+4|0}n=t}if((i=s[n>>2])?t=0:(f=(i=ur(32))+16|0,l=s[a+16>>2],o[l+11|0]>=0?(v=s[l+4>>2],s[f>>2]=s[l>>2],s[f+4>>2]=v,s[f+8>>2]=s[l+8>>2]):Ot(f,s[l>>2],s[l+4>>2]),s[i+8>>2]=t,s[i>>2]=0,s[i+4>>2]=0,s[i+28>>2]=0,s[n>>2]=i,(t=s[s[c>>2]>>2])?(s[c>>2]=t,t=s[n>>2]):t=i,we(s[c+4>>2],t),s[c+8>>2]=s[c+8>>2]+1,t=1),o[a+28|0]=t,s[a+24>>2]=i,n=s[a+24>>2],t=s[n+28>>2],s[n+28>>2]=m,!t)break o;rr(t+12|0,s[t+16>>2]),dr(t,s[t+4>>2]),ee(t)}N=a+32|0,n=(0|h)!=(0|A)}if(o[r+27|0]<0&&ee(s[r+16>>2]),n)break t}if(!m)break t;if(s[r+16>>2]=0,!yt(1,r+16|0,s[e>>2]))break t;if(t=0,x=s[r+16>>2])for(;;){v=0,N=p=N-32|0,s[p+24>>2]=0,s[p+16>>2]=0,s[p+20>>2]=0,n=s[e>>2],a=s[n+8>>2];i:{o:{a:if(!((0|(c=s[n+12>>2]))<=(0|(i=s[n+20>>2]))&(l=s[n+16>>2])>>>0>=a>>>0|(0|i)>(0|c))){if(c=d[l+s[n>>2]|0],a=n,n=i,n=(i=l+1|0)?n:n+1|0,s[a+16>>2]=i,s[a+20>>2]=n,Se(p+16|0,c),c){if(a=s[e>>2],b=fr(p+16|0),i=s[a+20>>2],f=(h=s[a+16>>2])+(n=c)|0,l=s[a+12>>2],i=n>>>0>f>>>0?i+1|0:i,f>>>0>u[a+8>>2]&(0|l)<=(0|i)|(0|i)>(0|l))break a;ye(b,h+s[a>>2]|0,c),i=s[a+20>>2],i=(c=n+s[a+16>>2]|0)>>>0<n>>>0?i+1|0:i,s[a+16>>2]=c,s[a+20>>2]=i}if(s[p+12>>2]=0,yt(1,p+12|0,s[e>>2])&&(n=s[p+12>>2])){if(s[p+8>>2]=0,s[p>>2]=0,s[p+4>>2]=0,(0|n)<0)break o;if(i=ur(n),s[p>>2]=i,a=n+i|0,s[p+8>>2]=a,b=We(i,0,n),s[p+4>>2]=a,a=s[e>>2],v=s[a+8>>2],l=s[a+12>>2],c=s[a+20>>2],v=(0|(c=(f=n+(h=s[a+16>>2])|0)>>>0<n>>>0?c+1|0:c))<=(0|l)&f>>>0<=v>>>0|(0|c)<(0|l)){if(ye(b,h+s[a>>2]|0,n),i=n,c=n+s[a+16>>2]|0,n=s[a+20>>2],s[a+16>>2]=c,s[a+20>>2]=i>>>0>c>>>0?n+1|0:n,N=l=N-48|0,(0|(i=$e(m,p+16|0)))!=(m+4|0)){s:if(a=s[i+4>>2])for(;c=a,a=s[a>>2];);else{if(c=s[i+8>>2],s[c>>2]==(0|i))break s;for(n=i+8|0;n=(a=s[n>>2])+8|0,c=s[a+8>>2],(0|a)!=s[c>>2];);}s[m>>2]==(0|i)&&(s[m>>2]=c),s[m+8>>2]=s[m+8>>2]-1,c=s[m+4>>2],f=i;s:{c:{if(a=s[i>>2]){if(!(n=s[f+4>>2]))break c;for(;i=n,n=s[n>>2];);}if(!(a=s[i+4>>2])){a=0,b=1;break s}}s[a+8>>2]=s[i+8>>2],b=0}h=s[i+8>>2];s:if((0|i)!=(0|(n=s[h>>2])))s[h+4>>2]=a;else{if(s[h>>2]=a,(0|i)==(0|c)){n=0,c=a;break s}n=s[h+4>>2]}g=!d[i+12|0],(0|i)!=(0|f)&&(h=s[f+8>>2],s[i+8>>2]=h,s[h+(((0|f)!=s[s[f+8>>2]>>2])<<2)>>2]=i,h=s[f>>2],s[i>>2]=h,s[h+8>>2]=i,h=s[f+4>>2],s[i+4>>2]=h,h&&(s[h+8>>2]=i),o[i+12|0]=d[f+12|0],c=(0|c)==(0|f)?i:c);s:if(!(g|!c)){if(b)for(;;){a=d[n+12|0];c:{if(i=s[n+8>>2],s[i>>2]!=(0|n)){a||(o[n+12|0]=1,o[i+12|0]=0,a=s[i+4>>2],b=s[a>>2],s[i+4>>2]=b,b&&(s[b+8>>2]=i),s[a+8>>2]=s[i+8>>2],b=s[i+8>>2],s[(((0|i)!=s[b>>2])<<2)+b>>2]=a,s[a>>2]=i,s[i+8>>2]=a,i=n,c=(0|(n=s[n>>2]))==(0|c)?i:c,n=s[n+4>>2]);l:{d:{i=s[n>>2];f:{if(d[i+12|0]||!i){if(a=s[n+4>>2],!d[a+12|0]&&a)break f;if(o[n+12|0]=0,(0|c)!=(0|(n=s[n+8>>2]))){if(d[n+12|0])break c}else n=c;o[n+12|0]=1;break s}if(!(a=s[n+4>>2]))break d}if(!d[a+12|0]){i=n;break l}}o[i+12|0]=1,o[n+12|0]=0,a=s[i+4>>2],s[n>>2]=a,a&&(s[a+8>>2]=n),s[i+8>>2]=s[n+8>>2],a=s[n+8>>2],s[((s[a>>2]!=(0|n))<<2)+a>>2]=i,s[i+4>>2]=n,s[n+8>>2]=i,a=n}n=s[i+8>>2],o[i+12|0]=d[n+12|0],o[n+12|0]=1,o[a+12|0]=1,i=s[n+4>>2],a=s[i>>2],s[n+4>>2]=a,a&&(s[a+8>>2]=n),s[i+8>>2]=s[n+8>>2],a=s[n+8>>2],s[(((0|n)!=s[a>>2])<<2)+a>>2]=i,s[i>>2]=n,s[n+8>>2]=i;break s}a||(o[n+12|0]=1,o[i+12|0]=0,a=s[n+4>>2],s[i>>2]=a,a&&(s[a+8>>2]=i),s[n+8>>2]=s[i+8>>2],a=s[i+8>>2],s[(((0|i)!=s[a>>2])<<2)+a>>2]=n,s[n+4>>2]=i,s[i+8>>2]=n,c=(0|i)==(0|c)?n:c,n=s[i>>2]);l:if(!(a=s[n>>2])|d[a+12|0]){if(i=s[n+4>>2],d[i+12|0]||!i){if(o[n+12|0]=0,(0|(n=s[n+8>>2]))!=(0|c)&&d[n+12|0])break c;o[n+12|0]=1;break s}if(a){if(!d[a+12|0]){i=n;break l}i=s[n+4>>2]}o[i+12|0]=1,o[n+12|0]=0,a=s[i>>2],s[n+4>>2]=a,a&&(s[a+8>>2]=n),s[i+8>>2]=s[n+8>>2],a=s[n+8>>2],s[((s[a>>2]!=(0|n))<<2)+a>>2]=i,s[i>>2]=n,s[n+8>>2]=i,a=n}else i=n;n=s[i+8>>2],o[i+12|0]=d[n+12|0],o[n+12|0]=1,o[a+12|0]=1,i=s[n>>2],a=s[i+4>>2],s[n>>2]=a,a&&(s[a+8>>2]=n),s[i+8>>2]=s[n+8>>2],a=s[n+8>>2],s[(((0|n)!=s[a>>2])<<2)+a>>2]=i,s[i+4>>2]=n,s[n+8>>2]=i;break s}i=n,n=s[n+8>>2],n=s[(((0|i)==s[n>>2])<<2)+n>>2]}o[a+12|0]=1}(n=s[f+28>>2])&&(s[f+32>>2]=n,ee(n)),o[f+27|0]<0&&ee(s[f+16>>2]),ee(f)}s[l>>2]=0,s[l+4>>2]=0,s[l+8>>2]=0,ft(l,n=s[p+4>>2]-s[p>>2]|0),ye(s[l>>2],s[p>>2],n),o[p+27|0]>=0?(s[l+24>>2]=s[p+24>>2],n=s[p+20>>2],s[l+16>>2]=s[p+16>>2],s[l+20>>2]=n):Ot(l+16|0,s[p+16>>2],s[p+20>>2]),s[l+36>>2]=0,s[l+28>>2]=0,s[l+32>>2]=0,ft(l+28|0,s[l+4>>2]-s[l>>2]|0),n=s[l>>2],ye(s[l+28>>2],n,s[l+4>>2]-n|0),i=c=l+16|0;s:{c:{if(n=s[m+4>>2])for(b=(f=(a=d[i+11|0])<<24>>24<0)?s[i>>2]:i,f=f?s[i+4>>2]:a,i=m+4|0;;){l:{d:{f:{u:{p:{m:if(g=(A=(a=(h=(a=d[n+27|0])<<24>>24<0)?s[n+20>>2]:a)>>>0<f>>>0)?a:f){if(_=n+16|0,!(_=Mt(b,h=h?s[_>>2]:_,g))){if(a>>>0>f>>>0)break m;break p}if((0|_)>=0)break p}else if(a>>>0<=f>>>0)break u;if(a=s[n>>2])break l;break c}if(a=Mt(h,b,g))break f}if(A)break d;break s}if((0|a)>=0)break s}if(i=n+4|0,!(a=s[n+4>>2]))break s;n=i}i=n,n=a}n=m+4|0}i=n}if((a=s[i>>2])?n=0:(a=ur(40),s[a+24>>2]=s[c+8>>2],f=s[c+4>>2],s[a+16>>2]=s[c>>2],s[a+20>>2]=f,s[c>>2]=0,s[c+4>>2]=0,s[c+8>>2]=0,s[a+36>>2]=0,s[(f=a+28|0)>>2]=0,s[f+4>>2]=0,ft(f,s[c+16>>2]-s[c+12>>2]|0),ye(b=s[f>>2],f=s[c+12>>2],s[c+16>>2]-f|0),s[a+8>>2]=n,s[a>>2]=0,s[a+4>>2]=0,s[i>>2]=a,(n=s[s[m>>2]>>2])?(s[m>>2]=n,n=s[i>>2]):n=a,we(s[m+4>>2],n),s[m+8>>2]=s[m+8>>2]+1,n=1),o[l+44|0]=n,s[l+40>>2]=a,(n=s[l+28>>2])&&(s[l+32>>2]=n,ee(n)),o[l+27|0]<0&&ee(s[l+16>>2]),(n=s[l>>2])&&(s[l+4>>2]=n,ee(n)),N=l+48|0,!(i=s[p>>2]))break a}s[p+4>>2]=i,ee(i)}}o[p+27|0]<0&&ee(s[p+16>>2]),N=p+32|0;break i}nn(),T()}if(!v)break t;if((0|x)==(0|(t=t+1|0)))break}if(s[r+12>>2]=0,!yt(1,r+12|0,s[e>>2]))break t;if(t=s[e>>2],(a=(n=s[t+8>>2])-(i=s[t+16>>2])|0)>>>0<(c=s[r+12>>2])>>>0&(0|(t=s[t+12>>2]-(s[t+20>>2]+(n>>>0<i>>>0)|0)|0))<=0|(0|t)<0)break t;if(n=0,t=s[r+36>>2],c)for(;;){if((a=s[r+40>>2])>>>0>t>>>0)s[t+4>>2]=0,s[t>>2]=m,t=t+8|0,s[r+36>>2]=t;else{if((t=1+(f=(l=t-(i=s[r+32>>2])|0)>>3)|0)>>>0>=536870912)break n;if(v=(a=a-i|0)>>2,(t=a>>3>>>0<268435455?t>>>0>v>>>0?t:v:536870911)>>>0>=536870912)break r;b=f<<3,a=ur(f=t<<3),s[4+(t=b+a|0)>>2]=0,s[t>>2]=m,t=t+8|0,(0|l)>0&&ye(a,i,l),s[r+40>>2]=a+f,s[r+36>>2]=t,s[r+32>>2]=a,i&&ee(i)}if((0|c)==(0|(n=n+1|0)))break}if(s[r+32>>2]==(0|t))break}e=1;break e}nn(),T()}qt(1326),T()}t=s[r+32>>2],e=0}return t&&ee(t),N=r+48|0,e}function O(e,t,r,n){var i=0,c=0,l=0,h=0,v=0;e:{t:if(n){r:{n:switch(s[e+28>>2]-1|0){case 0:v=1;i:if(!((0|((0|r)<(0|(i=o[e+24|0]))?r:i))<=0)){if(i=s[e>>2],h=s[i>>2],c=t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0,t=h+t|0,i=(l=s[i+4>>2])-h|0,!d[e+32|0]){if((0|i)<=(0|c))break e;for(c=0;;){if(p[(c<<2)+n>>2]=o[0|t],(0|(c=c+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break i;if(!(l>>>0>(t=t+1|0)>>>0))break}break e}if((0|i)<=(0|c))break e;for(c=0;;){if(p[(c<<2)+n>>2]=b(o[0|t])/b(127),(0|(c=c+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break i;if(!(l>>>0>(t=t+1|0)>>>0))break}break e}if((0|r)>(0|i))break r;break t;case 1:v=1;i:if(!((0|((0|r)<(0|(i=o[e+24|0]))?r:i))<=0)){if(i=s[e>>2],h=s[i>>2],c=t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0,t=h+t|0,i=(l=s[i+4>>2])-h|0,!d[e+32|0]){if((0|i)<=(0|c))break e;for(c=0;;){if(p[(c<<2)+n>>2]=d[0|t],(0|(c=c+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break i;if(!(l>>>0>(t=t+1|0)>>>0))break}break e}if((0|i)<=(0|c))break e;for(c=0;;){if(p[(c<<2)+n>>2]=b(d[0|t])/b(255),(0|(c=c+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break i;if(!(l>>>0>(t=t+1|0)>>>0))break}break e}if((0|r)>(0|i))break r;break t;case 2:v=1;i:if(!((0|((0|r)<(0|(i=o[e+24|0]))?r:i))<=0)){if(i=s[e>>2],h=s[i>>2],c=t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0,t=h+t|0,i=(l=s[i+4>>2])-h|0,!d[e+32|0]){if((0|i)<=(0|c))break e;for(c=0;;){if(p[(c<<2)+n>>2]=a[t>>1],(0|(c=c+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break i;if(!(l>>>0>(t=t+2|0)>>>0))break}break e}if((0|i)<=(0|c))break e;for(c=0;;){if(p[(c<<2)+n>>2]=b(a[t>>1])/b(32767),(0|(c=c+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break i;if(!(l>>>0>(t=t+2|0)>>>0))break}break e}if((0|r)>(0|i))break r;break t;case 3:v=1;i:if(!((0|((0|r)<(0|(i=o[e+24|0]))?r:i))<=0)){if(i=s[e>>2],h=s[i>>2],c=t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0,t=h+t|0,i=(l=s[i+4>>2])-h|0,!d[e+32|0]){if((0|i)<=(0|c))break e;for(c=0;;){if(p[(c<<2)+n>>2]=f[t>>1],(0|(c=c+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break i;if(!(l>>>0>(t=t+2|0)>>>0))break}break e}if((0|i)<=(0|c))break e;for(c=0;;){if(p[(c<<2)+n>>2]=b(f[t>>1])/b(65535),(0|(c=c+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break i;if(!(l>>>0>(t=t+2|0)>>>0))break}break e}if((0|r)>(0|i))break r;break t;case 4:v=1;i:if(!((0|((0|r)<(0|(i=o[e+24|0]))?r:i))<=0)){if(i=s[e>>2],h=s[i>>2],c=t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0,t=h+t|0,i=(l=s[i+4>>2])-h|0,!d[e+32|0]){if((0|i)<=(0|c))break e;for(c=0;;){if(p[(c<<2)+n>>2]=s[t>>2],(0|(c=c+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break i;if(!(l>>>0>(t=t+4|0)>>>0))break}break e}if((0|i)<=(0|c))break e;for(c=0;;){if(p[(c<<2)+n>>2]=b(s[t>>2])*b(4.656612873077393e-10),(0|(c=c+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break i;if(!(l>>>0>(t=t+4|0)>>>0))break}break e}if((0|r)>(0|i))break r;break t;case 5:v=1;i:if(!((0|((0|r)<(0|(i=o[e+24|0]))?r:i))<=0)){if(i=s[e>>2],h=s[i>>2],c=t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0,t=h+t|0,i=(l=s[i+4>>2])-h|0,!d[e+32|0]){if((0|i)<=(0|c))break e;for(c=0;;){if(p[(c<<2)+n>>2]=u[t>>2],(0|(c=c+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break i;if(!(l>>>0>(t=t+4|0)>>>0))break}break e}if((0|i)<=(0|c))break e;for(c=0;;){if(p[(c<<2)+n>>2]=b(u[t>>2])*b(2.3283064365386963e-10),(0|(c=c+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break i;if(!(l>>>0>(t=t+4|0)>>>0))break}break e}if((0|r)>(0|i))break r;break t;case 6:v=1;i:if(!((0|((0|r)<(0|(i=o[e+24|0]))?r:i))<=0)){if(i=s[e>>2],h=s[i>>2],c=t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0,t=h+t|0,i=(l=s[i+4>>2])-h|0,!d[e+32|0]){if((0|i)<=(0|c))break e;for(c=0;;){if(p[(c<<2)+n>>2]=+u[t>>2]+4294967296*+s[t+4>>2],(0|(c=c+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break i;if(!(l>>>0>(t=t+8|0)>>>0))break}break e}if((0|i)<=(0|c))break e;for(c=0;;){if(p[(c<<2)+n>>2]=b(+u[t>>2]+4294967296*+s[t+4>>2])*b(10842021724855044e-35),(0|(c=c+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break i;if(!(l>>>0>(t=t+8|0)>>>0))break}break e}if((0|r)>(0|i))break r;break t;case 7:v=1;i:if(!((0|((0|r)<(0|(i=o[e+24|0]))?r:i))<=0)){if(i=s[e>>2],h=s[i>>2],c=t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0,t=h+t|0,i=(l=s[i+4>>2])-h|0,!d[e+32|0]){if((0|i)<=(0|c))break e;for(c=0;;){if(p[(c<<2)+n>>2]=+u[t>>2]+4294967296*+u[t+4>>2],(0|(c=c+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break i;if(!(l>>>0>(t=t+8|0)>>>0))break}break e}if((0|i)<=(0|c))break e;for(c=0;;){if(p[(c<<2)+n>>2]=b(+u[t>>2]+4294967296*+u[t+4>>2])*b(5.421010862427522e-20),(0|(c=c+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break i;if(!(l>>>0>(t=t+8|0)>>>0))break}break e}if((0|r)>(0|i))break r;break t;case 8:if(v=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(l=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,l=s[i+4>>2];;){if(t>>>0>=l>>>0)break e;if(p[(c<<2)+n>>2]=p[t>>2],t=t+4|0,!((0|(c=c+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 9:if(v=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(l=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,l=s[i+4>>2];;){if(t>>>0>=l>>>0)break e;if(p[(c<<2)+n>>2]=m[t>>3],t=t+8|0,!((0|(c=c+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 10:break n;default:break t}if(v=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(l=s[e>>2],t=(i=s[l>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0;;){if(u[l+4>>2]<=t>>>0)break e;if(p[(c<<2)+n>>2]=d[0|t]?b(1):b(0),t=t+1|0,!((0|(c=c+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)<=(0|i))break t}We((i<<2)+n|0,0,r-i<<2)}return v}return 0}function z(e,t){t|=0;var r,n,i,a=0,c=0,l=0,u=0,p=0,m=0,b=0,v=0,g=0,A=0,_=0,x=0,y=0;N=r=N-96|0,i=s[4+(e|=0)>>2],c=s[i+32>>2],l=s[c+8>>2];e:if(!((0|(u=_=s[c+12>>2]))<=(0|(a=s[c+20>>2]))&(n=s[c+16>>2])>>>0>=l>>>0|(0|a)>(0|u)||(v=s[c>>2],y=d[v+n|0],u=(p=n+1|0)?a:a+1|0,s[c+16>>2]=p,s[c+20>>2]=u,l>>>0<=p>>>0&(0|u)>=(0|_)|(0|u)>(0|_)))){g=d[p+v|0],u=(p=n+2|0)>>>0<2?a+1|0:a,A=p,s[c+16>>2]=p,s[c+20>>2]=u;t:{if((0|(m=y<<24>>24))>=0){if(p=s[e+216>>2],y>>>0>=(s[e+220>>2]-p|0)/144>>>0)break e;if(x=p+h(y,144)|0,s[x>>2]<0)break t;break e}if(s[e+212>>2]>=0)break e;x=e+212|0}s[x>>2]=t;t:{r:{n:{if((65535&((p=f[i+36>>1])<<8|p>>>8))>>>0>=258){if(l>>>0<=A>>>0&(0|u)>=(0|_)|(0|u)>(0|_))break e;if(p=d[v+A|0],a=(u=n+3|0)>>>0<3?a+1|0:a,s[c+16>>2]=u,s[c+20>>2]=a,a=p>>>0>1)break e;if(a=a?0:p,!g)break n;if(a)break e;break r}if(g)break r;a=0}if((0|m)<0?u=e+184|0:(c=s[e+216>>2]+h(y,144)|0,o[c+100|0]=0,u=c+104|0),c=u,1!=(0|a))N=l=N+-64|0,g=s[s[e+4>>2]+44>>2],a=ur(80),s[a>>2]=9424,s[a+4>>2]=0,s[a+76>>2]=0,s[a+72>>2]=c,s[a+68>>2]=g,s[a+8>>2]=9588,s[a+12>>2]=0,s[a+16>>2]=0,s[a+20>>2]=0,s[a+24>>2]=0,s[a+28>>2]=0,s[a+32>>2]=0,s[a+36>>2]=0,s[a+40>>2]=0,s[a+44>>2]=0,s[a+48>>2]=0,s[a+52>>2]=0,s[a- -64>>2]=0,s[(u=A=a+56|0)>>2]=0,s[u+4>>2]=0,v=s[e+8>>2],s[l+40>>2]=0,s[l+44>>2]=0,s[l+32>>2]=0,s[l+36>>2]=0,s[(u=m=l+24|0)>>2]=0,s[u+4>>2]=0,s[l+16>>2]=0,s[l+20>>2]=0,s[l+8>>2]=0,s[l+12>>2]=0,s[l+56>>2]=0,s[l+48>>2]=0,s[l+52>>2]=0,s[l>>2]=9588,s[l+4>>2]=v,p=s[v>>2],u=s[v+4>>2],o[l+63|0]=0,He(_=m,(u-p>>2>>>0)/3|0,m=l+63|0),u=s[l+4>>2],p=s[u+28>>2],u=s[u+24>>2],o[l+63|0]=0,He(l+36|0,p-u>>2,m),s[l+20>>2]=a,s[l+16>>2]=g,s[l+12>>2]=c,s[l+8>>2]=v,Oe(a+8|0,l),Ye(A,s[l+48>>2],s[l+52>>2]),s[l>>2]=9588,(c=s[l+48>>2])&&(s[l+52>>2]=c,ee(c)),s[l>>2]=9404,(c=s[l+36>>2])&&ee(c),(c=s[l+24>>2])&&ee(c),N=l- -64|0;else{if(N=l=N-112|0,A=s[s[e+4>>2]+44>>2],a=ur(120),s[a>>2]=8956,s[a+4>>2]=0,s[a+116>>2]=0,s[a+112>>2]=c,s[a+108>>2]=A,s[a+12>>2]=0,s[a+16>>2]=0,s[a+20>>2]=0,s[a+24>>2]=0,s[a+28>>2]=0,s[a+32>>2]=0,s[a+36>>2]=0,s[a+40>>2]=0,s[a+44>>2]=0,s[a+48>>2]=0,s[a+52>>2]=0,s[a+56>>2]=0,s[a+60>>2]=0,s[a+8>>2]=9168,s[(u=a- -64|0)>>2]=0,s[u+4>>2]=0,s[a+72>>2]=0,s[a+76>>2]=0,s[a+80>>2]=0,s[a+84>>2]=0,s[a+88>>2]=0,s[a+104>>2]=0,s[a+96>>2]=0,s[a+100>>2]=0,g=s[e+8>>2],s[l+48>>2]=0,s[l+52>>2]=0,s[l+40>>2]=0,s[l+44>>2]=0,s[(u=m=l+32|0)>>2]=0,s[u+4>>2]=0,s[l+24>>2]=0,s[l+28>>2]=0,s[l+16>>2]=0,s[l+20>>2]=0,s[(u=l- -64|0)>>2]=0,s[u+4>>2]=0,s[l+72>>2]=0,s[l+76>>2]=0,s[l+80>>2]=0,s[l+84>>2]=0,s[l+88>>2]=0,s[l+104>>2]=0,s[l+56>>2]=0,s[l+60>>2]=0,s[l+8>>2]=9168,s[l+96>>2]=0,s[l+100>>2]=0,s[l+12>>2]=g,p=s[g>>2],u=s[g+4>>2],o[l+111|0]=0,He(_=m,(u-p>>2>>>0)/3|0,m=l+111|0),u=s[l+12>>2],p=s[u+28>>2],u=s[u+24>>2],o[l+111|0]=0,He(l+44|0,p-u>>2,m),s[l+28>>2]=a,s[l+24>>2]=A,s[l+20>>2]=c,s[l+16>>2]=g,Oe(c=a+8|0,u=l+8|0),(0|c)!=(0|u)){Ye(a+56|0,s[u+48>>2],s[u+52>>2]),Ye(a+68|0,s[u+60>>2],s[u- -64>>2]),Ye(a+80|0,s[u+72>>2],s[u+76>>2]),s[a+92>>2]=s[u+84>>2];n:if((A=(p=(m=s[u+92>>2])-(g=s[u+88>>2])|0)>>2)>>>0<=(x=s[a+104>>2])-(v=s[a+96>>2])>>2>>>0){if((c=(p=(u=(c=s[a+100>>2]-v|0)>>2)>>>0<A>>>0?c+g|0:m)-g|0)&&Ue(v,g,c),u>>>0<A>>>0){c=s[a+100>>2],(0|(u=m-p|0))>0&&(c=ye(c,p,u)+u|0),s[a+100>>2]=c;break n}s[a+100>>2]=c+v}else v&&(s[a+100>>2]=v,ee(v),s[a+104>>2]=0,s[a+96>>2]=0,s[a+100>>2]=0,x=0),(0|p)<0||(c=x>>1,(c=x>>2>>>0<536870911?c>>>0<A>>>0?A:c:1073741823)>>>0>=1073741824)?(nn(),T()):(c=ur(u=c<<2),s[a+96>>2]=c,s[a+100>>2]=c,s[a+104>>2]=c+u,p&&(c=ye(c,g,p)+p|0),s[a+100>>2]=c)}else s[a+92>>2]=s[u+84>>2];s[l+8>>2]=9168,(c=s[l+96>>2])&&(s[l+100>>2]=c,ee(c)),(c=s[l+80>>2])&&(s[l+84>>2]=c,ee(c)),(c=s[l+68>>2])&&(s[l+72>>2]=c,ee(c)),(c=s[l+56>>2])&&(s[l+60>>2]=c,ee(c)),s[l+8>>2]=9404,(c=s[l+44>>2])&&ee(c),(c=s[l+32>>2])&&ee(c),N=l+112|0}if(!a)break e;break t}if((0|m)<0)break e;p=s[i+44>>2],c=s[e+216>>2],a=ur(80),s[a+76>>2]=0,s[a+68>>2]=p,s[a+8>>2]=8652,s[a>>2]=9716,s[a+4>>2]=0,b=104+(u=c+h(y,144)|0)|0,s[a+72>>2]=b,s[a- -64>>2]=0,s[a+56>>2]=0,s[a+60>>2]=0,s[a+52>>2]=0,s[a+44>>2]=0,s[a+48>>2]=0,s[a+36>>2]=0,s[a+40>>2]=0,s[a+28>>2]=0,s[a+32>>2]=0,s[a+20>>2]=0,s[a+24>>2]=0,s[a+12>>2]=0,s[a+16>>2]=0,s[r+24>>2]=p,s[r+68>>2]=0,s[r+72>>2]=0,s[r+60>>2]=0,s[r+64>>2]=0,s[r+52>>2]=0,s[r+56>>2]=0,s[r+44>>2]=0,s[r+48>>2]=0,s[r+84>>2]=0,s[r+88>>2]=0,s[r+76>>2]=0,s[r+80>>2]=0,s[r+28>>2]=a,c=s[r+28>>2],s[r+8>>2]=s[r+24>>2],s[r+12>>2]=c,u=u+4|0,s[r+16>>2]=u,s[r+20>>2]=b,s[r+36>>2]=0,s[r+40>>2]=0,s[r+32>>2]=8652,c=s[r+20>>2],s[r>>2]=s[r+16>>2],s[r+4>>2]=c,vt(b=r+32|0,u,r),Oe(c=a+8|0,b),(0|c)!=(0|b)&&Ye(a+56|0,s[b+48>>2],s[b+52>>2]),ar(b)}a=Ut(ur(64),a),m=s[e+4>>2],e=a;t:{r:{if((0|(a=t))>=0){if(u=m+8|0,!((0|(p=(t=s[m+12>>2])-(c=s[m+8>>2])>>2))>(0|a)))if(b=a+1|0,a>>>0>=p>>>0)Le(u,b-p|0);else if(!(p>>>0<=b>>>0)){if((0|(c=c+(b<<2)|0))!=(0|t))for(;b=s[(t=t-4|0)>>2],s[t>>2]=0,b&&vn[s[s[b>>2]+4>>2]](b),(0|t)!=(0|c););s[m+12>>2]=c}if(c=s[u>>2]+(a<<2)|0,t=s[c>>2],s[c>>2]=e,t)break r;break t}if(t=e,!e)break t}vn[s[s[t>>2]+4>>2]](t)}b=(-1^a)>>>31|0}return N=r+96|0,0|b}function F(e){var t,r=0,n=0,i=0,o=0,a=0;if(N=t=N-16|0,s[t+12>>2]=e,e>>>0<=211)i=s[zt(10384,10576,t+12|0)>>2];else{for(e>>>0>=4294967292&&(hn(),T()),i=h(o=(e>>>0)/210|0,210),s[t+8>>2]=e-i,a=zt(10576,10768,t+8|0)-10576>>2;;){i=s[10576+(a<<2)>>2]+i|0,e=5;e:{for(;;){t:if(47!=(0|e)){if((r=s[10384+(e<<2)>>2])>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if(e=e+1|0,(0|h(r,n))!=(0|i))continue}else for(e=211;;){if((r=(i>>>0)/(e>>>0)|0)>>>0<e>>>0)break e;if((0|h(e,r))==(0|i))break t;if((r=e+10|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+12|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+16|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+18|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+22|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+28|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+30|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+36|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+40|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+42|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+46|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+52|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+58|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+60|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+66|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+70|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+72|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+78|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+82|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+88|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+96|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+100|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+102|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+106|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+108|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+112|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+120|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+126|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+130|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+136|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+138|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+142|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+148|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+150|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+156|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+162|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+166|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+168|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+172|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+178|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+180|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+186|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+190|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+192|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+196|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+198|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if((0|h(r,n))==(0|i))break t;if((r=e+208|0)>>>0>(n=(i>>>0)/(r>>>0)|0)>>>0)break e;if(e=e+210|0,(0|h(r,n))==(0|i))break}break}a=(e=48==(0|(i=a+1|0)))?0:i,i=h(o=e+o|0,210);continue}break}s[t+12>>2]=i}return N=t+16|0,i}function G(e,t,r,n){var i=0,a=0,c=0,l=0,h=b(0),g=0;e:if(n){t:{r:switch(s[e+28>>2]-1|0){case 0:n:if(!((0|((0|r)<(0|(i=o[e+24|0]))?r:i))<=0)){if(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0,a=s[e>>2],i=s[a>>2],(0|t)>=(s[a+4>>2]-i|0))break e;for(a=t+i|0,t=0;;){if(o[t+n|0]=d[0|a],(0|(t=t+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break n;if(!((a=a+1|0)>>>0<u[s[e>>2]+4>>2]))break}break e}if(c=1,(0|r)>(0|i))break t;break e;case 1:n:if(!((0|((0|r)<(0|(i=o[e+24|0]))?r:i))<=0)){if(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0,a=s[e>>2],i=s[a>>2],(0|t)>=(s[a+4>>2]-i|0))break e;for(a=t+i|0,t=0;;){if((0|(i=o[0|a]))<0)break e;if(o[t+n|0]=i,(0|(t=t+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break n;if(!((a=a+1|0)>>>0<u[s[e>>2]+4>>2]))break}break e}if(c=1,(0|r)>(0|i))break t;break e;case 2:n:if(!((0|((0|r)<(0|(i=o[e+24|0]))?r:i))<=0)){if(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0,a=s[e>>2],i=s[a>>2],(0|t)>=(s[a+4>>2]-i|0))break e;for(a=t+i|0,t=0;;){if(((i=f[a>>1])-128&65535)>>>0<65280)break e;if(o[t+n|0]=i,(0|(t=t+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break n;if(!((a=a+2|0)>>>0<u[s[e>>2]+4>>2]))break}break e}if(c=1,(0|r)>(0|i))break t;break e;case 3:n:if(!((0|((0|r)<(0|(i=o[e+24|0]))?r:i))<=0)){if(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0,a=s[e>>2],i=s[a>>2],(0|t)>=(s[a+4>>2]-i|0))break e;for(a=t+i|0,t=0;;){if((i=f[a>>1])>>>0>127)break e;if(o[t+n|0]=i,(0|(t=t+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break n;if(!((a=a+2|0)>>>0<u[s[e>>2]+4>>2]))break}break e}if(c=1,(0|r)>(0|i))break t;break e;case 4:n:if(!((0|((0|r)<(0|(i=o[e+24|0]))?r:i))<=0)){if(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0,a=s[e>>2],i=s[a>>2],(0|t)>=(s[a+4>>2]-i|0))break e;for(a=t+i|0,t=0;;){if((i=s[a>>2])-128>>>0<4294967040)break e;if(o[t+n|0]=i,(0|(t=t+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break n;if(!((a=a+4|0)>>>0<u[s[e>>2]+4>>2]))break}break e}if(c=1,(0|r)>(0|i))break t;break e;case 5:n:if(!((0|((0|r)<(0|(i=o[e+24|0]))?r:i))<=0)){if(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0,a=s[e>>2],i=s[a>>2],(0|t)>=(s[a+4>>2]-i|0))break e;for(a=t+i|0,t=0;;){if((i=s[a>>2])>>>0>127)break e;if(o[t+n|0]=i,(0|(t=t+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break n;if(!((a=a+4|0)>>>0<u[s[e>>2]+4>>2]))break}break e}if(c=1,(0|r)>(0|i))break t;break e;case 6:n:if(!((0|((0|r)<(0|(i=o[e+24|0]))?r:i))<=0)){if(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0,a=s[e>>2],i=s[a>>2],(0|t)>=(s[a+4>>2]-i|0))break e;for(a=t+i|0,t=0;;){if(l=s[a>>2],-1==(0|(i=s[a+4>>2]-(l>>>0<128)|0))&l-128>>>0<4294967040|-1!=(0|i))break e;if(o[t+n|0]=l,(0|(t=t+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break n;if(!((a=a+8|0)>>>0<u[s[e>>2]+4>>2]))break}break e}if(c=1,(0|r)>(0|i))break t;break e;case 7:n:if(!((0|((0|r)<(0|(i=o[e+24|0]))?r:i))<=0)){if(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0,a=s[e>>2],i=s[a>>2],(0|t)>=(s[a+4>>2]-i|0))break e;for(a=t+i|0,t=0;;){if(!(i=s[a+4>>2])&(l=s[a>>2])>>>0>127|i)break e;if(o[t+n|0]=l,(0|(t=t+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break n;if(!((a=a+8|0)>>>0<u[s[e>>2]+4>>2]))break}break e}if(c=1,(0|r)>(0|i))break t;break e;case 8:n:if(!((0|((0|r)<(0|(i=o[e+24|0]))?r:i))<=0)){if(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0,a=s[e>>2],i=s[a>>2],(0|t)>=(s[a+4>>2]-i|0))break e;for(a=t+i|0,t=0;;){if(l=t+n|0,h=p[a>>2],i=b(v(h))<b(2147483648)?~~h:-2147483648,o[0|l]=i,(0|(t=t+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break n;if(!((a=a+4|0)>>>0<u[s[e>>2]+4>>2]))break}break e}if(c=1,(0|r)>(0|i))break t;break e;case 9:n:if(!((0|((0|r)<(0|(i=o[e+24|0]))?r:i))<=0)){if(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0,a=s[e>>2],i=s[a>>2],(0|t)>=(s[a+4>>2]-i|0))break e;for(a=t+i|0,t=0;;){if(l=t+n|0,g=m[a>>3],i=v(g)<2147483648?~~g:-2147483648,o[0|l]=i,(0|(t=t+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break n;if(!((a=a+8|0)>>>0<u[s[e>>2]+4>>2]))break}break e}if(c=1,(0|r)>(0|i))break t;break e;case 10:break r;default:break e}r:if(!((0|((0|r)<(0|(i=o[e+24|0]))?r:i))<=0)){if(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0,a=s[e>>2],i=s[a>>2],(0|t)>=(s[a+4>>2]-i|0))break e;for(a=t+i|0,t=0;;){if(o[t+n|0]=d[0|a],(0|(t=t+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break r;if(!((a=a+1|0)>>>0<u[s[e>>2]+4>>2]))break}break e}if(c=1,(0|r)<=(0|i))break e}We(n+i|0,0,r-i|0)}return c}function U(e,t,r,n){var i=0,a=0,c=0,l=0,h=b(0),v=0;e:if(n){t:{r:switch(s[e+28>>2]-1|0){case 0:n:if(!((0|((0|r)<(0|(i=o[e+24|0]))?r:i))<=0)){if(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0,a=s[e>>2],i=s[a>>2],(0|t)>=(s[a+4>>2]-i|0))break e;for(a=t+i|0,t=0;;){if((0|(i=o[0|a]))<0)break e;if(o[t+n|0]=i,(0|(t=t+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break n;if(!((a=a+1|0)>>>0<u[s[e>>2]+4>>2]))break}break e}if(c=1,(0|r)>(0|i))break t;break e;case 1:n:if(!((0|((0|r)<(0|(i=o[e+24|0]))?r:i))<=0)){if(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0,a=s[e>>2],i=s[a>>2],(0|t)>=(s[a+4>>2]-i|0))break e;for(a=t+i|0,t=0;;){if(o[t+n|0]=d[0|a],(0|(t=t+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break n;if(!((a=a+1|0)>>>0<u[s[e>>2]+4>>2]))break}break e}if(c=1,(0|r)>(0|i))break t;break e;case 2:n:if(!((0|((0|r)<(0|(i=o[e+24|0]))?r:i))<=0)){if(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0,a=s[e>>2],i=s[a>>2],(0|t)>=(s[a+4>>2]-i|0))break e;for(a=t+i|0,t=0;;){if((i=f[a>>1])>>>0>255)break e;if(o[t+n|0]=i,(0|(t=t+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break n;if(!((a=a+2|0)>>>0<u[s[e>>2]+4>>2]))break}break e}if(c=1,(0|r)>(0|i))break t;break e;case 3:n:if(!((0|((0|r)<(0|(i=o[e+24|0]))?r:i))<=0)){if(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0,a=s[e>>2],i=s[a>>2],(0|t)>=(s[a+4>>2]-i|0))break e;for(a=t+i|0,t=0;;){if((i=f[a>>1])>>>0>255)break e;if(o[t+n|0]=i,(0|(t=t+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break n;if(!((a=a+2|0)>>>0<u[s[e>>2]+4>>2]))break}break e}if(c=1,(0|r)>(0|i))break t;break e;case 4:n:if(!((0|((0|r)<(0|(i=o[e+24|0]))?r:i))<=0)){if(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0,a=s[e>>2],i=s[a>>2],(0|t)>=(s[a+4>>2]-i|0))break e;for(a=t+i|0,t=0;;){if((i=s[a>>2])>>>0>255)break e;if(o[t+n|0]=i,(0|(t=t+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break n;if(!((a=a+4|0)>>>0<u[s[e>>2]+4>>2]))break}break e}if(c=1,(0|r)>(0|i))break t;break e;case 5:n:if(!((0|((0|r)<(0|(i=o[e+24|0]))?r:i))<=0)){if(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0,a=s[e>>2],i=s[a>>2],(0|t)>=(s[a+4>>2]-i|0))break e;for(a=t+i|0,t=0;;){if((i=s[a>>2])>>>0>255)break e;if(o[t+n|0]=i,(0|(t=t+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break n;if(!((a=a+4|0)>>>0<u[s[e>>2]+4>>2]))break}break e}if(c=1,(0|r)>(0|i))break t;break e;case 6:n:if(!((0|((0|r)<(0|(i=o[e+24|0]))?r:i))<=0)){if(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0,a=s[e>>2],i=s[a>>2],(0|t)>=(s[a+4>>2]-i|0))break e;for(a=t+i|0,t=0;;){if(!(i=s[a+4>>2])&(l=s[a>>2])>>>0>255|i)break e;if(o[t+n|0]=l,(0|(t=t+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break n;if(!((a=a+8|0)>>>0<u[s[e>>2]+4>>2]))break}break e}if(c=1,(0|r)>(0|i))break t;break e;case 7:n:if(!((0|((0|r)<(0|(i=o[e+24|0]))?r:i))<=0)){if(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0,a=s[e>>2],i=s[a>>2],(0|t)>=(s[a+4>>2]-i|0))break e;for(a=t+i|0,t=0;;){if(!(i=s[a+4>>2])&(l=s[a>>2])>>>0>255|i)break e;if(o[t+n|0]=l,(0|(t=t+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break n;if(!((a=a+8|0)>>>0<u[s[e>>2]+4>>2]))break}break e}if(c=1,(0|r)>(0|i))break t;break e;case 8:n:if(!((0|((0|r)<(0|(i=o[e+24|0]))?r:i))<=0)){if(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0,a=s[e>>2],i=s[a>>2],(0|t)>=(s[a+4>>2]-i|0))break e;for(a=t+i|0,t=0;;){if(l=t+n|0,i=(h=p[a>>2])<b(4294967296)&h>=b(0)?~~h>>>0:0,o[0|l]=i,(0|(t=t+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break n;if(!((a=a+4|0)>>>0<u[s[e>>2]+4>>2]))break}break e}if(c=1,(0|r)>(0|i))break t;break e;case 9:n:if(!((0|((0|r)<(0|(i=o[e+24|0]))?r:i))<=0)){if(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0,a=s[e>>2],i=s[a>>2],(0|t)>=(s[a+4>>2]-i|0))break e;for(a=t+i|0,t=0;;){if(l=t+n|0,i=(v=m[a>>3])<4294967296&v>=0?~~v>>>0:0,o[0|l]=i,(0|(t=t+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break n;if(!((a=a+8|0)>>>0<u[s[e>>2]+4>>2]))break}break e}if(c=1,(0|r)>(0|i))break t;break e;case 10:break r;default:break e}r:if(!((0|((0|r)<(0|(i=o[e+24|0]))?r:i))<=0)){if(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0,a=s[e>>2],i=s[a>>2],(0|t)>=(s[a+4>>2]-i|0))break e;for(a=t+i|0,t=0;;){if(o[t+n|0]=d[0|a],(0|(t=t+1|0))>=(0|((0|r)<(0|(i=o[e+24|0]))?r:i)))break r;if(!((a=a+1|0)>>>0<u[s[e>>2]+4>>2]))break}break e}if(c=1,(0|r)<=(0|i))break e}We(n+i|0,0,r-i|0)}return c}function V(e,t){var r=0,n=0,i=0,o=0,a=0,c=0,l=0,d=0,f=0,u=0;e:{t:{r:{n:{i:if(s[e+92>>2]!=s[e+88>>2]){if((0|(r=s[e+52>>2]))==s[e+56>>2]){if((i=1+(n=(c=r-(a=s[e+48>>2])|0)>>2)|0)>>>0>=1073741824)break t;if(r=c>>1,o=n>>>0<536870911?r>>>0<i>>>0?i:r:1073741823){if(o>>>0>=1073741824)break e;r=ur(o<<2)}else r=0;s[(i=r+(n<<2)|0)>>2]=t,(0|c)>0&&ye(r,a,c),s[e+56>>2]=r+(o<<2),s[e+52>>2]=i+4,s[e+48>>2]=r,a&&ee(a)}else s[r>>2]=t,s[e+52>>2]=r+4;s[e+84>>2]=0,i=-1,r=-1;o:if(-1!=(0|t)){if(o=s[e+4>>2],-1!=(0|(r=((r=t+1|0)>>>0)%3|0?r:t-2|0))&&(i=s[s[o>>2]+(r<<2)>>2]),(t>>>0)%3|0)n=t-1|0;else if(r=-1,-1==(0|(n=t+2|0)))break o;r=s[s[o>>2]+(n<<2)>>2]}if(d=r>>>3&536870908,n=s[e+36>>2],(c=s[(a=n+(i>>>3&536870908)|0)>>2])&(o=1<<i)||(s[a>>2]=o|c,Me(o=e+8|0,i,n=-1!=(0|t)?((n=t+1|0)>>>0)%3|0?n:t-2|0:-1),n=s[e+36>>2]),(n=s[(o=n+d|0)>>2])&(i=1<<r)||(s[o>>2]=n|i,i=-1,-1!=(0|t)&&(i=t-1|0,(t>>>0)%3|0||(i=t+2|0)),Me(n=e+8|0,r,i)),i=-1,i=-1!=(0|t)?s[s[s[e+4>>2]>>2]+(t<<2)>>2]:i,o=s[e+36>>2]+(i>>>3&536870908)|0,(n=s[o>>2])&(r=1<<i)||(s[o>>2]=r|n,Me(e+8|0,i,t)),!((0|(n=s[e+84>>2]))>2))for(;;){if(i=h(n,12)+e|0,(0|(t=s[i+52>>2]))==s[i+48>>2]){if(3!=(0|(n=n+1|0)))continue;break i}if(t=s[(r=t-4|0)>>2],s[i+52>>2]=r,s[e+84>>2]=n,-1==(0|t))break i;i=s[e+24>>2];o:if(!(s[i+((r=(t>>>0)/3|0)>>>3&268435452)>>2]>>>r&1)){a:{for(;;){s[(r=((u=(t>>>0)/3|0)>>>3&268435452)+i|0)>>2]=s[r>>2]|1<<u,i=-1;s:{c:{l:{d:{f:{u:{p:{m:{if(i=-1!=(0|t)?s[s[s[e+4>>2]>>2]+(t<<2)>>2]:i,o=s[e+36>>2]+(i>>>3&536870908)|0,!((n=s[o>>2])&(r=1<<i))){if(s[o>>2]=r|n,c=s[(s[s[e+16>>2]+96>>2]+h(u,12)|0)+((t>>>0)%3<<2)>>2],f=s[s[e+20>>2]+4>>2],(0|(r=s[f+4>>2]))==s[f+8>>2]){if((n=1+(o=(d=r-(l=s[f>>2])|0)>>2)|0)>>>0>=1073741824)break m;if(r=d>>1,a=o>>>0<536870911?r>>>0<n>>>0?n:r:1073741823){if(a>>>0>=1073741824)break e;r=ur(a<<2)}else r=0;s[(n=r+(o<<2)|0)>>2]=c,(0|d)>0&&ye(r,l,d),s[f+8>>2]=r+(a<<2),s[f+4>>2]=n+4,s[f>>2]=r,l&&ee(l)}else s[r>>2]=c,s[f+4>>2]=r+4;if(l=s[e+12>>2],(0|(r=s[l+4>>2]))==s[l+8>>2]){if((n=1+(o=(a=r-(d=s[l>>2])|0)>>2)|0)>>>0>=1073741824)break p;if(r=a>>1,c=o>>>0<536870911?r>>>0<n>>>0?n:r:1073741823){if(c>>>0>=1073741824)break e;r=ur(c<<2)}else r=0;s[(n=r+(o<<2)|0)>>2]=t,(0|a)>0&&ye(r,d,a),s[l+8>>2]=r+(c<<2),s[l+4>>2]=n+4,s[l>>2]=r,d&&ee(d)}else s[r>>2]=t,s[l+4>>2]=r+4;r=s[e+12>>2],s[s[r+12>>2]+(i<<2)>>2]=s[r+24>>2],s[r+24>>2]=s[r+24>>2]+1}if(-1==(0|t))break a;a=s[e+4>>2],i=-1,-1!=(0|(r=((r=t+1|0)>>>0)%3|0?r:t-2|0))&&(i=s[s[a+12>>2]+(r<<2)>>2]);h:{if((0|h(u,3))==(0|t)){if(o=t+2|0,t=-1,-1==(0|o))break h}else o=t-1|0;t=s[s[a+12>>2]+(o<<2)>>2]}if(c=-1==(0|t),o=(t>>>0)/3|0,n=(i>>>0)/3|0,!(r=-1==(0|i))){if(r=r?-1:n,r=s[s[e+24>>2]+(r>>>3&536870908)>>2]&1<<r,c)break u;u=0!=(0|r);break f}if(u=1,!c)break f;break a}nn(),T()}nn(),T()}if(!r)break d;break a}if(r=c?-1:o,!(s[s[e+24>>2]+(r>>>3&536870908)>>2]>>>r&1)){if(o=0,r=s[s[a>>2]+(t<<2)>>2],s[s[e+36>>2]+(r>>>3&536870908)>>2]>>>r&1||(r=s[e+88>>2]+(r<<2)|0,n=s[r>>2],s[r>>2]=n+1,o=(0|n)<=0?2:1),s[e+84>>2]>=(0|o)&&u)break c;if(f=h(o,12)+e|0,(0|(r=s[f+52>>2]))==s[f+56>>2]){if((n=1+(c=(d=r-(l=s[f+48>>2])|0)>>2)|0)>>>0>=1073741824)break n;if(r=d>>1,a=c>>>0<536870911?r>>>0<n>>>0?n:r:1073741823){if(a>>>0>=1073741824)break e;r=ur(a<<2)}else r=0;s[(n=r+(c<<2)|0)>>2]=t,(0|d)>0&&ye(r,l,d),s[f+48>>2]=r,s[f+52>>2]=n+4,s[f+56>>2]=r+(a<<2),l&&ee(l)}else s[r>>2]=t,s[f+52>>2]=r+4;s[e+84>>2]<=(0|o)||(s[e+84>>2]=o)}if(u)break a;if(t=-1,-1==(0|i))break l}t=s[s[s[e+4>>2]>>2]+(i<<2)>>2]}if(o=0,s[s[e+36>>2]+(t>>>3&536870908)>>2]>>>t&1||(t=s[e+88>>2]+(t<<2)|0,r=s[t>>2],s[t>>2]=r+1,o=(0|r)<=0?2:1),s[e+84>>2]<(0|o))break s;t=i}i=s[e+24>>2];continue}break}if(l=h(o,12)+e|0,(0|(t=s[l+52>>2]))==s[l+56>>2]){if((r=1+(n=(a=t-(d=s[l+48>>2])|0)>>2)|0)>>>0>=1073741824)break r;if(t=a>>1,c=n>>>0<536870911?t>>>0<r>>>0?r:t:1073741823){if(c>>>0>=1073741824)break e;t=ur(c<<2)}else t=0;s[(r=t+(n<<2)|0)>>2]=i,(0|a)>0&&ye(t,d,a),s[l+48>>2]=t,s[l+52>>2]=r+4,s[l+56>>2]=t+(c<<2),d&&ee(d)}else s[t>>2]=i,s[l+52>>2]=t+4;if((0|(n=s[e+84>>2]))<=(0|o))break o;s[e+84>>2]=o,n=o;break o}n=s[e+84>>2]}if(!((0|n)<3))break}}return 1}nn(),T()}nn(),T()}nn(),T()}qt(1326),T()}function L(e,t){var r,n=0,i=0,o=0,a=0,c=0,l=0,d=0,f=0,u=0,p=0,m=0,b=0,v=0,g=0,A=0,_=0,x=0,y=0,k=0;if(N=r=N-48|0,n=s[s[e+4>>2]+44>>2],i=s[e+8>>2],a=s[i>>2],i=s[i+4>>2],s[r+40>>2]=0,s[r+32>>2]=0,s[r+36>>2]=0,i=(i-a>>2>>>0)/3|0,d=s[n+96>>2],i>>>0>(a=(s[n+100>>2]-d|0)/12|0)>>>0?pe(n+96|0,i-a|0,r+32|0):i>>>0>=a>>>0||(s[n+100>>2]=d+h(i,12)),s[e+216>>2]!=s[e+220>>2]){s[r+24>>2]=0,s[r+16>>2]=0,s[r+20>>2]=0,f=s[e+8>>2],t=s[f>>2],n=s[f+4>>2],s[r+8>>2]=0,s[r>>2]=0,s[r+4>>2]=0;e:{t:{r:{n:{i:{o:{a:{if(t=n-t|0){if((0|t)<0)break a;m=ur(t),s[r>>2]=m,s[r+8>>2]=(t>>2<<2)+m,y=r,k=We(m,0,t)+t|0,s[y+4>>2]=k}if(n=s[f+24>>2],(s[f+28>>2]-n|0)<=0){i=0,t=0;break t}for(i=0,a=0,t=0;;){s:if(-1!=(0|(d=s[(b<<2)+n>>2]))){c:if(!(s[s[e+120>>2]+(b>>>3&536870908)>>2]>>>b&1)&&(g=s[e+216>>2],n=s[e+220>>2]-g|0))for(A=(n=(0|n)/144|0)>>>0>1?n:1,u=0,_=0!=(0|(n=(d>>>0)%3|0))|-1!=(0|(c=d+2|0)),x=n?d-1|0:c;;){if(l=d<<2,o=g+h(u,144)|0,n=s[l+s[s[o+68>>2]>>2]>>2],s[s[o+16>>2]+(n>>>3&536870908)>>2]>>>n&1&&(n=-1,_&&(n=-1,-1!=(0|(c=s[s[f+12>>2]+(x<<2)>>2]))&&(n=c-1|0,(c>>>0)%3|0||(n=c+2|0))),(0|d)!=(0|n)))for(o=s[o+32>>2],c=s[o+l>>2];;){if(p=0,-1==(0|n))break e;if(s[o+(n<<2)>>2]!=(0|c)){d=n;break c}l:{if((n>>>0)%3|0)l=n-1|0;else if(p=-1,-1==(0|(l=n+2|0)))break l;p=-1,-1!=(0|(n=s[s[f+12>>2]+(l<<2)>>2]))&&(p=n-1|0,(n>>>0)%3|0||(p=n+2|0))}if((0|d)==(0|(n=p)))break}if((0|A)==(0|(u=u+1|0)))break}if(c=(n=t-a|0)>>2,s[(d<<2)+m>>2]=c,t>>>0<v>>>0)s[t>>2]=d,t=t+4|0,s[r+20>>2]=t;else{if((t=c+1|0)>>>0>=1073741824)break o;if(o=(i=v-a|0)>>1,t=i>>2>>>0<536870911?t>>>0>o>>>0?t:o:1073741823){if(t>>>0>=1073741824)break i;i=ur(t<<2)}else i=0;s[(c=i+(c<<2)|0)>>2]=d,v=(t<<2)+i|0,t=c+4|0,(0|n)>0&&ye(i,a,n),s[r+24>>2]=v,s[r+20>>2]=t,s[r+16>>2]=i,a&&(ee(a),f=s[e+8>>2]),a=i}if(-1!=(0|d)){if((d>>>0)%3|0)n=d-1|0;else if(-1==(0|(n=d+2|0)))break s;if(-1!=(0|(n=s[s[f+12>>2]+(n<<2)>>2]))&&-1!=(0|(n=n+((n>>>0)%3|0?-1:2)|0))&&(0|n)!=(0|(o=d)))for(;;){c=n;c:{l:if(l=s[e+216>>2],n=s[e+220>>2]-l|0){for(u=(n=(0|n)/144|0)>>>0>1?n:1,n=0;;){if(g=s[32+(l+h(n,144)|0)>>2],s[g+(A=c<<2)>>2]==s[g+(o<<2)>>2]){if((0|u)!=(0|(n=n+1|0)))continue;break l}break}if(o=(n=t-i|0)>>2,s[m+A>>2]=o,t>>>0<v>>>0){s[t>>2]=c,t=t+4|0,s[r+20>>2]=t,a=i;break c}if((t=o+1|0)>>>0>=1073741824)break n;if(l=(a=v-i|0)>>1,t=a>>2>>>0<536870911?t>>>0>l>>>0?t:l:1073741823){if(t>>>0>=1073741824)break r;a=ur(t<<2)}else a=0;if(s[(o=a+(o<<2)|0)>>2]=c,v=(t<<2)+a|0,t=o+4|0,(0|n)>0&&ye(a,i,n),s[r+24>>2]=v,s[r+20>>2]=t,s[r+16>>2]=a,!i){i=a;break c}ee(i),f=s[e+8>>2],i=a;break c}s[(c<<2)+m>>2]=s[(o<<2)+m>>2]}if(-1==(0|c))break s;if((c>>>0)%3|0)n=c-1|0;else if(-1==(0|(n=c+2|0)))break s;if(-1==(0|(n=s[s[f+12>>2]+(n<<2)>>2])))break s;if(-1==(0|(n=n+((n>>>0)%3|0?-1:2)|0)))break s;if(o=c,(0|n)==(0|d))break}}}if(b=b+1|0,n=s[f+24>>2],!((0|b)<s[f+28>>2]-n>>2))break}break t}nn(),T()}nn(),T()}qt(1326),T()}nn(),T()}qt(1326),T()}if(b=s[e+4>>2],l=s[b+44>>2],(0|(u=s[l+100>>2]))!=s[l+96>>2])for(n=0;a=n+1|0,c=h(n,12),o=s[8+(d=c+m|0)>>2],f=s[d+4>>2],d=s[d>>2],(p=n)>>>0>=(u=(u-(n=s[l+96>>2])|0)/12|0)>>>0&&(s[r+40>>2]=0,s[r+32>>2]=0,s[r+36>>2]=0,pe(l+96|0,a-u|0,r+32|0),b=s[e+4>>2],n=s[l+96>>2]),s[8+(n=n+c|0)>>2]=o,s[n+4>>2]=f,s[n>>2]=d,n=a,l=s[b+44>>2],n>>>0<((u=s[l+100>>2])-s[l+96>>2]|0)/12>>>0;);s[s[b+4>>2]+80>>2]=t-i>>2,p=1}n=p,m&&ee(m),i&&(s[r+20>>2]=i,ee(i))}else{if(f=s[e+4>>2],l=s[f+44>>2],(0|(i=s[l+100>>2]))!=s[l+96>>2])for(n=0;;){c=s[e+8>>2];e:{if(-1!=(0|(o=h(n,3))))if(u=-1,d=s[s[c>>2]+(o<<2)>>2],-1!=(0|(a=o+1|0))){if(u=s[s[c>>2]+(a<<2)>>2],a=-1,-1==(0|(o=o+2|0)))break e}else o=0;else u=s[4+(s[c>>2]+(o<<2)|0)>>2],d=-1,o=1;a=s[s[c>>2]+(o<<2)>>2]}if(c=a,a=n+1|0,(o=((o=i)-(i=s[l+96>>2])|0)/12|0)>>>0<=n>>>0&&(s[r+40>>2]=0,s[r+32>>2]=0,s[r+36>>2]=0,pe(l+96|0,a-o|0,r+32|0),f=s[e+4>>2],i=s[l+96>>2]),n=h(n,12)+i|0,s[n+8>>2]=c,s[n+4>>2]=u,s[n>>2]=d,n=a,l=s[f+44>>2],!(n>>>0<((i=s[l+100>>2])-s[l+96>>2]|0)/12>>>0))break}s[s[f+4>>2]+80>>2]=t,n=1}return N=r+48|0,n}function j(e,t,r,n){var i=0,c=0,l=0,u=0,h=b(0),g=0,_=0;e:if(n){t:{r:switch(s[e+28>>2]-1|0){case 0:if((0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(l=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,u=s[i+4>>2];;){if(t>>>0>=u>>>0)break e;if(i=(c<<3)+n|0,l=o[0|t],s[i>>2]=l,s[i+4>>2]=l>>31,t=t+1|0,!((0|(c=c+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break t;break e;case 1:if((0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(l=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,u=s[i+4>>2];;){if(t>>>0>=u>>>0)break e;if(s[(i=(c<<3)+n|0)>>2]=d[0|t],s[i+4>>2]=0,t=t+1|0,!((0|(c=c+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break t;break e;case 2:if((0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(l=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,u=s[i+4>>2];;){if(t>>>0>=u>>>0)break e;if(i=(c<<3)+n|0,l=a[t>>1],s[i>>2]=l,s[i+4>>2]=l>>31,t=t+2|0,!((0|(c=c+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break t;break e;case 3:if((0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(l=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,u=s[i+4>>2];;){if(t>>>0>=u>>>0)break e;if(s[(i=(c<<3)+n|0)>>2]=f[t>>1],s[i+4>>2]=0,t=t+2|0,!((0|(c=c+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break t;break e;case 4:if((0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(l=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,u=s[i+4>>2];;){if(t>>>0>=u>>>0)break e;if(i=(c<<3)+n|0,l=s[t>>2],s[i>>2]=l,s[i+4>>2]=l>>31,t=t+4|0,!((0|(c=c+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break t;break e;case 5:if((0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(l=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,u=s[i+4>>2];;){if(t>>>0>=u>>>0)break e;if(s[(i=(c<<3)+n|0)>>2]=s[t>>2],s[i+4>>2]=0,t=t+4|0,!((0|(c=c+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break t;break e;case 6:if((0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(l=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,u=s[i+4>>2];;){if(t>>>0>=u>>>0)break e;if(l=s[t+4>>2],s[(i=(c<<3)+n|0)>>2]=s[t>>2],s[i+4>>2]=l,t=t+8|0,!((0|(c=c+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break t;break e;case 7:if((0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(l=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,u=s[i+4>>2];;){if(t>>>0>=u>>>0)break e;if(i=s[t>>2],(0|(l=s[t+4>>2]))<0)break e;if(s[(_=(c<<3)+n|0)>>2]=i,s[_+4>>2]=l,t=t+8|0,!((0|(c=c+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break t;break e;case 8:if((0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(l=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,_=s[i+4>>2];;){if(t>>>0>=_>>>0)break e;if(i=(c<<3)+n|0,h=p[t>>2],b(v(h))<b(0x8000000000000000)?(l=b(v(h))>=b(1)?~~(h>b(0)?b(A(b(x(b(h*b(2.3283064365386963e-10)))),b(4294967296))):b(y(b(b(h-b(~~h>>>0>>>0))*b(2.3283064365386963e-10)))))>>>0:0,u=~~h>>>0):(l=-2147483648,u=0),s[i>>2]=u,s[i+4>>2]=l,t=t+4|0,!((0|(c=c+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break t;break e;case 9:if((0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(l=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,_=s[i+4>>2];;){if(t>>>0>=_>>>0)break e;if(i=(c<<3)+n|0,g=m[t>>3],v(g)<0x8000000000000000?(l=v(g)>=1?~~(g>0?A(x(2.3283064365386963e-10*g),4294967295):y(2.3283064365386963e-10*(g-+(~~g>>>0>>>0))))>>>0:0,u=~~g>>>0):(l=-2147483648,u=0),s[i>>2]=u,s[i+4>>2]=l,t=t+8|0,!((0|(c=c+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break t;break e;case 10:break r;default:break e}if((0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(l=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,u=s[i+4>>2];;){if(t>>>0>=u>>>0)break e;if(s[(i=(c<<3)+n|0)>>2]=d[0|t],s[i+4>>2]=0,t=t+1|0,!((0|(c=c+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)<=(0|i))break e}We((i<<3)+n|0,0,r-i<<3)}}function W(e,t,r){t|=0,r|=0;var n,i=0,a=0,c=0,l=0,f=0,u=0,p=0,m=0,h=0,b=0,v=0,g=0,A=0,_=0,x=0,y=0,k=0,w=0,C=0,M=0;N=n=N-96|0,a=s[16+(e|=0)>>2],o[n+92|0]=1,s[n+88>>2]=t,s[n+84>>2]=t,s[n+80>>2]=a,h=s[e+20>>2],i=s[h>>2];e:{t:{if((a=s[s[a+28>>2]+(t<<2)>>2])>>>0<s[h+4>>2]-i>>2>>>0){if(i=s[s[e+8>>2]+(s[i+(a<<2)>>2]<<2)>>2],a=s[e+4>>2],d[a+84|0]||(i=s[s[a+68>>2]+(i<<2)>>2]),s[n+72>>2]=0,s[n+76>>2]=0,s[(h=n- -64|0)>>2]=0,s[h+4>>2]=0,s[n+56>>2]=0,s[n+60>>2]=0,j(a,i,o[a+24|0],n+56|0),i=((a=t+1|0)>>>0)%3|0,t>>>0<=a>>>0)for(h=i?a:t-2|0,l=((t>>>0)%3|0?-1:2)+t|0;;){if(i=h,a=l,s[e+28>>2]&&(i=((a=t+1|0)>>>0)%3|0?a:t-2|0,a=t-1|0,(t>>>0)%3|0||(a=t+2|0)),p=s[e+20>>2],t=s[p>>2],(i=s[s[s[e+16>>2]+28>>2]+(i<<2)>>2])>>>0>=s[p+4>>2]-t>>2>>>0)break t;if(i=s[s[e+8>>2]+(s[t+(i<<2)>>2]<<2)>>2],t=s[e+4>>2],d[t+84|0]||(i=s[s[t+68>>2]+(i<<2)>>2]),s[n+48>>2]=0,s[n+52>>2]=0,s[n+40>>2]=0,s[n+44>>2]=0,s[n+32>>2]=0,s[n+36>>2]=0,j(t,i,o[t+24|0],n+32|0),i=s[e+20>>2],t=s[i>>2],(a=s[s[s[e+16>>2]+28>>2]+(a<<2)>>2])>>>0>=s[i+4>>2]-t>>2>>>0)break e;i=s[s[e+8>>2]+(s[t+(a<<2)>>2]<<2)>>2],t=s[e+4>>2],d[t+84|0]||(i=s[s[t+68>>2]+(i<<2)>>2]),s[n+24>>2]=0,s[n+28>>2]=0,s[n+16>>2]=0,s[n+20>>2]=0,s[n+8>>2]=0,s[n+12>>2]=0,j(t,i,o[t+24|0],n+8|0),i=(a=s[n+8>>2])-(t=s[n+56>>2])|0,p=s[n+60>>2],b=s[n+12>>2]-(p+(t>>>0>a>>>0)|0)|0,x=(f=s[n+40>>2])-(a=s[n+64>>2])|0,y=s[n+68>>2],k=Ht(i,b,x,f=s[n+44>>2]-(y+(a>>>0>f>>>0)|0)|0),c=c-(R+(u>>>0<k>>>0)|0)|0,C=w=u-k|0,a=Ht(k=(u=s[n+16>>2])-a|0,y=s[n+20>>2]-((a>>>0>u>>>0)+y|0)|0,w=(u=s[n+32>>2])-t|0,p=s[n+36>>2]-((t>>>0>u>>>0)+p|0)|0),t=R+c|0,c=t=a>>>0>(u=C+a|0)>>>0?t+1|0:t,C=v,g=b,b=(t=s[n+48>>2])-(a=s[n+72>>2])|0,v=s[n+76>>2],g=Ht(i,g,b,M=s[n+52>>2]-(v+(t>>>0<a>>>0)|0)|0),t=R+m|0,t=(i=C+g|0)>>>0<g>>>0?t+1|0:t,v=i-(m=Ht(g=(m=s[n+24>>2])-a|0,a=s[n+28>>2]-((a>>>0>m>>>0)+v|0)|0,w,p))|0,m=t-(R+(i>>>0<m>>>0)|0)|0,i=A-(t=Ht(k,y,b,M))|0,t=_-(R+(t>>>0>A>>>0)|0)|0,_=Ht(g,a,x,f),t=R+t|0,_=t=(A=_+i|0)>>>0<_>>>0?t+1|0:t,t=s[n+88>>2],a=s[n+80>>2];r:if(d[n+92|0]){n:{if(-1==(0|t)||-1==(0|(t=((i=t+1|0)>>>0)%3|0?i:t-2|0))|s[s[a>>2]+(t>>>3&536870908)>>2]>>>t&1||-1==(0|(t=s[s[s[a+64>>2]+12>>2]+(t<<2)>>2])))s[n+88>>2]=-1;else if(t=((i=t+1|0)>>>0)%3|0?i:t-2|0,s[n+88>>2]=t,-1!=(0|t))break n;i=-1;i:if(-1!=(0|(t=s[n+84>>2]))){if((t>>>0)%3|0)t=t-1|0;else if(i=-1,-1==(0|(t=t+2|0)))break i;i=-1,s[s[a>>2]+(t>>>3&536870908)>>2]>>>t&1||(i=-1,-1!=(0|(t=s[s[s[a+64>>2]+12>>2]+(t<<2)>>2]))&&(i=t-1|0,(t>>>0)%3|0||(i=t+2|0)))}o[n+92|0]=0,s[n+88>>2]=i;break r}if((0|t)!=s[n+84>>2])break r;s[n+88>>2]=-1}else{i=-1;n:if(-1!=(0|t)){if((t>>>0)%3|0)t=t-1|0;else if(i=-1,-1==(0|(t=t+2|0)))break n;i=-1,s[s[a>>2]+(t>>>3&536870908)>>2]>>>t&1||(i=-1,-1!=(0|(t=s[s[s[a+64>>2]+12>>2]+(t<<2)>>2]))&&(i=t-1|0,(t>>>0)%3|0||(i=t+2|0)))}s[n+88>>2]=i}if(-1==(0|(t=s[n+88>>2])))break}i=(t=_>>31)+A|0,a=t,t=t+_|0,p=i^a,l=a^(i>>>0<a>>>0?t+1|0:t),b=-1,i=2147483647,f=t=m>>31,a=t+v|0,t=t+m|0,t=a>>>0<f>>>0?t+1|0:t,a^=f,f=t^=f,x=-1^a,t^=2147483647,h=c;r:{if(s[e+28>>2]){if(!((0|t)==(0|l)&p>>>0>x>>>0|t>>>0<l>>>0)&&(t=l+f|0,a=t=(e=a+p|0)>>>0<a>>>0?t+1|0:t,l=c,c=(t=c>>31)+u|0,f=l,l=t,t=f+t|0,t=c>>>0<l>>>0?t+1|0:t,c^=l,!((0|(l=2147483647^(t^=l)))==(0|a)&(-1^c)>>>0<e>>>0|a>>>0>l>>>0)&&(t=t+a|0,b=e=e+c|0,i=t=e>>>0<c>>>0?t+1|0:t,!t&e>>>0<536870913)))break r;t=i>>>29|0,e=(536870911&i)<<3|b>>>29}else{if((0|t)==(0|l)&p>>>0>x>>>0|t>>>0<l>>>0)break r;if(t=l+f|0,t=(e=a+p|0)>>>0<a>>>0?t+1|0:t,a=e,e=t,i=(t=c>>31)+u|0,l=c,c=t,t=l+t|0,l=i^c,c^=t=i>>>0<c>>>0?t+1|0:t,t=i=l+a|0,(c=!(0&(e=(0|(c^=2147483647))==(0|e)&(-1^l)>>>0<a>>>0|e>>>0>c>>>0)))&(0|(e=e?-1:t))<=536870912|(0|e)<536870912)break r;t=0,e=e>>>29|0}u=Wt(u,h,e,t),v=Wt(v,m,e,t),A=Wt(A,_,e,t)}return s[r+8>>2]=u,s[r+4>>2]=v,s[r>>2]=A,void(N=n+96|0)}dn(),T()}dn(),T()}dn(),T()}function Z(e,t,r,n){var i=0,c=0,l=0,u=0,h=0,g=b(0),A=0;e:{t:if(n){r:{n:switch(s[e+28>>2]-1|0){case 0:if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if(a[(l<<1)+n>>1]=o[0|t],t=t+1|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 1:if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if(a[(l<<1)+n>>1]=d[0|t],t=t+1|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 2:if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if(a[(l<<1)+n>>1]=f[t>>1],t=t+2|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 3:if((0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if((0|(i=a[t>>1]))<0)break t;if(a[(l<<1)+n>>1]=i,t=t+2|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if(u=1,(0|r)>(0|i))break r;break t;case 4:if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if((i=s[t>>2])-32768>>>0<4294901760)break e;if(a[(l<<1)+n>>1]=i,t=t+4|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 5:if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if((i=s[t>>2])>>>0>32767)break e;if(a[(l<<1)+n>>1]=i,t=t+4|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 6:if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if(h=s[t>>2],-1==(0|(i=s[t+4>>2]-(h>>>0<32768)|0))&h-32768>>>0<4294901760|-1!=(0|i))break e;if(a[(l<<1)+n>>1]=h,t=t+8|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 7:if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if(!(i=s[t+4>>2])&(h=s[t>>2])>>>0>32767|i)break e;if(a[(l<<1)+n>>1]=h,t=t+8|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 8:if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if(h=(l<<1)+n|0,g=p[t>>2],i=b(v(g))<b(2147483648)?~~g:-2147483648,a[h>>1]=i,t=t+4|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 9:if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if(h=(l<<1)+n|0,A=m[t>>3],i=v(A)<2147483648?~~A:-2147483648,a[h>>1]=i,t=t+8|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 10:break n;default:break t}if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if(a[(l<<1)+n>>1]=d[0|t],t=t+1|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)<=(0|i))break t}We((i<<1)+n|0,0,r-i<<1)}return u}return 0}function H(e,t,r,n){var i=0,c=0,l=0,u=0,h=0,v=b(0),g=0;e:{t:if(n){r:{n:switch(s[e+28>>2]-1|0){case 0:if((0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if((0|(i=o[0|t]))<0)break t;if(a[(l<<1)+n>>1]=255&i,t=t+1|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if(u=1,(0|r)>(0|i))break r;break t;case 1:if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if(a[(l<<1)+n>>1]=d[0|t],t=t+1|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 2:if((0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if((0|(i=a[t>>1]))<0)break t;if(a[(l<<1)+n>>1]=i,t=t+2|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if(u=1,(0|r)>(0|i))break r;break t;case 3:if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if(a[(l<<1)+n>>1]=f[t>>1],t=t+2|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 4:if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if((i=s[t>>2])>>>0>65535)break e;if(a[(l<<1)+n>>1]=i,t=t+4|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 5:if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if((i=s[t>>2])>>>0>65535)break e;if(a[(l<<1)+n>>1]=i,t=t+4|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 6:if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if(!(i=s[t+4>>2])&(h=s[t>>2])>>>0>65535|i)break e;if(a[(l<<1)+n>>1]=h,t=t+8|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 7:if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if(!(i=s[t+4>>2])&(h=s[t>>2])>>>0>65535|i)break e;if(a[(l<<1)+n>>1]=h,t=t+8|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 8:if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if(h=(l<<1)+n|0,i=(v=p[t>>2])<b(4294967296)&v>=b(0)?~~v>>>0:0,a[h>>1]=i,t=t+4|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 9:if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if(h=(l<<1)+n|0,i=(g=m[t>>3])<4294967296&g>=0?~~g>>>0:0,a[h>>1]=i,t=t+8|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 10:break n;default:break t}if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if(a[(l<<1)+n>>1]=d[0|t],t=t+1|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)<=(0|i))break t}We((i<<1)+n|0,0,r-i<<1)}return u}return 0}function Y(e,t,r){var n,i=0,c=0,l=0,p=0,m=0;N=n=N-48|0,i=f[5069]|f[5070]<<16,c=f[5067]|f[5068]<<16,a[n+38>>1]=c,a[n+40>>1]=c>>>16,a[n+42>>1]=i,a[n+44>>1]=i>>>16,i=s[2533],s[n+32>>2]=s[2532],s[n+36>>2]=i,i=s[2531],s[n+24>>2]=s[2530],s[n+28>>2]=i,i=s[2529],s[n+16>>2]=s[2528],s[n+20>>2]=i,c=s[t+12>>2],i=s[t+20>>2],i=(p=(l=s[t+16>>2])+5|0)>>>0<5?i+1|0:i;e:{t:if(p>>>0>u[t+8>>2]&(0|i)>=(0|c)|(0|i)>(0|c)){if((t=St(n+16|0))>>>0>=4294967280)break e;r:{if(t>>>0>=11)r=ur(i=t+16&-16),s[n+8>>2]=-2147483648|i,s[n>>2]=r,s[n+4>>2]=t;else if(o[n+11|0]=t,r=n,!t)break r;ye(r,n+16|0,t)}if(o[t+r|0]=0,s[e>>2]=-2,e=e+4|0,o[n+11|0]>=0){t=s[n+4>>2],s[e>>2]=s[n>>2],s[e+4>>2]=t,s[e+8>>2]=s[n+8>>2];break t}Ot(t=e,e=s[n>>2],s[n+4>>2]),ee(e)}else if(i=l+s[t>>2]|0,c=d[0|i]|d[i+1|0]<<8|d[i+2|0]<<16|d[i+3|0]<<24,o[0|r]=c,o[r+1|0]=c>>>8,o[r+2|0]=c>>>16,o[r+3|0]=c>>>24,o[r+4|0]=d[i+4|0],i=s[t+20>>2],i=(c=s[t+16>>2]+5|0)>>>0<5?i+1|0:i,s[t+16>>2]=c,s[t+20>>2]=i,Mt(r,1394,5))t=ur(32),o[t+16|0]=d[1638],r=d[1634]|d[1635]<<8|d[1636]<<16|d[1637]<<24,i=d[1630]|d[1631]<<8|d[1632]<<16|d[1633]<<24,o[t+8|0]=i,o[t+9|0]=i>>>8,o[t+10|0]=i>>>16,o[t+11|0]=i>>>24,o[t+12|0]=r,o[t+13|0]=r>>>8,o[t+14|0]=r>>>16,o[t+15|0]=r>>>24,r=d[1626]|d[1627]<<8|d[1628]<<16|d[1629]<<24,i=d[1622]|d[1623]<<8|d[1624]<<16|d[1625]<<24,o[0|t]=i,o[t+1|0]=i>>>8,o[t+2|0]=i>>>16,o[t+3|0]=i>>>24,o[t+4|0]=r,o[t+5|0]=r>>>8,o[t+6|0]=r>>>16,o[t+7|0]=r>>>24,o[t+17|0]=0,s[e>>2]=-1,Ot(e+4|0,t,17),ee(t);else if((0|(l=s[t+12>>2]))<=(0|i)&u[t+8>>2]<=c>>>0|(0|i)>(0|l)){if((t=St(n+16|0))>>>0>=4294967280)break e;r:{if(t>>>0>=11)r=ur(i=t+16&-16),s[n+8>>2]=-2147483648|i,s[n>>2]=r,s[n+4>>2]=t;else if(o[n+11|0]=t,r=n,!t)break r;ye(r,n+16|0,t)}if(o[t+r|0]=0,s[e>>2]=-2,e=e+4|0,o[n+11|0]>=0){t=s[n+4>>2],s[e>>2]=s[n>>2],s[e+4>>2]=t,s[e+8>>2]=s[n+8>>2];break t}Ot(t=e,e=s[n>>2],s[n+4>>2]),ee(e)}else if(o[r+5|0]=d[c+s[t>>2]|0],i=s[t+20>>2],i=(c=s[t+16>>2]+1|0)?i:i+1|0,s[t+16>>2]=c,s[t+20>>2]=i,(0|(l=s[t+12>>2]))<=(0|i)&u[t+8>>2]<=c>>>0|(0|i)>(0|l)){if((t=St(n+16|0))>>>0>=4294967280)break e;r:{if(t>>>0>=11)r=ur(i=t+16&-16),s[n+8>>2]=-2147483648|i,s[n>>2]=r,s[n+4>>2]=t;else if(o[n+11|0]=t,r=n,!t)break r;ye(r,n+16|0,t)}if(o[t+r|0]=0,s[e>>2]=-2,e=e+4|0,o[n+11|0]>=0){t=s[n+4>>2],s[e>>2]=s[n>>2],s[e+4>>2]=t,s[e+8>>2]=s[n+8>>2];break t}Ot(t=e,e=s[n>>2],s[n+4>>2]),ee(e)}else if(o[r+6|0]=d[c+s[t>>2]|0],i=s[t+20>>2],i=(c=s[t+16>>2]+1|0)?i:i+1|0,s[t+16>>2]=c,s[t+20>>2]=i,(0|(l=s[t+12>>2]))<=(0|i)&u[t+8>>2]<=c>>>0|(0|i)>(0|l)){if((t=St(n+16|0))>>>0>=4294967280)break e;r:{if(t>>>0>=11)r=ur(i=t+16&-16),s[n+8>>2]=-2147483648|i,s[n>>2]=r,s[n+4>>2]=t;else if(o[n+11|0]=t,r=n,!t)break r;ye(r,n+16|0,t)}if(o[t+r|0]=0,s[e>>2]=-2,e=e+4|0,o[n+11|0]>=0){t=s[n+4>>2],s[e>>2]=s[n>>2],s[e+4>>2]=t,s[e+8>>2]=s[n+8>>2];break t}Ot(t=e,e=s[n>>2],s[n+4>>2]),ee(e)}else if(o[r+7|0]=d[c+s[t>>2]|0],i=s[t+20>>2],i=(c=s[t+16>>2]+1|0)?i:i+1|0,s[t+16>>2]=c,s[t+20>>2]=i,(0|(l=s[t+12>>2]))<=(0|i)&u[t+8>>2]<=c>>>0|(0|i)>(0|l)){if(t=jt(n,n+16|0),s[e>>2]=-2,e=e+4|0,o[t+11|0]>=0){t=s[n+4>>2],s[e>>2]=s[n>>2],s[e+4>>2]=t,s[e+8>>2]=s[n+8>>2];break t}if(Ot(e,s[t>>2],s[t+4>>2]),o[t+11|0]>=0)break t;ee(s[t>>2])}else if(o[r+8|0]=d[c+s[t>>2]|0],c=i=s[t+20>>2],i=(l=(m=s[t+16>>2])+1|0)?i:i+1|0,s[t+16>>2]=l,s[t+20>>2]=i,p=s[t+12>>2],i=c,i=(c=m+3|0)>>>0<3?i+1|0:i,c>>>0>u[t+8>>2]&(0|i)>=(0|p)|(0|i)>(0|p)){if(t=jt(n,n+16|0),s[e>>2]=-2,e=e+4|0,o[t+11|0]>=0){t=s[n+4>>2],s[e>>2]=s[n>>2],s[e+4>>2]=t,s[e+8>>2]=s[n+8>>2];break t}if(Ot(e,s[t>>2],s[t+4>>2]),o[t+11|0]>=0)break t;ee(s[t>>2])}else c=r,r=l+s[t>>2]|0,a[c+10>>1]=d[0|r]|d[r+1|0]<<8,i=s[t+20>>2],i=(r=s[t+16>>2]+2|0)>>>0<2?i+1|0:i,s[t+16>>2]=r,s[t+20>>2]=i,s[e+8>>2]=0,s[e+12>>2]=0,s[e>>2]=0,s[e+4>>2]=0;return void(N=n+48|0)}an(),T()}function q(e,t,r,n){var i=0,c=0,l=0,u=0,h=0,g=b(0),A=0;e:{t:if(n){r:{n:switch(s[e+28>>2]-1|0){case 0:if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if(s[(l<<2)+n>>2]=o[0|t],t=t+1|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 1:if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if(s[(l<<2)+n>>2]=d[0|t],t=t+1|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 2:if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if(s[(l<<2)+n>>2]=a[t>>1],t=t+2|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 3:if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if(s[(l<<2)+n>>2]=f[t>>1],t=t+2|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 4:if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if(s[(l<<2)+n>>2]=s[t>>2],t=t+4|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 5:if((0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if((0|(i=s[t>>2]))<0)break t;if(s[(l<<2)+n>>2]=i,t=t+4|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if(u=1,(0|r)>(0|i))break r;break t;case 6:if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if(i=s[t>>2],-1!=(s[t+4>>2]-(i>>>0<2147483648)|0))break e;if(s[(l<<2)+n>>2]=i,t=t+8|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 7:if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if(!(i=s[t+4>>2])&(h=s[t>>2])>>>0>2147483647|i)break e;if(s[(l<<2)+n>>2]=h,t=t+8|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 8:if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if(h=(l<<2)+n|0,g=p[t>>2],i=b(v(g))<b(2147483648)?~~g:-2147483648,s[h>>2]=i,t=t+4|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 9:if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if(h=(l<<2)+n|0,A=m[t>>3],i=v(A)<2147483648?~~A:-2147483648,s[h>>2]=i,t=t+8|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 10:break n;default:break t}if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if(s[(l<<2)+n>>2]=d[0|t],t=t+1|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)<=(0|i))break t}We((i<<2)+n|0,0,r-i<<2)}return u}return 0}function Q(e,t,r,n){var i=0,c=0,l=0,u=0,h=0,v=b(0),g=0;e:{t:if(n){r:{n:switch(s[e+28>>2]-1|0){case 0:if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if(s[(l<<2)+n>>2]=o[0|t],t=t+1|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 1:if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if(s[(l<<2)+n>>2]=d[0|t],t=t+1|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 2:if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if(s[(l<<2)+n>>2]=a[t>>1],t=t+2|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 3:if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if(s[(l<<2)+n>>2]=f[t>>1],t=t+2|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 4:if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if(s[(l<<2)+n>>2]=s[t>>2],t=t+4|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 5:if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if(s[(l<<2)+n>>2]=s[t>>2],t=t+4|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 6:if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if(i=s[t>>2],s[t+4>>2])break e;if(s[(l<<2)+n>>2]=i,t=t+8|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 7:if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if(i=s[t>>2],s[t+4>>2])break e;if(s[(l<<2)+n>>2]=i,t=t+8|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 8:if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if(h=(l<<2)+n|0,i=(v=p[t>>2])<b(4294967296)&v>=b(0)?~~v>>>0:0,s[h>>2]=i,t=t+4|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 9:if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if(h=(l<<2)+n|0,i=(g=m[t>>3])<4294967296&g>=0?~~g>>>0:0,s[h>>2]=i,t=t+8|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)>(0|i))break r;break t;case 10:break n;default:break t}if(u=1,(0|((0|r)<(0|(i=o[e+24|0]))?r:i))>0)for(i=s[e>>2],t=(c=s[i>>2])+(t=s[e+48>>2]+Ht(s[e+40>>2],s[e+44>>2],t,0)|0)|0,c=s[i+4>>2];;){if(t>>>0>=c>>>0)break e;if(s[(l<<2)+n>>2]=d[0|t],t=t+1|0,!((0|(l=l+1|0))<(0|((0|r)<(0|(i=o[e+24|0]))?r:i))))break}if((0|r)<=(0|i))break t}We((i<<2)+n|0,0,r-i<<2)}return u}return 0}function X(e,t,r){var n,i=0,o=0,a=0,c=0,l=0,u=0,p=0,m=0,b=0,v=0,g=0,A=0,_=0,x=0,y=0;N=n=N+-64|0,s[n+48>>2]=0,s[n+40>>2]=0,s[n+44>>2]=0,s[n+32>>2]=0,s[n+36>>2]=0,s[n+24>>2]=0,s[n+28>>2]=0,s[n+16>>2]=0,s[n+20>>2]=0,s[n+8>>2]=0,s[n+12>>2]=0,s[n>>2]=0,s[n+4>>2]=0,c=t;e:{t:if(f[t+38>>1]&&Tt(1,n+12|0,c)){if(m=s[n+12>>2],t=s[n>>2],m>>>0>(i=s[n+4>>2]-t>>2)>>>0?(ct(n,m-i|0),m=s[n+12>>2]):i>>>0<=m>>>0||(s[n+4>>2]=t+(m<<2)),o=1,!m)break e;for(A=s[c+8>>2],_=s[c+12>>2],g=s[n>>2];;){if(o=0,(0|_)<=(0|(i=s[c+20>>2]))&A>>>0<=(u=s[c+16>>2])>>>0|(0|i)>(0|_))break e;b=s[c>>2],x=d[b+u|0],i=(t=u+1|0)?i:i+1|0,o=t,s[c+16>>2]=t,s[c+20>>2]=i,t=x>>>2|0,l=0;r:{n:{i:{o:switch(0|(v=3&x)){case 3:break o;case 0:break n;default:break i}if(o=0,(t=t+a|0)>>>0>=m>>>0)break e;We(g+(a<<2)|0,0,4+(252&x)|0),a=t;break r}for(;;){if((0|i)>=(0|_)&o>>>0>=A>>>0|(0|i)>(0|_))break t;if(u=d[o+b|0],i=(o=o+1|0)?i:i+1|0,s[c+16>>2]=o,s[c+20>>2]=i,t|=u<<(l<<3|6),(0|v)==(0|(l=l+1|0)))break}}s[g+(a<<2)>>2]=t}if(!((a=a+1|0)>>>0<(m=s[n+12>>2])>>>0))break}if(A=n+16|0,b=s[n>>2],o=s[n+16>>2],(t=(i=s[n+20>>2]-o|0)>>2)>>>0<=1048575?ct(A,1048576-t|0):4194304!=(0|i)&&(s[n+20>>2]=o+4194304),a=s[(i=n+28|0)>>2],(t=s[n+32>>2]-a>>3)>>>0<m>>>0)lt(i,m-t|0),a=s[i>>2];else if(t>>>0>m>>>0&&(s[n+32>>2]=(m<<3)+a),!m)break t;for(l=0,i=0;;){if(u=s[(v=(l<<2)+b|0)>>2],t=i,s[4+(o=(l<<3)+a|0)>>2]=i,s[o>>2]=u,(i=(g=s[v>>2])+i|0)>>>0>1048576)break t;if(!(t>>>0>=i>>>0)){if(v=s[A>>2],u=0,o=7&g)for(;s[v+(t<<2)>>2]=l,t=t+1|0,(0|o)!=(0|(u=u+1|0)););if(!(g-1>>>0<=6))for(;s[(o=v+(t<<2)|0)>>2]=l,s[o+28>>2]=l,s[o+24>>2]=l,s[o+20>>2]=l,s[o+16>>2]=l,s[o+12>>2]=l,s[o+8>>2]=l,s[o+4>>2]=l,(0|i)!=(0|(t=t+8|0)););}if((0|m)==(0|(l=l+1|0)))break}p=1048576==(0|i)}o=p}e:if(!(!o|(s[n+12>>2]?0:e))&&ht(1,n+56|0,c)&&(u=(i=s[c+8>>2])-(t=s[c+16>>2])|0,a=s[n+60>>2],o=s[c+20>>2],!((0|a)==(0|(i=s[c+12>>2]-(o+(t>>>0>i>>>0)|0)|0))&u>>>0<(p=s[n+56>>2])>>>0|i>>>0<a>>>0||(i=o+a|0,i=(u=t+p|0)>>>0<t>>>0?i+1|0:i,s[c+16>>2]=u,s[c+20>>2]=i,(0|p)<=0)))){b=t+s[c>>2]|0,s[n+40>>2]=b;t:if((i=d[0|(o=b+(t=p-1|0)|0)])>>>0<=63)s[n+44>>2]=t,i=63&d[0|o];else{r:switch((i>>>6|0)-1|0){case 0:if(p>>>0<2)break e;t=p-2|0,s[n+44>>2]=t,i=d[1+(i=(p+b|0)-2|0)|0]<<8&16128|d[0|i];break t;case 1:if(p>>>0<3)break e;t=p-3|0,s[n+44>>2]=t,i=d[2+(i=(p+b|0)-3|0)|0]<<16&4128768|d[i+1|0]<<8|d[0|i];break t}t=p-4|0,s[n+44>>2]=t,i=d[2+(i=(p+b|0)-4|0)|0]<<16|d[i+3|0]<<24&1056964608|d[i+1|0]<<8|d[0|i]}if(a=i+4194304|0,s[n+48>>2]=a,!(a>>>0>1073741823))if(e)for(v=s[n+28>>2],i=0,u=s[n+16>>2];;){t:if(!(a>>>0>4194303))for(;;){if((0|t)<=0)break t;if(t=t-1|0,s[n+44>>2]=t,a=d[t+b|0]|a<<8,s[n+48>>2]=a,!(a>>>0<4194304))break}if(p=s[u+((o=1048575&a)<<2)>>2],a=(h(s[(c=v+(p<<3)|0)>>2],a>>>20|0)+o|0)-s[c+4>>2]|0,s[n+48>>2]=a,s[(i<<2)+r>>2]=p,y=1,(0|(i=i+1|0))==(0|e))break}else y=1}return(e=s[n+28>>2])&&(s[n+32>>2]=e,ee(e)),(e=s[n+16>>2])&&(s[n+20>>2]=e,ee(e)),(e=s[n>>2])&&(s[n+4>>2]=e,ee(e)),N=n- -64|0,y}function J(e,t){var r=0,n=0,i=0,a=0,c=0,l=0;if((a=((r=s[e+4>>2])-(n=s[e>>2])|0)/144|0)>>>0<t>>>0)if(n=e,(c=t-a|0)>>>0<=((r=s[e+8>>2])-(e=s[e+4>>2])|0)/144>>>0){if(c){for(t=h(c,144)+e|0;s[e>>2]=-1,gt(e+4|0),s[e+104>>2]=0,s[e+108>>2]=0,o[e+100|0]=1,s[e+112>>2]=0,s[e+116>>2]=0,s[e+120>>2]=0,s[e+124>>2]=0,s[e+128>>2]=0,s[e+132>>2]=0,s[e+136>>2]=0,s[e+140>>2]=0,(0|t)!=(0|(e=e+144|0)););e=t}s[n+4>>2]=e}else{e:{t:{r:{if((l=(a=((t=e)-(e=s[n>>2])|0)/144|0)+c|0)>>>0<29826162){if(e=(t=(r-e|0)/144|0)<<1,i=t>>>0<14913080?e>>>0<l>>>0?l:e:29826161){if(i>>>0>=29826162)break r;r=ur(h(i,144))}else r=0;for(l=(t=r+h(a,144)|0)+h(c,144)|0,e=t;s[e>>2]=-1,gt(e+4|0),s[e+104>>2]=0,s[e+108>>2]=0,o[e+100|0]=1,s[e+112>>2]=0,s[e+116>>2]=0,s[e+120>>2]=0,s[e+124>>2]=0,s[e+128>>2]=0,s[e+132>>2]=0,s[e+136>>2]=0,s[e+140>>2]=0,(0|l)!=(0|(e=e+144|0)););if(a=r+h(i,144)|0,(0|(e=s[n+4>>2]))==(0|(i=s[n>>2])))break t;for(;e=e-144|0,s[(t=t-144|0)>>2]=s[e>>2],s[t+4>>2]=s[e+4>>2],s[t+8>>2]=s[e+8>>2],s[t+12>>2]=s[e+12>>2],s[e+12>>2]=0,s[e+4>>2]=0,s[e+8>>2]=0,s[t+16>>2]=s[e+16>>2],s[t+20>>2]=s[e+20>>2],s[t+24>>2]=s[e+24>>2],s[e+24>>2]=0,s[e+16>>2]=0,s[e+20>>2]=0,r=d[e+28|0],s[t+40>>2]=0,s[t+32>>2]=0,s[t+36>>2]=0,o[t+28|0]=r,s[t+32>>2]=s[e+32>>2],s[t+36>>2]=s[e+36>>2],s[t+40>>2]=s[e+40>>2],s[e+40>>2]=0,s[e+32>>2]=0,s[e+36>>2]=0,s[t+52>>2]=0,s[t+44>>2]=0,s[t+48>>2]=0,s[t+44>>2]=s[e+44>>2],s[t+48>>2]=s[e+48>>2],s[t+52>>2]=s[e+52>>2],s[e+52>>2]=0,s[e+44>>2]=0,s[e+48>>2]=0,s[(r=t- -64|0)>>2]=0,s[t+56>>2]=0,s[t+60>>2]=0,s[t+56>>2]=s[e+56>>2],s[t+60>>2]=s[e+60>>2],c=r,r=e- -64|0,s[c>>2]=s[r>>2],s[r>>2]=0,s[e+56>>2]=0,s[e+60>>2]=0,s[t+68>>2]=s[e+68>>2],r=s[e+72>>2],s[t+84>>2]=0,s[t+76>>2]=0,s[t+80>>2]=0,s[t+72>>2]=r,s[t+76>>2]=s[e+76>>2],s[t+80>>2]=s[e+80>>2],s[t+84>>2]=s[e+84>>2],s[e+84>>2]=0,s[e+76>>2]=0,s[e+80>>2]=0,s[t+96>>2]=0,s[t+88>>2]=0,s[t+92>>2]=0,s[t+88>>2]=s[e+88>>2],s[t+92>>2]=s[e+92>>2],s[t+96>>2]=s[e+96>>2],s[e+96>>2]=0,s[e+88>>2]=0,s[e+92>>2]=0,r=d[e+100|0],s[t+112>>2]=0,s[t+104>>2]=0,s[t+108>>2]=0,o[t+100|0]=r,s[t+104>>2]=s[e+104>>2],s[t+108>>2]=s[e+108>>2],s[t+112>>2]=s[e+112>>2],s[e+112>>2]=0,s[e+104>>2]=0,s[e+108>>2]=0,s[t+124>>2]=0,s[t+116>>2]=0,s[t+120>>2]=0,s[t+116>>2]=s[e+116>>2],s[t+120>>2]=s[e+120>>2],s[t+124>>2]=s[e+124>>2],s[e+124>>2]=0,s[e+116>>2]=0,s[e+120>>2]=0,r=s[e+128>>2],s[t+140>>2]=0,s[t+132>>2]=0,s[t+136>>2]=0,s[t+128>>2]=r,s[t+132>>2]=s[e+132>>2],s[t+136>>2]=s[e+136>>2],s[t+140>>2]=s[e+140>>2],s[e+140>>2]=0,s[e+132>>2]=0,s[e+136>>2]=0,(0|e)!=(0|i););if(s[n+8>>2]=a,e=s[n+4>>2],s[n+4>>2]=l,i=s[n>>2],s[n>>2]=t,(0|e)==(0|i))break e;for(;(t=s[e-12>>2])&&(s[e-8>>2]=t,ee(t)),(t=s[e-28>>2])&&(s[e-24>>2]=t,ee(t)),(t=s[e-40>>2])&&(s[e-36>>2]=t,ee(t)),Bt(e-140|0),(0|i)!=(0|(e=e-144|0)););break e}nn(),T()}qt(1326),T()}s[n+8>>2]=a,s[n+4>>2]=l,s[n>>2]=t}i&&ee(i)}else if(t>>>0<a>>>0){if((0|(n=n+h(t,144)|0))!=(0|r))for(;(t=s[r-12>>2])&&(s[r-8>>2]=t,ee(t)),(t=s[r-28>>2])&&(s[r-24>>2]=t,ee(t)),(t=s[r-40>>2])&&(s[r-36>>2]=t,ee(t)),Bt(r-140|0),(0|n)!=(0|(r=r-144|0)););s[e+4>>2]=n}}function K(e,t,r){t|=0,r|=0;var n,i=0,a=0,c=0,l=0,f=0,u=0,p=0,m=0,h=0,b=0,v=0,g=0,A=0,_=0,x=0,y=0,k=0,w=0,C=0,M=0;if(N=n=N-96|0,i=s[16+(e|=0)>>2],o[n+92|0]=1,s[n+88>>2]=t,s[n+84>>2]=t,s[n+80>>2]=i,-1!=(0|t)&&(h=s[e+20>>2],a=s[h>>2],!((i=s[s[i>>2]+(t<<2)>>2])>>>0>=s[h+4>>2]-a>>2>>>0))){i=s[s[e+8>>2]+(s[a+(i<<2)>>2]<<2)>>2],a=s[e+4>>2],d[a+84|0]||(i=s[s[a+68>>2]+(i<<2)>>2]),s[n+72>>2]=0,s[n+76>>2]=0,s[(h=n- -64|0)>>2]=0,s[h+4>>2]=0,s[n+56>>2]=0,s[n+60>>2]=0,j(a,i,o[a+24|0],n+56|0),h=((i=t+1|0)>>>0)%3|0?i:t-2|0,l=((t>>>0)%3|0?-1:2)+t|0;e:{t:{for(;;){if(a=h,i=l,s[e+28>>2]&&(a=((i=t+1|0)>>>0)%3|0?i:t-2|0,i=t-1|0,(t>>>0)%3|0||(i=t+2|0)),-1==(0|a))break e;if(p=s[e+20>>2],t=s[p>>2],(a=s[s[s[e+16>>2]>>2]+(a<<2)>>2])>>>0>=s[p+4>>2]-t>>2>>>0)break e;if(a=s[s[e+8>>2]+(s[(a<<2)+t>>2]<<2)>>2],t=s[e+4>>2],d[t+84|0]||(a=s[s[t+68>>2]+(a<<2)>>2]),s[n+48>>2]=0,s[n+52>>2]=0,s[n+40>>2]=0,s[n+44>>2]=0,s[n+32>>2]=0,s[n+36>>2]=0,j(t,a,o[t+24|0],n+32|0),-1==(0|i))break t;if(a=s[e+20>>2],t=s[a>>2],(i=s[s[s[e+16>>2]>>2]+(i<<2)>>2])>>>0>=s[a+4>>2]-t>>2>>>0)break t;if(a=s[s[e+8>>2]+(s[t+(i<<2)>>2]<<2)>>2],t=s[e+4>>2],d[t+84|0]||(a=s[s[t+68>>2]+(a<<2)>>2]),s[n+24>>2]=0,s[n+28>>2]=0,s[n+16>>2]=0,s[n+20>>2]=0,s[n+8>>2]=0,s[n+12>>2]=0,j(t,a,o[t+24|0],n+8|0),a=(i=s[n+8>>2])-(t=s[n+56>>2])|0,p=s[n+60>>2],b=s[n+12>>2]-(p+(t>>>0>i>>>0)|0)|0,x=(f=s[n+40>>2])-(i=s[n+64>>2])|0,y=s[n+68>>2],k=Ht(a,b,x,f=s[n+44>>2]-(y+(i>>>0>f>>>0)|0)|0),c=c-(R+(u>>>0<k>>>0)|0)|0,C=w=u-k|0,i=Ht(k=(u=s[n+16>>2])-i|0,y=s[n+20>>2]-((i>>>0>u>>>0)+y|0)|0,w=(u=s[n+32>>2])-t|0,p=s[n+36>>2]-((t>>>0>u>>>0)+p|0)|0),t=R+c|0,c=t=i>>>0>(u=C+i|0)>>>0?t+1|0:t,C=v,g=b,b=(t=s[n+48>>2])-(i=s[n+72>>2])|0,v=s[n+76>>2],g=Ht(a,g,b,M=s[n+52>>2]-(v+(t>>>0<i>>>0)|0)|0),t=R+m|0,t=(a=C+g|0)>>>0<g>>>0?t+1|0:t,v=a-(m=Ht(g=(m=s[n+24>>2])-i|0,i=s[n+28>>2]-((i>>>0>m>>>0)+v|0)|0,w,p))|0,m=t-(R+(a>>>0<m>>>0)|0)|0,a=A-(t=Ht(k,y,b,M))|0,t=_-(R+(t>>>0>A>>>0)|0)|0,_=Ht(g,i,x,f),t=R+t|0,_=t=(A=_+a|0)>>>0<_>>>0?t+1|0:t,Fe(n+80|0),-1==(0|(t=s[n+88>>2])))break}a=(t=_>>31)+A|0,i=t,t=t+_|0,p=a^i,l=i^(a>>>0<i>>>0?t+1|0:t),b=-1,a=2147483647,f=t=m>>31,i=t+v|0,t=t+m|0,t=i>>>0<f>>>0?t+1|0:t,i^=f,f=t^=f,x=-1^i,t^=2147483647,h=c;r:{if(s[e+28>>2]){if(!((0|t)==(0|l)&p>>>0>x>>>0|t>>>0<l>>>0)&&(t=l+f|0,i=t=(e=i+p|0)>>>0<i>>>0?t+1|0:t,l=c,c=(t=c>>31)+u|0,f=l,l=t,t=f+t|0,t=c>>>0<l>>>0?t+1|0:t,c^=l,!((0|(l=2147483647^(t^=l)))==(0|i)&(-1^c)>>>0<e>>>0|i>>>0>l>>>0)&&(t=t+i|0,b=e=e+c|0,a=t=e>>>0<c>>>0?t+1|0:t,!t&e>>>0<536870913)))break r;t=a>>>29|0,e=(536870911&a)<<3|b>>>29}else{if((0|t)==(0|l)&p>>>0>x>>>0|t>>>0<l>>>0)break r;if(t=l+f|0,t=(e=i+p|0)>>>0<i>>>0?t+1|0:t,i=e,e=t,a=(t=c>>31)+u|0,l=c,c=t,t=l+t|0,l=a^c,c^=t=a>>>0<c>>>0?t+1|0:t,t=a=l+i|0,(c=!(0&(e=(0|(c^=2147483647))==(0|e)&(-1^l)>>>0<i>>>0|e>>>0>c>>>0)))&(0|(e=e?-1:t))<=536870912|(0|e)<536870912)break r;t=0,e=e>>>29|0}u=Wt(u,h,e,t),v=Wt(v,m,e,t),A=Wt(A,_,e,t)}return s[r+8>>2]=u,s[r+4>>2]=v,s[r>>2]=A,void(N=n+96|0)}dn(),T()}dn(),T()}dn(),T()}function $(e,t){e|=0;var r=0,n=0,i=0,o=0,a=0,c=0,l=0,d=0;if(!((0|(t|=0))<0||(n=s[e+12>>2])-(r=s[e+8>>2])>>2>>>0<=t>>>0)){o=s[(i=r+(t<<2)|0)>>2],l=s[o+60>>2],a=s[o+56>>2];e:{if((0|(r=i+4|0))!=(0|n)){for(;c=s[r>>2],s[r>>2]=0,s[i>>2]=c,o&&Lt(o),i=i+4|0,(0|(r=r+4|0))!=(0|n);)o=s[i>>2];if((0|i)==(0|(n=s[e+12>>2])))break e}for(;r=s[(n=n-4|0)>>2],s[n>>2]=0,r&&Lt(r),(0|n)!=(0|i););}s[e+12>>2]=i;e:if(!(!(o=s[e+4>>2])|(0|l)<0)&&(0|(n=s[o+24>>2]))!=(0|(r=s[o+28>>2])))for(;;){if((0|l)==s[s[n>>2]+24>>2]){t:{if((0|(i=n+4|0))!=(0|(l=s[o+28>>2]))){for(;c=s[i>>2],s[i>>2]=0,r=s[n>>2],s[n>>2]=c,r&&(rr(r+12|0,s[r+16>>2]),dr(r,s[r+4>>2]),ee(r)),n=n+4|0,(0|l)!=(0|(i=i+4|0)););if((0|(i=s[o+28>>2]))==(0|n))break t}for(;r=s[(i=i-4|0)>>2],s[i>>2]=0,r&&(rr(r+12|0,s[r+16>>2]),dr(r,s[r+4>>2]),ee(r)),(0|n)!=(0|i););}s[o+28>>2]=n;break e}if((0|r)==(0|(n=n+4|0)))break}e:if(!((0|a)>4)){t:if(i=h(a,12)+e|0,(0|(n=s[i+20>>2]))!=(0|(r=s[i+24>>2]))){for(;;){if(s[n>>2]==(0|t))break t;if((0|r)==(0|(n=n+4|0)))break}break e}(0|n)!=(0|r)&&((r=r-(o=n+4|0)|0)&&Ue(n,o,r),s[i+24>>2]=n+r)}if(i=s[e+20>>2],n=s[e+24>>2]-i|0){if(l=1&(o=(r=n>>2)>>>0>1?r:1),n=0,r>>>0>=2)for(o&=-2,r=0;(0|(d=s[(c=(a=n<<2)+i|0)>>2]))>(0|t)&&(s[c>>2]=d-1),(0|(c=s[(a=i+(4|a)|0)>>2]))>(0|t)&&(s[a>>2]=c-1),n=n+2|0,(0|o)!=(0|(r=r+2|0)););l&&((0|(r=s[(n=i+(n<<2)|0)>>2]))<=(0|t)||(s[n>>2]=r-1))}if(i=s[e+32>>2],n=s[e+36>>2]-i|0){if(l=1&(o=(r=n>>2)>>>0>1?r:1),n=0,r>>>0>=2)for(o&=-2,r=0;(0|(d=s[(c=(a=n<<2)+i|0)>>2]))>(0|t)&&(s[c>>2]=d-1),(0|(c=s[(a=i+(4|a)|0)>>2]))>(0|t)&&(s[a>>2]=c-1),n=n+2|0,(0|o)!=(0|(r=r+2|0)););l&&((0|(r=s[(n=i+(n<<2)|0)>>2]))<=(0|t)||(s[n>>2]=r-1))}if(i=s[e+44>>2],n=s[e+48>>2]-i|0){if(l=1&(o=(r=n>>2)>>>0>1?r:1),n=0,r>>>0>=2)for(o&=-2,r=0;(0|(d=s[(c=(a=n<<2)+i|0)>>2]))>(0|t)&&(s[c>>2]=d-1),(0|(c=s[(a=i+(4|a)|0)>>2]))>(0|t)&&(s[a>>2]=c-1),n=n+2|0,(0|o)!=(0|(r=r+2|0)););l&&((0|(r=s[(n=i+(n<<2)|0)>>2]))<=(0|t)||(s[n>>2]=r-1))}if(i=s[e+56>>2],n=s[e+60>>2]-i|0){if(l=1&(o=(r=n>>2)>>>0>1?r:1),n=0,r>>>0>=2)for(o&=-2,r=0;(0|(d=s[(c=(a=n<<2)+i|0)>>2]))>(0|t)&&(s[c>>2]=d-1),(0|(c=s[(a=i+(4|a)|0)>>2]))>(0|t)&&(s[a>>2]=c-1),n=n+2|0,(0|o)!=(0|(r=r+2|0)););l&&((0|(r=s[(n=i+(n<<2)|0)>>2]))<=(0|t)||(s[n>>2]=r-1))}if(n=(r=s[e+72>>2])-(e=s[e+68>>2])|0){if(o=1&(i=(r=n>>2)>>>0>1?r:1),n=0,r>>>0>=2)for(i&=-2,r=0;(0|(c=s[(a=(l=n<<2)+e|0)>>2]))>(0|t)&&(s[a>>2]=c-1),(0|(a=s[(l=e+(4|l)|0)>>2]))>(0|t)&&(s[l>>2]=a-1),n=n+2|0,(0|i)!=(0|(r=r+2|0)););o&&((0|(r=t))>=(0|(t=s[(e=e+(n<<2)|0)>>2]))||(s[e>>2]=t-1))}}}function ee(e){var t=0,r=0,n=0,i=0,o=0,a=0,c=0,l=0,d=0;e:if(e|=0){o=(n=e-8|0)+(e=-8&(t=s[e-4>>2]))|0;t:if(!(1&t)){if(!(3&t))break e;if((n=n-(t=s[n>>2])|0)>>>0<u[2885])break e;if(e=e+t|0,s[2886]==(0|n)){if(3==(3&(t=s[o+4>>2])))return s[2883]=e,s[o+4>>2]=-2&t,s[n+4>>2]=1|e,void(s[e+n>>2]=e)}else{if(t>>>0<=255){if(i=s[n+8>>2],t=t>>>3|0,(0|(r=s[n+12>>2]))==(0|i)){l=11524,d=s[2881]&Mr(t),s[l>>2]=d;break t}s[i+12>>2]=r,s[r+8>>2]=i;break t}if(c=s[n+24>>2],(0|n)==(0|(t=s[n+12>>2])))if((r=s[(i=n+20|0)>>2])||(r=s[(i=n+16|0)>>2])){for(;a=i,(r=s[(i=(t=r)+20|0)>>2])||(i=t+16|0,r=s[t+16>>2]););s[a>>2]=0}else t=0;else r=s[n+8>>2],s[r+12>>2]=t,s[t+8>>2]=r;if(!c)break t;i=s[n+28>>2];r:{if(s[(r=11828+(i<<2)|0)>>2]==(0|n)){if(s[r>>2]=t,t)break r;l=11528,d=s[2882]&Mr(i),s[l>>2]=d;break t}if(s[c+(s[c+16>>2]==(0|n)?16:20)>>2]=t,!t)break t}if(s[t+24>>2]=c,(r=s[n+16>>2])&&(s[t+16>>2]=r,s[r+24>>2]=t),!(r=s[n+20>>2]))break t;s[t+20>>2]=r,s[r+24>>2]=t}}if(!(n>>>0>=o>>>0)&&1&(t=s[o+4>>2])){t:{if(!(2&t)){if(s[2887]==(0|o)){if(s[2887]=n,e=s[2884]+e|0,s[2884]=e,s[n+4>>2]=1|e,s[2886]!=(0|n))break e;return s[2883]=0,void(s[2886]=0)}if(s[2886]==(0|o))return s[2886]=n,e=s[2883]+e|0,s[2883]=e,s[n+4>>2]=1|e,void(s[e+n>>2]=e);e=(-8&t)+e|0;r:if(t>>>0<=255){if(i=s[o+8>>2],t=t>>>3|0,(0|(r=s[o+12>>2]))==(0|i)){l=11524,d=s[2881]&Mr(t),s[l>>2]=d;break r}s[i+12>>2]=r,s[r+8>>2]=i}else{if(c=s[o+24>>2],(0|o)==(0|(t=s[o+12>>2])))if((r=s[(i=o+20|0)>>2])||(r=s[(i=o+16|0)>>2])){for(;a=i,(r=s[(i=(t=r)+20|0)>>2])||(i=t+16|0,r=s[t+16>>2]););s[a>>2]=0}else t=0;else r=s[o+8>>2],s[r+12>>2]=t,s[t+8>>2]=r;if(c){i=s[o+28>>2];n:{if(s[(r=11828+(i<<2)|0)>>2]==(0|o)){if(s[r>>2]=t,t)break n;l=11528,d=s[2882]&Mr(i),s[l>>2]=d;break r}if(s[c+(s[c+16>>2]==(0|o)?16:20)>>2]=t,!t)break r}s[t+24>>2]=c,(r=s[o+16>>2])&&(s[t+16>>2]=r,s[r+24>>2]=t),(r=s[o+20>>2])&&(s[t+20>>2]=r,s[r+24>>2]=t)}}if(s[n+4>>2]=1|e,s[e+n>>2]=e,s[2886]!=(0|n))break t;return void(s[2883]=e)}s[o+4>>2]=-2&t,s[n+4>>2]=1|e,s[e+n>>2]=e}if(e>>>0<=255)return t=11564+((e=e>>>3|0)<<3)|0,(r=s[2881])&(e=1<<e)?e=s[t+8>>2]:(s[2881]=e|r,e=t),s[t+8>>2]=n,s[e+12>>2]=n,s[n+12>>2]=t,void(s[n+8>>2]=e);i=31,s[n+16>>2]=0,s[n+20>>2]=0,e>>>0<=16777215&&(t=e>>>8|0,t<<=a=t+1048320>>>16&8,i=28+((t=((t<<=i=t+520192>>>16&4)<<(r=t+245760>>>16&2)>>>15|0)-(r|i|a)|0)<<1|e>>>t+21&1)|0),s[n+28>>2]=i,a=11828+(i<<2)|0;t:{r:{if((r=s[2882])&(t=1<<i)){for(i=e<<(31==(0|i)?0:25-(i>>>1|0)|0),t=s[a>>2];;){if(r=t,(-8&s[t+4>>2])==(0|e))break r;if(t=i>>>29|0,i<<=1,!(t=s[16+(a=r+(4&t)|0)>>2]))break}s[a+16>>2]=n,s[n+24>>2]=r}else s[2882]=t|r,s[a>>2]=n,s[n+24>>2]=a;s[n+12>>2]=n,s[n+8>>2]=n;break t}e=s[r+8>>2],s[e+12>>2]=n,s[r+8>>2]=n,s[n+24>>2]=0,s[n+12>>2]=r,s[n+8>>2]=e}e=s[2889]-1|0,s[2889]=e||-1}}}function te(e,t,r,n){var i,a=0,c=0,l=0,d=0,f=0,m=b(0),h=0,v=0,A=b(0);i=s[r>>2];e:{t:if(c=s[t+4>>2]){r:{if((l=Tr(c))>>>0>=2){if((a=i)>>>0>=c>>>0&&(a=(i>>>0)%(c>>>0)|0),!(r=s[s[t>>2]+(a<<2)>>2]))break t;if(l>>>0<=1)break r;for(;;){if(!(r=s[r>>2]))break t;if((0|(l=s[r+4>>2]))!=(0|i)&&(c>>>0<=l>>>0&&(l=(l>>>0)%(c>>>0)|0),(0|a)!=(0|l)))break t;if(s[r+8>>2]==(0|i))break}t=0;break e}if(a=c-1&i,!(r=s[s[t>>2]+(a<<2)>>2]))break t}for(l=c-1|0;;){if(!(r=s[r>>2]))break t;if((0|(d=s[r+4>>2]))!=(0|i)&(l&d)!=(0|a))break t;if(s[r+8>>2]==(0|i))break}t=0;break e}if(r=ur(16),n=s[s[n>>2]>>2],s[r+12>>2]=0,s[r+8>>2]=n,s[r+4>>2]=i,s[r>>2]=0,A=b(s[t+12>>2]+1>>>0),m=p[t+16>>2],!c||A>b(m*b(c>>>0))){l=0!=(c-1&c)|c>>>0<3|c<<1,a=2,1!=(0|(n=(n=(m=b(y(b(A/m))))<b(4294967296)&m>=b(0)?~~m>>>0:0)>>>0>l>>>0?n:l))&&(n&n-1?(a=F(n),c=s[t+4>>2]):a=n);t:{if(a>>>0<=c>>>0){if(a>>>0>=c>>>0)break t;if(l=c>>>0<3,n=(m=b(y(b(b(u[t+12>>2])/p[t+16>>2]))))<b(4294967296)&m>=b(0)?~~m>>>0:0,(a=(n=l||Tr(c)>>>0>1?F(n):n>>>0<2?n:1<<32-g(n-1|0))>>>0>a>>>0?n:a)>>>0>=c>>>0)break t}c=0,d=a;r:{n:{i:{o:{if(a){if(d>>>0>=1073741824)break o;if(a=ur(d<<2),n=s[t>>2],s[t>>2]=a,n&&ee(n),s[t+4>>2]=d,a=0,d-1>>>0>=3)for(l=-4&d;s[(n=a<<2)+s[t>>2]>>2]=0,s[s[t>>2]+(4|n)>>2]=0,s[s[t>>2]+(8|n)>>2]=0,s[s[t>>2]+(12|n)>>2]=0,a=a+4|0,(0|l)!=(0|(c=c+4|0)););if(n=3&d)for(;s[s[t>>2]+(a<<2)>>2]=0,a=a+1|0,(0|n)!=(0|(f=f+1|0)););if(!(c=s[t+8>>2]))break r;if(n=t+8|0,l=s[c+4>>2],(a=Tr(d))>>>0<2)break i;if(l=l>>>0>=d>>>0?(l>>>0)%(d>>>0)|0:l,s[s[t>>2]+(l<<2)>>2]=n,!(n=s[c>>2]))break r;if(a>>>0<=1)break n;for(;;){if(d>>>0<=(f=s[n+4>>2])>>>0&&(f=(f>>>0)%(d>>>0)|0),(0|l)!=(0|f))if(a=n,v=(h=f<<2)+s[t>>2]|0,s[v>>2]){for(;f=a,a=s[a>>2],s[n+8>>2]==s[a+8>>2]&&a;);s[c>>2]=a,s[f>>2]=s[s[h+s[t>>2]>>2]>>2],s[s[h+s[t>>2]>>2]>>2]=n}else s[v>>2]=c,c=n,l=f;else c=n;if(!(n=s[c>>2]))break}break r}n=s[t>>2],s[t>>2]=0,n&&ee(n),s[t+4>>2]=0;break r}qt(1326),T()}if(l&=d-1,s[s[t>>2]+(l<<2)>>2]=n,!(n=s[c>>2]))break r}for(h=d-1|0;;){if((0|(d=h&s[n+4>>2]))!=(0|l))if(a=n,v=(f=d<<2)+s[t>>2]|0,s[v>>2]){for(;d=a,a=s[a>>2],s[n+8>>2]==s[a+8>>2]&&a;);s[c>>2]=a,s[d>>2]=s[s[f+s[t>>2]>>2]>>2],s[s[f+s[t>>2]>>2]>>2]=n}else s[v>>2]=c,c=n,l=d;else c=n;if(!(n=s[c>>2]))break}}}a=(n=(c=s[t+4>>2])-1|0)&c?c>>>0>i>>>0?i:(i>>>0)%(c>>>0)|0:n&i}a=s[t>>2]+(a<<2)|0;t:if(n=s[a>>2])s[r>>2]=s[n>>2],s[n>>2]=r;else{if(s[r>>2]=s[t+8>>2],s[t+8>>2]=r,s[a>>2]=t+8,!(n=s[r>>2]))break t;n=s[n+4>>2],(a=c-1|0)&c?n>>>0<c>>>0||(n=(n>>>0)%(c>>>0)|0):n&=a,s[s[t>>2]+(n<<2)>>2]=r}s[t+12>>2]=s[t+12>>2]+1,t=1}o[e+4|0]=t,s[e>>2]=r}function re(e){var t=0,r=0,n=0,i=0,o=0,a=0,c=0,l=0,d=0,f=0;s[e+56>>2]=s[e+52>>2],s[e+44>>2]=s[e+40>>2];e:{t:{r:{if(i=s[e+64>>2],(0|(r=s[i+24>>2]))!=s[i+28>>2])for(;;){n=t;n:if(-1!=(0|(l=s[(f<<2)+r>>2]))){if((0|(t=s[e+56>>2]))==s[e+60>>2]){if((t=1+(a=(i=t-(r=s[e+52>>2])|0)>>2)|0)>>>0>=1073741824)break r;if(o=i>>1,o=a>>>0<536870911?t>>>0>o>>>0?t:o:1073741823){if(o>>>0>=1073741824)break e;t=ur(o<<2)}else t=0;s[(a=t+(a<<2)|0)>>2]=n,(0|i)>0&&ye(t,r,i),s[e+60>>2]=t+(o<<2),s[e+56>>2]=a+4,s[e+52>>2]=t,r&&ee(r)}else s[t>>2]=n,s[e+56>>2]=t+4;i:if(s[s[e+12>>2]+(f>>>3&536870908)>>2]>>>f&1&&-1!=(0|(t=((t=l+1|0)>>>0)%3|0?t:l-2|0))&&(i=s[e>>2],!(s[i+(t>>>3&536870908)>>2]>>>t&1)&&-1!=(0|(t=s[s[s[e+64>>2]+12>>2]+(t<<2)>>2]))&&-1!=(0|(r=((r=t+1|0)>>>0)%3|0?r:t-2|0))))for(o=s[e+64>>2];;){if(l=r,-1==(0|(t=((t=r+1|0)>>>0)%3|0?t:r-2|0))|s[i+(t>>>3&536870908)>>2]>>>t&1)break i;if(-1==(0|(t=s[s[o+12>>2]+(t<<2)>>2])))break i;if(-1==(0|(r=((r=t+1|0)>>>0)%3|0?r:t-2|0)))break}if(s[s[e+28>>2]+(l<<2)>>2]=n,(0|(t=s[e+44>>2]))==s[e+48>>2]){if((t=1+(a=(i=t-(r=s[e+40>>2])|0)>>2)|0)>>>0>=1073741824)break t;if(o=i>>1,o=a>>>0<536870911?t>>>0>o>>>0?t:o:1073741823){if(o>>>0>=1073741824)break e;t=ur(o<<2)}else t=0;s[(a=t+(a<<2)|0)>>2]=l,(0|i)>0&&ye(t,r,i),s[e+48>>2]=t+(o<<2),s[e+44>>2]=a+4,s[e+40>>2]=t,r&&ee(r)}else s[t>>2]=l,s[e+44>>2]=t+4;if(t=n+1|0,i=s[e+64>>2],(l>>>0)%3|0)r=l-1|0;else if(-1==(0|(r=l+2|0)))break n;if(-1!=(0|(r=s[s[i+12>>2]+(r<<2)>>2]))&&!(-1==(0|(r=r+((r>>>0)%3|0?-1:2)|0))|(0|r)==(0|l)))for(;;){if(i=((i=r+1|0)>>>0)%3|0?i:r-2|0,s[s[e>>2]+(i>>>3&536870908)>>2]>>>i&1){if((0|(n=s[e+56>>2]))==s[e+60>>2]){if((n=1+(c=(o=n-(i=s[e+52>>2])|0)>>2)|0)>>>0>=1073741824)break r;if(a=o>>1,a=c>>>0<536870911?n>>>0>a>>>0?n:a:1073741823){if(a>>>0>=1073741824)break e;n=ur(a<<2)}else n=0;s[(c=n+(c<<2)|0)>>2]=t,(0|o)>0&&ye(n,i,o),s[e+60>>2]=n+(a<<2),s[e+56>>2]=c+4,s[e+52>>2]=n,i&&ee(i)}else s[n>>2]=t,s[e+56>>2]=n+4;if(i=t+1|0,(0|(n=s[e+44>>2]))==s[e+48>>2]){if((n=1+(d=(a=n-(o=s[e+40>>2])|0)>>2)|0)>>>0>=1073741824)break t;if(c=a>>1,c=d>>>0<536870911?n>>>0>c>>>0?n:c:1073741823){if(c>>>0>=1073741824)break e;n=ur(c<<2)}else n=0;s[(d=n+(d<<2)|0)>>2]=r,(0|a)>0&&ye(n,o,a),s[e+48>>2]=n+(c<<2),s[e+44>>2]=d+4,s[e+40>>2]=n,o&&ee(o)}else s[n>>2]=r,s[e+44>>2]=n+4;n=t,t=i}if(s[s[e+28>>2]+(r<<2)>>2]=n,i=s[e+64>>2],(r>>>0)%3|0)r=r-1|0;else if(-1==(0|(r=r+2|0)))break n;if(-1==(0|(r=s[s[i+12>>2]+(r<<2)>>2])))break n;if(-1==(0|(r=r+((r>>>0)%3|0?-1:2)|0)))break n;if((0|r)==(0|l))break}}if(f=f+1|0,r=s[i+24>>2],!(f>>>0<s[i+28>>2]-r>>2>>>0))break}return}nn(),T()}nn(),T()}qt(1326),T()}function ne(e,t){var r=0,n=0,i=0,o=0,a=0,c=0,l=0,d=0,f=0;if(-1==(0|t))return 1;if(r=(t>>>0)/3|0,!(s[s[e+24>>2]+(r>>>3&268435452)>>2]>>>r&1)){if(n=s[e+48>>2],s[e+52>>2]=n,(0|n)==s[e+56>>2]?(i=ur(4),s[i>>2]=t,o=i+4|0,s[e+56>>2]=o,s[e+52>>2]=o,s[e+48>>2]=i,n&&ee(n)):(s[n>>2]=t,s[e+52>>2]=n+4),o=s[s[e+4>>2]+28>>2],-1==(0|(n=s[o+((i=((n=t+1|0)>>>0)%3|0?n:t-2|0)<<2)>>2])))return 0;if(a=(t-h(r,3)|0?-1:2)+t|0,-1==(0|(r=s[o+(a<<2)>>2])))return 0;if(t=s[e+36>>2],(c=s[(o=t+(n>>>3&536870908)|0)>>2])&(l=1<<n)||(s[o>>2]=c|l,Me(e+8|0,n,i),t=s[e+36>>2]),(n=s[(t=(r>>>3&536870908)+t|0)>>2])&(i=1<<r)||(s[t>>2]=n|i,Me(e+8|0,r,a)),(0|(r=s[e+52>>2]))==s[e+48>>2])return 1;for(f=e+8|0;;){n=((t=s[(r=r-4|0)>>2])>>>0)/3|0;e:{t:if(-1!=(0|t)&&(i=s[e+24>>2]+(n>>>3&268435452)|0,!((o=s[i>>2])&(n=1<<n)))){if(s[i>>2]=n|o,i=s[e+4>>2],-1==(0|(n=s[s[i+28>>2]+(t<<2)>>2])))return 0;for(;;){r=t;r:{if(o=s[e+36>>2]+(n>>>3&536870908)|0,!((a=s[o>>2])&(c=1<<n)))if(-1==(0|(t=s[s[i+40>>2]+(n<<2)>>2]))||-1==(0|(t=((l=t+1|0)>>>0)%3|0?l:t-2|0))|s[s[i>>2]+(t>>>3&536870908)>>2]>>>t&1||-1==(0|(t=s[s[s[i+64>>2]+12>>2]+(t<<2)>>2])))s[o>>2]=a|c,Me(f,n,r);else if(s[o>>2]=a|c,Me(f,n,r),-1!=(0|(((n=t+1|0)>>>0)%3|0?n:t-2|0))){t=-1,i=s[e+4>>2],-1!=(0|r)&&(-1==(0|(n=((n=r+1|0)>>>0)%3|0?n:r-2|0))|s[s[i>>2]+(n>>>3&536870908)>>2]>>>n&1||(t=s[s[s[i+64>>2]+12>>2]+(n<<2)>>2])),c=1<<(n=(t>>>0)/3|0),r=s[e+24>>2],o=s[r+((l=n>>>5|0)<<2)>>2];break r}n:{if(-1!=(0|r)){n=-1,t=((t=r+1|0)>>>0)%3|0?t:r-2|0,i=s[e+4>>2],-1==(0|t)|s[s[i>>2]+(t>>>3&536870908)>>2]>>>t&1||(n=s[s[s[i+64>>2]+12>>2]+(t<<2)>>2]);i:{if((r>>>0)%3|0)r=r-1|0;else if(t=-1,-1==(0|(r=r+2|0)))break i;t=-1,s[s[i>>2]+(r>>>3&536870908)>>2]>>>r&1||(t=s[s[s[i+64>>2]+12>>2]+(r<<2)>>2])}if(a=(d=-1==(0|t))?-1:(t>>>0)/3|0,o=(n>>>0)/3|0,!((c=-1==(0|n))||(r=s[e+24>>2],(o=s[r+((l=(c=c?-1:o)>>>5|0)<<2)>>2])&(c=1<<c))))break n;if(!(d||(c=1<<a,r=s[e+24>>2],c&(o=s[r+((l=a>>>5|0)<<2)>>2]))))break r}r=s[e+52>>2]-4|0,s[e+52>>2]=r;break e}if(d)t=n;else if(s[(a>>>3&536870908)+r>>2]>>>a&1)t=n;else{if(r=s[e+52>>2],s[r-4>>2]=t,(0|r)!=s[e+56>>2]){s[r>>2]=n,r=r+4|0;break t}n:{if((t=1+(r=(o=r-(i=s[e+48>>2])|0)>>2)|0)>>>0<1073741824){if(a=o>>1,a=r>>>0<536870911?t>>>0>a>>>0?t:a:1073741823){if(a>>>0>=1073741824)break n;t=ur(a<<2)}else t=0;if(s[(r=t+(r<<2)|0)>>2]=n,r=r+4|0,(0|o)>0&&ye(t,i,o),s[e+56>>2]=t+(a<<2),s[e+52>>2]=r,s[e+48>>2]=t,!i)break e;ee(i),r=s[e+52>>2];break e}nn(),T()}qt(1326),T()}}if(s[(l<<2)+r>>2]=o|c,-1==(0|(n=s[s[i+28>>2]+(t<<2)>>2])))break}return 0}s[e+52>>2]=r}if(s[e+48>>2]==(0|r))break}}return 1}function ie(e,t,r){var n,i=0,o=0,a=0,c=0,l=0,d=0,f=0,u=0,p=0,m=0,b=0,v=0,g=0;n=h(t,12)+e|0,s[n+12>>2]=s[n+8>>2],u=-1==(0|r)?-1:(r>>>0)/3|0,m=1,d=r;e:{t:{r:{for(;;){n:{if(b=1&o){if(-1==(0|d))break n;if(-1==(0|Ze(e,((d>>>0)%3|0?-1:2)+d|0)))break e;if(-1==(0|(i=((r=d+1|0)>>>0)%3|0?r:d-2|0)))break e;if(-1==(0|(r=((r=i+1|0)>>>0)%3|0?r:i-2|0)))break e;if(-1==(0|(i=s[s[s[e+4>>2]+12>>2]+(r<<2)>>2])))break e;if(-1==(0|(r=((r=i+1|0)>>>0)%3|0?r:i-2|0)))break e;u=(r>>>0)/3|0}if(f=1<<u,c=s[e+56>>2]+(u>>>3&536870908)|0,!(f&(p=s[c>>2]))){for(o=0;;){if(s[c>>2]=p|f,(0|(i=s[n+12>>2]))==s[n+16>>2]){if((l=1+(a=(f=i-(c=s[n+8>>2])|0)>>2)|0)>>>0>=1073741824)break r;if(i=f>>1,p=a>>>0<536870911?i>>>0<l>>>0?l:i:1073741823){if(p>>>0>=1073741824)break t;i=ur(p<<2)}else i=0;s[(l=i+(a<<2)|0)>>2]=u,(0|f)>0&&ye(i,c,f),s[n+8>>2]=i,s[n+12>>2]=l+4,s[n+16>>2]=i+(p<<2),c&&ee(c)}else s[i>>2]=u,s[n+12>>2]=i+4;l=o+1|0;i:{o:{if(o)if(1&l){if(-1==(0|r)){r=-1;break i}r=((i=r+1|0)>>>0)%3|0?i:r-2|0}else{if(d=b?r:d,-1==(0|r)){r=-1;break i}if((r>>>0)%3|0){o=r-1|0;break o}r=r+2|0}if(i=r,r=-1,o=i,-1==(0|i))break i}if(r=s[s[s[e+4>>2]+12>>2]+(o<<2)>>2],c=-1,p=-1,(0|(a=((i=o+1|0)>>>0)%3|0?i:o-2|0))>=0&&(i=(a>>>0)/3|0,p=s[(s[s[e>>2]+96>>2]+h(i,12)|0)+(a-h(i,3)<<2)>>2]),-1!=(0|r)?(f=0,(0|(a=((r>>>0)%3|0?-1:2)+r|0))<0||(i=(a>>>0)/3|0,c=s[(s[s[e>>2]+96>>2]+h(i,12)|0)+(a-h(i,3)<<2)>>2])):f=1,(0|c)==(0|p)){o:{a:{s:{c:{if((0|(o=((o>>>0)%3|0?-1:2)+o|0))>=0){if(i=(o>>>0)/3|0,c=s[(s[s[e>>2]+96>>2]+h(i,12)|0)+(o-h(i,3)<<2)>>2],o=-1,!f)break c;break s}if(c=-1,f)break a}(0|(o=((i=r+1|0)>>>0)%3|0?i:r-2|0))<0?o=-1:(i=(o>>>0)/3|0,o=s[(s[s[e>>2]+96>>2]+h(i,12)|0)+(o-h(i,3)<<2)>>2])}if((0|o)!=(0|c)){r=-1;break i}if(-1!=(0|r))break o;r=-1;break i}if(-1==(0|r)){r=-1;break i}}if(o=l,u=(r>>>0)/3|0,c=s[e+56>>2]+(u>>>3&268435452)|0,!((p=s[c>>2])&(f=1<<u)))continue}else r=-1}break}!b|!(1&l)||(a=s[n+12>>2]-4|0,l=s[a>>2],o=s[e+56>>2]+(l>>>3&536870908)|0,i=s[o>>2],v=o,g=Mr(l)&i,s[v>>2]=g,s[n+12>>2]=a)}if(o=1,i=m,m=0,i)continue;break e}break}d=-1,Ze(e,-1);break e}nn(),T()}qt(1326),T()}if(s[44+((t<<2)+e|0)>>2]=d,a=s[n+8>>2],t=s[n+12>>2]-a|0){if(d=s[e+56>>2],l=1&(e=(t>>=2)>>>0>1?t:1),r=0,t>>>0>=2)for(m=-2&e,u=0;i=s[(o=r<<2)+a>>2],e=s[(t=d+(i>>>3&536870908)|0)>>2],v=t,g=Mr(i)&e,s[v>>2]=g,i=s[a+(4|o)>>2],e=s[(t=d+(i>>>3&536870908)|0)>>2],v=t,g=Mr(i)&e,s[v>>2]=g,r=r+2|0,(0|m)!=(0|(u=u+2|0)););l&&(r=s[a+(r<<2)>>2],e=s[(t=d+(r>>>3&536870908)|0)>>2],v=t,g=Mr(r)&e,s[v>>2]=g)}}function oe(e,t){var r=0,n=0,i=0,o=0,a=0,c=0,l=0,d=0;if(-1==(0|t))return 1;if(n=(t>>>0)/3|0,!(s[s[e+24>>2]+(n>>>3&268435452)>>2]>>>n&1)){if(r=s[e+48>>2],s[e+52>>2]=r,(0|r)==s[e+56>>2]?(i=ur(4),s[i>>2]=t,o=i+4|0,s[e+56>>2]=o,s[e+52>>2]=o,s[e+48>>2]=i,r&&ee(r)):(s[r>>2]=t,s[e+52>>2]=r+4),i=-1,o=s[e+4>>2],-1!=(0|(a=((r=t+1|0)>>>0)%3|0?r:t-2|0))&&(i=s[s[o>>2]+(a<<2)>>2]),c=t-h(n,3)|0)r=t-1|0;else if(-1==(0|(r=t+2|0)))return 0;if(-1==(0|i))return 0;if(-1==(0|(n=s[s[o>>2]+(r<<2)>>2])))return 0;if(r=s[e+36>>2],(l=s[(o=r+(i>>>3&536870908)|0)>>2])&(d=1<<i)||(s[o>>2]=l|d,Me(e+8|0,i,a),r=s[e+36>>2]),(i=s[(r=(n>>>3&536870908)+r|0)>>2])&(o=1<<n)||(s[r>>2]=i|o,Me(e+8|0,n,(c?-1:2)+t|0)),(0|(r=s[e+52>>2]))==s[e+48>>2])return 1;for(d=e+8|0;;){n=((t=s[(r=r-4|0)>>2])>>>0)/3|0;e:{t:if(-1!=(0|t)&&(i=s[e+24>>2]+(n>>>3&268435452)|0,!((o=s[i>>2])&(n=1<<n)))){for(s[i>>2]=n|o;;){if(n=s[e+4>>2],-1==(0|(r=s[s[n>>2]+(t<<2)>>2])))return 0;r:{if(i=s[e+36>>2]+(r>>>3&536870908)|0,!((o=s[i>>2])&(a=1<<r)))if(-1!=(0|(c=s[s[n+24>>2]+(r<<2)>>2]))&&-1!=(0|(c=((l=c+1|0)>>>0)%3|0?l:c-2|0))&&-1!=(0|(n=s[s[n+12>>2]+(c<<2)>>2]))){if(s[i>>2]=o|a,Me(d,r,t),-1!=(0|(((r=n+1|0)>>>0)%3|0?r:n-2|0))){n=t-2|0,r=t+1|0,t=-1,-1!=(0|(r=(r>>>0)%3|0?r:n))&&(t=s[s[s[e+4>>2]+12>>2]+(r<<2)>>2]),a=1<<(r=(t>>>0)/3|0),i=s[e+24>>2],n=s[i+((c=r>>>5|0)<<2)>>2];break r}}else s[i>>2]=o|a,Me(d,r,t);r=-1,o=s[e+4>>2],-1!=(0|(n=((n=t+1|0)>>>0)%3|0?n:t-2|0))&&(r=s[s[o+12>>2]+(n<<2)>>2]);n:{if((t>>>0)%3|0)i=t-1|0;else if(i=t+2|0,t=-1,-1==(0|i))break n;t=s[s[o+12>>2]+(i<<2)>>2]}if(o=(l=-1==(0|t))?-1:(t>>>0)/3|0,n=(r>>>0)/3|0,(a=-1==(0|r))||(i=s[e+24>>2],(n=s[i+((c=(a=a?-1:n)>>>5|0)<<2)>>2])&(a=1<<a))){if(!(l||(a=1<<o,i=s[e+24>>2],a&(n=s[i+((c=o>>>5|0)<<2)>>2]))))break r;r=s[e+52>>2]-4|0,s[e+52>>2]=r;break e}if(l)t=r;else if(s[(o>>>3&536870908)+i>>2]>>>o&1)t=r;else{if(n=s[e+52>>2],s[n-4>>2]=t,(0|n)!=s[e+56>>2]){s[n>>2]=r,r=n+4|0;break t}n:{if((t=1+(a=(i=(t=n)-(n=s[e+48>>2])|0)>>2)|0)>>>0<1073741824){if(o=i>>1,o=a>>>0<536870911?t>>>0>o>>>0?t:o:1073741823){if(o>>>0>=1073741824)break n;t=ur(o<<2)}else t=0;if(s[(a=t+(a<<2)|0)>>2]=r,r=a+4|0,(0|i)>0&&ye(t,n,i),s[e+56>>2]=t+(o<<2),s[e+52>>2]=r,s[e+48>>2]=t,!n)break e;ee(n),r=s[e+52>>2];break e}nn(),T()}qt(1326),T()}}if(s[(c<<2)+i>>2]=n|a,-1==(0|t))break}return 0}s[e+52>>2]=r}if(s[e+48>>2]==(0|r))break}}return 1}function ae(e,t,r){t|=0,r|=0;var n=0,i=0,a=0,c=0,l=0,f=0,u=0,p=0,m=0,b=0,v=0,g=0;e:if(!((0|(v=0|vn[s[s[(e|=0)>>2]+44>>2]](e)))<=0)&&(i=s[t+4>>2]-s[t>>2]>>2,N=c=N+-64|0,n=Jt(c),a=h(s[2549],v),lr(n,s[s[e+8>>2]+56>>2],v<<24>>24,5,0,a,a>>31),n=Ke(a=ur(96),n),o[n+84|0]=1,s[n+72>>2]=s[n+68>>2],Xe(n,i),s[n+60>>2]=s[s[e+8>>2]+60>>2],n=s[e+16>>2],s[e+16>>2]=a,n&&Lt(n),N=c- -64|0,c=s[e+16>>2],s[c+80>>2]&&(f=s[s[c>>2]>>2])&&!((0|(l=s[r+12>>2]))<=(0|(n=s[r+20>>2]))&(u=s[r+8>>2])>>>0<=(a=s[r+16>>2])>>>0|(0|n)>(0|l)))){p=h(i,v),f=f+s[c+48>>2]|0,m=s[r>>2],b=d[m+a|0],i=(c=a+1|0)?n:n+1|0,s[r+16>>2]=c,s[r+20>>2]=i;t:{r:{n:{if(b){if(E(p,v,r,f))break n;break e}if((0|i)>=(0|l)&c>>>0>=u>>>0|(0|i)>(0|l))break e;c=d[c+m|0],n=(i=a+2|0)>>>0<2?n+1|0:n,s[r+16>>2]=i,s[r+20>>2]=n,n=s[s[e+16>>2]+64>>2],n=s[n+4>>2]-s[n>>2]|0;i:{if((0|c)==s[2549]){if((i=n)>>>0<(n=p<<2)>>>0)break e;if(l=s[r+8>>2],c=s[r+12>>2],i=s[r+20>>2],(0|(i=(a=n+(u=s[r+16>>2])|0)>>>0<n>>>0?i+1|0:i))<=(0|c)&a>>>0<=l>>>0|(0|i)<(0|c))break i;break e}if(n>>>0<h(c,p)>>>0)break e;if(l=s[r+12>>2],i=s[r+20>>2],(a=m=s[r+8>>2])-(u=s[r+16>>2])>>>0<Ht(n=c,0,p,0)>>>0&(0|(a=l-(i+(a>>>0<u>>>0)|0)|0))<=(0|(b=R))|(0|a)<(0|b))break e;if(a=1,!p)break r;if(a=0,(b=m)>>>0<(m=n+u|0)>>>0&(0|(i=m>>>0<n>>>0?i+1|0:i))>=(0|l)|(0|i)>(0|l))break t;for(;;){if(ye(f+(g<<2)|0,u+s[r>>2]|0,c),i=s[r+20>>2],i=(l=n+s[r+16>>2]|0)>>>0<n>>>0?i+1|0:i,u=l,s[r+16>>2]=l,s[r+20>>2]=i,(0|p)==(0|(g=g+1|0)))break n;if(b=s[r+8>>2],!((0|(i=(m=n+u|0)>>>0<n>>>0?i+1|0:i))<=(0|(l=s[r+12>>2]))&m>>>0<=b>>>0|(0|i)<(0|l)))break}break t}ye(f,u+s[r>>2]|0,n),i=n,c=n+s[r+16>>2]|0,n=s[r+20>>2],s[r+16>>2]=c,s[r+20>>2]=i>>>0>c>>>0?n+1|0:n}if(a=1,p&&!((n=s[e+20>>2])&&(a=0,0|vn[s[s[n>>2]+32>>2]](n)))){if(n=0,a=0,!((0|p)<=0)){if(1!=(0|p))for(l=-2&p;c=s[(i=n<<2)+f>>2],s[i+f>>2]=0-(1&c)^c>>>1,i=s[(c=4|i)+f>>2],s[c+f>>2]=0-(1&i)^i>>>1,n=n+2|0,(0|l)!=(0|(a=a+2|0)););1&p&&(n=s[(i=n<<2)+f>>2],s[i+f>>2]=0-(1&n)^n>>>1)}a=0}}if(n=s[e+20>>2]){if(!(0|vn[s[s[n>>2]+40>>2]](n,r)))break e;if(!(a||(a=0,e=s[e+20>>2],0|vn[s[s[e>>2]+44>>2]](e,f,f,p,v,s[t>>2]))))break t}a=1}return 0|a}return 0}function se(e,t){e|=0;var r,n=0,i=0,a=0,c=0,l=0,f=0,u=0,p=0,m=0;N=r=N-32|0;e:{t:if(xt(1,r+28|0,t|=0))r:{if(i=s[r+28>>2]){if(Ie(e+60|0,i),s[(n=r+8|0)>>2]=0,s[n+4>>2]=0,o[n+5|0]=0,o[n+6|0]=0,o[n+7|0]=0,o[n+8|0]=0,o[n+9|0]=0,o[n+10|0]=0,o[n+11|0]=0,o[n+12|0]=0,!Ne(n,t))break r;for(;c=1<<a,f=Gt(n),l=s[e+60>>2]+(a>>>3&536870908)|0,f?c|=s[l>>2]:c=s[l>>2]&(-1^c),s[l>>2]=c,(0|i)!=(0|(a=a+1|0)););}if(!xt(1,r+28|0,t))break t;if(i=s[r+28>>2]){if(a=0,Ie(e+72|0,i),s[(n=r+8|0)>>2]=0,s[n+4>>2]=0,o[n+5|0]=0,o[n+6|0]=0,o[n+7|0]=0,o[n+8|0]=0,o[n+9|0]=0,o[n+10|0]=0,o[n+11|0]=0,o[n+12|0]=0,!Ne(n,t))break r;for(;c=1<<a,f=Gt(n),l=s[e+72>>2]+(a>>>3&536870908)|0,f?c|=s[l>>2]:c=s[l>>2]&(-1^c),s[l>>2]=c,(0|i)!=(0|(a=a+1|0)););}if(!xt(1,r+28|0,t))break t;if(i=s[r+28>>2]){if(a=0,Ie(e+84|0,i),s[(n=r+8|0)>>2]=0,s[n+4>>2]=0,o[n+5|0]=0,o[n+6|0]=0,o[n+7|0]=0,o[n+8|0]=0,o[n+9|0]=0,o[n+10|0]=0,o[n+11|0]=0,o[n+12|0]=0,!Ne(n,t))break r;for(;c=1<<a,f=Gt(n),l=s[e+84>>2]+(a>>>3&536870908)|0,f?c|=s[l>>2]:c=s[l>>2]&(-1^c),s[l>>2]=c,(0|i)!=(0|(a=a+1|0)););}if(!xt(1,r+28|0,t))break t;if(i=s[r+28>>2]){if(a=0,Ie(e+96|0,i),s[(n=r+8|0)>>2]=0,s[n+4>>2]=0,o[n+5|0]=0,o[n+6|0]=0,o[n+7|0]=0,o[n+8|0]=0,o[n+9|0]=0,o[n+10|0]=0,o[n+11|0]=0,o[n+12|0]=0,!Ne(n,t))break r;for(;c=1<<a,f=Gt(n),l=s[e+96>>2]+(a>>>3&536870908)|0,f?c|=s[l>>2]:c=s[l>>2]&(-1^c),s[l>>2]=c,(0|i)!=(0|(a=a+1|0)););}if(a=0,c=i=s[t+12>>2],l=n=s[t+20>>2],n=(u=(f=s[t+16>>2])+4|0)>>>0<4?n+1|0:n,(p=s[t+8>>2])>>>0<u>>>0&(0|n)>=(0|i)|(0|n)>(0|i))break e;if(m=s[t>>2],i=d[0|(i=m+f|0)]|d[i+1|0]<<8|d[i+2|0]<<16|d[i+3|0]<<24,s[t+16>>2]=u,s[t+20>>2]=n,n=l,f=l=f+8|0,l=n=l>>>0<8?n+1|0:n,f>>>0>p>>>0&(0|n)>=(0|c)|(0|n)>(0|c))break e;if(n=d[0|(n=u+m|0)]|d[n+1|0]<<8|d[n+2|0]<<16|d[n+3|0]<<24,s[t+16>>2]=f,s[t+20>>2]=l,(0|n)<(0|i))break e;if(s[e+16>>2]=n,s[e+12>>2]=i,!(t=(n>>31)-((i>>31)+(n>>>0<i>>>0)|0)|0)&(n=n-i|0)>>>0>2147483646|t)break e;if(a=1,t=n+1|0,s[e+20>>2]=t,n=t>>>1|0,s[e+24>>2]=n,s[e+28>>2]=0-n,1&t)break e;s[e+24>>2]=n-1;break e}a=0}return N=r+32|0,0|a}function ce(e,t){var r=0,n=0,i=0,o=0,a=0,c=0,l=0,u=0,p=0,m=0,h=0,b=0,v=0;e:if(f[t+38>>1]&&Tt(1,e+12|0,t)){if(o=s[e+12>>2],r=s[e>>2],o>>>0>(n=s[e+4>>2]-r>>2)>>>0?(ct(e,o-n|0),o=s[e+12>>2]):n>>>0<=o>>>0||(s[e+4>>2]=r+(o<<2)),!o)return 1;for(u=s[t+8>>2],l=s[t+12>>2],m=s[e>>2];;){if((0|l)<=(0|(n=s[t+20>>2]))&u>>>0<=(r=s[t+16>>2])>>>0|(0|n)>(0|l))return 0;h=s[t>>2],p=d[h+r|0],n=(r=r+1|0)?n:n+1|0,c=r,s[t+16>>2]=r,s[t+20>>2]=n,r=p>>>2|0,i=0;t:{r:{n:{i:switch(0|(b=3&p)){case 3:break i;case 0:break r;default:break n}if((n=r+a|0)>>>0>=o>>>0)return 0;We(m+(a<<2)|0,0,4+(252&p)|0),a=n;break t}for(;;){if((0|n)>=(0|l)&c>>>0>=u>>>0|(0|n)>(0|l))break e;if(o=d[c+h|0],n=(c=c+1|0)?n:n+1|0,s[t+16>>2]=c,s[t+20>>2]=n,r|=o<<(i<<3|6),(0|b)==(0|(i=i+1|0)))break}}s[m+(a<<2)>>2]=r}if(!((o=s[e+12>>2])>>>0>(a=a+1|0)>>>0))break}if(n=e+16|0,p=s[e>>2],t=s[e+16>>2],(a=(r=s[e+20>>2]-t|0)>>2)>>>0<=4095?ct(n,4096-a|0):16384!=(0|r)&&(s[e+20>>2]=t+16384),a=s[(t=e+28|0)>>2],(r=s[e+32>>2]-a>>3)>>>0<o>>>0)lt(t,o-r|0),a=s[t>>2];else if(r>>>0>o>>>0&&(s[e+32>>2]=(o<<3)+a),!o)break e;for(i=0,e=0;;){if(l=s[(t=p+(i<<2)|0)>>2],r=e,s[4+(c=(i<<3)+a|0)>>2]=e,s[c>>2]=l,(e=(l=s[t>>2])+e|0)>>>0>4096)break e;if(!(e>>>0<=r>>>0)){if(c=s[n>>2],t=0,u=7&l)for(;s[c+(r<<2)>>2]=i,r=r+1|0,(0|u)!=(0|(t=t+1|0)););if(!(l-1>>>0<=6))for(;s[(t=c+(r<<2)|0)>>2]=i,s[t+28>>2]=i,s[t+24>>2]=i,s[t+20>>2]=i,s[t+16>>2]=i,s[t+12>>2]=i,s[t+8>>2]=i,s[t+4>>2]=i,(0|(r=r+8|0))!=(0|e););}if((0|o)==(0|(i=i+1|0)))break}v=4096==(0|e)}return v}function le(e,t,r){e|=0,t|=0,r|=0;var n,i=0,o=0,a=0,c=0,l=0,d=0,f=0,u=0;N=n=N-16|0,s[n+8>>2]=r;e:if(!((0|(a=(o=s[e+12>>2])-(i=s[e+8>>2])>>2))>(0|t)))if((l=t+1|0)>>>0>a>>>0){if((a=l-a|0)>>>0<=(c=s[e+16>>2])-(i=s[e+12>>2])>>2>>>0){a&&(i=We(o=i,0,i=a<<2)+i|0),s[e+12>>2]=i;break e}t:{r:{n:{if((o=(f=i-(l=s[e+8>>2])>>2)+a|0)>>>0<1073741824){if(u=(c=c-l|0)>>1,c=c>>2>>>0<536870911?o>>>0>u>>>0?o:u:1073741823){if(c>>>0>=1073741824)break n;d=ur(c<<2)}if(f=(a=We(o=(f<<2)+d|0,0,f=a<<2))+f|0,c=(c<<2)+d|0,(0|i)==(0|l))break r;for(;a=s[(i=i-4|0)>>2],s[i>>2]=0,s[(o=o-4|0)>>2]=a,(0|i)!=(0|l););if(s[e+16>>2]=c,a=s[e+12>>2],s[e+12>>2]=f,i=s[e+8>>2],s[e+8>>2]=o,(0|i)==(0|a))break t;for(;o=s[(a=a-4|0)>>2],s[a>>2]=0,o&&Lt(o),(0|i)!=(0|a););break t}nn(),T()}qt(1326),T()}s[e+16>>2]=c,s[e+12>>2]=f,s[e+8>>2]=a}i&&ee(i)}else if(!(a>>>0<=l>>>0)){if((0|(i=i+(l<<2)|0))!=(0|o)){for(;r=s[(o=o-4|0)>>2],s[o>>2]=0,r&&Lt(r),(0|i)!=(0|o););r=s[n+8>>2]}s[e+12>>2]=i}e:{t:{if(!((0|(i=s[r+56>>2]))>4))if(o=h(i,12)+e|0,(0|(i=s[o+24>>2]))==s[o+28>>2]){if((i=1+(d=(l=i-(a=s[o+20>>2])|0)>>2)|0)>>>0>=1073741824)break t;if(c=l>>1,c=d>>>0<536870911?i>>>0>c>>>0?i:c:1073741823){if(c>>>0>=1073741824)break e;i=ur(c<<2)}else i=0;s[(d=i+(d<<2)|0)>>2]=t,(0|l)>0&&ye(i,a,l),s[o+20>>2]=i,s[o+24>>2]=d+4,s[o+28>>2]=i+(c<<2),a&&ee(a)}else s[i>>2]=t,s[o+24>>2]=i+4;return s[r+60>>2]=t,e=s[e+8>>2],s[n+8>>2]=0,e=s[(t=e+(t<<2)|0)>>2],s[t>>2]=r,e&&Lt(e),e=s[n+8>>2],s[n+8>>2]=0,e&&Lt(e),void(N=n+16|0)}nn(),T()}qt(1326),T()}function de(e,t){e|=0;var r,n=0,i=0,o=0,a=0,c=0,l=0,f=0,u=0,p=0,m=0,b=0,v=0,g=0,A=0,_=0;if(N=r=N-80|0,kt(1,r+76|0,t|=0)&&(c=s[r+76>>2])&&!((i=Ht((i=s[t+8>>2])-(n=s[t+16>>2])|0,s[t+12>>2]-(s[t+20>>2]+(n>>>0>i>>>0)|0)|0,5,0))>>>0<c>>>0&(0|(n=R))<=0|(0|n)<0)){for(n=s[e+4>>2],(i=s[e+8>>2]-n>>2)>>>0<c>>>0?ct(e+4|0,c-i|0):i>>>0<=c>>>0||(s[e+8>>2]=n+(c<<2)),_=e+16|0,f=s[e+32>>2],u=1;!((0|(n=o=s[t+12>>2]))<=(0|(i=s[t+20>>2]))&(g=s[t+8>>2])>>>0<=(m=s[t+16>>2])>>>0|(0|n)<(0|i)||(A=s[t>>2],v=d[A+m|0],n=i,n=(a=m+1|0)?n:n+1|0,s[t+16>>2]=a,s[t+20>>2]=n,(0|n)>=(0|o)&a>>>0>=g>>>0|(0|n)>(0|o)||(a=d[a+A|0],n=i,n=(l=m+2|0)>>>0<2?n+1|0:n,s[t+16>>2]=l,s[t+20>>2]=n,(0|n)>=(0|o)&l>>>0>=g>>>0|(0|n)>(0|o)||(l=d[l+A|0],n=i,n=(b=m+3|0)>>>0<3?n+1|0:n,s[t+16>>2]=b,s[t+20>>2]=n,(0|n)>=(0|o)&b>>>0>=g>>>0|(0|n)>(0|o)||(o=d[b+A|0],n=i,n=(i=m+4|0)>>>0<4?n+1|0:n,s[t+16>>2]=i,s[t+20>>2]=n,!l|(a-12&255)>>>0<245|v>>>0>4||(n=Jt(r+8|0),b=l<<24>>24,o=0!=(0|o),i=(i=a-1|0)>>>0<=10?s[10180+(i<<2)>>2]:-1,lr(n,v,b,a,o,i=h(i,l),i>>31),!kt(1,r+4|0,t)||(a=s[r+4>>2],s[r+68>>2]=a,i=Ke(ur(96),n),vn[s[s[f>>2]+8>>2]](f,s[f+12>>2]-s[f+8>>2]>>2,i),i=(s[f+12>>2]-s[f+8>>2]>>2)-1|0,s[s[(v=i<<2)+s[f+8>>2]>>2]+60>>2]=a,s[s[e+4>>2]+(p<<2)>>2]=i,u=s[e+16>>2],(0|(n=s[e+20>>2]-u>>2))>(0|i)||(s[r>>2]=-1,(i=i+1|0)>>>0>n>>>0?(xe(_,i-n|0,r),u=s[_>>2]):n>>>0<=i>>>0||(s[e+20>>2]=(i<<2)+u)),s[u+v>>2]=p,u=(p=p+1|0)>>>0<c>>>0,(0|c)==(0|p)))))))););p=!u}return N=r+80|0,1&p}function fe(e,t){var r,n,i=0,o=0,a=0,c=0,l=0,d=0,f=0,u=0,p=0;N=r=N-16|0,s[r>>2]=t,l=-1,-1!=(0|t)?(i=t+1|0,s[r+4>>2]=(i>>>0)%3|0?i:t-2|0,l=(t>>>0)%3|0?t-1|0:t+2|0):s[r+4>>2]=-1,s[r+8>>2]=l,n=-1==(0|t)?-1:(t>>>0)/3|0;e:{t:{r:{n:{for(;;){i:if(-1!=(0|t)&&-1!=(0|(i=s[s[s[e+8>>2]+12>>2]+(t<<2)>>2]))){if(!((i>>>0)/3>>>0<n>>>0)&&(l=0,s[e+220>>2]!=s[e+216>>2]))for(;;){if(Gt(s[e+368>>2]+(l<<4)|0))if(c=s[e+216>>2]+h(l,144)|0,(i=s[c+136>>2])>>>0<(o=s[c+140>>2])>>>0)s[i>>2]=t,s[c+136>>2]=i+4;else{if((i=1+(a=(f=i-(d=s[c+132>>2])|0)>>2)|0)>>>0>=1073741824)break t;if(u=a<<2,a=(o=o-d|0)>>1,o=o>>2>>>0<536870911?i>>>0>a>>>0?i:a:1073741823){if(o>>>0>=1073741824)break e;i=ur(o<<2)}else i=0;s[(a=u+i|0)>>2]=t,(0|f)>0&&ye(i,d,f),s[c+132>>2]=i,s[c+136>>2]=a+4,s[c+140>>2]=i+(o<<2),d&&ee(d)}if(!((l=l+1|0)>>>0<(s[e+220>>2]-s[e+216>>2]|0)/144>>>0))break}}else{if(l=0,(0|(i=s[e+216>>2]))==s[e+220>>2])break i;for(;;){if(c=h(l,144)+i|0,(i=s[c+136>>2])>>>0<(o=s[c+140>>2])>>>0)s[i>>2]=t,s[c+136>>2]=i+4;else{if((i=1+(a=(f=i-(d=s[c+132>>2])|0)>>2)|0)>>>0>=1073741824)break n;if(u=a<<2,a=(o=o-d|0)>>1,o=o>>2>>>0<536870911?i>>>0>a>>>0?i:a:1073741823){if(o>>>0>=1073741824)break r;i=ur(o<<2)}else i=0;s[(a=u+i|0)>>2]=t,(0|f)>0&&ye(i,d,f),s[c+132>>2]=i,s[c+136>>2]=a+4,s[c+140>>2]=i+(o<<2),d&&ee(d)}if(l=l+1|0,i=s[e+216>>2],!(l>>>0<(s[e+220>>2]-i|0)/144>>>0))break}}if(3==(0|(p=p+1|0)))break;t=s[(p<<2)+r>>2]}return N=r+16|0,1}nn(),T()}qt(1326),T()}nn(),T()}qt(1326),T()}function ue(e,t){var r,n=0,i=0,a=0,c=0,l=0,p=0,m=0,b=0,v=0,g=0;N=r=N-16|0,b=-1;e:{t:{r:if(wt(1,r+12|0,t)){if(i=s[r+12>>2]){if(n=s[e+8>>2],i>>>0>(s[n+4>>2]-s[n>>2]>>2>>>0)/3>>>0)break r;for(;;){if(!wt(1,r+8|0,t))break r;if(n=s[r+8>>2],!wt(1,r+8|0,t))break r;if((c=n+c|0)>>>0<(n=s[r+8>>2])>>>0)break r;if(l=c-n|0,(0|(n=s[e+40>>2]))==s[e+44>>2]){if((a=1+(p=(0|(m=(a=n)-(n=s[e+36>>2])|0))/12|0)|0)>>>0>=357913942)break t;if(v=p<<1,(a=p>>>0<178956970?a>>>0>v>>>0?a:v:357913941)>>>0>=357913942)break e;p=(v=ur(a=h(a,12)))+h(p,12)|0,s[p+4>>2]=c,s[p>>2]=l,l=p+h((0|m)/-12|0,12)|0,(0|m)>0&&ye(l,n,m),s[e+44>>2]=a+v,s[e+40>>2]=p+12,s[e+36>>2]=l,n&&ee(n)}else s[n+4>>2]=c,s[n>>2]=l,s[e+40>>2]=n+12;if((0|i)==(0|(g=g+1|0)))break}for(c=0,$t(t,0,0),p=i>>>0>1?i:1;;){i=d[t+36|0];n:{i:{if((65535&((n=f[s[e+4>>2]+36>>1])<<8|n>>>8))>>>0<=513){if(!i)break n;if(l=0,(i=(m=(n=s[t+32>>2])>>>3|0)+(b=s[t+24>>2])|0)>>>0>=(a=s[t+28>>2])>>>0?i=n:(l=d[0|i],i=n+1|0,s[t+32>>2]=i,m=i>>>3|0,l=l>>>(7&n)&1),a>>>0>m+b>>>0)break i;break n}if(!i)break n;if(l=0,i=s[t+32>>2],(n=s[t+24>>2]+(i>>>3|0)|0)>>>0>=u[t+28>>2])break n;l=d[0|n]>>>(7&i)&1}s[t+32>>2]=i+1}if(i=s[e+36>>2]+h(c,12)|0,o[i+8|0]=254&d[i+8|0]|1&l,(0|p)==(0|(c=c+1|0)))break}o[t+36|0]=0,n=s[t+20>>2],e=0,i=(c=(e=(i=s[t+32>>2]+7|0)>>>0<7?1:e)<<29|i>>>3)+s[t+16>>2]|0,e=(e>>>3|0)+n|0,s[t+16>>2]=i,s[t+20>>2]=i>>>0<c>>>0?e+1|0:e}b=s[t+16>>2]}return N=r+16|0,b}nn(),T()}qt(1326),T()}function pe(e,t,r){var n=0,i=0,o=0,a=0,c=0,l=0,d=0,f=0,u=0;if(((i=s[e+8>>2])-(a=s[e+4>>2])|0)/12>>>0>=t>>>0){if(t){if(n=a,o=1+(((i=h(t,12)-12|0)>>>0)/12|0)&3)for(;d=s[r+4>>2],s[n>>2]=s[r>>2],s[n+4>>2]=d,s[n+8>>2]=s[r+8>>2],n=n+12|0,(0|o)!=(0|(c=c+1|0)););if(a=h(t,12)+a|0,!(i>>>0<36))for(;t=s[r+4>>2],s[n>>2]=s[r>>2],s[n+4>>2]=t,s[n+8>>2]=s[r+8>>2],s[n+20>>2]=s[r+8>>2],t=s[r+4>>2],s[n+12>>2]=s[r>>2],s[n+16>>2]=t,s[n+32>>2]=s[r+8>>2],t=s[r+4>>2],s[n+24>>2]=s[r>>2],s[n+28>>2]=t,t=s[r+4>>2],s[n+36>>2]=s[r>>2],s[n+40>>2]=t,s[n+44>>2]=s[r+8>>2],(0|a)!=(0|(n=n+48|0)););}s[e+4>>2]=a}else{e:{if((n=(l=(a-(o=s[e>>2])|0)/12|0)+t|0)>>>0<357913942){if(o=(i=(i-o|0)/12|0)<<1,o=i>>>0<178956970?n>>>0>o>>>0?n:o:357913941){if(o>>>0>=357913942)break e;d=ur(h(o,12))}if(n=i=h(l,12)+d|0,f=1+(((l=(t=h(t,12))-12|0)>>>0)/12|0)&3)for(n=i;u=s[r+4>>2],s[n>>2]=s[r>>2],s[n+4>>2]=u,s[n+8>>2]=s[r+8>>2],n=n+12|0,(0|f)!=(0|(c=c+1|0)););if(c=t+i|0,l>>>0>=36)for(;t=s[r+4>>2],s[n>>2]=s[r>>2],s[n+4>>2]=t,s[n+8>>2]=s[r+8>>2],s[n+20>>2]=s[r+8>>2],t=s[r+4>>2],s[n+12>>2]=s[r>>2],s[n+16>>2]=t,s[n+32>>2]=s[r+8>>2],t=s[r+4>>2],s[n+24>>2]=s[r>>2],s[n+28>>2]=t,t=s[r+4>>2],s[n+36>>2]=s[r>>2],s[n+40>>2]=t,s[n+44>>2]=s[r+8>>2],(0|c)!=(0|(n=n+48|0)););return t=s[e>>2],n=i+h((0|(r=a-t|0))/-12|0,12)|0,(0|r)>0&&ye(n,t,r),s[e+8>>2]=h(o,12)+d,s[e+4>>2]=c,s[e>>2]=n,void(t&&ee(t))}nn(),T()}qt(1326),T()}}function me(e,t,r,n){var i,o,a=0,c=0,l=0,d=0,f=0,u=0;if(i=s[t+16>>2],a=l=s[r+4>>2]-i|0,c=s[r>>2]-i|0,s[r>>2]=c,s[r+4>>2]=a,o=(0|(u=s[t+16>>2]))>=((d=(a>>=31)+l^a)+((a=c>>31)+c^a)|0))a=l;else{e:{t:{if((0|c)>=0){if(f=1,d=1,(0|l)>=0)break e;if(a=1,f=-1,d=-1,c)break t;break e}if(a=-1,f=-1,d=-1,(0|l)<=0)break e}f=(0|l)<=0?-1:1,d=a}a=(a=c<<1)-(c=h(d,u))|0,a=(((d=(0|h(f,d))>=0)?0-a|0:a)+(f=h(f,u))|0)/2|0,s[r+4>>2]=a,u=c,c=(l<<1)-f|0,c=(u+(d?0-c|0:c)|0)/2|0,s[r>>2]=c}e:{t:{r:{n:{i:{o:{a:{if(c){if((0|c)<0)break a;if((0|a)>=0)break o;break r}if(a)break i;f=1,l=0,a=0,d=0;break e}if(f=1,(0|a)>0)break n;d=(0|a)>0?253:0,l=a,a=c;break e}l=0-a|0,a=0-c|0,d=254;break t}if((0|a)<=0)break r}a=0-a|0,l=c,d=253;break t}l=0-c|0,d=255}s[r>>2]=a,s[r+4>>2]=l,f=0}r=s[n+4>>2]+l|0,(0|(c=s[n>>2]+a|0))>(0|(l=s[t+16>>2]))?c=c-s[t+4>>2]|0:(0-l|0)<=(0|c)||(c=s[t+4>>2]+c|0),(0|r)>(0|l)?r=r-s[t+4>>2]|0:(0-l|0)<=(0|r)||(r=s[t+4>>2]+r|0);e:if(f)t=r;else{t=r;t:switch((3&d)-1|0){case 0:t=0-c|0,c=r;break e;case 1:t=0-r|0,c=0-c|0;break e;case 2:break t;default:break e}t=c,c=0-r|0}if(o)r=t;else{e:{t:{if((0|c)>=0){if(r=1,a=1,(0|t)>=0)break e;if(n=1,r=-1,a=-1,c)break t;break e}if(n=-1,r=-1,a=-1,(0|t)<=0)break e}r=(0|t)<=0?-1:1,a=n}n=(n=c<<1)-(c=h(a,l))|0,s[e>>2]=n,u=0-n|0,d=n,r=(((n=(0|h(r,a))>=0)?u:d)+(a=h(r,l))|0)/2|0,t=(t<<1)-a|0,c=(c+(n?0-t|0:t)|0)/2|0}s[e>>2]=c+i,s[e+4>>2]=r+i}function he(e,t,r,n){var i=0,a=0,c=0,l=0,f=0,u=0;if(!((0|(l=n-r|0))<=0)){e:{if((0|l)<=((a=s[e+8>>2])-(f=s[e+4>>2])|0)){if((0|(u=f-t|0))>=(0|l)){c=f,a=n;break e}if(c=f,(0|(a=r+u|0))!=(0|n))for(i=a;o[0|c]=d[0|i],c=c+1|0,(0|(i=i+1|0))!=(0|n););if(s[e+4>>2]=c,(0|u)>0)break e;return}if((0|(n=l+(f-(i=s[e>>2])|0)|0))>=0){if(u=(a=a-i|0)<<1,r=ye((c=t-i|0)+(n=(a=a>>>0<1073741823?n>>>0>u>>>0?n:u:2147483647)?ur(a):0)|0,r,l),(0|c)>0&&ye(n,i,c),r=r+l|0,(0|t)!=(0|f)){if(c=(-1^t)+f|0,l=f-t&7)for(i=0;o[0|r]=d[0|t],r=r+1|0,t=t+1|0,(0|l)!=(0|(i=i+1|0)););if(c>>>0>=7)for(;o[0|r]=d[0|t],o[r+1|0]=d[t+1|0],o[r+2|0]=d[t+2|0],o[r+3|0]=d[t+3|0],o[r+4|0]=d[t+4|0],o[r+5|0]=d[t+5|0],o[r+6|0]=d[t+6|0],o[r+7|0]=d[t+7|0],r=r+8|0,(0|f)!=(0|(t=t+8|0)););i=s[e>>2]}return s[e+8>>2]=n+a,s[e+4>>2]=r,s[e>>2]=n,void(i&&ee(i))}nn(),T()}if(f>>>0>(n=(i=c)-l|0)>>>0)for(;o[0|i]=d[0|n],i=i+1|0,f>>>0>(n=n+1|0)>>>0;);if(s[e+4>>2]=i,(e=c-(t+l|0)|0)&&Ue(c-e|0,t,e),(0|r)!=(0|a)){if(e=(-1^r)+a|0,c=a-r&7)for(n=0,i=t;o[0|i]=d[0|r],i=i+1|0,r=r+1|0,(0|c)!=(0|(n=n+1|0)););else i=t;if(!(e>>>0<7))for(;o[0|i]=d[0|r],o[i+1|0]=d[r+1|0],o[i+2|0]=d[r+2|0],o[i+3|0]=d[r+3|0],o[i+4|0]=d[r+4|0],o[i+5|0]=d[r+5|0],o[i+6|0]=d[r+6|0],o[i+7|0]=d[r+7|0],i=i+8|0,(0|a)!=(0|(r=r+8|0)););}}}function be(e,t,r,n){e|=0,r|=0,n|=0;var i,a=0,c=0,l=0,f=0,u=0,p=0,m=0,b=0,v=0,g=0,A=0,_=0;N=i=N-16|0,f=s[80+(t|=0)>>2],e=o[r+24|0],a=h(f,e);e:{t:{if(!(5==(0|(t=s[r+28>>2]))|6==(0|t))|!d[r+84|0]){if(s[i+8>>2]=0,s[i>>2]=0,s[i+4>>2]=0,e){if((0|e)<0)break t;l=ur(t=e<<2),s[i>>2]=l,c=t+l|0,s[i+8>>2]=c,We(l,0,t),s[i+4>>2]=c}c=s[n>>2],(t=s[n+4>>2]-c>>2)>>>0<a>>>0?ct(n,a-t|0):t>>>0<=a>>>0||(s[n+4>>2]=c+(a<<2));r:if(f)if(e){for(A=-4&e,v=3&e,_=e-1>>>0<3,t=1,a=0;;){if(q(r,d[r+84|0]?a:s[s[r+68>>2]+(a<<2)>>2],o[r+24|0],l)){if(g=s[n>>2],b=0,c=s[i>>2],e=0,t=0,!_)for(;m=e<<2,s[(p=(u<<2)+g|0)>>2]=s[c+m>>2],s[p+4>>2]=s[c+(4|m)>>2],s[p+8>>2]=s[c+(8|m)>>2],s[p+12>>2]=s[c+(12|m)>>2],e=e+4|0,u=u+4|0,(0|A)!=(0|(t=t+4|0)););if(v)for(;s[(u<<2)+g>>2]=s[c+(e<<2)>>2],e=e+1|0,u=u+1|0,(0|(b=b+1|0))!=(0|v););if(t=f>>>0>(a=a+1|0)>>>0,(0|a)!=(0|f))continue}break}l=s[i>>2]}else for(e=0,t=1;;){if(!q(r,d[r+84|0]?e:s[s[r+68>>2]+(e<<2)>>2],o[r+24|0],l))break r;if(t=f>>>0>(e=e+1|0)>>>0,(0|e)==(0|f))break}else t=0;l&&ee(l),e=1^t}else{if(l=s[r+48>>2],f=s[s[r>>2]>>2],t=0,s[i+8>>2]=0,s[i>>2]=0,s[i+4>>2]=0,r=0,e=a<<2){if((0|e)<0)break t;u=(t=ye(r=ur(e),l+f|0,e))+e|0,t=t+(e>>2<<2)|0}(e=s[n>>2])&&(s[n+4>>2]=e,ee(e)),s[n+8>>2]=t,s[n+4>>2]=u,s[n>>2]=r,e=1}N=i+16|0,e&=1;break e}nn(),T()}return 0|e}function ve(e){var t,r=0,n=0,i=0,o=0;if(s[(e|=0)>>2]=8364,(r=s[196+(t=e+232|0)>>2])&&(s[t+200>>2]=r,ee(r)),n=s[t+184>>2]){if((0|n)==(0|(r=s[t+188>>2])))r=n;else{for(;(o=s[(i=r-12|0)>>2])&&(s[r-8>>2]=o,ee(o)),(0|n)!=(0|(r=i)););r=s[t+184>>2]}s[t+188>>2]=n,ee(r)}if((r=s[t+156>>2])&&(s[t+160>>2]=r,ee(r)),n=s[t+136>>2],s[t+136>>2]=0,n){if(r=s[(i=n-4|0)>>2])for(r=n+(r<<4)|0;(0|n)!=(0|(r=r-16|0)););ee(i)}if(n=s[e+216>>2]){if((0|n)==(0|(r=s[e+220>>2])))r=n;else{for(;(i=s[r-12>>2])&&(s[r-8>>2]=i,ee(i)),(i=s[r-28>>2])&&(s[r-24>>2]=i,ee(i)),(i=s[r-40>>2])&&(s[r-36>>2]=i,ee(i)),Bt(r-140|0),(0|n)!=(0|(r=r-144|0)););r=s[e+216>>2]}s[e+220>>2]=n,ee(r)}if((r=s[e+196>>2])&&(s[e+200>>2]=r,ee(r)),(r=s[e+184>>2])&&(s[e+188>>2]=r,ee(r)),(r=s[e+172>>2])&&(s[e+176>>2]=r,ee(r)),(r=s[e+160>>2])&&(s[e+164>>2]=r,ee(r)),r=s[e+144>>2])for(;n=s[r>>2],ee(r),r=n;);return r=s[e+136>>2],s[e+136>>2]=0,r&&ee(r),(r=s[e+120>>2])&&ee(r),(r=s[e+108>>2])&&ee(r),(r=s[e+96>>2])&&ee(r),(r=s[e+72>>2])&&(s[e+76>>2]=r,ee(r)),(r=s[e+60>>2])&&ee(r),(r=s[e+48>>2])&&(s[e+52>>2]=r,ee(r)),(r=s[e+36>>2])&&(s[e+40>>2]=r,ee(r)),(r=s[e+24>>2])&&(s[e+28>>2]=r,ee(r)),(r=s[e+12>>2])&&(s[e+16>>2]=r,ee(r)),r=s[e+8>>2],s[e+8>>2]=0,r&&Pt(r),0|e}function ge(e,t){e|=0;var r,n=0,i=0,a=0,c=0,l=0,f=0,p=0,m=0,h=0;if(N=r=N-16|0,n=s[20+(t|=0)>>2],n=(l=(i=s[t+16>>2])+4|0)>>>0<4?n+1|0:n,!((0|(a=s[t+12>>2]))<=(0|n)&l>>>0>u[t+8>>2]|(0|n)>(0|a))&&(i=i+s[t>>2]|0,i=d[0|i]|d[i+1|0]<<8|d[i+2|0]<<16|d[i+3|0]<<24,s[t+16>>2]=l,s[t+20>>2]=n,!((0|i)<0)&&(Ie(e+76|0,i),s[(n=r)>>2]=0,s[n+4>>2]=0,o[n+5|0]=0,o[n+6|0]=0,o[n+7|0]=0,o[n+8|0]=0,o[n+9|0]=0,o[n+10|0]=0,o[n+11|0]=0,o[n+12|0]=0,Ne(n,t)))){if(i)for(a=1;c=1<<f,p=Gt(n),l=s[e+76>>2]+(f>>>3&536870908)|0,1&(a^=p)?c=s[l>>2]&(-1^c):c|=s[l>>2],a^=1,s[l>>2]=c,(0|i)!=(0|(f=f+1|0)););f=0,l=i=s[t+12>>2],a=n=s[t+20>>2],n=(p=(c=s[t+16>>2])+4|0)>>>0<4?n+1|0:n,(m=s[t+8>>2])>>>0<p>>>0&(0|n)>=(0|i)|(0|n)>(0|i)||(h=s[t>>2],i=d[0|(i=h+c|0)]|d[i+1|0]<<8|d[i+2|0]<<16|d[i+3|0]<<24,s[t+16>>2]=p,s[t+20>>2]=n,n=a,c=a=c+8|0,a=n=a>>>0<8?n+1|0:n,c>>>0>m>>>0&(0|n)>=(0|l)|(0|n)>(0|l)||(n=d[0|(n=p+h|0)]|d[n+1|0]<<8|d[n+2|0]<<16|d[n+3|0]<<24,s[t+16>>2]=c,s[t+20>>2]=a,(0|n)<(0|i)||(s[e+16>>2]=n,s[e+12>>2]=i,!(t=(n>>31)-((i>>31)+(n>>>0<i>>>0)|0)|0)&(n=n-i|0)>>>0>2147483646|t||(f=1,t=n+1|0,s[e+20>>2]=t,n=t>>>1|0,s[e+24>>2]=n,s[e+28>>2]=0-n,1&t||(s[e+24>>2]=n-1)))))}return N=r+16|0,0|f}function Ae(e,t){var r=0,n=0,i=0,o=0,a=0;o=-1,n=-1,-1!=(0|t)&&(o=((n=t+1|0)>>>0)%3|0?n:t-2|0,n=t-1|0,(t>>>0)%3|0||(n=t+2|0));e:{t:{r:switch(s[e+168>>2]){case 0:case 1:i=s[e+148>>2],r=1,a=(t=s[e+156>>2])+((-1!=(0|o)?s[s[i>>2]+(o<<2)>>2]:-1)<<2)|0,s[a>>2]=s[a>>2]+1,t=((-1!=(0|n)?s[s[i>>2]+(n<<2)>>2]:-1)<<2)+t|0;break t;case 5:i=s[e+148>>2],r=-1,r=(-1!=(0|t)?s[s[i>>2]+(t<<2)>>2]:r)<<2,t=s[e+156>>2],s[(r=r+t|0)>>2]=s[r>>2]+1,r=((-1!=(0|o)?s[s[i>>2]+(o<<2)>>2]:-1)<<2)+t|0,s[r>>2]=s[r>>2]+1,r=2,t=((-1!=(0|n)?s[s[i>>2]+(n<<2)>>2]:-1)<<2)+t|0;break t;case 3:i=s[e+148>>2],r=-1,r=(-1!=(0|t)?s[s[i>>2]+(t<<2)>>2]:r)<<2,t=s[e+156>>2],s[(r=r+t|0)>>2]=s[r>>2]+1,r=((-1!=(0|o)?s[s[i>>2]+(o<<2)>>2]:-1)<<2)+t|0,s[r>>2]=s[r>>2]+2,r=1,t=((-1!=(0|n)?s[s[i>>2]+(n<<2)>>2]:-1)<<2)+t|0;break t;case 7:break r;default:break e}i=s[e+148>>2],r=-1,r=(-1!=(0|t)?s[s[i>>2]+(t<<2)>>2]:r)<<2,t=s[e+156>>2],s[(r=r+t|0)>>2]=s[r>>2]+2,r=((-1!=(0|o)?s[s[i>>2]+(o<<2)>>2]:-1)<<2)+t|0,s[r>>2]=s[r>>2]+2,r=2,t=((-1!=(0|n)?s[s[i>>2]+(n<<2)>>2]:-1)<<2)+t|0}s[t>>2]=s[t>>2]+r}r=e,n=s[e+180>>2],t=s[s[e+156>>2]+((-1!=(0|o)?s[s[s[e+148>>2]>>2]+(o<<2)>>2]:-1)<<2)>>2],e=s[e+176>>2],s[r+172>>2]=(0|e)>(0|t)?0:((0|t)>(0|n)?n:t)-e|0}function _e(e,t,r){var n=0,i=0,o=0,a=0,c=0,l=0,d=0,f=0;if((n=s[e+8>>2])-(i=s[e>>2])>>2>>>0>=t>>>0){if(o=t>>>0>(c=(a=s[e+4>>2])-i>>2)>>>0?c:t){if(f=o-1|0,l=7&o)for(n=i;s[n>>2]=s[r>>2],o=o-1|0,n=n+4|0,(0|(d=d+1|0))!=(0|l););else n=i;if(!(f>>>0<7))for(;s[n>>2]=s[r>>2],s[n+4>>2]=s[r>>2],s[n+8>>2]=s[r>>2],s[n+12>>2]=s[r>>2],s[n+16>>2]=s[r>>2],s[n+20>>2]=s[r>>2],s[n+24>>2]=s[r>>2],s[n+28>>2]=s[r>>2],n=n+32|0,o=o-8|0;);}if(t>>>0>c>>>0){if(n=e,e=t-c|0)for(e=(e<<2)+a|0;s[a>>2]=s[r>>2],(0|e)!=(0|(a=a+4|0)););else e=a;return void(s[n+4>>2]=e)}s[e+4>>2]=i+(t<<2)}else if(i&&(s[e+4>>2]=i,ee(i),s[e+8>>2]=0,s[e>>2]=0,s[e+4>>2]=0,n=0),t>>>0>=1073741824||(i=n>>1,(n=n>>2>>>0<536870911?t>>>0>i>>>0?t:i:1073741823)>>>0>=1073741824))nn(),T();else{if(i=ur(n<<=2),s[e>>2]=i,s[e+8>>2]=n+i,r=s[r>>2],n=i,c=1+((a=(t<<=2)-4|0)>>>2|0)&7)for(;s[n>>2]=r,n=n+4|0,(0|c)!=(0|(o=o+1|0)););if(t=t+i|0,a>>>0>=28)for(;s[n+28>>2]=r,s[n+24>>2]=r,s[n+20>>2]=r,s[n+16>>2]=r,s[n+12>>2]=r,s[n+8>>2]=r,s[n+4>>2]=r,s[n>>2]=r,(0|t)!=(0|(n=n+32|0)););s[e+4>>2]=t}}function xe(e,t,r){var n=0,i=0,o=0,a=0,c=0,l=0,d=0,f=0,u=0;if((o=s[e+8>>2])-(i=s[e+4>>2])>>2>>>0>=t>>>0){if(t){if(n=i,c=1+((a=(t<<2)-4|0)>>>2|0)&7)for(;s[n>>2]=s[r>>2],n=n+4|0,(0|c)!=(0|(l=l+1|0)););if(i=(t<<2)+i|0,!(a>>>0<28))for(;s[n>>2]=s[r>>2],s[n+4>>2]=s[r>>2],s[n+8>>2]=s[r>>2],s[n+12>>2]=s[r>>2],s[n+16>>2]=s[r>>2],s[n+20>>2]=s[r>>2],s[n+24>>2]=s[r>>2],s[n+28>>2]=s[r>>2],(0|i)!=(0|(n=n+32|0)););}s[e+4>>2]=i}else{e:{if((n=(i=(f=i-(a=s[e>>2])|0)>>2)+t|0)>>>0<1073741824){if(d=(o=o-a|0)>>1,o=o>>2>>>0<536870911?n>>>0>d>>>0?n:d:1073741823){if(o>>>0>=1073741824)break e;c=ur(o<<2)}if(n=i=(i<<2)+c|0,u=1+((d=(t<<=2)-4|0)>>>2|0)&7)for(n=i;s[n>>2]=s[r>>2],n=n+4|0,(0|u)!=(0|(l=l+1|0)););if(t=t+i|0,d>>>0>=28)for(;s[n>>2]=s[r>>2],s[n+4>>2]=s[r>>2],s[n+8>>2]=s[r>>2],s[n+12>>2]=s[r>>2],s[n+16>>2]=s[r>>2],s[n+20>>2]=s[r>>2],s[n+24>>2]=s[r>>2],s[n+28>>2]=s[r>>2],(0|t)!=(0|(n=n+32|0)););return(0|f)>0&&ye(c,a,f),s[e+8>>2]=(o<<2)+c,s[e+4>>2]=t,s[e>>2]=c,void(a&&ee(a))}nn(),T()}qt(1326),T()}}function ye(e,t,r){var n,i=0,a=0;if(r>>>0>=512)return C(0|e,0|t,0|r),e;n=e+r|0;e:if(3&(e^t))if(n>>>0<4)r=e;else if((i=n-4|0)>>>0<e>>>0)r=e;else for(r=e;o[0|r]=d[0|t],o[r+1|0]=d[t+1|0],o[r+2|0]=d[t+2|0],o[r+3|0]=d[t+3|0],t=t+4|0,i>>>0>=(r=r+4|0)>>>0;);else{t:if(3&e)if(r)for(r=e;;){if(o[0|r]=d[0|t],t=t+1|0,!(3&(r=r+1|0)))break t;if(!(r>>>0<n>>>0))break}else r=e;else r=e;if(!((i=-4&n)>>>0<64||(a=i+-64|0)>>>0<r>>>0))for(;s[r>>2]=s[t>>2],s[r+4>>2]=s[t+4>>2],s[r+8>>2]=s[t+8>>2],s[r+12>>2]=s[t+12>>2],s[r+16>>2]=s[t+16>>2],s[r+20>>2]=s[t+20>>2],s[r+24>>2]=s[t+24>>2],s[r+28>>2]=s[t+28>>2],s[r+32>>2]=s[t+32>>2],s[r+36>>2]=s[t+36>>2],s[r+40>>2]=s[t+40>>2],s[r+44>>2]=s[t+44>>2],s[r+48>>2]=s[t+48>>2],s[r+52>>2]=s[t+52>>2],s[r+56>>2]=s[t+56>>2],s[r+60>>2]=s[t+60>>2],t=t- -64|0,a>>>0>=(r=r- -64|0)>>>0;);if(r>>>0>=i>>>0)break e;for(;s[r>>2]=s[t>>2],t=t+4|0,i>>>0>(r=r+4|0)>>>0;);}if(r>>>0<n>>>0)for(;o[0|r]=d[0|t],t=t+1|0,(0|n)!=(0|(r=r+1|0)););return e}function ke(e){var t,r=0,n=0,i=0;if(s[(e|=0)>>2]=8312,t=s[e+368>>2],s[e+368>>2]=0,t){if(r=s[(i=t-4|0)>>2])for(n=(r<<4)+t|0;(0|t)!=(0|(n=n-16|0)););ee(i)}if(i=s[e+216>>2]){if((0|i)==(0|(n=s[e+220>>2])))r=i;else{for(;(r=s[n-12>>2])&&(s[n-8>>2]=r,ee(r)),(r=s[n-28>>2])&&(s[n-24>>2]=r,ee(r)),(r=s[n-40>>2])&&(s[n-36>>2]=r,ee(r)),Bt(n-140|0),(0|i)!=(0|(n=n-144|0)););r=s[e+216>>2]}s[e+220>>2]=i,ee(r)}if((r=s[e+196>>2])&&(s[e+200>>2]=r,ee(r)),(r=s[e+184>>2])&&(s[e+188>>2]=r,ee(r)),(r=s[e+172>>2])&&(s[e+176>>2]=r,ee(r)),(r=s[e+160>>2])&&(s[e+164>>2]=r,ee(r)),n=s[e+144>>2])for(;r=s[n>>2],ee(n),n=r,r;);return r=s[e+136>>2],s[e+136>>2]=0,r&&ee(r),(r=s[e+120>>2])&&ee(r),(r=s[e+108>>2])&&ee(r),(r=s[e+96>>2])&&ee(r),(r=s[e+72>>2])&&(s[e+76>>2]=r,ee(r)),(r=s[e+60>>2])&&ee(r),(r=s[e+48>>2])&&(s[e+52>>2]=r,ee(r)),(r=s[e+36>>2])&&(s[e+40>>2]=r,ee(r)),(r=s[e+24>>2])&&(s[e+28>>2]=r,ee(r)),(r=s[e+12>>2])&&(s[e+16>>2]=r,ee(r)),r=s[e+8>>2],s[e+8>>2]=0,r&&Pt(r),0|e}function Te(e,t,r,n){var i,o=0,a=0,s=0,c=0,l=0,d=0,f=0,u=0;i=r;e:{t:{r:{n:{i:{o:{a:{s:{c:{l:{d:{if(t){if(!i)break d;if(!n)break l;if((r=g(n)-g(t)|0)>>>0<=31)break c;break r}if(1==(0|n)|n>>>0>1)break r;e=(e>>>0)/(i>>>0)|0,R=0;break e}if(!e)break s;if(!n)break a;if(n-1&n)break a;e=t>>>Rr(n)|0,R=0;break e}if(!(i-1&i))break o;o=0-(s=(g(i)+33|0)-g(t)|0)|0;break n}s=r+1|0,o=63-r|0;break n}e=(t>>>0)/(n>>>0)|0,R=0;break e}if((r=g(n)-g(t)|0)>>>0<31)break i;break r}if(1==(0|i))break t;n=31&(r=Rr(i)),(63&r)>>>0>=32?(r=0,e=t>>>n|0):(r=t>>>n|0,e=((1<<n)-1&t)<<32-n|e>>>n),R=r;break e}s=r+1|0,o=63-r|0}if(a=31&(r=63&s),r>>>0>=32?(r=0,l=t>>>a|0):(r=t>>>a|0,l=((1<<a)-1&t)<<32-a|e>>>a),a=r,o=31&(r=63&o),r>>>0>=32?(r=e<<o,e=0):(r=(1<<o)-1&e>>>32-o|t<<o,e<<=o),t=r,s)for(r=n-1|0,f=-1!=(0|(o=i-1|0))?r+1|0:r;l=(r=l<<1|t>>>31)-(d=i&(c=f-((a=a<<1|l>>>31)+(r>>>0>o>>>0)|0)>>31))|0,a=a-((n&c)+(r>>>0<d>>>0)|0)|0,t=t<<1|e>>>31,e=u|e<<1,u=c&=1,s=s-1|0;);R=t<<1|e>>>31,e=c|e<<1;break e}e=0,t=0}R=t}return e}function we(e,t){var r=0,n=0,i=0;r=(0|e)==(0|t),o[t+12|0]=r;e:if(!r)for(;;){if(n=s[t+8>>2],d[n+12|0])break e;t:{if(r=s[n+8>>2],(0|n)!=(0|(i=s[r>>2]))){if(!(d[i+12|0]|!i))break t;s[n>>2]==(0|t)?(e=s[t+4>>2],s[n>>2]=e,e&&(s[e+8>>2]=n,r=s[n+8>>2]),s[t+8>>2]=r,e=s[n+8>>2],s[(((0|n)!=s[e>>2])<<2)+e>>2]=t,s[t+4>>2]=n,s[n+8>>2]=t,r=s[t+8>>2]):t=n,o[t+12|0]=1,o[r+12|0]=0,e=s[r+4>>2],t=s[e>>2],s[r+4>>2]=t,t&&(s[t+8>>2]=r),s[e+8>>2]=s[r+8>>2],t=s[r+8>>2],s[((s[t>>2]!=(0|r))<<2)+t>>2]=e,s[e>>2]=r,t=r+8|0}else{if(!(!(i=s[r+4>>2])|d[i+12|0]))break t;s[n>>2]!=(0|t)?(t=s[n+4>>2],e=s[t>>2],s[n+4>>2]=e,e&&(s[e+8>>2]=n,r=s[n+8>>2]),s[t+8>>2]=r,e=s[n+8>>2],s[(((0|n)!=s[e>>2])<<2)+e>>2]=t,s[t>>2]=n,s[n+8>>2]=t,r=s[t+8>>2]):t=n,o[t+12|0]=1,o[r+12|0]=0,e=s[r>>2],t=s[e+4>>2],s[r>>2]=t,t&&(s[t+8>>2]=r),s[e+8>>2]=s[r+8>>2],t=s[r+8>>2],s[((s[t>>2]!=(0|r))<<2)+t>>2]=e,s[e+4>>2]=r,t=r+8|0}s[t>>2]=e;break e}if(o[n+12|0]=1,n=(0|e)==(0|r),o[r+12|0]=n,o[i+12|0]=1,t=r,n)break}}function Ce(e,t,r){e|=0,t|=0,r|=0;var n,i=0,a=0,c=0,l=0,d=0,f=b(0),u=0,m=0,h=0,v=0,g=0,A=0,_=0,x=0,y=0,k=0,T=0;if(N=n=N-16|0,9==s[r+28>>2]){i=s[e+4>>2],a=(l=o[r+24|0])<<2,c=ur((1073741823&l)!=(0|l)?-1:a),s[(m=n+8|0)>>2]=1065353216,f=p[e+20>>2],(0|(i=-1<<i^-1))>0&&(p[m>>2]=f/b(0|i));e:if((g=(0|i)>0)&&(u=s[r+80>>2]))if(i=0,(0|l)<=0){if(1!=(0|u))for(e=-2&u,t=0;ye(s[s[r+64>>2]>>2]+i|0,c,a),ye((i=i+a|0)+s[s[r+64>>2]>>2]|0,c,a),i=i+a|0,(0|e)!=(0|(t=t+2|0)););if(!(1&u))break e;ye(s[s[r+64>>2]>>2]+i|0,c,a)}else for(A=s[s[t>>2]>>2]+s[t+48>>2]|0,k=-2&l,T=1&l;;){if(h=s[e+8>>2],f=p[m>>2],t=0,v=0,1!=(0|l))for(;_=(i<<2)+A|0,p[(d=t<<2)+c>>2]=b(f*b(s[_>>2]))+p[d+h>>2],p[(d|=4)+c>>2]=b(f*b(s[_+4>>2]))+p[d+h>>2],t=t+2|0,i=i+2|0,(0|k)!=(0|(v=v+2|0)););if(T&&(p[(t<<=2)+c>>2]=b(f*b(s[(i<<2)+A>>2]))+p[t+h>>2],i=i+1|0),ye(s[s[r+64>>2]>>2]+x|0,c,a),x=a+x|0,(0|(y=y+1|0))==(0|u))break}ee(c)}return N=n+16|0,0|g}function Me(e,t,r){var n=0,i=0,o=0,a=0,c=0,l=0,d=0;n=(r>>>0)/3|0,a=s[(s[s[e+8>>2]+96>>2]+h(n,12)|0)+(r-h(n,3)<<2)>>2],i=s[s[e+12>>2]+4>>2];e:if((0|(n=s[i+4>>2]))==s[i+8>>2]){t:{if((n=1+(d=(l=n-(c=s[i>>2])|0)>>2)|0)>>>0<1073741824){if(o=l>>1,o=d>>>0<536870911?n>>>0>o>>>0?n:o:1073741823){if(o>>>0>=1073741824)break t;n=ur(o<<2)}else n=0;s[(d=n+(d<<2)|0)>>2]=a,(0|l)>0&&ye(n,c,l),s[i+8>>2]=n+(o<<2),s[i+4>>2]=d+4,s[i>>2]=n,c&&ee(c);break e}nn(),T()}qt(1326),T()}else s[n>>2]=a,s[i+4>>2]=n+4;i=s[e+4>>2];e:{t:{if((0|(n=s[i+4>>2]))==s[i+8>>2]){if((n=1+(a=(l=n-(c=s[i>>2])|0)>>2)|0)>>>0>=1073741824)break t;if(o=l>>1,o=a>>>0<536870911?n>>>0>o>>>0?n:o:1073741823){if(o>>>0>=1073741824)break e;n=ur(o<<2)}else n=0;s[(a=n+(a<<2)|0)>>2]=r,(0|l)>0&&ye(n,c,l),s[i+8>>2]=n+(o<<2),s[i+4>>2]=a+4,s[i>>2]=n,c&&ee(c)}else s[n>>2]=r,s[i+4>>2]=n+4;return e=s[e+4>>2],s[s[e+12>>2]+(t<<2)>>2]=s[e+24>>2],void(s[e+24>>2]=s[e+24>>2]+1)}nn(),T()}qt(1326),T()}function Ie(e,t){var r,n=0,i=0,o=0,a=0,c=0,l=0;N=r=N-16|0;e:{t:if((i=s[e+4>>2])>>>0<t>>>0){if((o=t-i|0)>>>0>(n=(c=s[e+8>>2])<<5)>>>0|i>>>0>n-o>>>0){if(s[r+8>>2]=0,s[r>>2]=0,s[r+4>>2]=0,(0|t)<0)break e;n>>>0<=1073741822?(n=t+31&-32,t=(t=c<<6)>>>0<n>>>0?n:t):t=2147483647,at(r,t),i=s[e+4>>2],s[r+4>>2]=i+o,l=s[e>>2],t=s[r>>2],(0|i)<=0||(t=Ue(t,l,c=(n=i>>>5|0)<<2)+c|0,(0|(a=i-(n<<5)|0))<=0?a=0:(n=-1>>>32-a|0,s[t>>2]=s[t>>2]&(-1^n)|n&s[l+c>>2]),l=s[e>>2]),s[e>>2]=s[r>>2],s[r>>2]=l,n=s[e+4>>2],s[e+4>>2]=s[r+4>>2],s[r+4>>2]=n,n=s[e+8>>2],s[e+8>>2]=s[r+8>>2],s[r+8>>2]=n,l&&ee(l)}else s[e+4>>2]=t,a=31&i,t=s[e>>2]+(i>>>3&536870908)|0;if(!o)break t;if(a&&(e=(n=32-a|0)>>>0>o>>>0?o:n,s[t>>2]=s[t>>2]&(-1<<a&-1>>>n-e^-1),o=o-e|0,t=t+4|0),e=We(t,0,n=o>>>5<<2),!(t=31&o))break t;s[(e=e+n|0)>>2]=s[e>>2]&(-1>>>32-t^-1)}else s[e+4>>2]=t;return void(N=r+16|0)}nn(),T()}function Se(e,t){var r=0,n=0,i=0,a=0,c=0,l=0,f=0,p=0;if((n=d[e+11|0]>>>7|0?s[e+4>>2]:d[e+11|0])>>>0<t>>>0)return N=l=N-16|0,(a=t-n|0)&&(f=(c=(t=d[e+11|0]>>>7|0)?s[e+4>>2]:d[e+11|0])+a|0,(t=t?(2147483647&s[e+8>>2])-1|0:10)-c>>>0<a>>>0&&(N=n=N-16|0,(r=f-t|0)>>>0<=-17-t>>>0?(p=d[e+11|0]>>>7|0?s[e>>2]:e,t>>>0<2147483623?(s[n+8>>2]=t<<1,s[n+12>>2]=t+r,N=r=N-16|0,N=r+16|0,r=n+8|0,r=(r=s[(u[(i=n+12|0)>>2]<u[r>>2]?r:i)>>2])>>>0>=11?11==(0|(r=(i=r+16&-16)-1|0))?i:r:10):r=-18,r=ur(i=r+1|0),c&&qr(r,p,c),10!=(0|t)&&ee(p),s[e>>2]=r,s[e+8>>2]=-2147483648|i,N=n+16|0):(an(),T())),n=c+(t=d[e+11|0]>>>7|0?s[e>>2]:e)|0,a&&We(n,0,a),d[e+11|0]>>>7|0?s[e+4>>2]=f:o[e+11|0]=f,o[l+15|0]=0,o[t+f|0]=d[l+15|0]),void(N=l+16|0);N=n=N-16|0,d[e+11|0]>>>7|0?(a=s[e>>2],o[n+15|0]=0,o[t+a|0]=d[n+15|0],s[e+4>>2]=t):(o[n+14|0]=0,o[e+t|0]=d[n+14|0],o[e+11|0]=t),N=n+16|0}function Ne(e,t){var r,n=0,i=0,a=0,c=0,l=0,f=0,p=0,m=0,h=0;N=r=N-16|0;e:if(!((0|(a=s[t+20>>2]))>=(0|(n=s[t+12>>2]))&(i=s[t+16>>2])>>>0>=u[t+8>>2]|(0|n)<(0|a))&&(o[e+12|0]=d[i+s[t>>2]|0],a=s[t+20>>2],a=(n=s[t+16>>2]+1|0)?a:a+1|0,s[t+16>>2]=n,s[t+20>>2]=a,function e(t,r,n){var i=0,o=0,a=0,c=0,l=0;t:if(!(t>>>0>5||(a=s[n+20>>2],i=a,c=s[n+12>>2],o=s[n+16>>2],(0|i)>=(0|c)&o>>>0>=u[n+8>>2]|(0|i)>(0|c)))){if(i=d[o+s[n>>2]|0],a=(o=o+1|0)?a:a+1|0,s[n+16>>2]=o,s[n+20>>2]=a,128&i){if(!e(t+1|0,r,n))break t;i=127&i|s[r>>2]<<7}s[r>>2]=i,l=1}return l}(1,r+12|0,t)&&(i=(a=s[t+8>>2])-(n=l=s[t+16>>2])|0,n=n>>>0>a>>>0,a=s[t+20>>2],!((0|(c=s[t+12>>2]-(n+a|0)|0))<=0&i>>>0<(n=s[r+12>>2])>>>0|(0|c)<0|(0|n)<=0)))){i=l+s[t>>2]|0,s[e>>2]=i,m=e;t:if((p=d[0|(f=(c=n-1|0)+i|0)])>>>0<=63)s[e+4>>2]=c,e=63&d[0|f];else{r:switch((p>>>6|0)-1|0){case 0:if(n>>>0<2)break e;s[e+4>>2]=n-2,e=d[1+(i=(n+i|0)-2|0)|0]<<8&16128|d[0|i];break t;case 1:break r;default:break e}if(n>>>0<3)break e;s[e+4>>2]=n-3,e=d[2+(i=(n+i|0)-3|0)|0]<<16&4128768|d[i+1|0]<<8|d[0|i]}e=e+4096|0,s[m+8>>2]=e,e>>>0>1048575||(e=a,e=(i=n+l|0)>>>0<n>>>0?e+1|0:e,s[t+16>>2]=i,s[t+20>>2]=e,h=1)}return N=r+16|0,h}function Re(e,t,r){t|=0,r|=0;var n=0,i=0,a=0,c=0,l=0,f=0,p=0;return(n=(a=s[12+(e|=0)>>2])-(l=s[e+8>>2])>>2)>>>0<(t=o[t+24|0])>>>0?(ct(e+8|0,t-n|0),l=s[e+8>>2],a=s[e+12>>2]):t>>>0>=n>>>0||(a=(t<<2)+l|0,s[e+12>>2]=a),t=0,f=s[r+20>>2],a=n=a-l|0,c=(i=s[r+16>>2])+n|0,p=s[r+12>>2],f=n>>>0>c>>>0?f+1|0:f,c>>>0>u[r+8>>2]&(0|p)<=(0|f)|(0|f)>(0|p)||(ye(l,i+s[r>>2]|0,n),n=s[r+20>>2],n=(i=a+s[r+16>>2]|0)>>>0<a>>>0?n+1|0:n,c=i,s[r+16>>2]=i,s[r+20>>2]=n,i=s[r+12>>2],n=(a=c+4|0)>>>0<4?n+1|0:n,a>>>0>u[r+8>>2]&(0|n)>=(0|i)|(0|n)>(0|i)||(n=c+s[r>>2]|0,s[e+20>>2]=d[0|n]|d[n+1|0]<<8|d[n+2|0]<<16|d[n+3|0]<<24,n=s[r+20>>2],a=(i=(c=s[r+16>>2])+4|0)>>>0<4?n+1|0:n,p=i,s[r+16>>2]=i,s[r+20>>2]=a,(0|a)>=(0|(i=s[r+12>>2]))&p>>>0>=u[r+8>>2]|(0|a)>(0|i)||(i=d[p+s[r>>2]|0],n=(a=c+5|0)>>>0<5?n+1|0:n,s[r+16>>2]=a,s[r+20>>2]=n,i-1>>>0>29||(s[e+4>>2]=i,t=1)))),0|t}function Ee(e,t){var r,n=0,i=0,a=0,c=0,l=0;N=r=N-16|0;e:{t:{if(t){if(s[e+88>>2]=0,s[e+92>>2]=0,n=s[e+84>>2],s[e+84>>2]=0,n&&ee(n),s[e+76>>2]=0,s[e+80>>2]=0,n=s[e+72>>2],s[e+72>>2]=0,n&&ee(n),n=s[t>>2],i=s[t+4>>2],o[r+15|0]=0,He(e,i-n>>2,r+15|0),n=s[t+28>>2],i=s[t+24>>2],o[r+14|0]=0,He(e+12|0,n-i>>2,r+14|0),_e(e+28|0,s[t+4>>2]-s[t>>2]>>2,10316),a=(i=s[t+28>>2]-s[t+24>>2]|0)>>2,n=s[e+52>>2],!(a>>>0<=s[e+60>>2]-n>>2>>>0)){if((0|i)<0)break t;c=s[e+56>>2],l=(i=ur(i))+(a<<2)|0,c=(a=c-n|0)+i|0,(0|a)>0&&ye(i,n,a),s[e+60>>2]=l,s[e+56>>2]=c,s[e+52>>2]=i,n&&ee(n)}if(a=(i=s[t+28>>2]-s[t+24>>2]|0)>>2,n=s[e+40>>2],!(a>>>0<=s[e+48>>2]-n>>2>>>0)){if((0|i)<0)break e;c=s[e+44>>2],l=(i=ur(i))+(a<<2)|0,c=(a=c-n|0)+i|0,(0|a)>0&&ye(i,n,a),s[e+48>>2]=l,s[e+44>>2]=c,s[e+40>>2]=i,n&&ee(n)}o[e+24|0]=1,s[e+64>>2]=t}return void(N=r+16|0)}qt(1326),T()}qt(1326),T()}function Pe(e,t,r){e|=0,t|=0,r|=0;var n=0,i=b(0),a=b(0),f=b(0),u=b(0),p=b(0),m=0,h=b(0),g=b(0),A=b(0),x=b(0),y=0;if(!(9!=s[r+28>>2]|3!=d[r+24|0])&&!((e=s[e+4>>2])-31>>>0<4294967267)&&(y=1,m=s[r+80>>2]))for(h=b(b(2)/b((1<<e)-2|0)),r=s[s[r>>2]>>2]+s[r+48>>2]|0,e=s[s[t>>2]>>2]+s[t+48>>2]|0,t=0;f=b(0),g=b(0),A=b(0),i=b(b(b(s[e>>2])*h)+b(-1)),a=b(b(b(s[e+4>>2])*h)+b(-1)),p=b(b(b(1)-b(v(i)))-b(v(a))),u=b(_(b(-p),b(0))),x=b(-u),a=b(a+(a<b(0)?u:x)),i=b(i+(i<b(0)?u:x)),+(u=b(b(a*a)+b(b(p*p)+b(i*i))))<1e-6||(f=b(b(1)/b(k(u))),A=b(a*f),g=b(i*f),f=b(p*f)),e=e+8|0,c(A),n=l(2),o[r+8|0]=n,o[r+9|0]=n>>>8,o[r+10|0]=n>>>16,o[r+11|0]=n>>>24,c(g),n=l(2),o[r+4|0]=n,o[r+5|0]=n>>>8,o[r+6|0]=n>>>16,o[r+7|0]=n>>>24,c(f),n=l(2),o[0|r]=n,o[r+1|0]=n>>>8,o[r+2|0]=n>>>16,o[r+3|0]=n>>>24,r=r+12|0,(0|m)!=(0|(t=t+1|0)););return 0|y}function Be(e,t,r,n){var i,o=0,a=0,c=0,l=0,d=0,f=0,u=0,m=0;d=+p[t>>2],f=+p[t+4>>2],u=+p[t+8>>2],(c=v(d)+v(f)+v(u))>1e-6?(f*=c=1/c,d*=c,o=c*u<0):(d=1,f=0,o=0),i=s[e+16>>2],c=x(d*(u=+(0|i))+.5),l=(a=(m=v(c)<2147483648?~~c:-2147483648)>>31)+m^a,c=x(f*u+.5),l=(0|(t=i-(l+((a=v(c)<2147483648?~~c:-2147483648)+(t=a>>31)^t)|0)|0))<0?0:t,o=o?0-l|0:l,a=a+(t>>31&((0|a)>0?t:0-t|0))|0,(0|m)>=0?(t=o+i|0,e=s[e+8>>2],o=a+i|0):(t=a>>31,t^=t+a,e=s[e+8>>2],t=(0|o)<0?t:e-t|0,o=(0|a)<0?l:e-l|0),t|o&&(0|e)!=(0|t)|o&&t|(a=(0|e)!=(0|o))?(0|t)<=(0|i)|o?(0|t)>=(0|i)|a?(0|e)!=(0|t)|(0|o)>=(0|i)?t?e=o:(t=0,e=(0|o)<=(0|i)?o:(i<<1)-o|0):(t=e,e=(i<<1)-o|0):t=(i<<1)-t|0:(t=(i<<1)-t|0,e=0):t=e,s[r>>2]=e,s[n>>2]=t}function De(e,t){var r,n,i,a=0,c=0,l=0;n=s[e>>2],s[(a=n+(t>>>3&536870908)|0)>>2]=s[a>>2]|1<<t,r=s[e+64>>2],c=-1,(l=-1==(0|t))||(c=-1,-1!=(0|(a=((a=t+1|0)>>>0)%3|0?a:t-2|0))&&(c=s[s[r>>2]+(a<<2)>>2])),a=s[e+12>>2],s[(i=(c>>>3&536870908)+a|0)>>2]=s[i>>2]|1<<c;e:{if(l)e=a+536870908|0,t=s[a+536870908>>2],a=-2147483648;else{t:{if((t>>>0)%3|0)l=t-1|0;else if(c=-1,-1==(0|(l=t+2|0)))break t;c=s[s[r>>2]+(l<<2)>>2]}if(s[(l=(c>>>3&536870908)+a|0)>>2]=s[l>>2]|1<<c,c=-1,-1==(0|(t=s[s[r+12>>2]+(t<<2)>>2])))break e;o[e+24|0]=0,s[(e=(t>>>3&536870908)+n|0)>>2]=s[e>>2]|1<<t,-1!=(0|(e=((e=t+1|0)>>>0)%3|0?e:t-2|0))&&(c=s[s[r>>2]+(e<<2)>>2]),s[(e=a+(c>>>3&536870908)|0)>>2]=s[e>>2]|1<<c;t:{if((t>>>0)%3|0)t=t-1|0;else if(e=-1,-1==(0|(t=t+2|0)))break t;e=s[s[r>>2]+(t<<2)>>2]}t=1<<e,a=s[(e=a+(e>>>3&536870908)|0)>>2]}s[e>>2]=t|a}}function Oe(e,t){var r=0,n=0;r=s[t+8>>2],s[e+4>>2]=s[t+4>>2],s[e+8>>2]=r,s[e+20>>2]=s[t+20>>2],r=s[t+16>>2],s[e+12>>2]=s[t+12>>2],s[e+16>>2]=r;e:{t:{if((0|e)!=(0|t)){if(r=s[t+28>>2]){if(s[e+32>>2]<<5>>>0>=r>>>0)n=s[e+24>>2];else{if((n=s[e+24>>2])&&(ee(n),s[e+32>>2]=0,s[e+24>>2]=0,s[e+28>>2]=0,r=s[t+28>>2]),(0|r)<0)break t;n=ur((r=1+(r-1>>>5|0)|0)<<2),s[e+32>>2]=r,s[e+28>>2]=0,s[e+24>>2]=n,r=s[t+28>>2]}Ue(n,s[t+24>>2],4+(r-1>>>3&536870908)|0),r=s[t+28>>2]}else r=0;if(s[e+28>>2]=r,r=s[t+40>>2]){if(s[e+44>>2]<<5>>>0>=r>>>0)n=s[e+36>>2];else{if((n=s[e+36>>2])&&(ee(n),s[e+44>>2]=0,s[e+36>>2]=0,s[e+40>>2]=0,r=s[t+40>>2]),(0|r)<0)break e;n=ur((r=1+(r-1>>>5|0)|0)<<2),s[e+44>>2]=r,s[e+40>>2]=0,s[e+36>>2]=n,r=s[t+40>>2]}Ue(n,s[t+36>>2],4+(r-1>>>3&536870908)|0),t=s[t+40>>2]}else t=0;s[e+40>>2]=t}return}nn(),T()}nn(),T()}function ze(e,t){var r,n=0,i=0,o=0,a=0,c=0,l=0;N=r=N-16|0;e:if(ht(1,r+8|0,t)&&(n=s[t+8>>2],o=s[t+16>>2],c=s[r+12>>2],i=s[t+20>>2],!((0|c)==(0|(a=s[t+12>>2]-(i+(n>>>0<o>>>0)|0)|0))&(n-o|0)>>>0<(n=s[r+8>>2])>>>0|a>>>0<c>>>0||(i=i+c|0,i=(a=n+o|0)>>>0<o>>>0?i+1|0:i,s[t+16>>2]=a,s[t+20>>2]=i,(0|n)<=0)))){i=o+s[t>>2]|0,s[e+40>>2]=i,c=e;t:if((t=d[0|(o=i+(a=n-1|0)|0)])>>>0<=63)s[e+44>>2]=a,e=63&d[0|o];else{r:switch((t>>>6|0)-1|0){case 0:if(n>>>0<2)break e;s[e+44>>2]=n-2,e=d[1+(t=(n+i|0)-2|0)|0]<<8&16128|d[0|t];break t;case 1:if(n>>>0<3)break e;s[e+44>>2]=n-3,e=d[2+(t=(n+i|0)-3|0)|0]<<16&4128768|d[t+1|0]<<8|d[0|t];break t}s[e+44>>2]=n-4,e=d[2+(t=(n+i|0)-4|0)|0]<<16|d[t+3|0]<<24&1056964608|d[t+1|0]<<8|d[0|t]}e=e+16384|0,s[c+48>>2]=e,l=e>>>0<4194304}return N=r+16|0,l}function Fe(e){var t,r=0,n=0;r=s[e+8>>2],t=s[e>>2];e:{if(d[e+12|0]){t:{if(-1!=(0|r)&&-1!=(0|(r=((n=r+1|0)>>>0)%3|0?n:r-2|0))&&-1!=(0|(r=s[s[t+12>>2]+(r<<2)>>2]))){if(r=((n=r+1|0)>>>0)%3|0?n:r-2|0,s[e+8>>2]=r,-1!=(0|r))break t}else s[e+8>>2]=-1;r=-1;r:if(-1!=(0|(n=s[e+4>>2]))){if((n>>>0)%3|0)n=n-1|0;else if(r=-1,-1==(0|(n=n+2|0)))break r;r=-1,-1!=(0|(n=s[s[t+12>>2]+(n<<2)>>2]))&&(r=n-1|0,(n>>>0)%3|0||(r=n+2|0))}return o[e+12|0]=0,void(s[e+8>>2]=r)}if((0|r)!=s[e+4>>2])break e;return void(s[e+8>>2]=-1)}n=-1;t:if(-1!=(0|r)){if((r>>>0)%3|0)r=r-1|0;else if(n=-1,-1==(0|(r=r+2|0)))break t;n=-1,-1!=(0|(r=s[s[t+12>>2]+(r<<2)>>2]))&&(n=r-1|0,(r>>>0)%3|0||(n=r+2|0))}s[e+8>>2]=n}}function Ge(e){var t,r=0,n=0;t=ur(32),r=d[1619]|d[1620]<<8,o[t+24|0]=r,o[t+25|0]=r>>>8,r=d[1615]|d[1616]<<8|d[1617]<<16|d[1618]<<24,n=d[1611]|d[1612]<<8|d[1613]<<16|d[1614]<<24,o[t+16|0]=n,o[t+17|0]=n>>>8,o[t+18|0]=n>>>16,o[t+19|0]=n>>>24,o[t+20|0]=r,o[t+21|0]=r>>>8,o[t+22|0]=r>>>16,o[t+23|0]=r>>>24,r=d[1607]|d[1608]<<8|d[1609]<<16|d[1610]<<24,n=d[1603]|d[1604]<<8|d[1605]<<16|d[1606]<<24,o[t+8|0]=n,o[t+9|0]=n>>>8,o[t+10|0]=n>>>16,o[t+11|0]=n>>>24,o[t+12|0]=r,o[t+13|0]=r>>>8,o[t+14|0]=r>>>16,o[t+15|0]=r>>>24,r=d[1599]|d[1600]<<8|d[1601]<<16|d[1602]<<24,n=d[1595]|d[1596]<<8|d[1597]<<16|d[1598]<<24,o[0|t]=n,o[t+1|0]=n>>>8,o[t+2|0]=n>>>16,o[t+3|0]=n>>>24,o[t+4|0]=r,o[t+5|0]=r>>>8,o[t+6|0]=r>>>16,o[t+7|0]=r>>>24,o[t+26|0]=0,s[e>>2]=-1,Ot(e+4|0,t,26),ee(t)}function Ue(e,t,r){var n=0,i=0;e:if((0|e)!=(0|t)){if(t-(i=e+r|0)>>>0<=0-(r<<1)>>>0)return ye(e,t,r);if(n=3&(e^t),e>>>0<t>>>0){if(n)n=e;else{if(3&e)for(n=e;;){if(!r)break e;if(o[0|n]=d[0|t],t=t+1|0,r=r-1|0,!(3&(n=n+1|0)))break}else n=e;if(!(r>>>0<=3))for(;s[n>>2]=s[t>>2],t=t+4|0,n=n+4|0,(r=r-4|0)>>>0>3;);}if(r)for(;o[0|n]=d[0|t],n=n+1|0,t=t+1|0,r=r-1|0;);}else{if(!n){if(3&i)for(;;){if(!r)break e;if(o[0|(n=(r=r-1|0)+e|0)]=d[t+r|0],!(3&n))break}if(!(r>>>0<=3))for(;s[(r=r-4|0)+e>>2]=s[t+r>>2],r>>>0>3;);}if(!r)break e;for(;o[(r=r-1|0)+e|0]=d[t+r|0],r;);}}return e}function Ve(e,t,r){var n,i,o=0,a=0,c=0,l=0,f=0,u=0,p=0,m=0;N=n=N-16|0;e:{if((0|(c=s[e+24>>2]))!=(0|(i=s[e+28>>2])))for(;;){s[n+8>>2]=0,s[n>>2]=0,s[n+4>>2]=0,o=Qt(s[c>>2],t,n),f=(e=d[n+11|0])<<24>>24,u=3;t:{r:{n:{i:if(o&&(u=0,a=(o=d[r+11|0])<<24>>24,(0|(p=(0|f)<0?s[n+4>>2]:e))==(0|((0|a)<0?s[r+4>>2]:o)))){l=(0|a)<0?s[r>>2]:r,a=s[n>>2];o:{if(!(o=(0|f)<0)){if(!f)break o;if(o=n,d[0|l]!=(255&a))break t;for(;;){if(!(e=e-1|0))break o;if(a=d[l+1|0],l=l+1|0,(0|a)!=d[0|(o=o+1|0)])break}break i}if(p&&Mt(o?a:n,l,p))break n}m=s[c>>2],u=1}if((0|f)>=0)break r}ee(s[n>>2])}switch(0|u){case 0:case 3:break t;default:break e}}if((0|i)==(0|(c=c+4|0)))break}m=0}return N=n+16|0,m}function Le(e,t){var r=0,n=0,i=0,o=0,a=0,c=0,l=0;if((n=s[e+8>>2])-(r=s[e+4>>2])>>2>>>0>=t>>>0)return t&&(r=We(r,0,t<<=2)+t|0),void(s[e+4>>2]=r);e:{t:{r:{if((i=(o=r-(a=s[e>>2])>>2)+t|0)>>>0<1073741824){if(c=(n=n-a|0)>>1,i=n>>2>>>0<536870911?i>>>0>c>>>0?i:c:1073741823){if(i>>>0>=1073741824)break r;l=ur(i<<2)}if(o=(t=We(n=(o<<2)+l|0,0,o=t<<2))+o|0,i=(i<<2)+l|0,(0|r)==(0|a))break t;for(;t=s[(r=r-4|0)>>2],s[r>>2]=0,s[(n=n-4|0)>>2]=t,(0|r)!=(0|a););if(s[e+8>>2]=i,t=s[e+4>>2],s[e+4>>2]=o,r=s[e>>2],s[e>>2]=n,(0|t)==(0|r))break e;for(;e=s[(t=t-4|0)>>2],s[t>>2]=0,e&&vn[s[s[e>>2]+4>>2]](e),(0|t)!=(0|r););break e}nn(),T()}qt(1326),T()}s[e+8>>2]=i,s[e+4>>2]=o,s[e>>2]=t}r&&ee(r)}function je(e,t){e|=0;var r,n,i=0,o=0,a=0,c=0,l=0,f=0,u=0;return l=o=s[12+(t|=0)>>2],a=i=s[t+20>>2],i=(r=(c=s[t+16>>2])+4|0)>>>0<4?i+1|0:i,(n=s[t+8>>2])>>>0<r>>>0&(0|i)>=(0|o)|(0|i)>(0|o)||(f=s[t>>2],o=d[0|(o=f+c|0)]|d[o+1|0]<<8|d[o+2|0]<<16|d[o+3|0]<<24,s[t+16>>2]=r,s[t+20>>2]=i,i=a,c=a=c+8|0,a=i=a>>>0<8?i+1|0:i,c>>>0>n>>>0&(0|i)>=(0|l)|(0|i)>(0|l)||(i=d[0|(i=r+f|0)]|d[i+1|0]<<8|d[i+2|0]<<16|d[i+3|0]<<24,s[t+16>>2]=c,s[t+20>>2]=a,(0|i)<(0|o)||(s[e+16>>2]=i,s[e+12>>2]=o,!(l=(i>>31)-((o>>31)+(i>>>0<o>>>0)|0)|0)&(i=i-o|0)>>>0>2147483646|l||(i=i+1|0,s[e+20>>2]=i,o=i>>>1|0,s[e+24>>2]=o,s[e+28>>2]=0-o,1&i||(s[e+24>>2]=o-1),u=Ne(e+112|0,t))))),0|u}function We(e,t,r){var n=0,i=0,a=0;if(r&&(o[0|e]=t,o[(i=e+r|0)-1|0]=t,!(r>>>0<3||(o[e+2|0]=t,o[e+1|0]=t,o[i-3|0]=t,o[i-2|0]=t,r>>>0<7||(o[e+3|0]=t,o[i-4|0]=t,r>>>0<9||(a=(i=0-e&3)+e|0,n=h(255&t,16843009),s[a>>2]=n,s[(r=(t=r-i&-4)+a|0)-4>>2]=n,t>>>0<9||(s[a+8>>2]=n,s[a+4>>2]=n,s[r-8>>2]=n,s[r-12>>2]=n,t>>>0<25||(s[a+24>>2]=n,s[a+20>>2]=n,s[a+16>>2]=n,s[a+12>>2]=n,s[r-16>>2]=n,s[r-20>>2]=n,s[r-24>>2]=n,s[r-28>>2]=n,(r=(r=t)-(t=4&a|24)|0)>>>0<32))))))))for(n=Ht(n,0,1,1),i=R,t=t+a|0;s[t+24>>2]=n,s[t+28>>2]=i,s[t+16>>2]=n,s[t+20>>2]=i,s[t+8>>2]=n,s[t+12>>2]=i,s[t>>2]=n,s[t+4>>2]=i,t=t+32|0,(r=r-32|0)>>>0>31;);return e}function Ze(e,t){var r=0,n=0,i=0,o=0,a=0;n=-1,o=-1,i=-1;e:{t:if(-1!=(0|t)){if(a=1,o=s[s[s[e+4>>2]+12>>2]+(t<<2)>>2],(0|(r=((r=t+1|0)>>>0)%3|0?r:t-2|0))>=0&&(i=(r>>>0)/3|0,i=s[(s[s[e>>2]+96>>2]+h(i,12)|0)+(r-h(i,3)<<2)>>2]),-1!=(0|o)&&(a=0,(0|(r=((o>>>0)%3|0?-1:2)+o|0))<0||(n=(r>>>0)/3|0,n=s[(s[s[e>>2]+96>>2]+h(n,12)|0)+(r-h(n,3)<<2)>>2])),r=-1,(0|n)!=(0|i))break e;if(i=-1,(0|(t=((t>>>0)%3|0?-1:2)+t|0))>=0){if(n=(t>>>0)/3|0,n=s[(s[s[e>>2]+96>>2]+h(n,12)|0)+(t-h(n,3)<<2)>>2],a)break t}else if(n=-1,a)break t;(0|(t=((t=o+1|0)>>>0)%3|0?t:o-2|0))<0||(r=s[s[e>>2]+96>>2],i=s[(r+h(e=(t>>>0)/3|0,12)|0)+(t-h(e,3)<<2)>>2])}r=(0|n)==(0|i)?o:-1}return r}function He(e,t,r){var n,i=0,o=0,a=0;N=n=N-16|0,s[e+4>>2]=0;e:{t:if(t){if((i=(a=s[e+8>>2])<<5)>>>0>=t>>>0)s[e+4>>2]=t;else{if(s[n+8>>2]=0,s[n>>2]=0,s[n+4>>2]=0,(0|t)<0)break e;at(n,i=i>>>0<=1073741822?(i=a<<6)>>>0<(o=t+31&-32)>>>0?o:i:2147483647),o=s[e>>2],s[e>>2]=s[n>>2],s[n>>2]=o,i=s[e+4>>2],s[e+4>>2]=t,s[n+4>>2]=i,i=s[e+8>>2],s[e+8>>2]=s[n+8>>2],s[n+8>>2]=i,o&&ee(o)}if(i=(o=t>>>5|0)<<2,e=s[e>>2],d[0|r]){if(e=We(e,255,i),!(t&=31))break t;s[(e=e+(o<<2)|0)>>2]=s[e>>2]|-1>>>32-t}else e=We(e,0,i),(t&=31)&&(s[(e=e+(o<<2)|0)>>2]=s[e>>2]&(-1>>>32-t^-1))}return void(N=n+16|0)}nn(),T()}function Ye(e,t,r){var n,i=0,o=0,a=0,c=0;if((n=(a=r-t|0)>>2)>>>0<=(i=s[e+8>>2])-(o=s[e>>2])>>2>>>0){if((0|(i=n>>>0>(c=(i=(a=s[e+4>>2])-o|0)>>2)>>>0?t+i|0:r))!=(0|t))for(;s[o>>2]=s[t>>2],o=o+4|0,(0|i)!=(0|(t=t+4|0)););return n>>>0>c>>>0?((0|(t=r-i|0))>0&&(a=ye(a,i,t)+t|0),void(s[e+4>>2]=a)):void(s[e+4>>2]=o)}if(o&&(s[e+4>>2]=o,ee(o),s[e+8>>2]=0,s[e>>2]=0,s[e+4>>2]=0,i=0),!((0|a)<0||(r=i>>1,(r=i>>2>>>0<536870911?r>>>0<n>>>0?n:r:1073741823)>>>0>=1073741824)))return r=ur(o=r<<2),s[e>>2]=r,s[e+4>>2]=r,s[e+8>>2]=r+o,a&&(r=ye(r,t,a)+a|0),void(s[e+4>>2]=r);nn(),T()}function qe(e,t){e|=0;var r,n,i,o=0,a=0,c=0,l=0,f=0;return c=s[12+(t|=0)>>2],l=o=s[t+20>>2],o=(a=(r=s[t+16>>2])+4|0)>>>0<4?o+1|0:o,i=a,(n=s[t+8>>2])>>>0<a>>>0&(0|o)>=(0|c)|(0|o)>(0|c)||(a=r+s[t>>2]|0,a=d[0|a]|d[a+1|0]<<8|d[a+2|0]<<16|d[a+3|0]<<24,s[t+16>>2]=i,s[t+20>>2]=o,o=l,(l=r+8|0)>>>0>n>>>0&(0|(o=l>>>0<8?o+1|0:o))>=(0|c)|(0|o)>(0|c)||(s[t+16>>2]=l,s[t+20>>2]=o,1&a&&((o=31^g(a))-30>>>0<4294967267||(s[e+8>>2]=o+1,o=-2-(c=-2<<o)|0,s[e+16>>2]=o,s[e+12>>2]=-1^c,s[e+24>>2]=(0|o)/2,p[e+20>>2]=b(2)/b(0|o),f=Ne(e+96|0,t))))),0|f}function Qe(e){var t=0,r=0,n=0,i=0;r=1;e:if(!((0|(n=s[e+140>>2]))<=0)){for(t=n<<4,r=ur((0|n)!=(268435455&n)?-1:4|t),s[r>>2]=n,n=(r=r+4|0)+t|0,t=r;s[t>>2]=0,s[t+4>>2]=0,o[t+5|0]=0,o[t+6|0]=0,o[t+7|0]=0,o[t+8|0]=0,o[t+9|0]=0,o[t+10|0]=0,o[t+11|0]=0,o[t+12|0]=0,(0|n)!=(0|(t=t+16|0)););if(i=s[e+136>>2],s[e+136>>2]=r,i){if(r=s[(n=i-4|0)>>2])for(t=(r<<4)+i|0;(0|i)!=(0|(t=t-16|0)););ee(n)}if(r=1,!(s[e+140>>2]<=0))for(t=0;;){if(!(r=Ne(s[e+136>>2]+(t<<4)|0,e)))break e;if(!((0|(t=t+1|0))<s[e+140>>2]))break}}return r}function Xe(e,t){var r,n=0,i=0,a=0,c=0;return s[e+64>>2]||(n=ur(32),s[n+16>>2]=0,s[n+20>>2]=0,s[n+8>>2]=0,s[n>>2]=0,s[n+4>>2]=0,s[n+24>>2]=0,s[n+28>>2]=0,i=s[e+64>>2],s[e+64>>2]=n,i&&((n=s[i>>2])&&(s[i+4>>2]=n,ee(n)),ee(i))),a=s[e+64>>2],i=(n=s[e+28>>2]-1|0)>>>0<=10?s[10180+(n<<2)>>2]:-1,i=n=h(i,o[e+24|0]),(a=Vt(a,0,Ht(n,r=n>>31,t,0),R))&&(n=s[e+64>>2],s[e>>2]=n,c=s[n+20>>2],s[e+8>>2]=s[n+16>>2],s[e+12>>2]=c,c=s[n+24>>2],n=s[n+28>>2],s[e+48>>2]=0,s[e+52>>2]=0,s[e+40>>2]=i,s[e+44>>2]=r,s[e+16>>2]=c,s[e+20>>2]=n,s[e+80>>2]=t),a}function Je(e,t,r){var n=0,i=0,o=0,a=0,c=0,l=0,f=0;o=e+4|0;e:{if(e=s[e+4>>2])for(l=(n=(i=d[r+11|0])<<24>>24<0)?s[r>>2]:r,i=n?s[r+4>>2]:i;;){t:{r:{n:{i:{o:{a:if(c=(f=(r=(n=(r=d[e+27|0])<<24>>24<0)?s[e+20>>2]:r)>>>0<i>>>0)?r:i){if(a=e+16|0,!(a=Mt(l,n=n?s[a>>2]:a,c))){if(r>>>0>i>>>0)break a;break o}if((0|a)>=0)break o}else if(r>>>0<=i>>>0)break i;if(r=s[e>>2])break t;return s[t>>2]=e,e}if(r=Mt(n,l,c))break n}if(f)break r;break e}if((0|r)>=0)break e}if(o=e+4|0,!(r=s[e+4>>2]))break e;e=o}o=e,e=r}return s[t>>2]=o,o}return s[t>>2]=e,o}function Ke(e,t){var r=0;return r=s[t+4>>2],s[e>>2]=s[t>>2],s[e+4>>2]=r,r=s[t+60>>2],s[e+56>>2]=s[t+56>>2],s[e+60>>2]=r,r=s[t+52>>2],s[e+48>>2]=s[t+48>>2],s[e+52>>2]=r,r=s[t+44>>2],s[e+40>>2]=s[t+40>>2],s[e+44>>2]=r,r=s[t+36>>2],s[e+32>>2]=s[t+32>>2],s[e+36>>2]=r,r=s[t+28>>2],s[e+24>>2]=s[t+24>>2],s[e+28>>2]=r,r=s[t+20>>2],s[e+16>>2]=s[t+16>>2],s[e+20>>2]=r,r=s[t+12>>2],s[e+8>>2]=s[t+8>>2],s[e+12>>2]=r,s[e+88>>2]=0,s[e+64>>2]=0,s[e+68>>2]=0,s[e+72>>2]=0,s[e+76>>2]=0,o[e+77|0]=0,o[e+78|0]=0,o[e+79|0]=0,o[e+80|0]=0,o[e+81|0]=0,o[e+82|0]=0,o[e+83|0]=0,o[e+84|0]=0,e}function $e(e,t){var r,n=0,i=0,o=0,a=0,c=0,l=0,f=0;r=e+4|0;e:{t:if(e=s[e+4>>2]){for(l=(n=(i=d[t+11|0])<<24>>24<0)?s[t>>2]:t,o=n?s[t+4>>2]:i,n=r;(i=(a=(c=(f=(t=d[e+27|0])<<24>>24<0)?s[e+20>>2]:t)>>>0>o>>>0)?o:c)&&(t=e+16|0,t=Mt(f?s[t>>2]:t,l,i))||(t=o>>>0>c>>>0?-1:a),n=(0|t)<0?n:e,e=s[(t>>>29&4)+e>>2];);if((0|n)!=(0|r)){if(!((t=(i=(a=(e=d[n+27|0])<<24>>24<0)?s[n+20>>2]:e)>>>0<o>>>0?i:o)&&(e=n+16|0,e=Mt(l,a?s[e>>2]:e,t)))){if(i>>>0>o>>>0)break t;break e}if((0|e)>=0)break e}}n=r}return n}function et(e,t,r){var n=0,i=0,o=0,a=0;e:{if(!((0|t)<0|(0|r)<0)){if(!(t>>>0>1431655765)){if(_e(e,n=h(t,3),10256),_e(e+12|0,n,10260),n=s[e+24>>2],!(s[e+32>>2]-n>>2>>>0>=r>>>0)){if(r>>>0>=1073741824)break e;i=s[e+28>>2],o=(r=ur(o=r<<2))+o|0,a=(i=i-n|0)+r|0,(0|i)>0&&ye(r,n,i),s[e+32>>2]=o,s[e+28>>2]=a,s[e+24>>2]=r,n&&ee(n)}s[e+80>>2]=0,s[e+84>>2]=0,r=s[e+76>>2],s[e+76>>2]=0,r&&ee(r),s[e+68>>2]=0,s[e+72>>2]=0,e=s[(r=e- -64|0)>>2],s[r>>2]=0,e&&ee(e)}n=t>>>0<1431655766}return n}qt(1326),T()}function tt(e){var t=0,r=0,n=0,i=0,a=0;if(n=s[e+8>>2],!d[n+84|0]&&!(!(t=s[e+16>>2])|!d[t+84|0]||(r=s[n+72>>2],i=s[n+68>>2],o[t+84|0]=0,r=r-i>>2,a=s[t+68>>2],r>>>0>(i=s[t+72>>2]-a>>2)>>>0?(xe(t+68|0,r-i|0,2032),n=s[e+8>>2]):r>>>0>=i>>>0||(s[t+72>>2]=a+(r<<2)),(t=d[n+84|0])||(0|(r=s[n+68>>2]))==s[n+72>>2])))if(i=s[s[e+16>>2]+68>>2],t)s[i>>2]=0;else for(t=0;s[(a=t<<2)+i>>2]=s[r+a>>2],t=t+1|0,r=s[n+68>>2],t>>>0<s[n+72>>2]-r>>2>>>0;);return s[e+16>>2]}function rt(e,t){var r=0,n=0,i=0,o=0,a=0,c=0;if((0|(r=s[e+4>>2]))!=s[e+8>>2])return n=s[t+4>>2],s[r>>2]=s[t>>2],s[r+4>>2]=n,s[r+8>>2]=s[t+8>>2],void(s[e+4>>2]=r+12);e:{if((r=1+(n=(0|(a=r-(o=s[e>>2])|0))/12|0)|0)>>>0<357913942){if(i=n<<1,i=n>>>0<178956970?r>>>0>i>>>0?r:i:357913941){if(i>>>0>=357913942)break e;r=ur(h(i,12))}else r=0;return n=r+h(n,12)|0,c=s[t+4>>2],s[n>>2]=s[t>>2],s[n+4>>2]=c,s[n+8>>2]=s[t+8>>2],t=n+h((0|a)/-12|0,12)|0,(0|a)>0&&ye(t,o,a),s[e+8>>2]=r+h(i,12),s[e+4>>2]=n+12,s[e>>2]=t,void(o&&ee(o))}nn(),T()}qt(1326),T()}function nt(e,t){t|=0;var r=0,n=0,i=0,o=0;e:if((0|(r=s[216+(e|=0)>>2]))!=s[e+220>>2]){for(;;){t:if(!((0|(r=s[h(i,144)+r>>2]))<0||(n=s[e+4>>2],o=s[n+8>>2],(0|r)>=s[n+12>>2]-o>>2||(n=0,r=s[(r<<2)+o>>2],(0|vn[s[s[r>>2]+24>>2]](r))<=0)))){for(;;){if((0|vn[s[s[r>>2]+20>>2]](r,n))!=(0|t)){if(n=n+1|0,(0|vn[s[s[r>>2]+24>>2]](r))>(0|n))continue;break t}break}e=s[e+216>>2]+h(i,144)|0,i=d[e+100|0]?e+4|0:0;break e}if(i=i+1|0,r=s[e+216>>2],!(i>>>0<(s[e+220>>2]-r|0)/144>>>0))break}return 0}return 0|i}function it(e,t,r,n,i,a,c){var l,f=0,p=0;if(N=l=N-16|0,(-1^t)-17>>>0>=r>>>0)return p=d[e+11|0]>>>7|0?s[e>>2]:e,t>>>0<2147483623?(s[l+8>>2]=t<<1,s[l+12>>2]=t+r,N=r=N-16|0,N=r+16|0,r=l+8|0,r=(r=s[(u[(f=l+12|0)>>2]<u[r>>2]?r:f)>>2])>>>0>=11?11==(0|(r=(f=r+16&-16)-1|0))?f:r:10):r=-18,r=ur(f=r+1|0),a&&qr(r,c,a),(n=n-i|0)&&qr(r+a|0,i+p|0,n),10!=(0|t)&&ee(p),s[e>>2]=r,s[e+8>>2]=-2147483648|f,t=e,e=n+a|0,s[t+4>>2]=e,o[l+7|0]=0,o[e+r|0]=d[l+7|0],void(N=l+16|0);an(),T()}function ot(e,t){t|=0;var r=0,n=0,i=0,o=0;if((0|(r=s[216+(e|=0)>>2]))!=s[e+220>>2])for(;;){e:if(!((0|(r=s[h(i,144)+r>>2]))<0||(n=s[e+4>>2],o=s[n+8>>2],(0|r)>=s[n+12>>2]-o>>2||(n=0,r=s[(r<<2)+o>>2],(0|vn[s[s[r>>2]+24>>2]](r))<=0)))){for(;;){if((0|vn[s[s[r>>2]+20>>2]](r,n))!=(0|t)){if(n=n+1|0,(0|vn[s[s[r>>2]+24>>2]](r))>(0|n))continue;break e}break}return 104+(s[e+216>>2]+h(i,144)|0)|0}if(i=i+1|0,r=s[e+216>>2],!(i>>>0<(s[e+220>>2]-r|0)/144>>>0))break}return e+184|0}function at(e,t){var r,n=0,i=0,o=0,a=0,c=0,l=0;N=r=N-16|0;e:{if(!(s[e+8>>2]<<5>>>0>=t>>>0)){if(s[r+8>>2]=0,s[r>>2]=0,s[r+4>>2]=0,(0|t)<0)break e;i=ur((a=1+(t-1>>>5|0)|0)<<2),s[r+8>>2]=a,s[r>>2]=i,o=s[e>>2],t=s[e+4>>2],s[r+4>>2]=t,s[((t>>>0<33?0:t-1>>>5|0)<<2)+i>>2]=0,(0|t)<=0||(l=Ue(i,o,n=(c=t>>>5|0)<<2),(0|(t=t-(c<<5)|0))<=0||(t=-1>>>32-t|0,s[(n=n+l|0)>>2]=s[n>>2]&(-1^t)|t&s[(c<<2)+o>>2])),s[e+8>>2]=a,s[e>>2]=i,o&&ee(o)}return void(N=r+16|0)}nn(),T()}function st(e){var t,r=0,n=0;if(s[(e|=0)>>2]=10332,(r=s[e+68>>2])&&(s[e+72>>2]=r,ee(r)),(r=s[e+56>>2])&&(s[e+60>>2]=r,ee(r)),(r=s[e+44>>2])&&(s[e+48>>2]=r,ee(r)),(r=s[e+32>>2])&&(s[e+36>>2]=r,ee(r)),(r=s[e+20>>2])&&(s[e+24>>2]=r,ee(r)),t=s[e+8>>2]){if((0|(n=s[e+12>>2]))==(0|t))r=t;else{for(;r=s[(n=n-4|0)>>2],s[n>>2]=0,r&&Lt(r),(0|t)!=(0|n););r=s[e+8>>2]}s[e+12>>2]=t,ee(r)}return r=s[e+4>>2],s[e+4>>2]=0,r&&It(r),0|e}function ct(e,t){var r=0,n=0,i=0,o=0,a=0,c=0,l=0;if((i=s[e+8>>2])-(r=s[e+4>>2])>>2>>>0>=t>>>0)return t&&(r=We(r,0,t<<=2)+t|0),void(s[e+4>>2]=r);e:{if((n=(c=(a=r-(o=s[e>>2])|0)>>2)+t|0)>>>0<1073741824){if(r=0,l=(i=i-o|0)>>1,n=i>>2>>>0<536870911?n>>>0>l>>>0?n:l:1073741823){if(n>>>0>=1073741824)break e;r=ur(n<<2)}return t=We((c<<2)+r|0,0,t<<=2)+t|0,(0|a)>0&&ye(r,o,a),s[e+8>>2]=(n<<2)+r,s[e+4>>2]=t,s[e>>2]=r,void(o&&ee(o))}nn(),T()}qt(1326),T()}function lt(e,t){var r=0,n=0,i=0,o=0,a=0,c=0,l=0;if((i=s[e+8>>2])-(r=s[e+4>>2])>>3>>>0>=t>>>0)return t&&(r=We(r,0,t<<=3)+t|0),void(s[e+4>>2]=r);e:{if((n=(c=(a=r-(o=s[e>>2])|0)>>3)+t|0)>>>0<536870912){if(r=0,l=(i=i-o|0)>>2,n=i>>3>>>0<268435455?n>>>0>l>>>0?n:l:536870911){if(n>>>0>=536870912)break e;r=ur(n<<3)}return t=We((c<<3)+r|0,0,t<<=3)+t|0,(0|a)>0&&ye(r,o,a),s[e+8>>2]=(n<<3)+r,s[e+4>>2]=t,s[e>>2]=r,void(o&&ee(o))}nn(),T()}qt(1326),T()}function dt(e,t){var r,n=0,i=0,o=0,a=0,c=0;if(r=s[e>>2],(e=s[r+4>>2])>>>0<(n=s[r+8>>2])>>>0)return s[e>>2]=s[t>>2],void(s[r+4>>2]=e+4);e:{if((e=1+(i=(a=e-(o=s[r>>2])|0)>>2)|0)>>>0<1073741824){if(c=i<<2,i=(n=n-o|0)>>1,n=n>>2>>>0<536870911?e>>>0>i>>>0?e:i:1073741823){if(n>>>0>=1073741824)break e;e=ur(n<<2)}else e=0;return s[(i=c+e|0)>>2]=s[t>>2],(0|a)>0&&ye(e,o,a),s[r+8>>2]=e+(n<<2),s[r+4>>2]=i+4,s[r>>2]=e,void(o&&ee(o))}nn(),T()}qt(1326),T()}function ft(e,t){var r=0,n=0,i=0,o=0,a=0,c=0;e:{t:{if((o=(r=s[e+4>>2])-(i=s[e>>2])|0)>>>0<t>>>0){if((a=t-o|0)>>>0<=(n=s[e+8>>2])-r>>>0)return a&&(r=We(r,0,a)+a|0),void(s[e+4>>2]=r);if((0|t)<0)break e;if(r=0,c=(n=n-i|0)<<1,(n=n>>>0<1073741823?t>>>0>c>>>0?t:c:2147483647)&&(r=ur(n)),We(r+o|0,0,a),(0|o)>0&&ye(r,i,o),s[e+8>>2]=r+n,s[e+4>>2]=t+r,s[e>>2]=r,!i)break t;return void ee(i)}t>>>0>=o>>>0||(s[e+4>>2]=t+i)}return}nn(),T()}function ut(e,t){var r=0,n=0,i=0,o=0,a=0,c=0;if((i=s[e+8>>2])-(r=s[e+4>>2])>>1>>>0>=t>>>0)return t&&(r=We(r,0,t<<=1)+t|0),void(s[e+4>>2]=r);e:{if((0|(n=(c=(a=r-(o=s[e>>2])|0)>>1)+t|0))>=0){if(r=0,n=(i=i-o|0)>>1>>>0<1073741823?n>>>0>i>>>0?n:i:2147483647){if((0|n)<0)break e;r=ur(n<<1)}return t=We((c<<1)+r|0,0,t<<=1)+t|0,(0|a)>0&&ye(r,o,a),s[e+8>>2]=(n<<1)+r,s[e+4>>2]=t,s[e>>2]=r,void(o&&ee(o))}nn(),T()}qt(1326),T()}function pt(e){var t=0,r=0,n=0,i=0,o=0;if((0|(t=s[e+4>>2]))!=s[e+8>>2])return s[t>>2]=s[2088],void(s[e+4>>2]=t+4);e:{if((t=1+(n=(o=t-(i=s[e>>2])|0)>>2)|0)>>>0<1073741824){if(r=o>>1,r=n>>>0<536870911?t>>>0>r>>>0?t:r:1073741823){if(r>>>0>=1073741824)break e;t=ur(r<<2)}else t=0;return s[(n=t+(n<<2)|0)>>2]=s[2088],(0|o)>0&&ye(t,i,o),s[e+8>>2]=t+(r<<2),s[e+4>>2]=n+4,s[e>>2]=t,void(i&&ee(i))}nn(),T()}qt(1326),T()}function mt(e,t){var r=0,n=0,i=0,o=0;n=s[e+12>>2],(r=s[e+16>>2]-n>>2)>>>0<t>>>0?ct(e+12|0,t-r|0):t>>>0>=r>>>0||(s[e+16>>2]=n+(t<<2));e:{if(r=s[e>>2],!(s[e+8>>2]-r>>2>>>0>=t>>>0)){if(t>>>0>=1073741824)break e;n=s[e+4>>2],i=(t=ur(i=t<<2))+i|0,o=(n=n-r|0)+t|0,(0|n)>0&&ye(t,r,n),s[e+8>>2]=i,s[e+4>>2]=o,s[e>>2]=t,r&&ee(r)}return}qt(1326),T()}function ht(e,t,r){var n=0,i=0,a=0,c=0;e:if(!(e>>>0>10||(0|(n=s[r+20>>2]))>=(0|(i=s[r+12>>2]))&(a=s[r+16>>2])>>>0>=u[r+8>>2]|(0|n)>(0|i))){if(i=o[a+s[r>>2]|0],n=(a=a+1|0)?n:n+1|0,s[r+16>>2]=a,s[r+20>>2]=n,(0|i)<0){if(!ht(e+1|0,t,r))break e;r=s[t>>2],e=s[t+4>>2]<<7|r>>>25,r=127&i|r<<7}else e=0,r=255&i;s[t>>2]=r,s[t+4>>2]=e,c=1}return c}function bt(e,t,r,n){o[e+53|0]=1;e:if(s[e+4>>2]==(0|r)){o[e+52|0]=1;t:{if(!(r=s[e+16>>2])){if(s[e+36>>2]=1,s[e+24>>2]=n,s[e+16>>2]=t,1!=s[e+48>>2])break e;if(1==(0|n))break t;break e}if((0|t)==(0|r)){if(2==(0|(r=s[e+24>>2]))&&(s[e+24>>2]=n,r=n),1!=s[e+48>>2])break e;if(1==(0|r))break t;break e}s[e+36>>2]=s[e+36>>2]+1}o[e+54|0]=1}}function vt(e,t,r){t|=0,r|=0;var n,i=0;N=n=N-16|0,s[4+(e|=0)>>2]=t,t=s[t+64>>2],i=s[t>>2],t=s[t+4>>2],o[n+15|0]=0,He(e+24|0,(t-i>>2>>>0)/3|0,n+15|0),t=s[e+4>>2],i=s[t+56>>2],t=s[t+52>>2],o[n+14|0]=0,He(e+36|0,i-t>>2,n+14|0),t=s[r+12>>2],s[e+16>>2]=s[r+8>>2],s[e+20>>2]=t,t=s[r+4>>2],s[e+8>>2]=s[r>>2],s[e+12>>2]=t,N=n+16|0}function gt(e){s[e>>2]=0,s[e+4>>2]=0,s[e+28>>2]=0,s[e+32>>2]=0,o[e+24|0]=1,s[e+16>>2]=0,s[e+20>>2]=0,s[e+8>>2]=0,s[e+12>>2]=0,s[e+36>>2]=0,s[e+40>>2]=0,s[e+44>>2]=0,s[e+48>>2]=0,s[e+52>>2]=0,s[e+56>>2]=0,s[e+60>>2]=0,s[e+64>>2]=0,s[e+72>>2]=0,s[e+76>>2]=0,s[e+80>>2]=0,s[e+84>>2]=0,s[e+88>>2]=0,s[e+92>>2]=0,s[e+68>>2]=e}function At(e,t){var r,n,i,o=0,c=0;s[e+144>>2]=t,o=s[32+(0|vn[s[s[t>>2]+32>>2]](t))>>2],r=s[o>>2]+s[o+16>>2]|0,c=s[32+(0|vn[s[s[t>>2]+32>>2]](t))>>2],o=(o=s[c+8>>2])-(c=s[c+16>>2])|0,n=e,i=f[s[32+(0|vn[s[s[t>>2]+32>>2]](t))>>2]+38>>1],a[n+38>>1]=i,s[e>>2]=r,s[e+16>>2]=0,s[e+20>>2]=0,s[e+8>>2]=o,s[e+12>>2]=0}function _t(e){var t;s[e>>2]=0,s[e+4>>2]=0,s[e+56>>2]=0,s[e+48>>2]=0,s[e+52>>2]=0,s[e+40>>2]=0,s[e+44>>2]=0,s[e+32>>2]=0,s[e+36>>2]=0,s[e+24>>2]=0,s[e+28>>2]=0,s[e+16>>2]=0,s[e+20>>2]=0,s[e+8>>2]=0,s[e+12>>2]=0,s[(t=e- -64|0)>>2]=0,s[t+4>>2]=0,s[e+72>>2]=0,s[e+76>>2]=0,s[e+80>>2]=0,s[e+84>>2]=0,s[e+60>>2]=e}function xt(e,t,r){var n=0,i=0,o=0,a=0,c=0;e:if(!(e>>>0>5||(0|(n=o=s[r+20>>2]))>=(0|(a=s[r+12>>2]))&(i=s[r+16>>2])>>>0>=u[r+8>>2]|(0|n)>(0|a))){if(n=d[i+s[r>>2]|0],o=(i=i+1|0)?o:o+1|0,s[r+16>>2]=i,s[r+20>>2]=o,128&n){if(!xt(e+1|0,t,r))break e;n=127&n|s[t>>2]<<7}s[t>>2]=n,c=1}return c}function yt(e,t,r){var n=0,i=0,o=0,a=0,c=0;e:if(!(e>>>0>5||(0|(n=o=s[r+20>>2]))>=(0|(a=s[r+12>>2]))&(i=s[r+16>>2])>>>0>=u[r+8>>2]|(0|n)>(0|a))){if(n=d[i+s[r>>2]|0],o=(i=i+1|0)?o:o+1|0,s[r+16>>2]=i,s[r+20>>2]=o,128&n){if(!yt(e+1|0,t,r))break e;n=127&n|s[t>>2]<<7}s[t>>2]=n,c=1}return c}function kt(e,t,r){var n=0,i=0,o=0,a=0,c=0;e:if(!(e>>>0>5||(0|(n=o=s[r+20>>2]))>=(0|(a=s[r+12>>2]))&(i=s[r+16>>2])>>>0>=u[r+8>>2]|(0|n)>(0|a))){if(n=d[i+s[r>>2]|0],o=(i=i+1|0)?o:o+1|0,s[r+16>>2]=i,s[r+20>>2]=o,128&n){if(!kt(e+1|0,t,r))break e;n=127&n|s[t>>2]<<7}s[t>>2]=n,c=1}return c}function Tt(e,t,r){var n=0,i=0,o=0,a=0,c=0;e:if(!(e>>>0>5||(0|(n=o=s[r+20>>2]))>=(0|(a=s[r+12>>2]))&(i=s[r+16>>2])>>>0>=u[r+8>>2]|(0|n)>(0|a))){if(n=d[i+s[r>>2]|0],o=(i=i+1|0)?o:o+1|0,s[r+16>>2]=i,s[r+20>>2]=o,128&n){if(!Tt(e+1|0,t,r))break e;n=127&n|s[t>>2]<<7}s[t>>2]=n,c=1}return c}function wt(e,t,r){var n=0,i=0,o=0,a=0,c=0;e:if(!(e>>>0>5||(0|(n=o=s[r+20>>2]))>=(0|(a=s[r+12>>2]))&(i=s[r+16>>2])>>>0>=u[r+8>>2]|(0|n)>(0|a))){if(n=d[i+s[r>>2]|0],o=(i=i+1|0)?o:o+1|0,s[r+16>>2]=i,s[r+20>>2]=o,128&n){if(!wt(e+1|0,t,r))break e;n=127&n|s[t>>2]<<7}s[t>>2]=n,c=1}return c}function Ct(e,t,r){var n=0,i=0,o=0,a=0,c=0;e:if(!(e>>>0>5||(0|(n=o=s[r+20>>2]))>=(0|(a=s[r+12>>2]))&(i=s[r+16>>2])>>>0>=u[r+8>>2]|(0|n)>(0|a))){if(n=d[i+s[r>>2]|0],o=(i=i+1|0)?o:o+1|0,s[r+16>>2]=i,s[r+20>>2]=o,128&n){if(!Ct(e+1|0,t,r))break e;n=127&n|s[t>>2]<<7}s[t>>2]=n,c=1}return c}function Mt(e,t,r){var n=0,i=0;e:{t:{if(r>>>0>=4){if(3&(e|t))break t;for(;;){if(s[e>>2]!=s[t>>2])break t;if(t=t+4|0,e=e+4|0,!((r=r-4|0)>>>0>3))break}}if(!r)break e}for(;;){if((0|(n=d[0|e]))==(0|(i=d[0|t]))){if(t=t+1|0,e=e+1|0,r=r-1|0)continue;break e}break}return n-i|0}return 0}function It(e){var t=0,r=0,n=0;if(e){if(n=s[e+24>>2]){if((0|(r=s[e+28>>2]))==(0|n))t=n;else{for(;t=s[(r=r-4|0)>>2],s[r>>2]=0,t&&(rr(t+12|0,s[t+16>>2]),dr(t,s[t+4>>2]),ee(t)),(0|n)!=(0|r););t=s[e+24>>2]}s[e+28>>2]=n,ee(t)}rr(e+12|0,s[e+16>>2]),dr(e,s[e+4>>2]),ee(e)}}function St(e){var t=0,r=0,n=0;e:{if(3&(t=e))for(;;){if(!d[0|t])break e;if(!(3&(t=t+1|0)))break}for(;r=t,t=t+4|0,!((-1^(n=s[r>>2]))&n-16843009&-2139062144););if(!(255&n))return r-e|0;for(;n=d[r+1|0],r=t=r+1|0,n;);}return t-e|0}function Nt(e,t,r){e|=0,t|=0;var n,i,o,a,c=0,l=0;return(a=s[8+(r|=0)>>2])>>>0>(i=s[r+16>>2])>>>0&(0|(c=o=s[r+12>>2]))>=(0|(n=s[r+20>>2]))|(0|n)<(0|c)&&(t=d[i+s[r>>2]|0],c=(l=i+1|0)?n:n+1|0,s[r+16>>2]=l,s[r+20>>2]=c,s[e+4>>2]=t),i>>>0<a>>>0&(0|n)<=(0|o)|(0|n)<(0|o)}function Rt(e,t,r){var n=0;if(!r)return s[e+4>>2]==s[t+4>>2];if((0|e)==(0|t))return 1;n=s[e+4>>2],e=d[0|n],r=s[t+4>>2];e:if(!(!e|(0|(t=d[0|r]))!=(0|e)))for(;;){if(t=d[r+1|0],!(e=d[n+1|0]))break e;if(r=r+1|0,n=n+1|0,(0|e)!=(0|t))break}return(0|e)==(0|t)}function Et(e,t){var r=0,n=0,i=0,o=0;e:{if(r=s[e>>2],!(s[e+8>>2]-r>>2>>>0>=t>>>0)){if(t>>>0>=1073741824)break e;n=s[e+4>>2],i=(t=ur(i=t<<2))+i|0,o=(n=n-r|0)+t|0,(0|n)>0&&ye(t,r,n),s[e+8>>2]=i,s[e+4>>2]=o,s[e>>2]=t,r&&ee(r)}return}qt(1326),T()}function Pt(e){var t=0;e&&((t=s[e+76>>2])&&(s[e+80>>2]=t,ee(t)),(t=s[e- -64>>2])&&(s[e+68>>2]=t,ee(t)),(t=s[e+48>>2])&&(s[e+52>>2]=t,ee(t)),(t=s[e+24>>2])&&(s[e+28>>2]=t,ee(t)),(t=s[e+12>>2])&&(s[e+16>>2]=t,ee(t)),(t=s[e>>2])&&(s[e+4>>2]=t,ee(t)),ee(e))}function Bt(e){var t=0;(t=s[e+84>>2])&&(s[e+88>>2]=t,ee(t)),(t=s[e+72>>2])&&(s[e+76>>2]=t,ee(t)),(t=s[e+52>>2])&&(s[e+56>>2]=t,ee(t)),(t=s[e+40>>2])&&(s[e+44>>2]=t,ee(t)),(t=s[e+28>>2])&&(s[e+32>>2]=t,ee(t)),(t=s[e+12>>2])&&ee(t),(e=s[e>>2])&&ee(e)}function Dt(e){var t,r=0,n=0;if((0|(r=s[e+4>>2]))!=(0|(t=s[e>>2])))for(;(n=s[r-12>>2])&&(s[r-8>>2]=n,ee(n)),(n=s[r-28>>2])&&(s[r-24>>2]=n,ee(n)),(n=s[r-40>>2])&&(s[r-36>>2]=n,ee(n)),Bt(r-140|0),(0|t)!=(0|(r=r-144|0)););s[e+4>>2]=t}function Ot(e,t,r){var n=0,i=0;e:{if(r>>>0<=10)o[(n=e)+11|0]=r;else{if(r>>>0>4294967279)break e;n=r>>>0>=11?11==(0|(n=(i=r+16&-16)-1|0))?i:n:10,n=ur(i=n+1|0),s[e>>2]=n,s[e+8>>2]=-2147483648|i,s[e+4>>2]=r}return void qr(n,t,r+1|0)}an(),T()}function zt(e,t,r){var n,i,o=0,a=0,c=0;for(N=n=(N=i=N-16|0)-16|0,t=t-e>>2;t;)s[n+12>>2]=e,o=t>>>1|0,s[n+12>>2]=s[n+12>>2]+(o<<2),c=(-1^o)+t|0,t=o,o=s[n+12>>2],t=(a=u[o>>2]<u[r>>2])?c:t,e=a?o+4|0:e;return N=n+16|0,N=i+16|0,e}function Ft(e,t){var r,n;return n=ur(40),s[n>>2]=-1,s[16+(r=n+8|0)>>2]=0,s[r+20>>2]=0,s[r+8>>2]=0,s[r>>2]=0,s[r+4>>2]=0,s[r+24>>2]=0,s[r+28>>2]=0,vn[s[s[e>>2]+16>>2]](e,n),e=s[t+88>>2],s[t+88>>2]=n,e&&((t=s[e+8>>2])&&(s[e+12>>2]=t,ee(t)),ee(e)),1}function Gt(e){var t,r,n=0,i=0,o=0;return o=d[e+12|0],(i=s[e+8>>2])>>>0>4095||(0|(n=s[e+4>>2]))<=0||(n=n-1|0,s[e+4>>2]=n,i=d[n+s[e>>2]|0]|i<<8),n=h(o=0-o&255,i>>>8|0),r=(t=255&i)>>>0<o>>>0,s[e+8>>2]=r?n+t|0:i-(n+o|0)|0,r}function Ut(e,t){return s[e+4>>2]=0,s[e+8>>2]=0,s[e>>2]=1804,s[e+12>>2]=0,s[e+16>>2]=0,s[e+20>>2]=0,s[e+24>>2]=0,s[e+28>>2]=0,s[e+32>>2]=0,s[e+36>>2]=0,s[e+40>>2]=0,s[e>>2]=2044,s[e+44>>2]=0,s[e+48>>2]=0,s[e+52>>2]=0,s[e+56>>2]=0,s[e+60>>2]=t,e}function Vt(e,t,r,n){if(t){if((0|n)<0)return 0;!n&s[e+4>>2]-s[e>>2]>>>0>=r>>>0||ft(e,r),r&&Ue(s[e>>2],t,r)}else{if((0|n)<0)return 0;ft(e,r)}return t=s[e+28>>2],t=(r=s[e+24>>2]+1|0)?t:t+1|0,s[e+24>>2]=r,s[e+28>>2]=t,1}function Lt(e){var t=0,r=0;(e|=0)&&(t=s[e+88>>2],s[e+88>>2]=0,t&&((r=s[t+8>>2])&&(s[t+12>>2]=r,ee(r)),ee(t)),(t=s[e+68>>2])&&(s[e+72>>2]=t,ee(t)),t=s[e+64>>2],s[e+64>>2]=0,t&&((r=s[t>>2])&&(s[t+4>>2]=r,ee(r)),ee(t)),ee(e))}function jt(e,t){var r,n=0,i=0;if((r=St(t))>>>0<4294967280){e:{if(r>>>0>=11)n=ur(i=r+16&-16),s[e+8>>2]=-2147483648|i,s[e>>2]=n,s[e+4>>2]=r;else if(o[e+11|0]=r,n=e,!r)break e;ye(n,t,r)}return o[r+n|0]=0,e}an(),T()}function Wt(e,t,r,n){var i,o=0,a=0;return i=(a=t^n)>>31,a>>=31,e=Te((e^=o=t>>31)-o|0,o=(t^o)-((e>>>0<o>>>0)+o|0)|0,(t=r^(e=n>>31))-e|0,(e^n)-((e>>>0>t>>>0)+e|0)|0)^a,R=(i^R)-((e>>>0<a>>>0)+i|0)|0,t=e-a|0}function Zt(e,t,r){var n,i=0;N=n=N-16|0,(i=2147483647&s[e+8>>2])>>>0>r>>>0?(i=s[e>>2],s[e+4>>2]=r,qr(i,t,r),o[n+15|0]=0,o[r+i|0]=d[n+15|0]):it(e,i-1|0,1+(r-i|0)|0,e=s[e+4>>2],e,r,t),N=n+16|0}function Ht(e,t,r,n){var i,o,a,s,c=0,l=0;return s=h(c=r>>>16|0,l=e>>>16|0),c=(65535&(l=((a=h(i=65535&r,o=65535&e))>>>16|0)+h(l,i)|0))+h(c,o)|0,R=(h(t,r)+s|0)+h(e,n)+(l>>>16)+(c>>>16)|0,65535&a|c<<16}function Yt(e,t,r){var n;if(!(n=s[e+16>>2]))return s[e+36>>2]=1,s[e+24>>2]=r,void(s[e+16>>2]=t);e:{if((0|t)==(0|n)){if(2!=s[e+24>>2])break e;return void(s[e+24>>2]=r)}o[e+54|0]=1,s[e+24>>2]=2,s[e+36>>2]=s[e+36>>2]+1}}function qt(e){var t,r,n,i,o;t=0|S(8),s[t>>2]=11024,s[t>>2]=11068,n=ur((r=St(e))+13|0),s[n+8>>2]=0,s[n+4>>2]=r,s[n>>2]=r,i=t,o=ye(n+12|0,e,r+1|0),s[i+4>>2]=o,s[t>>2]=11116,I(0|t,11148,13),T()}function Qt(e,t,r){var n=0;return(0|(n=e+4|0))==(0|(e=$e(e,t)))?0:((0|(t=s[e+32>>2]))!=(0|(n=s[e+28>>2]))&&(Se(r,t-n|0),ye(fr(r),r=s[e+28>>2],s[e+32>>2]-r|0)),(0|t)!=(0|n))}function Xt(e,t){var r,n=0;if(r=s[e+8>>2],e=s[e+12>>2]-r|0)for(n=(e>>=2)>>>0>1?e:1,e=0;;){if(s[s[(e<<2)+r>>2]+60>>2]==(0|t))return e;if((0|n)==(0|(e=e+1|0)))break}return-1}function Jt(e){return s[e+8>>2]=0,s[e+12>>2]=0,s[e>>2]=0,s[e+40>>2]=0,s[e+44>>2]=0,s[e+28>>2]=9,o[e+24|0]=1,s[e+56>>2]=-1,s[e+60>>2]=0,s[e+16>>2]=0,s[e+20>>2]=0,s[e+48>>2]=0,s[e+52>>2]=0,e}function Kt(e){s[e+40>>2]=0,s[e+4>>2]=0,s[e+8>>2]=0,s[e>>2]=10064,s[e+12>>2]=0,s[e+16>>2]=0,s[e+20>>2]=0,s[e+24>>2]=0,s[e+28>>2]=0,s[e+32>>2]=0,a[e+36>>1]=0,s[e+44>>2]=0,s[e>>2]=8108}function $t(e,t,r){var n=0;return t&&(t=0,!function e(t,r,n){var i=0,a=0,c=0,l=0;e:if(!(t>>>0>10||(0|(i=s[n+20>>2]))>=(0|(a=s[n+12>>2]))&(c=s[n+16>>2])>>>0>=u[n+8>>2]|(0|i)>(0|a))){if(a=o[c+s[n>>2]|0],i=(c=c+1|0)?i:i+1|0,s[n+16>>2]=c,s[n+20>>2]=i,(0|a)<0){if(!e(t+1|0,r,n))break e;n=s[r>>2],t=s[r+4>>2]<<7|n>>>25,n=127&a|n<<7}else t=0,n=255&a;s[r>>2]=n,s[r+4>>2]=t,l=1}return l}(1,r,e))||(o[e+36|0]=1,s[e+32>>2]=0,r=(t=s[e+16>>2])+s[e>>2]|0,s[e+24>>2]=r,n=e,e=s[e+8>>2],s[n+28>>2]=r+(e-t|0),t=1),t}function er(e){var t,r;return(e=(t=s[2853])+(r=e+3&-4)|0)>>>0<=t>>>0&&r||e>>>0>gn()<<16>>>0&&!(0|M(0|e))?(s[2879]=48,-1):(s[2853]=e,t)}function tr(e,t,r){var n;N=n=N-16|0,r>>>0<=10?(o[e+11|0]=r,qr(e,t,r),o[n+15|0]=0,o[e+r|0]=d[n+15|0]):it(e,10,r-10|0,e=d[e+11|0],e,r,t),N=n+16|0}function rr(e,t){t&&(rr(e,s[t>>2]),rr(e,s[t+4>>2]),e=s[t+28>>2],s[t+28>>2]=0,e&&(rr(e+12|0,s[e+16>>2]),dr(e,s[e+4>>2]),ee(e)),o[t+27|0]<0&&ee(s[t+16>>2]),ee(t))}function nr(e){var t=0;return!s[(e|=0)- -64>>2]|!s[e+68>>2]|!s[e+44>>2]|!s[e+48>>2]||!s[e+52>>2]|!s[e+56>>2]||(t=-1!=s[e+92>>2]),0|t}function ir(e){var t=0;return s[(e|=0)>>2]=2164,t=s[e+20>>2],s[e+20>>2]=0,t&&vn[s[s[t>>2]+4>>2]](t),s[e>>2]=1948,t=s[e+16>>2],s[e+16>>2]=0,t&&Lt(t),0|e}function or(e){var t=0;return!s[48+(e|=0)>>2]|!s[e+52>>2]|!s[e+28>>2]|!s[e+32>>2]||!s[e+36>>2]|!s[e+40>>2]||(t=-1!=s[e+76>>2]),0|t}function ar(e){var t=0;return s[(e|=0)>>2]=8652,(t=s[e+48>>2])&&(s[e+52>>2]=t,ee(t)),s[e>>2]=8904,(t=s[e+36>>2])&&ee(t),(t=s[e+24>>2])&&ee(t),0|e}function sr(e){var t=0;s[(e|=0)>>2]=2164,t=s[e+20>>2],s[e+20>>2]=0,t&&vn[s[s[t>>2]+4>>2]](t),s[e>>2]=1948,t=s[e+16>>2],s[e+16>>2]=0,t&&Lt(t),ee(e)}function cr(e,t){var r=0;return r=-1,-1==(0|t)|(0|t)>4||(t=h(t,12)+e|0,e=s[t+20>>2],(s[t+24>>2]-e|0)<=0||(r=s[e>>2])),r}function lr(e,t,r,n,i,a,c){s[e>>2]=0,s[e+56>>2]=t,s[e+48>>2]=0,s[e+52>>2]=0,s[e+40>>2]=a,s[e+44>>2]=c,o[e+32|0]=i,s[e+28>>2]=n,o[e+24|0]=r}function dr(e,t){t&&(dr(e,s[t>>2]),dr(e,s[t+4>>2]),(e=s[t+28>>2])&&(s[t+32>>2]=e,ee(e)),o[t+27|0]<0&&ee(s[t+16>>2]),ee(t))}function fr(e){return(d[e+11|0]>>>7|0?s[e+4>>2]:d[e+11|0])||(hn(),T()),d[e+11|0]>>>7|0&&(e=s[e>>2]),e}function ur(e){var t=0;e=e||1;e:{for(;;){if(t=P(e))break e;if(!(t=s[2880]))break;vn[0|t]()}w(),T()}return t}function pr(e,t){t&&(pr(e,s[t>>2]),pr(e,s[t+4>>2]),o[t+39|0]<0&&ee(s[t+28>>2]),o[t+27|0]<0&&ee(s[t+16>>2]),ee(t))}function mr(e){var t,r;return s[(e|=0)>>2]=11068,t=s[e+4>>2]-12|0,r=s[t+8>>2]-1|0,s[t+8>>2]=r,(0|r)<0&&ee(t),0|e}function hr(e,t){e|=0;var r=0;e:switch(0|(t|=0)){case 1:t=1;case 0:s[e+28>>2]=t,r=1}return 0|r}function br(e,t,r){return t|=0,r|=0,s[4+(e|=0)>>2]=t,t=s[s[s[t+4>>2]+8>>2]+(r<<2)>>2],s[e+12>>2]=r,s[e+8>>2]=t,1}function vr(e){var t=0;return!s[60+(e|=0)>>2]|!s[e+44>>2]|!s[e+48>>2]|!s[e+52>>2]||(t=0!=s[e+56>>2]),0|t}function gr(e,t){var r,n;ft(e,t),r=t=s[e+28>>2],n=t+1|0,t=s[e+24>>2]+1|0,s[e+24>>2]=t,s[e+28>>2]=t?r:n}function Ar(e){var t=0;return!s[52+(e|=0)>>2]|!s[e+44>>2]|!s[e+48>>2]||(t=0!=s[e+56>>2]),0|t}function _r(e,t){e|=0;var r=0;return s[56+(t|=0)>>2]|!t|3!=d[t+24|0]||(s[e+60>>2]=t,r=1),0|r}function xr(e,t){e|=0;var r=0;return s[56+(t|=0)>>2]|3!=d[t+24|0]||(s[e- -64>>2]=t,r=1),0|r}function yr(e,t){e|=0;var r=0;return s[56+(t|=0)>>2]|3!=d[t+24|0]||(s[e+48>>2]=t,r=1),0|r}function kr(e){var t;s[(e|=0)>>2]=2988,(t=s[e+32>>2])&&(s[e+36>>2]=t,ee(t)),ee(e)}function Tr(e){for(var t=0;e;)e&=e-1,t=t+1|0;return t}function wr(){var e;return e=ur(12),s[e>>2]=0,s[e+4>>2]=0,s[e+8>>2]=0,0|e}function Cr(e){var t=0;(e|=0)&&((t=s[e>>2])&&(s[e+4>>2]=t,ee(t)),ee(e))}function Mr(e){var t;return(-1>>>(t=31&e)&-2)<<t|(-1<<(e=0-e&31)&-2)>>>e}function Ir(e,t){return t|=0,0|vn[s[s[(e|=0)>>2]+12>>2]](e,t)}function Sr(e,t){return t|=0,s[s[(e|=0)>>2]+(t<<2)>>2]}function Nr(e,t,r){return 0|ae(e|=0,t|=0,r|=0)}function Rr(e){return e?31-g(e-1^e)|0:32}function Er(e){return s[e>>2]=10332,We(e+4|0,0,80),e}function Pr(e){return s[12+(e|=0)>>2]-s[e+8>>2]>>2}function Br(e){(e|=0)&&vn[s[s[e>>2]+4>>2]](e)}function Dr(e,t){return t|=0,s[4+(e|=0)>>2]=t,1}function Or(e){return s[4+(e|=0)>>2]-s[e>>2]>>1}function zr(e){return s[4+(e|=0)>>2]-s[e>>2]>>2}function Fr(e){return s[4+(e|=0)>>2]-s[e>>2]|0}function Gr(e){return s[28+(e|=0)>>2]}function Ur(e){return s[80+(e|=0)>>2]}function Vr(e,t){return 1}function Lr(e,t){return-1}function jr(e){return s[8+(e|=0)>>2]}function Wr(e){return s[4+(e|=0)>>2]}function Zr(e,t){return 6}function Hr(e,t){return 0}function Yr(e){return s[(e|=0)>>2]}function qr(e,t,r){r&&ye(e,t,r)}function Qr(e){(e|=0)&&ee(e)}function Xr(e){return 0|(e|=0)}function Jr(e){return 1}function Kr(e){return 4}function $r(e){return 5}function en(e){return 0}function tn(e){return 2}function rn(e){return 6}function nn(){qt(1266),T()}function on(e){ee(e|=0)}function an(){qt(1313),T()}function sn(e){T()}function cn(){return-1}function ln(){return 1}function dn(){hn(),T()}function fn(){return 0}function un(){return 3}function pn(){return 4}function mn(){return 2}function hn(){w(),T()}function bn(e){}i(t=d,1028,"YAQAAAEAAAACAAAAAwAAAAQAAAAFAAAABgAAAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAE41ZHJhY28yOEF0dHJpYnV0ZU9jdGFoZWRyb25UcmFuc2Zvcm1FAABALAAAOAQAAPwGAAAAAAAA0AQAAA4AAAAPAAAAEAAAABEAAAASAAAAEwAAABQAAAAVAAAAFgAAAAoAAAAXAAAAGAAAAE41ZHJhY28zMEF0dHJpYnV0ZVF1YW50aXphdGlvblRyYW5zZm9ybUUAAAAAQCwAAKQEAAD8BgAAX19uZXh0X3ByaW1lIG92ZXJmbG93AHZlY3RvcgBzdGQ6OmV4Y2VwdGlvbgBza2lwX2F0dHJpYnV0ZV90cmFuc2Zvcm0AYmFzaWNfc3RyaW5nAGFsbG9jYXRvcjxUPjo6YWxsb2NhdGUoc2l6ZV90IG4pICduJyBleGNlZWRzIG1heGltdW0gc3VwcG9ydGVkIHNpemUARFJBQ08AVXNpbmcgaW5jb21wYXRpYmxlIGRlY29kZXIgZm9yIHRoZSBpbnB1dCBnZW9tZXRyeS4ARmFpbGVkIHRvIGRlY29kZSBwb2ludCBhdHRyaWJ1dGVzLgBGYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZGVjb2Rlci4AVW5zdXBwb3J0ZWQgbWlub3IgdmVyc2lvbi4AVW5zdXBwb3J0ZWQgbWFqb3IgdmVyc2lvbi4ASW5wdXQgaXMgbm90IGEgbWVzaC4AVW5zdXBwb3J0ZWQgZ2VvbWV0cnkgdHlwZS4ATm90IGEgRHJhY28gZmlsZS4AVW5zdXBwb3J0ZWQgZW5jb2RpbmcgbWV0aG9kLgBGYWlsZWQgdG8gZGVjb2RlIG1ldGFkYXRhLgBGYWlsZWQgdG8gZGVjb2RlIGdlb21ldHJ5IGRhdGEuAFB1cmUgdmlydHVhbCBmdW5jdGlvbiBjYWxsZWQhAE41ZHJhY28xOEF0dHJpYnV0ZVRyYW5zZm9ybUUAABgsAADeBgAAAAAAAIgHAAAZAAAAGgAAABsAAAAcAAAAHQAAAB4AAAAfAAAAIAAAACEAAAAiAAAAIwAAACQAAABONWRyYWNvMTdBdHRyaWJ1dGVzRGVjb2RlckUATjVkcmFjbzI2QXR0cmlidXRlc0RlY29kZXJJbnRlcmZhY2VFAAAAABgsAABYBwAAQCwAADwHAACABwAAAAAAAOgHAAAlAAAAJgAAACcAAAAoAAAAKQAAACoAAAArAAAALAAAAC0AAABONWRyYWNvMjZTZXF1ZW50aWFsQXR0cmlidXRlRGVjb2RlckUAAAAAGCwAAMAHAAD/////AAAAAGAIAAAuAAAALwAAABsAAAAwAAAAMQAAAB4AAAAfAAAAIAAAADIAAAAzAAAANAAAADUAAAA2AAAATjVkcmFjbzM3U2VxdWVudGlhbEF0dHJpYnV0ZURlY29kZXJzQ29udHJvbGxlckUAQCwAADAIAACIBwAAAAAAANQIAAA3AAAAOAAAADkAAAAoAAAAKQAAACoAAAA6AAAALAAAADsAAAA8AAAAPQAAAD4AAAA/AAAATjVkcmFjbzMzU2VxdWVudGlhbEludGVnZXJBdHRyaWJ1dGVEZWNvZGVyRQBALAAAqAgAAOgHAAAAAAAAYAsAAEAAAABBAAAAQgAAAEMAAABEAAAARQAAAEYAAABHAAAASAAAAEkAAABKAAAASwAAAE41ZHJhY280ME1lc2hQcmVkaWN0aW9uU2NoZW1lUGFyYWxsZWxvZ3JhbURlY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBEZWNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvMjdNZXNoUHJlZGljdGlvblNjaGVtZURlY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBEZWNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvMjNQcmVkaWN0aW9uU2NoZW1lRGVjb2RlcklpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcERlY29kaW5nVHJhbnNmb3JtSWlpRUVFRQBONWRyYWNvMzdQcmVkaWN0aW9uU2NoZW1lVHlwZWREZWNvZGVySW50ZXJmYWNlSWlpRUUATjVkcmFjbzMyUHJlZGljdGlvblNjaGVtZURlY29kZXJJbnRlcmZhY2VFAE41ZHJhY28yNVByZWRpY3Rpb25TY2hlbWVJbnRlcmZhY2VFABgsAAAECwAAQCwAANkKAAAoCwAAQCwAAKUKAAAwCwAAQCwAAFEKAAA8CwAAQCwAALsJAABICwAAQCwAABgJAABUCwAAAAAAAFQLAABAAAAATAAAACIAAABDAAAAIgAAAEUAAABGAAAARwAAAEgAAABJAAAASgAAACIAAAAAAAAASAsAAEAAAABNAAAAIgAAAEMAAAAiAAAARQAAAEYAAABHAAAASAAAAEkAAABKAAAAIgAAAAAAAADIDAAATgAAAE8AAABQAAAAQwAAAFEAAABFAAAARgAAAEcAAABIAAAASQAAAFIAAABTAAAATjVkcmFjbzU2TWVzaFByZWRpY3Rpb25TY2hlbWVDb25zdHJhaW5lZE11bHRpUGFyYWxsZWxvZ3JhbURlY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBEZWNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQAAQCwAABQMAABUCwAAAAAAALQNAABUAAAAVQAAAFYAAABDAAAAVwAAAFgAAABZAAAAWgAAAEgAAABJAAAAWwAAAFwAAABONWRyYWNvNDRNZXNoUHJlZGljdGlvblNjaGVtZVRleENvb3Jkc1BvcnRhYmxlRGVjb2RlcklpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcERlY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAABALAAADA0AAFQLAAAAAAAAoA4AAF0AAABeAAAAXwAAAEMAAABgAAAAYQAAAGIAAABjAAAASAAAAEkAAABkAAAAZQAAAE41ZHJhY280Mk1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsRGVjb2RlcklpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcERlY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAAAAAEAsAAD4DQAAVAsAAAAAAAAoEAAAZgAAAGcAAABoAAAAaQAAAGoAAABONWRyYWNvNDhNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbFByZWRpY3RvckFyZWFJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBEZWNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNDhNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbFByZWRpY3RvckJhc2VJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBEZWNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQAAABgsAABzDwAAQCwAAMgOAAAgEAAAAAAAACAQAABmAAAAawAAACIAAABpAAAAIgAAAAAAAAC0EQAAQAAAAGwAAABtAAAAQwAAAG4AAABFAAAARgAAAEcAAABIAAAASQAAAEoAAABvAAAATjVkcmFjbzQwTWVzaFByZWRpY3Rpb25TY2hlbWVQYXJhbGxlbG9ncmFtRGVjb2RlcklpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcERlY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzI3TWVzaFByZWRpY3Rpb25TY2hlbWVEZWNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRGVjb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQAAQCwAAB4RAABICwAAQCwAAIgQAACoEQAAAAAAAKgRAABAAAAAcAAAACIAAABDAAAAIgAAAEUAAABGAAAARwAAAEgAAABJAAAASgAAACIAAAAAAAAA2BIAAHEAAAByAAAAcwAAAEMAAAB0AAAARQAAAEYAAABHAAAASAAAAEkAAAB1AAAAdgAAAE41ZHJhY281Nk1lc2hQcmVkaWN0aW9uU2NoZW1lQ29uc3RyYWluZWRNdWx0aVBhcmFsbGVsb2dyYW1EZWNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRGVjb2RpbmdUcmFuc2Zvcm1JaWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQAAAEAsAAAwEgAAqBEAAAAAAAC4EwAAdwAAAHgAAAB5AAAAQwAAAHoAAAB7AAAAfAAAAH0AAABIAAAASQAAAH4AAAB/AAAATjVkcmFjbzQ0TWVzaFByZWRpY3Rpb25TY2hlbWVUZXhDb29yZHNQb3J0YWJsZURlY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBEZWNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAAAAQCwAABwTAACoEQAAAAAAAJQUAACAAAAAgQAAAIIAAABDAAAAgwAAAIQAAACFAAAAhgAAAEgAAABJAAAAhwAAAIgAAABONWRyYWNvNDJNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbERlY29kZXJJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBEZWNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAEAsAAD8EwAAqBEAAAAAAAAAFgAAiQAAAIoAAACLAAAAjAAAAI0AAABONWRyYWNvNDhNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbFByZWRpY3RvckFyZWFJaU5TXzM3UHJlZGljdGlvblNjaGVtZVdyYXBEZWNvZGluZ1RyYW5zZm9ybUlpaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280OE1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsUHJlZGljdG9yQmFzZUlpTlNfMzdQcmVkaWN0aW9uU2NoZW1lV3JhcERlY29kaW5nVHJhbnNmb3JtSWlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUAGCwAAFoVAABALAAAvBQAAPgVAAAAAAAA+BUAAIkAAACOAAAAIgAAAIwAAAAiAAAAAAAAALwWAABAAAAAjwAAAJAAAABDAAAAkQAAAEUAAABGAAAARwAAAEgAAABJAAAASgAAAJIAAABONWRyYWNvMjhQcmVkaWN0aW9uU2NoZW1lRGVsdGFEZWNvZGVySWlOU18zN1ByZWRpY3Rpb25TY2hlbWVXcmFwRGVjb2RpbmdUcmFuc2Zvcm1JaWlFRUVFAAAAAEAsAABgFgAASAsAAAAAAAAwFwAAkwAAAJQAAACVAAAAKAAAACkAAACWAAAAOgAAACwAAAA7AAAAlwAAAJgAAACZAAAAmgAAAE41ZHJhY28zMlNlcXVlbnRpYWxOb3JtYWxBdHRyaWJ1dGVEZWNvZGVyRQAAQCwAAAQXAADUCAAAAAAAAGQZAACbAAAAnAAAAJ0AAACeAAAAnwAAAKAAAAChAAAAogAAAKMAAACkAAAApQAAAKYAAABONWRyYWNvNDJNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbERlY29kZXJJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRGVjb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvMjdNZXNoUHJlZGljdGlvblNjaGVtZURlY29kZXJJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRGVjb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvMjNQcmVkaWN0aW9uU2NoZW1lRGVjb2RlcklpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWREZWNvZGluZ1RyYW5zZm9ybUlpRUVFRQAAQCwAAN8YAAA8CwAAQCwAADEYAABMGQAAQCwAAHQXAABYGQAAAAAAABwbAACnAAAAqAAAAKkAAACqAAAAqwAAAE41ZHJhY280OE1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsUHJlZGljdG9yQXJlYUlpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWREZWNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAE41ZHJhY280OE1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsUHJlZGljdG9yQmFzZUlpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWREZWNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVFRUVFAAAAGCwAAE8aAABALAAAjBkAABQbAAAAAAAAwBwAAKwAAACtAAAArgAAAJ4AAACvAAAAsAAAALEAAACyAAAAowAAAKQAAACzAAAAtAAAAE41ZHJhY280Mk1lc2hQcmVkaWN0aW9uU2NoZW1lR2VvbWV0cmljTm9ybWFsRGVjb2RlcklpTlNfNjJQcmVkaWN0aW9uU2NoZW1lTm9ybWFsT2N0YWhlZHJvbkNhbm9uaWNhbGl6ZWREZWNvZGluZ1RyYW5zZm9ybUlpRUVOU18yNE1lc2hQcmVkaWN0aW9uU2NoZW1lRGF0YUlOU18xMUNvcm5lclRhYmxlRUVFRUUATjVkcmFjbzI3TWVzaFByZWRpY3Rpb25TY2hlbWVEZWNvZGVySWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZERlY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQAAAABALAAAEBwAAEwZAABALAAAYBsAALQcAAAAAAAAXB4AALUAAAC2AAAAtwAAALgAAAC5AAAATjVkcmFjbzQ4TWVzaFByZWRpY3Rpb25TY2hlbWVHZW9tZXRyaWNOb3JtYWxQcmVkaWN0b3JBcmVhSWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZERlY29kaW5nVHJhbnNmb3JtSWlFRU5TXzI0TWVzaFByZWRpY3Rpb25TY2hlbWVEYXRhSU5TXzExQ29ybmVyVGFibGVFRUVFRQBONWRyYWNvNDhNZXNoUHJlZGljdGlvblNjaGVtZUdlb21ldHJpY05vcm1hbFByZWRpY3RvckJhc2VJaU5TXzYyUHJlZGljdGlvblNjaGVtZU5vcm1hbE9jdGFoZWRyb25DYW5vbmljYWxpemVkRGVjb2RpbmdUcmFuc2Zvcm1JaUVFTlNfMjRNZXNoUHJlZGljdGlvblNjaGVtZURhdGFJTlNfMTFDb3JuZXJUYWJsZUVFRUVFABgsAACeHQAAQCwAAOgcAABUHgAAAAAAABQfAAC6AAAAuwAAALwAAACeAAAAvQAAAL4AAAC/AAAAwAAAAKMAAACkAAAAwQAAAMIAAABONWRyYWNvMjhQcmVkaWN0aW9uU2NoZW1lRGVsdGFEZWNvZGVySWlOU182MlByZWRpY3Rpb25TY2hlbWVOb3JtYWxPY3RhaGVkcm9uQ2Fub25pY2FsaXplZERlY29kaW5nVHJhbnNmb3JtSWlFRUVFAAAAAEAsAACgHgAATBkAAAAAAACYHwAAwwAAAMQAAADFAAAAKAAAACkAAADGAAAAOgAAACwAAAA7AAAAxwAAAD0AAAA+AAAAyAAAAMkAAADKAAAATjVkcmFjbzM4U2VxdWVudGlhbFF1YW50aXphdGlvbkF0dHJpYnV0ZURlY29kZXJFAAAAAEAsAABkHwAA1AgAAAAAAAD4HwAAywAAAMwAAADNAAAAzgAAACIAAADPAAAA0AAAANEAAADSAAAA0wAAANQAAADVAAAAIgAAAE41ZHJhY28xMU1lc2hEZWNvZGVyRQAAAEAsAADgHwAAvCcAAAAAAABkIAAA1gAAANcAAADNAAAA2AAAANkAAADPAAAA0AAAANEAAADaAAAA2wAAANwAAADdAAAA3gAAAE41ZHJhY28yMk1lc2hFZGdlYnJlYWtlckRlY29kZXJFAAAAAEAsAABAIAAA+B8AAAAAAABYIQAA3wAAAOAAAADhAAAA4gAAAOMAAADkAAAA5QAAAOYAAADnAAAA6AAAAP////8AAAAAuCEAAOkAAADqAAAA6wAAAOwAAADtAAAA7gAAAO8AAADwAAAA8QAAAPIAAABONWRyYWNvMjZNZXNoRWRnZWJyZWFrZXJEZWNvZGVySW1wbElOU18zMU1lc2hFZGdlYnJlYWtlclRyYXZlcnNhbERlY29kZXJFRUUATjVkcmFjbzM1TWVzaEVkZ2VicmVha2VyRGVjb2RlckltcGxJbnRlcmZhY2VFAAAAGCwAACAhAABALAAA1CAAAFAhAABONWRyYWNvMjZNZXNoRWRnZWJyZWFrZXJEZWNvZGVySW1wbElOU18zOE1lc2hFZGdlYnJlYWtlclRyYXZlcnNhbFZhbGVuY2VEZWNvZGVyRUVFAABALAAAZCEAAFAhAAAAAAAAtCIAAPMAAAD0AAAA9QAAAE41ZHJhY28xOURlcHRoRmlyc3RUcmF2ZXJzZXJJTlNfMjRNZXNoQXR0cmlidXRlQ29ybmVyVGFibGVFTlNfMzZNZXNoQXR0cmlidXRlSW5kaWNlc0VuY29kaW5nT2JzZXJ2ZXJJUzFfRUVFRQBONWRyYWNvMTNUcmF2ZXJzZXJCYXNlSU5TXzI0TWVzaEF0dHJpYnV0ZUNvcm5lclRhYmxlRU5TXzM2TWVzaEF0dHJpYnV0ZUluZGljZXNFbmNvZGluZ09ic2VydmVySVMxX0VFRUUAGCwAAEUiAABALAAA2CEAAKwiAAAAAAAArCIAAPYAAAD3AAAA9Q=="),i(t,8932,"AQAAAAMAAAAFAAAABwAAAAAAAAC4IwAA+AAAAPkAAAD6AAAA+wAAAE41ZHJhY28yMk1lc2hUcmF2ZXJzYWxTZXF1ZW5jZXJJTlNfMjhNYXhQcmVkaWN0aW9uRGVncmVlVHJhdmVyc2VySU5TXzExQ29ybmVyVGFibGVFTlNfMzZNZXNoQXR0cmlidXRlSW5kaWNlc0VuY29kaW5nT2JzZXJ2ZXJJUzJfRUVFRUVFAE41ZHJhY28xNVBvaW50c1NlcXVlbmNlckUAAAAAGCwAAJMjAABALAAADCMAALAjAAD/////AAAAAKgkAAD8AAAA/QAAAP4AAABONWRyYWNvMjhNYXhQcmVkaWN0aW9uRGVncmVlVHJhdmVyc2VySU5TXzExQ29ybmVyVGFibGVFTlNfMzZNZXNoQXR0cmlidXRlSW5kaWNlc0VuY29kaW5nT2JzZXJ2ZXJJUzFfRUVFRQBONWRyYWNvMTNUcmF2ZXJzZXJCYXNlSU5TXzExQ29ybmVyVGFibGVFTlNfMzZNZXNoQXR0cmlidXRlSW5kaWNlc0VuY29kaW5nT2JzZXJ2ZXJJUzFfRUVFRQAAGCwAAEUkAABALAAA3CMAAKAkAAAAAAAAoCQAAP8AAAAAAQAA/gAAAAAAAABgJQAAAQEAAAIBAAADAQAABAEAAE41ZHJhY28yMk1lc2hUcmF2ZXJzYWxTZXF1ZW5jZXJJTlNfMTlEZXB0aEZpcnN0VHJhdmVyc2VySU5TXzExQ29ybmVyVGFibGVFTlNfMzZNZXNoQXR0cmlidXRlSW5kaWNlc0VuY29kaW5nT2JzZXJ2ZXJJUzJfRUVFRUVFAAAAQCwAAOAkAACwIwAAAAAAAOAlAAAFAQAABgEAAP4AAABONWRyYWNvMTlEZXB0aEZpcnN0VHJhdmVyc2VySU5TXzExQ29ybmVyVGFibGVFTlNfMzZNZXNoQXR0cmlidXRlSW5kaWNlc0VuY29kaW5nT2JzZXJ2ZXJJUzFfRUVFRQBALAAAgCUAAKAkAAAAAAAAkCYAAAcBAAAIAQAACQEAAAoBAABONWRyYWNvMjJNZXNoVHJhdmVyc2FsU2VxdWVuY2VySU5TXzE5RGVwdGhGaXJzdFRyYXZlcnNlcklOU18yNE1lc2hBdHRyaWJ1dGVDb3JuZXJUYWJsZUVOU18zNk1lc2hBdHRyaWJ1dGVJbmRpY2VzRW5jb2RpbmdPYnNlcnZlcklTMl9FRUVFRUUAAEAsAAAEJgAAsCM="),i(t,9892,"/CYAAMsAAAALAQAAzQAAAM4AAAAMAQAAzwAAANAAAADRAAAA0gAAANMAAADUAAAA1QAAAA0BAABONWRyYWNvMjFNZXNoU2VxdWVudGlhbERlY29kZXJFAEAsAADcJgAA+B8AAAAAAAA8JwAADgEAAA8BAAAQAQAAEQEAAE41ZHJhY28xNUxpbmVhclNlcXVlbmNlckUAAABALAAAICcAALAjAAAAAAAAvCcAAMsAAAASAQAAEwEAAM4AAAAiAAAAFAEAANAAAADRAAAA0g=="),i(t,10112,"RmFpbGVkIHRvIHBhcnNlIERyYWNvIGhlYWRlci4ATjVkcmFjbzE3UG9pbnRDbG91ZERlY29kZXJFAAAAGCwAAJ4nAAABAAAAAQAAAAIAAAACAAAABAAAAAQAAAAIAAAACAAAAAQAAAAIAAAAAQ=="),i(t,10243,"wAAAAMAAAADAAAAAwP//////////AAAAAEAoAAAVAQAAFgEAABcBAAAYAQAATjVkcmFjbzRNZXNoRQAAAEAsAAAwKAAAhCgAAP////8AAAAAAAAAAIQoAAAZAQAAGgEAABsBAAAcAQAATjVkcmFjbzEwUG9pbnRDbG91ZEUAAAAAGCwAAGwo"),i(t,10388,"AgAAAAMAAAAFAAAABwAAAAsAAAANAAAAEQAAABMAAAAXAAAAHQAAAB8AAAAlAAAAKQAAACsAAAAvAAAANQAAADsAAAA9AAAAQwAAAEcAAABJAAAATwAAAFMAAABZAAAAYQAAAGUAAABnAAAAawAAAG0AAABxAAAAfwAAAIMAAACJAAAAiwAAAJUAAACXAAAAnQAAAKMAAACnAAAArQAAALMAAAC1AAAAvwAAAMEAAADFAAAAxwAAANMAAAABAAAACwAAAA0AAAARAAAAEwAAABcAAAAdAAAAHwAAACUAAAApAAAAKwAAAC8AAAA1AAAAOwAAAD0AAABDAAAARwAAAEkAAABPAAAAUwAAAFkAAABhAAAAZQAAAGcAAABrAAAAbQAAAHEAAAB5AAAAfwAAAIMAAACJAAAAiwAAAI8AAACVAAAAlwAAAJ0AAACjAAAApwAAAKkAAACtAAAAswAAALUAAAC7AAAAvwAAAMEAAADFAAAAxwAAANEAAAAwMDAxMDIwMzA0MDUwNjA3MDgwOTEwMTExMjEzMTQxNTE2MTcxODE5MjAyMTIyMjMyNDI1MjYyNzI4MjkzMDMxMzIzMzM0MzUzNjM3MzgzOTQwNDE0MjQzNDQ0NTQ2NDc0ODQ5NTA1MTUyNTM1NDU1NTY1NzU4NTk2MDYxNjI2MzY0NjU2NjY3Njg2OTcwNzE3MjczNzQ3NTc2Nzc3ODc5ODA4MTgyODM4NDg1ODY4Nzg4ODk5MDkxOTI5Mzk0OTU5Njk3OTg5OQ=="),i(t,10980,"CgAAAGQAAADoAwAAECcAAKCGAQBAQg8AgJaYAADh9QUAypo7AAAAACwrAAAdAQAAHgEAAB8BAABTdDlleGNlcHRpb24AAAAAGCwAABwrAAAAAAAAWCsAAA0AAAAgAQAAIQEAAFN0MTFsb2dpY19lcnJvcgBALAAASCsAACwrAAAAAAAAjCsAAA0AAAAiAQAAIQEAAFN0MTJsZW5ndGhfZXJyb3IAAAAAQCwAAHgrAABYKwAAU3Q5dHlwZV9pbmZvAAAAABgsAACYKwAATjEwX19jeHhhYml2MTE2X19zaGltX3R5cGVfaW5mb0UAAAAAQCwAALArAACoKwAATjEwX19jeHhhYml2MTE3X19jbGFzc190eXBlX2luZm9FAAAAQCwAAOArAADUKwAAAAAAAAQsAAAjAQAAJAEAACUBAAAmAQAAJwEAACgBAAApAQAAKgEAAAAAAACILAAAIwEAACsBAAAlAQAAJgEAACcBAAAsAQAALQEAAC4BAABOMTBfX2N4eGFiaXYxMjBfX3NpX2NsYXNzX3R5cGVfaW5mb0UAAAAAQCwAAGAsAAAELA=="),i(t,11413,"L1A=");var vn=function(e){return e.set=function(e,t){this[e]=t},e.get=function(e){return this[e]},e}([null,Xr,on,tn,function(e,t){e|=0;var r=0;return!(t=s[88+(t|=0)>>2])|2!=s[t>>2]||(r=e,e=s[t+8>>2],s[r+4>>2]=d[0|e]|d[e+1|0]<<8|d[e+2|0]<<16|d[e+3|0]<<24,r=1),0|r},function(e,t){e|=0;var r,n=0;s[(t|=0)>>2]=2,n=s[t+8>>2],(r=s[t+12>>2]-n|0)>>>0<=4294967291&&(gr(t+8|0,r+4|0),n=s[t+8>>2]),t=n+r|0,e=s[e+4>>2],o[0|t]=e,o[t+1|0]=e>>>8,o[t+2|0]=e>>>16,o[t+3|0]=e>>>24},function(e,t,r,n){e|=0,t|=0,r|=0;var i,o=0,a=0,c=0,l=0,f=0,u=0,m=0;if(c=s[80+(n|=0)>>2],N=i=N-48|0,!((e=s[e+4>>2])-31>>>0<4294967267))if(l=s[s[n>>2]>>2]+s[n+48>>2]|0,s[i+16>>2]=e,e=-1<<e,s[i+20>>2]=-1^e,e=-2-e|0,s[i+24>>2]=e,s[i+32>>2]=(0|e)/2,p[i+28>>2]=b(2)/b(0|e),(0|(a=s[r>>2]))==s[r+4>>2])if(c)for(n=0,e=0;f=i+36|0,r=s[s[t>>2]>>2],o=s[t+40>>2],ye(f,r+(a=s[t+48>>2]+Ht(o,s[t+44>>2],d[t+84|0]?e:s[s[t+68>>2]+(e<<2)>>2],0)|0)|0,o),Be(i+16|0,f,i+12|0,i+8|0),s[(r=n<<2)+l>>2]=s[i+12>>2],s[(4|r)+l>>2]=s[i+8>>2],n=n+2|0,o=1,(0|c)!=(0|(e=e+1|0)););else o=1;else for(e=0,n=0;o=s[(n<<2)+a>>2],c=i+36|0,f=s[s[t>>2]>>2],m=s[t+48>>2],a=s[t+44>>2],u=s[t+40>>2],d[t+84|0]||(o=s[s[t+68>>2]+(o<<2)>>2]),ye(c,(o=Ht(u,a,o,0)+m|0)+f|0,u),Be(i+16|0,c,i+12|0,i+8|0),s[(a=e<<2)+l>>2]=s[i+12>>2],s[(4|a)+l>>2]=s[i+8>>2],o=1,e=e+2|0,n=n+1|0,a=s[r>>2],n>>>0<s[r+4>>2]-a>>2>>>0;);return N=i+48|0,0|o},Pe,function(e,t){t|=0;var r,n=0;return N=r=N-16|0,-1!=(0|(e=s[4+(e|=0)>>2]))&&(o[r+15|0]=e,n=s[t+20>>2],!!s[t+16>>2]&(0|n)>=0|(0|n)>0||he(t,s[t+4>>2],r+15|0,r+16|0)),N=r+16|0,-1!=(0|e)|0},Nt,function(e,t,r){var n,i,a,c,l,d;return t|=0,r|=0,N=n=N+-64|0,i=0|vn[s[s[(e|=0)>>2]+44>>2]](e,t),e=0|vn[s[s[e>>2]+40>>2]](e,t),a=Jt(n),c=s[t+56>>2],l=i<<24>>24,d=e,e=(e=e-1|0)>>>0<=10?s[10180+(e<<2)>>2]:-1,lr(a,c,l,d,0,e=h(e,i),e>>31),Xe(e=Ke(ur(96),a),r),o[e+84|0]=1,s[e+72>>2]=s[e+68>>2],s[e+60>>2]=s[t+60>>2],N=n- -64|0,0|e},Zr,function(e,t){return 2},mr,function(e){var t;return s[(e|=0)>>2]=1140,(t=s[e+8>>2])&&(s[e+12>>2]=t,ee(t)),0|e},function(e){var t;s[(e|=0)>>2]=1140,(t=s[e+8>>2])&&(s[e+12>>2]=t,ee(t)),ee(e)},Jr,function(e,t){e|=0;var r=0,n=0,i=0,a=0,c=0,l=0,f=0,u=0,p=0,m=0;if(!(!(r=s[88+(t|=0)>>2])|1!=s[r>>2])){if(n=s[r+8>>2],s[e+4>>2]=d[0|n]|d[n+1|0]<<8|d[n+2|0]<<16|d[n+3|0]<<24,n=o[t+24|0],i=s[e+8>>2],n>>>0>(a=s[e+12>>2]-i>>2)>>>0?(ct(e+8|0,n-a|0),n=o[t+24|0],i=s[e+8>>2]):n>>>0>=a>>>0||(s[e+12>>2]=(n<<2)+i),p=1,a=s[r+8>>2],(0|n)<=0)t=4;else{if(l=3&n,n-1>>>0<3)t=4,n=0;else for(m=-4&n,n=0,t=4;r=t+a|0,s[(c=n<<2)+i>>2]=d[0|r]|d[r+1|0]<<8|d[r+2|0]<<16|d[r+3|0]<<24,s[(4|c)+i>>2]=d[r+4|0]|d[r+5|0]<<8|d[r+6|0]<<16|d[r+7|0]<<24,s[(8|c)+i>>2]=d[r+8|0]|d[r+9|0]<<8|d[r+10|0]<<16|d[r+11|0]<<24,s[(12|c)+i>>2]=d[r+12|0]|d[r+13|0]<<8|d[r+14|0]<<16|d[r+15|0]<<24,n=n+4|0,t=t+16|0,(0|m)!=(0|(f=f+4|0)););if(l)for(;r=t+a|0,s[(n<<2)+i>>2]=d[0|r]|d[r+1|0]<<8|d[r+2|0]<<16|d[r+3|0]<<24,n=n+1|0,t=t+4|0,(0|(u=u+1|0))!=(0|l););}r=e,e=t+a|0,s[r+20>>2]=d[0|e]|d[e+1|0]<<8|d[e+2|0]<<16|d[e+3|0]<<24}return 0|p},function(e,t){e|=0;var r,n=0,i=0,a=0,c=0;if(s[(t|=0)>>2]=1,r=t+8|0,n=s[t+8>>2],(i=s[t+12>>2]-n|0)>>>0<=4294967291&&(gr(r,i+4|0),n=s[r>>2]),n=n+i|0,i=s[e+4>>2],o[0|n]=i,o[n+1|0]=i>>>8,o[n+2|0]=i>>>16,o[n+3|0]=i>>>24,(0|(n=s[e+8>>2]))!=s[e+12>>2])for(i=0;c=(i<<2)+n|0,n=s[t+8>>2],(a=s[t+12>>2]-n|0)>>>0<=4294967291&&(gr(r,a+4|0),n=s[r>>2]),n=n+a|0,a=s[c>>2],o[0|n]=a,o[n+1|0]=a>>>8,o[n+2|0]=a>>>16,o[n+3|0]=a>>>24,i=i+1|0,n=s[e+8>>2],i>>>0<s[e+12>>2]-n>>2>>>0;);(n=(n=s[t+12>>2])-(t=s[t+8>>2])|0)>>>0<=4294967291&&(gr(r,n+4|0),t=s[r>>2]),t=t+n|0,e=s[e+20>>2],o[0|t]=e,o[t+1|0]=e>>>8,o[t+2|0]=e>>>16,o[t+3|0]=e>>>24},function(e,t,r,n){e|=0,t|=0,r|=0,n|=0;var i,a=b(0),c=0,l=0,f=0,u=0,m=0,h=b(0),g=0,A=0,_=0,y=0,k=0,T=0,w=0,C=0,M=0,I=0,S=0,R=0,E=0,P=0;if(s[r>>2]==s[r+4>>2]){if(l=s[n+80>>2],N=I=N-16|0,m=s[e+4>>2],f=s[n+48>>2],n=s[s[n>>2]>>2],u=o[t+24|0],s[(r=I+8|0)>>2]=1065353216,M=r,p[r>>2]=b(-1<<m^-1)/p[e+20>>2],S=ur((0|u)!=(1073741823&u)?-1:u<<2),!(!l|(0|u)<=0))if(w=n+f|0,E=s[t>>2],r=s[t+48>>2],P=s[t+44>>2],R=s[t+40>>2],d[t+84|0])for(_=-2&u,C=1&u,t=0;;){if(k=ye(S,(f=s[E>>2])+(n=Ht(R,P,y,c)+r|0)|0,R),h=p[M>>2],g=s[e+8>>2],n=0,A=0,1!=(0|u))for(;f=w+(t<<2)|0,a=b(x(b(b(h*b(p[(T=n<<2)+k>>2]-p[g+T>>2]))+b(.5)))),m=b(v(a))<b(2147483648)?~~a:-2147483648,s[f>>2]=m,a=b(x(b(b(h*b(p[(m=4|T)+k>>2]-p[g+m>>2]))+b(.5)))),m=b(v(a))<b(2147483648)?~~a:-2147483648,s[f+4>>2]=m,n=n+2|0,t=t+2|0,(0|_)!=(0|(A=A+2|0)););if(C&&(f=w+(t<<2)|0,a=b(x(b(b(h*b(p[(n<<=2)+k>>2]-p[n+g>>2]))+b(.5)))),n=b(v(a))<b(2147483648)?~~a:-2147483648,s[f>>2]=n,t=t+1|0),y=n=y+1|0,!((0|l)!=(0|n)|(c=n?c:c+1|0)))break}else for(_=s[t+68>>2],C=-2&u,m=1&u,t=0;;){if(k=ye(S,(c=s[E>>2])+(n=Ht(R,P,s[_+(y<<2)>>2],0)+r|0)|0,R),h=p[M>>2],g=s[e+8>>2],n=0,A=0,1!=(0|u))for(;c=w+(t<<2)|0,a=b(x(b(b(h*b(p[(T=n<<2)+k>>2]-p[g+T>>2]))+b(.5)))),f=b(v(a))<b(2147483648)?~~a:-2147483648,s[c>>2]=f,a=b(x(b(b(h*b(p[(f=4|T)+k>>2]-p[g+f>>2]))+b(.5)))),f=b(v(a))<b(2147483648)?~~a:-2147483648,s[c+4>>2]=f,n=n+2|0,t=t+2|0,(0|C)!=(0|(A=A+2|0)););if(m&&(c=w+(t<<2)|0,a=b(x(b(b(h*b(p[(n<<=2)+k>>2]-p[n+g>>2]))+b(.5)))),n=b(v(a))<b(2147483648)?~~a:-2147483648,s[c>>2]=n,t=t+1|0),(0|l)==(0|(y=y+1|0)))break}return ee(S),N=I+16|0,1}if(N=I=N-16|0,M=s[e+4>>2],l=s[n+48>>2],c=s[s[n>>2]>>2],i=o[t+24|0],s[(n=I+8|0)>>2]=1065353216,f=n,p[n>>2]=b(-1<<M^-1)/p[e+20>>2],S=ur((0|i)!=(1073741823&i)?-1:i<<2),E=s[r>>2],!(!(r=s[r+4>>2]-E|0)|(0|i)<=0))if(w=c+l|0,P=s[t>>2],n=s[t+48>>2],R=s[t+44>>2],y=s[t+40>>2],T=(r>>=2)>>>0>1?r:1,d[t+84|0])for(m=-2&i,M=1&i,t=0;;){if(g=ye(S,(c=s[P>>2])+(r=Ht(y,R,s[E+(A<<2)>>2],0)+n|0)|0,y),h=p[f>>2],_=s[e+8>>2],r=0,u=0,1!=(0|i))for(;c=w+(t<<2)|0,a=b(x(b(b(h*b(p[(C=r<<2)+g>>2]-p[_+C>>2]))+b(.5)))),l=b(v(a))<b(2147483648)?~~a:-2147483648,s[c>>2]=l,a=b(x(b(b(h*b(p[(l=4|C)+g>>2]-p[_+l>>2]))+b(.5)))),l=b(v(a))<b(2147483648)?~~a:-2147483648,s[c+4>>2]=l,r=r+2|0,t=t+2|0,(0|m)!=(0|(u=u+2|0)););if(M&&(c=w+(t<<2)|0,a=b(x(b(b(h*b(p[(r<<=2)+g>>2]-p[r+_>>2]))+b(.5)))),r=b(v(a))<b(2147483648)?~~a:-2147483648,s[c>>2]=r,t=t+1|0),(0|T)==(0|(A=A+1|0)))break}else for(C=s[t+68>>2],m=-2&i,M=1&i,t=0;;){if(k=ye(S,(c=s[P>>2])+(r=Ht(y,R,s[C+(s[E+(A<<2)>>2]<<2)>>2],0)+n|0)|0,y),h=p[f>>2],g=s[e+8>>2],r=0,u=0,1!=(0|i))for(;c=w+(t<<2)|0,a=b(x(b(b(h*b(p[(_=r<<2)+k>>2]-p[g+_>>2]))+b(.5)))),l=b(v(a))<b(2147483648)?~~a:-2147483648,s[c>>2]=l,a=b(x(b(b(h*b(p[(l=4|_)+k>>2]-p[g+l>>2]))+b(.5)))),l=b(v(a))<b(2147483648)?~~a:-2147483648,s[c+4>>2]=l,r=r+2|0,t=t+2|0,(0|m)!=(0|(u=u+2|0)););if(M&&(c=w+(t<<2)|0,a=b(x(b(b(h*b(p[(r<<=2)+k>>2]-p[r+g>>2]))+b(.5)))),r=b(v(a))<b(2147483648)?~~a:-2147483648,s[c>>2]=r,t=t+1|0),(0|T)==(0|(A=A+1|0)))break}return ee(S),N=I+16|0,1},Ce,function(e,t){t|=0;var r,n,i=0,a=0;return N=r=N-16|0,-1!=(0|(n=s[4+(e|=0)>>2]))&&(i=s[t+20>>2],!!s[t+16>>2]&(0|i)>=0|(0|i)>0||(he(t,s[t+4>>2],s[e+8>>2],s[e+12>>2]),i=s[t+20>>2],!!s[t+16>>2]&(0|i)>=0|(0|i)>0||(i=e+20|0,he(t,s[t+4>>2],i,i+4|0),i=s[t+20>>2],a=s[t+16>>2],o[r+15|0]=s[e+4>>2],!!a&(0|i)>=0|(0|i)>0||he(t,s[t+4>>2],r+15|0,r+16|0)))),N=r+16|0,-1!=(0|n)|0},Re,Zr,function(e,t){return o[24+(t|=0)|0]},function(e){var t=0;return s[(e|=0)>>2]=1804,(t=s[e+16>>2])&&(s[e+20>>2]=t,ee(t)),(t=s[e+4>>2])&&(s[e+8>>2]=t,ee(t)),0|e},sn,function(e,t,r){return t|=0,r|=0,s[32+(e|=0)>>2]=r,s[e+28>>2]=t,1},de,function(e,t){t|=0;var r=0;return 0|vn[s[s[(e|=0)>>2]+36>>2]](e,t)&&0|vn[s[s[e>>2]+40>>2]](e,t)&&(r=0|vn[s[s[e>>2]+44>>2]](e)),0|r},function(e,t){return t|=0,s[s[4+(e|=0)>>2]+(t<<2)>>2]},function(e){return s[8+(e|=0)>>2]-s[e+4>>2]>>2},Gr,Hr,function(){T()},Vr,Jr,function(e){var t;return s[(e|=0)>>2]=1948,t=s[e+16>>2],s[e+16>>2]=0,t&&Lt(t),0|e},function(e){var t;s[(e|=0)>>2]=1948,t=s[e+16>>2],s[e+16>>2]=0,t&&Lt(t),ee(e)},br,function(e,t){return t|=0,s[12+(e|=0)>>2]=-1,s[e+8>>2]=t,1},function(e,t,r){t|=0,r|=0;var n,i=0;return n=s[8+(e|=0)>>2],o[n+24|0]<=0||Xe(n,s[t+4>>2]-s[t>>2]>>2)&&(i=0|vn[s[s[e>>2]+32>>2]](e,t,r)),0|i},function(e,t,r){return 1},Vr,function(e,t){e|=0;var r=0,n=0,i=0,o=0,a=0;if((0|vn[s[s[(t|=0)>>2]+20>>2]](t))<=0)return 1;e:{for(;;){if(-1==(0|(n=cr(s[s[e+4>>2]+4>>2],0|vn[s[s[t>>2]+24>>2]](t,i)))))break e;if(o=s[e+4>>2],r=0,(0|n)<0||(a=s[o+4>>2],(0|n)>=s[a+12>>2]-s[a+8>>2]>>2||(r=s[s[o+8>>2]+(s[s[o+20>>2]+(n<<2)>>2]<<2)>>2],r=0|vn[s[s[r>>2]+32>>2]](r,n))),!r)break e;if(!(0|vn[s[s[t>>2]+28>>2]](t,r)))break e;if(i=i+1|0,!((0|vn[s[s[t>>2]+20>>2]](t))>(0|i)))break}return 1}return 0},function(e,t,r){e|=0,r|=0;var n,i,o=0,a=0,c=0,l=0,d=0,f=0,p=0,m=0;if(o=s[(t|=0)>>2],t=s[t+4>>2],i=ur((0|(n=s[s[e+8>>2]+40>>2]))>=0?n:-1),c=1,!((0|(l=t-o|0))<=0||(t=0,c=0,o=0+s[r+20>>2]|0,o=(a=n+(d=s[r+16>>2])|0)>>>0<n>>>0?o+1|0:o,f=a,a=s[r+12>>2],f>>>0>u[r+8>>2]&(0|a)<=(0|o)|(0|o)>(0|a)))){for(c=(0|(p=l>>2))>1?p:1;a=ye(i,d+s[r>>2]|0,n),s[r+16>>2]=f,s[r+20>>2]=o,ye(s[s[s[e+8>>2]+64>>2]>>2]+t|0,a,n),(0|c)!=(0|(m=m+1|0))&&(t=t+n|0,o=0+s[r+20>>2]|0,o=(a=n+(d=s[r+16>>2])|0)>>>0<n>>>0?o+1|0:o,f=a,l=a,(0|(a=s[r+12>>2]))>=(0|o)&u[r+8>>2]>=l>>>0|(0|o)<(0|a)););c=(0|m)>=(0|p)}return ee(i),0|c},function(e){var t,r=0,n=0;if(s[(e|=0)>>2]=2044,r=s[e+60>>2],s[e+60>>2]=0,r&&vn[s[s[r>>2]+4>>2]](r),(r=s[e+48>>2])&&(s[e+52>>2]=r,ee(r)),t=s[e+36>>2]){if((0|(n=s[e+40>>2]))==(0|t))r=t;else{for(;r=s[(n=n-4|0)>>2],s[n>>2]=0,r&&vn[s[s[r>>2]+4>>2]](r),(0|t)!=(0|n););r=s[e+36>>2]}s[e+40>>2]=t,ee(r)}return s[e>>2]=1804,(r=s[e+16>>2])&&(s[e+20>>2]=r,ee(r)),(r=s[e+4>>2])&&(s[e+8>>2]=r,ee(r)),0|e},function(e){var t,r=0,n=0;if(s[(e|=0)>>2]=2044,r=s[e+60>>2],s[e+60>>2]=0,r&&vn[s[s[r>>2]+4>>2]](r),(r=s[e+48>>2])&&(s[e+52>>2]=r,ee(r)),t=s[e+36>>2]){if((0|(n=s[e+40>>2]))==(0|t))r=t;else{for(;r=s[(n=n-4|0)>>2],s[n>>2]=0,r&&vn[s[s[r>>2]+4>>2]](r),(0|t)!=(0|n););r=s[e+36>>2]}s[e+40>>2]=t,ee(r)}s[e>>2]=1804,(r=s[e+16>>2])&&(s[e+20>>2]=r,ee(r)),(r=s[e+4>>2])&&(s[e+8>>2]=r,ee(r)),ee(e)},function(e,t){var r=0,n=0,i=0,o=0,a=0,c=0,l=0,f=0,p=0,m=0,h=0,b=0;if(de(e|=0,t|=0)){if(l=e+36|0,(a=0|vn[s[s[e>>2]+24>>2]](e))>>>0>(r=(n=s[e+40>>2])-(i=s[e+36>>2])>>2)>>>0)Le(l,a-r|0);else if(!(r>>>0<=a>>>0)){if((0|(i=i+(a<<2)|0))!=(0|n))for(;r=s[(n=n-4|0)>>2],s[n>>2]=0,r&&vn[s[s[r>>2]+4>>2]](r),(0|n)!=(0|i););s[e+40>>2]=i}e:if((0|a)<=0)i=0;else if(i=1,!((0|(r=s[t+20>>2]))>=(0|(n=s[t+12>>2]))&(o=s[t+16>>2])>>>0>=u[t+8>>2]|(0|r)>(0|n)))for(n=0;;){if(c=d[o+s[t>>2]|0],r=(o=o+1|0)?r:r+1|0,s[t+16>>2]=o,s[t+20>>2]=r,o=0|vn[s[s[e>>2]+48>>2]](e,c),f=(c=n<<2)+s[e+36>>2]|0,r=s[f>>2],s[f>>2]=o,r&&vn[s[s[r>>2]+4>>2]](r),!(r=s[s[l>>2]+c>>2]))break e;if(m=r,h=0|vn[s[s[e>>2]+28>>2]](e),b=0|vn[s[s[e>>2]+20>>2]](e,n),p=s[s[r>>2]+8>>2],!(0|vn[p](0|m,0|h,0|b)))break e;if(i=(0|a)>(0|(n=n+1|0)),(0|n)==(0|a))break e;if(o=s[t+16>>2],r=s[t+20>>2],c=s[t+12>>2],!(o>>>0<u[t+8>>2]&(0|r)<=(0|c)|(0|r)<(0|c)))break}e=!i}else e=0;return 0|e},function(e,t){t|=0;var r=0,n=0,i=0,o=0,a=0;if((r=s[60+(e|=0)>>2])&&(s[r+4>>2]=e+48,0|vn[s[s[r>>2]+12>>2]](r))){e:if(!((0|(r=0|vn[s[s[e>>2]+24>>2]](e)))<=0)){for(;;){if(o=s[4+(0|vn[s[s[e>>2]+28>>2]](e))>>2],a=0|vn[s[s[e>>2]+20>>2]](e,n),i=s[e+60>>2],0|vn[s[s[i>>2]+8>>2]](i,s[s[o+8>>2]+(a<<2)>>2])){if((0|r)!=(0|(n=n+1|0)))continue;break e}break}return 0}n=0,0|vn[s[s[e>>2]+36>>2]](e,t)&&0|vn[s[s[e>>2]+40>>2]](e,t)&&(n=0|vn[s[s[e>>2]+44>>2]](e))}return 0|n},function(e,t){t|=0;var r,n=0;return r=s[16+(e|=0)>>2],n=0,s[e+20>>2]-r>>2<=(0|t)||(n=0,(0|(t=s[(t<<2)+r>>2]))<0||(n=tt(s[s[e+36>>2]+(t<<2)>>2]))),0|n},function(e,t){t|=0;var r,n=0,i=0,o=0,a=0;if(n=1,!((0|(r=0|vn[s[s[(e|=0)>>2]+24>>2]](e)))<=0)&&(i=s[s[e+36>>2]>>2],o=e+48|0,n=0,0|vn[s[s[i>>2]+16>>2]](i,o,t))){for(i=1;(0|r)!=(0|(n=i))&&(i=n+1|0,a=s[s[e+36>>2]+(n<<2)>>2],0|vn[s[s[a>>2]+16>>2]](a,o,t)););n=(0|n)>=(0|r)}return 0|n},function(e,t){t|=0;var r,n=0,i=0,o=0,a=0;if(n=1,!((0|(r=0|vn[s[s[(e|=0)>>2]+24>>2]](e)))<=0)&&(i=s[s[e+36>>2]>>2],o=e+48|0,n=0,0|vn[s[s[i>>2]+20>>2]](i,o,t))){for(i=1;(0|r)!=(0|(n=i))&&(i=n+1|0,a=s[s[e+36>>2]+(n<<2)>>2],0|vn[s[s[a>>2]+20>>2]](a,o,t)););n=(0|n)>=(0|r)}return 0|n},function(e){var t,r,n=0,i=0,a=0,c=0,l=0,f=0,u=0,p=0,m=0,b=0,v=0,g=0,A=0,_=0;N=t=N-16|0,g=1;e:if((0|(r=0|vn[s[s[(e|=0)>>2]+24>>2]](e)))<=0)g=0;else for(_=e+48|0;;){t:{if(s[40+(0|vn[s[s[e>>2]+28>>2]](e))>>2]&&(n=s[(c=b<<2)+s[e+36>>2]>>2],a=s[n+8>>2],f=tt(n))){n=s[40+(0|vn[s[s[e>>2]+28>>2]](e))>>2],u=s[a+56>>2],i=ur(32),s[t>>2]=i,s[t+4>>2]=24,s[t+8>>2]=-2147483616,o[i+24|0]=0,l=d[1308]|d[1309]<<8|d[1310]<<16|d[1311]<<24,a=d[1304]|d[1305]<<8|d[1306]<<16|d[1307]<<24,o[i+16|0]=a,o[i+17|0]=a>>>8,o[i+18|0]=a>>>16,o[i+19|0]=a>>>24,o[i+20|0]=l,o[i+21|0]=l>>>8,o[i+22|0]=l>>>16,o[i+23|0]=l>>>24,l=d[1300]|d[1301]<<8|d[1302]<<16|d[1303]<<24,a=d[1296]|d[1297]<<8|d[1298]<<16|d[1299]<<24,o[i+8|0]=a,o[i+9|0]=a>>>8,o[i+10|0]=a>>>16,o[i+11|0]=a>>>24,o[i+12|0]=l,o[i+13|0]=l>>>8,o[i+14|0]=l>>>16,o[i+15|0]=l>>>24,l=d[1292]|d[1293]<<8|d[1294]<<16|d[1295]<<24,a=d[1288]|d[1289]<<8|d[1290]<<16|d[1291]<<24,o[0|i]=a,o[i+1|0]=a>>>8,o[i+2|0]=a>>>16,o[i+3|0]=a>>>24,o[i+4|0]=l,o[i+5|0]=l>>>8,o[i+6|0]=l>>>16,o[i+7|0]=l>>>24,m=l=n+16|0;r:if(p=s[l>>2]){for(;m=(a=(0|u)>s[p+16>>2])?m:p,p=s[(a<<2)+p>>2];);if(!((0|l)==(0|m)|(0|u)<s[m+16>>2])&&(p=s[m+24>>2]))for(a=m+20|0;;){n:{i:{o:{if(m=(A=(v=(u=(l=d[p+27|0])<<24>>24<0)?s[p+20>>2]:l)>>>0<24)?v:24){l=p+16|0;a:{if(!(l=Mt(i,u=u?s[l>>2]:l,m))){if(v>>>0<=24)break a;break n}if((0|l)<0)break n}if(!(l=Mt(u,i,m)))break o;if((0|l)<0)break i;n=a;break r}if(v>>>0>24)break n}if(!A){n=a;break r}}p=p+4|0}if(!(p=s[p>>2]))break}}if(p=0,(0|(a=n+4|0))!=(0|(n=$e(n,t)))){for(a=o[n+39|0]<0?s[n+28>>2]:n+28|0,m=0,l=0;a=(n=a)+1|0,32==(0|(i=o[0|n]))|i-9>>>0<5;);r:{n:{i:switch((i=o[0|n])-43|0){case 0:break n;case 2:break i;default:break r}l=1}i=o[0|a],n=a}if(i-48>>>0<10)for(;m=48+(h(m,10)-o[0|n]|0)|0,a=o[n+1|0],n=n+1|0,a-48>>>0<10;);-1!=(0|(n=l?m:0-m|0))&&(p=0!=(0|n))}if(o[t+11|0]<0&&ee(s[t>>2]),p){c=s[s[s[e+36>>2]+c>>2]+8>>2],s[c+64>>2]||(i=n=ur(32),s[n+16>>2]=0,s[n+20>>2]=0,s[n+8>>2]=0,s[n>>2]=0,s[n+4>>2]=0,s[n+24>>2]=0,s[n+28>>2]=0,a=s[c+64>>2],s[c+64>>2]=n,a&&((n=s[a>>2])&&(s[a+4>>2]=n,ee(n)),ee(a),i=s[c+64>>2]),s[c>>2]=i,n=s[i+20>>2],s[c+8>>2]=s[i+16>>2],s[c+12>>2]=n,a=s[i+24>>2],n=s[i+28>>2],s[c+48>>2]=0,s[c+52>>2]=0,s[c+40>>2]=0,s[c+44>>2]=0,s[c+16>>2]=a,s[c+20>>2]=n);r:if(o[c+24|0]=d[f+24|0],s[c+28>>2]=s[f+28>>2],o[c+32|0]=d[f+32|0],n=s[f+44>>2],s[c+40>>2]=s[f+40>>2],s[c+44>>2]=n,n=s[f+52>>2],s[c+48>>2]=s[f+48>>2],s[c+52>>2]=n,s[c+56>>2]=s[f+56>>2],n=s[f+12>>2],s[c+8>>2]=s[f+8>>2],s[c+12>>2]=n,n=s[f+20>>2],s[c+16>>2]=s[f+16>>2],s[c+20>>2]=n,s[c+60>>2]=s[f+60>>2],(a=s[f>>2])?(i=0,(n=s[c>>2])&&(Vt(i=n,n=s[a>>2],s[a+4>>2]-n|0,0),i=1)):(s[c>>2]=0,i=1),i){o[c+84|0]=d[f+84|0],s[c+80>>2]=s[f+80>>2],(0|c)!=(0|f)&&Ye(c+68|0,s[f+68>>2],s[f+72>>2]);n:{i:{if(u=s[f+88>>2]){if(n=ur(40),a=s[u>>2],s[n+16>>2]=0,s[n+8>>2]=0,s[n+12>>2]=0,s[n>>2]=a,i=s[u+12>>2]-s[u+8>>2]|0){if((0|i)<0)break n;a=ur(i),s[n+8>>2]=a,s[n+12>>2]=a,s[n+16>>2]=i+a,i=s[u+8>>2],(0|(l=s[u+12>>2]-i|0))>0&&(a=ye(a,i,l)+l|0),s[n+12>>2]=a}if(a=s[u+36>>2],s[n+32>>2]=s[u+32>>2],s[n+36>>2]=a,a=s[u+28>>2],s[n+24>>2]=s[u+24>>2],s[n+28>>2]=a,i=s[c+88>>2],s[c+88>>2]=n,i)break i;break r}if(i=s[c+88>>2],s[c+88>>2]=0,!i)break r}(n=s[i+8>>2])&&(s[i+12>>2]=n,ee(n)),ee(i);break r}nn(),T()}break t}}if(n=s[s[e+36>>2]+(b<<2)>>2],!(0|vn[s[s[n>>2]+24>>2]](n,_)))break e}if(g=(0|r)>(0|(b=b+1|0)),(0|b)==(0|r))break}return N=t+16|0,1&(-1^g)},function(e,t){e|=0,e=0;e:switch(0|(t|=0)){case 0:return e=ur(20),s[e+12>>2]=-1,s[e+16>>2]=0,s[e+4>>2]=0,s[e+8>>2]=0,s[e>>2]=1948,0|e;case 1:return e=ur(24),s[e+12>>2]=-1,s[e+16>>2]=0,s[e+4>>2]=0,s[e+8>>2]=0,s[e>>2]=1948,s[e+20>>2]=0,s[e>>2]=2164,0|e;case 2:return e=ur(48),s[e+12>>2]=-1,s[e+16>>2]=0,s[e+4>>2]=0,s[e+8>>2]=0,s[e>>2]=1948,s[e+20>>2]=0,s[e>>2]=2164,s[e+32>>2]=0,s[e+36>>2]=0,s[e+28>>2]=-1,s[e+24>>2]=1140,s[e>>2]=7976,s[e+40>>2]=0,s[e+44>>2]=0,0|e;case 3:e=ur(32),s[e+12>>2]=-1,s[e+16>>2]=0,s[e+4>>2]=0,s[e+8>>2]=0,s[e>>2]=1948,s[e+20>>2]=0,s[e>>2]=2164,s[e+28>>2]=-1,s[e+24>>2]=1032,s[e>>2]=5840}return 0|e},ir,sr,br,function(e,t){return t|=0,0|vn[s[s[(e|=0)>>2]+48>>2]](e,s[t+4>>2]-s[t>>2]>>2)},function(e,t,r){e|=0,t|=0;var n,i,a=0,c=0,l=0,d=0,f=0,u=0,p=0;e:if(!((0|(a=n=s[12+(r|=0)>>2]))<=(0|(c=s[r+20>>2]))&(i=s[r+8>>2])>>>0<=(l=s[r+16>>2])>>>0|(0|a)<(0|c))){if(f=s[r>>2],u=o[f+l|0],a=c,a=(d=l+1|0)?a:a+1|0,s[r+16>>2]=d,s[r+20>>2]=a,-2!=(0|u)){if((0|a)>=(0|n)&d>>>0>=i>>>0|(0|a)>(0|n))break e;if(a=o[d+f|0],c=(l=l+2|0)>>>0<2?c+1|0:c,s[r+16>>2]=l,s[r+20>>2]=c,(a-4&255)>>>0<251)break e;c=0|vn[s[s[e>>2]+40>>2]](e,u,a),a=s[e+20>>2],s[e+20>>2]=c,a&&vn[s[s[a>>2]+4>>2]](a)}(!(a=s[e+20>>2])||0|vn[s[s[e>>2]+28>>2]](e,a))&&(p=0|vn[s[s[e>>2]+36>>2]](e,t,r))}return 0|p},ae,function(e,t,r){e|=0,t|=0;var n,i=0,a=0,c=0,l=0,d=0,f=0,u=0,p=0,m=0,h=0;if(N=n=N-48|0,1==(0|(r|=0))){c=s[e+4>>2],e=s[e+12>>2],s[n+40>>2]=0,s[n+32>>2]=0,s[n+36>>2]=0,s[n+24>>2]=0,s[n+28>>2]=0,s[n+16>>2]=0,s[n+20>>2]=0,s[n+8>>2]=0,s[n+12>>2]=0,a=n+8|0;e:if(-2!=(0|t)){if(p=s[s[s[c+4>>2]+8>>2]+(e<<2)>>2],1==(0|vn[s[s[c>>2]+8>>2]](c))){N=u=N-32|0,l=s[s[s[c+4>>2]+8>>2]+(e<<2)>>2];t:{r:{if(!(1!=(0|vn[s[s[c>>2]+8>>2]](c))|t-1>>>0>5||!(f=0|vn[s[s[c>>2]+36>>2]](c))|!(d=0|vn[s[s[c>>2]+44>>2]](c,e))))if(r=0|vn[s[s[c>>2]+40>>2]](c,e)){e=s[c+44>>2],s[u+12>>2]=r,s[u+8>>2]=e,s[u+20>>2]=d,s[u+16>>2]=d+12,c=u+8|0,e=0;n:{i:switch(t-1|0){case 0:if(e=ur(60),s[e+4>>2]=l,s[e>>2]=2988,l=s[a+8>>2],d=s[a+12>>2],f=s[a+16>>2],i=s[a+20>>2],r=s[a>>2],t=s[a+4>>2],s[e+40>>2]=0,s[e+32>>2]=0,s[e+36>>2]=0,s[e+24>>2]=f,s[e+28>>2]=i,s[e+16>>2]=l,s[e+20>>2]=d,s[e+8>>2]=r,s[e+12>>2]=t,t=s[a+24>>2],i=s[a+28>>2]-t|0){if((0|i)<0)break r;r=ur(i),s[e+32>>2]=r,s[e+40>>2]=r+(i>>2<<2),m=e,h=ye(r,t,i)+i|0,s[m+36>>2]=h}t=s[c+4>>2],s[e+44>>2]=s[c>>2],s[e+48>>2]=t,t=s[c+12>>2],s[e+52>>2]=s[c+8>>2],s[e+56>>2]=t,s[e>>2]=2280;break n;case 3:if(e=ur(112),s[e+4>>2]=l,s[e>>2]=2988,l=s[a+8>>2],d=s[a+12>>2],f=s[a+16>>2],i=s[a+20>>2],r=s[a>>2],t=s[a+4>>2],s[e+40>>2]=0,s[e+32>>2]=0,s[e+36>>2]=0,s[e+24>>2]=f,s[e+28>>2]=i,s[e+16>>2]=l,s[e+20>>2]=d,s[e+8>>2]=r,s[e+12>>2]=t,t=s[a+24>>2],i=s[a+28>>2]-t|0){if((0|i)<0)break r;r=ur(i),s[e+32>>2]=r,s[e+40>>2]=r+(i>>2<<2),m=e,h=ye(r,t,i)+i|0,s[m+36>>2]=h}t=s[c+4>>2],s[e+44>>2]=s[c>>2],s[e+48>>2]=t,t=s[c+12>>2],s[e+52>>2]=s[c+8>>2],s[e+56>>2]=t,s[e+60>>2]=0,s[e+64>>2]=0,s[e>>2]=3044,s[e+68>>2]=0,s[e+72>>2]=0,s[e+76>>2]=0,s[e+80>>2]=0,s[e+84>>2]=0,s[e+88>>2]=0,s[e+92>>2]=0,s[e+96>>2]=0,s[e+100>>2]=0,s[e+104>>2]=0,s[e+108>>2]=0;break n;case 4:if(e=ur(104),s[e+4>>2]=l,s[e>>2]=2988,l=s[a+8>>2],d=s[a+12>>2],f=s[a+16>>2],i=s[a+20>>2],r=s[a>>2],t=s[a+4>>2],s[e+40>>2]=0,s[e+32>>2]=0,s[e+36>>2]=0,s[e+24>>2]=f,s[e+28>>2]=i,s[e+16>>2]=l,s[e+20>>2]=d,s[e+8>>2]=r,s[e+12>>2]=t,t=s[a+24>>2],i=s[a+28>>2]-t|0){if((0|i)<0)break r;r=ur(i),s[e+32>>2]=r,s[e+40>>2]=r+(i>>2<<2),m=e,h=ye(r,t,i)+i|0,s[m+36>>2]=h}t=s[c+4>>2],s[e+44>>2]=s[c>>2],s[e+48>>2]=t,r=s[c+8>>2],t=s[c+12>>2],s[e+84>>2]=0,s[e+76>>2]=0,s[e+80>>2]=0,s[e+60>>2]=0,s[e+64>>2]=0,s[e>>2]=3292,s[e+52>>2]=r,s[e+56>>2]=t,t=s[c+4>>2],s[e+88>>2]=s[c>>2],s[e+92>>2]=t,t=s[c+12>>2],s[e+96>>2]=s[c+8>>2],s[e+100>>2]=t;break n;case 5:break i;default:break n}e=ur(128),s[e+4>>2]=l,s[e>>2]=2988,l=s[a+8>>2],d=s[a+12>>2],f=s[a+16>>2],i=s[a+20>>2],r=s[a>>2],t=s[a+4>>2],s[e+40>>2]=0,s[e+32>>2]=0,s[e+36>>2]=0,s[e+24>>2]=f,s[e+28>>2]=i,s[e+16>>2]=l,s[e+20>>2]=d,s[e+8>>2]=r,s[e+12>>2]=t;i:{o:{if(r=s[a+28>>2]-s[a+24>>2]|0){if((0|r)<0)break o;t=ur(r),s[e+32>>2]=t,s[e+36>>2]=t,s[e+40>>2]=t+(r>>2<<2),r=s[a+24>>2],(0|(i=s[a+28>>2]-r|0))>0&&(t=ye(t,r,i)+i|0),s[e+36>>2]=t}s[e>>2]=2932,t=s[c+4>>2],s[e+44>>2]=s[c>>2],s[e+48>>2]=t,t=s[c+12>>2],s[e+52>>2]=s[c+8>>2],s[e+56>>2]=t,s[(t=e- -64|0)>>2]=0,s[t+4>>2]=0,s[e+60>>2]=4156,s[e>>2]=3528,t=s[c+4>>2],s[e+72>>2]=s[c>>2],s[e+76>>2]=t,t=s[c+12>>2],s[e+80>>2]=s[c+8>>2],s[e+84>>2]=t,s[e+104>>2]=1065353216,s[e+108>>2]=-1,s[e+96>>2]=-1,s[e+100>>2]=-1,s[e+88>>2]=1,s[e+92>>2]=-1,s[e+60>>2]=3764,s[e+112>>2]=0,s[e+116>>2]=0,o[e+117|0]=0,o[e+118|0]=0,o[e+119|0]=0,o[e+120|0]=0,o[e+121|0]=0,o[e+122|0]=0,o[e+123|0]=0,o[e+124|0]=0;break i}nn(),T()}}i=e}else{e=s[c+44>>2],s[u+12>>2]=f,s[u+8>>2]=e,s[u+20>>2]=d,s[u+16>>2]=d+12,c=u+8|0,e=0;n:{i:switch(t-1|0){case 0:if(e=ur(60),s[e+4>>2]=l,s[e>>2]=2988,l=s[a+8>>2],d=s[a+12>>2],f=s[a+16>>2],i=s[a+20>>2],r=s[a>>2],t=s[a+4>>2],s[e+40>>2]=0,s[e+32>>2]=0,s[e+36>>2]=0,s[e+24>>2]=f,s[e+28>>2]=i,s[e+16>>2]=l,s[e+20>>2]=d,s[e+8>>2]=r,s[e+12>>2]=t,t=s[a+24>>2],i=s[a+28>>2]-t|0){if((0|i)<0)break r;r=ur(i),s[e+32>>2]=r,s[e+40>>2]=r+(i>>2<<2),m=e,h=ye(r,t,i)+i|0,s[m+36>>2]=h}t=s[c+4>>2],s[e+44>>2]=s[c>>2],s[e+48>>2]=t,t=s[c+12>>2],s[e+52>>2]=s[c+8>>2],s[e+56>>2]=t,s[e>>2]=4184;break n;case 3:if(e=ur(112),s[e+4>>2]=l,s[e>>2]=2988,l=s[a+8>>2],d=s[a+12>>2],f=s[a+16>>2],i=s[a+20>>2],r=s[a>>2],t=s[a+4>>2],s[e+40>>2]=0,s[e+32>>2]=0,s[e+36>>2]=0,s[e+24>>2]=f,s[e+28>>2]=i,s[e+16>>2]=l,s[e+20>>2]=d,s[e+8>>2]=r,s[e+12>>2]=t,t=s[a+24>>2],i=s[a+28>>2]-t|0){if((0|i)<0)break r;r=ur(i),s[e+32>>2]=r,s[e+40>>2]=r+(i>>2<<2),m=e,h=ye(r,t,i)+i|0,s[m+36>>2]=h}t=s[c+4>>2],s[e+44>>2]=s[c>>2],s[e+48>>2]=t,t=s[c+12>>2],s[e+52>>2]=s[c+8>>2],s[e+56>>2]=t,s[e+60>>2]=0,s[e+64>>2]=0,s[e>>2]=4608,s[e+68>>2]=0,s[e+72>>2]=0,s[e+76>>2]=0,s[e+80>>2]=0,s[e+84>>2]=0,s[e+88>>2]=0,s[e+92>>2]=0,s[e+96>>2]=0,s[e+100>>2]=0,s[e+104>>2]=0,s[e+108>>2]=0;break n;case 4:if(e=ur(104),s[e+4>>2]=l,s[e>>2]=2988,l=s[a+8>>2],d=s[a+12>>2],f=s[a+16>>2],i=s[a+20>>2],r=s[a>>2],t=s[a+4>>2],s[e+40>>2]=0,s[e+32>>2]=0,s[e+36>>2]=0,s[e+24>>2]=f,s[e+28>>2]=i,s[e+16>>2]=l,s[e+20>>2]=d,s[e+8>>2]=r,s[e+12>>2]=t,t=s[a+24>>2],i=s[a+28>>2]-t|0){if((0|i)<0)break r;r=ur(i),s[e+32>>2]=r,s[e+40>>2]=r+(i>>2<<2),m=e,h=ye(r,t,i)+i|0,s[m+36>>2]=h}t=s[c+4>>2],s[e+44>>2]=s[c>>2],s[e+48>>2]=t,r=s[c+8>>2],t=s[c+12>>2],s[e+84>>2]=0,s[e+76>>2]=0,s[e+80>>2]=0,s[e+60>>2]=0,s[e+64>>2]=0,s[e>>2]=4844,s[e+52>>2]=r,s[e+56>>2]=t,t=s[c+4>>2],s[e+88>>2]=s[c>>2],s[e+92>>2]=t,t=s[c+12>>2],s[e+96>>2]=s[c+8>>2],s[e+100>>2]=t;break n;case 5:break i;default:break n}e=ur(128),s[e+4>>2]=l,s[e>>2]=2988,l=s[a+8>>2],d=s[a+12>>2],f=s[a+16>>2],i=s[a+20>>2],r=s[a>>2],t=s[a+4>>2],s[e+40>>2]=0,s[e+32>>2]=0,s[e+36>>2]=0,s[e+24>>2]=f,s[e+28>>2]=i,s[e+16>>2]=l,s[e+20>>2]=d,s[e+8>>2]=r,s[e+12>>2]=t;i:{o:{if(r=s[a+28>>2]-s[a+24>>2]|0){if((0|r)<0)break o;t=ur(r),s[e+32>>2]=t,s[e+36>>2]=t,s[e+40>>2]=t+(r>>2<<2),r=s[a+24>>2],(0|(i=s[a+28>>2]-r|0))>0&&(t=ye(t,r,i)+i|0),s[e+36>>2]=t}s[e>>2]=4552,t=s[c+4>>2],s[e+44>>2]=s[c>>2],s[e+48>>2]=t,t=s[c+12>>2],s[e+52>>2]=s[c+8>>2],s[e+56>>2]=t,s[(t=e- -64|0)>>2]=0,s[t+4>>2]=0,s[e+60>>2]=5652,s[e>>2]=5068,t=s[c+4>>2],s[e+72>>2]=s[c>>2],s[e+76>>2]=t,t=s[c+12>>2],s[e+80>>2]=s[c+8>>2],s[e+84>>2]=t,s[e+104>>2]=1065353216,s[e+108>>2]=-1,s[e+96>>2]=-1,s[e+100>>2]=-1,s[e+88>>2]=1,s[e+92>>2]=-1,s[e+60>>2]=5288,s[e+112>>2]=0,s[e+116>>2]=0,o[e+117|0]=0,o[e+118|0]=0,o[e+119|0]=0,o[e+120|0]=0,o[e+121|0]=0,o[e+122|0]=0,o[e+123|0]=0,o[e+124|0]=0;break i}nn(),T()}}i=e}N=u+32|0;break t}nn(),T()}if(i)break e}i=ur(44),s[i+4>>2]=p,s[i>>2]=2988,l=s[a+8>>2],d=s[a+12>>2],f=s[a+16>>2],r=s[a+20>>2],t=s[a>>2],e=s[a+4>>2],s[i+40>>2]=0,s[i+32>>2]=0,s[i+36>>2]=0,s[i+24>>2]=f,s[i+28>>2]=r,s[i+16>>2]=l,s[i+20>>2]=d,s[i+8>>2]=t,s[i+12>>2]=e;t:{if(e=s[a+24>>2],r=s[a+28>>2]-e|0){if((0|r)<0)break t;t=ur(r),s[i+32>>2]=t,s[i+40>>2]=t+(r>>2<<2),m=i,h=ye(t,e,r)+r|0,s[m+36>>2]=h}s[i>>2]=5680;break e}nn(),T()}(e=s[n+32>>2])&&(s[n+36>>2]=e,ee(e))}return N=n+48|0,0|i},function(e){return o[s[8+(e|=0)>>2]+24|0]},function(e,t){t|=0;var r,n=0,i=0,c=0,l=0,d=0,f=0,u=0,p=0,m=0,h=0,b=0,v=0;r=e|=0;e:{t:{r:{n:{i:{o:{a:{s:switch(p=s[e+8>>2],s[p+28>>2]-1|0){case 4:break r;case 5:break n;case 2:break i;case 3:break o;case 0:break a;case 1:break s;default:break e}if(i=ur((0|(n=o[p+24|0]))>=0?n:-1),e=s[r+16>>2],f=s[e+80>>2]?s[s[e>>2]>>2]+s[e+48>>2]|0:0,!t)break t;if((0|n)>0){for(p=-4&n,h=3&n,c=n-1>>>0<3;;){if(e=0,d=0,!c)for(;u=f+(l<<2)|0,o[e+i|0]=s[u>>2],o[(1|e)+i|0]=s[u+4>>2],o[(2|e)+i|0]=s[u+8>>2],o[(3|e)+i|0]=s[u+12>>2],e=e+4|0,l=l+4|0,(0|p)!=(0|(d=d+4|0)););if(d=0,h)for(;o[e+i|0]=s[f+(l<<2)>>2],e=e+1|0,l=l+1|0,(0|h)!=(0|(d=d+1|0)););if(ye(s[s[s[r+8>>2]+64>>2]>>2]+b|0,i,n),b=n+b|0,(0|(m=m+1|0))==(0|t))break}break t}if(ye(s[s[p+64>>2]>>2],i,n),1==(0|t))break t;if(f=1&(c=t-1|0),e=0,2!=(0|t))for(t=-2&c;ye((e=e+n|0)+s[s[s[r+8>>2]+64>>2]>>2]|0,i,n),ye((e=e+n|0)+s[s[s[r+8>>2]+64>>2]>>2]|0,i,n),(0|t)!=(0|(l=l+2|0)););if(!f)break t;ye(s[s[s[r+8>>2]+64>>2]>>2]+(e+n|0)|0,i,n);break t}if(i=ur((0|(n=o[p+24|0]))>=0?n:-1),e=s[r+16>>2],f=s[e+80>>2]?s[s[e>>2]>>2]+s[e+48>>2]|0:0,!t)break t;if((0|n)>0){for(p=-4&n,h=3&n,c=n-1>>>0<3;;){if(e=0,d=0,!c)for(;u=f+(l<<2)|0,o[e+i|0]=s[u>>2],o[(1|e)+i|0]=s[u+4>>2],o[(2|e)+i|0]=s[u+8>>2],o[(3|e)+i|0]=s[u+12>>2],e=e+4|0,l=l+4|0,(0|p)!=(0|(d=d+4|0)););if(d=0,h)for(;o[e+i|0]=s[f+(l<<2)>>2],e=e+1|0,l=l+1|0,(0|h)!=(0|(d=d+1|0)););if(ye(s[s[s[r+8>>2]+64>>2]>>2]+b|0,i,n),b=n+b|0,(0|(m=m+1|0))==(0|t))break}break t}if(ye(s[s[p+64>>2]>>2],i,n),1==(0|t))break t;if(f=1&(c=t-1|0),e=0,2!=(0|t))for(t=-2&c;ye((e=e+n|0)+s[s[s[r+8>>2]+64>>2]>>2]|0,i,n),ye((e=e+n|0)+s[s[s[r+8>>2]+64>>2]>>2]|0,i,n),(0|t)!=(0|(l=l+2|0)););if(!f)break t;ye(s[s[s[r+8>>2]+64>>2]>>2]+(e+n|0)|0,i,n);break t}if(i=ur((e=(c=o[p+24|0])+c|0)>>>0<c>>>0?-1:e),e=s[r+16>>2],f=s[e+80>>2]?s[s[e>>2]>>2]+s[e+48>>2]|0:0,!t)break t;if(n=c<<1,(0|c)>0){for(p=-4&c,h=3&c,c=c-1>>>0<3;;){if(e=0,d=0,!c)for(;u=f+(l<<2)|0,a[(m=e<<1)+i>>1]=s[u>>2],a[(2|m)+i>>1]=s[u+4>>2],a[(4|m)+i>>1]=s[u+8>>2],a[(6|m)+i>>1]=s[u+12>>2],e=e+4|0,l=l+4|0,(0|p)!=(0|(d=d+4|0)););if(d=0,h)for(;a[(e<<1)+i>>1]=s[f+(l<<2)>>2],e=e+1|0,l=l+1|0,(0|h)!=(0|(d=d+1|0)););if(ye(s[s[s[r+8>>2]+64>>2]>>2]+v|0,i,n),v=n+v|0,(0|(b=b+1|0))==(0|t))break}break t}if(ye(s[s[p+64>>2]>>2],i,n),1==(0|t))break t;if(f=1&(c=t-1|0),e=0,2!=(0|t))for(t=-2&c;ye((e=e+n|0)+s[s[s[r+8>>2]+64>>2]>>2]|0,i,n),ye((e=e+n|0)+s[s[s[r+8>>2]+64>>2]>>2]|0,i,n),(0|t)!=(0|(l=l+2|0)););if(!f)break t;ye(s[s[s[r+8>>2]+64>>2]>>2]+(e+n|0)|0,i,n);break t}if(i=ur((e=(c=o[p+24|0])+c|0)>>>0<c>>>0?-1:e),e=s[r+16>>2],f=s[e+80>>2]?s[s[e>>2]>>2]+s[e+48>>2]|0:0,!t)break t;if(n=c<<1,(0|c)>0){for(p=-4&c,h=3&c,c=c-1>>>0<3;;){if(e=0,d=0,!c)for(;u=f+(l<<2)|0,a[(m=e<<1)+i>>1]=s[u>>2],a[(2|m)+i>>1]=s[u+4>>2],a[(4|m)+i>>1]=s[u+8>>2],a[(6|m)+i>>1]=s[u+12>>2],e=e+4|0,l=l+4|0,(0|p)!=(0|(d=d+4|0)););if(d=0,h)for(;a[(e<<1)+i>>1]=s[f+(l<<2)>>2],e=e+1|0,l=l+1|0,(0|h)!=(0|(d=d+1|0)););if(ye(s[s[s[r+8>>2]+64>>2]>>2]+v|0,i,n),v=n+v|0,(0|(b=b+1|0))==(0|t))break}break t}if(ye(s[s[p+64>>2]>>2],i,n),1==(0|t))break t;if(f=1&(c=t-1|0),e=0,2!=(0|t))for(t=-2&c;ye((e=e+n|0)+s[s[s[r+8>>2]+64>>2]>>2]|0,i,n),ye((e=e+n|0)+s[s[s[r+8>>2]+64>>2]>>2]|0,i,n),(0|t)!=(0|(l=l+2|0)););if(!f)break t;ye(s[s[s[r+8>>2]+64>>2]>>2]+(e+n|0)|0,i,n);break t}if(n=(c=o[p+24|0])<<2,i=ur((0|c)!=(1073741823&c)?-1:n),e=s[r+16>>2],f=s[e+80>>2]?s[s[e>>2]>>2]+s[e+48>>2]|0:0,!t)break t;if((0|c)>0){for(p=-4&c,h=3&c,c=c-1>>>0<3;;){if(e=0,d=0,!c)for(;u=f+(l<<2)|0,s[(m=e<<2)+i>>2]=s[u>>2],s[(4|m)+i>>2]=s[u+4>>2],s[(8|m)+i>>2]=s[u+8>>2],s[(12|m)+i>>2]=s[u+12>>2],e=e+4|0,l=l+4|0,(0|p)!=(0|(d=d+4|0)););if(d=0,h)for(;s[(e<<2)+i>>2]=s[f+(l<<2)>>2],e=e+1|0,l=l+1|0,(0|h)!=(0|(d=d+1|0)););if(ye(s[s[s[r+8>>2]+64>>2]>>2]+v|0,i,n),v=n+v|0,(0|(b=b+1|0))==(0|t))break}break t}if(ye(s[s[p+64>>2]>>2],i,n),1==(0|t))break t;if(f=1&(c=t-1|0),e=0,2!=(0|t))for(t=-2&c;ye((e=e+n|0)+s[s[s[r+8>>2]+64>>2]>>2]|0,i,n),ye((e=e+n|0)+s[s[s[r+8>>2]+64>>2]>>2]|0,i,n),(0|t)!=(0|(l=l+2|0)););if(!f)break t;ye(s[s[s[r+8>>2]+64>>2]>>2]+(e+n|0)|0,i,n);break t}if(n=(c=o[p+24|0])<<2,i=ur((0|c)!=(1073741823&c)?-1:n),e=s[r+16>>2],f=s[e+80>>2]?s[s[e>>2]>>2]+s[e+48>>2]|0:0,t)if((0|c)>0)for(p=-4&c,h=3&c,c=c-1>>>0<3;;){if(e=0,d=0,!c)for(;u=f+(l<<2)|0,s[(m=e<<2)+i>>2]=s[u>>2],s[(4|m)+i>>2]=s[u+4>>2],s[(8|m)+i>>2]=s[u+8>>2],s[(12|m)+i>>2]=s[u+12>>2],e=e+4|0,l=l+4|0,(0|p)!=(0|(d=d+4|0)););if(d=0,h)for(;s[(e<<2)+i>>2]=s[f+(l<<2)>>2],e=e+1|0,l=l+1|0,(0|h)!=(0|(d=d+1|0)););if(ye(s[s[s[r+8>>2]+64>>2]>>2]+v|0,i,n),v=n+v|0,(0|(b=b+1|0))==(0|t))break}else if(ye(s[s[p+64>>2]>>2],i,n),1!=(0|t)){if(f=1&(c=t-1|0),e=0,2!=(0|t))for(t=-2&c;ye((e=e+n|0)+s[s[s[r+8>>2]+64>>2]>>2]|0,i,n),ye((e=e+n|0)+s[s[s[r+8>>2]+64>>2]>>2]|0,i,n),(0|t)!=(0|(l=l+2|0)););f&&ye(s[s[s[r+8>>2]+64>>2]>>2]+(e+n|0)|0,i,n)}}ee(i),i=1}return 0|i},function(e){var t;return s[(e|=0)>>2]=2988,(t=s[e+32>>2])&&(s[e+36>>2]=t,ee(t)),0|e},kr,Jr,Wr,Ar,en,Lr,Hr,en,Jr,function(e,t){e|=0;var r,n,i,o=0,a=0,c=0,l=0,f=0,u=0;return n=a=s[12+(t|=0)>>2],c=o=s[t+20>>2],o=(r=(l=s[t+16>>2])+4|0)>>>0<4?o+1|0:o,(i=s[t+8>>2])>>>0<r>>>0&(0|o)>=(0|a)|(0|o)>(0|a)||(f=s[t>>2],a=d[0|(a=f+l|0)]|d[a+1|0]<<8|d[a+2|0]<<16|d[a+3|0]<<24,s[t+16>>2]=r,s[t+20>>2]=o,o=c,l=c=l+8|0,c=o=c>>>0<8?o+1|0:o,l>>>0>i>>>0&(0|o)>=(0|n)|(0|o)>(0|n)||(o=d[0|(o=r+f|0)]|d[o+1|0]<<8|d[o+2|0]<<16|d[o+3|0]<<24,s[t+16>>2]=l,s[t+20>>2]=c,(0|o)<(0|a)||(s[e+16>>2]=o,s[e+12>>2]=a,!(t=(o>>31)-((a>>31)+(o>>>0<a>>>0)|0)|0)&(o=o-a|0)>>>0>2147483646|t||(u=1,t=o+1|0,s[e+20>>2]=t,o=t>>>1|0,s[e+24>>2]=o,s[e+28>>2]=0-o,1&t||(s[e+24>>2]=o-1))))),0|u},function(e,t,r,n,i,o){t|=0,r|=0,n|=0,i|=0,o|=0;var a,c,l,d=0,f=0,u=0,p=0,m=0,b=0,v=0,g=0,A=0,_=0,x=0,y=0;if(s[8+(e|=0)>>2]=i,m=s[(n=e+32|0)>>2],(o=s[e+36>>2]-m>>2)>>>0<i>>>0?(ct(n,i-o|0),m=s[n>>2],n=s[e+8>>2]):(i>>>0<o>>>0&&(s[e+36>>2]=(i<<2)+m),n=i),l=s[e+52>>2],a=s[e+48>>2],o=0,b=We(ur(b=(1073741823&i)!=(0|i)?-1:i<<2),0,b),!((0|n)<=0)){for(;(0|(d=s[(n=o<<2)+b>>2]))>(0|(f=s[e+16>>2]))?s[n+m>>2]=f:(n=n+m|0,f=s[e+12>>2],s[n>>2]=(0|f)>(0|d)?f:d),(0|(n=s[e+8>>2]))>(0|(o=o+1|0)););if(!((0|n)<=0))for(o=0;;){n=(d=o<<2)+r|0,d=s[t+d>>2]+s[d+m>>2]|0,s[n>>2]=d;e:{if((0|d)>s[e+16>>2])d=d-s[e+20>>2]|0;else{if((0|d)>=s[e+12>>2])break e;d=d+s[e+20>>2]|0}s[n>>2]=d}if(!((0|(n=s[e+8>>2]))>(0|(o=o+1|0))))break}}if(o=s[e+56>>2],c=s[o>>2],(0|(o=s[o+4>>2]-c|0))>=5)for(A=(0|(o>>=2))>2?o:2,_=o>>>0>1?o:1,x=-2&i,y=1&i,m=1;;){e:{t:{if((0|m)!=(0|_)){if(g=h(i,m),-1==(0|(o=s[(m<<2)+c>>2]))|s[s[a>>2]+(o>>>3&536870908)>>2]>>>o&1)break t;if(-1==(0|(o=s[s[s[a+64>>2]+12>>2]+(o<<2)>>2])))break t;if(f=s[l>>2],d=s[a+28>>2],(0|(p=s[f+(s[d+(o<<2)>>2]<<2)>>2]))>=(0|m))break t;if((0|(u=s[f+(s[d+((((u=o+1|0)>>>0)%3|0?u:o-2|0)<<2)>>2]<<2)>>2]))>=(0|m))break t;if((0|(o=s[f+(s[d+(o+((o>>>0)%3|0?-1:2)<<2)>>2]<<2)>>2]))>=(0|m))break t;if(!((0|i)<=0)){if(d=h(i,o),f=h(i,u),p=h(i,p),o=0,v=0,1!=(0|i))for(;s[b+(o<<2)>>2]=(s[(o+d<<2)+r>>2]+s[(o+f<<2)+r>>2]|0)-s[(o+p<<2)+r>>2],s[b+((u=1|o)<<2)>>2]=(s[(d+u<<2)+r>>2]+s[(f+u<<2)+r>>2]|0)-s[(p+u<<2)+r>>2],o=o+2|0,(0|x)!=(0|(v=v+2|0)););y&&(s[b+(o<<2)>>2]=(s[(o+d<<2)+r>>2]+s[(o+f<<2)+r>>2]|0)-s[(o+p<<2)+r>>2])}if((0|n)<=0)break e;for(f=s[e+32>>2],o=0;(0|(d=s[(n=o<<2)+b>>2]))>(0|(p=s[e+16>>2]))?s[n+f>>2]=p:(n=n+f|0,p=s[e+12>>2],s[n>>2]=(0|p)>(0|d)?p:d),(0|(n=s[e+8>>2]))>(0|(o=o+1|0)););if(o=0,(0|n)<=0)break e;for(p=(n=g<<2)+r|0,u=t+n|0;;){n=(d=o<<2)+p|0,d=s[d+u>>2]+s[d+f>>2]|0,s[n>>2]=d;r:{if((0|d)>s[e+16>>2])d=d-s[e+20>>2]|0;else{if((0|d)>=s[e+12>>2])break r;d=d+s[e+20>>2]|0}s[n>>2]=d}if(!((0|(n=s[e+8>>2]))>(0|(o=o+1|0))))break}break e}dn(),T()}if(!((0|n)<=0)){for(p=(h(m-1|0,i)<<2)+r|0,f=s[e+32>>2],o=0;(0|(d=s[(n=o<<2)+p>>2]))>(0|(u=s[e+16>>2]))?s[n+f>>2]=u:(n=n+f|0,u=s[e+12>>2],s[n>>2]=(0|u)>(0|d)?u:d),(0|(n=s[e+8>>2]))>(0|(o=o+1|0)););if(o=0,!((0|n)<=0))for(p=(n=g<<2)+r|0,u=t+n|0;;){n=(d=o<<2)+p|0,d=s[d+u>>2]+s[d+f>>2]|0,s[n>>2]=d;t:{if((0|d)>s[e+16>>2])d=d-s[e+20>>2]|0;else{if((0|d)>=s[e+12>>2])break t;d=d+s[e+20>>2]|0}s[n>>2]=d}if(!((0|(n=s[e+8>>2]))>(0|(o=o+1|0))))break}}}if((0|A)==(0|(m=m+1|0)))break}return ee(b),1},sn,sn,function(e){var t=0;return s[(e|=0)>>2]=3044,(t=s[e+96>>2])&&ee(t),(t=s[e+84>>2])&&ee(t),(t=s[e+72>>2])&&ee(t),(t=s[e+60>>2])&&ee(t),s[e>>2]=2988,(t=s[e+32>>2])&&(s[e+36>>2]=t,ee(t)),0|e},function(e){var t=0;s[(e|=0)>>2]=3044,(t=s[e+96>>2])&&ee(t),(t=s[e+84>>2])&&ee(t),(t=s[e+72>>2])&&ee(t),(t=s[e+60>>2])&&ee(t),s[e>>2]=2988,(t=s[e+32>>2])&&(s[e+36>>2]=t,ee(t)),ee(e)},Kr,Ar,se,function(e,t,r,n,i,o){t|=0,r|=0,n|=0,i|=0,o|=0;var a,c,l,d,f=0,u=0,p=0,m=0,b=0,v=0,g=0,A=0,_=0,x=0,y=0,k=0,w=0,C=0,M=0,I=0,S=0,R=0,E=0,P=0,B=0,D=0,O=0,z=0,F=0;N=a=N+-64|0,s[8+(e|=0)>>2]=i,f=s[(o=e+32|0)>>2];e:{if((n=s[e+36>>2]-f>>2)>>>0<i>>>0)ct(o,i-n|0),s[a+56>>2]=0,s[a+60>>2]=0,s[a+48>>2]=0,s[a+52>>2]=0,s[a+40>>2]=0,s[a+44>>2]=0,s[a+32>>2]=0,s[a+36>>2]=0,s[a+24>>2]=0,s[a+28>>2]=0,s[a+16>>2]=0,s[a+20>>2]=0,s[a>>2]=0;else if(n>>>0>i>>>0&&(s[e+36>>2]=f+(i<<2)),s[a+56>>2]=0,s[a+60>>2]=0,s[a+48>>2]=0,s[a+52>>2]=0,s[a+40>>2]=0,s[a+44>>2]=0,s[a+32>>2]=0,s[a+36>>2]=0,s[a+24>>2]=0,s[a+28>>2]=0,s[a+16>>2]=0,s[a+20>>2]=0,s[a>>2]=0,n=0,!i)break e;xe(a+16|0,i,a),u=s[a+28>>2],n=s[a+32>>2]}s[a>>2]=0;e:if((n=n-u>>2)>>>0>=i>>>0){if(n>>>0<=i>>>0)break e;s[a+32>>2]=(i<<2)+u}else xe(a+16|12,i-n|0,a);s[a>>2]=0,o=s[a+40>>2];e:if((n=s[a+44>>2]-o>>2)>>>0>=i>>>0){if(n>>>0<=i>>>0)break e;s[a+44>>2]=o+(i<<2)}else xe(a+40|0,i-n|0,a);s[a>>2]=0,o=s[a+52>>2];e:if((n=s[a+56>>2]-o>>2)>>>0>=i>>>0){if(n>>>0<=i>>>0)break e;s[a+56>>2]=o+(i<<2)}else xe(a+52|0,i-n|0,a);if(u=0,!(s[e+8>>2]<=0)){for(p=s[e+32>>2],f=s[a+16>>2];(0|(o=s[(n=u<<2)+f>>2]))>(0|(v=s[e+16>>2]))?s[n+p>>2]=v:(n=n+p|0,v=s[e+12>>2],s[n>>2]=(0|v)>(0|o)?v:o),(0|(u=u+1|0))<(0|(n=s[e+8>>2])););if(!((0|n)<=0))for(n=0;;){o=(f=n<<2)+r|0,f=s[t+f>>2]+s[f+p>>2]|0,s[o>>2]=f;e:{if((0|f)>s[e+16>>2])f=f-s[e+20>>2]|0;else{if((0|f)>=s[e+12>>2])break e;f=f+s[e+20>>2]|0}s[o>>2]=f}if(!((0|(n=n+1|0))<s[e+8>>2]))break}}d=s[e+52>>2],c=s[e+48>>2],l=ur(16),s[(n=l)>>2]=0,s[n+4>>2]=0,s[n+8>>2]=0,s[n+12>>2]=0,s[a+8>>2]=0,s[a>>2]=0,s[a+4>>2]=0;e:{if(i){if(i>>>0>=1073741824)break e;C=ur(n=i<<2),s[a>>2]=C,s[a+8>>2]=n+C,We(C,0,n)}_=1,n=s[e+56>>2],S=s[n>>2];t:if(!((0|(n=s[n+4>>2]-S|0))<5))for(B=(0|(n>>=2))>2?n:2,D=n>>>0>1?n:1,R=-2&i,E=1&i,O=-4&i,P=3&i,M=i-1|0,z=i<<2,v=1;;){r:{n:{i:{o:{if((0|v)!=(0|D)){n=((o=s[(v<<2)+S>>2])>>>0)%3|0;a:{s:if(-1!=(0|o)){p=0,I=0!=(0|n)|-1!=(0|(f=o+2|0)),g=1,A=1<<(x=n?o-1|0:f),y=x>>>5|0,F=s[c>>2],n=o;c:{for(;;){if(!(s[(n>>>3&536870908)+F>>2]>>>n&1||-1==(0|(f=s[s[s[c+64>>2]+12>>2]+(n<<2)>>2]))||(m=s[d>>2],u=s[c+28>>2],(0|(_=s[m+(s[u+(f<<2)>>2]<<2)>>2]))>=(0|v)||(0|(b=s[m+(s[u+((((b=f+1|0)>>>0)%3|0?b:f-2|0)<<2)>>2]<<2)>>2]))>=(0|v)||(0|(u=s[m+(s[u+(f+((f>>>0)%3|0?-1:2)<<2)>>2]<<2)>>2]))>=(0|v)))){if(i){if(f=s[(a+16|0)+h(p,12)>>2],m=h(i,u),b=h(i,b),_=h(i,_),u=0,w=0,M)for(;s[f+(u<<2)>>2]=(s[(u+m<<2)+r>>2]+s[(u+b<<2)+r>>2]|0)-s[(u+_<<2)+r>>2],s[f+((k=1|u)<<2)>>2]=(s[(m+k<<2)+r>>2]+s[(b+k<<2)+r>>2]|0)-s[(_+k<<2)+r>>2],u=u+2|0,(0|R)!=(0|(w=w+2|0)););E&&(s[f+(u<<2)>>2]=(s[(u+m<<2)+r>>2]+s[(u+b<<2)+r>>2]|0)-s[(u+_<<2)+r>>2])}if(f=4,4==(0|(p=p+1|0)))break c}l:if(1&g){if(u=n-2|0,f=n+1|0,n=-1,-1==(0|(f=(f>>>0)%3|0?f:u))|s[s[c>>2]+(f>>>3&536870908)>>2]>>>f&1)break l;if(-1==(0|(f=s[s[s[c+64>>2]+12>>2]+(f<<2)>>2])))break l;n=((n=f+1|0)>>>0)%3|0?n:f-2|0}else{if((n>>>0)%3|0)u=n-1|0;else if(u=n+2|0,n=-1,-1==(0|u))break l;n=-1,s[s[c>>2]+(u>>>3&536870908)>>2]>>>u&1||-1!=(0|(f=s[s[s[c+64>>2]+12>>2]+(u<<2)>>2]))&&(n=(f>>>0)%3|0?f-1|0:f+2|0)}l:if((0|n)!=(0|o)){if(!(1&(1^g)|-1!=(0|n))){if(!I|A&s[s[c>>2]+(y<<2)>>2])break l;if(-1==(0|(n=s[s[s[c+64>>2]+12>>2]+(x<<2)>>2])))break l;g=0,n=(n>>>0)%3|0?n-1|0:n+2|0}if(-1!=(0|n))continue}break}if((0|(f=p))<=0)break s}for(i&&We(s[a>>2],0,z),k=((n=f-1|0)<<2)+l|0,w=n=h(n,12)+e|0,I=s[n- -64>>2],_=0,g=0,n=0;;){if(o=s[k>>2],s[k>>2]=o+1,o>>>0>=I>>>0)break t;if(!(s[s[w+60>>2]+(o>>>3&536870908)>>2]>>>o&1)&&(n=n+1|0,i)){if(p=s[a>>2],m=s[(a+16|0)+h(g,12)>>2],x=0,u=0,o=0,M>>>0>=3)for(;s[(A=(b=u<<2)+p|0)>>2]=s[A>>2]+s[m+b>>2],s[(y=(A=4|b)+p|0)>>2]=s[y>>2]+s[m+A>>2],s[(y=(A=8|b)+p|0)>>2]=s[y>>2]+s[m+A>>2],s[(A=(b|=12)+p|0)>>2]=s[A>>2]+s[m+b>>2],u=u+4|0,(0|O)!=(0|(o=o+4|0)););if(P)for(;s[(b=(o=u<<2)+p|0)>>2]=s[b>>2]+s[o+m>>2],u=u+1|0,(0|P)!=(0|(x=x+1|0)););}if((0|(g=g+1|0))==(0|f))break}if(o=g=h(i,v),!n)break a;if(!i)break n;if(o=s[a>>2],u=0,f=0,M)break o;break i}o=h(i,v)}if(s[e+8>>2]<=0)break r;for(g=(h(v-1|0,i)<<2)+r|0,p=s[e+32>>2],u=0;(0|(f=s[(n=u<<2)+g>>2]))>(0|(m=s[e+16>>2]))?s[n+p>>2]=m:(n=n+p|0,m=s[e+12>>2],s[n>>2]=(0|m)>(0|f)?m:f),(0|(u=u+1|0))<(0|(f=s[e+8>>2])););if(n=0,(0|f)<=0)break r;for(u=(o<<=2)+r|0,g=t+o|0;;){o=(f=n<<2)+u|0,f=s[f+g>>2]+s[f+p>>2]|0,s[o>>2]=f;a:{if((0|f)>s[e+16>>2])f=f-s[e+20>>2]|0;else{if((0|f)>=s[e+12>>2])break a;f=f+s[e+20>>2]|0}s[o>>2]=f}if(!((0|(n=n+1|0))<s[e+8>>2]))break}break r}dn(),T()}for(;s[(m=(p=u<<2)+o|0)>>2]=s[m>>2]/(0|n),s[(p=o+(4|p)|0)>>2]=s[p>>2]/(0|n),u=u+2|0,(0|R)!=(0|(f=f+2|0)););}E&&(s[(o=o+(u<<2)|0)>>2]=s[o>>2]/(0|n))}if(!(s[e+8>>2]<=0)){for(p=s[e+32>>2],u=0;(0|(o=s[(n=u<<2)+C>>2]))>(0|(f=s[e+16>>2]))?s[n+p>>2]=f:(n=n+p|0,f=s[e+12>>2],s[n>>2]=(0|f)>(0|o)?f:o),(0|(u=u+1|0))<(0|(o=s[e+8>>2])););if(n=0,!((0|o)<=0))for(u=(o=g<<2)+r|0,g=t+o|0;;){o=(f=n<<2)+u|0,f=s[f+g>>2]+s[f+p>>2]|0,s[o>>2]=f;n:{if((0|f)>s[e+16>>2])f=f-s[e+20>>2]|0;else{if((0|f)>=s[e+12>>2])break n;f=f+s[e+20>>2]|0}s[o>>2]=f}if(!((0|(n=n+1|0))<s[e+8>>2]))break}}}if(_=1,(0|B)==(0|(v=v+1|0)))break}return(e=s[a>>2])&&ee(e),ee(l),(e=s[a+52>>2])&&(s[a+56>>2]=e,ee(e)),(e=s[a+40>>2])&&(s[a+44>>2]=e,ee(e)),(e=s[a+28>>2])&&(s[a+32>>2]=e,ee(e)),(e=s[a+16>>2])&&(s[a+20>>2]=e,ee(e)),N=a- -64|0,0|_}nn(),T()},function(e){var t=0;return s[(e|=0)>>2]=3292,(t=s[e+76>>2])&&ee(t),s[e>>2]=2988,(t=s[e+32>>2])&&(s[e+36>>2]=t,ee(t)),0|e},function(e){var t=0;s[(e|=0)>>2]=3292,(t=s[e+76>>2])&&ee(t),s[e>>2]=2988,(t=s[e+32>>2])&&(s[e+36>>2]=t,ee(t)),ee(e)},$r,vr,Jr,Hr,_r,ge,function(e,t,r,n,i,a){e|=0,t|=0,r|=0,n|=0,a|=0;var c=0,l=0,f=0,u=0,p=0,m=0,h=0,b=0,v=0,g=0,A=0,_=0,x=0,y=0,k=0,w=0,C=0,M=0,I=0,S=0,E=0,P=0,B=0,D=0,O=0,z=0,F=0,G=0,U=0,V=0,L=0,W=0,Z=0,H=0,Y=0,q=0,Q=0,X=0,J=0,K=0;if(2==(0|(i|=0))){s[e+8>>2]=2,s[e- -64>>2]=a,i=s[(n=e+32|0)>>2],(c=(a=s[e+36>>2]-i|0)>>2)>>>0<=1?ct(n,2-c|0):8!=(0|a)&&(s[e+36>>2]=i+8);e:if(n=s[e+56>>2],(0|(a=(i=s[n+4>>2])-(n=s[n>>2])|0))<=0)a=0;else{if((0|n)!=(0|i))for(h=e+60|0,Q=(0|(F=a>>2))>1?F:1,a=1;;){N=u=N-80|0,i=-1,c=-1,-1!=(0|(n=s[(A<<2)+n>>2]))&&(i=((i=n+1|0)>>>0)%3|0?i:n-2|0,c=n-1|0,(n>>>0)%3|0||(c=n+2|0)),f=s[h+36>>2],n=s[f>>2];t:{r:{n:{i:{if(f=s[f+4>>2]-n>>2,l=i<<2,i=s[s[h+32>>2]+28>>2],!(f>>>0<=(p=s[l+i>>2])>>>0||(i=s[i+(c<<2)>>2])>>>0>=f>>>0)){o:{if(!((0|(c=s[n+(i<<2)>>2]))>=(0|A)|(0|(f=s[n+(p<<2)>>2]))>=(0|A))){if(w=s[4+(n=(c<<3)+r|0)>>2],x=s[4+(i=(f<<3)+r|0)>>2],!((0|(M=s[n>>2]))!=(0|(B=s[i>>2]))|(0|x)!=(0|w))){s[h+8>>2]=B,s[h+12>>2]=x;break o}if(n=s[s[h+4>>2]+(A<<2)>>2],s[u+72>>2]=0,s[u+76>>2]=0,s[(i=u- -64|0)>>2]=0,s[i+4>>2]=0,s[u+56>>2]=0,s[u+60>>2]=0,i=s[h>>2],d[i+84|0]||(n=s[s[i+68>>2]+(n<<2)>>2]),j(i,n,o[i+24|0],u+56|0),n=s[s[h+4>>2]+(f<<2)>>2],s[u+48>>2]=0,s[u+52>>2]=0,s[u+40>>2]=0,s[u+44>>2]=0,s[u+32>>2]=0,s[u+36>>2]=0,i=s[h>>2],d[i+84|0]||(n=s[s[i+68>>2]+(n<<2)>>2]),j(i,n,o[i+24|0],u+32|0),n=s[s[h+4>>2]+(c<<2)>>2],s[u+24>>2]=0,s[u+28>>2]=0,s[u+16>>2]=0,s[u+20>>2]=0,s[u+8>>2]=0,s[u+12>>2]=0,i=s[h>>2],d[i+84|0]||(n=s[s[i+68>>2]+(n<<2)>>2]),j(i,n,o[i+24|0],u+8|0),G=s[u+44>>2],n=Ht(v=(n=s[u+16>>2])-(i=D=s[u+40>>2])|0,p=s[u+20>>2]-(G+(n>>>0<i>>>0)|0)|0,v,p),i=R,b=n,U=s[u+36>>2],c=Ht(y=(n=s[u+8>>2])-(c=O=s[u+32>>2])|0,l=s[u+12>>2]-(U+(n>>>0<c>>>0)|0)|0,y,l),i=R+i|0,i=(n=b+c|0)>>>0<c>>>0?i+1|0:i,b=n,V=s[u+52>>2],_=Ht(g=(n=s[u+24>>2])-(c=z=s[u+48>>2])|0,m=s[u+28>>2]-(V+(n>>>0<c>>>0)|0)|0,g,m),c=R+i|0,k=n=b+_|0,n|(_=n>>>0<_>>>0?c+1|0:c)){if(n=Ht((n=b=s[u+64>>2])-D|0,(W=s[u+68>>2])-((n>>>0<D>>>0)+G|0)|0,v,p),i=R,n=(c=n)+(f=Ht((n=Z=s[u+56>>2])-O|0,(H=s[u+60>>2])-((n>>>0<O>>>0)+U|0)|0,y,l))|0,c=R+i|0,c=n>>>0<f>>>0?c+1|0:c,n=(i=n)+(f=Ht((n=Y=s[u+72>>2])-z|0,(q=s[u+76>>2])-((n>>>0<z>>>0)+V|0)|0,g,m))|0,i=R+c|0,I=n,C=n>>>0<f>>>0?i+1|0:i,c=(n=m>>31)+m|0,c=(i=n+g|0)>>>0<n>>>0?c+1|0:c,i^=n,f=n^=c,c=(n=p>>31)+p|0,E=n^(S=n+v|0),S=n^=n>>>0>S>>>0?c+1|0:c,L=0,c=(n=l>>31)+l|0,c=(P=n+y|0)>>>0<n>>>0?c+1|0:c,X=i,P^=n,(i=Te(-1,2147483647,(i=(0|f)==(0|(n=(c=(0|S)==(0|(n^=c))&E>>>0>P>>>0|n>>>0<S>>>0)?S:n))&i>>>0>(E=c?E:P)>>>0|n>>>0<f>>>0)?X:E,i?f:n)>>>0<I>>>0)&(0|(n=R))<=(0|C)|(0|n)<(0|C))break t;if(f=1,n=0,i=b,v=Wt(Ht(v,p,I,C),R,k,_),c=R+G|0,c=W-((i>>>0<(p=v+D|0)>>>0)+(c=p>>>0<v>>>0?c+1|0:c)|0)|0,c=Ht(i=i-p|0,c,i,c),v=R,i=Z,b=c,l=Wt(Ht(y,l,I,C),R,k,_),c=R+U|0,c=H-((i>>>0<(p=l+O|0)>>>0)+(c=l>>>0>p>>>0?c+1|0:c)|0)|0,p=Ht(i=i-p|0,c,i,c),i=R+v|0,p=i=(c=b+p|0)>>>0<p>>>0?i+1|0:i,i=Y,b=c,m=Wt(Ht(g,m,I,C),R,k,_),c=R+V|0,c=q-((i>>>0<(l=m+z|0)>>>0)+(c=l>>>0<m>>>0?c+1|0:c)|0)|0,l=Ht(i=i-l|0,c,i,c),c=R+p|0,p=Ht(i=b+l|0,i>>>0<l>>>0?c+1|0:c,k,_),l=i=R,!i&p>>>0<=1)break i;for(m=p,i=l;c=n<<1|f>>>31,f<<=1,n=c,v=!i&m>>>0>7|0!=(0|i),m=(3&i)<<30|m>>>2,i=i>>>2|0,v;);break n}}if((0|f)<(0|A))n=f<<1;else{if((0|A)<=0){s[h+8>>2]=0,s[h+12>>2]=0;break o}n=(A<<1)-2|0}n=(n<<2)+r|0,s[h+8>>2]=s[n>>2],s[h+12>>2]=s[n+4>>2]}L=1;break t}dn(),T()}if(n=l,(f=p)-1|0)break r}for(;i=Te(p,l,f,n)+f|0,c=n+R|0,i=Ht(f=(1&(c=i>>>0<f>>>0?c+1|0:c))<<31|i>>>1,n=c>>>1|0,f,n),(0|l)==(0|(c=R))&i>>>0>p>>>0|c>>>0>l>>>0;);}(p=s[h+20>>2])&&(i=p-1|0,m=s[s[h+16>>2]+(i>>>3&536870908)>>2],s[h+20>>2]=i,c=Ht(I,C,v=w-(c=x)|0,y=(w>>31)-((l=c>>31)+(c>>>0>w>>>0)|0)|0),g=R,l=(x=Ht(x,l,k,_))+c|0,c=R+g|0,c=l>>>0<x>>>0?c+1|0:c,b=l,M=l=Ht(f,n,g=M-(l=B)|0,w=(M>>31)-((x=l>>31)+(l>>>0>M>>>0)|0)|0),l=b+(m=(i=m>>>i&1)?0-l|0:l)|0,b=c,c=R,c=b+(i?0-(c+(0!=(0|M))|0)|0:c)|0,J=h,K=Wt(l,l>>>0<m>>>0?c+1|0:c,k,_),s[J+12>>2]=K,c=Ht(g,w,I,C),m=R,l=(g=Ht(k,_,B,x))+c|0,c=R+m|0,c=l>>>0<g>>>0?c+1|0:c,b=l,n=Ht(f,n,v,y),f=b+(l=i?n:0-n|0)|0,b=c,c=R,i=b+(i?c:0-((0!=(0|n))+c|0)|0)|0,J=h,K=Wt(f,f>>>0<l>>>0?i+1|0:i,k,_),s[J+8>>2]=K),L=0!=(0|p)}if(N=u+80|0,!L)break e;if(!(s[e+8>>2]<=0)){for(c=s[e+32>>2],n=0;(0|(a=s[68+((i=n<<2)+e|0)>>2]))>(0|(f=s[e+16>>2]))?s[i+c>>2]=f:(i=i+c|0,f=s[e+12>>2],s[i>>2]=(0|f)>(0|a)?f:a),(0|(n=n+1|0))<(0|(a=s[e+8>>2])););if(i=0,!((0|a)<=0))for(f=(n=A<<3)+r|0,p=t+n|0;;){n=(a=i<<2)+f|0,a=s[a+p>>2]+s[a+c>>2]|0,s[n>>2]=a;t:{if((0|a)>s[e+16>>2])a=a-s[e+20>>2]|0;else{if((0|a)>=s[e+12>>2])break t;a=a+s[e+20>>2]|0}s[n>>2]=a}if(!((0|(i=i+1|0))<s[e+8>>2]))break}}if(a=(0|F)>(0|(A=A+1|0)),(0|A)==(0|Q))break e;if(i=s[e+56>>2],n=s[i>>2],!(s[i+4>>2]-n>>2>>>0>A>>>0))break}dn(),T()}e=1^a}else e=0;return 1&e},function(e){var t;return s[(e|=0)>>2]=3528,s[e>>2]=2988,(t=s[e+32>>2])&&(s[e+36>>2]=t,ee(t)),0|e},function(e){var t;s[(e|=0)>>2]=3528,s[e>>2]=2988,(t=s[e+32>>2])&&(s[e+36>>2]=t,ee(t)),ee(e)},rn,nr,Jr,Hr,xr,je,function(e,t,r,n,i,o){t|=0,r|=0,n|=0,i|=0,o|=0;var a,c=0,l=0,d=0,f=0,u=0,p=0,m=0,h=0;N=a=N-32|0,s[68+(e|=0)>>2]=o,i=s[e+56>>2],n=s[i>>2],o=s[i+4>>2],s[a+24>>2]=0,s[a+16>>2]=0,s[a+20>>2]=0;e:if(!((0|(o=o-n|0))<=0)){if((0|(n=s[i>>2]))!=s[i+4>>2])for(p=e+112|0,m=e+60|0,h=(i=o>>>2|0)>>>0>1?i:1;;){if(W(m,s[(f<<2)+n>>2],a+16|0),n=(i=s[a+20>>2])>>31,c=(o=s[a+16>>2])>>31,l=(d=s[a+24>>2])>>31,c=(l^=l+d)+((n^n+i)+(c^o+c)|0)|0,n=0,(n=c>>>0<l>>>0?1:n)|c?(o=Wt(Ht(l=s[e+108>>2],u=l>>31,o,o>>31),R,c,n),s[a+16>>2]=o,n=Wt(Ht(l,u,i,i>>31),R,c,n),s[a+20>>2]=n,n=(i=(i=n)+(n>>=31)^n)+((n=o>>31)+o^n)|0,s[a+24>>2]=(0|d)>=0?l-n:n-l):s[a+16>>2]=s[e+108>>2],n=Gt(p),o=s[a+16>>2],n?(s[a+24>>2]=0-s[a+24>>2],i=0-s[a+20>>2]|0,s[a+20>>2]=i,o=0-o|0,s[a+16>>2]=o):i=s[a+20>>2],(0|o)>=0?(o=(n=s[e+108>>2])+s[a+24>>2]|0,n=n+i|0):((0|i)<0?(n=(o=s[a+24>>2])>>31,n^=n+o):(n=(o=s[a+24>>2])>>31,n=s[e+100>>2]-(n^n+o)|0),(0|o)<0?o=(o=i)+(i>>=31)^i:(o=i,i>>=31,o=s[e+100>>2]-(o+i^i)|0)),i=s[e+100>>2],n|o?(0|i)!=(0|o)|n?o|(c=(0|n)!=(0|i))?n||(0|(d=s[e+108>>2]))>=(0|o)?c||(0|(c=s[e+108>>2]))<=(0|o)?(0|i)!=(0|o)||(0|(i=s[e+108>>2]))<=(0|n)?o||(o=0,(0|(i=s[e+108>>2]))>=(0|n)||(n=(i<<1)-n|0)):n=(i<<1)-n|0:o=(c<<1)-o|0:(o=(d<<1)-o|0,n=0):o=n:n=o:n=o=i,s[a+12>>2]=o,s[a+8>>2]=n,!(s[e+8>>2]<=0)){for(c=s[e+32>>2],o=0;(0|(i=s[e+16>>2]))<(0|n)?s[c+(o<<2)>>2]=i:(i=c+(o<<2)|0,d=s[e+12>>2],s[i>>2]=(0|d)>(0|n)?d:n),(0|(o=o+1|0))<(0|(i=s[e+8>>2]));)n=s[(a+8|0)+(o<<2)>>2];if(n=0,!((0|i)<=0))for(d=(i=f<<3)+r|0,l=t+i|0;;){i=(o=n<<2)+d|0,o=s[o+l>>2]+s[o+c>>2]|0,s[i>>2]=o;t:{if((0|o)>s[e+16>>2])o=o-s[e+20>>2]|0;else{if((0|o)>=s[e+12>>2])break t;o=o+s[e+20>>2]|0}s[i>>2]=o}if(!((0|(n=n+1|0))<s[e+8>>2]))break}}if((0|h)==(0|(f=f+1|0)))break e;if(i=s[e+56>>2],n=s[i>>2],!(s[i+4>>2]-n>>2>>>0>f>>>0))break}dn(),T()}return N=a+32|0,1},Xr,on,hr,Gr,W,sn,kr,Jr,Ar,function(e,t,r,n,i,o){t|=0,r|=0,n|=0,i|=0,o|=0;var a,c,l,d=0,f=0,u=0,p=0,m=0,b=0,v=0,g=0,A=0,_=0,x=0,y=0;if(s[8+(e|=0)>>2]=i,m=s[(n=e+32|0)>>2],(o=s[e+36>>2]-m>>2)>>>0<i>>>0?(ct(n,i-o|0),m=s[n>>2],n=s[e+8>>2]):(i>>>0<o>>>0&&(s[e+36>>2]=(i<<2)+m),n=i),l=s[e+52>>2],a=s[e+48>>2],o=0,v=We(ur(v=(1073741823&i)!=(0|i)?-1:i<<2),0,v),!((0|n)<=0)){for(;(0|(d=s[(n=o<<2)+v>>2]))>(0|(u=s[e+16>>2]))?s[n+m>>2]=u:(n=n+m|0,u=s[e+12>>2],s[n>>2]=(0|u)>(0|d)?u:d),(0|(n=s[e+8>>2]))>(0|(o=o+1|0)););if(!((0|n)<=0))for(o=0;;){n=(d=o<<2)+r|0,d=s[t+d>>2]+s[d+m>>2]|0,s[n>>2]=d;e:{if((0|d)>s[e+16>>2])f=d-s[e+20>>2]|0;else{if((0|d)>=s[e+12>>2])break e;f=d+s[e+20>>2]|0}s[n>>2]=f}if(!((0|(n=s[e+8>>2]))>(0|(o=o+1|0))))break}}if(o=s[e+56>>2],c=s[o>>2],(0|(o=s[o+4>>2]-c|0))>=5)for(A=(0|(o>>=2))>2?o:2,_=o>>>0>1?o:1,x=-2&i,y=1&i,m=1;;){e:{t:{if((0|m)!=(0|_)){if(g=h(i,m),-1==(0|(o=s[(m<<2)+c>>2])))break t;if(-1==(0|(o=s[s[a+12>>2]+(o<<2)>>2])))break t;u=s[l>>2],d=s[a>>2],p=s[u+(s[d+(o<<2)>>2]<<2)>>2],f=-1!=(0|(f=((f=o+1|0)>>>0)%3|0?f:o-2|0))?s[d+(f<<2)>>2]:-1;r:{if((o>>>0)%3|0)o=o-1|0;else if(b=-1,-1==(0|(o=o+2|0)))break r;b=s[d+(o<<2)>>2]}if((0|p)>=(0|m))break t;if((0|(o=s[(f<<2)+u>>2]))>=(0|m))break t;if((0|(d=s[u+(b<<2)>>2]))>=(0|m))break t;if(!((0|i)<=0)){if(d=h(i,d),u=h(i,o),p=h(i,p),o=0,b=0,1!=(0|i))for(;s[v+(o<<2)>>2]=(s[(o+d<<2)+r>>2]+s[(o+u<<2)+r>>2]|0)-s[(o+p<<2)+r>>2],s[v+((f=1|o)<<2)>>2]=(s[(d+f<<2)+r>>2]+s[(u+f<<2)+r>>2]|0)-s[(f+p<<2)+r>>2],o=o+2|0,(0|x)!=(0|(b=b+2|0)););y&&(s[v+(o<<2)>>2]=(s[(o+d<<2)+r>>2]+s[(o+u<<2)+r>>2]|0)-s[(o+p<<2)+r>>2])}if((0|n)<=0)break e;for(u=s[e+32>>2],o=0;(0|(d=s[(n=o<<2)+v>>2]))>(0|(p=s[e+16>>2]))?s[n+u>>2]=p:(n=n+u|0,p=s[e+12>>2],s[n>>2]=(0|p)>(0|d)?p:d),(0|(n=s[e+8>>2]))>(0|(o=o+1|0)););if(o=0,(0|n)<=0)break e;for(p=(n=g<<2)+r|0,f=t+n|0;;){n=(d=o<<2)+p|0,d=s[d+f>>2]+s[d+u>>2]|0,s[n>>2]=d;r:{if((0|d)>s[e+16>>2])b=d-s[e+20>>2]|0;else{if((0|d)>=s[e+12>>2])break r;b=d+s[e+20>>2]|0}s[n>>2]=b}if(!((0|(n=s[e+8>>2]))>(0|(o=o+1|0))))break}break e}dn(),T()}if(!((0|n)<=0)){for(p=(h(m-1|0,i)<<2)+r|0,u=s[e+32>>2],o=0;(0|(d=s[(n=o<<2)+p>>2]))>(0|(f=s[e+16>>2]))?s[n+u>>2]=f:(n=n+u|0,f=s[e+12>>2],s[n>>2]=(0|f)>(0|d)?f:d),(0|(n=s[e+8>>2]))>(0|(o=o+1|0)););if(o=0,!((0|n)<=0))for(p=(n=g<<2)+r|0,f=t+n|0;;){n=(d=o<<2)+p|0,d=s[d+f>>2]+s[d+u>>2]|0,s[n>>2]=d;t:{if((0|d)>s[e+16>>2])b=d-s[e+20>>2]|0;else{if((0|d)>=s[e+12>>2])break t;b=d+s[e+20>>2]|0}s[n>>2]=b}if(!((0|(n=s[e+8>>2]))>(0|(o=o+1|0))))break}}}if((0|A)==(0|(m=m+1|0)))break}return ee(v),1},sn,function(e){var t=0;return s[(e|=0)>>2]=4608,(t=s[e+96>>2])&&ee(t),(t=s[e+84>>2])&&ee(t),(t=s[e+72>>2])&&ee(t),(t=s[e+60>>2])&&ee(t),s[e>>2]=2988,(t=s[e+32>>2])&&(s[e+36>>2]=t,ee(t)),0|e},function(e){var t=0;s[(e|=0)>>2]=4608,(t=s[e+96>>2])&&ee(t),(t=s[e+84>>2])&&ee(t),(t=s[e+72>>2])&&ee(t),(t=s[e+60>>2])&&ee(t),s[e>>2]=2988,(t=s[e+32>>2])&&(s[e+36>>2]=t,ee(t)),ee(e)},Kr,Ar,se,function(e,t,r,n,i,o){t|=0,r|=0,n|=0,i|=0,o|=0;var a,c,l,d,f=0,u=0,p=0,m=0,b=0,v=0,g=0,A=0,_=0,x=0,y=0,k=0,w=0,C=0,M=0,I=0,S=0,R=0,E=0,P=0,B=0,D=0,O=0,z=0;N=a=N+-64|0,s[8+(e|=0)>>2]=i,f=s[(o=e+32|0)>>2];e:{if((n=s[e+36>>2]-f>>2)>>>0<i>>>0)ct(o,i-n|0),s[a+56>>2]=0,s[a+60>>2]=0,s[a+48>>2]=0,s[a+52>>2]=0,s[a+40>>2]=0,s[a+44>>2]=0,s[a+32>>2]=0,s[a+36>>2]=0,s[a+24>>2]=0,s[a+28>>2]=0,s[a+16>>2]=0,s[a+20>>2]=0,s[a>>2]=0;else if(n>>>0>i>>>0&&(s[e+36>>2]=f+(i<<2)),s[a+56>>2]=0,s[a+60>>2]=0,s[a+48>>2]=0,s[a+52>>2]=0,s[a+40>>2]=0,s[a+44>>2]=0,s[a+32>>2]=0,s[a+36>>2]=0,s[a+24>>2]=0,s[a+28>>2]=0,s[a+16>>2]=0,s[a+20>>2]=0,s[a>>2]=0,n=0,!i)break e;xe(a+16|0,i,a),u=s[a+28>>2],n=s[a+32>>2]}s[a>>2]=0;e:if((n=n-u>>2)>>>0>=i>>>0){if(n>>>0<=i>>>0)break e;s[a+32>>2]=(i<<2)+u}else xe(a+16|12,i-n|0,a);s[a>>2]=0,o=s[a+40>>2];e:if((n=s[a+44>>2]-o>>2)>>>0>=i>>>0){if(n>>>0<=i>>>0)break e;s[a+44>>2]=o+(i<<2)}else xe(a+40|0,i-n|0,a);s[a>>2]=0,o=s[a+52>>2];e:if((n=s[a+56>>2]-o>>2)>>>0>=i>>>0){if(n>>>0<=i>>>0)break e;s[a+56>>2]=o+(i<<2)}else xe(a+52|0,i-n|0,a);if(u=0,!(s[e+8>>2]<=0)){for(m=s[e+32>>2],f=s[a+16>>2];(0|(o=s[(n=u<<2)+f>>2]))>(0|(g=s[e+16>>2]))?s[n+m>>2]=g:(n=n+m|0,g=s[e+12>>2],s[n>>2]=(0|g)>(0|o)?g:o),(0|(u=u+1|0))<(0|(n=s[e+8>>2])););if(!((0|n)<=0))for(n=0;;){o=(f=n<<2)+r|0,f=s[t+f>>2]+s[f+m>>2]|0,s[o>>2]=f;e:{if((0|f)>s[e+16>>2])p=f-s[e+20>>2]|0;else{if((0|f)>=s[e+12>>2])break e;p=f+s[e+20>>2]|0}s[o>>2]=p}if(!((0|(n=n+1|0))<s[e+8>>2]))break}}d=s[e+52>>2],l=s[e+48>>2],c=ur(16),s[(n=c)>>2]=0,s[n+4>>2]=0,s[n+8>>2]=0,s[n+12>>2]=0,s[a+8>>2]=0,s[a>>2]=0,s[a+4>>2]=0;e:{if(i){if(i>>>0>=1073741824)break e;C=ur(n=i<<2),s[a>>2]=C,s[a+8>>2]=n+C,We(C,0,n)}y=1,n=s[e+56>>2],S=s[n>>2];t:if(!((0|(n=s[n+4>>2]-S|0))<5))for(B=(0|(n>>=2))>2?n:2,D=n>>>0>1?n:1,R=-2&i,E=1&i,O=-4&i,P=3&i,M=i-1|0,z=i<<2,g=1;;){r:{n:{i:{o:{if((0|g)!=(0|D)){n=((o=s[(g<<2)+S>>2])>>>0)%3|0;a:{s:if(-1!=(0|o)){m=0,I=0!=(0|n)|-1!=(0|(f=o+2|0)),x=(k=s[l+12>>2])+((n?o-1|0:f)<<2)|0,A=1,n=o;c:{for(;;){if(-1!=(0|(f=s[k+(n<<2)>>2]))){b=-1,y=s[d>>2],v=s[l>>2],u=y+(s[v+(f<<2)>>2]<<2)|0,-1!=(0|(_=((_=f+1|0)>>>0)%3|0?_:f-2|0))&&(b=s[v+(_<<2)>>2]),_=s[u>>2];l:{if((f>>>0)%3|0)u=f-1|0;else if(p=-1,-1==(0|(u=f+2|0)))break l;p=s[v+(u<<2)>>2]}if(!((0|g)<=(0|_)||(0|(u=s[y+(b<<2)>>2]))>=(0|g)||(0|(b=s[y+(p<<2)>>2]))>=(0|g))){if(f=s[(a+16|0)+h(m,12)>>2],i){if(b=h(i,b),v=h(i,u),y=h(i,_),u=0,p=0,M)for(;s[f+(u<<2)>>2]=(s[(u+b<<2)+r>>2]+s[(u+v<<2)+r>>2]|0)-s[(u+y<<2)+r>>2],s[f+((_=1|u)<<2)>>2]=(s[(b+_<<2)+r>>2]+s[(v+_<<2)+r>>2]|0)-s[(_+y<<2)+r>>2],u=u+2|0,(0|R)!=(0|(p=p+2|0)););E&&(s[f+(u<<2)>>2]=(s[(u+b<<2)+r>>2]+s[(u+v<<2)+r>>2]|0)-s[(u+y<<2)+r>>2])}if(f=4,4==(0|(m=m+1|0)))break c}}l:if(1&A){if(p=-1,-1==(0|(n=((u=n+1|0)>>>0)%3|0?u:n-2|0)))break l;if(p=-1,-1==(0|(n=s[k+(n<<2)>>2])))break l;p=((f=n+1|0)>>>0)%3|0?f:n-2|0}else{if((n>>>0)%3|0)u=n-1|0;else if(p=-1,-1==(0|(u=n+2|0)))break l;p=-1,-1!=(0|(n=s[k+(u<<2)>>2]))&&(p=n-1|0,(n>>>0)%3|0||(p=n+2|0))}l:if((0|o)!=(0|(n=p))){if(!(1&(1^A)|-1!=(0|n))){if(!I)break l;if(-1==(0|(n=s[x>>2])))break l;A=0,n=(n>>>0)%3|0?n-1|0:n+2|0}if(-1!=(0|n))continue}break}if((0|(f=m))<=0)break s}for(i&&We(s[a>>2],0,z),_=((n=f-1|0)<<2)+c|0,p=n=h(n,12)+e|0,I=s[n- -64>>2],y=0,A=0,n=0;;){if(o=s[_>>2],s[_>>2]=o+1,o>>>0>=I>>>0)break t;if(!(s[s[p+60>>2]+(o>>>3&536870908)>>2]>>>o&1)&&(n=n+1|0,i)){if(m=s[a>>2],k=s[(a+16|0)+h(A,12)>>2],b=0,u=0,o=0,M>>>0>=3)for(;s[(x=(v=u<<2)+m|0)>>2]=s[x>>2]+s[v+k>>2],s[(w=(x=4|v)+m|0)>>2]=s[w>>2]+s[k+x>>2],s[(w=(x=8|v)+m|0)>>2]=s[w>>2]+s[k+x>>2],s[(x=(v|=12)+m|0)>>2]=s[x>>2]+s[v+k>>2],u=u+4|0,(0|O)!=(0|(o=o+4|0)););if(P)for(;s[(v=(o=u<<2)+m|0)>>2]=s[v>>2]+s[o+k>>2],u=u+1|0,(0|P)!=(0|(b=b+1|0)););}if((0|(A=A+1|0))==(0|f))break}if(o=A=h(i,g),!n)break a;if(!i)break n;if(o=s[a>>2],u=0,f=0,M)break o;break i}o=h(i,g)}if(s[e+8>>2]<=0)break r;for(A=(h(g-1|0,i)<<2)+r|0,m=s[e+32>>2],u=0;(0|(f=s[(n=u<<2)+A>>2]))>(0|(b=s[e+16>>2]))?s[n+m>>2]=b:(n=n+m|0,b=s[e+12>>2],s[n>>2]=(0|b)>(0|f)?b:f),(0|(u=u+1|0))<(0|(f=s[e+8>>2])););if(n=0,(0|f)<=0)break r;for(u=(o<<=2)+r|0,A=t+o|0;;){o=(f=n<<2)+u|0,f=s[f+A>>2]+s[f+m>>2]|0,s[o>>2]=f;a:{if((0|f)>s[e+16>>2])p=f-s[e+20>>2]|0;else{if((0|f)>=s[e+12>>2])break a;p=f+s[e+20>>2]|0}s[o>>2]=p}if(!((0|(n=n+1|0))<s[e+8>>2]))break}break r}dn(),T()}for(;s[(b=(m=u<<2)+o|0)>>2]=s[b>>2]/(0|n),s[(m=o+(4|m)|0)>>2]=s[m>>2]/(0|n),u=u+2|0,(0|R)!=(0|(f=f+2|0)););}E&&(s[(o=o+(u<<2)|0)>>2]=s[o>>2]/(0|n))}if(!(s[e+8>>2]<=0)){for(m=s[e+32>>2],u=0;(0|(o=s[(n=u<<2)+C>>2]))>(0|(f=s[e+16>>2]))?s[n+m>>2]=f:(n=n+m|0,f=s[e+12>>2],s[n>>2]=(0|f)>(0|o)?f:o),(0|(u=u+1|0))<(0|(o=s[e+8>>2])););if(n=0,!((0|o)<=0))for(u=(o=A<<2)+r|0,A=t+o|0;;){o=(f=n<<2)+u|0,f=s[f+A>>2]+s[f+m>>2]|0,s[o>>2]=f;n:{if((0|f)>s[e+16>>2])p=f-s[e+20>>2]|0;else{if((0|f)>=s[e+12>>2])break n;p=f+s[e+20>>2]|0}s[o>>2]=p}if(!((0|(n=n+1|0))<s[e+8>>2]))break}}}if(y=1,(0|B)==(0|(g=g+1|0)))break}return(e=s[a>>2])&&ee(e),ee(c),(e=s[a+52>>2])&&(s[a+56>>2]=e,ee(e)),(e=s[a+40>>2])&&(s[a+44>>2]=e,ee(e)),(e=s[a+28>>2])&&(s[a+32>>2]=e,ee(e)),(e=s[a+16>>2])&&(s[a+20>>2]=e,ee(e)),N=a- -64|0,0|y}nn(),T()},function(e){var t=0;return s[(e|=0)>>2]=4844,(t=s[e+76>>2])&&ee(t),s[e>>2]=2988,(t=s[e+32>>2])&&(s[e+36>>2]=t,ee(t)),0|e},function(e){var t=0;s[(e|=0)>>2]=4844,(t=s[e+76>>2])&&ee(t),s[e>>2]=2988,(t=s[e+32>>2])&&(s[e+36>>2]=t,ee(t)),ee(e)},$r,vr,Jr,Hr,_r,ge,function(e,t,r,n,i,a){e|=0,t|=0,r|=0,n|=0,a|=0;var c=0,l=0,f=0,u=0,p=0,m=0,h=0,b=0,v=0,g=0,A=0,_=0,x=0,y=0,k=0,w=0,C=0,M=0,I=0,S=0,E=0,P=0,B=0,D=0,O=0,z=0,F=0,G=0,U=0,V=0,L=0,W=0,Z=0,H=0,Y=0,q=0,Q=0,X=0,J=0;if(2==(0|(i|=0))){s[e+8>>2]=2,s[e- -64>>2]=a,i=s[(n=e+32|0)>>2],(c=(a=s[e+36>>2]-i|0)>>2)>>>0<=1?ct(n,2-c|0):8!=(0|a)&&(s[e+36>>2]=i+8);e:if(n=s[e+56>>2],(0|(a=(i=s[n+4>>2])-(n=s[n>>2])|0))<=0)a=0;else{if((0|n)!=(0|i))for(h=e+60|0,Q=(0|(z=a>>2))>1?z:1,a=1;;){if(N=f=N-80|0,i=-1,-1==(0|(c=s[(g<<2)+n>>2]))||(l=s[h+32>>2],-1!=(0|(n=((n=c+1|0)>>>0)%3|0?n:c-2|0))&&(i=s[s[l>>2]+(n<<2)>>2]),n=-1,-1!=(0|(c=c+((c>>>0)%3|0?-1:2)|0))&&(n=s[s[l>>2]+(c<<2)>>2]),l=s[h+36>>2],c=s[l>>2],(l=s[l+4>>2]-c>>2)>>>0<=i>>>0|n>>>0>=l>>>0))dn(),T();else{l=s[c+(i<<2)>>2];t:{r:{n:{i:{o:{if(!((0|(c=s[c+(n<<2)>>2]))>=(0|g)|(0|l)>=(0|g))){if(C=s[4+(n=(c<<3)+r|0)>>2],_=s[4+(i=(l<<3)+r|0)>>2],!((0|(y=s[n>>2]))!=(0|(B=s[i>>2]))|(0|_)!=(0|C))){s[h+8>>2]=B,s[h+12>>2]=_;break o}if(n=s[s[h+4>>2]+(g<<2)>>2],s[f+72>>2]=0,s[f+76>>2]=0,s[(i=f- -64|0)>>2]=0,s[i+4>>2]=0,s[f+56>>2]=0,s[f+60>>2]=0,i=s[h>>2],d[i+84|0]||(n=s[s[i+68>>2]+(n<<2)>>2]),j(i,n,o[i+24|0],f+56|0),n=s[s[h+4>>2]+(l<<2)>>2],s[f+48>>2]=0,s[f+52>>2]=0,s[f+40>>2]=0,s[f+44>>2]=0,s[f+32>>2]=0,s[f+36>>2]=0,i=s[h>>2],d[i+84|0]||(n=s[s[i+68>>2]+(n<<2)>>2]),j(i,n,o[i+24|0],f+32|0),i=s[s[h+4>>2]+(c<<2)>>2],s[f+24>>2]=0,s[f+28>>2]=0,s[f+16>>2]=0,s[f+20>>2]=0,s[f+8>>2]=0,s[f+12>>2]=0,n=s[h>>2],d[n+84|0]||(i=s[s[n+68>>2]+(i<<2)>>2]),j(n,i,o[n+24|0],f+8|0),F=s[f+44>>2],n=Ht(b=(n=s[f+16>>2])-(i=M=s[f+40>>2])|0,p=s[f+20>>2]-(F+(n>>>0<i>>>0)|0)|0,b,p),i=R,v=n,G=s[f+36>>2],c=Ht(k=(n=s[f+8>>2])-(c=D=s[f+32>>2])|0,u=s[f+12>>2]-(G+(n>>>0<c>>>0)|0)|0,k,u),i=R+i|0,i=(n=v+c|0)>>>0<c>>>0?i+1|0:i,v=n,U=s[f+52>>2],A=Ht(x=(n=s[f+24>>2])-(c=O=s[f+48>>2])|0,m=s[f+28>>2]-(U+(n>>>0<c>>>0)|0)|0,x,m),c=R+i|0,w=n=v+A|0,n|(A=n>>>0<A>>>0?c+1|0:c)){if(n=Ht((n=L=s[f+64>>2])-M|0,(W=s[f+68>>2])-((n>>>0<M>>>0)+F|0)|0,b,p),i=R,n=(c=n)+(l=Ht((n=Z=s[f+56>>2])-D|0,(H=s[f+60>>2])-((n>>>0<D>>>0)+G|0)|0,k,u))|0,c=R+i|0,c=n>>>0<l>>>0?c+1|0:c,n=(i=n)+(l=Ht((n=Y=s[f+72>>2])-O|0,(q=s[f+76>>2])-((n>>>0<O>>>0)+U|0)|0,x,m))|0,i=R+c|0,S=n,I=n>>>0<l>>>0?i+1|0:i,c=(n=m>>31)+m|0,l=(i=n+x|0)^n,V=n^=c=i>>>0<n>>>0?c+1|0:c,i=(n=p>>31)+p|0,E=(c=n+b|0)^n,v=n^=c>>>0<n>>>0?i+1|0:i,i=0,c=(n=u>>31)+u|0,c=(P=n+k|0)>>>0<n>>>0?c+1|0:c,P^=n,(c=Te(-1,2147483647,(c=(0|V)==(0|(n=(c=(0|v)==(0|(n^=c))&E>>>0>P>>>0|n>>>0<v>>>0)?v:n))&l>>>0>(E=c?E:P)>>>0|n>>>0<V>>>0)?l:E,c?V:n)>>>0<S>>>0)&(0|(n=R))<=(0|I)|(0|n)<(0|I))break t;if(l=1,n=0,i=L,b=Wt(Ht(b,p,S,I),R,w,A),c=R+F|0,c=W-((i>>>0<(p=b+M|0)>>>0)+(c=p>>>0<b>>>0?c+1|0:c)|0)|0,c=Ht(i=i-p|0,c,i,c),b=R,i=Z,v=c,u=Wt(Ht(k,u,S,I),R,w,A),c=R+G|0,c=H-((i>>>0<(p=u+D|0)>>>0)+(c=u>>>0>p>>>0?c+1|0:c)|0)|0,p=Ht(i=i-p|0,c,i,c),i=R+b|0,p=i=(c=v+p|0)>>>0<p>>>0?i+1|0:i,i=Y,v=c,m=Wt(Ht(x,m,S,I),R,w,A),c=R+U|0,c=q-((i>>>0<(u=m+O|0)>>>0)+(c=u>>>0<m>>>0?c+1|0:c)|0)|0,u=Ht(i=i-u|0,c,i,c),c=R+p|0,p=Ht(i=v+u|0,i>>>0<u>>>0?c+1|0:c,w,A),u=i=R,!i&p>>>0<=1)break i;for(m=p,i=u;c=n<<1|l>>>31,l<<=1,n=c,b=!i&m>>>0>7|0!=(0|i),m=(3&i)<<30|m>>>2,i=i>>>2|0,b;);break n}}if((0|l)<(0|g))n=l<<1;else{if((0|g)<=0){s[h+8>>2]=0,s[h+12>>2]=0;break o}n=(g<<1)-2|0}n=(n<<2)+r|0,s[h+8>>2]=s[n>>2],s[h+12>>2]=s[n+4>>2]}i=1;break t}if(n=u,(l=p)-1|0)break r}for(;c=Te(p,u,l,n)+l|0,i=n+R|0,i=Ht(l=(1&(i=c>>>0<l>>>0?i+1|0:i))<<31|c>>>1,n=i>>>1|0,l,n),(0|u)==(0|(c=R))&i>>>0>p>>>0|c>>>0>u>>>0;);}(p=s[h+20>>2])&&(i=p-1|0,m=s[s[h+16>>2]+(i>>>3&536870908)>>2],s[h+20>>2]=i,c=Ht(S,I,b=C-(c=_)|0,k=(C>>31)-((u=c>>31)+(c>>>0>C>>>0)|0)|0),x=R,u=(_=Ht(_,u,w,A))+c|0,c=R+x|0,c=u>>>0<_>>>0?c+1|0:c,v=u,y=u=Ht(l,n,x=y-(u=B)|0,C=(y>>31)-((_=u>>31)+(u>>>0>y>>>0)|0)|0),m=v+(M=(i=u=m>>>i&1)?0-y|0:y)|0,v=c,c=R,i=v+(i?0-(c+(0!=(0|y))|0)|0:c)|0,X=h,J=Wt(m,m>>>0<M>>>0?i+1|0:i,w,A),s[X+12>>2]=J,i=Ht(x,C,S,I),c=R,m=Ht(w,A,B,_),c=R+c|0,c=(i=m+i|0)>>>0<m>>>0?c+1|0:c,n=Ht(l,n,b,k),l=(m=u?n:0-n|0)+i|0,i=R,i=(u?i:0-((0!=(0|n))+i|0)|0)+c|0,X=h,J=Wt(l,l>>>0<m>>>0?i+1|0:i,w,A),s[X+8>>2]=J),i=0!=(0|p)}N=f+80|0}if(!i)break e;if(!(s[e+8>>2]<=0)){for(c=s[e+32>>2],n=0;(0|(a=s[68+((i=n<<2)+e|0)>>2]))>(0|(l=s[e+16>>2]))?s[i+c>>2]=l:(i=i+c|0,l=s[e+12>>2],s[i>>2]=(0|l)>(0|a)?l:a),(0|(n=n+1|0))<(0|(a=s[e+8>>2])););if(i=0,!((0|a)<=0))for(l=(n=g<<3)+r|0,p=t+n|0;;){n=(a=i<<2)+l|0,a=s[a+p>>2]+s[a+c>>2]|0,s[n>>2]=a;t:{if((0|a)>s[e+16>>2])a=a-s[e+20>>2]|0;else{if((0|a)>=s[e+12>>2])break t;a=a+s[e+20>>2]|0}s[n>>2]=a}if(!((0|(i=i+1|0))<s[e+8>>2]))break}}if(a=(0|z)>(0|(g=g+1|0)),(0|g)==(0|Q))break e;if(i=s[e+56>>2],n=s[i>>2],!(s[i+4>>2]-n>>2>>>0>g>>>0))break}dn(),T()}e=1^a}else e=0;return 1&e},function(e){var t;return s[(e|=0)>>2]=5068,s[e>>2]=2988,(t=s[e+32>>2])&&(s[e+36>>2]=t,ee(t)),0|e},function(e){var t;s[(e|=0)>>2]=5068,s[e>>2]=2988,(t=s[e+32>>2])&&(s[e+36>>2]=t,ee(t)),ee(e)},rn,nr,Jr,Hr,xr,je,function(e,t,r,n,i,o){t|=0,r|=0,n|=0,i|=0,o|=0;var a,c=0,l=0,d=0,f=0,u=0,p=0,m=0,h=0;N=a=N-32|0,s[68+(e|=0)>>2]=o,i=s[e+56>>2],n=s[i>>2],o=s[i+4>>2],s[a+24>>2]=0,s[a+16>>2]=0,s[a+20>>2]=0;e:if(!((0|(o=o-n|0))<=0)){if((0|(n=s[i>>2]))!=s[i+4>>2])for(p=e+112|0,m=e+60|0,h=(i=o>>>2|0)>>>0>1?i:1;;){if(K(m,s[(f<<2)+n>>2],a+16|0),n=(i=s[a+20>>2])>>31,c=(o=s[a+16>>2])>>31,l=(d=s[a+24>>2])>>31,c=(l^=l+d)+((n^n+i)+(c^o+c)|0)|0,n=0,(n=c>>>0<l>>>0?1:n)|c?(o=Wt(Ht(l=s[e+108>>2],u=l>>31,o,o>>31),R,c,n),s[a+16>>2]=o,n=Wt(Ht(l,u,i,i>>31),R,c,n),s[a+20>>2]=n,n=(i=(i=n)+(n>>=31)^n)+((n=o>>31)+o^n)|0,s[a+24>>2]=(0|d)>=0?l-n:n-l):s[a+16>>2]=s[e+108>>2],n=Gt(p),o=s[a+16>>2],n?(s[a+24>>2]=0-s[a+24>>2],i=0-s[a+20>>2]|0,s[a+20>>2]=i,o=0-o|0,s[a+16>>2]=o):i=s[a+20>>2],(0|o)>=0?(o=(n=s[e+108>>2])+s[a+24>>2]|0,n=n+i|0):((0|i)<0?(n=(o=s[a+24>>2])>>31,n^=n+o):(n=(o=s[a+24>>2])>>31,n=s[e+100>>2]-(n^n+o)|0),(0|o)<0?o=(o=i)+(i>>=31)^i:(o=i,i>>=31,o=s[e+100>>2]-(o+i^i)|0)),i=s[e+100>>2],n|o?(0|i)!=(0|o)|n?o|(c=(0|n)!=(0|i))?n||(0|(d=s[e+108>>2]))>=(0|o)?c||(0|(c=s[e+108>>2]))<=(0|o)?(0|i)!=(0|o)||(0|(i=s[e+108>>2]))<=(0|n)?o||(o=0,(0|(i=s[e+108>>2]))>=(0|n)||(n=(i<<1)-n|0)):n=(i<<1)-n|0:o=(c<<1)-o|0:(o=(d<<1)-o|0,n=0):o=n:n=o:n=o=i,s[a+12>>2]=o,s[a+8>>2]=n,!(s[e+8>>2]<=0)){for(c=s[e+32>>2],o=0;(0|(i=s[e+16>>2]))<(0|n)?s[c+(o<<2)>>2]=i:(i=c+(o<<2)|0,d=s[e+12>>2],s[i>>2]=(0|d)>(0|n)?d:n),(0|(o=o+1|0))<(0|(i=s[e+8>>2]));)n=s[(a+8|0)+(o<<2)>>2];if(n=0,!((0|i)<=0))for(d=(i=f<<3)+r|0,l=t+i|0;;){i=(o=n<<2)+d|0,o=s[o+l>>2]+s[o+c>>2]|0,s[i>>2]=o;t:{if((0|o)>s[e+16>>2])o=o-s[e+20>>2]|0;else{if((0|o)>=s[e+12>>2])break t;o=o+s[e+20>>2]|0}s[i>>2]=o}if(!((0|(n=n+1|0))<s[e+8>>2]))break}}if((0|h)==(0|(f=f+1|0)))break e;if(i=s[e+56>>2],n=s[i>>2],!(s[i+4>>2]-n>>2>>>0>f>>>0))break}dn(),T()}return N=a+32|0,1},Xr,on,hr,Gr,K,sn,kr,en,Jr,function(e,t,r,n,i,o){t|=0,r|=0,n|=0,i|=0,o|=0;var a,c=0,l=0,d=0,f=0,u=0,p=0,m=0,h=0,b=0;if(s[8+(e|=0)>>2]=i,d=s[(o=e+32|0)>>2],(l=s[e+36>>2]-d>>2)>>>0<i>>>0?(ct(o,i-l|0),d=s[o>>2],o=s[e+8>>2]):(i>>>0<l>>>0&&(s[e+36>>2]=(i<<2)+d),o=i),l=0,a=We(ur(c=(1073741823&i)!=(0|i)?-1:i<<2),0,c),!((0|o)<=0)){for(;(0|(c=s[(o=l<<2)+a>>2]))>(0|(f=s[e+16>>2]))?s[o+d>>2]=f:(o=o+d|0,f=s[e+12>>2],s[o>>2]=(0|f)>(0|c)?f:c),(0|(o=s[e+8>>2]))>(0|(l=l+1|0)););if(!((0|o)<=0))for(l=0;;){o=(c=l<<2)+r|0,c=s[t+c>>2]+s[c+d>>2]|0,s[o>>2]=c;e:{if((0|c)>s[e+16>>2])c=c-s[e+20>>2]|0;else{if((0|c)>=s[e+12>>2])break e;c=c+s[e+20>>2]|0}s[o>>2]=c}if(!((0|(o=s[e+8>>2]))>(0|(l=l+1|0))))break}}if(!((0|n)<=(0|i)|(0|o)<=0))for(h=0-i<<2,d=i;;){if(!((0|o)<=0)){for(b=(m=(p=d<<2)+r|0)+h|0,f=s[e+32>>2],l=0;(0|(c=s[(o=l<<2)+b>>2]))>(0|(u=s[e+16>>2]))?s[o+f>>2]=u:(o=o+f|0,u=s[e+12>>2],s[o>>2]=(0|u)>(0|c)?u:c),(0|(o=s[e+8>>2]))>(0|(l=l+1|0)););if(l=0,!((0|o)<=0))for(p=t+p|0;;){o=(c=l<<2)+m|0,c=s[c+p>>2]+s[c+f>>2]|0,s[o>>2]=c;e:{if((0|c)>s[e+16>>2])c=c-s[e+20>>2]|0;else{if((0|c)>=s[e+12>>2])break e;c=c+s[e+20>>2]|0}s[o>>2]=c}if(!((0|(o=s[e+8>>2]))>(0|(l=l+1|0))))break}}if(!((0|(d=i+d|0))<(0|n)))break}return ee(a),1},ir,sr,function(e,t,r){t|=0,r|=0;var n=0;return s[4+(e|=0)>>2]=t,t=s[s[s[t+4>>2]+8>>2]+(r<<2)>>2],s[e+12>>2]=r,s[e+8>>2]=t,e=s[e+8>>2],3==d[e+24|0]&&(n=9==s[e+28>>2]),0|n},function(e,t,r){return t|=0,r|=0,d[s[4+(e|=0)>>2]+36|0]>=2&&(t=0,!Nt(e+24|0,tt(e),r))||(t=Ft(e+24|0,s[e+16>>2])),0|t},Nr,function(e,t,r){e|=0,t|=0;var n,i=0,a=0,c=0,l=0,d=0,f=0,u=0;N=n=N-32|0;e:if(3==(0|(r|=0))&&(r=s[e+4>>2],e=s[e+12>>2],s[n+24>>2]=-1,s[n+16>>2]=-1,s[n+20>>2]=1065353216,s[n+8>>2]=-1,s[n+12>>2]=-1,-2!=(0|t))){if(u=s[s[s[r+4>>2]+8>>2]+(e<<2)>>2],1==(0|vn[s[s[r>>2]+8>>2]](r))){f=s[s[s[r+4>>2]+8>>2]+(e<<2)>>2];t:{r:if(!(1!=(0|vn[s[s[r>>2]+8>>2]](r))|t-1>>>0>5||!(l=0|vn[s[s[r>>2]+36>>2]](r))|!(a=0|vn[s[s[r>>2]+44>>2]](r,e)))){if(c=a+12|0,d=0|vn[s[s[r>>2]+40>>2]](r,e),r=s[r+44>>2],d){if(6!=(0|t))break r;e=ur(112),s[e+4>>2]=f,t=s[n+12>>2],s[e+8>>2]=s[n+8>>2],s[e+12>>2]=t,t=s[n+20>>2],s[e+16>>2]=s[n+16>>2],s[e+20>>2]=t,s[e+24>>2]=s[n+24>>2],s[e+40>>2]=a,s[e+36>>2]=c,s[e+32>>2]=d,s[e+28>>2]=r,s[e+68>>2]=a,s[e- -64>>2]=c,s[e+60>>2]=d,s[e+56>>2]=r,s[e+48>>2]=0,s[e+52>>2]=0,s[e>>2]=5956,s[e+88>>2]=1065353216,s[e+92>>2]=-1,s[e+80>>2]=-1,s[e+84>>2]=-1,s[e+72>>2]=1,s[e+76>>2]=-1,s[e+44>>2]=6520,s[(t=e+96|0)>>2]=0,s[t+4>>2]=0,o[t+5|0]=0,o[t+6|0]=0,o[t+7|0]=0,o[t+8|0]=0,o[t+9|0]=0,o[t+10|0]=0,o[t+11|0]=0,o[t+12|0]=0;break t}6==(0|t)&&(i=ur(112),s[i+4>>2]=f,e=s[n+12>>2],s[i+8>>2]=s[n+8>>2],s[i+12>>2]=e,e=s[n+20>>2],s[i+16>>2]=s[n+16>>2],s[i+20>>2]=e,s[i+24>>2]=s[n+24>>2],s[i+40>>2]=a,s[i+36>>2]=c,s[i+32>>2]=l,s[i+28>>2]=r,s[i+68>>2]=a,s[i- -64>>2]=c,s[i+60>>2]=l,s[i+56>>2]=r,s[i+48>>2]=0,s[i+52>>2]=0,s[i>>2]=6960,s[i+88>>2]=1065353216,s[i+92>>2]=-1,s[i+80>>2]=-1,s[i+84>>2]=-1,s[i+72>>2]=1,s[i+76>>2]=-1,s[i+44>>2]=7380,s[(e=i+96|0)>>2]=0,s[e+4>>2]=0,o[e+5|0]=0,o[e+6|0]=0,o[e+7|0]=0,o[e+8|0]=0,o[e+9|0]=0,o[e+10|0]=0,o[e+11|0]=0,o[e+12|0]=0)}e=i}if(i=e,e)break e}i=ur(28),s[i+4>>2]=u,e=s[n+12>>2],s[i+8>>2]=s[n+8>>2],s[i+12>>2]=e,e=s[n+20>>2],s[i+16>>2]=s[n+16>>2],s[i+20>>2]=e,s[i+24>>2]=s[n+24>>2],s[i>>2]=7792}return N=n+32|0,0|i},tn,function(e,t){return 0|Pe(24+(e|=0)|0,tt(e),s[e+8>>2])},function(e){return s[(e|=0)>>2]=5956,0|e},function(e){s[(e|=0)>>2]=5956,ee(e)},rn,Wr,or,Jr,Hr,yr,Jr,function(e){return 3},qe,function(e,t,r,n,i,o){t|=0,r|=0,n|=0,i|=0,o|=0;var a,c=0,l=0,d=0,f=0,u=0,m=0,h=0,v=0,g=0;N=a=N-48|0,(n=s[8+(e|=0)>>2])-31>>>0>=4294967267&&(s[e+76>>2]=n,n=-2-(i=-1<<n)|0,s[e+84>>2]=n,s[e+80>>2]=-1^i,s[e+92>>2]=(0|n)/2,p[e+88>>2]=b(2)/b(0|n)),s[e+52>>2]=o,i=s[e+40>>2],n=s[i>>2],c=s[i+4>>2],o=0,s[a+16>>2]=0,s[a+8>>2]=0,s[a+12>>2]=0;e:if(!((0|(c=c-n|0))<=0)){if((0|(n=s[i>>2]))!=s[i+4>>2])for(m=e+8|0,h=e+96|0,v=e+44|0,g=(i=c>>>2|0)>>>0>1?i:1;;){if(W(v,s[(o<<2)+n>>2],a+8|0),n=(i=s[a+12>>2])>>31,l=(c=s[a+8>>2])>>31,d=(f=s[a+16>>2])>>31,l=(d^=d+f)+((n^n+i)+(l^c+l)|0)|0,n=0,(n=l>>>0<d>>>0?1:n)|l?(c=Wt(Ht(d=s[e+92>>2],u=d>>31,c,c>>31),R,l,n),s[a+8>>2]=c,n=Wt(Ht(d,u,i,i>>31),R,l,n),s[a+12>>2]=n,n=(i=(i=n)+(n>>=31)^n)+((n=c>>31)+c^n)|0,s[a+16>>2]=(0|f)>=0?d-n:n-d):s[a+8>>2]=s[e+92>>2],n=Gt(h),i=s[a+8>>2],n?(s[a+16>>2]=0-s[a+16>>2],c=0-s[a+12>>2]|0,s[a+12>>2]=c,i=0-i|0,s[a+8>>2]=i):c=s[a+12>>2],(0|i)>=0?(n=(i=s[e+92>>2])+s[a+16>>2]|0,i=i+c|0):((0|c)<0?(i=(n=s[a+16>>2])>>31,i^=n+i):(i=(n=s[a+16>>2])>>31,i=s[e+84>>2]-(i^n+i)|0),(0|n)<0?(n=c>>31,n^=n+c):(n=c>>31,n=s[e+84>>2]-(n+c^n)|0)),c=s[e+84>>2],n|i?(0|n)!=(0|c)|i?n|(l=(0|i)!=(0|c))?i||(0|(f=s[e+92>>2]))>=(0|n)?l||(0|(l=s[e+92>>2]))<=(0|n)?(0|n)!=(0|c)||(0|(c=s[e+92>>2]))<=(0|i)?n||(n=0,(0|(c=s[e+92>>2]))>=(0|i)||(i=(c<<1)-i|0)):i=(c<<1)-i|0:n=(l<<1)-n|0:(n=(f<<1)-n|0,i=0):n=i:i=n:i=n=c,f=s[4+(l=(c=o<<3)+t|0)>>2],l=s[l>>2],s[a+36>>2]=n,s[a+32>>2]=i,s[a+24>>2]=l,s[a+28>>2]=f,me(a+40|0,m,a+32|0,a+24|0),s[(n=r+c|0)>>2]=s[a+40>>2],s[n+4>>2]=s[a+44>>2],(0|g)==(0|(o=o+1|0)))break e;if(i=s[e+40>>2],n=s[i>>2],!(s[i+4>>2]-n>>2>>>0>o>>>0))break}dn(),T()}return N=a+48|0,1},Xr,on,hr,Gr,W,function(e){return s[(e|=0)>>2]=6960,0|e},function(e){s[(e|=0)>>2]=6960,ee(e)},rn,or,Jr,Hr,yr,qe,function(e,t,r,n,i,o){t|=0,r|=0,n|=0,i|=0,o|=0;var a,c=0,l=0,d=0,f=0,u=0,m=0,h=0,v=0,g=0;N=a=N-48|0,(n=s[8+(e|=0)>>2])-31>>>0>=4294967267&&(s[e+76>>2]=n,n=-2-(i=-1<<n)|0,s[e+84>>2]=n,s[e+80>>2]=-1^i,s[e+92>>2]=(0|n)/2,p[e+88>>2]=b(2)/b(0|n)),s[e+52>>2]=o,i=s[e+40>>2],n=s[i>>2],c=s[i+4>>2],o=0,s[a+16>>2]=0,s[a+8>>2]=0,s[a+12>>2]=0;e:if(!((0|(c=c-n|0))<=0)){if((0|(n=s[i>>2]))!=s[i+4>>2])for(m=e+8|0,h=e+96|0,v=e+44|0,g=(i=c>>>2|0)>>>0>1?i:1;;){if(K(v,s[(o<<2)+n>>2],a+8|0),n=(i=s[a+12>>2])>>31,l=(c=s[a+8>>2])>>31,d=(f=s[a+16>>2])>>31,l=(d^=d+f)+((n^n+i)+(l^c+l)|0)|0,n=0,(n=l>>>0<d>>>0?1:n)|l?(c=Wt(Ht(d=s[e+92>>2],u=d>>31,c,c>>31),R,l,n),s[a+8>>2]=c,n=Wt(Ht(d,u,i,i>>31),R,l,n),s[a+12>>2]=n,n=(i=(i=n)+(n>>=31)^n)+((n=c>>31)+c^n)|0,s[a+16>>2]=(0|f)>=0?d-n:n-d):s[a+8>>2]=s[e+92>>2],n=Gt(h),i=s[a+8>>2],n?(s[a+16>>2]=0-s[a+16>>2],c=0-s[a+12>>2]|0,s[a+12>>2]=c,i=0-i|0,s[a+8>>2]=i):c=s[a+12>>2],(0|i)>=0?(n=(i=s[e+92>>2])+s[a+16>>2]|0,i=i+c|0):((0|c)<0?(i=(n=s[a+16>>2])>>31,i^=n+i):(i=(n=s[a+16>>2])>>31,i=s[e+84>>2]-(i^n+i)|0),(0|n)<0?(n=c>>31,n^=n+c):(n=c>>31,n=s[e+84>>2]-(n+c^n)|0)),c=s[e+84>>2],n|i?(0|n)!=(0|c)|i?n|(l=(0|i)!=(0|c))?i||(0|(f=s[e+92>>2]))>=(0|n)?l||(0|(l=s[e+92>>2]))<=(0|n)?(0|n)!=(0|c)||(0|(c=s[e+92>>2]))<=(0|i)?n||(n=0,(0|(c=s[e+92>>2]))>=(0|i)||(i=(c<<1)-i|0)):i=(c<<1)-i|0:n=(l<<1)-n|0:(n=(f<<1)-n|0,i=0):n=i:i=n:i=n=c,f=s[4+(l=(c=o<<3)+t|0)>>2],l=s[l>>2],s[a+36>>2]=n,s[a+32>>2]=i,s[a+24>>2]=l,s[a+28>>2]=f,me(a+40|0,m,a+32|0,a+24|0),s[(n=r+c|0)>>2]=s[a+40>>2],s[n+4>>2]=s[a+44>>2],(0|g)==(0|(o=o+1|0)))break e;if(i=s[e+40>>2],n=s[i>>2],!(s[i+4>>2]-n>>2>>>0>o>>>0))break}dn(),T()}return N=a+48|0,1},Xr,on,hr,Gr,K,Xr,on,en,Jr,en,Lr,Hr,function(e,t){e|=0;var r,n,i,o,a=0,c=0,l=0,f=0;return r=s[12+(t|=0)>>2],l=a=s[t+20>>2],a=(c=(n=s[t+16>>2])+4|0)>>>0<4?a+1|0:a,o=c,(i=s[t+8>>2])>>>0<c>>>0&(0|a)>=(0|r)|(0|a)>(0|r)||(c=n+s[t>>2]|0,c=d[0|c]|d[c+1|0]<<8|d[c+2|0]<<16|d[c+3|0]<<24,s[t+16>>2]=o,s[t+20>>2]=a,a=l,(l=n+8|0)>>>0>i>>>0&(0|(a=l>>>0<8?a+1|0:a))>=(0|r)|(0|a)>(0|r)||(s[t+16>>2]=l,s[t+20>>2]=a,1&c&&((t=31^g(c))-30>>>0<4294967267||(f=1,s[e+8>>2]=t+1,t=-2-(a=-2<<t)|0,s[e+16>>2]=t,s[e+12>>2]=-1^a,s[e+24>>2]=(0|t)/2,p[e+20>>2]=b(2)/b(0|t))))),0|f},function(e,t,r,n,i,o){e|=0,t|=0,r|=0,n|=0,o|=0;var a=0,c=0,l=0,d=0,f=0,u=0,p=0,m=0;if(N=o=N-32|0,c=We(ur(c=(1073741823&(i|=0))!=(0|i)?-1:i<<2),0,c),a=s[t>>2],l=s[t+4>>2],f=s[c+4>>2],s[o+16>>2]=s[c>>2],s[o+20>>2]=f,s[o+8>>2]=a,s[o+12>>2]=l,me(o+24|0,l=e+8|0,o+16|0,o+8|0),s[r>>2]=s[o+24>>2],s[r+4>>2]=s[o+28>>2],(0|n)>(0|i))for(f=0-i<<2,e=i;p=s[(d=(a=e<<2)+t|0)>>2],d=s[d+4>>2],m=s[4+(u=(a=r+a|0)+f|0)>>2],s[o+16>>2]=s[u>>2],s[o+20>>2]=m,s[o+8>>2]=p,s[o+12>>2]=d,me(o+24|0,l,o+16|0,o+8|0),s[a>>2]=s[o+24>>2],s[a+4>>2]=s[o+28>>2],(0|n)>(0|(e=e+i|0)););return ee(c),N=o+32|0,1},function(e){var t=0;return s[24+(e|=0)>>2]=1140,s[e>>2]=7976,(t=s[e+32>>2])&&(s[e+36>>2]=t,ee(t)),s[e>>2]=2164,t=s[e+20>>2],s[e+20>>2]=0,t&&vn[s[s[t>>2]+4>>2]](t),s[e>>2]=1948,t=s[e+16>>2],s[e+16>>2]=0,t&&Lt(t),0|e},function(e){var t=0;s[24+(e|=0)>>2]=1140,s[e>>2]=7976,(t=s[e+32>>2])&&(s[e+36>>2]=t,ee(t)),s[e>>2]=2164,t=s[e+20>>2],s[e+20>>2]=0,t&&vn[s[s[t>>2]+4>>2]](t),s[e>>2]=1948,t=s[e+16>>2],s[e+16>>2]=0,t&&Lt(t),ee(e)},function(e,t,r){var n;return t|=0,r|=0,s[4+(e|=0)>>2]=t,n=s[s[s[t+4>>2]+8>>2]+(r<<2)>>2],s[e+12>>2]=r,s[e+8>>2]=n,9==s[s[s[s[t+4>>2]+8>>2]+(r<<2)>>2]+28>>2]|0},function(e,t,r){return t|=0,d[s[4+(e|=0)>>2]+36|0]>=2&&(t=0,!(0|vn[s[s[e>>2]+52>>2]](e)))||(t=Ft(e+24|0,s[e+16>>2])),0|t},Nr,function(e,t){return t|=0,0|vn[s[s[(e|=0)>>2]+56>>2]](e,t)},function(e){return 0|Re(24+(e|=0)|0,tt(e)||s[e+8>>2],s[s[e+4>>2]+32>>2])},function(e,t){return 0|Ce(24+(e|=0)|0,tt(e),s[e+8>>2])},function(e){var t,r=0,n=0;if(s[(e|=0)>>2]=10064,(r=s[e+20>>2])&&(s[e+24>>2]=r,ee(r)),t=s[e+8>>2]){if((0|(n=s[e+12>>2]))==(0|t))r=t;else{for(;r=s[(n=n-4|0)>>2],s[n>>2]=0,r&&vn[s[s[r>>2]+4>>2]](r),(0|t)!=(0|n););r=s[e+8>>2]}s[e+12>>2]=t,ee(r)}return 0|e},sn,Jr,Jr,function(e){return s[44+(e|=0)>>2]?0|vn[s[s[e>>2]+48>>2]](e):0},function(e){var t=0,r=0,n=0,i=0,o=0,a=0,c=0,l=0,f=0,u=0;e:{if(t=s[32+(e|=0)>>2],o=s[t+8>>2],i=0,!((0|(a=s[t+12>>2]))<=(0|(n=s[t+20>>2]))&(c=o)>>>0<=(o=s[t+16>>2])>>>0|(0|n)>(0|a))){c=d[o+s[t>>2]|0],n=(a=o+1|0)?n:n+1|0,s[t+16>>2]=a,s[t+20>>2]=n;t:if(c){for(;;){if(0|vn[s[s[e>>2]+16>>2]](e,r)){if((0|c)!=(0|(r=r+1|0)))continue;break t}break}return 0}if((0|(r=s[e+8>>2]))!=(0|(n=s[e+12>>2])))for(;;){if(t=s[r>>2],!(0|vn[s[s[t>>2]+8>>2]](t,e,s[e+4>>2])))break e;if((0|n)==(0|(r=r+4|0)))break}if(c){for(r=0;;){if(t=s[s[e+8>>2]+(r<<2)>>2],!(0|vn[s[s[t>>2]+12>>2]](t,s[e+32>>2])))break e;if((0|c)==(0|(r=r+1|0)))break}if(c)for(o=e+20|0;;){if(r=0,t=s[(a=l<<2)+s[e+8>>2]>>2],(0|(n=0|vn[s[s[t>>2]+24>>2]](t)))>0)for(;t=s[s[e+8>>2]+a>>2],u=0|vn[s[s[t>>2]+20>>2]](t,r),i=s[e+20>>2],u>>>0<(f=s[e+24>>2]-i>>2)>>>0||((t=u+1|0)>>>0>f>>>0?(ct(o,t-f|0),i=s[o>>2]):t>>>0>=f>>>0||(s[e+24>>2]=(t<<2)+i)),s[(u<<2)+i>>2]=l,(0|n)!=(0|(r=r+1|0)););if((0|c)==(0|(l=l+1|0)))break}}i=0,0|vn[s[s[e>>2]+28>>2]](e)&&(i=0|vn[s[s[e>>2]+32>>2]](e))}return 0|i}return 0},function(e){var t,r=0,n=0;if((0|(r=s[8+(e|=0)>>2]))==(0|(t=s[e+12>>2])))return 1;for(;n=s[r>>2],(n=0|vn[s[s[n>>2]+16>>2]](n,s[e+32>>2]))&&(0|t)!=(0|(r=r+4|0)););return 0|n},Jr,en,Hr,Hr,function(e){var t,r=0,n=0;if(s[(e|=0)>>2]=8204,r=s[e+48>>2],s[e+48>>2]=0,r&&vn[s[s[r>>2]+4>>2]](r),s[e>>2]=10064,(r=s[e+20>>2])&&(s[e+24>>2]=r,ee(r)),t=s[e+8>>2]){if((0|(n=s[e+12>>2]))==(0|t))r=t;else{for(;r=s[(n=n-4|0)>>2],s[n>>2]=0,r&&vn[s[s[r>>2]+4>>2]](r),(0|t)!=(0|n););r=s[e+8>>2]}s[e+12>>2]=t,ee(r)}return 0|e},function(e){var t,r=0,n=0;if(s[(e|=0)>>2]=8204,r=s[e+48>>2],s[e+48>>2]=0,r&&vn[s[s[r>>2]+4>>2]](r),s[e>>2]=10064,(r=s[e+20>>2])&&(s[e+24>>2]=r,ee(r)),t=s[e+8>>2]){if((0|(n=s[e+12>>2]))==(0|t))r=t;else{for(;r=s[(n=n-4|0)>>2],s[n>>2]=0,r&&vn[s[s[r>>2]+4>>2]](r),(0|t)!=(0|n););r=s[e+8>>2]}s[e+12>>2]=t,ee(r)}ee(e)},function(e){var t,r=0,n=0,i=0,c=0;if(n=s[32+(e|=0)>>2],t=s[n+16>>2],i=s[n+12>>2],r=s[n+20>>2],u[n+8>>2]>t>>>0&(0|i)>=(0|r)|(0|r)<(0|i)){c=d[t+s[n>>2]|0],r=(i=t+1|0)?r:r+1|0,s[n+16>>2]=i,s[n+20>>2]=r,n=s[e+48>>2],s[e+48>>2]=0,n&&vn[s[s[n>>2]+4>>2]](n);e:{t:{r:{n:switch(0|c){case 0:n=ur(384),s[n>>2]=8312,We(n+4|0,0,80),s[n+96>>2]=0,s[n+100>>2]=0,s[n+92>>2]=-1,s[n+84>>2]=-1,s[n+88>>2]=-1,s[n+104>>2]=0,s[n+108>>2]=0,s[n+112>>2]=0,s[n+116>>2]=0,s[n+120>>2]=0,s[n+124>>2]=0,s[n+128>>2]=0,s[n+132>>2]=0,s[n+136>>2]=0,s[n+140>>2]=0,s[n+144>>2]=0,s[n+148>>2]=0,s[n+156>>2]=0,s[n+160>>2]=0,s[n+152>>2]=1065353216,s[n+164>>2]=0,s[n+168>>2]=0,s[n+172>>2]=0,s[n+176>>2]=0,s[n+180>>2]=0,s[n+184>>2]=0,s[n+188>>2]=0,s[n+192>>2]=0,s[n+196>>2]=0,s[n+200>>2]=0,s[n+204>>2]=0,s[n+208>>2]=0,s[n+212>>2]=-1,s[n+216>>2]=0,s[n+220>>2]=0,s[n+224>>2]=0,a[38+(r=n+232|0)>>1]=0,s[r>>2]=0,s[r+8>>2]=0,s[r+12>>2]=0,s[r+16>>2]=0,s[r+20>>2]=0,s[r+24>>2]=0,s[r+28>>2]=0,o[r+29|0]=0,o[r+30|0]=0,o[r+31|0]=0,o[r+32|0]=0,o[r+33|0]=0,o[r+34|0]=0,o[r+35|0]=0,o[r+36|0]=0,a[38+(r=n+272|0)>>1]=0,s[r>>2]=0,s[r+8>>2]=0,s[r+12>>2]=0,s[r+16>>2]=0,s[r+20>>2]=0,s[r+24>>2]=0,s[r+28>>2]=0,o[r+29|0]=0,o[r+30|0]=0,o[r+31|0]=0,o[r+32|0]=0,o[r+33|0]=0,o[r+34|0]=0,o[r+35|0]=0,o[r+36|0]=0,s[(r=n+312|0)>>2]=0,s[r+4>>2]=0,o[r+5|0]=0,o[r+6|0]=0,o[r+7|0]=0,o[r+8|0]=0,o[r+9|0]=0,o[r+10|0]=0,o[r+11|0]=0,o[r+12|0]=0,a[38+(r=n+328|0)>>1]=0,s[r>>2]=0,s[r+8>>2]=0,s[r+12>>2]=0,s[r+16>>2]=0,s[r+20>>2]=0,s[r+24>>2]=0,s[r+28>>2]=0,o[r+29|0]=0,o[r+30|0]=0,o[r+31|0]=0,o[r+32|0]=0,o[r+33|0]=0,o[r+34|0]=0,o[r+35|0]=0,o[r+36|0]=0,s[n+376>>2]=0,s[n+368>>2]=0,s[n+372>>2]=0;break r;case 2:break n;default:break t}n=ur(440),s[n>>2]=8364,We(n+4|0,0,80),s[n+96>>2]=0,s[n+100>>2]=0,s[n+92>>2]=-1,s[n+84>>2]=-1,s[n+88>>2]=-1,s[n+104>>2]=0,s[n+108>>2]=0,s[n+112>>2]=0,s[n+116>>2]=0,s[n+120>>2]=0,s[n+124>>2]=0,s[n+128>>2]=0,s[n+132>>2]=0,s[n+136>>2]=0,s[n+140>>2]=0,s[n+144>>2]=0,s[n+148>>2]=0,s[n+156>>2]=0,s[n+160>>2]=0,s[n+152>>2]=1065353216,s[n+164>>2]=0,s[n+168>>2]=0,s[n+172>>2]=0,s[n+176>>2]=0,s[n+180>>2]=0,s[n+184>>2]=0,s[n+188>>2]=0,s[n+192>>2]=0,s[n+196>>2]=0,s[n+200>>2]=0,s[n+204>>2]=0,s[n+208>>2]=0,s[n+212>>2]=-1,s[n+216>>2]=0,s[n+220>>2]=0,s[n+224>>2]=0,a[38+(r=n+232|0)>>1]=0,s[r>>2]=0,s[r+8>>2]=0,s[r+12>>2]=0,s[r+16>>2]=0,s[r+20>>2]=0,s[r+24>>2]=0,s[r+28>>2]=0,o[r+29|0]=0,o[r+30|0]=0,o[r+31|0]=0,o[r+32|0]=0,o[r+33|0]=0,o[r+34|0]=0,o[r+35|0]=0,o[r+36|0]=0,a[38+(r=n+272|0)>>1]=0,s[r>>2]=0,s[r+8>>2]=0,s[r+12>>2]=0,s[r+16>>2]=0,s[r+20>>2]=0,s[r+24>>2]=0,s[r+28>>2]=0,o[r+29|0]=0,o[r+30|0]=0,o[r+31|0]=0,o[r+32|0]=0,o[r+33|0]=0,o[r+34|0]=0,o[r+35|0]=0,o[r+36|0]=0,s[(r=n+312|0)>>2]=0,s[r+4>>2]=0,o[r+5|0]=0,o[r+6|0]=0,o[r+7|0]=0,o[r+8|0]=0,o[r+9|0]=0,o[r+10|0]=0,o[r+11|0]=0,o[r+12|0]=0,a[38+(r=n+328|0)>>1]=0,s[r>>2]=0,s[r+8>>2]=0,s[r+12>>2]=0,s[r+16>>2]=0,s[r+20>>2]=0,s[r+24>>2]=0,s[r+28>>2]=0,o[r+29|0]=0,o[r+30|0]=0,o[r+31|0]=0,o[r+32|0]=0,o[r+33|0]=0,o[r+34|0]=0,o[r+35|0]=0,o[r+36|0]=0,s[n+392>>2]=0,s[n+396>>2]=0,s[n+384>>2]=0,s[n+388>>2]=0,s[n+376>>2]=0,s[n+380>>2]=0,s[n+368>>2]=0,s[n+372>>2]=0,s[n+416>>2]=0,s[n+420>>2]=0,s[n+408>>2]=2,s[n+412>>2]=7,s[n+400>>2]=-1,s[n+404>>2]=-1,s[n+424>>2]=0,s[n+428>>2]=0,s[n+432>>2]=0,s[n+436>>2]=0}if(r=s[e+48>>2],s[e+48>>2]=n,!r)break e;vn[s[s[r>>2]+4>>2]](r)}if(!(n=s[e+48>>2]))return 0}e=0|vn[s[s[n>>2]+8>>2]](n,e)}else e=0;return 0|e},function(e,t){return t|=0,e=s[48+(e|=0)>>2],0|vn[s[s[e>>2]+20>>2]](e,t)},function(e){return e=s[48+(e|=0)>>2],0|vn[s[s[e>>2]+28>>2]](e)},function(e){return e=s[48+(e|=0)>>2],0|vn[s[s[e>>2]+36>>2]](e)},function(e,t){return t|=0,e=s[48+(e|=0)>>2],0|vn[s[s[e>>2]+12>>2]](e,t)},function(e,t){return t|=0,e=s[48+(e|=0)>>2],0|vn[s[s[e>>2]+16>>2]](e,t)},function(e){return e=s[48+(e|=0)>>2],0|vn[s[s[e>>2]+24>>2]](e)},ke,function(e){ee(ke(e|=0))},Dr,nt,ot,z,function(e){var t,r=0,n=0,i=0,c=0,l=0,p=0,m=0,b=0,v=0,g=0,A=0,_=0,x=0,y=0,k=0,w=0,C=0,M=0,I=0,S=0,R=0,E=0,P=0,B=0,D=0,O=0,z=0,F=0,G=0;if(N=t=N+-64|0,s[132+(e|=0)>>2]=0,s[e+148>>2]){if(r=s[e+144>>2])for(;c=s[r>>2],ee(r),r=c,c;);if(r=0,s[e+144>>2]=0,c=s[e+140>>2]){if(c-1>>>0>=3)for(m=-4&c;s[(n=r<<2)+s[e+136>>2]>>2]=0,s[s[e+136>>2]+(4|n)>>2]=0,s[s[e+136>>2]+(8|n)>>2]=0,s[s[e+136>>2]+(12|n)>>2]=0,r=r+4|0,(0|m)!=(0|(i=i+4|0)););if(c&=3)for(;s[s[e+136>>2]+(r<<2)>>2]=0,r=r+1|0,(0|c)!=(0|(x=x+1|0)););}s[e+148>>2]=0}if(wt(1,t+60|0,s[s[e+4>>2]+32>>2])&&(s[e+156>>2]=s[t+60>>2],wt(1,t+56|0,s[s[e+4>>2]+32>>2])&&!((i=s[t+56>>2])>>>0>1431655765|u[e+156>>2]>h(i,3)>>>0)&&(c=s[s[e+4>>2]+32>>2],n=s[c+8>>2],!((0|(x=s[c+12>>2]))<=(0|(r=s[c+20>>2]))&(l=n)>>>0<=(n=s[c+16>>2])>>>0|(0|r)>(0|x))&&(x=d[n+s[c>>2]|0],r=(n=n+1|0)?r:r+1|0,s[c+16>>2]=n,s[c+20>>2]=r,wt(1,t+52|0,c)&&!((_=s[t+52>>2])>>>0>i>>>0|i>>>0>_+((_>>>0)/3|0)>>>0)&&wt(1,t+48|0,s[s[e+4>>2]+32>>2])&&!((c=s[t+48>>2])>>>0>_>>>0)&&(s[e+28>>2]=s[e+24>>2],_t(n=ur(88)),r=s[e+8>>2],s[e+8>>2]=n,(!r||(Pt(r),s[e+8>>2]))&&(s[e+164>>2]=s[e+160>>2],Et(e+160|0,i),s[e+176>>2]=s[e+172>>2],Et(e+172|0,i),s[e- -64>>2]=0,s[e+92>>2]=-1,s[e+84>>2]=-1,s[e+88>>2]=-1,s[e+40>>2]=s[e+36>>2],s[e+52>>2]=s[e+48>>2],s[e+76>>2]=s[e+72>>2],Dt(O=e+216|0),J(O,x),et(s[e+8>>2],i,c+s[e+156>>2]|0)&&(r=s[e+156>>2],o[t+8|0]=1,He(e+120|0,r+c|0,t+8|0),-1!=(0|ue(e,s[s[e+4>>2]+32>>2]))))))))){At(c=e+232|0,e),s[e+372>>2]=x,a[38+(y=t+8|0)>>1]=0,s[y>>2]=0,s[y+8>>2]=0,s[y+12>>2]=0,s[y+16>>2]=0,s[y+20>>2]=0,s[y+24>>2]=0,s[y+28>>2]=0,o[y+29|0]=0,o[y+30|0]=0,o[y+31|0]=0,o[y+32|0]=0,o[y+33|0]=0,o[y+34|0]=0,o[y+35|0]=0,o[y+36|0]=0,r=0,N=x=N-16|0,i=s[c+4>>2],s[c+40>>2]=s[c>>2],s[c+44>>2]=i,i=s[c+36>>2],s[c+72>>2]=s[c+32>>2],s[c+76>>2]=i,n=s[c+28>>2],s[(i=c- -64|0)>>2]=s[c+24>>2],s[i+4>>2]=n,i=s[c+20>>2],s[c+56>>2]=s[c+16>>2],s[c+60>>2]=i,i=s[c+12>>2],s[c+48>>2]=s[c+8>>2],s[c+52>>2]=i,$t(c+40|0,1,x+8|0)&&(i=s[c+44>>2],s[c>>2]=s[c+40>>2],s[c+4>>2]=i,i=s[c+76>>2],s[c+32>>2]=s[c+72>>2],s[c+36>>2]=i,i=s[c+68>>2],s[c+24>>2]=s[c+64>>2],s[c+28>>2]=i,m=n=s[c+60>>2],i=s[c+56>>2],s[c+16>>2]=i,s[c+20>>2]=n,l=s[c+52>>2],n=s[c+48>>2],s[c+8>>2]=n,s[c+12>>2]=l,p=n-i|0,(0|(g=s[x+12>>2]))==(0|(l=l-((n>>>0<i>>>0)+m|0)|0))&p>>>0>=(n=s[x+8>>2])>>>0|l>>>0>g>>>0)&&(l=n+i|0,i=m+g|0,s[c+16>>2]=l,s[c+20>>2]=n>>>0>l>>>0?i+1|0:i,Ne(c+80|0,c)&&Qe(c)&&(r=s[c+4>>2],s[y>>2]=s[c>>2],s[y+4>>2]=r,r=s[c+36>>2],s[y+32>>2]=s[c+32>>2],s[y+36>>2]=r,r=s[c+28>>2],s[y+24>>2]=s[c+24>>2],s[y+28>>2]=r,r=s[c+20>>2],s[y+16>>2]=s[c+16>>2],s[y+20>>2]=r,r=s[c+12>>2],s[y+8>>2]=s[c+8>>2],s[y+12>>2]=r,r=1)),N=x+16|0;e:if(r){i=0,c=0,r=0,x=0,N=g=N-96|0,s[g+72>>2]=0,s[g+64>>2]=0,s[g+68>>2]=0,s[g+48>>2]=0,s[g+52>>2]=0,s[g+40>>2]=0,s[g+44>>2]=0,s[g+56>>2]=1065353216,s[g+32>>2]=0,s[g+24>>2]=0,s[g+28>>2]=0,b=1,m=e,I=s[e+124>>2];t:{r:{n:{i:{o:{a:{s:{c:if(!((0|_)<=0)){for(z=s[m+216>>2]!=s[m+220>>2];;){C=(l=C)+1|0;l:{d:{f:{u:{p:{m:{h:{b:{v:{g:{A:if(d[m+308|0]){_:{if(!((e=(p=s[m+296>>2])+((n=s[m+304>>2])>>>3|0)|0)>>>0>=(A=s[m+300>>2])>>>0)&&(v=d[0|e],e=n+1|0,s[m+304>>2]=e,v>>>(7&n)&1))switch((k=p+(v=e>>>3|0)|0)>>>0>=A>>>0?(n=e,e=0):(k=d[0|k],n=n+2|0,s[m+304>>2]=n,v=n>>>3|0,e=k>>>(7&e)&1),(p=p+v|0)>>>0<A>>>0?(p=d[0|p],s[m+304>>2]=n+1,n=p>>>(7&n)<<1&2):n=0,(e=(e|n)<<1)-1|0){case 0:case 2:case 4:break n;case 5:break g;case 1:case 3:break _;default:break A}if((0|r)==(0|c)){n=-1;break s}v=-1,p=s[m+8>>2],k=s[p+24>>2],e=-1,-1!=(0|(n=s[(M=c-4|0)>>2]))&&(e=-1,-1!=(0|(b=((b=n+1|0)>>>0)%3|0?b:n-2|0))&&(e=s[s[p>>2]+(b<<2)>>2])),-1!=(0|(i=s[k+(e<<2)>>2]))&&(v=((b=i+1|0)>>>0)%3|0?b:i-2|0),i=s[p+12>>2],b=(l=h(l,3))+1|0,s[i+(n<<2)>>2]=b,s[(R=b<<2)+i>>2]=n,A=l+2|0,s[i+(v<<2)>>2]=A,s[(E=A<<2)+i>>2]=v,b=-1,i=-1;x:if(-1!=(0|n)){if((n>>>0)%3|0)n=n-1|0;else if(i=-1,-1==(0|(n=n+2|0)))break x;i=s[s[p>>2]+(n<<2)>>2]}if(-1!=(0|v)&&-1!=(0|(n=((n=v+1|0)>>>0)%3|0?n:v-2|0))&&(b=s[s[p>>2]+(n<<2)>>2]),n=-1,(0|e)==(0|i)|(0|e)==(0|b))break s;n=s[p>>2],s[n+(l<<2)>>2]=e,s[n+R>>2]=b,s[n+E>>2]=i,-1!=(0|i)&&(s[k+(i<<2)>>2]=A),i=s[m+120>>2]+(e>>>3&536870908)|0,n=s[i>>2],F=i,G=Mr(e)&n,s[F>>2]=G,s[M>>2]=l,i=r;break l}if((0|r)==(0|c)){n=-1;break s}if(i=s[m+8>>2],n=s[i+12>>2],R=(v=(p=h(l,3))+((k=5==(1|e))?2:1)|0)<<2,e=s[(E=c-4|0)>>2],s[n+R>>2]=e,s[n+(e<<2)>>2]=v,pt(i+24|0),n=-1,M=s[m+8>>2],A=s[M+24>>2],(0|I)<s[M+28>>2]-A>>2)break s;if(n=s[M>>2],M=((i=s[i+28>>2]-s[i+24>>2]|0)>>2)-1|0,s[n+R>>2]=M,i&&(s[A+(M<<2)>>2]=v),v=k?p:p+2|0,k=n+(p+k<<2)|0,-1!=(0|e)){_:{x:{if((e>>>0)%3|0)i=e-1|0;else if(-1==(0|(i=e+2|0)))break x;if(i=s[n+(i<<2)>>2],s[n+(v<<2)>>2]=i,-1==(0|i))break _;s[A+(i<<2)>>2]=v;break _}s[n+(v<<2)>>2]=-1}i=-1,-1!=(0|(e=((v=e+1|0)>>>0)%3|0?v:e-2|0))&&(i=s[n+(e<<2)>>2])}else s[n+(v<<2)>>2]=-1,i=-1;s[k>>2]=i,s[E>>2]=p,i=r;break v}if((0|r)==(0|c)){n=-1;break s}A=s[(e=c-4|0)>>2],s[g+68>>2]=e;A:if(v=s[g+44>>2])if((p=Tr(v)>>>0>1)?v>>>0>(i=l)>>>0||(i=(l>>>0)%(v>>>0)|0):i=l&v+2147483647,n=s[s[g+40>>2]+(i<<2)>>2])if(n=s[n>>2]){_:{if(!p){for(p=v-1|0;;){x:{if((0|(v=s[n+4>>2]))!=(0|l)){if((p&v)==(0|i))break x;c=e;break A}if((0|l)==s[n+8>>2])break _}if(!(n=s[n>>2]))break}c=e;break A}for(;;){x:{if((0|(p=s[n+4>>2]))!=(0|l)){if(p>>>0>=v>>>0&&(p=(p>>>0)%(v>>>0)|0),(0|i)==(0|p))break x;c=e;break A}if((0|l)==s[n+8>>2])break _}if(!(n=s[n>>2]))break}c=e;break A}if((0|e)==(0|S)){if((c=1+(i=(e=S-r|0)>>2)|0)>>>0>=1073741824)break h;if(w=e>>1,c=i>>>0<536870911?c>>>0>w>>>0?c:w:1073741823){if(c>>>0>=1073741824)break r;w=ur(c<<2)}else w=0;s[(i=w+(i<<2)|0)>>2]=s[n+12>>2],S=(c<<2)+w|0,c=i+4|0,(0|e)>0&&ye(w,r,e),s[g+72>>2]=S,s[g+68>>2]=c,s[g+64>>2]=w,r&&ee(r)}else s[e>>2]=s[n+12>>2],s[g+68>>2]=c}else c=e;else c=e;else c=e;if((0|c)==(0|w))break b;if(i=-1==(0|(e=s[(R=c-4|0)>>2])),r=s[m+8>>2],!i&-1!=s[s[r+12>>2]+(e<<2)>>2])break b;if(p=s[r+12>>2],-1!=(0|A)&-1!=s[p+(A<<2)>>2])break b;if(M=(l=h(l,3))+2|0,s[p+(e<<2)>>2]=M,s[(k=M<<2)+p>>2]=e,n=l+1|0,s[p+(A<<2)>>2]=n,s[(E=n<<2)+p>>2]=A,i)break m;if((e>>>0)%3|0){b=e-1|0;break u}if(-1!=(0|(b=e+2|0)))break u;v=s[r>>2],i=-1;break f}if(pt((v=s[m+8>>2])+24|0),n=-1,p=s[m+8>>2],e=h(l,3),M=(v=(A=s[v+28>>2]-s[v+24>>2]|0)>>2)-1|0,s[s[p>>2]+(e<<2)>>2]=M,pt(p+24|0),k=e+1|0,s[s[p>>2]+(k<<2)>>2]=(s[p+28>>2]-s[p+24>>2]>>2)-1,pt((p=s[m+8>>2])+24|0),R=e+2|0,s[s[p>>2]+(R<<2)>>2]=(s[p+28>>2]-s[p+24>>2]>>2)-1,E=s[m+8>>2],p=s[E+24>>2],(0|I)<s[E+28>>2]-p>>2)break s;g:{if(A){if(s[p+(M<<2)>>2]=e,n=0,-4!=(0|A)&&(s[p+(v<<2)>>2]=k,-1==(0|(n=v+1|0))))break g}else s[p+(v<<2)>>2]=k,n=1;s[p+(n<<2)>>2]=R}if((0|c)==(0|S)){if((c=1+(n=(r=c-i|0)>>2)|0)>>>0>=1073741824)break p;if(w=r>>1,c=n>>>0<536870911?c>>>0>w>>>0?c:w:1073741823){if(c>>>0>=1073741824)break r;w=ur(c<<2)}else w=0;s[(n=w+(n<<2)|0)>>2]=e,S=(c<<2)+w|0,c=n+4|0,(0|r)>0&&ye(w,i,r),s[g+72>>2]=S,s[g+68>>2]=c,s[g+64>>2]=w,i&&ee(i),i=r=w}else s[c>>2]=e,c=c+4|0,s[g+68>>2]=c}if((0|(n=s[m+40>>2]))==s[m+36>>2])break l;for(l=_+(-1^l)|0,p=c-4|0;;){if((e=s[n-8>>2])>>>0>l>>>0)break b;if((0|e)!=(0|l))break l;if(v=d[n-4|0],n=s[(e=n-12|0)>>2],s[m+40>>2]=e,(0|n)<0)break b;e=s[p>>2],s[g+20>>2]=_+(-1^n),n=g+20|0,s[g+88>>2]=n,te(g,g+40|0,n,g+88|0),k=s[g>>2];v:if(1&v){if(n=-1,-1==(0|e))break v;n=((n=e+1|0)>>>0)%3|0?n:e-2|0}else n=-1,-1!=(0|e)&&(n=e-1|0,(e>>>0)%3|0||(n=e+2|0));if(s[k+12>>2]=n,(0|(n=s[m+40>>2]))==s[m+36>>2])break}break l}if(n=-1,1&b)break s;break c}nn(),T()}i=-1,v=s[r>>2],s[v+(l<<2)>>2]=-1,n=-1;break d}nn(),T()}v=s[r>>2],i=s[v+(b<<2)>>2]}s[(l<<2)+v>>2]=i,n=-1,-1!=(0|(e=((b=e+1|0)>>>0)%3|0?b:e-2|0))&&(n=s[(e<<2)+v>>2])}if(s[v+E>>2]=n,-1!=(0|A)){d:{f:{if((A>>>0)%3|0)n=A-1|0;else if(-1==(0|(n=A+2|0)))break f;if(e=s[(n<<2)+v>>2],s[v+k>>2]=e,-1==(0|e))break d;s[s[r+24>>2]+(e<<2)>>2]=M;break d}s[v+k>>2]=-1}b=-1,n=-1,-1!=(0|(e=((e=A+1|0)>>>0)%3|0?e:A-2|0))&&(b=s[(e<<2)+v>>2],n=e)}else s[v+k>>2]=-1,b=-1,n=-1;e=(r=s[r+24>>2])+(b<<2)|0,-1!=(0|i)&&(s[r+(i<<2)>>2]=s[e>>2]);d:if(-1!=(0|n))for(;;){if(s[(n<<2)+v>>2]=i,-1==(0|(r=((r=n+1|0)>>>0)%3|0?r:n-2|0)))break d;if(-1==(0|(r=s[p+(r<<2)>>2])))break d;if(-1==(0|(n=((n=r+1|0)>>>0)%3|0?n:r-2|0)))break}s[e>>2]=-1;d:if(!z){if((0|P)==(0|B)){f:{if((e=1+(n=(r=B-x|0)>>2)|0)>>>0<1073741824){if(i=r>>1,i=n>>>0<536870911?e>>>0>i>>>0?e:i:1073741823){if(i>>>0>=1073741824)break f;e=ur(i<<2)}else e=0;s[(n=e+(n<<2)|0)>>2]=b,B=e+(i<<2)|0,P=n+4|0,(0|r)>0&&ye(e,x,r),s[g+32>>2]=B,s[g+28>>2]=P,s[g+24>>2]=e,x&&ee(x),x=e;break d}nn(),T()}break r}s[P>>2]=b,P=P+4|0,s[g+28>>2]=P}s[R>>2]=l,i=r=w}if(b=(0|_)>(0|C),(0|_)==(0|C))break}C=_}if(n=-1,b=s[m+8>>2],!((0|I)<s[b+28>>2]-s[b+24>>2]>>2)){if((0|c)!=(0|w)){for(e=m+60|0,k=m+312|0;;){A=s[(c=c-4|0)>>2],s[g+68>>2]=c;c:if(Gt(k)){if(I=s[m+8>>2],S=s[I>>2],((s[I+4>>2]-S>>2>>>0)/3|0)<=(0|C))break s;if(r=-1,i=-1,_=s[I+24>>2],l=-1,-1!=(0|A)&&(l=-1,-1!=(0|(p=((p=A+1|0)>>>0)%3|0?p:A-2|0))&&(l=s[S+(p<<2)>>2])),-1!=(0|(l=s[_+((p=l)<<2)>>2]))&&-1!=(0|(l=((b=l+1|0)>>>0)%3|0?b:l-2|0))&&(-1!=(0|(r=((r=l+1|0)>>>0)%3|0?r:l-2|0))&&(i=s[S+(r<<2)>>2]),r=l),b=-1,v=-1,l=-1,-1!=(0|(_=s[_+(i<<2)>>2]))&&(l=-1,-1!=(0|(_=((B=_+1|0)>>>0)%3|0?B:_-2|0))&&(-1!=(0|(l=((l=_+1|0)>>>0)%3|0?l:_-2|0))&&(v=s[S+(l<<2)>>2]),l=_)),I=s[I+12>>2],_=h(C,3),s[I+(B=_<<2)>>2]=A,s[I+(A<<2)>>2]=_,s[(M=(A=_+1|0)<<2)+I>>2]=r,s[I+(r<<2)>>2]=A,s[(z=(r=_+2|0)<<2)+I>>2]=l,s[I+(l<<2)>>2]=r,s[S+B>>2]=i,s[(l=S+M|0)>>2]=v,s[(v=S+z|0)>>2]=p,p=A>>>0<_>>>0?-1:i,i=s[m+120>>2],I=s[(S=(p>>>3&536870908)+i|0)>>2],F=S,G=Mr(p)&I,s[F>>2]=G,b=-1!=(0|A)?s[l>>2]:b,p=s[(l=i+(b>>>3&536870908)|0)>>2],F=l,G=Mr(b)&p,s[F>>2]=G,b=-1,b=-1!=(0|r)?s[v>>2]:b,i=s[(r=i+(b>>>3&536870908)|0)>>2],F=r,G=Mr(b)&i,s[F>>2]=G,(0|(b=s[m+64>>2]))==(r=s[m+68>>2])<<5){if((b+1|0)<0)break a;at(e,r=b>>>0<=1073741822?(r<<=6)>>>0<(i=b+32&-32)>>>0?i:r:2147483647),b=s[m+64>>2]}if(C=C+1|0,s[m+64>>2]=b+1,r=s[m+60>>2]+(b>>>3&536870908)|0,s[r>>2]=s[r>>2]|1<<b,(0|(r=s[m+76>>2]))!=s[m+80>>2]){s[r>>2]=_,s[m+76>>2]=r+4;break c}if((r=1+(b=(l=r-(i=s[m+72>>2])|0)>>2)|0)>>>0>=1073741824)break o;if(p=l>>1,p=b>>>0<536870911?r>>>0>p>>>0?r:p:1073741823){if(p>>>0>=1073741824)break r;r=ur(p<<2)}else r=0;if(s[(b=r+(b<<2)|0)>>2]=_,(0|l)>0&&ye(r,i,l),s[m+80>>2]=r+(p<<2),s[m+76>>2]=b+4,s[m+72>>2]=r,!i)break c;ee(i)}else{if((0|(r=s[m+64>>2]))==(i=s[m+68>>2])<<5){if((r+1|0)<0)break a;at(e,r=r>>>0<=1073741822?(r=r+32&-32)>>>0>(i<<=6)>>>0?r:i:2147483647),r=s[m+64>>2]}if(s[m+64>>2]=r+1,i=s[m+60>>2]+(r>>>3&536870908)|0,l=s[i>>2],F=i,G=Mr(r)&l,s[F>>2]=G,(0|(r=s[m+76>>2]))==s[m+80>>2]){if((r=1+(p=(l=r-(i=s[m+72>>2])|0)>>2)|0)>>>0>=1073741824)break o;if(_=l>>1,_=p>>>0<536870911?r>>>0>_>>>0?r:_:1073741823){if(_>>>0>=1073741824)break i;r=ur(_<<2)}else r=0;s[(p=r+(p<<2)|0)>>2]=A,(0|l)>0&&ye(r,i,l),s[m+80>>2]=r+(_<<2),s[m+76>>2]=p+4,s[m+72>>2]=r,i&&ee(i)}else s[r>>2]=A,s[m+76>>2]=r+4}if((0|c)==(0|w))break}b=s[m+8>>2]}if(((s[b+4>>2]-s[b>>2]>>2>>>0)/3|0)==(0|C))if(C=s[b+24>>2],n=s[b+28>>2]-C>>2,(0|x)!=(0|P))for(i=x;;){if(e=s[i>>2],-1==s[(v=((c=n-1|0)<<2)+C|0)>>2])for(;c=n-2|0,n=n-1|0,-1==s[(v=(c<<2)+C|0)>>2];);if(e>>>0<=c>>>0){if(s[g>>2]=b,C=s[v>>2],o[g+12|0]=1,s[g+8>>2]=C,s[g+4>>2]=C,-1!=(0|C))for(;s[s[b>>2]+(C<<2)>>2]=e,Fe(g),b=s[m+8>>2],-1!=(0|(C=s[g+8>>2])););r=(C=s[b+24>>2])+(c<<2)|0,-1!=(0|e)&&(s[(e<<2)+C>>2]=s[r>>2]),s[r>>2]=-1,r=1<<e,e=(l=s[m+120>>2])+(e>>>3&536870908)|0,l=l+(c>>>3&536870908)|0,c=1<<c,s[l>>2]&c?r|=s[e>>2]:r=s[e>>2]&(-1^r),s[e>>2]=r,s[l>>2]=s[l>>2]&(-1^c),n=n-1|0}if((0|P)==(0|(i=i+4|0)))break}else x=P}}if(x&&ee(x),c=s[g+48>>2])for(;e=s[c>>2],ee(c),c=e,e;);e=s[g+40>>2],s[g+40>>2]=0,e&&ee(e),w&&(s[g+68>>2]=w,ee(w)),N=g+96|0;break t}nn(),T()}nn(),T()}qt(1326)}T()}qt(1326),T()}if(-1!=(0|n)){c=(e=s[y+16>>2])+s[y>>2]|0,r=(r=s[y+8>>2])-e|0,e=s[s[m+4>>2]+32>>2],a[e+38>>1]=f[e+38>>1],s[e>>2]=c,s[e+16>>2]=0,s[e+20>>2]=0,s[e+8>>2]=r,s[e+12>>2]=0;t:if(s[m+216>>2]!=s[m+220>>2]&&(e=s[m+8>>2],s[e+4>>2]!=s[e>>2])){for(r=0;;){if(fe(m,r)){if(r=r+3|0,e=s[m+8>>2],r>>>0<s[e+4>>2]-s[e>>2]>>2>>>0)continue;break t}break}break e}if(d[m+308|0]&&(o[m+308|0]=0,c=s[m+292>>2],e=0,i=(e=(r=s[m+304>>2]+7|0)>>>0<7?1:e)>>>3|0,e=(r=e<<29|r>>>3)+s[m+288>>2]|0,i=c+i|0,s[m+288>>2]=e,s[m+292>>2]=e>>>0<r>>>0?i+1|0:i),(0|(r=s[m+216>>2]))!=s[m+220>>2])for(;;){if(Ee(4+((e=h(D,144))+r|0)|0,s[m+8>>2]),x=s[O>>2],(0|(r=s[132+(c=e+x|0)>>2]))!=(0|(c=s[c+136>>2])))for(;De(4+(e+x|0)|0,s[r>>2]),x=s[O>>2],(0|c)!=(0|(r=r+4|0)););if(re(4+(e+x|0)|0),D=D+1|0,r=s[m+216>>2],!(D>>>0<(s[m+220>>2]-r|0)/144>>>0))break}if(e=s[m+8>>2],mt(m+184|0,s[e+28>>2]-s[e+24>>2]>>2),(0|(x=s[m+216>>2]))!=s[m+220>>2])for(r=0;e=h(r,144)+x|0,c=s[e+60>>2]-s[e+56>>2]>>2,i=e+104|0,e=s[m+8>>2],mt(i,(0|(e=s[e+28>>2]-s[e+24>>2]>>2))>(0|c)?e:c),r=r+1|0,x=s[m+216>>2],r>>>0<(s[m+220>>2]-x|0)/144>>>0;);D=L(m,n)}}}return N=t- -64|0,0|D},Jr,Wr,jr,ve,function(e){ee(ve(e|=0))},Dr,nt,ot,z,function(e){var t,r=0,n=0,i=0,c=0,l=0,p=0,m=0,b=0,v=0,g=0,A=0,_=0,x=0,y=0,k=0,w=0,C=0,M=0,I=0,S=0,R=0,P=0,B=0,D=0,O=0,z=0,F=0,G=0,U=0,V=0,j=0;if(N=t=N+-64|0,s[132+(e|=0)>>2]=0,s[e+148>>2]){if(r=s[e+144>>2])for(;m=s[r>>2],ee(r),r=m;);if(r=0,s[e+144>>2]=0,m=s[e+140>>2]){if(m-1>>>0>=3)for(y=-4&m;s[(p=r<<2)+s[e+136>>2]>>2]=0,s[s[e+136>>2]+(4|p)>>2]=0,s[s[e+136>>2]+(8|p)>>2]=0,s[s[e+136>>2]+(12|p)>>2]=0,r=r+4|0,(0|y)!=(0|(g=g+4|0)););if(m&=3)for(;s[s[e+136>>2]+(r<<2)>>2]=0,r=r+1|0,(0|m)!=(0|(n=n+1|0)););}s[e+148>>2]=0}e:{if(wt(1,t+60|0,s[s[e+4>>2]+32>>2])&&(s[e+156>>2]=s[t+60>>2],wt(1,t+56|0,s[s[e+4>>2]+32>>2])&&!((n=s[t+56>>2])>>>0>1431655765|u[e+156>>2]>h(n,3)>>>0)&&(m=s[s[e+4>>2]+32>>2],p=s[m+8>>2],!((0|(y=s[m+12>>2]))<=(0|(r=s[m+20>>2]))&(i=p)>>>0<=(p=s[m+16>>2])>>>0|(0|r)>(0|y))&&(y=d[p+s[m>>2]|0],r=(p=p+1|0)?r:r+1|0,s[m+16>>2]=p,s[m+20>>2]=r,wt(1,t+52|0,m)&&!((M=s[t+52>>2])>>>0>n>>>0|n>>>0>M+((M>>>0)/3|0)>>>0)&&wt(1,t+48|0,s[s[e+4>>2]+32>>2])&&!((r=s[t+48>>2])>>>0>M>>>0)&&(s[e+28>>2]=s[e+24>>2],_t(p=ur(88)),m=s[e+8>>2],s[e+8>>2]=p,(!m||(Pt(m),s[e+8>>2]))&&(s[e+164>>2]=s[e+160>>2],Et(e+160|0,n),s[e+176>>2]=s[e+172>>2],Et(e+172|0,n),s[e- -64>>2]=0,s[e+92>>2]=-1,s[e+84>>2]=-1,s[e+88>>2]=-1,s[e+40>>2]=s[e+36>>2],s[e+52>>2]=s[e+48>>2],s[e+76>>2]=s[e+72>>2],Dt(F=e+216|0),J(F,y),et(s[e+8>>2],n,r+s[e+156>>2]|0)&&(m=s[e+156>>2],o[t+8|0]=1,He(e+120|0,r+m|0,t+8|0),-1!=(0|ue(e,s[s[e+4>>2]+32>>2]))))))))){At(l=e+232|0,e),V=e,j=0|vn[s[s[e>>2]+36>>2]](e),s[V+380>>2]=j,s[e+372>>2]=y,s[e+384>>2]=r+s[e+156>>2],a[38+(r=t+8|0)>>1]=0,s[r>>2]=0,s[r+8>>2]=0,s[r+12>>2]=0,s[r+16>>2]=0,s[r+20>>2]=0,s[r+24>>2]=0,s[r+28>>2]=0,o[r+29|0]=0,o[r+30|0]=0,o[r+31|0]=0,o[r+32|0]=0,o[r+33|0]=0,o[r+34|0]=0,o[r+35|0]=0,o[r+36|0]=0,G=r,y=r,p=0,N=c=N-16|0;t:if(Ne(l+80|0,l)&&Qe(l)&&(r=s[l+4>>2],s[y>>2]=s[l>>2],s[y+4>>2]=r,r=s[l+36>>2],s[y+32>>2]=s[l+32>>2],s[y+36>>2]=r,r=s[l+28>>2],s[y+24>>2]=s[l+24>>2],s[y+28>>2]=r,r=s[l+20>>2],s[y+16>>2]=s[l+16>>2],s[y+20>>2]=r,r=s[l+12>>2],s[y+8>>2]=s[l+8>>2],s[y+12>>2]=r,s[l+176>>2]=2,s[l+180>>2]=7,!((0|(r=s[l+152>>2]))<0))){if(s[c+12>>2]=0,p=2,g=s[l+156>>2],(m=s[l+160>>2]-g>>2)>>>0<r>>>0?(xe(l+156|0,r-m|0,c+12|0),p=s[l+176>>2],n=s[l+180>>2]):(n=7,r>>>0>=m>>>0||(s[l+160>>2]=g+(r<<2))),m=l+184|0,(n=1+(n-p|0)|0)>>>0>(g=((r=s[l+188>>2])-(p=s[l+184>>2])|0)/12|0)>>>0){if((r=n-g|0)>>>0<=((i=s[m+8>>2])-(p=s[m+4>>2])|0)/12>>>0)r&&(p=We(p,0,r=h((h(r,12)-12>>>0)/12|0,12)+12|0)+r|0),s[m+4>>2]=p;else{r:{n:{i:{if((n=(k=(p-(g=s[m>>2])|0)/12|0)+r|0)>>>0<357913942){if(w=(i=(i-g|0)/12|0)<<1,i=i>>>0<178956970?n>>>0>w>>>0?n:w:357913941){if(i>>>0>=357913942)break i;b=ur(h(i,12))}if(k=(r=We(n=h(k,12)+b|0,0,k=h((h(r,12)-12>>>0)/12|0,12)+12|0))+k|0,b=h(i,12)+b|0,(0|p)==(0|g))break n;for(;p=p-12|0,s[(n=n-12|0)>>2]=s[p>>2],s[n+4>>2]=s[p+4>>2],s[n+8>>2]=s[p+8>>2],s[p+8>>2]=0,s[p>>2]=0,s[p+4>>2]=0,(0|p)!=(0|g););if(s[m+8>>2]=b,r=s[m+4>>2],s[m+4>>2]=k,p=s[m>>2],s[m>>2]=n,(0|r)==(0|p))break r;for(;(g=s[(n=r-12|0)>>2])&&(s[r-8>>2]=g,ee(g)),(0|(r=n))!=(0|p););break r}break e}qt(1326),T()}s[m+8>>2]=b,s[m+4>>2]=k,s[m>>2]=r}p&&ee(p)}n=s[l+188>>2]}else if(n>>>0>=g>>>0)n=r;else{if((0|r)!=(0|(n=p+h(n,12)|0)))for(;(g=s[(p=r-12|0)>>2])&&(s[r-8>>2]=g,ee(g)),(0|(r=p))!=(0|n););s[l+188>>2]=n}if(b=l+196|0,r=(n-(p=s[l+184>>2])|0)/12|0,i=s[l+196>>2],r>>>0>(g=s[l+200>>2]-i>>2)>>>0?(ct(b,r-g|0),p=s[l+184>>2],n=s[l+188>>2]):r>>>0>=g>>>0||(s[l+200>>2]=i+(r<<2)),(0|n)!=(0|p)){for(r=0;;){if(wt(1,c+8|0,y)&&(p=s[c+8>>2],n=s[l+148>>2],!(p>>>0>(s[n+4>>2]-s[n>>2]>>2>>>0)/3>>>0))){if(p&&(n=s[m>>2],w=h(r,12),i=s[(g=n+w|0)>>2],(k=s[g+4>>2]-i>>2)>>>0<p>>>0?(ct(g,p-k|0),n=s[m>>2]):p>>>0>=k>>>0||(s[g+4>>2]=i+(p<<2)),E(p,1,y,s[n+w>>2]),s[s[b>>2]+(r<<2)>>2]=p),p=1,(r=r+1|0)>>>0<(s[l+188>>2]-s[l+184>>2]|0)/12>>>0)continue;break t}break}p=0}else p=1}N=c+16|0;t:if(p){n=0,r=0,p=0,w=0,m=0,y=0,g=0,k=0,N=_=N-96|0,s[_+72>>2]=0,s[_+64>>2]=0,s[_+68>>2]=0,s[_+48>>2]=0,s[_+52>>2]=0,s[_+40>>2]=0,s[_+44>>2]=0,s[_+56>>2]=1065353216,s[_+32>>2]=0,s[_+24>>2]=0,s[_+28>>2]=0,b=1,l=e,P=s[e+124>>2];r:{n:{i:{o:if(!((0|M)<=0)){D=l+232|0,U=s[l+216>>2]!=s[l+220>>2];a:{for(;;){g=(e=g)+1|0;s:{c:{l:{if(-1!=(0|(i=s[l+404>>2]))){if(c=-1,v=s[l+428>>2]+(i<<2)|0,i=(A=s[v>>2])-1|0,s[v>>2]=i,(0|A)<=0)break i;if(v=s[s[s[l+416>>2]+h(s[l+404>>2],12)>>2]+(i<<2)>>2],i=s[8928+(v<<2)>>2],s[l+400>>2]=i,!v){if((0|n)==(0|m))break i;i=-1,b=s[l+8>>2],C=s[b+24>>2],r=-1,-1!=(0|(c=s[(I=n-4|0)>>2]))&&(r=-1,-1!=(0|(A=((A=c+1|0)>>>0)%3|0?A:c-2|0))&&(r=s[s[b>>2]+(A<<2)>>2])),-1!=(0|(v=s[C+(r<<2)>>2]))&&(i=((i=v+1|0)>>>0)%3|0?i:v-2|0),A=s[b+12>>2],e=(v=h(e,3))+1|0,s[A+(c<<2)>>2]=e,s[(R=e<<2)+A>>2]=c,x=v+2|0,s[A+(i<<2)>>2]=x,s[(B=x<<2)+A>>2]=i,A=-1,e=-1;d:if(-1!=(0|c)){if((c>>>0)%3|0)c=c-1|0;else if(e=-1,-1==(0|(c=c+2|0)))break d;e=s[s[b>>2]+(c<<2)>>2]}if(-1!=(0|i)&&-1!=(0|(c=((c=i+1|0)>>>0)%3|0?c:i-2|0))&&(A=s[s[b>>2]+(c<<2)>>2]),c=-1,(0|e)==(0|r)|(0|r)==(0|A))break i;c=s[b>>2],s[c+(v<<2)>>2]=r,s[c+R>>2]=A,s[c+B>>2]=e,-1!=(0|e)&&(s[C+(e<<2)>>2]=x),e=s[l+120>>2]+(r>>>3&536870908)|0,c=s[e>>2],V=e,j=Mr(r)&c,s[V>>2]=j,s[I>>2]=v,r=m,Ae(D,v);break s}d:switch(i-1|0){case 2:case 4:if((0|n)==(0|m))break i;if(i=s[l+8>>2],c=s[i+12>>2],I=(C=((x=3==(0|v))?2:1)+(v=h(e,3))|0)<<2,r=s[(R=n-4|0)>>2],s[c+I>>2]=r,s[c+(r<<2)>>2]=C,pt(i+24|0),c=-1,n=s[l+8>>2],A=s[n+24>>2],(0|P)<s[n+28>>2]-A>>2)break i;if(n=s[n>>2],i=((c=s[i+28>>2]-s[i+24>>2]|0)>>2)-1|0,s[n+I>>2]=i,c&&(s[A+(i<<2)>>2]=C),c=x?v:v+2|0,C=n+(v+x<<2)|0,-1!=(0|r)){f:{u:{if((r>>>0)%3|0)i=r-1|0;else if(-1==(0|(i=r+2|0)))break u;if(i=s[n+(i<<2)>>2],s[n+(c<<2)>>2]=i,-1==(0|i))break f;s[A+(i<<2)>>2]=c;break f}s[n+(c<<2)>>2]=-1}r=((i=r+1|0)>>>0)%3|0?i:r-2|0,i=-1,-1!=(0|r)&&(i=s[n+(r<<2)>>2])}else s[n+(c<<2)>>2]=-1,i=-1;s[C>>2]=i,s[R>>2]=v,r=m;break c;case 6:break l;case 0:break d;default:break i}if((0|r)==(0|n))break i;A=s[(p=n-4|0)>>2],s[_+68>>2]=p;d:if((x=s[_+44>>2])&&(c=s[_+40>>2],i=e&x+2147483647,(C=Tr(x)>>>0>1)&&(i=e,e>>>0<x>>>0||(i=(e>>>0)%(x>>>0)|0)),(c=s[c+((v=i)<<2)>>2])&&(c=s[c>>2]))){f:{if(!C){for(i=x-1|0;;){u:{if((0|(x=s[c+4>>2]))!=(0|e)){if((0|v)==(i&x))break u;break d}if((0|e)==s[c+8>>2])break f}if(!(c=s[c>>2]))break}break d}for(;;){u:{if((0|(i=s[c+4>>2]))!=(0|e)){if(i>>>0>=x>>>0&&(i=(i>>>0)%(x>>>0)|0),(0|i)==(0|v))break u;break d}if((0|e)==s[c+8>>2])break f}if(!(c=s[c>>2]))break}break d}if((0|p)==(0|S)){if((m=1+(i=(n=S-r|0)>>2)|0)>>>0>=1073741824)break e;if(p=n>>1,p=i>>>0<536870911?p>>>0<m>>>0?m:p:1073741823){if(p>>>0>=1073741824)break n;m=ur(p<<2)}else m=0;s[(i=m+(i<<2)|0)>>2]=s[c+12>>2],S=(p<<2)+m|0,p=i+4|0,(0|n)>0&&ye(m,r,n),s[_+72>>2]=S,s[_+68>>2]=p,s[_+64>>2]=m,r&&ee(r),r=m}else s[p>>2]=s[c+12>>2],s[_+68>>2]=n,p=n}if((0|r)==(0|p))break a;if(c=-1==(0|(n=s[(R=p-4|0)>>2])),v=s[l+8>>2],!c&-1!=s[s[v+12>>2]+(n<<2)>>2])break a;if(x=s[v+12>>2],-1!=(0|A)&-1!=s[x+(A<<2)>>2])break a;I=(C=h(e,3))+2|0,s[x+(n<<2)>>2]=I,s[(e=I<<2)+x>>2]=n,b=C+1|0,s[x+(A<<2)>>2]=b,s[x+(B=b<<2)>>2]=A;d:{f:{u:{if(!c){if((n>>>0)%3|0){i=n-1|0;break u}if(-1!=(0|(i=n+2|0)))break u;b=s[v>>2],i=-1;break f}i=-1,b=s[v>>2],s[b+(C<<2)>>2]=-1,c=-1;break d}b=s[v>>2],i=s[b+(i<<2)>>2]}s[(C<<2)+b>>2]=i,n=((c=n+1|0)>>>0)%3|0?c:n-2|0,c=-1,-1!=(0|n)&&(c=s[(n<<2)+b>>2])}if(s[b+B>>2]=c,-1!=(0|A)){d:{f:{if((A>>>0)%3|0)c=A-1|0;else if(-1==(0|(c=A+2|0)))break f;if(n=e+b|0,e=s[(c<<2)+b>>2],s[n>>2]=e,-1==(0|e))break d;s[s[v+24>>2]+(e<<2)>>2]=I;break d}s[e+b>>2]=-1}c=-1,n=-1,-1!=(0|(e=((e=A+1|0)>>>0)%3|0?e:A-2|0))&&(c=e,n=s[(e<<2)+b>>2])}else s[e+b>>2]=-1,c=-1,n=-1;I=(e=s[l+388>>2])+(A=i<<2)|0,B=e,e=n<<2,s[I>>2]=s[I>>2]+s[B+e>>2],e=(v=s[v+24>>2])+e|0,-1!=(0|i)&&(s[v+A>>2]=s[e>>2]);d:if(-1!=(0|c))for(;;){if(s[(c<<2)+b>>2]=i,-1==(0|(c=((v=c+1|0)>>>0)%3|0?v:c-2|0)))break d;if(-1==(0|(c=s[x+(c<<2)>>2])))break d;if(-1==(0|(c=((v=c+1|0)>>>0)%3|0?v:c-2|0)))break}s[e>>2]=-1;d:if(!U){if((0|k)==(0|O)){f:{if((y=1+(b=(e=O-w|0)>>2)|0)>>>0<1073741824){if(c=e>>1,c=b>>>0<536870911?c>>>0<y>>>0?y:c:1073741823){if(c>>>0>=1073741824)break f;y=ur(c<<2)}else y=0;s[(b=y+(b<<2)|0)>>2]=n,O=(c<<2)+y|0,k=b+4|0,(0|e)>0&&ye(y,w,e),s[_+32>>2]=O,s[_+28>>2]=k,s[_+24>>2]=y,w&&ee(w),w=y;break d}break e}break n}s[k>>2]=n,k=k+4|0,s[_+28>>2]=k}s[R>>2]=C,n=p,Ae(D,C);break s}s[l+400>>2]=7}if(pt((v=s[l+8>>2])+24|0),c=-1,i=s[l+8>>2],p=h(e,3),C=(v=(A=s[v+28>>2]-s[v+24>>2]|0)>>2)-1|0,s[s[i>>2]+(p<<2)>>2]=C,pt(i+24|0),x=p+1|0,s[s[i>>2]+(x<<2)>>2]=(s[i+28>>2]-s[i+24>>2]>>2)-1,pt((i=s[l+8>>2])+24|0),I=p+2|0,s[s[i>>2]+(I<<2)>>2]=(s[i+28>>2]-s[i+24>>2]>>2)-1,R=s[l+8>>2],i=s[R+24>>2],(0|P)<s[R+28>>2]-i>>2)break i;l:{if(A){if(s[i+(C<<2)>>2]=p,c=0,-4!=(0|A)&&(s[i+(v<<2)>>2]=x,-1==(0|(c=v+1|0))))break l}else s[i+(v<<2)>>2]=x,c=1;s[i+(c<<2)>>2]=I}if((0|n)==(0|S)){if((r=1+(i=(n=S-m|0)>>2)|0)>>>0>=1073741824)break e;if(c=n>>1,c=i>>>0<536870911?r>>>0>c>>>0?r:c:1073741823){if(c>>>0>=1073741824)break n;r=ur(c<<2)}else r=0;s[(i=r+(i<<2)|0)>>2]=p,S=(c<<2)+r|0,p=i+4|0,(0|n)>0&&ye(r,m,n),s[_+72>>2]=S,s[_+68>>2]=p,s[_+64>>2]=r,m&&ee(m),m=r}else s[n>>2]=p,p=n+4|0,s[_+68>>2]=p}Ae(D,s[p-4>>2]);c:if((0|(c=s[l+40>>2]))!=s[l+36>>2])for(i=M+(-1^e)|0,v=p-4|0;;){if((e=s[c-8>>2])>>>0>i>>>0)break a;if((0|e)!=(0|i))break c;if(A=d[c-4|0],n=s[(e=c-12|0)>>2],s[l+40>>2]=e,(0|n)<0)break a;e=s[v>>2],s[_+20>>2]=M+(-1^n),n=_+20|0,s[_+88>>2]=n,te(_,_+40|0,n,_+88|0),c=s[_>>2];l:if(1&A){if(n=-1,-1==(0|e))break l;n=((n=e+1|0)>>>0)%3|0?n:e-2|0}else n=-1,-1!=(0|e)&&(n=e-1|0,(e>>>0)%3|0||(n=e+2|0));if(s[c+12>>2]=n,(0|(c=s[l+40>>2]))==s[l+36>>2])break}n=p}if(b=(0|g)<(0|M),(0|g)==(0|M))break}g=M;break o}if(c=-1,1&b)break i}if(c=-1,n=s[l+8>>2],!((0|P)<s[n+28>>2]-s[n+24>>2]>>2)){if((0|p)!=(0|m)){for(M=l+60|0,C=l+312|0;;){v=s[(p=p-4|0)>>2],s[_+68>>2]=p;o:if(Gt(C)){if(x=s[l+8>>2],A=s[x>>2],((s[x+4>>2]-A>>2>>>0)/3|0)<=(0|g))break i;if(r=-1,e=-1,i=s[x+24>>2],n=-1,-1!=(0|v)&&(n=-1,-1!=(0|(w=((w=v+1|0)>>>0)%3|0?w:v-2|0))&&(n=s[A+(w<<2)>>2])),-1!=(0|(n=s[i+((w=n)<<2)>>2]))&&-1!=(0|(n=((b=n+1|0)>>>0)%3|0?b:n-2|0))&&(-1!=(0|(r=((r=n+1|0)>>>0)%3|0?r:n-2|0))&&(e=s[A+(r<<2)>>2]),r=n),S=-1,b=-1,n=-1,-1!=(0|(i=s[i+(e<<2)>>2]))&&(n=-1,-1!=(0|(i=((P=i+1|0)>>>0)%3|0?P:i-2|0))&&(b=i,n=-1!=(0|(n=((n=i+1|0)>>>0)%3|0?n:i-2|0))?s[A+(n<<2)>>2]:-1)),i=s[x+12>>2],x=h(g,3),s[i+(P=x<<2)>>2]=v,s[i+(v<<2)>>2]=x,s[(D=(v=x+1|0)<<2)+i>>2]=r,s[i+(r<<2)>>2]=v,s[(O=(r=x+2|0)<<2)+i>>2]=b,s[i+(b<<2)>>2]=r,s[A+P>>2]=e,s[(b=A+D|0)>>2]=n,s[(n=A+O|0)>>2]=w,i=v>>>0<x>>>0?-1:e,e=s[l+120>>2],A=s[(w=(i>>>3&536870908)+e|0)>>2],V=w,j=Mr(i)&A,s[V>>2]=j,S=-1!=(0|v)?s[b>>2]:S,i=s[(b=e+(S>>>3&536870908)|0)>>2],V=b,j=Mr(S)&i,s[V>>2]=j,i=-1,i=-1!=(0|r)?s[n>>2]:i,r=s[(e=e+(i>>>3&536870908)|0)>>2],V=e,j=Mr(i)&r,s[V>>2]=j,(0|(i=s[l+64>>2]))==(e=s[l+68>>2])<<5){if((i+1|0)<0)break e;at(M,e=i>>>0<=1073741822?(e<<=6)>>>0<(r=i+32&-32)>>>0?r:e:2147483647),i=s[l+64>>2]}if(g=g+1|0,s[l+64>>2]=i+1,e=s[l+60>>2]+(i>>>3&536870908)|0,s[e>>2]=s[e>>2]|1<<i,(0|(e=s[l+76>>2]))!=s[l+80>>2]){s[e>>2]=x,s[l+76>>2]=e+4;break o}if((e=1+(i=(n=e-(r=s[l+72>>2])|0)>>2)|0)>>>0>=1073741824)break e;if(b=n>>1,b=i>>>0<536870911?e>>>0>b>>>0?e:b:1073741823){if(b>>>0>=1073741824)break n;e=ur(b<<2)}else e=0;if(s[(i=e+(i<<2)|0)>>2]=x,(0|n)>0&&ye(e,r,n),s[l+80>>2]=e+(b<<2),s[l+76>>2]=i+4,s[l+72>>2]=e,!r)break o;ee(r)}else{if((0|(n=s[l+64>>2]))==(e=s[l+68>>2])<<5){if((n+1|0)<0)break e;at(M,e=n>>>0<=1073741822?(e<<=6)>>>0<(r=n+32&-32)>>>0?r:e:2147483647),n=s[l+64>>2]}if(s[l+64>>2]=n+1,e=s[l+60>>2]+(n>>>3&536870908)|0,r=s[e>>2],V=e,j=Mr(n)&r,s[V>>2]=j,(0|(e=s[l+76>>2]))==s[l+80>>2]){if((e=1+(i=(n=e-(r=s[l+72>>2])|0)>>2)|0)>>>0>=1073741824)break e;if(b=n>>1,b=i>>>0<536870911?e>>>0>b>>>0?e:b:1073741823){if(b>>>0>=1073741824)break n;e=ur(b<<2)}else e=0;s[(i=e+(i<<2)|0)>>2]=v,(0|n)>0&&ye(e,r,n),s[l+80>>2]=e+(b<<2),s[l+76>>2]=i+4,s[l+72>>2]=e,r&&ee(r)}else s[e>>2]=v,s[l+76>>2]=e+4}if((0|p)==(0|m))break}n=s[l+8>>2]}if(((s[n+4>>2]-s[n>>2]>>2>>>0)/3|0)==(0|g))if(i=s[n+24>>2],c=s[n+28>>2]-i>>2,(0|y)!=(0|k))for(e=y;;){if(r=s[e>>2],-1==s[(b=((p=c-1|0)<<2)+i|0)>>2])for(;p=c-2|0,c=c-1|0,-1==s[(b=(p<<2)+i|0)>>2];);if(r>>>0<=p>>>0){if(s[_>>2]=n,i=s[b>>2],o[_+12|0]=1,s[_+8>>2]=i,s[_+4>>2]=i,-1!=(0|i))for(;s[s[n>>2]+(i<<2)>>2]=r,Fe(_),n=s[l+8>>2],-1!=(0|(i=s[_+8>>2])););g=(i=s[n+24>>2])+(p<<2)|0,-1!=(0|r)&&(s[(r<<2)+i>>2]=s[g>>2]),s[g>>2]=-1,g=1<<r,r=(M=s[l+120>>2])+(r>>>3&536870908)|0,M=M+(p>>>3&536870908)|0,p=1<<p,s[M>>2]&p?g|=s[r>>2]:g=s[r>>2]&(-1^g),s[r>>2]=g,s[M>>2]=s[M>>2]&(-1^p),c=c-1|0}if((0|k)==(0|(e=e+4|0)))break}else y=k}}if(y&&ee(y),e=s[_+48>>2])for(;r=s[e>>2],ee(e),e=r;);e=s[_+40>>2],s[_+40>>2]=0,e&&ee(e),m&&(s[_+68>>2]=m,ee(m)),N=_+96|0;break r}qt(1326),T()}if(-1!=(0|c)){r=(e=s[G+16>>2])+s[G>>2]|0,m=(m=s[G+8>>2])-e|0,e=s[s[l+4>>2]+32>>2],a[e+38>>1]=f[e+38>>1],s[e>>2]=r,s[e+16>>2]=0,s[e+20>>2]=0,s[e+8>>2]=m,s[e+12>>2]=0;r:if(s[l+216>>2]!=s[l+220>>2]&&(e=s[l+8>>2],s[e+4>>2]!=s[e>>2])){for(r=0;;){if(fe(l,r)){if(r=r+3|0,e=s[l+8>>2],r>>>0<s[e+4>>2]-s[e>>2]>>2>>>0)continue;break r}break}break t}if(d[l+308|0]&&(o[l+308|0]=0,r=s[l+292>>2],e=0,n=(e=(m=s[l+304>>2]+7|0)>>>0<7?1:e)>>>3|0,e=(m=e<<29|m>>>3)+s[l+288>>2]|0,r=r+n|0,s[l+288>>2]=e,s[l+292>>2]=e>>>0<m>>>0?r+1|0:r),(0|(r=s[l+216>>2]))!=s[l+220>>2])for(;;){if(Ee(4+((e=h(z,144))+r|0)|0,s[l+8>>2]),n=s[F>>2],(0|(r=s[132+(m=e+n|0)>>2]))!=(0|(m=s[m+136>>2])))for(;De(4+(e+n|0)|0,s[r>>2]),n=s[F>>2],(0|m)!=(0|(r=r+4|0)););if(re(4+(e+n|0)|0),z=z+1|0,r=s[l+216>>2],!(z>>>0<(s[l+220>>2]-r|0)/144>>>0))break}if(e=s[l+8>>2],mt(l+184|0,s[e+28>>2]-s[e+24>>2]>>2),(0|(n=s[l+216>>2]))!=s[l+220>>2])for(r=0;e=h(r,144)+n|0,m=s[e+60>>2]-s[e+56>>2]>>2,n=e+104|0,e=s[l+8>>2],mt(n,(0|(e=s[e+28>>2]-s[e+24>>2]>>2))>(0|m)?e:m),r=r+1|0,n=s[l+216>>2],r>>>0<(s[l+220>>2]-n|0)/144>>>0;);z=L(l,c)}}}return N=t- -64|0,0|z}nn(),T()},Jr,Wr,jr,ar,function(e){var t=0;s[(e|=0)>>2]=8652,(t=s[e+48>>2])&&(s[e+52>>2]=t,ee(t)),s[e>>2]=8904,(t=s[e+36>>2])&&ee(t),(t=s[e+24>>2])&&ee(t),ee(e)},vt,function(e){var t=0;return s[(e|=0)>>2]=8904,(t=s[e+36>>2])&&ee(t),(t=s[e+24>>2])&&ee(t),0|e},function(e){var t=0;s[(e|=0)>>2]=8904,(t=s[e+36>>2])&&ee(t),(t=s[e+24>>2])&&ee(t),ee(e)},function(e){var t=0;return s[8+(e|=0)>>2]=9168,s[e>>2]=8956,(t=s[e+96>>2])&&(s[e+100>>2]=t,ee(t)),(t=s[e+80>>2])&&(s[e+84>>2]=t,ee(t)),(t=s[e+68>>2])&&(s[e+72>>2]=t,ee(t)),(t=s[e+56>>2])&&(s[e+60>>2]=t,ee(t)),s[e+8>>2]=9404,(t=s[e+44>>2])&&ee(t),(t=s[e+32>>2])&&ee(t),0|e},function(e){var t=0;s[8+(e|=0)>>2]=9168,s[e>>2]=8956,(t=s[e+96>>2])&&(s[e+100>>2]=t,ee(t)),(t=s[e+80>>2])&&(s[e+84>>2]=t,ee(t)),(t=s[e+68>>2])&&(s[e+72>>2]=t,ee(t)),(t=s[e+56>>2])&&(s[e+60>>2]=t,ee(t)),s[e+8>>2]=9404,(t=s[e+44>>2])&&ee(t),(t=s[e+32>>2])&&ee(t),ee(e)},function(e,t){t|=0;var r,n,i,a=0,c=0,l=0,d=0,f=0,u=0,p=0,m=0;if(n=s[12+(e|=0)>>2],a=s[e+108>>2],l=s[a+80>>2],o[t+84|0]=0,d=s[t+68>>2],(c=s[t+72>>2]-d>>2)>>>0<l>>>0?(xe(t+68|0,l-c|0,9156),a=s[e+108>>2],l=s[a+80>>2]):l>>>0>=c>>>0||(s[t+72>>2]=d+(l<<2)),r=s[a+96>>2],!(a=s[a+100>>2]-r|0))return 1;i=(a=(0|a)/12|0)>>>0>1?a:1,a=0;e:{for(;;){if(1431655765==(0|a))break e;if(c=s[n>>2]+(h(a,3)<<2)|0,-1==(0|(u=s[c>>2])))break e;if(d=h(a,12)+r|0,(f=s[d>>2])>>>0>=l>>>0)break e;if(m=s[s[e+112>>2]+12>>2],(p=s[m+(u<<2)>>2])>>>0>=l>>>0)break e;if(u=s[t+68>>2],s[u+(f<<2)>>2]=p,-1==(0|(f=s[c+4>>2])))break e;if((p=s[d+4>>2])>>>0>=l>>>0)break e;if((f=s[(f<<2)+m>>2])>>>0>=l>>>0)break e;if(s[u+(p<<2)>>2]=f,-1==(0|(c=s[c+8>>2])))break e;if((d=s[d+8>>2])>>>0>=l>>>0)break e;if((c=s[(c<<2)+m>>2])>>>0>=l>>>0)break e;if(s[u+(d<<2)>>2]=c,(0|i)==(0|(a=a+1|0)))break}return 1}return 0},function(e){var t,r=0,n=0,i=0,o=0,a=0,c=0;N=t=N-16|0,r=s[4+(e|=0)>>2],i=s[r>>2];e:{if(n=s[e+12>>2],!((o=(n=s[n+28>>2]-s[n+24>>2]|0)>>2)>>>0<=s[r+8>>2]-i>>2>>>0)){if((0|n)<0)break e;a=s[r+4>>2],c=(n=ur(n))+(o<<2)|0,a=(o=a-i|0)+n|0,(0|o)>0&&ye(n,i,o),s[r+8>>2]=c,s[r+4>>2]=a,s[r>>2]=n,i&&ee(i)}r=s[e+12>>2],i=s[r+28>>2],r=s[r+24>>2],s[t+12>>2]=0,r=i-r>>2,o=s[(n=e+96|0)>>2],r>>>0>(i=s[e+100>>2]-o>>2)>>>0?xe(n,r-i|0,t+12|0):r>>>0>=i>>>0||(s[e+100>>2]=o+(r<<2)),o=e+8|0;t:if(r=s[e+116>>2]){if((0|(n=s[r>>2]))==s[r+4>>2]){i=1;break t}for(r=0;;){if(!(i=V(o,s[(r<<2)+n>>2])))break t;if(a=s[e+116>>2],n=s[a>>2],!((r=r+1|0)>>>0<s[a+4>>2]-n>>2>>>0))break}}else if(i=1,e=s[e+12>>2],!((e=s[e+4>>2]-s[e>>2]>>2)>>>0<3))for(e=(e>>>0)/3|0,r=0;;){if(!(i=V(o,h(r,3))))break t;if((0|e)==(0|(r=r+1|0)))break}return N=t+16|0,0|i}qt(1326),T()},function(e){var t=0;return s[(e|=0)>>2]=9168,(t=s[e+88>>2])&&(s[e+92>>2]=t,ee(t)),(t=s[e+72>>2])&&(s[e+76>>2]=t,ee(t)),(t=s[e+60>>2])&&(s[e- -64>>2]=t,ee(t)),(t=s[e+48>>2])&&(s[e+52>>2]=t,ee(t)),s[e>>2]=9404,(t=s[e+36>>2])&&ee(t),(t=s[e+24>>2])&&ee(t),0|e},function(e){var t=0;s[(e|=0)>>2]=9168,(t=s[e+88>>2])&&(s[e+92>>2]=t,ee(t)),(t=s[e+72>>2])&&(s[e+76>>2]=t,ee(t)),(t=s[e+60>>2])&&(s[e- -64>>2]=t,ee(t)),(t=s[e+48>>2])&&(s[e+52>>2]=t,ee(t)),s[e>>2]=9404,(t=s[e+36>>2])&&ee(t),(t=s[e+24>>2])&&ee(t),ee(e)},function(e,t,r){t|=0,r|=0;var n,i=0;N=n=N-16|0,s[4+(e|=0)>>2]=t,i=s[t>>2],t=s[t+4>>2],o[n+15|0]=0,He(e+24|0,(t-i>>2>>>0)/3|0,n+15|0),t=s[e+4>>2],i=s[t+28>>2],t=s[t+24>>2],o[n+14|0]=0,He(e+36|0,i-t>>2,n+14|0),t=s[r+12>>2],s[e+16>>2]=s[r+8>>2],s[e+20>>2]=t,t=s[r+4>>2],s[e+8>>2]=s[r>>2],s[e+12>>2]=t,N=n+16|0},function(e){var t=0;return s[(e|=0)>>2]=9404,(t=s[e+36>>2])&&ee(t),(t=s[e+24>>2])&&ee(t),0|e},function(e){var t=0;s[(e|=0)>>2]=9404,(t=s[e+36>>2])&&ee(t),(t=s[e+24>>2])&&ee(t),ee(e)},function(e){var t=0;return s[8+(e|=0)>>2]=9588,s[e>>2]=9424,(t=s[e+56>>2])&&(s[e+60>>2]=t,ee(t)),s[e+8>>2]=9404,(t=s[e+44>>2])&&ee(t),(t=s[e+32>>2])&&ee(t),0|e},function(e){var t=0;s[8+(e|=0)>>2]=9588,s[e>>2]=9424,(t=s[e+56>>2])&&(s[e+60>>2]=t,ee(t)),s[e+8>>2]=9404,(t=s[e+44>>2])&&ee(t),(t=s[e+32>>2])&&ee(t),ee(e)},function(e,t){t|=0;var r,n,i,a=0,c=0,l=0,d=0,f=0,u=0,p=0,m=0;if(n=s[12+(e|=0)>>2],a=s[e+68>>2],l=s[a+80>>2],o[t+84|0]=0,d=s[t+68>>2],(c=s[t+72>>2]-d>>2)>>>0<l>>>0?(xe(t+68|0,l-c|0,9156),a=s[e+68>>2],l=s[a+80>>2]):l>>>0>=c>>>0||(s[t+72>>2]=d+(l<<2)),r=s[a+96>>2],!(a=s[a+100>>2]-r|0))return 1;i=(a=(0|a)/12|0)>>>0>1?a:1,a=0;e:{for(;;){if(1431655765==(0|a))break e;if(c=s[n>>2]+(h(a,3)<<2)|0,-1==(0|(u=s[c>>2])))break e;if(d=h(a,12)+r|0,(f=s[d>>2])>>>0>=l>>>0)break e;if(m=s[s[e+72>>2]+12>>2],(p=s[m+(u<<2)>>2])>>>0>=l>>>0)break e;if(u=s[t+68>>2],s[u+(f<<2)>>2]=p,-1==(0|(f=s[c+4>>2])))break e;if((p=s[d+4>>2])>>>0>=l>>>0)break e;if((f=s[(f<<2)+m>>2])>>>0>=l>>>0)break e;if(s[u+(p<<2)>>2]=f,-1==(0|(c=s[c+8>>2])))break e;if((d=s[d+8>>2])>>>0>=l>>>0)break e;if((c=s[(c<<2)+m>>2])>>>0>=l>>>0)break e;if(s[u+(d<<2)>>2]=c,(0|i)==(0|(a=a+1|0)))break}return 1}return 0},function(e){var t=0,r=0,n=0,i=0,o=0,a=0;t=s[4+(e|=0)>>2],n=s[t>>2];e:{if(r=s[e+12>>2],!((i=(r=s[r+28>>2]-s[r+24>>2]|0)>>2)>>>0<=s[t+8>>2]-n>>2>>>0)){if((0|r)<0)break e;o=s[t+4>>2],a=(r=ur(r))+(i<<2)|0,o=(i=o-n|0)+r|0,(0|i)>0&&ye(r,n,i),s[t+8>>2]=a,s[t+4>>2]=o,s[t>>2]=r,n&&ee(n)}i=e+8|0;t:if(t=s[e+76>>2]){if((0|(n=s[t>>2]))==s[t+4>>2])return 1;for(t=0;;){if(!(r=oe(i,s[(t<<2)+n>>2])))break t;if(o=s[e+76>>2],n=s[o>>2],!((t=t+1|0)>>>0<s[o+4>>2]-n>>2>>>0))break}}else if(r=1,e=s[e+12>>2],!((e=s[e+4>>2]-s[e>>2]>>2)>>>0<3))for(e=(e>>>0)/3|0,t=0;;){if(!(r=oe(i,h(t,3))))break t;if((0|e)==(0|(t=t+1|0)))break}return 0|r}qt(1326),T()},function(e){var t=0;return s[(e|=0)>>2]=9588,(t=s[e+48>>2])&&(s[e+52>>2]=t,ee(t)),s[e>>2]=9404,(t=s[e+36>>2])&&ee(t),(t=s[e+24>>2])&&ee(t),0|e},function(e){var t=0;s[(e|=0)>>2]=9588,(t=s[e+48>>2])&&(s[e+52>>2]=t,ee(t)),s[e>>2]=9404,(t=s[e+36>>2])&&ee(t),(t=s[e+24>>2])&&ee(t),ee(e)},function(e){var t=0;return s[8+(e|=0)>>2]=8652,s[e>>2]=9716,(t=s[e+56>>2])&&(s[e+60>>2]=t,ee(t)),s[e+8>>2]=8904,(t=s[e+44>>2])&&ee(t),(t=s[e+32>>2])&&ee(t),0|e},function(e){var t=0;s[8+(e|=0)>>2]=8652,s[e>>2]=9716,(t=s[e+56>>2])&&(s[e+60>>2]=t,ee(t)),s[e+8>>2]=8904,(t=s[e+44>>2])&&ee(t),(t=s[e+32>>2])&&ee(t),ee(e)},function(e,t){t|=0;var r,n,i,a=0,c=0,l=0,d=0,f=0,u=0,p=0,m=0;if(u=s[12+(e|=0)>>2],a=s[e+68>>2],l=s[a+80>>2],o[t+84|0]=0,f=s[t+68>>2],(c=s[t+72>>2]-f>>2)>>>0<l>>>0?(xe(t+68|0,l-c|0,9156),a=s[e+68>>2],l=s[a+80>>2]):l>>>0>=c>>>0||(s[t+72>>2]=f+(l<<2)),r=s[a+96>>2],!(a=s[a+100>>2]-r|0))return 1;n=(a=(0|a)/12|0)>>>0>1?a:1,i=s[u+28>>2],a=0;e:{for(;;){if(c=(h(a,3)<<2)+i|0,-1==(0|(f=s[c>>2])))break e;if(u=h(a,12)+r|0,(p=s[u>>2])>>>0>=l>>>0)break e;if(d=f<<2,f=s[s[e+72>>2]+12>>2],(d=s[d+f>>2])>>>0>=l>>>0)break e;if(m=p<<2,p=s[t+68>>2],s[m+p>>2]=d,-1==(0|(d=s[c+4>>2])))break e;if((m=s[u+4>>2])>>>0>=l>>>0)break e;if((d=s[f+(d<<2)>>2])>>>0>=l>>>0)break e;if(s[p+(m<<2)>>2]=d,-1==(0|(c=s[c+8>>2])))break e;if((u=s[u+8>>2])>>>0>=l>>>0)break e;if((c=s[f+(c<<2)>>2])>>>0>=l>>>0)break e;if(s[p+(u<<2)>>2]=c,(0|n)==(0|(a=a+1|0)))break}return 1}return 0},function(e){var t=0,r=0,n=0,i=0,o=0,a=0;t=s[4+(e|=0)>>2],n=s[t>>2];e:{if(r=s[e+12>>2],!((i=(r=s[r+56>>2]-s[r+52>>2]|0)>>2)>>>0<=s[t+8>>2]-n>>2>>>0)){if((0|r)<0)break e;o=s[t+4>>2],a=(r=ur(r))+(i<<2)|0,o=(i=o-n|0)+r|0,(0|i)>0&&ye(r,n,i),s[t+8>>2]=a,s[t+4>>2]=o,s[t>>2]=r,n&&ee(n)}i=e+8|0;t:if(t=s[e+76>>2]){if((0|(n=s[t>>2]))==s[t+4>>2])return 1;for(t=0;;){if(!(r=ne(i,s[(t<<2)+n>>2])))break t;if(o=s[e+76>>2],n=s[o>>2],!((t=t+1|0)>>>0<s[o+4>>2]-n>>2>>>0))break}}else if(r=1,e=s[s[e+12>>2]+64>>2],!((e=s[e+4>>2]-s[e>>2]>>2)>>>0<3))for(e=(e>>>0)/3|0,t=0;;){if(!(r=ne(i,h(t,3))))break t;if((0|e)==(0|(t=t+1|0)))break}return 0|r}qt(1326),T()},function(e){var t,r=0,n=0;if(s[(e|=0)>>2]=10064,(r=s[e+20>>2])&&(s[e+24>>2]=r,ee(r)),t=s[e+8>>2]){if((0|(n=s[e+12>>2]))==(0|t))r=t;else{for(;r=s[(n=n-4|0)>>2],s[n>>2]=0,r&&vn[s[s[r>>2]+4>>2]](r),(0|t)!=(0|n););r=s[e+8>>2]}s[e+12>>2]=t,ee(r)}ee(e)},function(e,t){e|=0,t|=0;var r=0,n=0,i=0,o=0,a=0,c=0;o=ur(64),r=ur(12),s[r+8>>2]=s[s[e+4>>2]+80>>2],s[r>>2]=1e4,s[r+4>>2]=0,o=Ut(o,r);e:{if((0|t)<0)r=o;else{if(c=e+8|0,!((0|(a=(r=s[e+12>>2])-(i=s[e+8>>2])>>2))>(0|t)))if(n=t+1|0,t>>>0>=a>>>0)Le(c,n-a|0);else if(!(n>>>0>=a>>>0)){if((0|(i=i+(n<<2)|0))!=(0|r))for(;n=s[(r=r-4|0)>>2],s[r>>2]=0,n&&vn[s[s[n>>2]+4>>2]](n),(0|r)!=(0|i););s[e+12>>2]=i}if(e=s[c>>2]+(t<<2)|0,r=s[e>>2],s[e>>2]=o,!r)break e}vn[s[s[r>>2]+4>>2]](r)}return(-1^t)>>>31|0},function(e){var t,r=0,n=0,i=0,o=0,a=0,c=0,l=0,p=0,m=0,b=0,v=0,g=0,A=0;N=t=N-32|0;e:if(Ct(1,t+28|0,s[32+(e|=0)>>2])&&Ct(1,t+24|0,s[e+32>>2])&&!((m=s[t+28>>2])>>>0>1431655765||(i=s[e+32>>2],o=Wt(o=(r=p=s[i+8>>2])-(n=s[i+16>>2])|0,(a=s[i+12>>2])-((g=r>>>0<n>>>0)+(r=s[i+20>>2])|0)|0,3,0),!R&o>>>0<m>>>0||(A=s[t+24>>2],o=Ht(m,0,3,0),!R&o>>>0<A>>>0|(0|r)>=(0|a)&n>>>0>=p>>>0|(0|r)>(0|a))))){a=d[n+s[i>>2]|0],o=(p=n+1|0)?r:r+1|0,s[i+16>>2]=p,s[i+20>>2]=o;t:{if(a){r:if(A>>>0<=255){if(!m)break t;if(s[t+16>>2]=0,s[t+8>>2]=0,s[t+12>>2]=0,(0|o)>=(0|(r=n=s[i+12>>2]))&p>>>0>=(c=s[i+8>>2])>>>0|(0|r)<(0|o))break r;for(;;){if(a=s[i>>2],b=d[a+p|0],r=o,r=(l=p+1|0)?r:r+1|0,s[i+16>>2]=l,s[i+20>>2]=r,s[t+8>>2]=b,c>>>0<=l>>>0&(0|r)>=(0|n)|(0|r)>(0|n))break r;if(b=d[a+l|0],r=o,r=(l=p+2|0)>>>0<2?r+1|0:r,s[i+16>>2]=l,s[i+20>>2]=r,s[t+12>>2]=b,c>>>0<=l>>>0&(0|r)>=(0|n)|(0|r)>(0|n))break r;if(r=d[a+l|0],o=(n=p+3|0)>>>0<3?o+1|0:o,s[i+16>>2]=n,s[i+20>>2]=o,s[t+16>>2]=r,rt(s[e+44>>2]+96|0,t+8|0),(0|m)==(0|(v=v+1|0)))break t;if(i=s[e+32>>2],p=s[(r=i)+16>>2],o=s[r+20>>2],s[t+16>>2]=0,s[t+8>>2]=0,s[t+12>>2]=0,!(p>>>0<(c=s[r+8>>2])>>>0&(0|o)<=(0|(r=n=s[r+12>>2]))|(0|r)>(0|o)))break}}else if(A>>>0<=65535){if(!m)break t;if(s[t+16>>2]=0,s[t+8>>2]=0,s[t+12>>2]=0,a=s[i+12>>2],c=n=n+3|0,n=r=n>>>0<3?r+1|0:r,(l=s[i+8>>2])>>>0<c>>>0&(0|r)>=(0|a)|(0|r)>(0|a))break r;for(;;){if(b=s[i>>2],r=d[0|(r=b+p|0)]|d[r+1|0]<<8,s[i+16>>2]=c,s[i+20>>2]=n,s[t+8>>2]=r,r=o,(n=p+4|0)>>>0>l>>>0&(0|(r=n>>>0<4?r+1|0:r))>=(0|a)|(0|r)>(0|a))break r;if(c=d[0|(c=c+b|0)]|d[c+1|0]<<8,s[i+16>>2]=n,s[i+20>>2]=r,s[t+12>>2]=c,r=o,(o=p+6|0)>>>0>l>>>0&(0|(r=o>>>0<6?r+1|0:r))>=(0|a)|(0|r)>(0|a))break r;if(n=d[0|(n=n+b|0)]|d[n+1|0]<<8,s[i+16>>2]=o,s[i+20>>2]=r,s[t+16>>2]=n,rt(s[e+44>>2]+96|0,t+8|0),(0|m)==(0|(v=v+1|0)))break t;if(i=s[e+32>>2],p=s[(r=i)+16>>2],o=s[r+20>>2],s[t+16>>2]=0,s[t+8>>2]=0,s[t+12>>2]=0,a=s[r+12>>2],l=s[r+8>>2],r=o,c=n=p+2|0,n=r=n>>>0<2?r+1|0:r,!((0|r)<=(0|a)&c>>>0<=l>>>0|(0|r)<(0|a)))break}}else if(u[s[e+44>>2]+80>>2]>2097151||(65535&((a=f[e+36>>1])<<8|a>>>8))>>>0<514){if(!m)break t;if(s[t+16>>2]=0,s[t+8>>2]=0,s[t+12>>2]=0,a=s[i+12>>2],c=n=n+5|0,n=r=n>>>0<5?r+1|0:r,!((l=s[i+8>>2])>>>0<c>>>0&(0|r)>=(0|a)|(0|r)>(0|a)))for(;;){if(b=s[i>>2],r=d[0|(r=b+p|0)]|d[r+1|0]<<8|d[r+2|0]<<16|d[r+3|0]<<24,s[i+16>>2]=c,s[i+20>>2]=n,s[t+8>>2]=r,r=o,g=n=p+8|0,n>>>0>l>>>0&(0|(r=n>>>0<8?r+1|0:r))>=(0|a)|(0|r)>(0|a))break r;if(n=d[0|(n=c+b|0)]|d[n+1|0]<<8|d[n+2|0]<<16|d[n+3|0]<<24,s[i+16>>2]=g,s[i+20>>2]=r,s[t+12>>2]=n,n=r=p+12|0,r>>>0>l>>>0&(0|(o=r>>>0<12?o+1|0:o))>=(0|a)|(0|o)>(0|a))break r;if(r=d[0|(r=b+g|0)]|d[r+1|0]<<8|d[r+2|0]<<16|d[r+3|0]<<24,s[i+16>>2]=n,s[i+20>>2]=o,s[t+16>>2]=r,rt(s[e+44>>2]+96|0,t+8|0),(0|m)==(0|(v=v+1|0)))break t;if(i=s[e+32>>2],p=s[(r=i)+16>>2],o=s[r+20>>2],s[t+16>>2]=0,s[t+8>>2]=0,s[t+12>>2]=0,a=s[r+12>>2],l=s[r+8>>2],r=o,c=n=p+4|0,n=r=n>>>0<4?r+1|0:r,!((0|r)<=(0|a)&c>>>0<=l>>>0|(0|r)<(0|a)))break}}else{if(!m)break t;if(s[t+16>>2]=0,s[t+8>>2]=0,s[t+12>>2]=0,!Ct(1,t+4|0,i))break r;for(;;){if(s[t+8>>2]=s[t+4>>2],!Ct(1,t+4|0,s[e+32>>2]))break r;if(s[t+12>>2]=s[t+4>>2],!Ct(1,t+4|0,s[e+32>>2]))break r;if(s[t+16>>2]=s[t+4>>2],rt(s[e+44>>2]+96|0,t+8|0),(0|m)==(0|(v=v+1|0)))break t;if(o=s[e+32>>2],s[t+16>>2]=0,s[t+8>>2]=0,s[t+12>>2]=0,!Ct(1,t+4|0,o))break}}v=0;break e}i=0,N=r=N-32|0,s[r+24>>2]=0,s[r+16>>2]=0,s[r+20>>2]=0;r:{n:{if(o=h(m,3)){if(o>>>0>=1073741824)break n;i=ur(n=h(m,12)),s[r+16>>2]=i,We(i,0,n)}i:{if(!(o=E(o,1,s[e+32>>2],i))|!m){if(!i)break i}else for(a=0,n=0;g=c,l=(c=s[(p=(n<<2)+i|0)>>2])>>>1|0,c=g+(1&c?0-l|0:l)|0,s[r>>2]=c,b=(l=s[p+4>>2])>>>1|0,c=c+(1&l?0-b|0:b)|0,s[r+4>>2]=c,l=(p=s[p+8>>2])>>>1|0,c=c+(1&p?0-l|0:l)|0,s[r+8>>2]=c,rt(s[e+44>>2]+96|0,r),n=n+3|0,(0|(a=a+1|0))!=(0|m););ee(i)}N=r+32|0;break r}nn(),T()}if(!o)break e}s[s[e+4>>2]+80>>2]=A,v=1}return N=t+32|0,0|v},Xr,on,function(e,t){return o[84+(t|=0)|0]=1,s[t+72>>2]=s[t+68>>2],1},function(e){var t=0,r=0,n=0,i=0,o=0;e:{if(!((0|(t=s[8+(e|=0)>>2]))<0||(r=s[e+4>>2],i=s[r>>2],(n=s[r+4>>2]-i>>2)>>>0<t>>>0?(ct(r,t-n|0),o=s[e+8>>2]):(o=t,t>>>0>=n>>>0||(s[r+4>>2]=i+(t<<2),o=t)),(0|(n=o))<=0)))for(e=s[e+4>>2],r=s[e>>2],i=s[e+4>>2]-r>>2,e=0;;){if((0|e)==(0|i))break e;if(s[r+(e<<2)>>2]=e,(0|n)==(0|(e=e+1|0)))break}return(-1^t)>>>31|0}dn(),T()},sn,en,Jr,function(e){var t=0;return s[(e|=0)>>2]=10272,(t=s[e+96>>2])&&(s[e+100>>2]=t,ee(t)),(t=s[e+84>>2])&&(s[e+88>>2]=t,ee(t)),st(e),0|e},function(e){var t=0;s[(e|=0)>>2]=10272,(t=s[e+96>>2])&&(s[e+100>>2]=t,ee(t)),(t=s[e+84>>2])&&(s[e+88>>2]=t,ee(t)),st(e),ee(e)},function(e,t,r){var n=0,i=0,o=0,a=0,c=0,l=0,d=0,f=0;if(le(e|=0,t|=0,r|=0),r=s[e+84>>2],!((0|(n=s[e+88>>2]-r>>2))>(0|t))){if((t=t+1|0)>>>0>n>>>0){e:if((n=t-n|0)>>>0<=(i=s[e+92>>2])-(r=s[e+88>>2])>>2>>>0){if(n){if(t=r,a=1+((o=(n<<2)-4|0)>>>2|0)&7)for(;s[t>>2]=1,t=t+4|0,(0|a)!=(0|(c=c+1|0)););if(r=(n<<2)+r|0,!(o>>>0<28))for(;s[t+24>>2]=1,s[t+28>>2]=1,s[t+16>>2]=1,s[t+20>>2]=1,s[t+8>>2]=1,s[t+12>>2]=1,s[t>>2]=1,s[t+4>>2]=1,(0|r)!=(0|(t=t+32|0)););}s[e+88>>2]=r}else{t:{if((t=(r=(d=r-(o=s[e+84>>2])|0)>>2)+n|0)>>>0<1073741824){if(l=(i=i-o|0)>>1,i=i>>2>>>0<536870911?t>>>0>l>>>0?t:l:1073741823){if(i>>>0>=1073741824)break t;a=ur(i<<2)}if(t=r=(r<<2)+a|0,f=1+((l=(n<<=2)-4|0)>>>2|0)&7)for(t=r;s[t>>2]=1,t=t+4|0,(0|f)!=(0|(c=c+1|0)););if(r=r+n|0,l>>>0>=28)for(;s[t+24>>2]=1,s[t+28>>2]=1,s[t+16>>2]=1,s[t+20>>2]=1,s[t+8>>2]=1,s[t+12>>2]=1,s[t>>2]=1,s[t+4>>2]=1,(0|r)!=(0|(t=t+32|0)););(0|d)>0&&ye(a,o,d),s[e+92>>2]=(i<<2)+a,s[e+88>>2]=r,s[e+84>>2]=a,o&&ee(o);break e}nn(),T()}qt(1326),T()}return}t>>>0>=n>>>0||(s[e+88>>2]=r+(t<<2))}},function(e,t){var r=0,n=0;$(e|=0,t|=0),(0|t)<0||(r=s[e+88>>2])-(n=s[e+84>>2])>>2<=(0|t)||((r=r-(n=4+(t=n+(t<<2)|0)|0)|0)&&Ue(t,n,r),s[e+88>>2]=t+r)},st,function(e){ee(st(e|=0))},le,$,Xr,on,function(e){return 1273},function(e){ee(mr(e|=0))},Wr,function(e){mr(e|=0),ee(e)},Xr,on,bn,bn,function(e,t,r){r|=0;var n,i=0,o=0,a=0,c=0;if(N=n=N+-64|0,i=1,!Rt(e|=0,t|=0,0)&&(i=0,t)){N=i=N+-64|0,o=s[t>>2],a=s[o-4>>2],c=s[o-8>>2],s[i+20>>2]=0,s[i+16>>2]=11220,s[i+12>>2]=t,s[i+8>>2]=11268,o=0,We(i+24|0,0,39),t=t+c|0;e:if(Rt(a,11268,0))s[i+56>>2]=1,vn[s[s[a>>2]+20>>2]](a,i+8|0,t,t,1,0),o=1==s[i+32>>2]?t:0;else{vn[s[s[a>>2]+24>>2]](a,i+8|0,t,1,0);t:switch(s[i+44>>2]){case 0:o=1==s[i+48>>2]&&1==s[i+36>>2]&&1==s[i+40>>2]?s[i+28>>2]:0;break e;case 1:break t;default:break e}1!=s[i+32>>2]&&s[i+48>>2]|1!=s[i+36>>2]|1!=s[i+40>>2]||(o=s[i+24>>2])}N=i- -64|0,i=0,o&&(We(4|(t=n+8|0),0,52),s[n+56>>2]=1,s[n+20>>2]=-1,s[n+16>>2]=e,s[n+8>>2]=o,vn[s[s[o>>2]+28>>2]](o,t,s[r>>2],1),1==(0|(e=s[n+32>>2]))&&(s[r>>2]=s[n+24>>2]),i=1==(0|e))}return N=n- -64|0,0|i},function(e,t,r,n,i,o){r|=0,n|=0,i|=0,o|=0,Rt(e|=0,s[8+(t|=0)>>2],o)&&bt(t,r,n,i)},function(e,t,r,n,i){if(r|=0,n|=0,i|=0,Rt(e|=0,s[8+(t|=0)>>2],i))1==s[t+28>>2]|s[t+4>>2]!=(0|r)||(s[t+28>>2]=n);else e:if(Rt(e,s[t>>2],i)){if(!(s[t+16>>2]!=(0|r)&s[t+20>>2]!=(0|r))){if(1!=(0|n))break e;return void(s[t+32>>2]=1)}s[t+20>>2]=r,s[t+32>>2]=n,s[t+40>>2]=s[t+40>>2]+1,1!=s[t+36>>2]|2!=s[t+24>>2]||(o[t+54|0]=1),s[t+44>>2]=4}},function(e,t,r,n){r|=0,n|=0,Rt(e|=0,s[8+(t|=0)>>2],0)&&Yt(t,r,n)},on,function(e,t,r,n,i,o){r|=0,n|=0,i|=0,o|=0,Rt(e|=0,s[8+(t|=0)>>2],o)?bt(t,r,n,i):(e=s[e+8>>2],vn[s[s[e>>2]+20>>2]](e,t,r,n,i,o))},function(e,t,r,n,i){if(r|=0,n|=0,i|=0,Rt(e|=0,s[8+(t|=0)>>2],i))1==s[t+28>>2]|s[t+4>>2]!=(0|r)||(s[t+28>>2]=n);else e:{if(Rt(e,s[t>>2],i)){if(!(s[t+16>>2]!=(0|r)&s[t+20>>2]!=(0|r))){if(1!=(0|n))break e;return void(s[t+32>>2]=1)}s[t+32>>2]=n;t:if(4!=s[t+44>>2]){if(a[t+52>>1]=0,e=s[e+8>>2],vn[s[s[e>>2]+20>>2]](e,t,r,r,1,i),d[t+53|0]){if(s[t+44>>2]=3,!d[t+52|0])break t;break e}s[t+44>>2]=4}if(s[t+20>>2]=r,s[t+40>>2]=s[t+40>>2]+1,1!=s[t+36>>2]|2!=s[t+24>>2])break e;return void(o[t+54|0]=1)}e=s[e+8>>2],vn[s[s[e>>2]+24>>2]](e,t,r,n,i)}},function(e,t,r,n){r|=0,n|=0,Rt(e|=0,s[8+(t|=0)>>2],0)?Yt(t,r,n):(e=s[e+8>>2],vn[s[s[e>>2]+28>>2]](e,t,r,n))}]);function gn(){return n.byteLength/65536|0}return{g:function(){},h:vn,i:Qr,j:function(){var e;return e=ur(40),a[e+38>>1]=0,s[e>>2]=0,s[e+8>>2]=0,s[e+12>>2]=0,s[e+16>>2]=0,s[e+20>>2]=0,s[e+24>>2]=0,s[e+28>>2]=0,o[e+29|0]=0,o[e+30|0]=0,o[e+31|0]=0,o[e+32|0]=0,o[e+33|0]=0,o[e+34|0]=0,o[e+35|0]=0,o[e+36|0]=0,0|e},k:function(e,t,r){t|=0,r|=0,s[16+(e|=0)>>2]=0,s[e+20>>2]=0,s[e>>2]=t,s[e+8>>2]=r,s[e+12>>2]=0},l:Qr,m:function(){var e,t;return t=ur(40),s[t>>2]=-1,s[16+(e=t+8|0)>>2]=0,s[e+20>>2]=0,s[e+8>>2]=0,s[e>>2]=0,s[e+4>>2]=0,s[e+24>>2]=0,s[e+28>>2]=0,0|t},n:Yr,o:function(e){var t=0;(e|=0)&&((t=s[e+8>>2])&&(s[e+12>>2]=t,ee(t)),ee(e))},p:function(){return 0|Jt(ur(64))},q:Qr,r:function(){var e;return Jt(e=ur(96)),s[e+64>>2]=0,s[e+68>>2]=0,s[e+88>>2]=0,s[e+72>>2]=0,s[e+76>>2]=0,o[e+77|0]=0,o[e+78|0]=0,o[e+79|0]=0,o[e+80|0]=0,o[e+81|0]=0,o[e+82|0]=0,o[e+83|0]=0,o[e+84|0]=0,0|e},s:Ur,t:function(e){return s[88+(e|=0)>>2]},u:function(e){return s[56+(e|=0)>>2]},v:Gr,w:function(e){return o[24+(e|=0)|0]},x:function(e){return d[32+(e|=0)|0]},y:function(e){return s[40+(e|=0)>>2]},z:function(e){return s[48+(e|=0)>>2]},A:function(e){return s[60+(e|=0)>>2]},B:Lt,C:function(){var e;return e=ur(24),s[e+8>>2]=0,s[e+12>>2]=0,s[e+4>>2]=-1,s[e>>2]=1140,s[e+16>>2]=0,s[e+20>>2]=0,0|e},D:Ir,E:Wr,F:function(e,t){return t|=0,b(p[s[8+(e|=0)>>2]+(t<<2)>>2])},G:function(e){return b(p[20+(e|=0)>>2])},H:Br,I:function(){var e;return e=ur(8),s[e+4>>2]=-1,s[e>>2]=1032,0|e},J:Ir,K:Wr,L:Br,M:function(){return 0|Er(ur(84))},N:Pr,O:Ur,P:Br,Q:function(){var e;return Er(e=ur(108)),s[e+84>>2]=0,s[e+88>>2]=0,s[e>>2]=10272,s[e+92>>2]=0,s[e+96>>2]=0,s[e+100>>2]=0,s[e+104>>2]=0,0|e},R:function(e){return(s[100+(e|=0)>>2]-s[e+96>>2]|0)/12|0},S:Pr,T:Ur,U:Br,V:function(){var e,t;return e=ur(24),s[e+4>>2]=0,s[e+8>>2]=0,s[(t=e+16|0)>>2]=0,s[t+4>>2]=0,s[e>>2]=e+4,s[e+12>>2]=t,0|e},W:function(e){(e|=0)&&(rr(e+12|0,s[e+16>>2]),dr(e,s[e+4>>2]),ee(e))},X:Yr,Y:function(e){return 0|!s[(e|=0)>>2]},Z:function(e){return 0|(o[15+(e|=0)|0]<0?s[e+4>>2]:e+4|0)},_:function(e){(e|=0)&&(o[e+15|0]<0&&ee(s[e+4>>2]),ee(e))},$:wr,aa:function(e,t){return t|=0,b(p[s[(e|=0)>>2]+(t<<2)>>2])},ba:zr,ca:Cr,da:wr,ea:function(e,t){return t|=0,o[s[(e|=0)>>2]+t|0]},fa:Fr,ga:Cr,ha:wr,ia:function(e,t){return t|=0,d[s[(e|=0)>>2]+t|0]},ja:Fr,ka:Cr,la:wr,ma:function(e,t){return t|=0,a[s[(e|=0)>>2]+(t<<1)>>1]},na:Or,oa:Cr,pa:wr,qa:function(e,t){return t|=0,f[s[(e|=0)>>2]+(t<<1)>>1]},ra:Or,sa:Cr,ta:wr,ua:Sr,va:zr,wa:Cr,xa:wr,ya:Sr,za:zr,Aa:Cr,Ba:function(){var e;return e=ur(28),s[e>>2]=0,s[e+4>>2]=0,s[e+24>>2]=0,s[e+16>>2]=0,s[e+20>>2]=0,s[e+8>>2]=0,s[e+12>>2]=0,0|e},Ca:function(e,t,r){e|=0,t|=0;var n,i=0,a=0,c=0,l=0,f=0,u=0,p=0;if(N=n=N-16|0,(i=St(r|=0))>>>0<4294967280){e:{if(i>>>0>=11)e=ur(a=i+16&-16),s[n+8>>2]=-2147483648|a,s[n>>2]=e,s[n+4>>2]=i;else if(o[n+11|0]=i,e=n,!i)break e;ye(e,r,i)}o[e+i|0]=0,i=(r=d[n+11|0])<<24>>24,a=s[n>>2],e=0;e:if(t=s[t+4>>2]){for(e=r,e=(r=(0|i)<0)?s[n+4>>2]:e,u=r?a:n;;){t:{r:{n:{if(f=(p=(r=(c=(r=d[t+27|0])<<24>>24<0)?s[t+20>>2]:r)>>>0<e>>>0)?r:e){l=t+16|0;i:{if(!(l=Mt(u,c=c?s[l>>2]:l,f))){if(e>>>0>=r>>>0)break i;break t}if((0|l)<0)break t}if(!(r=Mt(c,u,f)))break n;if((0|r)<0)break r;e=1;break e}if(e>>>0<r>>>0)break t}if(!p){e=1;break e}}t=t+4|0}if(!(t=s[t>>2]))break}e=0}(0|i)<0&&ee(a),N=n+16|0}else an(),T();return 0|e},Da:function(e,t,r){e|=0,t|=0,r|=0;var n,i=0,a=0;if(N=n=N-16|0,s[n+12>>2]=0,(i=St(r))>>>0<4294967280){e:{if(i>>>0>=11)e=ur(a=i+16&-16),s[n+8>>2]=-2147483648|a,s[n>>2]=e,s[n+4>>2]=i;else if(o[n+11|0]=i,e=n,!i)break e;ye(e,r,i)}o[e+i|0]=0,(0|(e=$e(t,n)))!=(t+4|0)&&4==((t=s[e+32>>2])-(e=s[e+28>>2])|0)&&(s[n+12>>2]=d[0|e]|d[e+1|0]<<8|d[e+2|0]<<16|d[e+3|0]<<24),e=s[n+12>>2],o[n+11|0]<0&&ee(s[n>>2]),N=n+16|0}else an(),T();return 0|e},Ea:function(e,t,r,n){e|=0,t|=0,n|=0;var i=0,a=0,c=0;if(N=e=N-32|0,(i=St(r|=0))>>>0<4294967280){e:{if(i>>>0>=11)a=ur(c=i+16&-16),s[e+24>>2]=-2147483648|c,s[e+16>>2]=a,s[e+20>>2]=i;else if(o[e+27|0]=i,a=e+16|0,!i)break e;ye(a,r,i)}o[i+a|0]=0,s[e+8>>2]=0,s[e>>2]=0,s[e+4>>2]=0,(0|(r=$e(t,e+16|0)))!=(t+4|0)&&(0|(t=s[r+28>>2]))!=(0|(a=s[r+32>>2]))&&(3&(t=a-t|0)||((i=t>>>2|0)>>>0>(c=(a=s[e+4>>2])-(t=s[e>>2])>>2)>>>0?(ct(e,i-c|0),t=s[e>>2],a=s[e+4>>2]):i>>>0>=c>>>0||(a=(i<<2)+t|0,s[e+4>>2]=a),(0|t)==(0|a)?(dn(),T()):ye(i=t,t=s[r+28>>2],s[r+32>>2]-t|0))),(t=s[n>>2])&&(s[n+4>>2]=t,ee(t)),s[n>>2]=s[e>>2],s[n+4>>2]=s[e+4>>2],s[n+8>>2]=s[e+8>>2],o[e+27|0]<0&&ee(s[e+16>>2]),N=e+32|0}else an(),T()},Fa:function(e,t,r){e|=0,t|=0,r|=0;var n=0,i=0,a=0,c=0;if(N=e=N-32|0,s[e+24>>2]=0,s[e+28>>2]=0,(n=St(r))>>>0<4294967280){e:{if(n>>>0>=11)i=ur(a=n+16&-16),s[e+16>>2]=-2147483648|a,s[e+8>>2]=i,s[e+12>>2]=n;else if(o[e+19|0]=n,i=e+8|0,!n)break e;ye(i,r,n)}o[n+i|0]=0,(0|(r=t+4|0))!=(0|(t=$e(t,e+8|0)))&&8==((r=s[t+32>>2])-(t=s[t+28>>2])|0)&&(r=d[t+4|0]|d[t+5|0]<<8|d[t+6|0]<<16|d[t+7|0]<<24,s[e+24>>2]=d[0|t]|d[t+1|0]<<8|d[t+2|0]<<16|d[t+3|0]<<24,s[e+28>>2]=r),c=m[e+24>>3],o[e+19|0]<0&&ee(s[e+8>>2]),N=e+32|0}else an(),T();return+c},Ga:function(e,t,r){e|=0,t|=0;var n,i=0,a=0,c=0;if(N=n=N-16|0,(i=St(r|=0))>>>0<4294967280){e:{if(i>>>0>=11)a=ur(c=i+16&-16),s[n+8>>2]=-2147483648|c,s[n>>2]=a,s[n+4>>2]=i;else if(o[n+11|0]=i,a=n,!i)break e;ye(a,r,i)}o[i+a|0]=0,r=Qt(t,n,a=e+16|0),t=o[e+27|0],e=s[e+16>>2],o[n+11|0]<0&&ee(s[n>>2]),N=n+16|0,e=r?(0|t)<0?e:a:0}else an(),T();return 0|e},Ha:function(e,t){return s[8+(t|=0)>>2]},Ia:function(e,t,r){t|=0;var n,i=0,a=0,c=0,l=0,d=0,f=0,u=0;n=r|=0;e:if(s[12+(i=e|=0)>>2]!=(0|t)){if(e=t,(0|(t=s[i+4>>2]))!=(0|(r=s[i>>2])))for(;a=t-12|0,o[t-1|0]<0&&ee(s[a>>2]),(0|r)!=(0|(t=a)););if(s[i+12>>2]=e,s[i+4>>2]=r,(0|(t=s[e>>2]))!=(0|(f=e+4|0)))for(;;){if(s[i+8>>2]==(0|r)){l=0;t:{r:{n:{if((r=1+(c=((a=s[i+4>>2])-(e=s[i>>2])|0)/12|0)|0)>>>0<357913942){if(u=(d=(s[i+8>>2]-e|0)/12|0)<<1,r=d>>>0<178956970?r>>>0>u>>>0?r:u:357913941){if(r>>>0>=357913942)break n;l=ur(h(r,12))}if(d=h(r,12),r=h(c,12)+l|0,o[t+27|0]>=0?(c=s[t+20>>2],s[r>>2]=s[t+16>>2],s[r+4>>2]=c,s[r+8>>2]=s[t+24>>2]):(Ot(r,s[t+16>>2],s[t+20>>2]),a=s[i+4>>2],e=s[i>>2]),l=l+d|0,c=r+12|0,(0|e)==(0|a))break r;for(;d=s[4+(a=a-12|0)>>2],s[(r=r-12|0)>>2]=s[a>>2],s[r+4>>2]=d,s[r+8>>2]=s[a+8>>2],s[a>>2]=0,s[a+4>>2]=0,s[a+8>>2]=0,(0|e)!=(0|a););if(s[i+8>>2]=l,e=s[i+4>>2],s[i+4>>2]=c,a=s[i>>2],s[i>>2]=r,(0|e)==(0|a))break t;for(;r=e-12|0,o[e-1|0]<0&&ee(s[r>>2]),e=r,(0|r)!=(0|a););break t}nn(),T()}qt(1326),T()}s[i+8>>2]=l,s[i+4>>2]=c,s[i>>2]=r}a&&ee(a)}else o[t+27|0]>=0?(e=s[t+20>>2],s[r>>2]=s[t+16>>2],s[r+4>>2]=e,s[r+8>>2]=s[t+24>>2]):Ot(r,s[t+16>>2],s[t+20>>2]),s[i+4>>2]=r+12;t:if(r=s[t+4>>2])for(;e=r,r=s[r>>2];);else{if(e=s[t+8>>2],s[e>>2]==(0|t))break t;for(t=t+8|0;t=(r=s[t>>2])+8|0,e=s[r+8>>2],(0|r)!=s[e>>2];);}if((0|e)==(0|f))break e;r=s[i+4>>2],t=e}}return r=0,(0|n)<0||(e=s[i>>2],(s[i+4>>2]-e|0)/12>>>0<=n>>>0||(e=e+h(n,12)|0,r=o[e+11|0]<0?s[e>>2]:e)),0|r},Ja:function(e){var t=0,r=0,n=0;if(e|=0){if(o[e+27|0]<0&&ee(s[e+16>>2]),t=s[e>>2]){if((0|(r=s[e+4>>2]))==(0|t))n=t;else{for(;n=r-12|0,o[r-1|0]<0&&ee(s[n>>2]),(0|(r=n))!=(0|t););n=s[e>>2]}s[e+4>>2]=t,ee(n)}ee(e)}},Ka:function(){var e,t;return e=ur(40),s[e+4>>2]=0,s[e+8>>2]=0,s[e>>2]=e+4,s[(t=e+16|0)>>2]=0,s[t+4>>2]=0,s[e+24>>2]=0,s[e+28>>2]=0,s[e+12>>2]=t,s[e+32>>2]=0,s[e+36>>2]=0,0|e},La:function(e,t,r,n){e|=0,t|=0,r|=0,n|=0;var i,c=0;N=n=N+-64|0,a[n+46>>1]=0,s[n+8>>2]=0,s[n+16>>2]=0,s[n+20>>2]=0,s[n+24>>2]=0,s[n+28>>2]=0,s[n+32>>2]=0,s[n+36>>2]=0,o[n+37|0]=0,o[n+38|0]=0,o[n+39|0]=0,o[n+40|0]=0,o[n+41|0]=0,o[n+42|0]=0,o[n+43|0]=0,o[n+44|0]=0,s[n+24>>2]=0,s[n+28>>2]=0,s[n+8>>2]=t,s[n+16>>2]=r,s[n+20>>2]=0,Ge(t=n+48|0),s[e+24>>2]=s[n+48>>2];e:if((0|t)!=(0|(i=e+24|0)))if(t=n+48|4,r=(c=d[n+63|0])<<24>>24,o[11+(e=e+28|0)|0]>=0){if((0|r)>=0){r=s[t+4>>2],s[e>>2]=s[t>>2],s[e+4>>2]=r,s[e+8>>2]=s[t+8>>2];break e}tr(e,s[n+52>>2],s[n+56>>2])}else Zt(e,(e=(0|r)<0)?s[n+52>>2]:t,e?s[n+56>>2]:c);return o[n+63|0]<0&&ee(s[n+52>>2]),N=n- -64|0,0|i},Ma:function(e,t,r,n){e|=0,t|=0,r|=0,n|=0;var i,c=0,l=0;N=i=N+-64|0,a[38+(c=i+8|0)>>1]=0,s[c>>2]=0,s[c+8>>2]=0,s[c+12>>2]=0,s[c+16>>2]=0,s[c+20>>2]=0,s[c+24>>2]=0,s[c+28>>2]=0,o[c+29|0]=0,o[c+30|0]=0,o[c+31|0]=0,o[c+32|0]=0,o[c+33|0]=0,o[c+34|0]=0,o[c+35|0]=0,o[c+36|0]=0,s[c+16>>2]=0,s[c+20>>2]=0,s[c>>2]=t,s[c+8>>2]=r,s[c+12>>2]=0,B(t=i+48|0,e,c,n),s[e+24>>2]=s[i+48>>2];e:if((0|(r=e+24|0))!=(0|t))if(c=i+48|4,n=(t=d[i+63|0])<<24>>24,o[11+(l=e+28|0)|0]>=0){if((0|n)>=0){e=s[c+4>>2],s[l>>2]=s[c>>2],s[l+4>>2]=e,s[l+8>>2]=s[c+8>>2];break e}tr(l,s[i+52>>2],s[i+56>>2])}else Zt(l,(e=(0|n)<0)?s[i+52>>2]:c,e?s[i+56>>2]:t);return o[i+63|0]<0&&ee(s[i+52>>2]),N=i- -64|0,0|r},Na:function(e,t,r){return 0|cr(t|=0,r|=0)},Oa:function(e,t,r){e|=0,t|=0;var n=0,i=0,a=0;if(N=e=N-32|0,(n=St(r|=0))>>>0<4294967280){e:{if(n>>>0>=11)i=ur(a=n+16&-16),s[e+24>>2]=-2147483648|a,s[e+16>>2]=i,s[e+20>>2]=n;else if(o[e+27|0]=n,i=e+16|0,!n)break e;ye(i,r,n)}o[n+i|0]=0,o[e+4|0]=0,s[e>>2]=1701667182,o[e+11|0]=4,r=-1,(n=s[t+4>>2])&&(r=-1,(n=Ve(n,e,e+16|0))&&(r=Xt(t,s[n+24>>2]))),t=r,o[e+11|0]<0&&ee(s[e>>2]),o[e+27|0]<0&&ee(s[e+16>>2]),N=e+32|0}else an(),T();return 0|t},Pa:function(e,t,r,n){e|=0,t|=0,n|=0;var i,a=0,c=0;N=i=N-32|0;e:{t:{if((a=St(r|=0))>>>0<4294967280){r:{if(a>>>0>=11)e=ur(c=a+16&-16),s[i+24>>2]=-2147483648|c,s[i+16>>2]=e,s[i+20>>2]=a;else if(o[i+27|0]=a,e=i+16|0,!a)break r;ye(e,r,a)}if(o[e+a|0]=0,(r=St(n))>>>0>=4294967280)break t;r:{if(r>>>0>=11)e=ur(a=r+16&-16),s[i+8>>2]=-2147483648|a,s[i>>2]=e,s[i+4>>2]=r;else if(o[i+11|0]=r,e=i,!r)break r;ye(e,n,r)}o[e+r|0]=0,e=-1,(r=s[t+4>>2])&&(e=-1,(r=Ve(r,i+16|0,i))&&(e=Xt(t,s[r+24>>2]))),o[i+11|0]<0&&ee(s[i>>2]),o[i+27|0]<0&&ee(s[i+16>>2]),N=i+32|0;break e}an(),T()}an(),T()}return 0|e},Qa:function(e,t,r){return r|=0,s[s[8+(t|=0)>>2]+(r<<2)>>2]},Ra:function(e,t,r){e|=0,r|=0;var n=0,i=0;n=(e=s[12+(t|=0)>>2])-(t=s[t+8>>2])|0,e=0;e:if(n){n=(e=n>>2)>>>0>1?e:1,e=0;t:{for(;;){if(i=s[t+(e<<2)>>2],s[i+60>>2]==(0|r))break t;if((0|n)==(0|(e=e+1|0)))break}e=0;break e}e=-1==(0|e)?0:i}return 0|e},Sa:function(e,t){return s[4+(t|=0)>>2]},Ta:function(e,t,r){e|=0,r|=0;var n,i=0;if((n=s[4+(t|=0)>>2])&&!((0|(t=s[s[s[t+8>>2]+(r<<2)>>2]+60>>2]))<0)&&(0|(e=s[n+24>>2]))!=(0|(r=s[n+28>>2])))e:{for(;;){if(i=s[e>>2],(0|t)==s[i+24>>2])break e;if((0|r)==(0|(e=e+4|0)))break}i=0}return 0|i},Ua:function(e,t,r,n){var i,o;return e|=0,r|=0,n|=0,N=e=N-16|0,t=s[96+(t|=0)>>2],s[e+8>>2]=0,s[e>>2]=0,s[e+4>>2]=0,o=(r=ye(i=ur(12),t+h(r,12)|0,12))+12|0,(t=s[n>>2])&&(s[n+4>>2]=t,ee(t)),s[n+8>>2]=r+12,s[n+4>>2]=o,s[n>>2]=i,N=e+16|0,1},Va:function(e,t,r){e|=0,t|=0;var n,i,a,c,l,f,u=0,p=0,m=0,b=0,v=0,g=0,A=0,_=0,x=0,y=0,k=0,w=0,C=0,M=0,I=0,S=0,R=0,E=0,P=0,B=0,D=0,O=0,z=0,F=0,G=0,U=0,V=0;f=r|=0,r=0,N=i=N-96|0,We(n=i+16|0,0,76),s[i+92>>2]=-1,s[i+8>>2]=0,s[i>>2]=0,s[i+4>>2]=0,N=a=N-16|0,s[n+68>>2]=0,s[n+72>>2]=0,s[n>>2]=t,N=c=N-16|0,l=t,e=s[t+20>>2],(s[t+24>>2]-e|0)<=0||-1!=(0|(e=s[e>>2]))&&(r=s[s[t+8>>2]+(e<<2)>>2]);e:{t:{if(r){e=s[l+100>>2],m=s[l+96>>2],s[c+8>>2]=0,s[c>>2]=0,s[c+4>>2]=0,t=(0|(v=e-m|0))/12|0;r:if(v){if(t>>>0>=357913942)break t;if(u=ur(v),s[c>>2]=u,s[c+8>>2]=u+h(t,12),e=0,v=We(g=u,0,u=h((v-12>>>0)/12|0,12)+12|0),s[c+4>>2]=u+v,d[r+84|0]){if(u=1&(r=t>>>0>1?t:1),t>>>0>=2)for(g=-2&r;r=h(e,12),_=s[4+(t=r+m|0)>>2],x=s[t>>2],s[8+(r=r+v|0)>>2]=s[t+8>>2],s[r>>2]=x,s[r+4>>2]=_,r=h(1|e,12),_=s[8+(t=r+m|0)>>2],x=s[t+4>>2],s[(r=r+v|0)>>2]=s[t>>2],s[r+4>>2]=x,s[r+8>>2]=_,e=e+2|0,(0|g)!=(0|(p=p+2|0)););if(!u)break r;t=h(e,12),r=s[4+(e=t+m|0)>>2],p=s[e>>2],s[8+(t=t+v|0)>>2]=s[e+8>>2],s[t>>2]=p,s[t+4>>2]=r}else for(u=t>>>0>1?t:1,e=s[r+68>>2];r=h(p,12),g=s[e+(s[(t=r+m|0)>>2]<<2)>>2],_=s[e+(s[t+4>>2]<<2)>>2],s[8+(r=r+v|0)>>2]=s[e+(s[t+8>>2]<<2)>>2],s[r+4>>2]=_,s[r>>2]=g,(0|u)!=(0|(p=p+1|0)););}if(N=B=N-16|0,u=ur(88),s[u>>2]=0,s[u+4>>2]=0,s[u+56>>2]=0,s[u+48>>2]=0,s[u+52>>2]=0,s[u+40>>2]=0,s[u+44>>2]=0,s[u+32>>2]=0,s[u+36>>2]=0,s[u+24>>2]=0,s[u+28>>2]=0,s[u+16>>2]=0,s[u+20>>2]=0,s[u+8>>2]=0,s[u+12>>2]=0,s[(e=u- -64|0)>>2]=0,s[e+4>>2]=0,s[u+72>>2]=0,s[u+76>>2]=0,s[u+80>>2]=0,s[u+84>>2]=0,s[u+60>>2]=u,N=E=N-16|0,s[u+80>>2]=0,s[u+84>>2]=0,e=s[u+76>>2],s[u+76>>2]=0,e&&ee(e),s[u+68>>2]=0,s[u+72>>2]=0,e=s[(t=u- -64|0)>>2],s[t>>2]=0,e&&ee(e),p=s[c>>2],t=s[c+4>>2]-p|0,e=h(_=(0|t)/12|0,3),r=s[u>>2],e>>>0>(m=s[u+4>>2]-r>>2)>>>0?(ct(u,e-m|0),p=s[c>>2],_=(0|(t=s[c+4>>2]-p|0))/12|0,r=s[u>>2]):e>>>0>=m>>>0||(s[u+4>>2]=(e<<2)+r),t)for(v=_>>>0>1?_:1,e=0;t=(m=h(e,12))+r|0,m=m+p|0,s[t>>2]=s[m>>2],s[t+4>>2]=s[m+4>>2],s[t+8>>2]=s[m+8>>2],(0|v)!=(0|(e=e+1|0)););s[E+12>>2]=-1,N=m=N-48|0;r:{n:{i:{if(S=E+12|0){if(k=(t=(g=s[u+4>>2])-(x=s[u>>2])|0)>>2,r=s[u+12>>2],k>>>0>(e=s[u+16>>2]-r>>2)>>>0?(xe(u+12|0,k-e|0,10260),k=(t=(g=s[u+4>>2])-(x=s[u>>2])|0)>>2):e>>>0<=k>>>0||(s[u+16>>2]=r+(k<<2)),r=0,s[m+40>>2]=0,s[m+32>>2]=0,s[m+36>>2]=0,t){o:{if((0|t)>=0)for(r=ur(t),s[m+36>>2]=r,s[m+32>>2]=r,s[m+40>>2]=(k<<2)+r,e=r,t=0;;){if((v=s[(t<<2)+x>>2])>>>0<(e=e-r>>2)>>>0||(s[m+16>>2]=0,(p=v+1|0)>>>0>e>>>0?(xe(m+32|0,p-e|0,m+16|0),x=s[u>>2],g=s[u+4>>2],r=s[m+32>>2]):e>>>0<=p>>>0||(s[m+36>>2]=(p<<2)+r)),s[(e=(v<<2)+r|0)>>2]=s[e>>2]+1,(t=t+1|0)>>>0>=(k=(e=g-x|0)>>2)>>>0)break o;e=s[m+36>>2]}break i}if(s[m+24>>2]=0,s[m+16>>2]=0,s[m+20>>2]=0,e){if(k>>>0>=536870912)break n;e=ur(t=e<<1),s[m+16>>2]=e,p=e+(k<<3)|0,s[m+24>>2]=p,We(e,255,t),s[m+20>>2]=p}}else s[m+24>>2]=0,s[m+16>>2]=0,s[m+20>>2]=0;if(g=0,s[m+8>>2]=0,s[m>>2]=0,s[m+4>>2]=0,v=(e=s[m+36>>2]-r|0)>>2,e){if((0|e)<0)break n;if(C=ur(e),s[m>>2]=C,s[m+8>>2]=(v<<2)+C,t=e,e=We(C,0,e),s[m+4>>2]=t+e,_=3&(p=v>>>0>1?v:1),t=0,p-1>>>0>=3)for(w=-4&p;s[(p=b<<2)+e>>2]=t,R=4|p,t=s[r+p>>2]+t|0,s[R+e>>2]=t,I=8|p,t=t+s[r+R>>2]|0,s[I+e>>2]=t,p|=12,t=t+s[r+I>>2]|0,s[p+e>>2]=t,t=t+s[r+p>>2]|0,b=b+4|0,(0|w)!=(0|(A=A+4|0)););if(_)for(;s[(p=b<<2)+e>>2]=t,b=b+1|0,t=s[r+p>>2]+t|0,(0|_)!=(0|(y=y+1|0)););}if(k)for(R=s[u+12>>2];;){t=(D=g<<2)+x|0,A=-1,-1!=(0|(e=((p=g+1|0)>>>0)%3|0?p:g-2|0))&&(A=s[(e<<2)+x>>2]),e=s[t>>2];o:{a:{if(!((g>>>0)%3|0)){if(y=-1,-1!=(0|(t=g+2|0))&&(y=s[(t<<2)+x>>2]),!((0|e)==(0|A)|(0|e)==(0|y))&(0|A)!=(0|y))break a;s[u+40>>2]=s[u+40>>2]+1,p=g+3|0;break o}y=s[t-4>>2]}a:{s:if(!((0|(I=s[(t=y<<2)+r>>2]))<=0))for(_=s[m+16>>2],t=s[t+C>>2],b=0;;){if(-1==(0|(M=s[(w=_+(t<<3)|0)>>2])))break s;if((0|A)==(0|M)&&(0|(M=-1!=(0|(w=s[w+4>>2]))?s[(w<<2)+x>>2]:-1))!=(0|e)){for(;e=t,!((0|I)<=(0|(b=b+1|0))||(M=_+(e<<3)|0,z=s[(O=_+((t=e+1|0)<<3)|0)>>2],s[M>>2]=z,s[M+4>>2]=s[O+4>>2],-1==(0|z))););if(s[_+(e<<3)>>2]=-1,-1==(0|w))break s;s[R+D>>2]=w,s[R+(w<<2)>>2]=g;break a}if(t=t+1|0,(0|I)==(0|(b=b+1|0)))break}if(!((0|(_=s[(e=A<<2)+r>>2]))<=0))for(A=s[m+16>>2],t=s[e+C>>2],b=0;;){if(-1==s[(e=A+(t<<3)|0)>>2]){s[e>>2]=y,s[e+4>>2]=g;break a}if(t=t+1|0,(0|_)==(0|(b=b+1|0)))break}}}if(!(k>>>0>(g=p)>>>0))break}s[S>>2]=v,C&&ee(C),(e=s[m+16>>2])&&(s[m+20>>2]=e,ee(e)),(e=s[m+32>>2])&&(s[m+36>>2]=e,ee(e))}if(N=m+48|0,R=0!=(0|S)){if(N=A=N-32|0,y=s[u>>2],e=s[u+4>>2],s[A+24>>2]=0,s[A+16>>2]=0,s[A+20>>2]=0,t=e-y|0){if((0|t)<0)break n;r=ur((p=1+(b=(t>>=2)-1>>>5|0)|0)<<2),s[A+24>>2]=p,s[A+16>>2]=r,s[A+20>>2]=t,s[r+((t>>>0<33?0:b)<<2)>>2]=0,b=We(b=r,0,r=t>>>5<<2),(t&=31)&&(s[(r=r+b|0)>>2]=s[r>>2]&(-1>>>32-t^-1))}for(s[A+8>>2]=0,s[A>>2]=0;;){if(k=0,p=0,(0|e)!=(0|y)){for(;;){r=s[A+16>>2];o:if(!(s[r+(p>>>3&536870908)>>2]>>>p&1)){for(b=s[A>>2],s[A+4>>2]=b,t=s[u+12>>2],e=p;v=e,!(-1==(0|(e=((m=e+1|0)>>>0)%3|0?m:e-2|0))||-1==(0|(e=s[t+(e<<2)>>2]))||(0|p)==(0|(e=((m=e+1|0)>>>0)%3|0?m:e-2|0))|-1==(0|e)||s[(e>>>3&536870908)+r>>2]>>>e&1););t=b,_=v;a:{s:{for(;;){if(s[(e=(_>>>3&536870908)+r|0)>>2]=s[e>>2]|1<<_,m=((e=_+1|0)>>>0)%3|0?e:_-2|0,w=(x=((I=(_>>>0)%3|0)?-1:2)+_|0)<<2,(0|t)!=(0|b))if(S=s[(m<<2)+y>>2],C=s[u+12>>2],e=t,-1==(0|x))for(;;){if((0|S)==s[e>>2]&&(g=-1,x=-1,-1!=(0|(r=s[e+4>>2]))))break s;if((0|b)==(0|(e=e+8|0)))break}else for(M=C+w|0;;){if((0|S)==s[e>>2]&&(0|(r=s[e+4>>2]))!=(0|(g=s[M>>2]))){if(b=-1,e=-1,-1==(0|r))break a;break s}if((0|b)==(0|(e=e+8|0)))break}if(x=s[y+w>>2],s[A+8>>2]==(0|b)){if((e=1+(b=(r=b-t|0)>>3)|0)>>>0>=536870912)break n;if(g=r>>2,g=b>>>0<268435455?e>>>0>g>>>0?e:g:536870911){if(g>>>0>=536870912)break i;e=ur(g<<3)}else e=0;s[(b=e+(b<<3)|0)>>2]=x,s[b+4>>2]=m,b=b+8|0,(0|r)>0&&ye(e,t,r),s[A+8>>2]=e+(g<<3),s[A+4>>2]=b,s[A>>2]=e,t&&ee(t)}else s[b>>2]=x,s[b+4>>2]=m,b=b+8|0,s[A+4>>2]=b;c:{if(I)e=_-1|0;else if(-1==(0|(e=_+2|0)))break c;if(-1!=(0|(e=s[s[u+12>>2]+(e<<2)>>2]))&&!((0|v)==(0|(_=e+((e>>>0)%3|0?-1:2)|0))|-1==(0|_))){y=s[u>>2],t=s[A>>2],r=s[A+16>>2];continue}}break}y=s[u>>2];break o}b=r,e=s[C+(r<<2)>>2]}-1!=(0|g)&&(s[C+(g<<2)>>2]=-1),-1!=(0|e)&&(s[s[u+12>>2]+(e<<2)>>2]=-1),e=s[u+12>>2],s[e+(x<<2)>>2]=-1,s[e+(b<<2)>>2]=-1,k=1}if(!((p=p+1|0)>>>0<(e=s[u+4>>2])-y>>2>>>0))break}if(k)continue}break}(e=s[A>>2])&&ee(e),(e=s[A+16>>2])&&ee(e),p=0,x=0,k=0,N=v=(N=A+32|0)-32|0,e=s[E+12>>2],s[u+36>>2]=e,y=u+24|0,r=s[u+24>>2];o:{if((t=s[u+28>>2]-r>>2)>>>0<e>>>0)xe(y,e-t|0,10260),s[v+24>>2]=0,s[v+16>>2]=0,s[v+20>>2]=0;else if(e>>>0<t>>>0&&(s[u+28>>2]=r+(e<<2)),s[v+24>>2]=0,s[v+16>>2]=0,s[v+20>>2]=0,!e)break o;if((0|e)<0)break n;p=ur((r=1+(t=e-1>>>5|0)|0)<<2),s[v+24>>2]=r,s[v+16>>2]=p,s[v+20>>2]=e,s[((e>>>0<33?0:t)<<2)+p>>2]=0,r=We(p,0,t=e>>>5<<2),(b=31&e)&&(s[(t=t+r|0)>>2]=s[t>>2]&(-1>>>32-b^-1))}if(g=s[u>>2],_=s[u+4>>2],s[v+8>>2]=0,s[v>>2]=0,s[v+4>>2]=0,t=_-g|0){if((0|t)<0)break n;if(A=ur((b=1+(r=(t>>=2)-1>>>5|0)|0)<<2),s[v+8>>2]=b,s[v>>2]=A,s[v+4>>2]=t,s[((t>>>0<33?0:r)<<2)+A>>2]=0,b=We(A,0,r=t>>>5<<2),(m=31&t)&&(s[(r=r+b|0)>>2]=s[r>>2]&(-1>>>32-m^-1)),!(t>>>0<3)){for(;;){if(w=h(x,3),t=s[(b=(w<<2)+g|0)>>2],r=-1,-1!=(0|(m=w+1|0))&&(r=s[(m<<2)+g>>2]),(0|t)!=(0|r)&&(0|(m=t))!=(0|(t=s[b+8>>2]))&&(C=0,(0|t)!=(0|r))){for(;;){if(!(s[((b=C+w|0)>>>3&536870908)+A>>2]>>>b&1)){if(_=(r=1<<(t=s[(b<<2)+g>>2]))&s[((A=t>>>5|0)<<2)+p>>2]){if((0|(r=s[u+28>>2]))==s[u+32>>2]){if((r=1+(A=(m=r-(p=s[y>>2])|0)>>2)|0)>>>0>=1073741824)break n;if(g=m>>1,g=A>>>0<536870911?r>>>0>g>>>0?r:g:1073741823){if(g>>>0>=1073741824)break i;r=ur(g<<2)}else r=0;s[(A=r+(A<<2)|0)>>2]=-1,(0|m)>0&&ye(r,p,m),s[u+32>>2]=r+(g<<2),s[u+28>>2]=A+4,s[u+24>>2]=r,p&&ee(p)}else s[r>>2]=-1,s[u+28>>2]=r+4;if((0|(r=s[u+52>>2]))==s[u+56>>2]){if((r=1+(A=(m=r-(p=s[u+48>>2])|0)>>2)|0)>>>0>=1073741824)break n;if(g=m>>1,g=A>>>0<536870911?r>>>0>g>>>0?r:g:1073741823){if(g>>>0>=1073741824)break i;r=ur(g<<2)}else r=0;s[(A=r+(A<<2)|0)>>2]=t,(0|m)>0&&ye(r,p,m),s[u+56>>2]=r+(g<<2),s[u+52>>2]=A+4,s[u+48>>2]=r,p&&ee(p)}else s[r>>2]=t,s[u+52>>2]=r+4;if((0|(r=s[v+20>>2]))==(t=s[v+24>>2])<<5){if((r+1|0)<0)break n;at(p=v+16|0,t=r>>>0<=1073741822?(t<<=6)>>>0<(r=r+32&-32)>>>0?r:t:2147483647),r=s[v+20>>2]}s[v+20>>2]=r+1,t=s[v+16>>2]+(r>>>3&536870908)|0,p=s[t>>2],U=t,V=Mr(r)&p,s[U>>2]=V,r=1<<e,A=e>>>5|0,t=e,e=e+1|0}m=e,p=s[v+16>>2],s[(e=p+(A<<2)|0)>>2]=s[e>>2]|r,I=s[u+24>>2]+(t<<2)|0,S=s[u+12>>2],g=s[u>>2],A=s[v>>2],e=b;o:{a:{s:{c:{l:{d:{for(;;){if(-1==(0|e))break d;if(s[(r=(e>>>3&536870908)+A|0)>>2]=s[r>>2]|1<<e,s[I>>2]=e,_&&(s[(e<<2)+g>>2]=t),r=-1,-1!=(0|(e=((M=e+1|0)>>>0)%3|0?M:e-2|0))&&(r=-1,-1!=(0|(e=s[S+(e<<2)>>2]))&&(r=((r=e+1|0)>>>0)%3|0?r:e-2|0)),(0|b)==(0|(e=r)))break}if(-1!=(0|b))break o;e=1;break l}if((b>>>0)%3|0)e=b-1|0;else if(-1==(0|(e=b+2|0)))break c}if(-1!=(0|(e=s[S+(e<<2)>>2]))){if(!((e>>>0)%3|0))break s;e=e-1|0,g=s[u>>2],A=s[v>>2];break a}}g=s[u>>2],A=s[v>>2];break o}if(g=s[u>>2],A=s[v>>2],-1==(0|(e=e+2|0)))break o}for(r=s[u+12>>2];;){if(s[(b=(e>>>3&536870908)+A|0)>>2]=s[b>>2]|1<<e,_&&(s[(e<<2)+g>>2]=t),(e>>>0)%3|0)e=e-1|0;else if(-1==(0|(e=e+2|0)))break o;if(-1==(0|(e=s[r+(e<<2)>>2])))break o;if(-1==(0|(e=e+((e>>>0)%3|0?-1:2)|0)))break}}e=m}if(3==(0|(C=C+1|0)))break}g=s[u>>2],_=s[u+4>>2]}if(!((x=x+1|0)>>>0<(_-g>>2>>>0)/3>>>0))break}p=s[v+16>>2]}}if(s[u+44>>2]=0,e=s[v+20>>2])for(t=31&e,b=(e>>>3&536870908)+p|0,e=0,r=p;s[r>>2]>>>e&1||(k=k+1|0,s[u+44>>2]=k),(0|b)!=(0|(r=((m=31==(0|e))<<2)+r|0))|(0|(e=m?0:e+1|0))!=(0|t););(e=s[v>>2])&&(ee(e),p=s[v+16>>2]),p&&ee(p),N=v+32|0}N=E+16|0,R||(s[B+8>>2]=0,Pt(u),u=0),N=B+16|0,e=u;break r}qt(1326),T()}nn(),T()}(t=s[c>>2])&&(s[c+4>>2]=t,ee(t))}else e=0;N=c+16|0;break e}nn(),T()}if(t=s[n+4>>2],s[n+4>>2]=e,t&&(Pt(t),e=s[n+4>>2]),e)if(e=s[l+100>>2],t=s[l+96>>2],o[a+12|0]=0,He(n+56|0,(e-t|0)/12|0,a+12|0),(0|(e=s[l+100>>2]))!=(0|(t=s[l+96>>2])))for(;;){if(!(s[s[n+56>>2]+(P>>>3&536870908)>>2]>>>P&1)){if(ie(n,0,e=h(P,3)),t=s[n+8>>2],r=s[n+12>>2],ie(n,1,e+1|0),b=s[n+20>>2],p=s[n+24>>2],ie(n,2,e+2|0),e=(b=p-b>>2)>>>0>(r=(t=r-t|0)>>2)>>>0,r=s[n+36>>2]-s[n+32>>2]>>2>>>0>(e?b:r)>>>0?2:e?1:t?0:-1,s[n+68>>2]<=0||(s[a+12>>2]=s[n+76>>2],s[a+8>>2]=i,dt(a+8|0,a+12|0),(0|(e=s[44+((r<<2)+n|0)>>2]))<0?e=-1:(t=(e>>>0)/3|0,e=s[(s[s[n>>2]+96>>2]+h(t,12)|0)+(e-h(t,3)<<2)>>2]),s[a+12>>2]=e,s[a+8>>2]=i,dt(a+8|0,a+12|0),t=s[n+72>>2],s[n+72>>2]=t+2,1&t&&(s[a+12>>2]=e,s[a+8>>2]=i,dt(a+8|0,a+12|0),s[n+72>>2]=s[n+72>>2]+1)),N=t=N-16|0,s[n+68>>2]=s[n+68>>2]+1,e=h(r,12)+n|0,!((0|(b=s[e+12>>2]-s[e+8>>2]|0))<=0)){e=-1,p=((r=s[44+((r<<2)+n|0)>>2])>>>0)/3|0,m=(v=-1==(0|r))?-1:p,u=s[n+56>>2]+(m>>>3&536870908)|0,s[u>>2]=s[u>>2]|1<<m,s[n+72>>2]=s[n+72>>2]+1,s[t+12>>2]=(0|r)>=0?s[(s[s[n>>2]+96>>2]+h(p,12)|0)+((r>>>0)%3<<2)>>2]:-1,s[t+8>>2]=i,dt(t+8|0,t+12|0);e:if(v)s[t+12>>2]=-1,s[t+8>>2]=i,dt(t+8|0,t+12|0);else{if((0|(m=((m=r+1|0)>>>0)%3|0?m:r-2|0))>=0?(v=(m>>>0)/3|0,u=s[(s[s[n>>2]+96>>2]+h(v,12)|0)+(m-h(v,3)<<2)>>2]):u=-1,s[t+12>>2]=u,s[t+8>>2]=i,dt(t+8|0,t+12|0),(0|(p=r+(r-h(p,3)|0?-1:2)|0))<0)break e;e=(p>>>0)/3|0,e=s[(s[s[n>>2]+96>>2]+h(e,12)|0)+(p-h(e,3)<<2)>>2]}if(s[n+76>>2]=e,s[t+12>>2]=e,s[t+8>>2]=i,e=-1,dt(t+8|0,t+12|0),e=-1!=(0|r)?s[s[s[n+4>>2]+12>>2]+(r<<2)>>2]:e,!(b>>>0<=7))for(v=(r=b>>>2|0)>>>0>1?r:1,r=1;;){b=e,m=(e>>>0)/3|0,e=-1==(0|e)?-1:m,p=s[n+56>>2]+(e>>>3&536870908)|0,s[p>>2]=s[p>>2]|1<<e,s[n+72>>2]=s[n+72>>2]+1,e=-1,e=(0|b)>=0?s[(s[s[n>>2]+96>>2]+h(m,12)|0)+((b>>>0)%3<<2)>>2]:e,s[n+76>>2]=e,s[t+12>>2]=e,s[t+8>>2]=i,dt(t+8|0,t+12|0);e:{t:{if(1&r){if(p=-1,-1==(0|b))break e;if((0|b)!=(0|h(m,3))){e=b-1|0;break t}e=b+2|0}else{if(p=-1,-1==(0|b))break e;e=((e=b+1|0)>>>0)%3|0?e:b-2|0}if(p=-1,-1==(0|e))break e}p=s[s[s[n+4>>2]+12>>2]+(e<<2)>>2]}if(e=p,(0|v)==(0|(r=r+1|0)))break}}N=t+16|0,t=s[l+96>>2],e=s[l+100>>2]}if(F=1,!((P=P+1|0)>>>0<(e-t|0)/12>>>0))break}else F=1;return N=a+16|0,F?((e=s[f>>2])&&(s[f+4>>2]=e,ee(e)),s[f>>2]=s[i>>2],s[f+4>>2]=s[i+4>>2],s[f+8>>2]=s[i+8>>2],G=s[i+84>>2]):(e=s[i>>2])&&(s[i+4>>2]=e,ee(e)),(e=s[i+72>>2])&&ee(e),(e=s[i+48>>2])&&(s[i+52>>2]=e,ee(e)),(e=s[i+36>>2])&&(s[i+40>>2]=e,ee(e)),(e=s[i+24>>2])&&(s[i+28>>2]=e,ee(e)),e=s[i+20>>2],s[i+20>>2]=0,e&&Pt(e),N=i+96|0,0|G},Wa:function(e,t,r,n){e|=0,r|=0,n|=0;var i=0,o=0,c=0;if(!(u[80+(t|=0)>>2]>65535||(o=s[t+96>>2],t=s[t+100>>2]-o|0,c=(0|(i=h(e=(0|t)/12|0,6)))==(0|r),!t|(0|r)!=(0|i))))for(c=1,i=e>>>0>1?e:1,e=0;t=h(e,6)+n|0,r=h(e,12)+o|0,a[t>>1]=s[r>>2],a[t+2>>1]=s[r+4>>2],a[t+4>>1]=s[r+8>>2],(0|i)!=(0|(e=e+1|0)););return 0|c},Xa:function(e,t,r,n){e|=0,r|=0,n|=0;var i,o=0,a=0,c=0;if(i=s[96+(t|=0)>>2],!((0|(t=s[t+100>>2]-i|0))!=(0|r)|!t))for(c=(e=(0|r)/12|0)>>>0>1?e:1,e=0;a=(o=h(e,12))+n|0,o=o+i|0,s[a>>2]=s[o>>2],s[a+4>>2]=s[o+4>>2],s[a+8>>2]=s[o+8>>2],(0|c)!=(0|(e=e+1|0)););return(0|t)==(0|r)|0},Ya:function(e,t,r,n){e|=0,r|=0,n|=0;var i=0,a=0,c=0;N=e=N-32|0,i=o[24+(t|=0)|0],a=s[2563],s[e+24>>2]=s[2562],s[e+28>>2]=a,a=s[2561],s[e+16>>2]=s[2560],s[e+20>>2]=a;e:{t:{if(r=O(t,r,i,e+16|0)){if(s[e+8>>2]=0,s[e>>2]=0,s[e+4>>2]=0,t=0,i){if((0|i)<0)break t;c=ye(t=ur(i<<=2),e+16|0,i)+i|0}(i=s[n>>2])&&(s[n+4>>2]=i,ee(i)),s[n+8>>2]=c,s[n+4>>2]=c,s[n>>2]=t}N=e+32|0;break e}nn(),T()}return 0|r},Za:function(e,t,r,n){e|=0,r|=0,n|=0;var i,a,c=0,l=0,f=0,u=0,m=0,b=0,v=0,g=0,A=0,_=0,x=0;e=0,N=i=N-16|0,a=s[80+(t|=0)>>2],c=o[r+24|0],s[i+8>>2]=0,s[i>>2]=0,s[i+4>>2]=0;e:{t:{if(c){if((0|c)<0)break t;if(e=ur(t=c<<2),s[i>>2]=e,f=e+t|0,s[i+8>>2]=f,b=1+((u=t-4|0)>>>2|0)&7)for(t=e;s[t>>2]=-1073741824,t=t+4|0,(0|b)!=(0|(l=l+1|0)););else t=e;if(u>>>0>=28)for(;s[t+24>>2]=-1073741824,s[t+28>>2]=-1073741824,s[t+16>>2]=-1073741824,s[t+20>>2]=-1073741824,s[t+8>>2]=-1073741824,s[t+12>>2]=-1073741824,s[t>>2]=-1073741824,s[t+4>>2]=-1073741824,(0|f)!=(0|(t=t+32|0)););s[i+4>>2]=f}t=h(c,a),f=s[n>>2],t>>>0>(l=s[n+4>>2]-f>>2)>>>0?ct(n,t-l|0):t>>>0>=l>>>0||(s[n+4>>2]=f+(t<<2));r:if(a)if(m=1,(0|c)<=0)for(t=0;;){if(!O(r,d[r+84|0]?t:s[s[r+68>>2]+(t<<2)>>2],o[r+24|0],e))break r;if(m=a>>>0>(t=t+1|0)>>>0,(0|t)==(0|a))break}else{for(_=-4&c,b=3&c,l=0,x=c-1>>>0<3;;){if(O(r,d[r+84|0]?v:s[s[r+68>>2]+(v<<2)>>2],o[r+24|0],e)){if(A=s[n>>2],g=0,c=s[i>>2],t=0,m=0,!x)for(;u=t<<2,p[(f=A+(l<<2)|0)>>2]=p[u+c>>2],p[f+4>>2]=p[(4|u)+c>>2],p[f+8>>2]=p[(8|u)+c>>2],p[f+12>>2]=p[(12|u)+c>>2],t=t+4|0,l=l+4|0,(0|_)!=(0|(m=m+4|0)););if(b)for(;p[A+(l<<2)>>2]=p[(t<<2)+c>>2],t=t+1|0,l=l+1|0,(0|b)!=(0|(g=g+1|0)););if(m=(v=v+1|0)>>>0<a>>>0,(0|a)!=(0|v))continue}break}e=s[i>>2]}e&&ee(e),N=i+16|0,e=1&(-1^m);break e}nn(),T()}return 0|e},_a:be,$a:function(e,t,r,n){e|=0,r|=0,n|=0;var i,a,c,l=0,f=0,u=0,p=0,m=0,b=0,v=0;N=i=N-16|0,a=s[80+(t|=0)>>2],c=d[r+24|0],l=h(a,t=c<<24>>24);e:{t:{r:{if(!(1==(0|(e=s[r+28>>2]))|2==(0|e))|!d[r+84|0]){if(s[i+8>>2]=0,s[i>>2]=0,s[i+4>>2]=0,t){if((0|t)<0)break r;f=ur(t),s[i>>2]=f,e=t+f|0,s[i+8>>2]=e,We(f,0,t),s[i+4>>2]=e}n:if((m=(e=s[n+4>>2])-(p=s[n>>2])|0)>>>0<l>>>0){if((b=l-m|0)>>>0<=(v=s[n+8>>2])-e>>>0){b&&(e=We(e,0,b)+b|0),s[n+4>>2]=e;break n}if((0|l)<0)break t;if(v=(e=v-p|0)<<1,(e=e>>>0<1073741823?l>>>0>v>>>0?l:v:2147483647)&&(u=ur(e)),We(u+m|0,0,b),(0|m)>0&&ye(u,p,m),s[n+8>>2]=e+u,s[n+4>>2]=l+u,s[n>>2]=u,!p)break n;ee(p)}else l>>>0>=m>>>0||(s[n+4>>2]=l+p);n:if(a)if(t){for(p=-2&(e=t-1|0),m=1&e,e=0,t=1,u=0;;){if(l=s[i>>2],G(r,d[r+84|0]?u:s[s[r+68>>2]+(u<<2)>>2],o[r+24|0],l)){o[s[n>>2]+e|0]=d[0|l],t=1,e=e+1|0,f=0;i:{o:switch(c-1|0){default:for(;o[s[n>>2]+e|0]=d[s[i>>2]+t|0],o[1+(s[n>>2]+e|0)|0]=d[1+(s[i>>2]+t|0)|0],t=t+2|0,e=e+2|0,(0|p)!=(0|(f=f+2|0)););break;case 0:break i;case 1:}m&&(o[s[n>>2]+e|0]=d[s[i>>2]+t|0],e=e+1|0)}if(t=a>>>0>(u=u+1|0)>>>0,(0|u)!=(0|a))continue}break}f=s[i>>2]}else for(e=0,t=1;;){if(!G(r,d[r+84|0]?e:s[s[r+68>>2]+(e<<2)>>2],o[r+24|0],f))break n;if(t=a>>>0>(e=e+1|0)>>>0,(0|e)==(0|a))break}else t=0;f&&ee(f),e=!t}else{if(e=s[r+48>>2],r=s[s[r>>2]>>2],t=0,s[i+8>>2]=0,s[i>>2]=0,s[i+4>>2]=0,l){if((0|l)<0)break r;t=ye(f=ur(l),e+r|0,l)+l|0}(e=s[n>>2])&&(s[n+4>>2]=e,ee(e)),s[n+8>>2]=t,s[n+4>>2]=t,s[n>>2]=f,e=1}N=i+16|0,e&=1;break e}nn(),T()}nn(),T()}return 0|e},ab:function(e,t,r,n){e|=0,r|=0,n|=0;var i,a,c,l=0,f=0,u=0,p=0,m=0,b=0,v=0;N=i=N-16|0,a=s[80+(t|=0)>>2],c=d[r+24|0],l=h(a,t=c<<24>>24);e:{t:{r:{if(!(1==(0|(e=s[r+28>>2]))|2==(0|e))|!d[r+84|0]){if(s[i+8>>2]=0,s[i>>2]=0,s[i+4>>2]=0,t){if((0|t)<0)break r;f=ur(t),s[i>>2]=f,e=t+f|0,s[i+8>>2]=e,We(f,0,t),s[i+4>>2]=e}n:if((m=(e=s[n+4>>2])-(p=s[n>>2])|0)>>>0<l>>>0){if((b=l-m|0)>>>0<=(v=s[n+8>>2])-e>>>0){b&&(e=We(e,0,b)+b|0),s[n+4>>2]=e;break n}if((0|l)<0)break t;if(v=(e=v-p|0)<<1,(e=e>>>0<1073741823?l>>>0>v>>>0?l:v:2147483647)&&(u=ur(e)),We(u+m|0,0,b),(0|m)>0&&ye(u,p,m),s[n+8>>2]=e+u,s[n+4>>2]=l+u,s[n>>2]=u,!p)break n;ee(p)}else l>>>0>=m>>>0||(s[n+4>>2]=l+p);n:if(a)if(t){for(p=-2&(e=t-1|0),m=1&e,e=0,t=1,u=0;;){if(l=s[i>>2],U(r,d[r+84|0]?u:s[s[r+68>>2]+(u<<2)>>2],o[r+24|0],l)){o[s[n>>2]+e|0]=d[0|l],t=1,e=e+1|0,f=0;i:{o:switch(c-1|0){default:for(;o[s[n>>2]+e|0]=d[s[i>>2]+t|0],o[1+(s[n>>2]+e|0)|0]=d[1+(s[i>>2]+t|0)|0],t=t+2|0,e=e+2|0,(0|p)!=(0|(f=f+2|0)););break;case 0:break i;case 1:}m&&(o[s[n>>2]+e|0]=d[s[i>>2]+t|0],e=e+1|0)}if(t=a>>>0>(u=u+1|0)>>>0,(0|u)!=(0|a))continue}break}f=s[i>>2]}else for(e=0,t=1;;){if(!U(r,d[r+84|0]?e:s[s[r+68>>2]+(e<<2)>>2],o[r+24|0],f))break n;if(t=a>>>0>(e=e+1|0)>>>0,(0|e)==(0|a))break}else t=0;f&&ee(f),e=!t}else{if(e=s[r+48>>2],r=s[s[r>>2]>>2],t=0,s[i+8>>2]=0,s[i>>2]=0,s[i+4>>2]=0,l){if((0|l)<0)break r;t=ye(f=ur(l),e+r|0,l)+l|0}(e=s[n>>2])&&(s[n+4>>2]=e,ee(e)),s[n+8>>2]=t,s[n+4>>2]=t,s[n>>2]=f,e=1}N=i+16|0,e&=1;break e}nn(),T()}nn(),T()}return 0|e},bb:function(e,t,r,n){e|=0,r|=0,n|=0;var i,c=0,l=0,u=0,p=0,m=0,b=0,v=0,g=0,A=0,_=0,x=0,y=0;N=i=N-16|0,p=s[80+(t|=0)>>2],e=o[r+24|0],c=h(p,e);e:{t:{if(!(3==(0|(t=s[r+28>>2]))|4==(0|t))|!d[r+84|0]){if(s[i+8>>2]=0,s[i>>2]=0,s[i+4>>2]=0,e){if((0|e)<0)break t;u=ur(t=e<<1),s[i>>2]=u,l=t+u|0,s[i+8>>2]=l,We(u,0,t),s[i+4>>2]=l}l=s[n>>2],(t=s[n+4>>2]-l>>1)>>>0<c>>>0?ut(n,c-t|0):t>>>0<=c>>>0||(s[n+4>>2]=l+(c<<1));r:if(p)if(e){for(x=-4&e,A=3&e,y=e-1>>>0<3,t=1,c=0;;){if(Z(r,d[r+84|0]?c:s[s[r+68>>2]+(c<<2)>>2],o[r+24|0],u)){if(_=s[n>>2],g=0,l=s[i>>2],e=0,t=0,!y)for(;v=e<<1,a[(b=(m<<1)+_|0)>>1]=f[l+v>>1],a[b+2>>1]=f[l+(2|v)>>1],a[b+4>>1]=f[l+(4|v)>>1],a[b+6>>1]=f[l+(6|v)>>1],e=e+4|0,m=m+4|0,(0|x)!=(0|(t=t+4|0)););if(A)for(;a[(m<<1)+_>>1]=f[l+(e<<1)>>1],e=e+1|0,m=m+1|0,(0|(g=g+1|0))!=(0|A););if(t=p>>>0>(c=c+1|0)>>>0,(0|c)!=(0|p))continue}break}u=s[i>>2]}else for(e=0,t=1;;){if(!Z(r,d[r+84|0]?e:s[s[r+68>>2]+(e<<2)>>2],o[r+24|0],u))break r;if(t=p>>>0>(e=e+1|0)>>>0,(0|e)==(0|p))break}else t=0;u&&ee(u),e=1^t}else{if(u=s[r+48>>2],p=s[s[r>>2]>>2],t=0,s[i+8>>2]=0,s[i>>2]=0,s[i+4>>2]=0,r=0,e=c<<1){if((0|e)<0)break t;m=(t=ye(r=ur(e),u+p|0,e))+e|0,t=t+(e>>1<<1)|0}(e=s[n>>2])&&(s[n+4>>2]=e,ee(e)),s[n+8>>2]=t,s[n+4>>2]=m,s[n>>2]=r,e=1}N=i+16|0,e&=1;break e}nn(),T()}return 0|e},cb:function(e,t,r,n){e|=0,r|=0,n|=0;var i,c=0,l=0,u=0,p=0,m=0,b=0,v=0,g=0,A=0,_=0,x=0,y=0;N=i=N-16|0,p=s[80+(t|=0)>>2],e=o[r+24|0],c=h(p,e);e:{t:{if(!(3==(0|(t=s[r+28>>2]))|4==(0|t))|!d[r+84|0]){if(s[i+8>>2]=0,s[i>>2]=0,s[i+4>>2]=0,e){if((0|e)<0)break t;u=ur(t=e<<1),s[i>>2]=u,l=t+u|0,s[i+8>>2]=l,We(u,0,t),s[i+4>>2]=l}l=s[n>>2],(t=s[n+4>>2]-l>>1)>>>0<c>>>0?ut(n,c-t|0):t>>>0<=c>>>0||(s[n+4>>2]=l+(c<<1));r:if(p)if(e){for(x=-4&e,A=3&e,y=e-1>>>0<3,t=1,c=0;;){if(H(r,d[r+84|0]?c:s[s[r+68>>2]+(c<<2)>>2],o[r+24|0],u)){if(_=s[n>>2],g=0,l=s[i>>2],e=0,t=0,!y)for(;v=e<<1,a[(b=(m<<1)+_|0)>>1]=f[l+v>>1],a[b+2>>1]=f[l+(2|v)>>1],a[b+4>>1]=f[l+(4|v)>>1],a[b+6>>1]=f[l+(6|v)>>1],e=e+4|0,m=m+4|0,(0|x)!=(0|(t=t+4|0)););if(A)for(;a[(m<<1)+_>>1]=f[l+(e<<1)>>1],e=e+1|0,m=m+1|0,(0|(g=g+1|0))!=(0|A););if(t=p>>>0>(c=c+1|0)>>>0,(0|c)!=(0|p))continue}break}u=s[i>>2]}else for(e=0,t=1;;){if(!H(r,d[r+84|0]?e:s[s[r+68>>2]+(e<<2)>>2],o[r+24|0],u))break r;if(t=p>>>0>(e=e+1|0)>>>0,(0|e)==(0|p))break}else t=0;u&&ee(u),e=1^t}else{if(u=s[r+48>>2],p=s[s[r>>2]>>2],t=0,s[i+8>>2]=0,s[i>>2]=0,s[i+4>>2]=0,r=0,e=c<<1){if((0|e)<0)break t;m=(t=ye(r=ur(e),u+p|0,e))+e|0,t=t+(e>>1<<1)|0}(e=s[n>>2])&&(s[n+4>>2]=e,ee(e)),s[n+8>>2]=t,s[n+4>>2]=m,s[n>>2]=r,e=1}N=i+16|0,e&=1;break e}nn(),T()}return 0|e},db:be,eb:function(e,t,r,n){e|=0,r|=0,n|=0;var i,a=0,c=0,l=0,f=0,u=0,p=0,m=0,b=0,v=0,g=0,A=0,_=0;N=i=N-16|0,f=s[80+(t|=0)>>2],e=o[r+24|0],a=h(f,e);e:{t:{if(!(5==(0|(t=s[r+28>>2]))|6==(0|t))|!d[r+84|0]){if(s[i+8>>2]=0,s[i>>2]=0,s[i+4>>2]=0,e){if((0|e)<0)break t;l=ur(t=e<<2),s[i>>2]=l,c=t+l|0,s[i+8>>2]=c,We(l,0,t),s[i+4>>2]=c}c=s[n>>2],(t=s[n+4>>2]-c>>2)>>>0<a>>>0?ct(n,a-t|0):t>>>0<=a>>>0||(s[n+4>>2]=c+(a<<2));r:if(f)if(e){for(A=-4&e,v=3&e,_=e-1>>>0<3,t=1,a=0;;){if(Q(r,d[r+84|0]?a:s[s[r+68>>2]+(a<<2)>>2],o[r+24|0],l)){if(g=s[n>>2],b=0,c=s[i>>2],e=0,t=0,!_)for(;m=e<<2,s[(p=(u<<2)+g|0)>>2]=s[c+m>>2],s[p+4>>2]=s[c+(4|m)>>2],s[p+8>>2]=s[c+(8|m)>>2],s[p+12>>2]=s[c+(12|m)>>2],e=e+4|0,u=u+4|0,(0|A)!=(0|(t=t+4|0)););if(v)for(;s[(u<<2)+g>>2]=s[c+(e<<2)>>2],e=e+1|0,u=u+1|0,(0|(b=b+1|0))!=(0|v););if(t=f>>>0>(a=a+1|0)>>>0,(0|a)!=(0|f))continue}break}l=s[i>>2]}else for(e=0,t=1;;){if(!Q(r,d[r+84|0]?e:s[s[r+68>>2]+(e<<2)>>2],o[r+24|0],l))break r;if(t=f>>>0>(e=e+1|0)>>>0,(0|e)==(0|f))break}else t=0;l&&ee(l),e=1^t}else{if(l=s[r+48>>2],f=s[s[r>>2]>>2],t=0,s[i+8>>2]=0,s[i>>2]=0,s[i+4>>2]=0,r=0,e=a<<2){if((0|e)<0)break t;u=(t=ye(r=ur(e),l+f|0,e))+e|0,t=t+(e>>2<<2)|0}(e=s[n>>2])&&(s[n+4>>2]=e,ee(e)),s[n+8>>2]=t,s[n+4>>2]=u,s[n>>2]=r,e=1}N=i+16|0,e&=1;break e}nn(),T()}return 0|e},fb:function(e,t,r,n,i,c){e|=0,t|=0,r|=0,i|=0,c|=0;var l=0,u=0,m=0,b=0,v=0,g=0,A=0,_=0,x=0,y=0,k=0,w=0,C=0,M=0,I=0,S=0,R=0;e:{t:{r:{n:{i:switch((n|=0)-1|0){case 0:e=0,N=g=N-16|0,b=s[t+80>>2],l=o[r+24|0];o:if((0|h(b,l))==(0|i))if((t=1!=s[r+28>>2])|!(e=d[r+84|0])){if(n=0,s[g+8>>2]=0,s[g>>2]=0,s[g+4>>2]=0,l){if((0|l)<0)break n;u=ur(l),s[g>>2]=u,We(u,0,l)}a:{s:if(b){if(t){if(!l)for(t=0,n=1;;){if(!G(r,255&e?t:s[s[r+68>>2]+(t<<2)>>2],o[r+24|0],u))break s;if(n=b>>>0>(t=t+1|0)>>>0,(0|t)==(0|b))break s;e=d[r+84|0]}for(m=-4&l,v=3&l,t=0,x=l-1>>>0<3,n=1,i=0;;){if(!G(r,255&e?i:s[s[r+68>>2]+(i<<2)>>2],o[r+24|0],u))break s;if(n=0,e=0,A=0,!x)for(;o[0|(l=t+c|0)]=d[e+u|0],o[l+1|0]=d[(1|e)+u|0],o[l+2|0]=d[(2|e)+u|0],o[l+3|0]=d[(3|e)+u|0],e=e+4|0,t=t+4|0,(0|m)!=(0|(A=A+4|0)););if(v)for(;o[t+c|0]=d[e+u|0],e=e+1|0,t=t+1|0,(0|v)!=(0|(n=n+1|0)););if((0|b)==(0|(i=i+1|0)))break;n=i>>>0<b>>>0,e=d[r+84|0]}e=i>>>0>=b>>>0;break a}if(l)for(x=-4&l,v=3&l,t=0,C=l-1>>>0<3;;){if(i=s[s[r>>2]>>2],k=s[r+40>>2],i=ye(u,i+(e=s[r+48>>2]+Ht(k,s[r+44>>2],255&e?n:s[s[r+68>>2]+(n<<2)>>2],0)|0)|0,k),A=0,e=0,m=0,!C)for(;o[0|(l=t+c|0)]=d[e+i|0],o[l+1|0]=d[i+(1|e)|0],o[l+2|0]=d[i+(2|e)|0],o[l+3|0]=d[i+(3|e)|0],e=e+4|0,t=t+4|0,(0|x)!=(0|(m=m+4|0)););if(v)for(;o[t+c|0]=d[e+i|0],e=e+1|0,t=t+1|0,(0|v)!=(0|(A=A+1|0)););if(e=1,(0|b)==(0|(n=n+1|0)))break a;e=d[r+84|0]}if(A=s[r>>2],i=s[r+48>>2],C=s[r+68>>2],c=s[r+44>>2],k=r=s[r+40>>2],t=0,1!=(0|b))for(y=-2&b,w=255&e;l=1|t,v=ye(u,(_=s[A>>2])+(v=Ht(r,c,w?t:s[C+(t<<2)>>2],0)+i|0)|0,k),_=s[A>>2],w||(l=s[C+(l<<2)>>2]),ye(v,(l=Ht(r,c,l,0)+i|0)+_|0,k),t=t+2|0,(0|y)!=(0|(m=m+2|0)););if(!(1&b))break s;l=s[A>>2],255&e||(t=s[C+(t<<2)>>2]),ye(u,(e=Ht(r,c,t,0)+i|0)+l|0,k)}if(e=1^n,!u)break o}ee(u)}else ye(c,s[s[r>>2]>>2]+s[r+48>>2]|0,i),e=1;break r;case 2:e=0,N=A=N-16|0,l=(n=o[r+24|0])<<1,b=s[t+80>>2];o:if((0|h(l,b))==(0|i))if((t=3!=s[r+28>>2])|!(e=d[r+84|0])){if(s[A+8>>2]=0,s[A>>2]=0,s[A+4>>2]=0,n){if((0|n)<0)break n;u=ur(l),s[A>>2]=u,We(u,0,l)}a:{s:if(b){if(t){if(!n)for(t=0,m=1;;){if(!Z(r,255&e?t:s[s[r+68>>2]+(t<<2)>>2],o[r+24|0],u))break s;if(m=b>>>0>(t=t+1|0)>>>0,(0|t)==(0|b))break s;e=d[r+84|0]}for(x=-4&n,g=3&n,t=0,C=n-1>>>0<3,m=1,n=0;;){if(!Z(r,255&e?n:s[s[r+68>>2]+(n<<2)>>2],o[r+24|0],u))break s;if(m=0,e=0,i=0,!C)for(;v=e<<1,a[(l=(t<<1)+c|0)>>1]=f[v+u>>1],a[l+2>>1]=f[(2|v)+u>>1],a[l+4>>1]=f[(4|v)+u>>1],a[l+6>>1]=f[(6|v)+u>>1],e=e+4|0,t=t+4|0,(0|x)!=(0|(i=i+4|0)););if(g)for(;a[(t<<1)+c>>1]=f[(e<<1)+u>>1],e=e+1|0,t=t+1|0,(0|g)!=(0|(m=m+1|0)););if((0|b)==(0|(n=n+1|0)))break;m=n>>>0<b>>>0,e=d[r+84|0]}e=n>>>0>=b>>>0;break a}if(x=s[r>>2],l=s[r+48>>2],k=s[r+68>>2],v=s[r+44>>2],w=g=s[r+40>>2],n){for(I=-4&n,M=3&n,t=0,S=255&e,R=n-1>>>0<3,n=0;;){if(m=ye(u,(r=s[x>>2])+(e=Ht(g,v,S?n:s[k+(n<<2)>>2],0)+l|0)|0,w),i=0,e=0,r=0,!R)for(;_=e<<1,a[(y=(t<<1)+c|0)>>1]=f[_+m>>1],a[y+2>>1]=f[m+(2|_)>>1],a[y+4>>1]=f[m+(4|_)>>1],a[y+6>>1]=f[m+(6|_)>>1],e=e+4|0,t=t+4|0,(0|I)!=(0|(r=r+4|0)););if(M)for(;a[(t<<1)+c>>1]=f[m+(e<<1)>>1],e=e+1|0,t=t+1|0,(0|M)!=(0|(i=i+1|0)););if(e=1,(0|b)==(0|(n=n+1|0)))break}break a}if(t=0,1!=(0|b))for(y=-2&b,c=255&e,n=0;r=1|t,i=ye(u,(_=s[x>>2])+(i=Ht(g,v,c?t:s[k+(t<<2)>>2],0)+l|0)|0,w),_=s[x>>2],c||(r=s[k+(r<<2)>>2]),ye(i,(r=Ht(g,v,r,0)+l|0)+_|0,w),t=t+2|0,(0|y)!=(0|(n=n+2|0)););if(!(1&b))break s;r=s[x>>2],255&e||(t=s[k+(t<<2)>>2]),ye(u,(e=Ht(g,v,t,0)+l|0)+r|0,w)}if(e=1^m,!u)break o}ee(u)}else ye(c,s[s[r>>2]>>2]+s[r+48>>2]|0,i),e=1;break t;case 4:e=0,N=A=N-16|0,l=(n=o[r+24|0])<<2,b=s[t+80>>2];o:if((0|h(l,b))==(0|i))if((t=5!=s[r+28>>2])|!(e=d[r+84|0])){if(s[A+8>>2]=0,s[A>>2]=0,s[A+4>>2]=0,n){if((0|n)<0)break n;u=ur(l),s[A>>2]=u,We(u,0,l)}a:{s:if(b){if(t){if(!n)for(t=0,m=1;;){if(!q(r,255&e?t:s[s[r+68>>2]+(t<<2)>>2],o[r+24|0],u))break s;if(m=b>>>0>(t=t+1|0)>>>0,(0|t)==(0|b))break s;e=d[r+84|0]}for(x=-4&n,g=3&n,t=0,C=n-1>>>0<3,m=1,n=0;;){if(!q(r,255&e?n:s[s[r+68>>2]+(n<<2)>>2],o[r+24|0],u))break s;if(m=0,e=0,i=0,!C)for(;v=e<<2,s[(l=(t<<2)+c|0)>>2]=s[v+u>>2],s[l+4>>2]=s[(4|v)+u>>2],s[l+8>>2]=s[(8|v)+u>>2],s[l+12>>2]=s[(12|v)+u>>2],e=e+4|0,t=t+4|0,(0|x)!=(0|(i=i+4|0)););if(g)for(;s[(t<<2)+c>>2]=s[(e<<2)+u>>2],e=e+1|0,t=t+1|0,(0|g)!=(0|(m=m+1|0)););if((0|b)==(0|(n=n+1|0)))break;m=n>>>0<b>>>0,e=d[r+84|0]}e=n>>>0>=b>>>0;break a}if(x=s[r>>2],l=s[r+48>>2],k=s[r+68>>2],v=s[r+44>>2],w=g=s[r+40>>2],n){for(I=-4&n,M=3&n,t=0,S=255&e,R=n-1>>>0<3,n=0;;){if(m=ye(u,(r=s[x>>2])+(e=Ht(g,v,S?n:s[k+(n<<2)>>2],0)+l|0)|0,w),i=0,e=0,r=0,!R)for(;_=e<<2,s[(y=(t<<2)+c|0)>>2]=s[_+m>>2],s[y+4>>2]=s[m+(4|_)>>2],s[y+8>>2]=s[m+(8|_)>>2],s[y+12>>2]=s[m+(12|_)>>2],e=e+4|0,t=t+4|0,(0|I)!=(0|(r=r+4|0)););if(M)for(;s[(t<<2)+c>>2]=s[m+(e<<2)>>2],e=e+1|0,t=t+1|0,(0|M)!=(0|(i=i+1|0)););if(e=1,(0|b)==(0|(n=n+1|0)))break}break a}if(t=0,1!=(0|b))for(y=-2&b,c=255&e,n=0;r=1|t,i=ye(u,(_=s[x>>2])+(i=Ht(g,v,c?t:s[k+(t<<2)>>2],0)+l|0)|0,w),_=s[x>>2],c||(r=s[k+(r<<2)>>2]),ye(i,(r=Ht(g,v,r,0)+l|0)+_|0,w),t=t+2|0,(0|y)!=(0|(n=n+2|0)););if(!(1&b))break s;r=s[x>>2],255&e||(t=s[k+(t<<2)>>2]),ye(u,(e=Ht(g,v,t,0)+l|0)+r|0,w)}if(e=1^m,!u)break o}ee(u)}else ye(c,s[s[r>>2]>>2]+s[r+48>>2]|0,i),e=1;break t;case 1:e=0,N=g=N-16|0,b=s[t+80>>2],l=o[r+24|0];o:if((0|h(b,l))==(0|i))if((t=2!=s[r+28>>2])|!(e=d[r+84|0])){if(n=0,s[g+8>>2]=0,s[g>>2]=0,s[g+4>>2]=0,l){if((0|l)<0)break n;u=ur(l),s[g>>2]=u,We(u,0,l)}a:{s:if(b){if(t){if(!l)for(t=0,n=1;;){if(!U(r,255&e?t:s[s[r+68>>2]+(t<<2)>>2],o[r+24|0],u))break s;if(n=b>>>0>(t=t+1|0)>>>0,(0|t)==(0|b))break s;e=d[r+84|0]}for(m=-4&l,v=3&l,t=0,x=l-1>>>0<3,n=1,i=0;;){if(!U(r,255&e?i:s[s[r+68>>2]+(i<<2)>>2],o[r+24|0],u))break s;if(n=0,e=0,A=0,!x)for(;o[0|(l=t+c|0)]=d[e+u|0],o[l+1|0]=d[(1|e)+u|0],o[l+2|0]=d[(2|e)+u|0],o[l+3|0]=d[(3|e)+u|0],e=e+4|0,t=t+4|0,(0|m)!=(0|(A=A+4|0)););if(v)for(;o[t+c|0]=d[e+u|0],e=e+1|0,t=t+1|0,(0|v)!=(0|(n=n+1|0)););if((0|b)==(0|(i=i+1|0)))break;n=i>>>0<b>>>0,e=d[r+84|0]}e=i>>>0>=b>>>0;break a}if(l)for(x=-4&l,v=3&l,t=0,C=l-1>>>0<3;;){if(i=s[s[r>>2]>>2],k=s[r+40>>2],i=ye(u,i+(e=s[r+48>>2]+Ht(k,s[r+44>>2],255&e?n:s[s[r+68>>2]+(n<<2)>>2],0)|0)|0,k),A=0,e=0,m=0,!C)for(;o[0|(l=t+c|0)]=d[e+i|0],o[l+1|0]=d[i+(1|e)|0],o[l+2|0]=d[i+(2|e)|0],o[l+3|0]=d[i+(3|e)|0],e=e+4|0,t=t+4|0,(0|x)!=(0|(m=m+4|0)););if(v)for(;o[t+c|0]=d[e+i|0],e=e+1|0,t=t+1|0,(0|v)!=(0|(A=A+1|0)););if(e=1,(0|b)==(0|(n=n+1|0)))break a;e=d[r+84|0]}if(A=s[r>>2],i=s[r+48>>2],C=s[r+68>>2],c=s[r+44>>2],k=r=s[r+40>>2],t=0,1!=(0|b))for(y=-2&b,w=255&e;l=1|t,v=ye(u,(_=s[A>>2])+(v=Ht(r,c,w?t:s[C+(t<<2)>>2],0)+i|0)|0,k),_=s[A>>2],w||(l=s[C+(l<<2)>>2]),ye(v,(l=Ht(r,c,l,0)+i|0)+_|0,k),t=t+2|0,(0|y)!=(0|(m=m+2|0)););if(!(1&b))break s;l=s[A>>2],255&e||(t=s[C+(t<<2)>>2]),ye(u,(e=Ht(r,c,t,0)+i|0)+l|0,k)}if(e=1^n,!u)break o}ee(u)}else ye(c,s[s[r>>2]>>2]+s[r+48>>2]|0,i),e=1;break r;case 3:e=0,N=A=N-16|0,l=(n=o[r+24|0])<<1,b=s[t+80>>2];o:if((0|h(l,b))==(0|i))if((t=4!=s[r+28>>2])|!(e=d[r+84|0])){if(s[A+8>>2]=0,s[A>>2]=0,s[A+4>>2]=0,n){if((0|n)<0)break n;u=ur(l),s[A>>2]=u,We(u,0,l)}a:{s:if(b){if(t){if(!n)for(t=0,m=1;;){if(!H(r,255&e?t:s[s[r+68>>2]+(t<<2)>>2],o[r+24|0],u))break s;if(m=b>>>0>(t=t+1|0)>>>0,(0|t)==(0|b))break s;e=d[r+84|0]}for(x=-4&n,g=3&n,t=0,C=n-1>>>0<3,m=1,n=0;;){if(!H(r,255&e?n:s[s[r+68>>2]+(n<<2)>>2],o[r+24|0],u))break s;if(m=0,e=0,i=0,!C)for(;v=e<<1,a[(l=(t<<1)+c|0)>>1]=f[v+u>>1],a[l+2>>1]=f[(2|v)+u>>1],a[l+4>>1]=f[(4|v)+u>>1],a[l+6>>1]=f[(6|v)+u>>1],e=e+4|0,t=t+4|0,(0|x)!=(0|(i=i+4|0)););if(g)for(;a[(t<<1)+c>>1]=f[(e<<1)+u>>1],e=e+1|0,t=t+1|0,(0|g)!=(0|(m=m+1|0)););if((0|b)==(0|(n=n+1|0)))break;m=n>>>0<b>>>0,e=d[r+84|0]}e=n>>>0>=b>>>0;break a}if(x=s[r>>2],l=s[r+48>>2],k=s[r+68>>2],v=s[r+44>>2],w=g=s[r+40>>2],n){for(I=-4&n,M=3&n,t=0,S=255&e,R=n-1>>>0<3,n=0;;){if(m=ye(u,(r=s[x>>2])+(e=Ht(g,v,S?n:s[k+(n<<2)>>2],0)+l|0)|0,w),i=0,e=0,r=0,!R)for(;_=e<<1,a[(y=(t<<1)+c|0)>>1]=f[_+m>>1],a[y+2>>1]=f[m+(2|_)>>1],a[y+4>>1]=f[m+(4|_)>>1],a[y+6>>1]=f[m+(6|_)>>1],e=e+4|0,t=t+4|0,(0|I)!=(0|(r=r+4|0)););if(M)for(;a[(t<<1)+c>>1]=f[m+(e<<1)>>1],e=e+1|0,t=t+1|0,(0|M)!=(0|(i=i+1|0)););if(e=1,(0|b)==(0|(n=n+1|0)))break}break a}if(t=0,1!=(0|b))for(y=-2&b,c=255&e,n=0;r=1|t,i=ye(u,(_=s[x>>2])+(i=Ht(g,v,c?t:s[k+(t<<2)>>2],0)+l|0)|0,w),_=s[x>>2],c||(r=s[k+(r<<2)>>2]),ye(i,(r=Ht(g,v,r,0)+l|0)+_|0,w),t=t+2|0,(0|y)!=(0|(n=n+2|0)););if(!(1&b))break s;r=s[x>>2],255&e||(t=s[k+(t<<2)>>2]),ye(u,(e=Ht(g,v,t,0)+l|0)+r|0,w)}if(e=1^m,!u)break o}ee(u)}else ye(c,s[s[r>>2]>>2]+s[r+48>>2]|0,i),e=1;break t;case 5:e=0,N=A=N-16|0,l=(n=o[r+24|0])<<2,b=s[t+80>>2];o:if((0|h(l,b))==(0|i))if((t=6!=s[r+28>>2])|!(e=d[r+84|0])){if(s[A+8>>2]=0,s[A>>2]=0,s[A+4>>2]=0,n){if((0|n)<0)break n;u=ur(l),s[A>>2]=u,We(u,0,l)}a:{s:if(b){if(t){if(!n)for(t=0,m=1;;){if(!Q(r,255&e?t:s[s[r+68>>2]+(t<<2)>>2],o[r+24|0],u))break s;if(m=b>>>0>(t=t+1|0)>>>0,(0|t)==(0|b))break s;e=d[r+84|0]}for(x=-4&n,g=3&n,t=0,C=n-1>>>0<3,m=1,n=0;;){if(!Q(r,255&e?n:s[s[r+68>>2]+(n<<2)>>2],o[r+24|0],u))break s;if(m=0,e=0,i=0,!C)for(;v=e<<2,s[(l=(t<<2)+c|0)>>2]=s[v+u>>2],s[l+4>>2]=s[(4|v)+u>>2],s[l+8>>2]=s[(8|v)+u>>2],s[l+12>>2]=s[(12|v)+u>>2],e=e+4|0,t=t+4|0,(0|x)!=(0|(i=i+4|0)););if(g)for(;s[(t<<2)+c>>2]=s[(e<<2)+u>>2],e=e+1|0,t=t+1|0,(0|g)!=(0|(m=m+1|0)););if((0|b)==(0|(n=n+1|0)))break;m=n>>>0<b>>>0,e=d[r+84|0]}e=n>>>0>=b>>>0;break a}if(x=s[r>>2],l=s[r+48>>2],k=s[r+68>>2],v=s[r+44>>2],w=g=s[r+40>>2],n){for(I=-4&n,M=3&n,t=0,S=255&e,R=n-1>>>0<3,n=0;;){if(m=ye(u,(r=s[x>>2])+(e=Ht(g,v,S?n:s[k+(n<<2)>>2],0)+l|0)|0,w),i=0,e=0,r=0,!R)for(;_=e<<2,s[(y=(t<<2)+c|0)>>2]=s[_+m>>2],s[y+4>>2]=s[m+(4|_)>>2],s[y+8>>2]=s[m+(8|_)>>2],s[y+12>>2]=s[m+(12|_)>>2],e=e+4|0,t=t+4|0,(0|I)!=(0|(r=r+4|0)););if(M)for(;s[(t<<2)+c>>2]=s[m+(e<<2)>>2],e=e+1|0,t=t+1|0,(0|M)!=(0|(i=i+1|0)););if(e=1,(0|b)==(0|(n=n+1|0)))break}break a}if(t=0,1!=(0|b))for(y=-2&b,c=255&e,n=0;r=1|t,i=ye(u,(_=s[x>>2])+(i=Ht(g,v,c?t:s[k+(t<<2)>>2],0)+l|0)|0,w),_=s[x>>2],c||(r=s[k+(r<<2)>>2]),ye(i,(r=Ht(g,v,r,0)+l|0)+_|0,w),t=t+2|0,(0|y)!=(0|(n=n+2|0)););if(!(1&b))break s;r=s[x>>2],255&e||(t=s[k+(t<<2)>>2]),ye(u,(e=Ht(g,v,t,0)+l|0)+r|0,w)}if(e=1^m,!u)break o}ee(u)}else ye(c,s[s[r>>2]>>2]+s[r+48>>2]|0,i),e=1;break t;case 8:break i;default:break e}e=0,N=x=N-16|0,n=(v=o[r+24|0])<<2,b=s[t+80>>2];i:if((0|h(n,b))==(0|i)){i=s[r+28>>2],s[x+8>>2]=0,s[x>>2]=0,s[x+4>>2]=0,t=0;o:{a:{s:{if(v){if((0|v)<0)break s;if(t=ur(n),s[x>>2]=t,l=(v<<2)+t|0,s[x+8>>2]=l,g=1+((n=n-4|0)>>>2|0)&7)for(e=t;s[e>>2]=-1073741824,e=e+4|0,(0|g)!=(0|(u=u+1|0)););else e=t;if(!(n>>>0<28))for(;s[e+24>>2]=-1073741824,s[e+28>>2]=-1073741824,s[e+16>>2]=-1073741824,s[e+20>>2]=-1073741824,s[e+8>>2]=-1073741824,s[e+12>>2]=-1073741824,s[e>>2]=-1073741824,s[e+4>>2]=-1073741824,(0|l)!=(0|(e=e+32|0)););}if(!b)break a;if(9==(0|i)){if(e=0,C=s[r>>2],n=s[r+48>>2],w=s[r+68>>2],y=d[r+84|0],i=s[r+44>>2],_=l=s[r+40>>2],(0|v)<=0){if(1!=(0|b))for(v=-2&b,r=0;c=1|e,u=ye(t,(g=s[C>>2])+(u=Ht(l,i,y?e:s[w+(e<<2)>>2],0)+n|0)|0,_),g=s[C>>2],y||(c=s[w+(c<<2)>>2]),ye(u,(c=Ht(l,i,c,0)+n|0)+g|0,_),e=e+2|0,(0|v)!=(0|(r=r+2|0)););if(!(1&b))break a;r=s[C>>2],y||(e=s[w+(e<<2)>>2]),ye(t,(e=Ht(l,i,e,0)+n|0)+r|0,_);break a}for(S=-4&v,M=3&v,u=0,R=v-1>>>0<3;;){if(r=ye(t,(r=s[C>>2])+(e=Ht(l,i,y?m:s[w+(m<<2)>>2],0)+n|0)|0,_),g=0,e=0,I=0,!R)for(;A=e<<2,p[(v=(u<<2)+c|0)>>2]=p[A+r>>2],p[v+4>>2]=p[r+(4|A)>>2],p[v+8>>2]=p[r+(8|A)>>2],p[v+12>>2]=p[r+(12|A)>>2],e=e+4|0,u=u+4|0,(0|S)!=(0|(I=I+4|0)););if(M)for(;p[(u<<2)+c>>2]=p[r+(e<<2)>>2],e=e+1|0,u=u+1|0,(0|M)!=(0|(g=g+1|0)););if(e=1,(0|b)==(0|(m=m+1|0)))break}break o}if(A=1,(0|v)<=0){for(e=0;;){if(!O(r,d[r+84|0]?e:s[s[r+68>>2]+(e<<2)>>2],o[r+24|0],t))break a;if(A=b>>>0>(e=e+1|0)>>>0,(0|e)==(0|b))break}break a}for(C=-4&v,l=3&v,u=0,v=v-1>>>0<3;;){if(!O(r,d[r+84|0]?m:s[s[r+68>>2]+(m<<2)>>2],o[r+24|0],t))break a;if(A=0,e=0,g=0,!v)for(;i=e<<2,p[(n=(u<<2)+c|0)>>2]=p[i+t>>2],p[n+4>>2]=p[(4|i)+t>>2],p[n+8>>2]=p[(8|i)+t>>2],p[n+12>>2]=p[(12|i)+t>>2],e=e+4|0,u=u+4|0,(0|C)!=(0|(g=g+4|0)););if(l)for(;p[(u<<2)+c>>2]=p[(e<<2)+t>>2],e=e+1|0,u=u+1|0,(0|l)!=(0|(A=A+1|0)););if(A=b>>>0>(m=m+1|0)>>>0,(0|m)==(0|b))break}e=m>>>0>=b>>>0;break o}nn(),T()}if(e=1^A,!t)break i}ee(t)}N=x+16|0,u=1&e;break e}nn(),T()}N=g+16|0,u=1&e;break e}N=A+16|0,u=1&e}return 0|u},gb:function(e,t){e|=0,t|=0;var r,n=0,i=0,a=0,c=0,l=0,f=0,p=0,m=0,h=0,b=0,v=0,g=0,A=0,_=0,x=0,y=0,k=0,w=0,C=0;N=r=N-16|0,s[r+12>>2]=t,t=ur(32),s[r>>2]=t,s[r+4>>2]=24,s[r+8>>2]=-2147483616,o[t+24|0]=0,i=d[1308]|d[1309]<<8|d[1310]<<16|d[1311]<<24,n=d[1304]|d[1305]<<8|d[1306]<<16|d[1307]<<24,o[t+16|0]=n,o[t+17|0]=n>>>8,o[t+18|0]=n>>>16,o[t+19|0]=n>>>24,o[t+20|0]=i,o[t+21|0]=i>>>8,o[t+22|0]=i>>>16,o[t+23|0]=i>>>24,i=d[1300]|d[1301]<<8|d[1302]<<16|d[1303]<<24,n=d[1296]|d[1297]<<8|d[1298]<<16|d[1299]<<24,o[t+8|0]=n,o[t+9|0]=n>>>8,o[t+10|0]=n>>>16,o[t+11|0]=n>>>24,o[t+12|0]=i,o[t+13|0]=i>>>8,o[t+14|0]=i>>>16,o[t+15|0]=i>>>24,i=d[1292]|d[1293]<<8|d[1294]<<16|d[1295]<<24,n=d[1288]|d[1289]<<8|d[1290]<<16|d[1291]<<24,o[0|t]=n,o[t+1|0]=n>>>8,o[t+2|0]=n>>>16,o[t+3|0]=n>>>24,o[t+4|0]=i,o[t+5|0]=i>>>8,o[t+6|0]=i>>>16,o[t+7|0]=i>>>24,N=f=N-48|0,h=e;e:{if(e=s[(i=e+16|0)>>2]){for(n=s[r+12>>2],t=i;t=(c=(0|n)>s[e+16>>2])?t:e,e=s[(c<<2)+e>>2];);if((0|t)!=(0|i)&&(0|n)>=s[t+16>>2])break e}if(s[4+(e=k=f+24|0)>>2]=0,s[e+8>>2]=0,w=e+4|0,s[e>>2]=w,e=s[r+12>>2],s[(n=f+16|0)>>2]=0,s[n+4>>2]=0,s[f+8>>2]=e,s[f+12>>2]=n,(0|w)!=(0|(t=s[k>>2])))for(b=f+8|4;;){c=t,l=t+16|0,N=_=N-16|0,p=_+12|0,e=_+8|0;t:{r:{n:{i:{o:{a:{s:if((0|(x=b+4|0))!=(0|n))if(a=(t=d[n+27|0])<<24>>24<0,m=(0|(C=(v=d[l+11|0])<<24>>24))<0,A=(g=(t=a?s[n+20>>2]:t)>>>0<(v=m?s[l+4>>2]:v)>>>0)?t:v){if(y=n+16|0,!(y=Mt(m=m?s[l>>2]:l,a=a?s[y>>2]:y,A))){if(t>>>0>v>>>0)break s;break a}if((0|y)>=0)break a}else if(t>>>0<=v>>>0)break o;a=s[n>>2];s:{c:if((0|(e=n))!=s[b>>2]){if(a)for(t=a;e=t,t=s[t+4>>2];);else{if(e=n+8|0,(0|n)==s[s[n+8>>2]>>2])for(;e=(t=s[e>>2])+8|0,(0|t)==s[s[t+8>>2]>>2];);e=s[e>>2]}if(t=(m=d[l+11|0])<<24>>24<0,v=(g=d[e+27|0])<<24>>24<0,!((A=(m=t?s[l+4>>2]:m)>>>0<(g=v?s[e+20>>2]:g)>>>0?m:g)&&(x=e+16|0,t=Mt(v?s[x>>2]:x,t?s[l>>2]:l,A)))){if(m>>>0>g>>>0)break c;break s}if((0|t)>=0)break s}if(!a){s[p>>2]=n,e=n;break t}s[p>>2]=e,e=e+4|0;break t}e=Je(b,p,l);break t}if(t=Mt(a,m,A))break i}if(g)break n;break r}if((0|t)>=0)break r}if(a=s[n+4>>2])for(t=a;e=t,t=s[t>>2];);else if(e=s[n+8>>2],(0|n)!=s[e>>2])for(t=n+8|0;t=(m=s[t>>2])+8|0,e=s[m+8>>2],(0|m)!=s[e>>2];);n:{i:if((0|e)!=(0|x)){if(!((g=(m=(t=(m=d[e+27|0])<<24>>24<0)?s[e+20>>2]:m)>>>0<v>>>0?m:v)&&(A=e+16|0,t=Mt((0|C)<0?s[l>>2]:l,t?s[A>>2]:A,g)))){if(m>>>0>v>>>0)break i;break n}if((0|t)>=0)break n}if(!a){s[p>>2]=n,e=n+4|0;break t}s[p>>2]=e;break t}e=Je(b,p,l);break t}s[p>>2]=n,s[e>>2]=n}(e=s[(t=e)>>2])?t=0:(a=(e=ur(40))+16|0,o[l+11|0]>=0?(p=s[l+4>>2],s[a>>2]=s[l>>2],s[a+4>>2]=p,s[a+8>>2]=s[l+8>>2]):Ot(a,s[l>>2],s[l+4>>2]),a=e+28|0,o[l+23|0]>=0?(p=s[l+16>>2],s[a>>2]=s[l+12>>2],s[a+4>>2]=p,s[a+8>>2]=s[l+20>>2]):Ot(a,s[l+12>>2],s[l+16>>2]),s[e+8>>2]=s[_+12>>2],s[e>>2]=0,s[e+4>>2]=0,s[t>>2]=e,(a=s[s[b>>2]>>2])?(s[b>>2]=a,t=s[t>>2]):t=e,we(s[b+4>>2],t),s[b+8>>2]=s[b+8>>2]+1,t=1),o[f+44|0]=t,s[f+40>>2]=e,N=_+16|0;t:if(e=s[c+4>>2])for(;e=s[(t=e)>>2];);else{if(t=s[c+8>>2],(0|c)==s[t>>2])break t;for(e=c+8|0;e=(c=s[e>>2])+8|0,t=s[c+8>>2],(0|c)!=s[t>>2];);}if((0|t)==(0|w))break}t:{if(e=s[i>>2])for(i=h+16|0,c=s[f+8>>2];;){r:{if((0|(t=s[e+16>>2]))>(0|c)){if(t=s[e>>2])break r;i=e;break t}if((0|t)>=(0|c))break t;if(i=e+4|0,!(t=s[e+4>>2]))break t;e=i}i=e,e=t}e=i}(t=s[i>>2])||(t=ur(32),s[t+16>>2]=s[f+8>>2],s[t+20>>2]=s[f+12>>2],c=t+24|0,a=s[f+16>>2],s[c>>2]=a,l=s[f+20>>2],s[t+28>>2]=l,l?(s[a+8>>2]=c,s[f+16>>2]=0,s[f+20>>2]=0,s[f+12>>2]=n):s[t+20>>2]=c,s[t+8>>2]=e,s[t>>2]=0,s[t+4>>2]=0,s[i>>2]=t,(e=s[s[h+12>>2]>>2])?(s[h+12>>2]=e,e=s[i>>2]):e=t,we(s[h+16>>2],e),s[h+20>>2]=s[h+20>>2]+1),pr(f+8|4,s[f+16>>2]),pr(k,s[k+4>>2])}if(N=n=(N=h=(N=f+48|0)-48|0)-32|0,(0|(c=(l=n+32|0)-(e=i=n+21|0)|0))<=9&(0|c)<(1-(u[2744]>1)|0)?(s[n+8>>2]=l,e=61):(o[0|e]=49,s[n+8>>2]=e+1,e=0),s[n+12>>2]=e,e=h+8|0,N=a=(N=f=N-16|0)-16|0,(c=(b=s[n+8>>2])-i|0)>>>0<=4294967279){for(c>>>0<=10?(o[e+11|0]=c,n=e):(n=c>>>0>=11?11==(0|(n=(p=c+16&-16)-1|0))?p:n:10,n=ur(p=n+1|0),s[e>>2]=n,s[e+8>>2]=-2147483648|p,s[e+4>>2]=c);(0|i)!=(0|b);)o[0|n]=d[0|i],n=n+1|0,i=i+1|0;o[a+15|0]=0,o[0|n]=d[a+15|0],N=a+16|0}else an(),T();N=f+16|0,N=l,s[h+32>>2]=r;e:{t:{if(e=s[4+(n=t+20|0)>>2])for(a=(i=(t=d[r+11|0])<<24>>24<0)?s[r>>2]:r,c=i?s[r+4>>2]:t,t=n+4|0;;){r:{n:{i:{o:{a:{s:if(b=(f=(i=(l=(i=d[e+27|0])<<24>>24<0)?s[e+20>>2]:i)>>>0<c>>>0)?i:c){if(p=e+16|0,!(p=Mt(a,l=l?s[p>>2]:p,b))){if(i>>>0>c>>>0)break s;break a}if((0|p)>=0)break a}else if(i>>>0<=c>>>0)break o;if(i=s[e>>2])break r;break t}if(i=Mt(l,a,b))break i}if(f)break n;break e}if((0|i)>=0)break e}if(t=e+4|0,!(i=s[e+4>>2]))break e;e=t}t=e,e=i}e=n+4|0}t=e}(i=s[t>>2])?e=0:(a=(i=ur(40))+16|0,c=s[h+32>>2],o[c+11|0]>=0?(l=s[c+4>>2],s[a>>2]=s[c>>2],s[a+4>>2]=l,s[a+8>>2]=s[c+8>>2]):Ot(a,s[c>>2],s[c+4>>2]),s[i+8>>2]=e,s[i>>2]=0,s[i+4>>2]=0,s[i+36>>2]=0,s[i+28>>2]=0,s[i+32>>2]=0,s[t>>2]=i,(e=s[s[n>>2]>>2])?(s[n>>2]=e,e=s[t>>2]):e=i,we(s[n+4>>2],e),s[n+8>>2]=s[n+8>>2]+1,e=1),o[h+44|0]=e,s[h+40>>2]=i,e=s[h+40>>2],o[e+39|0]<0&&ee(s[e+28>>2]),t=s[h+12>>2],s[e+28>>2]=s[h+8>>2],s[e+32>>2]=t,s[e+36>>2]=s[h+16>>2],N=h+48|0,o[r+11|0]<0&&ee(s[r>>2]),N=r+16|0},hb:function(e,t){e|=0;var r,n,i=0,a=0;a=8+(n=N-32|0)|0,N=r=(N=n)-80|0,e=s[36+(t|=0)>>2],s[r+72>>2]=s[t+32>>2],s[r+76>>2]=e,i=s[t+28>>2],s[(e=r- -64|0)>>2]=s[t+24>>2],s[e+4>>2]=i,e=s[t+20>>2],s[r+56>>2]=s[t+16>>2],s[r+60>>2]=e,e=s[t+12>>2],s[r+48>>2]=s[t+8>>2],s[r+52>>2]=e,e=s[t+4>>2],s[r+40>>2]=s[t>>2],s[r+44>>2]=e,Y(r+8|0,r+40|0,r+24|0);e:if(e=s[r+8>>2]){if(s[a>>2]=e,e=a+4|0,o[r+23|0]>=0){a=s[4+(t=r+8|4)>>2],s[e>>2]=s[t>>2],s[e+4>>2]=a,s[e+8>>2]=s[t+8>>2];break e}if(Ot(e,s[r+12>>2],s[r+16>>2]),o[r+23|0]>=0)break e;ee(s[r+12>>2])}else o[r+23|0]<0&&ee(s[r+12>>2]),(e=d[r+31|0])>>>0>=2?(e=ur(32),t=d[1619]|d[1620]<<8,o[e+24|0]=t,o[e+25|0]=t>>>8,t=d[1615]|d[1616]<<8|d[1617]<<16|d[1618]<<24,i=d[1611]|d[1612]<<8|d[1613]<<16|d[1614]<<24,o[e+16|0]=i,o[e+17|0]=i>>>8,o[e+18|0]=i>>>16,o[e+19|0]=i>>>24,o[e+20|0]=t,o[e+21|0]=t>>>8,o[e+22|0]=t>>>16,o[e+23|0]=t>>>24,t=d[1607]|d[1608]<<8|d[1609]<<16|d[1610]<<24,i=d[1603]|d[1604]<<8|d[1605]<<16|d[1606]<<24,o[e+8|0]=i,o[e+9|0]=i>>>8,o[e+10|0]=i>>>16,o[e+11|0]=i>>>24,o[e+12|0]=t,o[e+13|0]=t>>>8,o[e+14|0]=t>>>16,o[e+15|0]=t>>>24,t=d[1599]|d[1600]<<8|d[1601]<<16|d[1602]<<24,i=d[1595]|d[1596]<<8|d[1597]<<16|d[1598]<<24,o[0|e]=i,o[e+1|0]=i>>>8,o[e+2|0]=i>>>16,o[e+3|0]=i>>>24,o[e+4|0]=t,o[e+5|0]=t>>>8,o[e+6|0]=t>>>16,o[e+7|0]=t>>>24,o[e+26|0]=0,s[r+8>>2]=-1,Ot(t=r+8|4,e,26),i=o[r+23|0],s[a>>2]=s[r+8>>2],a=a+4|0,(0|i)>=0?(i=s[t+4>>2],s[a>>2]=s[t>>2],s[a+4>>2]=i,s[a+8>>2]=s[t+8>>2]):Ot(a,s[r+12>>2],s[r+16>>2]),o[r+23|0]<0&&ee(s[r+12>>2]),ee(e)):(s[a>>2]=0,s[a+4>>2]=0,s[a+16>>2]=e,s[a+8>>2]=0,s[a+12>>2]=0);return N=r+80|0,e=s[n+24>>2],o[n+23|0]<0&&ee(s[n+12>>2]),N=n+32|0,0|e},ib:function(e,t,r){e|=0,t|=0,r|=0;var n,i=0,a=0;N=t=N-16|0,Ge(t),s[e+24>>2]=s[t>>2];e:if((0|(n=e+24|0))!=(0|t))if(r=4|t,i=(a=d[t+15|0])<<24>>24,o[11+(e=e+28|0)|0]>=0){if((0|i)>=0){i=s[r+4>>2],s[e>>2]=s[r>>2],s[e+4>>2]=i,s[e+8>>2]=s[r+8>>2];break e}tr(e,s[t+4>>2],s[t+8>>2])}else Zt(e,(e=(0|i)<0)?s[t+4>>2]:r,e?s[t+8>>2]:a);return o[t+15|0]<0&&ee(s[t+4>>2]),N=t+16|0,0|n},jb:function(e,t,r){var n,i,a=0;N=n=N-16|0,B(n,e|=0,t|=0,r|=0),s[e+24>>2]=s[n>>2];e:if((0|(i=e+24|0))!=(0|n))if(t=4|n,r=(a=d[n+15|0])<<24>>24,o[11+(e=e+28|0)|0]>=0){if((0|r)>=0){r=s[t+4>>2],s[e>>2]=s[t>>2],s[e+4>>2]=r,s[e+8>>2]=s[t+8>>2];break e}tr(e,s[n+4>>2],s[n+8>>2])}else Zt(e,(e=(0|r)<0)?s[n+4>>2]:t,e?s[n+8>>2]:a);return o[n+15|0]<0&&ee(s[n+4>>2]),N=n+16|0,0|i},kb:function(e){(e|=0)&&(o[e+39|0]<0&&ee(s[e+28>>2]),function e(t,r){r&&(e(t,s[r>>2]),e(t,s[r+4>>2]),pr(r+20|0,s[r+24>>2]),ee(r))}(e+12|0,s[e+16>>2]),pr(e,s[e+4>>2]),ee(e))},lb:cn,mb:fn,nb:ln,ob:mn,pb:cn,qb:fn,rb:ln,sb:mn,tb:un,ub:pn,vb:cn,wb:fn,xb:ln,yb:fn,zb:ln,Ab:mn,Bb:un,Cb:pn,Db:function(){return 5},Eb:function(){return 6},Fb:function(){return 7},Gb:function(){return 8},Hb:function(){return 9},Ib:function(){return 10},Jb:function(){return 11},Kb:function(){return 12},Lb:fn,Mb:cn,Nb:function(){return-2},Ob:function(){return-3},Pb:function(){return-4},Qb:function(){return-5},Rb:P,Sb:ee}}(e)}(ae)},instantiate:function(e,t){return{then:function(t){var r=new C.Module(e);t({instance:new C.Instance(r)})}}},RuntimeError:Error};k=[],"object"!=typeof C&&q("no native wasm support detected");var M=!1;function I(e,t){e||q("Assertion failed: "+t)}var S,N,R,E,P="undefined"!=typeof TextDecoder?new TextDecoder("utf8"):void 0;function B(e,t){return e?function(e,t,r){for(var n=t+r,i=t;e[i]&&!(i>=n);)++i;if(i-t>16&&e.subarray&&P)return P.decode(e.subarray(t,i));for(var o="";t<i;){var a=e[t++];if(128&a){var s=63&e[t++];if(192!=(224&a)){var c=63&e[t++];if((a=224==(240&a)?(15&a)<<12|s<<6|c:(7&a)<<18|s<<12|c<<6|63&e[t++])<65536)o+=String.fromCharCode(a);else{var l=a-65536;o+=String.fromCharCode(55296|l>>10,56320|1023&l)}}else o+=String.fromCharCode((31&a)<<6|s)}else o+=String.fromCharCode(a)}return o}(R,e,t):""}function D(e){S=e,c.HEAP8=N=new Int8Array(e),c.HEAP16=new Int16Array(e),c.HEAP32=E=new Int32Array(e),c.HEAPU8=R=new Uint8Array(e),c.HEAPU16=new Uint16Array(e),c.HEAPU32=new Uint32Array(e),c.HEAPF32=new Float32Array(e),c.HEAPF64=new Float64Array(e)}var O,z=c.INITIAL_MEMORY||16777216;(w=c.wasmMemory?c.wasmMemory:new C.Memory({initial:z/65536,maximum:32768}))&&(S=w.buffer),z=S.byteLength,D(S);var F=[],G=[],U=[],V=!1;function L(e){G.unshift(e)}var j,W,Z=0,H=null,Y=null;function q(e){c.onAbort&&c.onAbort(e),T(e="Aborted("+e+")"),M=!0,e+=". Build with -s ASSERTIONS=1 for more info.";var t=new C.RuntimeError(e);throw s(t),t}function Q(e){return e.startsWith("data:application/octet-stream;base64,")}function X(e){return e.startsWith("file://")}function J(e){try{if(e==j&&k)return new Uint8Array(k);var t=ie(e);if(t)return t;if(h)return h(e);throw"both async and sync fetching of the wasm failed"}catch(e){q(e)}}function K(e){for(;e.length>0;){var t=e.shift();if("function"!=typeof t){var r=t.func;"number"==typeof r?void 0===t.arg?ee(r)():ee(r)(t.arg):r(void 0===t.arg?null:t.arg)}else t(c)}}c.preloadedImages={},c.preloadedAudios={},Q(j="draco_decoder_gltf.wasm")||(W=j,j=c.locateFile?c.locateFile(W,y):y+W);var $=[];function ee(e){var t=$[e];return t||(e>=$.length&&($.length=e+1),$[e]=t=O.get(e)),t}function te(e){this.excPtr=e,this.ptr=e-16,this.set_type=function(e){E[this.ptr+4>>2]=e},this.get_type=function(){return E[this.ptr+4>>2]},this.set_destructor=function(e){E[this.ptr+8>>2]=e},this.get_destructor=function(){return E[this.ptr+8>>2]},this.set_refcount=function(e){E[this.ptr>>2]=e},this.set_caught=function(e){e=e?1:0,N[this.ptr+12>>0]=e},this.get_caught=function(){return 0!=N[this.ptr+12>>0]},this.set_rethrown=function(e){e=e?1:0,N[this.ptr+13>>0]=e},this.get_rethrown=function(){return 0!=N[this.ptr+13>>0]},this.init=function(e,t){this.set_type(e),this.set_destructor(t),this.set_refcount(0),this.set_caught(!1),this.set_rethrown(!1)},this.add_ref=function(){var e=E[this.ptr>>2];E[this.ptr>>2]=e+1},this.release_ref=function(){var e=E[this.ptr>>2];return E[this.ptr>>2]=e-1,1===e}}function re(e){try{return w.grow(e-S.byteLength+65535>>>16),D(w.buffer),1}catch(e){}}var ne="function"==typeof atob?atob:function(e){var t,r,n,i,o,a,s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",c="",l=0;e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{t=s.indexOf(e.charAt(l++))<<2|(i=s.indexOf(e.charAt(l++)))>>4,r=(15&i)<<4|(o=s.indexOf(e.charAt(l++)))>>2,n=(3&o)<<6|(a=s.indexOf(e.charAt(l++))),c+=String.fromCharCode(t),64!==o&&(c+=String.fromCharCode(r)),64!==a&&(c+=String.fromCharCode(n))}while(l<e.length);return c};function ie(e){if(Q(e))return function(e){if("boolean"==typeof x&&x){var t=o.from(e,"base64");return new Uint8Array(t.buffer,t.byteOffset,t.byteLength)}try{for(var r=ne(e),n=new Uint8Array(r.length),i=0;i<r.length;++i)n[i]=r.charCodeAt(i);return n}catch(e){throw new Error("Converting base64 string to bytes failed.")}}(e.slice("data:application/octet-stream;base64,".length))}var oe,ae={f:function(e){return Lr(e+16)+16},e:function(e,t,r){throw new te(e).init(t,r),e},b:function(){q("")},c:function(e,t,r){R.copyWithin(e,t,t+r)},d:function(e){var t,r,n=R.length;if((e>>>=0)>2147483648)return!1;for(var i=1;i<=4;i*=2){var o=n*(1+.2/i);if(o=Math.min(o,e+100663296),re(Math.min(2147483648,((t=Math.max(e,o))%(r=65536)>0&&(t+=r-t%r),t))))return!0}return!1},a:w},se=(function(){var e={a:ae};function t(e,t){var r=e.exports;c.asm=r,O=c.asm.h,L(c.asm.g),function(e){if(Z--,c.monitorRunDependencies&&c.monitorRunDependencies(Z),0==Z&&(null!==H&&(clearInterval(H),H=null),Y)){var t=Y;Y=null,t()}}()}function r(e){t(e.instance)}function n(t){return function(){if(!k&&(A||_)){if("function"==typeof fetch&&!X(j))return fetch(j,{credentials:"same-origin"}).then((function(e){if(!e.ok)throw"failed to load wasm binary file at '"+j+"'";return e.arrayBuffer()})).catch((function(){return J(j)}));if(m)return new Promise((function(e,t){m(j,(function(t){e(new Uint8Array(t))}),t)}))}return Promise.resolve().then((function(){return J(j)}))}().then((function(t){return C.instantiate(t,e)})).then((function(e){return e})).then(t,(function(e){T("failed to asynchronously prepare wasm: "+e),q(e)}))}if(Z++,c.monitorRunDependencies&&c.monitorRunDependencies(Z),c.instantiateWasm)try{return c.instantiateWasm(e,t)}catch(e){return T("Module.instantiateWasm callback failed with error: "+e),!1}(k||"function"!=typeof C.instantiateStreaming||Q(j)||X(j)||"function"!=typeof fetch?n(r):fetch(j,{credentials:"same-origin"}).then((function(t){return C.instantiateStreaming(t,e).then(r,(function(e){return T("wasm streaming compile failed: "+e),T("falling back to ArrayBuffer instantiation"),n(r)}))}))).catch(s)}(),c.___wasm_call_ctors=function(){return(c.___wasm_call_ctors=c.asm.g).apply(null,arguments)},c._emscripten_bind_VoidPtr___destroy___0=function(){return(se=c._emscripten_bind_VoidPtr___destroy___0=c.asm.i).apply(null,arguments)}),ce=c._emscripten_bind_DecoderBuffer_DecoderBuffer_0=function(){return(ce=c._emscripten_bind_DecoderBuffer_DecoderBuffer_0=c.asm.j).apply(null,arguments)},le=c._emscripten_bind_DecoderBuffer_Init_2=function(){return(le=c._emscripten_bind_DecoderBuffer_Init_2=c.asm.k).apply(null,arguments)},de=c._emscripten_bind_DecoderBuffer___destroy___0=function(){return(de=c._emscripten_bind_DecoderBuffer___destroy___0=c.asm.l).apply(null,arguments)},fe=c._emscripten_bind_AttributeTransformData_AttributeTransformData_0=function(){return(fe=c._emscripten_bind_AttributeTransformData_AttributeTransformData_0=c.asm.m).apply(null,arguments)},ue=c._emscripten_bind_AttributeTransformData_transform_type_0=function(){return(ue=c._emscripten_bind_AttributeTransformData_transform_type_0=c.asm.n).apply(null,arguments)},pe=c._emscripten_bind_AttributeTransformData___destroy___0=function(){return(pe=c._emscripten_bind_AttributeTransformData___destroy___0=c.asm.o).apply(null,arguments)},me=c._emscripten_bind_GeometryAttribute_GeometryAttribute_0=function(){return(me=c._emscripten_bind_GeometryAttribute_GeometryAttribute_0=c.asm.p).apply(null,arguments)},he=c._emscripten_bind_GeometryAttribute___destroy___0=function(){return(he=c._emscripten_bind_GeometryAttribute___destroy___0=c.asm.q).apply(null,arguments)},be=c._emscripten_bind_PointAttribute_PointAttribute_0=function(){return(be=c._emscripten_bind_PointAttribute_PointAttribute_0=c.asm.r).apply(null,arguments)},ve=c._emscripten_bind_PointAttribute_size_0=function(){return(ve=c._emscripten_bind_PointAttribute_size_0=c.asm.s).apply(null,arguments)},ge=c._emscripten_bind_PointAttribute_GetAttributeTransformData_0=function(){return(ge=c._emscripten_bind_PointAttribute_GetAttributeTransformData_0=c.asm.t).apply(null,arguments)},Ae=c._emscripten_bind_PointAttribute_attribute_type_0=function(){return(Ae=c._emscripten_bind_PointAttribute_attribute_type_0=c.asm.u).apply(null,arguments)},_e=c._emscripten_bind_PointAttribute_data_type_0=function(){return(_e=c._emscripten_bind_PointAttribute_data_type_0=c.asm.v).apply(null,arguments)},xe=c._emscripten_bind_PointAttribute_num_components_0=function(){return(xe=c._emscripten_bind_PointAttribute_num_components_0=c.asm.w).apply(null,arguments)},ye=c._emscripten_bind_PointAttribute_normalized_0=function(){return(ye=c._emscripten_bind_PointAttribute_normalized_0=c.asm.x).apply(null,arguments)},ke=c._emscripten_bind_PointAttribute_byte_stride_0=function(){return(ke=c._emscripten_bind_PointAttribute_byte_stride_0=c.asm.y).apply(null,arguments)},Te=c._emscripten_bind_PointAttribute_byte_offset_0=function(){return(Te=c._emscripten_bind_PointAttribute_byte_offset_0=c.asm.z).apply(null,arguments)},we=c._emscripten_bind_PointAttribute_unique_id_0=function(){return(we=c._emscripten_bind_PointAttribute_unique_id_0=c.asm.A).apply(null,arguments)},Ce=c._emscripten_bind_PointAttribute___destroy___0=function(){return(Ce=c._emscripten_bind_PointAttribute___destroy___0=c.asm.B).apply(null,arguments)},Me=c._emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0=function(){return(Me=c._emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0=c.asm.C).apply(null,arguments)},Ie=c._emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1=function(){return(Ie=c._emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1=c.asm.D).apply(null,arguments)},Se=c._emscripten_bind_AttributeQuantizationTransform_quantization_bits_0=function(){return(Se=c._emscripten_bind_AttributeQuantizationTransform_quantization_bits_0=c.asm.E).apply(null,arguments)},Ne=c._emscripten_bind_AttributeQuantizationTransform_min_value_1=function(){return(Ne=c._emscripten_bind_AttributeQuantizationTransform_min_value_1=c.asm.F).apply(null,arguments)},Re=c._emscripten_bind_AttributeQuantizationTransform_range_0=function(){return(Re=c._emscripten_bind_AttributeQuantizationTransform_range_0=c.asm.G).apply(null,arguments)},Ee=c._emscripten_bind_AttributeQuantizationTransform___destroy___0=function(){return(Ee=c._emscripten_bind_AttributeQuantizationTransform___destroy___0=c.asm.H).apply(null,arguments)},Pe=c._emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0=function(){return(Pe=c._emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0=c.asm.I).apply(null,arguments)},Be=c._emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1=function(){return(Be=c._emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1=c.asm.J).apply(null,arguments)},De=c._emscripten_bind_AttributeOctahedronTransform_quantization_bits_0=function(){return(De=c._emscripten_bind_AttributeOctahedronTransform_quantization_bits_0=c.asm.K).apply(null,arguments)},Oe=c._emscripten_bind_AttributeOctahedronTransform___destroy___0=function(){return(Oe=c._emscripten_bind_AttributeOctahedronTransform___destroy___0=c.asm.L).apply(null,arguments)},ze=c._emscripten_bind_PointCloud_PointCloud_0=function(){return(ze=c._emscripten_bind_PointCloud_PointCloud_0=c.asm.M).apply(null,arguments)},Fe=c._emscripten_bind_PointCloud_num_attributes_0=function(){return(Fe=c._emscripten_bind_PointCloud_num_attributes_0=c.asm.N).apply(null,arguments)},Ge=c._emscripten_bind_PointCloud_num_points_0=function(){return(Ge=c._emscripten_bind_PointCloud_num_points_0=c.asm.O).apply(null,arguments)},Ue=c._emscripten_bind_PointCloud___destroy___0=function(){return(Ue=c._emscripten_bind_PointCloud___destroy___0=c.asm.P).apply(null,arguments)},Ve=c._emscripten_bind_Mesh_Mesh_0=function(){return(Ve=c._emscripten_bind_Mesh_Mesh_0=c.asm.Q).apply(null,arguments)},Le=c._emscripten_bind_Mesh_num_faces_0=function(){return(Le=c._emscripten_bind_Mesh_num_faces_0=c.asm.R).apply(null,arguments)},je=c._emscripten_bind_Mesh_num_attributes_0=function(){return(je=c._emscripten_bind_Mesh_num_attributes_0=c.asm.S).apply(null,arguments)},We=c._emscripten_bind_Mesh_num_points_0=function(){return(We=c._emscripten_bind_Mesh_num_points_0=c.asm.T).apply(null,arguments)},Ze=c._emscripten_bind_Mesh___destroy___0=function(){return(Ze=c._emscripten_bind_Mesh___destroy___0=c.asm.U).apply(null,arguments)},He=c._emscripten_bind_Metadata_Metadata_0=function(){return(He=c._emscripten_bind_Metadata_Metadata_0=c.asm.V).apply(null,arguments)},Ye=c._emscripten_bind_Metadata___destroy___0=function(){return(Ye=c._emscripten_bind_Metadata___destroy___0=c.asm.W).apply(null,arguments)},qe=c._emscripten_bind_Status_code_0=function(){return(qe=c._emscripten_bind_Status_code_0=c.asm.X).apply(null,arguments)},Qe=c._emscripten_bind_Status_ok_0=function(){return(Qe=c._emscripten_bind_Status_ok_0=c.asm.Y).apply(null,arguments)},Xe=c._emscripten_bind_Status_error_msg_0=function(){return(Xe=c._emscripten_bind_Status_error_msg_0=c.asm.Z).apply(null,arguments)},Je=c._emscripten_bind_Status___destroy___0=function(){return(Je=c._emscripten_bind_Status___destroy___0=c.asm._).apply(null,arguments)},Ke=c._emscripten_bind_DracoFloat32Array_DracoFloat32Array_0=function(){return(Ke=c._emscripten_bind_DracoFloat32Array_DracoFloat32Array_0=c.asm.$).apply(null,arguments)},$e=c._emscripten_bind_DracoFloat32Array_GetValue_1=function(){return($e=c._emscripten_bind_DracoFloat32Array_GetValue_1=c.asm.aa).apply(null,arguments)},et=c._emscripten_bind_DracoFloat32Array_size_0=function(){return(et=c._emscripten_bind_DracoFloat32Array_size_0=c.asm.ba).apply(null,arguments)},tt=c._emscripten_bind_DracoFloat32Array___destroy___0=function(){return(tt=c._emscripten_bind_DracoFloat32Array___destroy___0=c.asm.ca).apply(null,arguments)},rt=c._emscripten_bind_DracoInt8Array_DracoInt8Array_0=function(){return(rt=c._emscripten_bind_DracoInt8Array_DracoInt8Array_0=c.asm.da).apply(null,arguments)},nt=c._emscripten_bind_DracoInt8Array_GetValue_1=function(){return(nt=c._emscripten_bind_DracoInt8Array_GetValue_1=c.asm.ea).apply(null,arguments)},it=c._emscripten_bind_DracoInt8Array_size_0=function(){return(it=c._emscripten_bind_DracoInt8Array_size_0=c.asm.fa).apply(null,arguments)},ot=c._emscripten_bind_DracoInt8Array___destroy___0=function(){return(ot=c._emscripten_bind_DracoInt8Array___destroy___0=c.asm.ga).apply(null,arguments)},at=c._emscripten_bind_DracoUInt8Array_DracoUInt8Array_0=function(){return(at=c._emscripten_bind_DracoUInt8Array_DracoUInt8Array_0=c.asm.ha).apply(null,arguments)},st=c._emscripten_bind_DracoUInt8Array_GetValue_1=function(){return(st=c._emscripten_bind_DracoUInt8Array_GetValue_1=c.asm.ia).apply(null,arguments)},ct=c._emscripten_bind_DracoUInt8Array_size_0=function(){return(ct=c._emscripten_bind_DracoUInt8Array_size_0=c.asm.ja).apply(null,arguments)},lt=c._emscripten_bind_DracoUInt8Array___destroy___0=function(){return(lt=c._emscripten_bind_DracoUInt8Array___destroy___0=c.asm.ka).apply(null,arguments)},dt=c._emscripten_bind_DracoInt16Array_DracoInt16Array_0=function(){return(dt=c._emscripten_bind_DracoInt16Array_DracoInt16Array_0=c.asm.la).apply(null,arguments)},ft=c._emscripten_bind_DracoInt16Array_GetValue_1=function(){return(ft=c._emscripten_bind_DracoInt16Array_GetValue_1=c.asm.ma).apply(null,arguments)},ut=c._emscripten_bind_DracoInt16Array_size_0=function(){return(ut=c._emscripten_bind_DracoInt16Array_size_0=c.asm.na).apply(null,arguments)},pt=c._emscripten_bind_DracoInt16Array___destroy___0=function(){return(pt=c._emscripten_bind_DracoInt16Array___destroy___0=c.asm.oa).apply(null,arguments)},mt=c._emscripten_bind_DracoUInt16Array_DracoUInt16Array_0=function(){return(mt=c._emscripten_bind_DracoUInt16Array_DracoUInt16Array_0=c.asm.pa).apply(null,arguments)},ht=c._emscripten_bind_DracoUInt16Array_GetValue_1=function(){return(ht=c._emscripten_bind_DracoUInt16Array_GetValue_1=c.asm.qa).apply(null,arguments)},bt=c._emscripten_bind_DracoUInt16Array_size_0=function(){return(bt=c._emscripten_bind_DracoUInt16Array_size_0=c.asm.ra).apply(null,arguments)},vt=c._emscripten_bind_DracoUInt16Array___destroy___0=function(){return(vt=c._emscripten_bind_DracoUInt16Array___destroy___0=c.asm.sa).apply(null,arguments)},gt=c._emscripten_bind_DracoInt32Array_DracoInt32Array_0=function(){return(gt=c._emscripten_bind_DracoInt32Array_DracoInt32Array_0=c.asm.ta).apply(null,arguments)},At=c._emscripten_bind_DracoInt32Array_GetValue_1=function(){return(At=c._emscripten_bind_DracoInt32Array_GetValue_1=c.asm.ua).apply(null,arguments)},_t=c._emscripten_bind_DracoInt32Array_size_0=function(){return(_t=c._emscripten_bind_DracoInt32Array_size_0=c.asm.va).apply(null,arguments)},xt=c._emscripten_bind_DracoInt32Array___destroy___0=function(){return(xt=c._emscripten_bind_DracoInt32Array___destroy___0=c.asm.wa).apply(null,arguments)},yt=c._emscripten_bind_DracoUInt32Array_DracoUInt32Array_0=function(){return(yt=c._emscripten_bind_DracoUInt32Array_DracoUInt32Array_0=c.asm.xa).apply(null,arguments)},kt=c._emscripten_bind_DracoUInt32Array_GetValue_1=function(){return(kt=c._emscripten_bind_DracoUInt32Array_GetValue_1=c.asm.ya).apply(null,arguments)},Tt=c._emscripten_bind_DracoUInt32Array_size_0=function(){return(Tt=c._emscripten_bind_DracoUInt32Array_size_0=c.asm.za).apply(null,arguments)},wt=c._emscripten_bind_DracoUInt32Array___destroy___0=function(){return(wt=c._emscripten_bind_DracoUInt32Array___destroy___0=c.asm.Aa).apply(null,arguments)},Ct=c._emscripten_bind_MetadataQuerier_MetadataQuerier_0=function(){return(Ct=c._emscripten_bind_MetadataQuerier_MetadataQuerier_0=c.asm.Ba).apply(null,arguments)},Mt=c._emscripten_bind_MetadataQuerier_HasEntry_2=function(){return(Mt=c._emscripten_bind_MetadataQuerier_HasEntry_2=c.asm.Ca).apply(null,arguments)},It=c._emscripten_bind_MetadataQuerier_GetIntEntry_2=function(){return(It=c._emscripten_bind_MetadataQuerier_GetIntEntry_2=c.asm.Da).apply(null,arguments)},St=c._emscripten_bind_MetadataQuerier_GetIntEntryArray_3=function(){return(St=c._emscripten_bind_MetadataQuerier_GetIntEntryArray_3=c.asm.Ea).apply(null,arguments)},Nt=c._emscripten_bind_MetadataQuerier_GetDoubleEntry_2=function(){return(Nt=c._emscripten_bind_MetadataQuerier_GetDoubleEntry_2=c.asm.Fa).apply(null,arguments)},Rt=c._emscripten_bind_MetadataQuerier_GetStringEntry_2=function(){return(Rt=c._emscripten_bind_MetadataQuerier_GetStringEntry_2=c.asm.Ga).apply(null,arguments)},Et=c._emscripten_bind_MetadataQuerier_NumEntries_1=function(){return(Et=c._emscripten_bind_MetadataQuerier_NumEntries_1=c.asm.Ha).apply(null,arguments)},Pt=c._emscripten_bind_MetadataQuerier_GetEntryName_2=function(){return(Pt=c._emscripten_bind_MetadataQuerier_GetEntryName_2=c.asm.Ia).apply(null,arguments)},Bt=c._emscripten_bind_MetadataQuerier___destroy___0=function(){return(Bt=c._emscripten_bind_MetadataQuerier___destroy___0=c.asm.Ja).apply(null,arguments)},Dt=c._emscripten_bind_Decoder_Decoder_0=function(){return(Dt=c._emscripten_bind_Decoder_Decoder_0=c.asm.Ka).apply(null,arguments)},Ot=c._emscripten_bind_Decoder_DecodeArrayToPointCloud_3=function(){return(Ot=c._emscripten_bind_Decoder_DecodeArrayToPointCloud_3=c.asm.La).apply(null,arguments)},zt=c._emscripten_bind_Decoder_DecodeArrayToMesh_3=function(){return(zt=c._emscripten_bind_Decoder_DecodeArrayToMesh_3=c.asm.Ma).apply(null,arguments)},Ft=c._emscripten_bind_Decoder_GetAttributeId_2=function(){return(Ft=c._emscripten_bind_Decoder_GetAttributeId_2=c.asm.Na).apply(null,arguments)},Gt=c._emscripten_bind_Decoder_GetAttributeIdByName_2=function(){return(Gt=c._emscripten_bind_Decoder_GetAttributeIdByName_2=c.asm.Oa).apply(null,arguments)},Ut=c._emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3=function(){return(Ut=c._emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3=c.asm.Pa).apply(null,arguments)},Vt=c._emscripten_bind_Decoder_GetAttribute_2=function(){return(Vt=c._emscripten_bind_Decoder_GetAttribute_2=c.asm.Qa).apply(null,arguments)},Lt=c._emscripten_bind_Decoder_GetAttributeByUniqueId_2=function(){return(Lt=c._emscripten_bind_Decoder_GetAttributeByUniqueId_2=c.asm.Ra).apply(null,arguments)},jt=c._emscripten_bind_Decoder_GetMetadata_1=function(){return(jt=c._emscripten_bind_Decoder_GetMetadata_1=c.asm.Sa).apply(null,arguments)},Wt=c._emscripten_bind_Decoder_GetAttributeMetadata_2=function(){return(Wt=c._emscripten_bind_Decoder_GetAttributeMetadata_2=c.asm.Ta).apply(null,arguments)},Zt=c._emscripten_bind_Decoder_GetFaceFromMesh_3=function(){return(Zt=c._emscripten_bind_Decoder_GetFaceFromMesh_3=c.asm.Ua).apply(null,arguments)},Ht=c._emscripten_bind_Decoder_GetTriangleStripsFromMesh_2=function(){return(Ht=c._emscripten_bind_Decoder_GetTriangleStripsFromMesh_2=c.asm.Va).apply(null,arguments)},Yt=c._emscripten_bind_Decoder_GetTrianglesUInt16Array_3=function(){return(Yt=c._emscripten_bind_Decoder_GetTrianglesUInt16Array_3=c.asm.Wa).apply(null,arguments)},qt=c._emscripten_bind_Decoder_GetTrianglesUInt32Array_3=function(){return(qt=c._emscripten_bind_Decoder_GetTrianglesUInt32Array_3=c.asm.Xa).apply(null,arguments)},Qt=c._emscripten_bind_Decoder_GetAttributeFloat_3=function(){return(Qt=c._emscripten_bind_Decoder_GetAttributeFloat_3=c.asm.Ya).apply(null,arguments)},Xt=c._emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3=function(){return(Xt=c._emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3=c.asm.Za).apply(null,arguments)},Jt=c._emscripten_bind_Decoder_GetAttributeIntForAllPoints_3=function(){return(Jt=c._emscripten_bind_Decoder_GetAttributeIntForAllPoints_3=c.asm._a).apply(null,arguments)},Kt=c._emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3=function(){return(Kt=c._emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3=c.asm.$a).apply(null,arguments)},$t=c._emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3=function(){return($t=c._emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3=c.asm.ab).apply(null,arguments)},er=c._emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3=function(){return(er=c._emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3=c.asm.bb).apply(null,arguments)},tr=c._emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3=function(){return(tr=c._emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3=c.asm.cb).apply(null,arguments)},rr=c._emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3=function(){return(rr=c._emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3=c.asm.db).apply(null,arguments)},nr=c._emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3=function(){return(nr=c._emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3=c.asm.eb).apply(null,arguments)},ir=c._emscripten_bind_Decoder_GetAttributeDataArrayForAllPoints_5=function(){return(ir=c._emscripten_bind_Decoder_GetAttributeDataArrayForAllPoints_5=c.asm.fb).apply(null,arguments)},or=c._emscripten_bind_Decoder_SkipAttributeTransform_1=function(){return(or=c._emscripten_bind_Decoder_SkipAttributeTransform_1=c.asm.gb).apply(null,arguments)},ar=c._emscripten_bind_Decoder_GetEncodedGeometryType_Deprecated_1=function(){return(ar=c._emscripten_bind_Decoder_GetEncodedGeometryType_Deprecated_1=c.asm.hb).apply(null,arguments)},sr=c._emscripten_bind_Decoder_DecodeBufferToPointCloud_2=function(){return(sr=c._emscripten_bind_Decoder_DecodeBufferToPointCloud_2=c.asm.ib).apply(null,arguments)},cr=c._emscripten_bind_Decoder_DecodeBufferToMesh_2=function(){return(cr=c._emscripten_bind_Decoder_DecodeBufferToMesh_2=c.asm.jb).apply(null,arguments)},lr=c._emscripten_bind_Decoder___destroy___0=function(){return(lr=c._emscripten_bind_Decoder___destroy___0=c.asm.kb).apply(null,arguments)},dr=c._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM=function(){return(dr=c._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM=c.asm.lb).apply(null,arguments)},fr=c._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM=function(){return(fr=c._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM=c.asm.mb).apply(null,arguments)},ur=c._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM=function(){return(ur=c._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM=c.asm.nb).apply(null,arguments)},pr=c._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM=function(){return(pr=c._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM=c.asm.ob).apply(null,arguments)},mr=c._emscripten_enum_draco_GeometryAttribute_Type_INVALID=function(){return(mr=c._emscripten_enum_draco_GeometryAttribute_Type_INVALID=c.asm.pb).apply(null,arguments)},hr=c._emscripten_enum_draco_GeometryAttribute_Type_POSITION=function(){return(hr=c._emscripten_enum_draco_GeometryAttribute_Type_POSITION=c.asm.qb).apply(null,arguments)},br=c._emscripten_enum_draco_GeometryAttribute_Type_NORMAL=function(){return(br=c._emscripten_enum_draco_GeometryAttribute_Type_NORMAL=c.asm.rb).apply(null,arguments)},vr=c._emscripten_enum_draco_GeometryAttribute_Type_COLOR=function(){return(vr=c._emscripten_enum_draco_GeometryAttribute_Type_COLOR=c.asm.sb).apply(null,arguments)},gr=c._emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD=function(){return(gr=c._emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD=c.asm.tb).apply(null,arguments)},Ar=c._emscripten_enum_draco_GeometryAttribute_Type_GENERIC=function(){return(Ar=c._emscripten_enum_draco_GeometryAttribute_Type_GENERIC=c.asm.ub).apply(null,arguments)},_r=c._emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE=function(){return(_r=c._emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE=c.asm.vb).apply(null,arguments)},xr=c._emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD=function(){return(xr=c._emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD=c.asm.wb).apply(null,arguments)},yr=c._emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH=function(){return(yr=c._emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH=c.asm.xb).apply(null,arguments)},kr=c._emscripten_enum_draco_DataType_DT_INVALID=function(){return(kr=c._emscripten_enum_draco_DataType_DT_INVALID=c.asm.yb).apply(null,arguments)},Tr=c._emscripten_enum_draco_DataType_DT_INT8=function(){return(Tr=c._emscripten_enum_draco_DataType_DT_INT8=c.asm.zb).apply(null,arguments)},wr=c._emscripten_enum_draco_DataType_DT_UINT8=function(){return(wr=c._emscripten_enum_draco_DataType_DT_UINT8=c.asm.Ab).apply(null,arguments)},Cr=c._emscripten_enum_draco_DataType_DT_INT16=function(){return(Cr=c._emscripten_enum_draco_DataType_DT_INT16=c.asm.Bb).apply(null,arguments)},Mr=c._emscripten_enum_draco_DataType_DT_UINT16=function(){return(Mr=c._emscripten_enum_draco_DataType_DT_UINT16=c.asm.Cb).apply(null,arguments)},Ir=c._emscripten_enum_draco_DataType_DT_INT32=function(){return(Ir=c._emscripten_enum_draco_DataType_DT_INT32=c.asm.Db).apply(null,arguments)},Sr=c._emscripten_enum_draco_DataType_DT_UINT32=function(){return(Sr=c._emscripten_enum_draco_DataType_DT_UINT32=c.asm.Eb).apply(null,arguments)},Nr=c._emscripten_enum_draco_DataType_DT_INT64=function(){return(Nr=c._emscripten_enum_draco_DataType_DT_INT64=c.asm.Fb).apply(null,arguments)},Rr=c._emscripten_enum_draco_DataType_DT_UINT64=function(){return(Rr=c._emscripten_enum_draco_DataType_DT_UINT64=c.asm.Gb).apply(null,arguments)},Er=c._emscripten_enum_draco_DataType_DT_FLOAT32=function(){return(Er=c._emscripten_enum_draco_DataType_DT_FLOAT32=c.asm.Hb).apply(null,arguments)},Pr=c._emscripten_enum_draco_DataType_DT_FLOAT64=function(){return(Pr=c._emscripten_enum_draco_DataType_DT_FLOAT64=c.asm.Ib).apply(null,arguments)},Br=c._emscripten_enum_draco_DataType_DT_BOOL=function(){return(Br=c._emscripten_enum_draco_DataType_DT_BOOL=c.asm.Jb).apply(null,arguments)},Dr=c._emscripten_enum_draco_DataType_DT_TYPES_COUNT=function(){return(Dr=c._emscripten_enum_draco_DataType_DT_TYPES_COUNT=c.asm.Kb).apply(null,arguments)},Or=c._emscripten_enum_draco_StatusCode_OK=function(){return(Or=c._emscripten_enum_draco_StatusCode_OK=c.asm.Lb).apply(null,arguments)},zr=c._emscripten_enum_draco_StatusCode_DRACO_ERROR=function(){return(zr=c._emscripten_enum_draco_StatusCode_DRACO_ERROR=c.asm.Mb).apply(null,arguments)},Fr=c._emscripten_enum_draco_StatusCode_IO_ERROR=function(){return(Fr=c._emscripten_enum_draco_StatusCode_IO_ERROR=c.asm.Nb).apply(null,arguments)},Gr=c._emscripten_enum_draco_StatusCode_INVALID_PARAMETER=function(){return(Gr=c._emscripten_enum_draco_StatusCode_INVALID_PARAMETER=c.asm.Ob).apply(null,arguments)},Ur=c._emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION=function(){return(Ur=c._emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION=c.asm.Pb).apply(null,arguments)},Vr=c._emscripten_enum_draco_StatusCode_UNKNOWN_VERSION=function(){return(Vr=c._emscripten_enum_draco_StatusCode_UNKNOWN_VERSION=c.asm.Qb).apply(null,arguments)},Lr=c._malloc=function(){return(Lr=c._malloc=c.asm.Rb).apply(null,arguments)};function jr(e){function r(){oe||(oe=!0,c.calledRun=!0,M||(V=!0,K(G),t(c),c.onRuntimeInitialized&&c.onRuntimeInitialized(),function(){if(c.postRun)for("function"==typeof c.postRun&&(c.postRun=[c.postRun]);c.postRun.length;)e=c.postRun.shift(),U.unshift(e);var e;K(U)}()))}e=e||g,Z>0||(function(){if(c.preRun)for("function"==typeof c.preRun&&(c.preRun=[c.preRun]);c.preRun.length;)e=c.preRun.shift(),F.unshift(e);var e;K(F)}(),Z>0||(c.setStatus?(c.setStatus("Running..."),setTimeout((function(){setTimeout((function(){c.setStatus("")}),1),r()}),1)):r()))}if(c._free=function(){return(c._free=c.asm.Sb).apply(null,arguments)},Y=function e(){oe||jr(),oe||(Y=e)},c.run=jr,c.preInit)for("function"==typeof c.preInit&&(c.preInit=[c.preInit]);c.preInit.length>0;)c.preInit.pop()();function Wr(){}function Zr(e){return(e||Wr).__cache__}function Hr(e,t){var r=Zr(t),n=r[e];return n||((n=Object.create((t||Wr).prototype)).ptr=e,r[e]=n)}jr(),Wr.prototype=Object.create(Wr.prototype),Wr.prototype.constructor=Wr,Wr.prototype.__class__=Wr,Wr.__cache__={},c.WrapperObject=Wr,c.getCache=Zr,c.wrapPointer=Hr,c.castObject=function(e,t){return Hr(e.ptr,t)},c.NULL=Hr(0),c.destroy=function(e){if(!e.__destroy__)throw"Error: Cannot destroy object. (Did you create it yourself?)";e.__destroy__(),delete Zr(e.__class__)[e.ptr]},c.compare=function(e,t){return e.ptr===t.ptr},c.getPointer=function(e){return e.ptr},c.getClass=function(e){return e.__class__};var Yr={buffer:0,size:0,pos:0,temps:[],needed:0,prepare:function(){if(Yr.needed){for(var e=0;e<Yr.temps.length;e++)c._free(Yr.temps[e]);Yr.temps.length=0,c._free(Yr.buffer),Yr.buffer=0,Yr.size+=Yr.needed,Yr.needed=0}Yr.buffer||(Yr.size+=128,Yr.buffer=c._malloc(Yr.size),I(Yr.buffer)),Yr.pos=0},alloc:function(e,t){I(Yr.buffer);var r,n=t.BYTES_PER_ELEMENT,i=e.length*n;return i=i+7&-8,Yr.pos+i>=Yr.size?(I(i>0),Yr.needed+=i,r=c._malloc(i),Yr.temps.push(r)):(r=Yr.buffer+Yr.pos,Yr.pos+=i),r},copy:function(e,t,r){switch(r>>>=0,t.BYTES_PER_ELEMENT){case 2:r>>>=1;break;case 4:r>>>=2;break;case 8:r>>>=3}for(var n=0;n<e.length;n++)t[r+n]=e[n]}};function qr(e){if("string"==typeof e){var t=(n=e,a=o>0?o:function(e){for(var t=0,r=0;r<e.length;++r){var n=e.charCodeAt(r);n>=55296&&n<=57343&&(n=65536+((1023&n)<<10)|1023&e.charCodeAt(++r)),n<=127?++t:t+=n<=2047?2:n<=65535?3:4}return t}(n)+1,s=new Array(a),c=function(e,t,r,n){if(!(n>0))return 0;for(var i=r,o=r+n-1,a=0;a<e.length;++a){var s=e.charCodeAt(a);if(s>=55296&&s<=57343&&(s=65536+((1023&s)<<10)|1023&e.charCodeAt(++a)),s<=127){if(r>=o)break;t[r++]=s}else if(s<=2047){if(r+1>=o)break;t[r++]=192|s>>6,t[r++]=128|63&s}else if(s<=65535){if(r+2>=o)break;t[r++]=224|s>>12,t[r++]=128|s>>6&63,t[r++]=128|63&s}else{if(r+3>=o)break;t[r++]=240|s>>18,t[r++]=128|s>>12&63,t[r++]=128|s>>6&63,t[r++]=128|63&s}}return t[r]=0,r-i}(n,s,0,s.length),i&&(s.length=c),s),r=Yr.alloc(t,N);return Yr.copy(t,N,r),r}var n,i,o,a,s,c;return e}function Qr(e){if("object"==typeof e){var t=Yr.alloc(e,N);return Yr.copy(e,N,t),t}return e}function Xr(){throw"cannot construct a VoidPtr, no constructor in IDL"}function Jr(){this.ptr=ce(),Zr(Jr)[this.ptr]=this}function Kr(){this.ptr=fe(),Zr(Kr)[this.ptr]=this}function $r(){this.ptr=me(),Zr($r)[this.ptr]=this}function en(){this.ptr=be(),Zr(en)[this.ptr]=this}function tn(){this.ptr=Me(),Zr(tn)[this.ptr]=this}function rn(){this.ptr=Pe(),Zr(rn)[this.ptr]=this}function nn(){this.ptr=ze(),Zr(nn)[this.ptr]=this}function on(){this.ptr=Ve(),Zr(on)[this.ptr]=this}function an(){this.ptr=He(),Zr(an)[this.ptr]=this}function sn(){throw"cannot construct a Status, no constructor in IDL"}function cn(){this.ptr=Ke(),Zr(cn)[this.ptr]=this}function ln(){this.ptr=rt(),Zr(ln)[this.ptr]=this}function dn(){this.ptr=at(),Zr(dn)[this.ptr]=this}function fn(){this.ptr=dt(),Zr(fn)[this.ptr]=this}function un(){this.ptr=mt(),Zr(un)[this.ptr]=this}function pn(){this.ptr=gt(),Zr(pn)[this.ptr]=this}function mn(){this.ptr=yt(),Zr(mn)[this.ptr]=this}function hn(){this.ptr=Ct(),Zr(hn)[this.ptr]=this}function bn(){this.ptr=Dt(),Zr(bn)[this.ptr]=this}return Xr.prototype=Object.create(Wr.prototype),Xr.prototype.constructor=Xr,Xr.prototype.__class__=Xr,Xr.__cache__={},c.VoidPtr=Xr,Xr.prototype.__destroy__=Xr.prototype.__destroy__=function(){var e=this.ptr;se(e)},Jr.prototype=Object.create(Wr.prototype),Jr.prototype.constructor=Jr,Jr.prototype.__class__=Jr,Jr.__cache__={},c.DecoderBuffer=Jr,Jr.prototype.Init=Jr.prototype.Init=function(e,t){var r=this.ptr;Yr.prepare(),"object"==typeof e&&(e=Qr(e)),t&&"object"==typeof t&&(t=t.ptr),le(r,e,t)},Jr.prototype.__destroy__=Jr.prototype.__destroy__=function(){var e=this.ptr;de(e)},Kr.prototype=Object.create(Wr.prototype),Kr.prototype.constructor=Kr,Kr.prototype.__class__=Kr,Kr.__cache__={},c.AttributeTransformData=Kr,Kr.prototype.transform_type=Kr.prototype.transform_type=function(){var e=this.ptr;return ue(e)},Kr.prototype.__destroy__=Kr.prototype.__destroy__=function(){var e=this.ptr;pe(e)},$r.prototype=Object.create(Wr.prototype),$r.prototype.constructor=$r,$r.prototype.__class__=$r,$r.__cache__={},c.GeometryAttribute=$r,$r.prototype.__destroy__=$r.prototype.__destroy__=function(){var e=this.ptr;he(e)},en.prototype=Object.create(Wr.prototype),en.prototype.constructor=en,en.prototype.__class__=en,en.__cache__={},c.PointAttribute=en,en.prototype.size=en.prototype.size=function(){var e=this.ptr;return ve(e)},en.prototype.GetAttributeTransformData=en.prototype.GetAttributeTransformData=function(){var e=this.ptr;return Hr(ge(e),Kr)},en.prototype.attribute_type=en.prototype.attribute_type=function(){var e=this.ptr;return Ae(e)},en.prototype.data_type=en.prototype.data_type=function(){var e=this.ptr;return _e(e)},en.prototype.num_components=en.prototype.num_components=function(){var e=this.ptr;return xe(e)},en.prototype.normalized=en.prototype.normalized=function(){var e=this.ptr;return!!ye(e)},en.prototype.byte_stride=en.prototype.byte_stride=function(){var e=this.ptr;return ke(e)},en.prototype.byte_offset=en.prototype.byte_offset=function(){var e=this.ptr;return Te(e)},en.prototype.unique_id=en.prototype.unique_id=function(){var e=this.ptr;return we(e)},en.prototype.__destroy__=en.prototype.__destroy__=function(){var e=this.ptr;Ce(e)},tn.prototype=Object.create(Wr.prototype),tn.prototype.constructor=tn,tn.prototype.__class__=tn,tn.__cache__={},c.AttributeQuantizationTransform=tn,tn.prototype.InitFromAttribute=tn.prototype.InitFromAttribute=function(e){var t=this.ptr;return e&&"object"==typeof e&&(e=e.ptr),!!Ie(t,e)},tn.prototype.quantization_bits=tn.prototype.quantization_bits=function(){var e=this.ptr;return Se(e)},tn.prototype.min_value=tn.prototype.min_value=function(e){var t=this.ptr;return e&&"object"==typeof e&&(e=e.ptr),Ne(t,e)},tn.prototype.range=tn.prototype.range=function(){var e=this.ptr;return Re(e)},tn.prototype.__destroy__=tn.prototype.__destroy__=function(){var e=this.ptr;Ee(e)},rn.prototype=Object.create(Wr.prototype),rn.prototype.constructor=rn,rn.prototype.__class__=rn,rn.__cache__={},c.AttributeOctahedronTransform=rn,rn.prototype.InitFromAttribute=rn.prototype.InitFromAttribute=function(e){var t=this.ptr;return e&&"object"==typeof e&&(e=e.ptr),!!Be(t,e)},rn.prototype.quantization_bits=rn.prototype.quantization_bits=function(){var e=this.ptr;return De(e)},rn.prototype.__destroy__=rn.prototype.__destroy__=function(){var e=this.ptr;Oe(e)},nn.prototype=Object.create(Wr.prototype),nn.prototype.constructor=nn,nn.prototype.__class__=nn,nn.__cache__={},c.PointCloud=nn,nn.prototype.num_attributes=nn.prototype.num_attributes=function(){var e=this.ptr;return Fe(e)},nn.prototype.num_points=nn.prototype.num_points=function(){var e=this.ptr;return Ge(e)},nn.prototype.__destroy__=nn.prototype.__destroy__=function(){var e=this.ptr;Ue(e)},on.prototype=Object.create(Wr.prototype),on.prototype.constructor=on,on.prototype.__class__=on,on.__cache__={},c.Mesh=on,on.prototype.num_faces=on.prototype.num_faces=function(){var e=this.ptr;return Le(e)},on.prototype.num_attributes=on.prototype.num_attributes=function(){var e=this.ptr;return je(e)},on.prototype.num_points=on.prototype.num_points=function(){var e=this.ptr;return We(e)},on.prototype.__destroy__=on.prototype.__destroy__=function(){var e=this.ptr;Ze(e)},an.prototype=Object.create(Wr.prototype),an.prototype.constructor=an,an.prototype.__class__=an,an.__cache__={},c.Metadata=an,an.prototype.__destroy__=an.prototype.__destroy__=function(){var e=this.ptr;Ye(e)},sn.prototype=Object.create(Wr.prototype),sn.prototype.constructor=sn,sn.prototype.__class__=sn,sn.__cache__={},c.Status=sn,sn.prototype.code=sn.prototype.code=function(){var e=this.ptr;return qe(e)},sn.prototype.ok=sn.prototype.ok=function(){var e=this.ptr;return!!Qe(e)},sn.prototype.error_msg=sn.prototype.error_msg=function(){var e=this.ptr;return B(Xe(e))},sn.prototype.__destroy__=sn.prototype.__destroy__=function(){var e=this.ptr;Je(e)},cn.prototype=Object.create(Wr.prototype),cn.prototype.constructor=cn,cn.prototype.__class__=cn,cn.__cache__={},c.DracoFloat32Array=cn,cn.prototype.GetValue=cn.prototype.GetValue=function(e){var t=this.ptr;return e&&"object"==typeof e&&(e=e.ptr),$e(t,e)},cn.prototype.size=cn.prototype.size=function(){var e=this.ptr;return et(e)},cn.prototype.__destroy__=cn.prototype.__destroy__=function(){var e=this.ptr;tt(e)},ln.prototype=Object.create(Wr.prototype),ln.prototype.constructor=ln,ln.prototype.__class__=ln,ln.__cache__={},c.DracoInt8Array=ln,ln.prototype.GetValue=ln.prototype.GetValue=function(e){var t=this.ptr;return e&&"object"==typeof e&&(e=e.ptr),nt(t,e)},ln.prototype.size=ln.prototype.size=function(){var e=this.ptr;return it(e)},ln.prototype.__destroy__=ln.prototype.__destroy__=function(){var e=this.ptr;ot(e)},dn.prototype=Object.create(Wr.prototype),dn.prototype.constructor=dn,dn.prototype.__class__=dn,dn.__cache__={},c.DracoUInt8Array=dn,dn.prototype.GetValue=dn.prototype.GetValue=function(e){var t=this.ptr;return e&&"object"==typeof e&&(e=e.ptr),st(t,e)},dn.prototype.size=dn.prototype.size=function(){var e=this.ptr;return ct(e)},dn.prototype.__destroy__=dn.prototype.__destroy__=function(){var e=this.ptr;lt(e)},fn.prototype=Object.create(Wr.prototype),fn.prototype.constructor=fn,fn.prototype.__class__=fn,fn.__cache__={},c.DracoInt16Array=fn,fn.prototype.GetValue=fn.prototype.GetValue=function(e){var t=this.ptr;return e&&"object"==typeof e&&(e=e.ptr),ft(t,e)},fn.prototype.size=fn.prototype.size=function(){var e=this.ptr;return ut(e)},fn.prototype.__destroy__=fn.prototype.__destroy__=function(){var e=this.ptr;pt(e)},un.prototype=Object.create(Wr.prototype),un.prototype.constructor=un,un.prototype.__class__=un,un.__cache__={},c.DracoUInt16Array=un,un.prototype.GetValue=un.prototype.GetValue=function(e){var t=this.ptr;return e&&"object"==typeof e&&(e=e.ptr),ht(t,e)},un.prototype.size=un.prototype.size=function(){var e=this.ptr;return bt(e)},un.prototype.__destroy__=un.prototype.__destroy__=function(){var e=this.ptr;vt(e)},pn.prototype=Object.create(Wr.prototype),pn.prototype.constructor=pn,pn.prototype.__class__=pn,pn.__cache__={},c.DracoInt32Array=pn,pn.prototype.GetValue=pn.prototype.GetValue=function(e){var t=this.ptr;return e&&"object"==typeof e&&(e=e.ptr),At(t,e)},pn.prototype.size=pn.prototype.size=function(){var e=this.ptr;return _t(e)},pn.prototype.__destroy__=pn.prototype.__destroy__=function(){var e=this.ptr;xt(e)},mn.prototype=Object.create(Wr.prototype),mn.prototype.constructor=mn,mn.prototype.__class__=mn,mn.__cache__={},c.DracoUInt32Array=mn,mn.prototype.GetValue=mn.prototype.GetValue=function(e){var t=this.ptr;return e&&"object"==typeof e&&(e=e.ptr),kt(t,e)},mn.prototype.size=mn.prototype.size=function(){var e=this.ptr;return Tt(e)},mn.prototype.__destroy__=mn.prototype.__destroy__=function(){var e=this.ptr;wt(e)},hn.prototype=Object.create(Wr.prototype),hn.prototype.constructor=hn,hn.prototype.__class__=hn,hn.__cache__={},c.MetadataQuerier=hn,hn.prototype.HasEntry=hn.prototype.HasEntry=function(e,t){var r=this.ptr;return Yr.prepare(),e&&"object"==typeof e&&(e=e.ptr),t=t&&"object"==typeof t?t.ptr:qr(t),!!Mt(r,e,t)},hn.prototype.GetIntEntry=hn.prototype.GetIntEntry=function(e,t){var r=this.ptr;return Yr.prepare(),e&&"object"==typeof e&&(e=e.ptr),t=t&&"object"==typeof t?t.ptr:qr(t),It(r,e,t)},hn.prototype.GetIntEntryArray=hn.prototype.GetIntEntryArray=function(e,t,r){var n=this.ptr;Yr.prepare(),e&&"object"==typeof e&&(e=e.ptr),t=t&&"object"==typeof t?t.ptr:qr(t),r&&"object"==typeof r&&(r=r.ptr),St(n,e,t,r)},hn.prototype.GetDoubleEntry=hn.prototype.GetDoubleEntry=function(e,t){var r=this.ptr;return Yr.prepare(),e&&"object"==typeof e&&(e=e.ptr),t=t&&"object"==typeof t?t.ptr:qr(t),Nt(r,e,t)},hn.prototype.GetStringEntry=hn.prototype.GetStringEntry=function(e,t){var r=this.ptr;return Yr.prepare(),e&&"object"==typeof e&&(e=e.ptr),t=t&&"object"==typeof t?t.ptr:qr(t),B(Rt(r,e,t))},hn.prototype.NumEntries=hn.prototype.NumEntries=function(e){var t=this.ptr;return e&&"object"==typeof e&&(e=e.ptr),Et(t,e)},hn.prototype.GetEntryName=hn.prototype.GetEntryName=function(e,t){var r=this.ptr;return e&&"object"==typeof e&&(e=e.ptr),t&&"object"==typeof t&&(t=t.ptr),B(Pt(r,e,t))},hn.prototype.__destroy__=hn.prototype.__destroy__=function(){var e=this.ptr;Bt(e)},bn.prototype=Object.create(Wr.prototype),bn.prototype.constructor=bn,bn.prototype.__class__=bn,bn.__cache__={},c.Decoder=bn,bn.prototype.DecodeArrayToPointCloud=bn.prototype.DecodeArrayToPointCloud=function(e,t,r){var n=this.ptr;return Yr.prepare(),"object"==typeof e&&(e=Qr(e)),t&&"object"==typeof t&&(t=t.ptr),r&&"object"==typeof r&&(r=r.ptr),Hr(Ot(n,e,t,r),sn)},bn.prototype.DecodeArrayToMesh=bn.prototype.DecodeArrayToMesh=function(e,t,r){var n=this.ptr;return Yr.prepare(),"object"==typeof e&&(e=Qr(e)),t&&"object"==typeof t&&(t=t.ptr),r&&"object"==typeof r&&(r=r.ptr),Hr(zt(n,e,t,r),sn)},bn.prototype.GetAttributeId=bn.prototype.GetAttributeId=function(e,t){var r=this.ptr;return e&&"object"==typeof e&&(e=e.ptr),t&&"object"==typeof t&&(t=t.ptr),Ft(r,e,t)},bn.prototype.GetAttributeIdByName=bn.prototype.GetAttributeIdByName=function(e,t){var r=this.ptr;return Yr.prepare(),e&&"object"==typeof e&&(e=e.ptr),t=t&&"object"==typeof t?t.ptr:qr(t),Gt(r,e,t)},bn.prototype.GetAttributeIdByMetadataEntry=bn.prototype.GetAttributeIdByMetadataEntry=function(e,t,r){var n=this.ptr;return Yr.prepare(),e&&"object"==typeof e&&(e=e.ptr),t=t&&"object"==typeof t?t.ptr:qr(t),r=r&&"object"==typeof r?r.ptr:qr(r),Ut(n,e,t,r)},bn.prototype.GetAttribute=bn.prototype.GetAttribute=function(e,t){var r=this.ptr;return e&&"object"==typeof e&&(e=e.ptr),t&&"object"==typeof t&&(t=t.ptr),Hr(Vt(r,e,t),en)},bn.prototype.GetAttributeByUniqueId=bn.prototype.GetAttributeByUniqueId=function(e,t){var r=this.ptr;return e&&"object"==typeof e&&(e=e.ptr),t&&"object"==typeof t&&(t=t.ptr),Hr(Lt(r,e,t),en)},bn.prototype.GetMetadata=bn.prototype.GetMetadata=function(e){var t=this.ptr;return e&&"object"==typeof e&&(e=e.ptr),Hr(jt(t,e),an)},bn.prototype.GetAttributeMetadata=bn.prototype.GetAttributeMetadata=function(e,t){var r=this.ptr;return e&&"object"==typeof e&&(e=e.ptr),t&&"object"==typeof t&&(t=t.ptr),Hr(Wt(r,e,t),an)},bn.prototype.GetFaceFromMesh=bn.prototype.GetFaceFromMesh=function(e,t,r){var n=this.ptr;return e&&"object"==typeof e&&(e=e.ptr),t&&"object"==typeof t&&(t=t.ptr),r&&"object"==typeof r&&(r=r.ptr),!!Zt(n,e,t,r)},bn.prototype.GetTriangleStripsFromMesh=bn.prototype.GetTriangleStripsFromMesh=function(e,t){var r=this.ptr;return e&&"object"==typeof e&&(e=e.ptr),t&&"object"==typeof t&&(t=t.ptr),Ht(r,e,t)},bn.prototype.GetTrianglesUInt16Array=bn.prototype.GetTrianglesUInt16Array=function(e,t,r){var n=this.ptr;return e&&"object"==typeof e&&(e=e.ptr),t&&"object"==typeof t&&(t=t.ptr),r&&"object"==typeof r&&(r=r.ptr),!!Yt(n,e,t,r)},bn.prototype.GetTrianglesUInt32Array=bn.prototype.GetTrianglesUInt32Array=function(e,t,r){var n=this.ptr;return e&&"object"==typeof e&&(e=e.ptr),t&&"object"==typeof t&&(t=t.ptr),r&&"object"==typeof r&&(r=r.ptr),!!qt(n,e,t,r)},bn.prototype.GetAttributeFloat=bn.prototype.GetAttributeFloat=function(e,t,r){var n=this.ptr;return e&&"object"==typeof e&&(e=e.ptr),t&&"object"==typeof t&&(t=t.ptr),r&&"object"==typeof r&&(r=r.ptr),!!Qt(n,e,t,r)},bn.prototype.GetAttributeFloatForAllPoints=bn.prototype.GetAttributeFloatForAllPoints=function(e,t,r){var n=this.ptr;return e&&"object"==typeof e&&(e=e.ptr),t&&"object"==typeof t&&(t=t.ptr),r&&"object"==typeof r&&(r=r.ptr),!!Xt(n,e,t,r)},bn.prototype.GetAttributeIntForAllPoints=bn.prototype.GetAttributeIntForAllPoints=function(e,t,r){var n=this.ptr;return e&&"object"==typeof e&&(e=e.ptr),t&&"object"==typeof t&&(t=t.ptr),r&&"object"==typeof r&&(r=r.ptr),!!Jt(n,e,t,r)},bn.prototype.GetAttributeInt8ForAllPoints=bn.prototype.GetAttributeInt8ForAllPoints=function(e,t,r){var n=this.ptr;return e&&"object"==typeof e&&(e=e.ptr),t&&"object"==typeof t&&(t=t.ptr),r&&"object"==typeof r&&(r=r.ptr),!!Kt(n,e,t,r)},bn.prototype.GetAttributeUInt8ForAllPoints=bn.prototype.GetAttributeUInt8ForAllPoints=function(e,t,r){var n=this.ptr;return e&&"object"==typeof e&&(e=e.ptr),t&&"object"==typeof t&&(t=t.ptr),r&&"object"==typeof r&&(r=r.ptr),!!$t(n,e,t,r)},bn.prototype.GetAttributeInt16ForAllPoints=bn.prototype.GetAttributeInt16ForAllPoints=function(e,t,r){var n=this.ptr;return e&&"object"==typeof e&&(e=e.ptr),t&&"object"==typeof t&&(t=t.ptr),r&&"object"==typeof r&&(r=r.ptr),!!er(n,e,t,r)},bn.prototype.GetAttributeUInt16ForAllPoints=bn.prototype.GetAttributeUInt16ForAllPoints=function(e,t,r){var n=this.ptr;return e&&"object"==typeof e&&(e=e.ptr),t&&"object"==typeof t&&(t=t.ptr),r&&"object"==typeof r&&(r=r.ptr),!!tr(n,e,t,r)},bn.prototype.GetAttributeInt32ForAllPoints=bn.prototype.GetAttributeInt32ForAllPoints=function(e,t,r){var n=this.ptr;return e&&"object"==typeof e&&(e=e.ptr),t&&"object"==typeof t&&(t=t.ptr),r&&"object"==typeof r&&(r=r.ptr),!!rr(n,e,t,r)},bn.prototype.GetAttributeUInt32ForAllPoints=bn.prototype.GetAttributeUInt32ForAllPoints=function(e,t,r){var n=this.ptr;return e&&"object"==typeof e&&(e=e.ptr),t&&"object"==typeof t&&(t=t.ptr),r&&"object"==typeof r&&(r=r.ptr),!!nr(n,e,t,r)},bn.prototype.GetAttributeDataArrayForAllPoints=bn.prototype.GetAttributeDataArrayForAllPoints=function(e,t,r,n,i){var o=this.ptr;return e&&"object"==typeof e&&(e=e.ptr),t&&"object"==typeof t&&(t=t.ptr),r&&"object"==typeof r&&(r=r.ptr),n&&"object"==typeof n&&(n=n.ptr),i&&"object"==typeof i&&(i=i.ptr),!!ir(o,e,t,r,n,i)},bn.prototype.SkipAttributeTransform=bn.prototype.SkipAttributeTransform=function(e){var t=this.ptr;e&&"object"==typeof e&&(e=e.ptr),or(t,e)},bn.prototype.GetEncodedGeometryType_Deprecated=bn.prototype.GetEncodedGeometryType_Deprecated=function(e){var t=this.ptr;return e&&"object"==typeof e&&(e=e.ptr),ar(t,e)},bn.prototype.DecodeBufferToPointCloud=bn.prototype.DecodeBufferToPointCloud=function(e,t){var r=this.ptr;return e&&"object"==typeof e&&(e=e.ptr),t&&"object"==typeof t&&(t=t.ptr),Hr(sr(r,e,t),sn)},bn.prototype.DecodeBufferToMesh=bn.prototype.DecodeBufferToMesh=function(e,t){var r=this.ptr;return e&&"object"==typeof e&&(e=e.ptr),t&&"object"==typeof t&&(t=t.ptr),Hr(cr(r,e,t),sn)},bn.prototype.__destroy__=bn.prototype.__destroy__=function(){var e=this.ptr;lr(e)},function(){function e(){c.ATTRIBUTE_INVALID_TRANSFORM=dr(),c.ATTRIBUTE_NO_TRANSFORM=fr(),c.ATTRIBUTE_QUANTIZATION_TRANSFORM=ur(),c.ATTRIBUTE_OCTAHEDRON_TRANSFORM=pr(),c.INVALID=mr(),c.POSITION=hr(),c.NORMAL=br(),c.COLOR=vr(),c.TEX_COORD=gr(),c.GENERIC=Ar(),c.INVALID_GEOMETRY_TYPE=_r(),c.POINT_CLOUD=xr(),c.TRIANGULAR_MESH=yr(),c.DT_INVALID=kr(),c.DT_INT8=Tr(),c.DT_UINT8=wr(),c.DT_INT16=Cr(),c.DT_UINT16=Mr(),c.DT_INT32=Ir(),c.DT_UINT32=Sr(),c.DT_INT64=Nr(),c.DT_UINT64=Rr(),c.DT_FLOAT32=Er(),c.DT_FLOAT64=Pr(),c.DT_BOOL=Br(),c.DT_TYPES_COUNT=Dr(),c.OK=Or(),c.DRACO_ERROR=zr(),c.IO_ERROR=Fr(),c.INVALID_PARAMETER=Gr(),c.UNSUPPORTED_VERSION=Ur(),c.UNKNOWN_VERSION=Vr()}V?e():L(e)}(),"function"==typeof c.onModuleParsed&&c.onModuleParsed(),c.Decoder.prototype.GetEncodedGeometryType=function(e){if(e.__class__&&e.__class__===c.DecoderBuffer)return c.Decoder.prototype.GetEncodedGeometryType_Deprecated(e);if(e.byteLength<8)return c.INVALID_GEOMETRY_TYPE;switch(e[7]){case 0:return c.POINT_CLOUD;case 1:return c.TRIANGULAR_MESH;default:return c.INVALID_GEOMETRY_TYPE}},e.ready});e.exports=s}).call(this,"/index.js",r(22),"/",r(32).Buffer)},function(e,t,r){"use strict";r.r(t),t.default="precision highp float;\n#define GLSLIFY 1\n\nvec3 derivateNormal(vec3 v_viewPosition) {\n vec3 fdx = vec3(dFdx(v_viewPosition.x), dFdx(v_viewPosition.y), dFdx(v_viewPosition.z));\n vec3 fdy = vec3(dFdy(v_viewPosition.x), dFdy(v_viewPosition.y), dFdy(v_viewPosition.z));\n vec3 normal = normalize(cross(fdx, fdy));\n return normal;\n}\n\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\n/**\n * Packs the integer part of the number given to a RGB color.\n */\nvec3 packIntToColor(float number) {\n float r = floor(number / (255.0 * 255.0)) / 255.0;\n float g = mod(floor(number / 255.0), 255.0) / 255.0;\n float b = mod(number, 255.0) / 255.0;\n return vec3(r, g, b);\n}\n\nstruct GeometryTypeEnum {\n int Quad;\n int Primitive;\n int TriangleMesh;\n int InstancedMesh;\n};\n\nconst GeometryTypeEnum GeometryType = GeometryTypeEnum(1,2,3,4);\n\nconst int RenderTypeColor = 1;\nconst int RenderTypeNormal = 2;\nconst int RenderTypeTreeIndex = 3;\nconst int RenderTypePackColorAndNormal = 4;\nconst int RenderTypeDepth = 5;\nconst int RenderTypeEffects = 6;\nconst int RenderTypeGhost = 7;\nconst int RenderTypeLOD = 8;\nconst int RenderTypeDepthBufferOnly = 9;\nconst int RenderTypeGeometryType = 10;\n\n#include <packing>\n\nout vec4 outputColor;\n\nvec3 packNormalToRgb( const in vec3 normal ) {\n return normalize( normal ) * 0.5 + 0.5;\n}\n\nvoid updateFragmentColor(\n int renderMode, vec4 color, float treeIndex, \n vec3 normal, float depth, sampler2D matCapTexture, \n int geometryType) {\n if (renderMode == RenderTypeColor || renderMode == RenderTypeEffects) {\n vec3 hsv = rgb2hsv(color.rgb);\n hsv.z = min(0.5 * hsv.z + 0.5, 1.0);\n vec3 colorRGB = hsv2rgb(hsv);\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n vec4 albedo = vec4(colorRGB * (0.4 + 0.6 * amplitude), 1.0);\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec4 mc = vec4(texture(matCapTexture, cap).rgb, 1.0);\n \n outputColor = vec4(albedo.rgb * mc.rgb * 1.7, color.a);\n } else if (renderMode == RenderTypeGhost) {\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n float s = 0.4 + 0.6 * amplitude;\n outputColor = vec4(vec3(s), 0.3);\n } else if (renderMode == RenderTypeDepthBufferOnly) {\n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n } else if (renderMode == RenderTypePackColorAndNormal) {\n vec3 hsv = rgb2hsv(color.rgb);\n float a = 0.0;\n if (hsv.y > 0.01) {\n if (hsv.z > 0.5) {\n // light color\n a = (0.55 + hsv.x * 0.45);\n } else {\n // dark color\n a = (0.1 + hsv.x * 0.45);\n }\n } else {\n // no saturation - grayscale\n a = hsv.z * 0.09;\n }\n outputColor = vec4(packNormalToRgb(normal.rgb), a);\n } else if (renderMode == RenderTypeNormal) {\n outputColor = vec4(packNormalToRgb(normal), 1.0);\n } else if (renderMode == RenderTypeTreeIndex) {\n outputColor = vec4(packIntToColor(treeIndex), 1.0);\n } else if (renderMode == RenderTypeDepth) {\n outputColor = packDepthToRGBA(depth);\n } else if (renderMode == RenderTypeLOD) {\n bool isHighDetail = geometryType != GeometryType.Quad;\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture(matCapTexture, cap).rgb * 1.5;\n outputColor = isHighDetail ? vec4(vec3(0.0, 1.0, 0.0) * mc, color.a) : vec4(vec3(1.0, 1.0, 0.0) * mc, color.a);\n } else if (renderMode == RenderTypeGeometryType) {\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture(matCapTexture, cap).rgb * 1.5;\n vec3 geometryColor = \n float(geometryType == 1) * vec3(1.0, 0.0, 0.0) + // Quads\n float(geometryType == 2) * vec3(0.0, 1.0, 0.0) + // Primitives\n float(geometryType == 3) * vec3(0.0, 0.0, 1.0) + // Triangle meshes\n float(geometryType == 4) * vec3(1.0, 1.0, 0.0); // Instance meshes\n outputColor = vec4(geometryColor * mc, color.a);\n } else {\n // Unknown render mode - should not happen. \n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n }\n}\n\nstruct NodeAppearance {\n vec4 colorTexel;\n bool isVisible;\n bool renderInFront;\n bool renderGhosted;\n};\n\nfloat floatBitsSubset(float inNumber, int fromLeastSignificantBitIndex, int toMostSignificantBitIndex) {\n float r = float(fromLeastSignificantBitIndex);\n float l = float(toMostSignificantBitIndex);\n\n float bitShift = pow(2.0, r);\n return mod(((inNumber - mod(inNumber, bitShift)) / bitShift), pow(2.0, l - r));\n}\n\n/*\n\nExample:\n\nGet the value from bit 2 to 4 (not inclusive)\n\ninput:\ninNumber = 173 = 1010_1101 , from=2, to=4\n\nexpected output = 1010_|11|01 = 3\n\n1) subtract any bits in the least significant bit-subset\n\n mod(inNumber=173, pow(2.0, from=2)) = mod(inNumber, 4) = 1\n \n inNumber - 1 = 172\n\n2) bitshift such that we remove the least significant bit-subset\n this is guaranteed to be devisible since we subtracted the remainder\n\n (inNumber=172) / pow(2.0, from=2) = 172 / 4 = 43 = 0010_1011\n\n3) lastly, remove the most significant bit-subset\n\n mod((inNumber=43), pow(2.0, to=4 - from=2) = mod(43, 4)\n\n mod(43, 4) = 3\n\n or in binary notation: 0000_0011 which is the expected result.\n\n*/ \n\nNodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture, vec2 textureSize, float treeIndex) {\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = textureSize.x;\n float dataTextureHeight = textureSize.y;\n\n float u = mod(treeIndex, dataTextureWidth);\n float v = floor(treeIndex / dataTextureWidth);\n float uCoord = (u + 0.5) / dataTextureWidth;\n float vCoord = (v + 0.5) / dataTextureHeight;\n vec2 treeIndexUv = vec2(uCoord, vCoord);\n \n vec4 texel = texture(nodeAppearanceTexture, treeIndexUv);\n float alphaUnwrapped = floor((texel.a * 255.0) + 0.5);\n\n bool isVisible = floatBitsSubset(alphaUnwrapped, 0, 1) == 1.0;\n bool renderInFront = floatBitsSubset(alphaUnwrapped, 1, 2) == 1.0;\n bool renderGhosted = floatBitsSubset(alphaUnwrapped, 2, 3) == 1.0;\n\n return NodeAppearance(texel, isVisible, renderInFront, renderGhosted);\n}\n\nbool determineVisibility(NodeAppearance nodeAppearance, int renderMode) {\n return \n // In ghost mode\n ((renderMode == RenderTypeGhost) && nodeAppearance.isVisible && nodeAppearance.renderGhosted) ||\n // Not ghost mode\n ((renderMode != RenderTypeGhost) && \n !nodeAppearance.renderGhosted && nodeAppearance.isVisible && (nodeAppearance.renderInFront || renderMode != RenderTypeEffects));\n}\n\nvec4 determineColor(vec3 originalColor, NodeAppearance nodeAppearance) {\n vec4 overrideColor = nodeAppearance.colorTexel;\n if (any(greaterThan(overrideColor.rgb, vec3(0.0)))) {\n return overrideColor;\n }\n return vec4(originalColor.rgb, overrideColor.a);\n}\n\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\n\nbool isClipped(NodeAppearance nodeAppearance, vec3 point) {\n#if NUM_CLIPPING_PLANES > 0\n vec3 pointFlipped = -point;\n vec4 plane;\n\n for (int i = 0; i < UNION_CLIPPING_PLANES; i++) {\n plane = clippingPlanes[i];\n if (dot(pointFlipped, plane.xyz) > plane.w) return true;\n }\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n bool clipped = true;\n for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n clipped = (dot(pointFlipped, plane.xyz) > plane.w) && clipped;\n }\n if ( clipped ) return true;\n#endif\n#endif\n return false;\n}\n\nuniform sampler2D colorDataTexture;\nuniform sampler2D matCapTexture;\nuniform vec2 treeIndexTextureSize;\nuniform int renderMode;\n\nin float v_treeIndex;\nin vec3 v_color;\nin vec3 v_viewPosition;\n\nvoid main() {\n NodeAppearance appearance = determineNodeAppearance(colorDataTexture, treeIndexTextureSize, v_treeIndex);\n if (!determineVisibility(appearance, renderMode)) {\n discard;\n }\n\n if (isClipped(appearance, v_viewPosition)) {\n discard;\n }\n\n vec4 color = determineColor(v_color, appearance);\n vec3 normal = derivateNormal(v_viewPosition);\n updateFragmentColor(renderMode, color, v_treeIndex, normal, gl_FragCoord.z, matCapTexture, GeometryType.InstancedMesh);\n}\n"},function(e,t,r){"use strict";r.r(t),t.default="#define GLSLIFY 1\n// https://stackoverflow.com/questions/7059962/how-do-i-convert-a-vec4-rgba-value-to-a-float @ Arjan\nfloat unpackVec4ToFloat( vec4 packedFloat)\n{\n vec4 rgba = packedFloat;\n float sign = 1.0 - step(128.0, rgba.x) * 2.0;\n float exponent = 2.0 * mod(rgba.x, 128.0) + step(128.0, rgba.y) - 127.0;\n if (exponent == -127.0) return 0.0;\n float mantissa = mod(rgba.y, 128.0) * 65536.0 + rgba.z * 256.0 + rgba.w + 8388608.0;\n return sign * exp2(exponent - 23.0) * mantissa; \n}\n\nfloat unpackFloatFromRGBATexel(vec4 texel){\n float byteValueR = floor((texel.r * 255.0) + 0.5);\n float byteValueG = floor((texel.g * 255.0) + 0.5);\n float byteValueB = floor((texel.b * 255.0) + 0.5);\n float byteValueA = floor((texel.a * 255.0) + 0.5);\n\n return unpackVec4ToFloat(vec4(byteValueR, byteValueG, byteValueB, byteValueA));\n}\n\nmat4 determineMatrixOverride(\n float treeIndex, \n vec2 treeIndexTextureSize, \n sampler2D transformOverrideIndexTexture, \n vec2 transformOverrideTextureSize, \n sampler2D transformOverrideTexture\n) {\n\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = treeIndexTextureSize.x;\n float dataTextureHeight = treeIndexTextureSize.y;\n\n float xTreeIndexTextureCoord = mod(treeIndex, dataTextureWidth);\n float yTreeIndexTextureCoord = floor(treeIndex / dataTextureWidth);\n\n vec2 indexUV = vec2((xTreeIndexTextureCoord + 0.5) / dataTextureWidth, (yTreeIndexTextureCoord + 0.5) / dataTextureHeight);\n\n vec3 indexTexel = texture(transformOverrideIndexTexture, indexUV).rgb;\n\n float index = floor(indexTexel.r * 256.0) * 65536.0 + floor(indexTexel.g * 256.0) * 256.0 + floor(indexTexel.b * 256.0);\n \n \n if(index == 0.0){\n return mat4(\n 1.0, 0.0, 0.0, 0.0,\n 0.0, 1.0, 0.0, 0.0,\n 0.0, 0.0, 1.0, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n }\n\n index = index - 1.0;\n float overridesPerRow = transformOverrideTextureSize.x / 16.0;\n\n float xOverrideTextureCoord = mod(index, overridesPerRow);\n float yOverrideTextureCoord = floor(index / overridesPerRow);\n\n float cellWidth = 1.0 / transformOverrideTextureSize.x;\n float cellHeight = 1.0 / transformOverrideTextureSize.y;\n\n float overrideU = (xOverrideTextureCoord / overridesPerRow) + cellWidth / 2.0;\n float overrideV = (yOverrideTextureCoord / transformOverrideTextureSize.y) + cellHeight / 2.0;\n\n vec2 overrideUV = vec2(overrideU, overrideV); \n\n float matrixElements[12];\n\n for(int i = 0; i < 12; i++){\n matrixElements[i] = unpackFloatFromRGBATexel(texture(transformOverrideTexture, overrideUV + vec2(float(i) * cellWidth, 0.0)));\n }\n \n return mat4(\n matrixElements[0], matrixElements[4], matrixElements[8], 0,\n matrixElements[1], matrixElements[5], matrixElements[9], 0,\n matrixElements[2], matrixElements[6], matrixElements[10], 0,\n matrixElements[3], matrixElements[7], matrixElements[11], 1\n );\n}\n\nuniform mat4 modelMatrix;\nuniform mat4 viewMatrix;\nuniform mat4 projectionMatrix;\nuniform vec2 treeIndexTextureSize;\nuniform vec2 transformOverrideTextureSize;\nuniform sampler2D transformOverrideIndexTexture;\nuniform sampler2D transformOverrideTexture;\n\nin vec3 position;\nin mat4 a_instanceMatrix;\nin float a_treeIndex;\nin vec3 a_color;\n\nout float v_treeIndex;\nout vec3 v_color;\nout vec3 v_viewPosition;\n\nvoid main()\n{\n mat4 treeIndexWorldTransform = determineMatrixOverride(\n a_treeIndex, \n treeIndexTextureSize, \n transformOverrideIndexTexture, \n transformOverrideTextureSize, \n transformOverrideTexture\n );\n\n v_color = a_color;\n\n vec3 transformed = (a_instanceMatrix * vec4(position, 1.0)).xyz;\n vec4 modelViewPosition = viewMatrix * modelMatrix * vec4(transformed, 1.0);\n v_viewPosition = modelViewPosition.xyz;\n v_treeIndex = a_treeIndex;\n gl_Position = projectionMatrix * modelViewPosition;\n}\n"},function(e,t,r){"use strict";(function(e){
|
|
205
|
+
/*!
|
|
206
|
+
* The buffer module from node.js, for the browser.
|
|
207
|
+
*
|
|
208
|
+
* @author Feross Aboukhadijeh <http://feross.org>
|
|
209
|
+
* @license MIT
|
|
186
210
|
*/
|
|
187
|
-
class o{constructor(e){this._clippingPlanes=[new r.Plane,new r.Plane,new r.Plane,new r.Plane,new r.Plane,new r.Plane],this._box=e||new r.Box3,this.updatePlanes()}set minX(e){this._box.min.x=e,this.updatePlanes()}get minX(){return this._box.min.x}set minY(e){this._box.min.y=e,this.updatePlanes()}get minY(){return this._box.min.y}set minZ(e){this._box.min.z=e,this.updatePlanes()}get minZ(){return this._box.min.z}set maxX(e){this._box.max.x=e,this.updatePlanes()}get maxX(){return this._box.max.x}set maxY(e){this._box.max.y=e,this.updatePlanes()}get maxY(){return this._box.max.y}set maxZ(e){this._box.max.z=e,this.updatePlanes()}get maxZ(){return this._box.max.z}updatePlanes(){this._clippingPlanes[0].setFromNormalAndCoplanarPoint(new r.Vector3(1,0,0),new r.Vector3(this.minX,0,0)),this._clippingPlanes[1].setFromNormalAndCoplanarPoint(new r.Vector3(-1,0,0),new r.Vector3(this.maxX,0,0)),this._clippingPlanes[2].setFromNormalAndCoplanarPoint(new r.Vector3(0,1,0),new r.Vector3(0,this.minY,0)),this._clippingPlanes[3].setFromNormalAndCoplanarPoint(new r.Vector3(0,-1,0),new r.Vector3(0,this.maxY,0)),this._clippingPlanes[4].setFromNormalAndCoplanarPoint(new r.Vector3(0,0,1),new r.Vector3(0,0,this.minZ)),this._clippingPlanes[5].setFromNormalAndCoplanarPoint(new r.Vector3(0,0,-1),new r.Vector3(0,0,this.maxZ))}get clippingPlanes(){return this._clippingPlanes}}},,function(e,t){e.exports=require("comlink")},function(e,t){e.exports=require("loglevel")},function(e,t){e.exports=require("skmeans")},function(e,t,n){"use strict";n.r(t),t.default="#define GLSLIFY 1\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\n/**\n * Packs the integer part of the number given to a RGB color.\n */\nvec3 packIntToColor(float number) {\n float r = floor(number / (255.0 * 255.0)) / 255.0;\n float g = mod(floor(number / 255.0), 255.0) / 255.0;\n float b = mod(number, 255.0) / 255.0;\n return vec3(r, g, b);\n}\n\nstruct GeometryTypeEnum {\n int Quad;\n int Primitive;\n int TriangleMesh;\n int InstancedMesh;\n};\n\nconst GeometryTypeEnum GeometryType = GeometryTypeEnum(1,2,3,4);\n\nconst int RenderTypeColor_0 = 1;\nconst int RenderTypeNormal_0 = 2;\nconst int RenderTypeTreeIndex_0 = 3;\nconst int RenderTypePackColorAndNormal_0 = 4;\nconst int RenderTypeDepth_0 = 5;\nconst int RenderTypeEffects_0 = 6;\nconst int RenderTypeGhost_0 = 7;\nconst int RenderTypeLOD = 8;\nconst int RenderTypeDepthBufferOnly = 9;\nconst int RenderTypeGeometryType = 10;\n\n#include <packing>\n\nout vec4 outputColor;\n\nvec3 packNormalToRgb( const in vec3 normal ) {\n return normalize( normal ) * 0.5 + 0.5;\n}\n\nvoid updateFragmentColor(\n int renderMode, vec4 color, float treeIndex, \n vec3 normal, float depth, sampler2D matCapTexture, \n int geometryType) {\n if (renderMode == RenderTypeColor_0 || renderMode == RenderTypeEffects_0) {\n vec3 hsv = rgb2hsv(color.rgb);\n hsv.z = min(0.5 * hsv.z + 0.5, 1.0);\n vec3 colorRGB = hsv2rgb(hsv);\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n vec4 albedo = vec4(colorRGB * (0.4 + 0.6 * amplitude), 1.0);\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec4 mc = vec4(texture2D(matCapTexture, cap).rgb, 1.0);\n \n outputColor = vec4(albedo.rgb * mc.rgb * 1.7, color.a);\n } else if (renderMode == RenderTypeGhost_0) {\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n float s = 0.4 + 0.6 * amplitude;\n outputColor = vec4(vec3(s), 0.3);\n } else if (renderMode == RenderTypeDepthBufferOnly) {\n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n } else if (renderMode == RenderTypePackColorAndNormal_0) {\n vec3 hsv = rgb2hsv(color.rgb);\n float a = 0.0;\n if (hsv.y > 0.01) {\n if (hsv.z > 0.5) {\n // light color\n a = (0.55 + hsv.x * 0.45);\n } else {\n // dark color\n a = (0.1 + hsv.x * 0.45);\n }\n } else {\n // no saturation - grayscale\n a = hsv.z * 0.09;\n }\n outputColor = vec4(packNormalToRgb(normal.rgb), a);\n } else if (renderMode == RenderTypeNormal_0) {\n outputColor = vec4(packNormalToRgb(normal), 1.0);\n } else if (renderMode == RenderTypeTreeIndex_0) {\n outputColor = vec4(packIntToColor(treeIndex), 1.0);\n } else if (renderMode == RenderTypeDepth_0) {\n outputColor = packDepthToRGBA(depth);\n } else if (renderMode == RenderTypeLOD) {\n bool isHighDetail = geometryType != GeometryType.Quad;\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture2D(matCapTexture, cap).rgb * 1.5;\n outputColor = isHighDetail ? vec4(vec3(0.0, 1.0, 0.0) * mc, color.a) : vec4(vec3(1.0, 1.0, 0.0) * mc, color.a);\n } else if (renderMode == RenderTypeGeometryType) {\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture2D(matCapTexture, cap).rgb * 1.5;\n vec3 geometryColor = \n float(geometryType == 1) * vec3(1.0, 0.0, 0.0) + // Quads\n float(geometryType == 2) * vec3(0.0, 1.0, 0.0) + // Primitives\n float(geometryType == 3) * vec3(0.0, 0.0, 1.0) + // Triangle meshes\n float(geometryType == 4) * vec3(1.0, 1.0, 0.0); // Instance meshes\n outputColor = vec4(geometryColor * mc, color.a);\n } else {\n // Unknown render mode - should not happen. \n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n }\n}\n\nstruct NodeAppearance {\n vec4 colorTexel;\n bool isVisible;\n bool renderInFront;\n bool renderGhosted;\n};\n\nfloat floatBitsSubset(float inNumber, int fromLeastSignificantBitIndex, int toMostSignificantBitIndex) {\n float r = float(fromLeastSignificantBitIndex);\n float l = float(toMostSignificantBitIndex);\n\n float bitShift = pow(2.0, r);\n return mod(((inNumber - mod(inNumber, bitShift)) / bitShift), pow(2.0, l - r));\n}\n\n/*\n\nExample:\n\nGet the value from bit 2 to 4 (not inclusive)\n\ninput:\ninNumber = 173 = 1010_1101 , from=2, to=4\n\nexpected output = 1010_|11|01 = 3\n\n1) subtract any bits in the least significant bit-subset\n\n mod(inNumber=173, pow(2.0, from=2)) = mod(inNumber, 4) = 1\n \n inNumber - 1 = 172\n\n2) bitshift such that we remove the least significant bit-subset\n this is guaranteed to be devisible since we subtracted the remainder\n\n (inNumber=172) / pow(2.0, from=2) = 172 / 4 = 43 = 0010_1011\n\n3) lastly, remove the most significant bit-subset\n\n mod((inNumber=43), pow(2.0, to=4 - from=2) = mod(43, 4)\n\n mod(43, 4) = 3\n\n or in binary notation: 0000_0011 which is the expected result.\n\n*/ \n\nNodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture, vec2 textureSize, float treeIndex) {\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = textureSize.x;\n float dataTextureHeight = textureSize.y;\n\n float u = mod(treeIndex, dataTextureWidth);\n float v = floor(treeIndex / dataTextureWidth);\n float uCoord = (u + 0.5) / dataTextureWidth;\n float vCoord = (v + 0.5) / dataTextureHeight;\n vec2 treeIndexUv = vec2(uCoord, vCoord);\n \n vec4 texel = texture2D(nodeAppearanceTexture, treeIndexUv);\n float alphaUnwrapped = floor((texel.a * 255.0) + 0.5);\n\n bool isVisible = floatBitsSubset(alphaUnwrapped, 0, 1) == 1.0;\n bool renderInFront = floatBitsSubset(alphaUnwrapped, 1, 2) == 1.0;\n bool renderGhosted = floatBitsSubset(alphaUnwrapped, 2, 3) == 1.0;\n\n return NodeAppearance(texel, isVisible, renderInFront, renderGhosted);\n}\n\nconst int RenderTypeColor_1 = 1;\nconst int RenderTypeNormal_1 = 2;\nconst int RenderTypeTreeIndex_1 = 3;\nconst int RenderTypePackColorAndNormal_1 = 4;\nconst int RenderTypeDepth_1 = 5;\nconst int RenderTypeEffects_1 = 6;\nconst int RenderTypeGhost_1 = 7;\n\nbool determineVisibility(NodeAppearance nodeAppearance, int renderMode) {\n return \n // In ghost mode\n ((renderMode == RenderTypeGhost_1) && nodeAppearance.isVisible && nodeAppearance.renderGhosted) ||\n // Not ghost mode\n ((renderMode != RenderTypeGhost_1) && \n !nodeAppearance.renderGhosted && nodeAppearance.isVisible && (nodeAppearance.renderInFront || renderMode != RenderTypeEffects_1));\n}\n\nvec4 determineColor(vec3 originalColor, NodeAppearance nodeAppearance) {\n vec4 overrideColor = nodeAppearance.colorTexel;\n if (any(greaterThan(overrideColor.rgb, vec3(0.0)))) {\n return overrideColor;\n }\n return vec4(originalColor.rgb, overrideColor.a);\n}\n\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\n\nbool isClipped(NodeAppearance nodeAppearance, vec3 point) {\n#if NUM_CLIPPING_PLANES > 0\n vec3 pointFlipped = -point;\n vec4 plane;\n\n for (int i = 0; i < UNION_CLIPPING_PLANES; i++) {\n plane = clippingPlanes[i];\n if (dot(pointFlipped, plane.xyz) > plane.w) return true;\n }\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n bool clipped = true;\n for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n clipped = (dot(pointFlipped, plane.xyz) > plane.w) && clipped;\n }\n if ( clipped ) return true;\n#endif\n#endif\n return false;\n}\n\nin float v_treeIndex;\nin vec3 v_normal;\nin vec3 v_color;\n\nuniform sampler2D colorDataTexture;\nuniform sampler2D overrideVisibilityPerTreeIndex;\nuniform sampler2D matCapTexture;\n\nuniform vec2 treeIndexTextureSize;\n\nuniform int renderMode;\n\nin vec3 vViewPosition;\n\nvoid main() {\n NodeAppearance appearance = determineNodeAppearance(colorDataTexture, treeIndexTextureSize, v_treeIndex);\n if (!determineVisibility(appearance, renderMode)) {\n discard;\n }\n if (isClipped(appearance, vViewPosition)) {\n discard;\n }\n\n vec4 color = determineColor(v_color, appearance); \n vec3 normal = normalize(v_normal);\n updateFragmentColor(renderMode, color, v_treeIndex, normal, gl_FragCoord.z, matCapTexture, GeometryType.Primitive);\n}\n"},function(e,t,n){"use strict";n.r(t),t.default="#define GLSLIFY 1\n// https://stackoverflow.com/questions/7059962/how-do-i-convert-a-vec4-rgba-value-to-a-float @ Arjan\nfloat unpackVec4ToFloat( vec4 packedFloat)\n{\n vec4 rgba = packedFloat;\n float sign = 1.0 - step(128.0, rgba.x) * 2.0;\n float exponent = 2.0 * mod(rgba.x, 128.0) + step(128.0, rgba.y) - 127.0;\n if (exponent == -127.0) return 0.0;\n float mantissa = mod(rgba.y, 128.0) * 65536.0 + rgba.z * 256.0 + rgba.w + 8388608.0;\n return sign * exp2(exponent - 23.0) * mantissa; \n}\n\nfloat unpackFloatFromRGBATexel(vec4 texel){\n float byteValueR = floor((texel.r * 255.0) + 0.5);\n float byteValueG = floor((texel.g * 255.0) + 0.5);\n float byteValueB = floor((texel.b * 255.0) + 0.5);\n float byteValueA = floor((texel.a * 255.0) + 0.5);\n\n return unpackVec4ToFloat(vec4(byteValueR, byteValueG, byteValueB, byteValueA));\n}\n\nmat4 determineMatrixOverride(\n float treeIndex, \n vec2 treeIndexTextureSize, \n sampler2D transformOverrideIndexTexture, \n vec2 transformOverrideTextureSize, \n sampler2D transformOverrideTexture\n) {\n\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = treeIndexTextureSize.x;\n float dataTextureHeight = treeIndexTextureSize.y;\n\n float xTreeIndexTextureCoord = mod(treeIndex, dataTextureWidth);\n float yTreeIndexTextureCoord = floor(treeIndex / dataTextureWidth);\n\n vec2 indexUV = vec2((xTreeIndexTextureCoord + 0.5) / dataTextureWidth, (yTreeIndexTextureCoord + 0.5) / dataTextureHeight);\n\n vec3 indexTexel = texture2D(transformOverrideIndexTexture, indexUV).rgb;\n\n float index = floor(indexTexel.r * 256.0) * 65536.0 + floor(indexTexel.g * 256.0) * 256.0 + floor(indexTexel.b * 256.0);\n \n \n if(index == 0.0){\n return mat4(\n 1.0, 0.0, 0.0, 0.0,\n 0.0, 1.0, 0.0, 0.0,\n 0.0, 0.0, 1.0, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n }\n\n index = index - 1.0;\n float overridesPerRow = transformOverrideTextureSize.x / 16.0;\n\n float xOverrideTextureCoord = mod(index, overridesPerRow);\n float yOverrideTextureCoord = floor(index / overridesPerRow);\n\n float cellWidth = 1.0 / transformOverrideTextureSize.x;\n float cellHeight = 1.0 / transformOverrideTextureSize.y;\n\n float overrideU = (xOverrideTextureCoord / overridesPerRow) + cellWidth / 2.0;\n float overrideV = (yOverrideTextureCoord / transformOverrideTextureSize.y) + cellHeight / 2.0;\n\n vec2 overrideUV = vec2(overrideU, overrideV); \n\n float matrixElements[12];\n\n for(int i = 0; i < 12; i++){\n matrixElements[i] = unpackFloatFromRGBATexel(texture2D(transformOverrideTexture, overrideUV + vec2(float(i) * cellWidth, 0.0)));\n }\n \n return mat4(\n matrixElements[0], matrixElements[4], matrixElements[8], 0,\n matrixElements[1], matrixElements[5], matrixElements[9], 0,\n matrixElements[2], matrixElements[6], matrixElements[10], 0,\n matrixElements[3], matrixElements[7], matrixElements[11], 1\n );\n}\n\nuniform mat4 inverseModelMatrix;\n\nin mat4 a_instanceMatrix;\n\nin float a_treeIndex;\nin vec3 a_color;\n\nout float v_treeIndex;\nout vec3 v_normal;\nout vec3 v_color;\n\nout vec3 vViewPosition;\n\nuniform vec2 treeIndexTextureSize;\nuniform sampler2D transformOverrideIndexTexture;\n\nuniform vec2 transformOverrideTextureSize;\nuniform sampler2D transformOverrideTexture;\n\nvoid main()\n{\n mat4 treeIndexWorldTransform = determineMatrixOverride(\n a_treeIndex, \n treeIndexTextureSize, \n transformOverrideIndexTexture, \n transformOverrideTextureSize, \n transformOverrideTexture\n );\n\n v_treeIndex = a_treeIndex;\n v_color = a_color;\n v_normal = normalMatrix * normalize(inverseModelMatrix * treeIndexWorldTransform * modelMatrix * a_instanceMatrix * vec4(normalize(normal), 0.0)).xyz;\n //v_normal = normal;\n\n vec3 transformed = (a_instanceMatrix * vec4(position, 1.0)).xyz;\n vec4 modelViewPosition = viewMatrix * treeIndexWorldTransform * modelMatrix * vec4(transformed, 1.0);\n vViewPosition = modelViewPosition.xyz;\n gl_Position = projectionMatrix * modelViewPosition;\n}"},function(e,t){e.exports=require("@cognite/sdk")},function(e,t,n){"use strict";n.r(t),t.default="#define GLSLIFY 1\nout vec2 vUv;\n\nvoid main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n"},function(e,t){e.exports=require("lodash/omit")},function(e,t){e.exports=require("lodash/chunk")},function(e,t){e.exports=require("lodash/throttle")},,function(e,t,n){"use strict";n.r(t),t.default="#define GLSLIFY 1\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\n/**\n * Packs the integer part of the number given to a RGB color.\n */\nvec3 packIntToColor(float number) {\n float r = floor(number / (255.0 * 255.0)) / 255.0;\n float g = mod(floor(number / 255.0), 255.0) / 255.0;\n float b = mod(number, 255.0) / 255.0;\n return vec3(r, g, b);\n}\n\nstruct GeometryTypeEnum {\n int Quad;\n int Primitive;\n int TriangleMesh;\n int InstancedMesh;\n};\n\nconst GeometryTypeEnum GeometryType = GeometryTypeEnum(1,2,3,4);\n\nconst int RenderTypeColor_0 = 1;\nconst int RenderTypeNormal_0 = 2;\nconst int RenderTypeTreeIndex_0 = 3;\nconst int RenderTypePackColorAndNormal_0 = 4;\nconst int RenderTypeDepth_0 = 5;\nconst int RenderTypeEffects_0 = 6;\nconst int RenderTypeGhost_0 = 7;\nconst int RenderTypeLOD = 8;\nconst int RenderTypeDepthBufferOnly = 9;\nconst int RenderTypeGeometryType = 10;\n\n#include <packing>\n\nout vec4 outputColor;\n\nvec3 packNormalToRgb( const in vec3 normal ) {\n return normalize( normal ) * 0.5 + 0.5;\n}\n\nvoid updateFragmentColor(\n int renderMode, vec4 color, float treeIndex, \n vec3 normal, float depth, sampler2D matCapTexture, \n int geometryType) {\n if (renderMode == RenderTypeColor_0 || renderMode == RenderTypeEffects_0) {\n vec3 hsv = rgb2hsv(color.rgb);\n hsv.z = min(0.5 * hsv.z + 0.5, 1.0);\n vec3 colorRGB = hsv2rgb(hsv);\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n vec4 albedo = vec4(colorRGB * (0.4 + 0.6 * amplitude), 1.0);\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec4 mc = vec4(texture2D(matCapTexture, cap).rgb, 1.0);\n \n outputColor = vec4(albedo.rgb * mc.rgb * 1.7, color.a);\n } else if (renderMode == RenderTypeGhost_0) {\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n float s = 0.4 + 0.6 * amplitude;\n outputColor = vec4(vec3(s), 0.3);\n } else if (renderMode == RenderTypeDepthBufferOnly) {\n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n } else if (renderMode == RenderTypePackColorAndNormal_0) {\n vec3 hsv = rgb2hsv(color.rgb);\n float a = 0.0;\n if (hsv.y > 0.01) {\n if (hsv.z > 0.5) {\n // light color\n a = (0.55 + hsv.x * 0.45);\n } else {\n // dark color\n a = (0.1 + hsv.x * 0.45);\n }\n } else {\n // no saturation - grayscale\n a = hsv.z * 0.09;\n }\n outputColor = vec4(packNormalToRgb(normal.rgb), a);\n } else if (renderMode == RenderTypeNormal_0) {\n outputColor = vec4(packNormalToRgb(normal), 1.0);\n } else if (renderMode == RenderTypeTreeIndex_0) {\n outputColor = vec4(packIntToColor(treeIndex), 1.0);\n } else if (renderMode == RenderTypeDepth_0) {\n outputColor = packDepthToRGBA(depth);\n } else if (renderMode == RenderTypeLOD) {\n bool isHighDetail = geometryType != GeometryType.Quad;\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture2D(matCapTexture, cap).rgb * 1.5;\n outputColor = isHighDetail ? vec4(vec3(0.0, 1.0, 0.0) * mc, color.a) : vec4(vec3(1.0, 1.0, 0.0) * mc, color.a);\n } else if (renderMode == RenderTypeGeometryType) {\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture2D(matCapTexture, cap).rgb * 1.5;\n vec3 geometryColor = \n float(geometryType == 1) * vec3(1.0, 0.0, 0.0) + // Quads\n float(geometryType == 2) * vec3(0.0, 1.0, 0.0) + // Primitives\n float(geometryType == 3) * vec3(0.0, 0.0, 1.0) + // Triangle meshes\n float(geometryType == 4) * vec3(1.0, 1.0, 0.0); // Instance meshes\n outputColor = vec4(geometryColor * mc, color.a);\n } else {\n // Unknown render mode - should not happen. \n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n }\n}\n\nstruct NodeAppearance {\n vec4 colorTexel;\n bool isVisible;\n bool renderInFront;\n bool renderGhosted;\n};\n\nfloat floatBitsSubset(float inNumber, int fromLeastSignificantBitIndex, int toMostSignificantBitIndex) {\n float r = float(fromLeastSignificantBitIndex);\n float l = float(toMostSignificantBitIndex);\n\n float bitShift = pow(2.0, r);\n return mod(((inNumber - mod(inNumber, bitShift)) / bitShift), pow(2.0, l - r));\n}\n\n/*\n\nExample:\n\nGet the value from bit 2 to 4 (not inclusive)\n\ninput:\ninNumber = 173 = 1010_1101 , from=2, to=4\n\nexpected output = 1010_|11|01 = 3\n\n1) subtract any bits in the least significant bit-subset\n\n mod(inNumber=173, pow(2.0, from=2)) = mod(inNumber, 4) = 1\n \n inNumber - 1 = 172\n\n2) bitshift such that we remove the least significant bit-subset\n this is guaranteed to be devisible since we subtracted the remainder\n\n (inNumber=172) / pow(2.0, from=2) = 172 / 4 = 43 = 0010_1011\n\n3) lastly, remove the most significant bit-subset\n\n mod((inNumber=43), pow(2.0, to=4 - from=2) = mod(43, 4)\n\n mod(43, 4) = 3\n\n or in binary notation: 0000_0011 which is the expected result.\n\n*/ \n\nNodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture, vec2 textureSize, float treeIndex) {\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = textureSize.x;\n float dataTextureHeight = textureSize.y;\n\n float u = mod(treeIndex, dataTextureWidth);\n float v = floor(treeIndex / dataTextureWidth);\n float uCoord = (u + 0.5) / dataTextureWidth;\n float vCoord = (v + 0.5) / dataTextureHeight;\n vec2 treeIndexUv = vec2(uCoord, vCoord);\n \n vec4 texel = texture2D(nodeAppearanceTexture, treeIndexUv);\n float alphaUnwrapped = floor((texel.a * 255.0) + 0.5);\n\n bool isVisible = floatBitsSubset(alphaUnwrapped, 0, 1) == 1.0;\n bool renderInFront = floatBitsSubset(alphaUnwrapped, 1, 2) == 1.0;\n bool renderGhosted = floatBitsSubset(alphaUnwrapped, 2, 3) == 1.0;\n\n return NodeAppearance(texel, isVisible, renderInFront, renderGhosted);\n}\n\nconst int RenderTypeColor_1 = 1;\nconst int RenderTypeNormal_1 = 2;\nconst int RenderTypeTreeIndex_1 = 3;\nconst int RenderTypePackColorAndNormal_1 = 4;\nconst int RenderTypeDepth_1 = 5;\nconst int RenderTypeEffects_1 = 6;\nconst int RenderTypeGhost_1 = 7;\n\nbool determineVisibility(NodeAppearance nodeAppearance, int renderMode) {\n return \n // In ghost mode\n ((renderMode == RenderTypeGhost_1) && nodeAppearance.isVisible && nodeAppearance.renderGhosted) ||\n // Not ghost mode\n ((renderMode != RenderTypeGhost_1) && \n !nodeAppearance.renderGhosted && nodeAppearance.isVisible && (nodeAppearance.renderInFront || renderMode != RenderTypeEffects_1));\n}\n\nvec4 determineColor(vec3 originalColor, NodeAppearance nodeAppearance) {\n vec4 overrideColor = nodeAppearance.colorTexel;\n if (any(greaterThan(overrideColor.rgb, vec3(0.0)))) {\n return overrideColor;\n }\n return vec4(originalColor.rgb, overrideColor.a);\n}\n\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\n\nbool isClipped(NodeAppearance nodeAppearance, vec3 point) {\n#if NUM_CLIPPING_PLANES > 0\n vec3 pointFlipped = -point;\n vec4 plane;\n\n for (int i = 0; i < UNION_CLIPPING_PLANES; i++) {\n plane = clippingPlanes[i];\n if (dot(pointFlipped, plane.xyz) > plane.w) return true;\n }\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n bool clipped = true;\n for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n clipped = (dot(pointFlipped, plane.xyz) > plane.w) && clipped;\n }\n if ( clipped ) return true;\n#endif\n#endif\n return false;\n}\n\nuniform sampler2D colorDataTexture;\nuniform sampler2D overrideVisibilityPerTreeIndex;\nuniform sampler2D matCapTexture;\n\nuniform vec2 treeIndexTextureSize;\n\nin float v_treeIndex;\nin vec3 v_color;\nin vec3 v_normal;\n\nuniform int renderMode;\n\nin vec3 vViewPosition;\n\nvoid main() {\n NodeAppearance appearance = determineNodeAppearance(colorDataTexture, treeIndexTextureSize, v_treeIndex);\n if (!determineVisibility(appearance, renderMode)) {\n discard;\n }\n if (isClipped(appearance, vViewPosition)) {\n discard;\n }\n\n vec4 color = determineColor(v_color, appearance);\n updateFragmentColor(renderMode, color, v_treeIndex, v_normal, gl_FragCoord.z, matCapTexture, GeometryType.Quad);\n}\n"},function(e,t,n){"use strict";n.r(t),t.default="#define GLSLIFY 1\n// https://stackoverflow.com/questions/7059962/how-do-i-convert-a-vec4-rgba-value-to-a-float @ Arjan\nfloat unpackVec4ToFloat( vec4 packedFloat)\n{\n vec4 rgba = packedFloat;\n float sign = 1.0 - step(128.0, rgba.x) * 2.0;\n float exponent = 2.0 * mod(rgba.x, 128.0) + step(128.0, rgba.y) - 127.0;\n if (exponent == -127.0) return 0.0;\n float mantissa = mod(rgba.y, 128.0) * 65536.0 + rgba.z * 256.0 + rgba.w + 8388608.0;\n return sign * exp2(exponent - 23.0) * mantissa; \n}\n\nfloat unpackFloatFromRGBATexel(vec4 texel){\n float byteValueR = floor((texel.r * 255.0) + 0.5);\n float byteValueG = floor((texel.g * 255.0) + 0.5);\n float byteValueB = floor((texel.b * 255.0) + 0.5);\n float byteValueA = floor((texel.a * 255.0) + 0.5);\n\n return unpackVec4ToFloat(vec4(byteValueR, byteValueG, byteValueB, byteValueA));\n}\n\nmat4 determineMatrixOverride(\n float treeIndex, \n vec2 treeIndexTextureSize, \n sampler2D transformOverrideIndexTexture, \n vec2 transformOverrideTextureSize, \n sampler2D transformOverrideTexture\n) {\n\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = treeIndexTextureSize.x;\n float dataTextureHeight = treeIndexTextureSize.y;\n\n float xTreeIndexTextureCoord = mod(treeIndex, dataTextureWidth);\n float yTreeIndexTextureCoord = floor(treeIndex / dataTextureWidth);\n\n vec2 indexUV = vec2((xTreeIndexTextureCoord + 0.5) / dataTextureWidth, (yTreeIndexTextureCoord + 0.5) / dataTextureHeight);\n\n vec3 indexTexel = texture2D(transformOverrideIndexTexture, indexUV).rgb;\n\n float index = floor(indexTexel.r * 256.0) * 65536.0 + floor(indexTexel.g * 256.0) * 256.0 + floor(indexTexel.b * 256.0);\n \n \n if(index == 0.0){\n return mat4(\n 1.0, 0.0, 0.0, 0.0,\n 0.0, 1.0, 0.0, 0.0,\n 0.0, 0.0, 1.0, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n }\n\n index = index - 1.0;\n float overridesPerRow = transformOverrideTextureSize.x / 16.0;\n\n float xOverrideTextureCoord = mod(index, overridesPerRow);\n float yOverrideTextureCoord = floor(index / overridesPerRow);\n\n float cellWidth = 1.0 / transformOverrideTextureSize.x;\n float cellHeight = 1.0 / transformOverrideTextureSize.y;\n\n float overrideU = (xOverrideTextureCoord / overridesPerRow) + cellWidth / 2.0;\n float overrideV = (yOverrideTextureCoord / transformOverrideTextureSize.y) + cellHeight / 2.0;\n\n vec2 overrideUV = vec2(overrideU, overrideV); \n\n float matrixElements[12];\n\n for(int i = 0; i < 12; i++){\n matrixElements[i] = unpackFloatFromRGBATexel(texture2D(transformOverrideTexture, overrideUV + vec2(float(i) * cellWidth, 0.0)));\n }\n \n return mat4(\n matrixElements[0], matrixElements[4], matrixElements[8], 0,\n matrixElements[1], matrixElements[5], matrixElements[9], 0,\n matrixElements[2], matrixElements[6], matrixElements[10], 0,\n matrixElements[3], matrixElements[7], matrixElements[11], 1\n );\n}\n\nuniform mat4 inverseModelMatrix;\n\nin vec3 color;\nin float treeIndex;\nin vec4 matrix0;\nin vec4 matrix1;\nin vec4 matrix2;\nin vec4 matrix3;\n\nout float v_treeIndex;\nout vec3 v_color;\nout vec3 v_normal;\n\nout vec3 vViewPosition;\n\nuniform vec2 treeIndexTextureSize;\n\nuniform sampler2D transformOverrideIndexTexture;\n\nuniform vec2 transformOverrideTextureSize; \nuniform sampler2D transformOverrideTexture;\n\nvoid main() {\n \n mat4 treeIndexWorldTransform = determineMatrixOverride(\n treeIndex, \n treeIndexTextureSize, \n transformOverrideIndexTexture, \n transformOverrideTextureSize, \n transformOverrideTexture\n );\n\n v_treeIndex = treeIndex;\n v_color = color;\n v_normal = normalize(normalMatrix * (inverseModelMatrix * treeIndexWorldTransform * modelMatrix * vec4(normalize(normal), 0.0)).xyz);\n mat4 instanceMatrix = mat4(matrix0, matrix1, matrix2, matrix3);\n vec3 transformed = (instanceMatrix * vec4(position, 1.0)).xyz;\n vec4 mvPosition = viewMatrix * treeIndexWorldTransform * modelMatrix * vec4( transformed, 1.0 );\n vViewPosition = mvPosition.xyz;\n gl_Position = projectionMatrix * mvPosition;\n}\n"},function(e,t,n){"use strict";n.r(t),t.default="#define GLSLIFY 1\nvec3 derivateNormal(vec3 v_viewPosition) {\n vec3 fdx = vec3(dFdx(v_viewPosition.x), dFdx(v_viewPosition.y), dFdx(v_viewPosition.z));\n vec3 fdy = vec3(dFdy(v_viewPosition.x), dFdy(v_viewPosition.y), dFdy(v_viewPosition.z));\n vec3 normal = normalize(cross(fdx, fdy));\n return normal;\n}\n\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\n/**\n * Packs the integer part of the number given to a RGB color.\n */\nvec3 packIntToColor(float number) {\n float r = floor(number / (255.0 * 255.0)) / 255.0;\n float g = mod(floor(number / 255.0), 255.0) / 255.0;\n float b = mod(number, 255.0) / 255.0;\n return vec3(r, g, b);\n}\n\nstruct GeometryTypeEnum {\n int Quad;\n int Primitive;\n int TriangleMesh;\n int InstancedMesh;\n};\n\nconst GeometryTypeEnum GeometryType = GeometryTypeEnum(1,2,3,4);\n\nconst int RenderTypeColor_0 = 1;\nconst int RenderTypeNormal_0 = 2;\nconst int RenderTypeTreeIndex_0 = 3;\nconst int RenderTypePackColorAndNormal_0 = 4;\nconst int RenderTypeDepth_0 = 5;\nconst int RenderTypeEffects_0 = 6;\nconst int RenderTypeGhost_0 = 7;\nconst int RenderTypeLOD = 8;\nconst int RenderTypeDepthBufferOnly = 9;\nconst int RenderTypeGeometryType = 10;\n\n#include <packing>\n\nout vec4 outputColor;\n\nvec3 packNormalToRgb( const in vec3 normal ) {\n return normalize( normal ) * 0.5 + 0.5;\n}\n\nvoid updateFragmentColor(\n int renderMode, vec4 color, float treeIndex, \n vec3 normal, float depth, sampler2D matCapTexture, \n int geometryType) {\n if (renderMode == RenderTypeColor_0 || renderMode == RenderTypeEffects_0) {\n vec3 hsv = rgb2hsv(color.rgb);\n hsv.z = min(0.5 * hsv.z + 0.5, 1.0);\n vec3 colorRGB = hsv2rgb(hsv);\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n vec4 albedo = vec4(colorRGB * (0.4 + 0.6 * amplitude), 1.0);\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec4 mc = vec4(texture2D(matCapTexture, cap).rgb, 1.0);\n \n outputColor = vec4(albedo.rgb * mc.rgb * 1.7, color.a);\n } else if (renderMode == RenderTypeGhost_0) {\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n float s = 0.4 + 0.6 * amplitude;\n outputColor = vec4(vec3(s), 0.3);\n } else if (renderMode == RenderTypeDepthBufferOnly) {\n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n } else if (renderMode == RenderTypePackColorAndNormal_0) {\n vec3 hsv = rgb2hsv(color.rgb);\n float a = 0.0;\n if (hsv.y > 0.01) {\n if (hsv.z > 0.5) {\n // light color\n a = (0.55 + hsv.x * 0.45);\n } else {\n // dark color\n a = (0.1 + hsv.x * 0.45);\n }\n } else {\n // no saturation - grayscale\n a = hsv.z * 0.09;\n }\n outputColor = vec4(packNormalToRgb(normal.rgb), a);\n } else if (renderMode == RenderTypeNormal_0) {\n outputColor = vec4(packNormalToRgb(normal), 1.0);\n } else if (renderMode == RenderTypeTreeIndex_0) {\n outputColor = vec4(packIntToColor(treeIndex), 1.0);\n } else if (renderMode == RenderTypeDepth_0) {\n outputColor = packDepthToRGBA(depth);\n } else if (renderMode == RenderTypeLOD) {\n bool isHighDetail = geometryType != GeometryType.Quad;\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture2D(matCapTexture, cap).rgb * 1.5;\n outputColor = isHighDetail ? vec4(vec3(0.0, 1.0, 0.0) * mc, color.a) : vec4(vec3(1.0, 1.0, 0.0) * mc, color.a);\n } else if (renderMode == RenderTypeGeometryType) {\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture2D(matCapTexture, cap).rgb * 1.5;\n vec3 geometryColor = \n float(geometryType == 1) * vec3(1.0, 0.0, 0.0) + // Quads\n float(geometryType == 2) * vec3(0.0, 1.0, 0.0) + // Primitives\n float(geometryType == 3) * vec3(0.0, 0.0, 1.0) + // Triangle meshes\n float(geometryType == 4) * vec3(1.0, 1.0, 0.0); // Instance meshes\n outputColor = vec4(geometryColor * mc, color.a);\n } else {\n // Unknown render mode - should not happen. \n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n }\n}\n\nstruct NodeAppearance {\n vec4 colorTexel;\n bool isVisible;\n bool renderInFront;\n bool renderGhosted;\n};\n\nfloat floatBitsSubset(float inNumber, int fromLeastSignificantBitIndex, int toMostSignificantBitIndex) {\n float r = float(fromLeastSignificantBitIndex);\n float l = float(toMostSignificantBitIndex);\n\n float bitShift = pow(2.0, r);\n return mod(((inNumber - mod(inNumber, bitShift)) / bitShift), pow(2.0, l - r));\n}\n\n/*\n\nExample:\n\nGet the value from bit 2 to 4 (not inclusive)\n\ninput:\ninNumber = 173 = 1010_1101 , from=2, to=4\n\nexpected output = 1010_|11|01 = 3\n\n1) subtract any bits in the least significant bit-subset\n\n mod(inNumber=173, pow(2.0, from=2)) = mod(inNumber, 4) = 1\n \n inNumber - 1 = 172\n\n2) bitshift such that we remove the least significant bit-subset\n this is guaranteed to be devisible since we subtracted the remainder\n\n (inNumber=172) / pow(2.0, from=2) = 172 / 4 = 43 = 0010_1011\n\n3) lastly, remove the most significant bit-subset\n\n mod((inNumber=43), pow(2.0, to=4 - from=2) = mod(43, 4)\n\n mod(43, 4) = 3\n\n or in binary notation: 0000_0011 which is the expected result.\n\n*/ \n\nNodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture, vec2 textureSize, float treeIndex) {\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = textureSize.x;\n float dataTextureHeight = textureSize.y;\n\n float u = mod(treeIndex, dataTextureWidth);\n float v = floor(treeIndex / dataTextureWidth);\n float uCoord = (u + 0.5) / dataTextureWidth;\n float vCoord = (v + 0.5) / dataTextureHeight;\n vec2 treeIndexUv = vec2(uCoord, vCoord);\n \n vec4 texel = texture2D(nodeAppearanceTexture, treeIndexUv);\n float alphaUnwrapped = floor((texel.a * 255.0) + 0.5);\n\n bool isVisible = floatBitsSubset(alphaUnwrapped, 0, 1) == 1.0;\n bool renderInFront = floatBitsSubset(alphaUnwrapped, 1, 2) == 1.0;\n bool renderGhosted = floatBitsSubset(alphaUnwrapped, 2, 3) == 1.0;\n\n return NodeAppearance(texel, isVisible, renderInFront, renderGhosted);\n}\n\nvec4 determineColor(vec3 originalColor, NodeAppearance nodeAppearance) {\n vec4 overrideColor = nodeAppearance.colorTexel;\n if (any(greaterThan(overrideColor.rgb, vec3(0.0)))) {\n return overrideColor;\n }\n return vec4(originalColor.rgb, overrideColor.a);\n}\n\nconst int RenderTypeColor_1 = 1;\nconst int RenderTypeNormal_1 = 2;\nconst int RenderTypeTreeIndex_1 = 3;\nconst int RenderTypePackColorAndNormal_1 = 4;\nconst int RenderTypeDepth_1 = 5;\nconst int RenderTypeEffects_1 = 6;\nconst int RenderTypeGhost_1 = 7;\n\nbool determineVisibility(NodeAppearance nodeAppearance, int renderMode) {\n return \n // In ghost mode\n ((renderMode == RenderTypeGhost_1) && nodeAppearance.isVisible && nodeAppearance.renderGhosted) ||\n // Not ghost mode\n ((renderMode != RenderTypeGhost_1) && \n !nodeAppearance.renderGhosted && nodeAppearance.isVisible && (nodeAppearance.renderInFront || renderMode != RenderTypeEffects_1));\n}\n\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\n\nbool isClipped(NodeAppearance nodeAppearance, vec3 point) {\n#if NUM_CLIPPING_PLANES > 0\n vec3 pointFlipped = -point;\n vec4 plane;\n\n for (int i = 0; i < UNION_CLIPPING_PLANES; i++) {\n plane = clippingPlanes[i];\n if (dot(pointFlipped, plane.xyz) > plane.w) return true;\n }\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n bool clipped = true;\n for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n clipped = (dot(pointFlipped, plane.xyz) > plane.w) && clipped;\n }\n if ( clipped ) return true;\n#endif\n#endif\n return false;\n}\n\nuniform sampler2D colorDataTexture;\nuniform sampler2D overrideVisibilityPerTreeIndex;\nuniform sampler2D matCapTexture;\n\nuniform vec2 treeIndexTextureSize;\n\nin float v_treeIndex;\nin vec3 v_color;\nin vec3 v_viewPosition;\n\nuniform int renderMode;\n\nvoid main()\n{\n NodeAppearance appearance = determineNodeAppearance(colorDataTexture, treeIndexTextureSize, v_treeIndex);\n if (!determineVisibility(appearance, renderMode)) {\n discard;\n }\n\n if (isClipped(appearance, v_viewPosition)) {\n discard;\n }\n\n vec4 color = determineColor(v_color, appearance);\n vec3 normal = derivateNormal(v_viewPosition);\n updateFragmentColor(renderMode, color, v_treeIndex, normal, gl_FragCoord.z, matCapTexture, GeometryType.TriangleMesh);\n}\n"},function(e,t,n){"use strict";n.r(t),t.default="#define GLSLIFY 1\n// https://stackoverflow.com/questions/7059962/how-do-i-convert-a-vec4-rgba-value-to-a-float @ Arjan\nfloat unpackVec4ToFloat( vec4 packedFloat)\n{\n vec4 rgba = packedFloat;\n float sign = 1.0 - step(128.0, rgba.x) * 2.0;\n float exponent = 2.0 * mod(rgba.x, 128.0) + step(128.0, rgba.y) - 127.0;\n if (exponent == -127.0) return 0.0;\n float mantissa = mod(rgba.y, 128.0) * 65536.0 + rgba.z * 256.0 + rgba.w + 8388608.0;\n return sign * exp2(exponent - 23.0) * mantissa; \n}\n\nfloat unpackFloatFromRGBATexel(vec4 texel){\n float byteValueR = floor((texel.r * 255.0) + 0.5);\n float byteValueG = floor((texel.g * 255.0) + 0.5);\n float byteValueB = floor((texel.b * 255.0) + 0.5);\n float byteValueA = floor((texel.a * 255.0) + 0.5);\n\n return unpackVec4ToFloat(vec4(byteValueR, byteValueG, byteValueB, byteValueA));\n}\n\nmat4 determineMatrixOverride(\n float treeIndex, \n vec2 treeIndexTextureSize, \n sampler2D transformOverrideIndexTexture, \n vec2 transformOverrideTextureSize, \n sampler2D transformOverrideTexture\n) {\n\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = treeIndexTextureSize.x;\n float dataTextureHeight = treeIndexTextureSize.y;\n\n float xTreeIndexTextureCoord = mod(treeIndex, dataTextureWidth);\n float yTreeIndexTextureCoord = floor(treeIndex / dataTextureWidth);\n\n vec2 indexUV = vec2((xTreeIndexTextureCoord + 0.5) / dataTextureWidth, (yTreeIndexTextureCoord + 0.5) / dataTextureHeight);\n\n vec3 indexTexel = texture2D(transformOverrideIndexTexture, indexUV).rgb;\n\n float index = floor(indexTexel.r * 256.0) * 65536.0 + floor(indexTexel.g * 256.0) * 256.0 + floor(indexTexel.b * 256.0);\n \n \n if(index == 0.0){\n return mat4(\n 1.0, 0.0, 0.0, 0.0,\n 0.0, 1.0, 0.0, 0.0,\n 0.0, 0.0, 1.0, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n }\n\n index = index - 1.0;\n float overridesPerRow = transformOverrideTextureSize.x / 16.0;\n\n float xOverrideTextureCoord = mod(index, overridesPerRow);\n float yOverrideTextureCoord = floor(index / overridesPerRow);\n\n float cellWidth = 1.0 / transformOverrideTextureSize.x;\n float cellHeight = 1.0 / transformOverrideTextureSize.y;\n\n float overrideU = (xOverrideTextureCoord / overridesPerRow) + cellWidth / 2.0;\n float overrideV = (yOverrideTextureCoord / transformOverrideTextureSize.y) + cellHeight / 2.0;\n\n vec2 overrideUV = vec2(overrideU, overrideV); \n\n float matrixElements[12];\n\n for(int i = 0; i < 12; i++){\n matrixElements[i] = unpackFloatFromRGBATexel(texture2D(transformOverrideTexture, overrideUV + vec2(float(i) * cellWidth, 0.0)));\n }\n \n return mat4(\n matrixElements[0], matrixElements[4], matrixElements[8], 0,\n matrixElements[1], matrixElements[5], matrixElements[9], 0,\n matrixElements[2], matrixElements[6], matrixElements[10], 0,\n matrixElements[3], matrixElements[7], matrixElements[11], 1\n );\n}\n\nin vec3 color;\nin float treeIndex; \n\nout vec3 v_color;\nout float v_treeIndex;\nout vec3 v_viewPosition;\n\nuniform vec2 treeIndexTextureSize;\nuniform sampler2D transformOverrideIndexTexture;\n\nuniform vec2 transformOverrideTextureSize;\nuniform sampler2D transformOverrideTexture;\n\nvoid main() {\n v_color = color;\n v_treeIndex = treeIndex;\n\n mat4 treeIndexWorldTransform = determineMatrixOverride(\n treeIndex, \n treeIndexTextureSize, \n transformOverrideIndexTexture, \n transformOverrideTextureSize, \n transformOverrideTexture\n );\n\n vec4 modelViewPosition = viewMatrix * treeIndexWorldTransform * modelMatrix * vec4(position, 1.0);\n v_viewPosition = modelViewPosition.xyz;\n gl_Position = projectionMatrix * modelViewPosition;\n}\n"},function(e,t,n){"use strict";n.r(t),t.default="#define GLSLIFY 1\nvec3 derivateNormal(vec3 v_viewPosition) {\n vec3 fdx = vec3(dFdx(v_viewPosition.x), dFdx(v_viewPosition.y), dFdx(v_viewPosition.z));\n vec3 fdy = vec3(dFdy(v_viewPosition.x), dFdy(v_viewPosition.y), dFdy(v_viewPosition.z));\n vec3 normal = normalize(cross(fdx, fdy));\n return normal;\n}\n\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\n/**\n * Packs the integer part of the number given to a RGB color.\n */\nvec3 packIntToColor(float number) {\n float r = floor(number / (255.0 * 255.0)) / 255.0;\n float g = mod(floor(number / 255.0), 255.0) / 255.0;\n float b = mod(number, 255.0) / 255.0;\n return vec3(r, g, b);\n}\n\nstruct GeometryTypeEnum {\n int Quad;\n int Primitive;\n int TriangleMesh;\n int InstancedMesh;\n};\n\nconst GeometryTypeEnum GeometryType = GeometryTypeEnum(1,2,3,4);\n\nconst int RenderTypeColor_0 = 1;\nconst int RenderTypeNormal_0 = 2;\nconst int RenderTypeTreeIndex_0 = 3;\nconst int RenderTypePackColorAndNormal_0 = 4;\nconst int RenderTypeDepth_0 = 5;\nconst int RenderTypeEffects_0 = 6;\nconst int RenderTypeGhost_0 = 7;\nconst int RenderTypeLOD = 8;\nconst int RenderTypeDepthBufferOnly = 9;\nconst int RenderTypeGeometryType = 10;\n\n#include <packing>\n\nout vec4 outputColor;\n\nvec3 packNormalToRgb( const in vec3 normal ) {\n return normalize( normal ) * 0.5 + 0.5;\n}\n\nvoid updateFragmentColor(\n int renderMode, vec4 color, float treeIndex, \n vec3 normal, float depth, sampler2D matCapTexture, \n int geometryType) {\n if (renderMode == RenderTypeColor_0 || renderMode == RenderTypeEffects_0) {\n vec3 hsv = rgb2hsv(color.rgb);\n hsv.z = min(0.5 * hsv.z + 0.5, 1.0);\n vec3 colorRGB = hsv2rgb(hsv);\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n vec4 albedo = vec4(colorRGB * (0.4 + 0.6 * amplitude), 1.0);\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec4 mc = vec4(texture2D(matCapTexture, cap).rgb, 1.0);\n \n outputColor = vec4(albedo.rgb * mc.rgb * 1.7, color.a);\n } else if (renderMode == RenderTypeGhost_0) {\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n float s = 0.4 + 0.6 * amplitude;\n outputColor = vec4(vec3(s), 0.3);\n } else if (renderMode == RenderTypeDepthBufferOnly) {\n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n } else if (renderMode == RenderTypePackColorAndNormal_0) {\n vec3 hsv = rgb2hsv(color.rgb);\n float a = 0.0;\n if (hsv.y > 0.01) {\n if (hsv.z > 0.5) {\n // light color\n a = (0.55 + hsv.x * 0.45);\n } else {\n // dark color\n a = (0.1 + hsv.x * 0.45);\n }\n } else {\n // no saturation - grayscale\n a = hsv.z * 0.09;\n }\n outputColor = vec4(packNormalToRgb(normal.rgb), a);\n } else if (renderMode == RenderTypeNormal_0) {\n outputColor = vec4(packNormalToRgb(normal), 1.0);\n } else if (renderMode == RenderTypeTreeIndex_0) {\n outputColor = vec4(packIntToColor(treeIndex), 1.0);\n } else if (renderMode == RenderTypeDepth_0) {\n outputColor = packDepthToRGBA(depth);\n } else if (renderMode == RenderTypeLOD) {\n bool isHighDetail = geometryType != GeometryType.Quad;\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture2D(matCapTexture, cap).rgb * 1.5;\n outputColor = isHighDetail ? vec4(vec3(0.0, 1.0, 0.0) * mc, color.a) : vec4(vec3(1.0, 1.0, 0.0) * mc, color.a);\n } else if (renderMode == RenderTypeGeometryType) {\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture2D(matCapTexture, cap).rgb * 1.5;\n vec3 geometryColor = \n float(geometryType == 1) * vec3(1.0, 0.0, 0.0) + // Quads\n float(geometryType == 2) * vec3(0.0, 1.0, 0.0) + // Primitives\n float(geometryType == 3) * vec3(0.0, 0.0, 1.0) + // Triangle meshes\n float(geometryType == 4) * vec3(1.0, 1.0, 0.0); // Instance meshes\n outputColor = vec4(geometryColor * mc, color.a);\n } else {\n // Unknown render mode - should not happen. \n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n }\n}\n\nstruct NodeAppearance {\n vec4 colorTexel;\n bool isVisible;\n bool renderInFront;\n bool renderGhosted;\n};\n\nfloat floatBitsSubset(float inNumber, int fromLeastSignificantBitIndex, int toMostSignificantBitIndex) {\n float r = float(fromLeastSignificantBitIndex);\n float l = float(toMostSignificantBitIndex);\n\n float bitShift = pow(2.0, r);\n return mod(((inNumber - mod(inNumber, bitShift)) / bitShift), pow(2.0, l - r));\n}\n\n/*\n\nExample:\n\nGet the value from bit 2 to 4 (not inclusive)\n\ninput:\ninNumber = 173 = 1010_1101 , from=2, to=4\n\nexpected output = 1010_|11|01 = 3\n\n1) subtract any bits in the least significant bit-subset\n\n mod(inNumber=173, pow(2.0, from=2)) = mod(inNumber, 4) = 1\n \n inNumber - 1 = 172\n\n2) bitshift such that we remove the least significant bit-subset\n this is guaranteed to be devisible since we subtracted the remainder\n\n (inNumber=172) / pow(2.0, from=2) = 172 / 4 = 43 = 0010_1011\n\n3) lastly, remove the most significant bit-subset\n\n mod((inNumber=43), pow(2.0, to=4 - from=2) = mod(43, 4)\n\n mod(43, 4) = 3\n\n or in binary notation: 0000_0011 which is the expected result.\n\n*/ \n\nNodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture, vec2 textureSize, float treeIndex) {\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = textureSize.x;\n float dataTextureHeight = textureSize.y;\n\n float u = mod(treeIndex, dataTextureWidth);\n float v = floor(treeIndex / dataTextureWidth);\n float uCoord = (u + 0.5) / dataTextureWidth;\n float vCoord = (v + 0.5) / dataTextureHeight;\n vec2 treeIndexUv = vec2(uCoord, vCoord);\n \n vec4 texel = texture2D(nodeAppearanceTexture, treeIndexUv);\n float alphaUnwrapped = floor((texel.a * 255.0) + 0.5);\n\n bool isVisible = floatBitsSubset(alphaUnwrapped, 0, 1) == 1.0;\n bool renderInFront = floatBitsSubset(alphaUnwrapped, 1, 2) == 1.0;\n bool renderGhosted = floatBitsSubset(alphaUnwrapped, 2, 3) == 1.0;\n\n return NodeAppearance(texel, isVisible, renderInFront, renderGhosted);\n}\n\nconst int RenderTypeColor_1 = 1;\nconst int RenderTypeNormal_1 = 2;\nconst int RenderTypeTreeIndex_1 = 3;\nconst int RenderTypePackColorAndNormal_1 = 4;\nconst int RenderTypeDepth_1 = 5;\nconst int RenderTypeEffects_1 = 6;\nconst int RenderTypeGhost_1 = 7;\n\nbool determineVisibility(NodeAppearance nodeAppearance, int renderMode) {\n return \n // In ghost mode\n ((renderMode == RenderTypeGhost_1) && nodeAppearance.isVisible && nodeAppearance.renderGhosted) ||\n // Not ghost mode\n ((renderMode != RenderTypeGhost_1) && \n !nodeAppearance.renderGhosted && nodeAppearance.isVisible && (nodeAppearance.renderInFront || renderMode != RenderTypeEffects_1));\n}\n\nvec4 determineColor(vec3 originalColor, NodeAppearance nodeAppearance) {\n vec4 overrideColor = nodeAppearance.colorTexel;\n if (any(greaterThan(overrideColor.rgb, vec3(0.0)))) {\n return overrideColor;\n }\n return vec4(originalColor.rgb, overrideColor.a);\n}\n\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\n\nbool isClipped(NodeAppearance nodeAppearance, vec3 point) {\n#if NUM_CLIPPING_PLANES > 0\n vec3 pointFlipped = -point;\n vec4 plane;\n\n for (int i = 0; i < UNION_CLIPPING_PLANES; i++) {\n plane = clippingPlanes[i];\n if (dot(pointFlipped, plane.xyz) > plane.w) return true;\n }\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n bool clipped = true;\n for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n clipped = (dot(pointFlipped, plane.xyz) > plane.w) && clipped;\n }\n if ( clipped ) return true;\n#endif\n#endif\n return false;\n}\n\nuniform sampler2D colorDataTexture;\nuniform sampler2D matCapTexture;\n\nuniform vec2 treeIndexTextureSize;\n\nin float v_treeIndex;\nin vec3 v_color;\nin vec3 v_viewPosition;\n\nuniform int renderMode;\n\nvoid main() {\n NodeAppearance appearance = determineNodeAppearance(colorDataTexture, treeIndexTextureSize, v_treeIndex);\n if (!determineVisibility(appearance, renderMode)) {\n discard;\n }\n\n if (isClipped(appearance, v_viewPosition)) {\n discard;\n }\n\n vec4 color = determineColor(v_color, appearance);\n vec3 normal = derivateNormal(v_viewPosition);\n updateFragmentColor(renderMode, color, v_treeIndex, normal, gl_FragCoord.z, matCapTexture, GeometryType.InstancedMesh);\n}\n"},function(e,t,n){"use strict";n.r(t),t.default="#define GLSLIFY 1\n// https://stackoverflow.com/questions/7059962/how-do-i-convert-a-vec4-rgba-value-to-a-float @ Arjan\nfloat unpackVec4ToFloat( vec4 packedFloat)\n{\n vec4 rgba = packedFloat;\n float sign = 1.0 - step(128.0, rgba.x) * 2.0;\n float exponent = 2.0 * mod(rgba.x, 128.0) + step(128.0, rgba.y) - 127.0;\n if (exponent == -127.0) return 0.0;\n float mantissa = mod(rgba.y, 128.0) * 65536.0 + rgba.z * 256.0 + rgba.w + 8388608.0;\n return sign * exp2(exponent - 23.0) * mantissa; \n}\n\nfloat unpackFloatFromRGBATexel(vec4 texel){\n float byteValueR = floor((texel.r * 255.0) + 0.5);\n float byteValueG = floor((texel.g * 255.0) + 0.5);\n float byteValueB = floor((texel.b * 255.0) + 0.5);\n float byteValueA = floor((texel.a * 255.0) + 0.5);\n\n return unpackVec4ToFloat(vec4(byteValueR, byteValueG, byteValueB, byteValueA));\n}\n\nmat4 determineMatrixOverride(\n float treeIndex, \n vec2 treeIndexTextureSize, \n sampler2D transformOverrideIndexTexture, \n vec2 transformOverrideTextureSize, \n sampler2D transformOverrideTexture\n) {\n\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = treeIndexTextureSize.x;\n float dataTextureHeight = treeIndexTextureSize.y;\n\n float xTreeIndexTextureCoord = mod(treeIndex, dataTextureWidth);\n float yTreeIndexTextureCoord = floor(treeIndex / dataTextureWidth);\n\n vec2 indexUV = vec2((xTreeIndexTextureCoord + 0.5) / dataTextureWidth, (yTreeIndexTextureCoord + 0.5) / dataTextureHeight);\n\n vec3 indexTexel = texture2D(transformOverrideIndexTexture, indexUV).rgb;\n\n float index = floor(indexTexel.r * 256.0) * 65536.0 + floor(indexTexel.g * 256.0) * 256.0 + floor(indexTexel.b * 256.0);\n \n \n if(index == 0.0){\n return mat4(\n 1.0, 0.0, 0.0, 0.0,\n 0.0, 1.0, 0.0, 0.0,\n 0.0, 0.0, 1.0, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n }\n\n index = index - 1.0;\n float overridesPerRow = transformOverrideTextureSize.x / 16.0;\n\n float xOverrideTextureCoord = mod(index, overridesPerRow);\n float yOverrideTextureCoord = floor(index / overridesPerRow);\n\n float cellWidth = 1.0 / transformOverrideTextureSize.x;\n float cellHeight = 1.0 / transformOverrideTextureSize.y;\n\n float overrideU = (xOverrideTextureCoord / overridesPerRow) + cellWidth / 2.0;\n float overrideV = (yOverrideTextureCoord / transformOverrideTextureSize.y) + cellHeight / 2.0;\n\n vec2 overrideUV = vec2(overrideU, overrideV); \n\n float matrixElements[12];\n\n for(int i = 0; i < 12; i++){\n matrixElements[i] = unpackFloatFromRGBATexel(texture2D(transformOverrideTexture, overrideUV + vec2(float(i) * cellWidth, 0.0)));\n }\n \n return mat4(\n matrixElements[0], matrixElements[4], matrixElements[8], 0,\n matrixElements[1], matrixElements[5], matrixElements[9], 0,\n matrixElements[2], matrixElements[6], matrixElements[10], 0,\n matrixElements[3], matrixElements[7], matrixElements[11], 1\n );\n}\n\nin mat4 a_instanceMatrix;\n\nin float a_treeIndex;\nin vec3 a_color;\n\nout float v_treeIndex;\nout vec3 v_color;\nout vec3 v_viewPosition;\n\nuniform vec2 treeIndexTextureSize;\n\nuniform sampler2D transformOverrideIndexTexture;\n\nuniform vec2 transformOverrideTextureSize; \nuniform sampler2D transformOverrideTexture;\n\nvoid main()\n{\n mat4 treeIndexWorldTransform = determineMatrixOverride(\n a_treeIndex, \n treeIndexTextureSize, \n transformOverrideIndexTexture, \n transformOverrideTextureSize, \n transformOverrideTexture\n );\n\n v_color = a_color;\n\n vec3 transformed = (a_instanceMatrix * vec4(position, 1.0)).xyz;\n vec4 modelViewPosition = viewMatrix * modelMatrix * vec4(transformed, 1.0);\n v_viewPosition = modelViewPosition.xyz;\n v_treeIndex = a_treeIndex;\n gl_Position = projectionMatrix * modelViewPosition;\n}\n"},function(e,t,n){"use strict";n.r(t),t.default="#define GLSLIFY 1\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\n/**\n * Packs the integer part of the number given to a RGB color.\n */\nvec3 packIntToColor(float number) {\n float r = floor(number / (255.0 * 255.0)) / 255.0;\n float g = mod(floor(number / 255.0), 255.0) / 255.0;\n float b = mod(number, 255.0) / 255.0;\n return vec3(r, g, b);\n}\n\nstruct GeometryTypeEnum {\n int Quad;\n int Primitive;\n int TriangleMesh;\n int InstancedMesh;\n};\n\nconst GeometryTypeEnum GeometryType = GeometryTypeEnum(1,2,3,4);\n\nconst int RenderTypeColor_0 = 1;\nconst int RenderTypeNormal_0 = 2;\nconst int RenderTypeTreeIndex_0 = 3;\nconst int RenderTypePackColorAndNormal_0 = 4;\nconst int RenderTypeDepth_0 = 5;\nconst int RenderTypeEffects_0 = 6;\nconst int RenderTypeGhost_0 = 7;\nconst int RenderTypeLOD = 8;\nconst int RenderTypeDepthBufferOnly = 9;\nconst int RenderTypeGeometryType = 10;\n\n#include <packing>\n\nout vec4 outputColor;\n\nvec3 packNormalToRgb( const in vec3 normal ) {\n return normalize( normal ) * 0.5 + 0.5;\n}\n\nvoid updateFragmentColor(\n int renderMode, vec4 color, float treeIndex, \n vec3 normal, float depth, sampler2D matCapTexture, \n int geometryType) {\n if (renderMode == RenderTypeColor_0 || renderMode == RenderTypeEffects_0) {\n vec3 hsv = rgb2hsv(color.rgb);\n hsv.z = min(0.5 * hsv.z + 0.5, 1.0);\n vec3 colorRGB = hsv2rgb(hsv);\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n vec4 albedo = vec4(colorRGB * (0.4 + 0.6 * amplitude), 1.0);\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec4 mc = vec4(texture2D(matCapTexture, cap).rgb, 1.0);\n \n outputColor = vec4(albedo.rgb * mc.rgb * 1.7, color.a);\n } else if (renderMode == RenderTypeGhost_0) {\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n float s = 0.4 + 0.6 * amplitude;\n outputColor = vec4(vec3(s), 0.3);\n } else if (renderMode == RenderTypeDepthBufferOnly) {\n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n } else if (renderMode == RenderTypePackColorAndNormal_0) {\n vec3 hsv = rgb2hsv(color.rgb);\n float a = 0.0;\n if (hsv.y > 0.01) {\n if (hsv.z > 0.5) {\n // light color\n a = (0.55 + hsv.x * 0.45);\n } else {\n // dark color\n a = (0.1 + hsv.x * 0.45);\n }\n } else {\n // no saturation - grayscale\n a = hsv.z * 0.09;\n }\n outputColor = vec4(packNormalToRgb(normal.rgb), a);\n } else if (renderMode == RenderTypeNormal_0) {\n outputColor = vec4(packNormalToRgb(normal), 1.0);\n } else if (renderMode == RenderTypeTreeIndex_0) {\n outputColor = vec4(packIntToColor(treeIndex), 1.0);\n } else if (renderMode == RenderTypeDepth_0) {\n outputColor = packDepthToRGBA(depth);\n } else if (renderMode == RenderTypeLOD) {\n bool isHighDetail = geometryType != GeometryType.Quad;\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture2D(matCapTexture, cap).rgb * 1.5;\n outputColor = isHighDetail ? vec4(vec3(0.0, 1.0, 0.0) * mc, color.a) : vec4(vec3(1.0, 1.0, 0.0) * mc, color.a);\n } else if (renderMode == RenderTypeGeometryType) {\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture2D(matCapTexture, cap).rgb * 1.5;\n vec3 geometryColor = \n float(geometryType == 1) * vec3(1.0, 0.0, 0.0) + // Quads\n float(geometryType == 2) * vec3(0.0, 1.0, 0.0) + // Primitives\n float(geometryType == 3) * vec3(0.0, 0.0, 1.0) + // Triangle meshes\n float(geometryType == 4) * vec3(1.0, 1.0, 0.0); // Instance meshes\n outputColor = vec4(geometryColor * mc, color.a);\n } else {\n // Unknown render mode - should not happen. \n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n }\n}\n\nstruct NodeAppearance {\n vec4 colorTexel;\n bool isVisible;\n bool renderInFront;\n bool renderGhosted;\n};\n\nfloat floatBitsSubset(float inNumber, int fromLeastSignificantBitIndex, int toMostSignificantBitIndex) {\n float r = float(fromLeastSignificantBitIndex);\n float l = float(toMostSignificantBitIndex);\n\n float bitShift = pow(2.0, r);\n return mod(((inNumber - mod(inNumber, bitShift)) / bitShift), pow(2.0, l - r));\n}\n\n/*\n\nExample:\n\nGet the value from bit 2 to 4 (not inclusive)\n\ninput:\ninNumber = 173 = 1010_1101 , from=2, to=4\n\nexpected output = 1010_|11|01 = 3\n\n1) subtract any bits in the least significant bit-subset\n\n mod(inNumber=173, pow(2.0, from=2)) = mod(inNumber, 4) = 1\n \n inNumber - 1 = 172\n\n2) bitshift such that we remove the least significant bit-subset\n this is guaranteed to be devisible since we subtracted the remainder\n\n (inNumber=172) / pow(2.0, from=2) = 172 / 4 = 43 = 0010_1011\n\n3) lastly, remove the most significant bit-subset\n\n mod((inNumber=43), pow(2.0, to=4 - from=2) = mod(43, 4)\n\n mod(43, 4) = 3\n\n or in binary notation: 0000_0011 which is the expected result.\n\n*/ \n\nNodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture, vec2 textureSize, float treeIndex) {\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = textureSize.x;\n float dataTextureHeight = textureSize.y;\n\n float u = mod(treeIndex, dataTextureWidth);\n float v = floor(treeIndex / dataTextureWidth);\n float uCoord = (u + 0.5) / dataTextureWidth;\n float vCoord = (v + 0.5) / dataTextureHeight;\n vec2 treeIndexUv = vec2(uCoord, vCoord);\n \n vec4 texel = texture2D(nodeAppearanceTexture, treeIndexUv);\n float alphaUnwrapped = floor((texel.a * 255.0) + 0.5);\n\n bool isVisible = floatBitsSubset(alphaUnwrapped, 0, 1) == 1.0;\n bool renderInFront = floatBitsSubset(alphaUnwrapped, 1, 2) == 1.0;\n bool renderGhosted = floatBitsSubset(alphaUnwrapped, 2, 3) == 1.0;\n\n return NodeAppearance(texel, isVisible, renderInFront, renderGhosted);\n}\n\nconst int RenderTypeColor_1 = 1;\nconst int RenderTypeNormal_1 = 2;\nconst int RenderTypeTreeIndex_1 = 3;\nconst int RenderTypePackColorAndNormal_1 = 4;\nconst int RenderTypeDepth_1 = 5;\nconst int RenderTypeEffects_1 = 6;\nconst int RenderTypeGhost_1 = 7;\n\nbool determineVisibility(NodeAppearance nodeAppearance, int renderMode) {\n return \n // In ghost mode\n ((renderMode == RenderTypeGhost_1) && nodeAppearance.isVisible && nodeAppearance.renderGhosted) ||\n // Not ghost mode\n ((renderMode != RenderTypeGhost_1) && \n !nodeAppearance.renderGhosted && nodeAppearance.isVisible && (nodeAppearance.renderInFront || renderMode != RenderTypeEffects_1));\n}\n\nvec4 determineColor(vec3 originalColor, NodeAppearance nodeAppearance) {\n vec4 overrideColor = nodeAppearance.colorTexel;\n if (any(greaterThan(overrideColor.rgb, vec3(0.0)))) {\n return overrideColor;\n }\n return vec4(originalColor.rgb, overrideColor.a);\n}\n\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\n\nbool isClipped(NodeAppearance nodeAppearance, vec3 point) {\n#if NUM_CLIPPING_PLANES > 0\n vec3 pointFlipped = -point;\n vec4 plane;\n\n for (int i = 0; i < UNION_CLIPPING_PLANES; i++) {\n plane = clippingPlanes[i];\n if (dot(pointFlipped, plane.xyz) > plane.w) return true;\n }\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n bool clipped = true;\n for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n clipped = (dot(pointFlipped, plane.xyz) > plane.w) && clipped;\n }\n if ( clipped ) return true;\n#endif\n#endif\n return false;\n}\n\nin float v_treeIndex;\nin vec2 v_xy;\nin vec3 v_color;\nin vec3 v_normal;\n\nuniform sampler2D colorDataTexture;\nuniform sampler2D overrideVisibilityPerTreeIndex;\nuniform sampler2D matCapTexture;\n\nuniform vec2 treeIndexTextureSize;\n\nuniform int renderMode;\n\nin vec3 vViewPosition;\n\nvoid main() {\n float dist = dot(v_xy, v_xy);\n vec3 normal = normalize( v_normal );\n if (dist > 0.25)\n discard;\n \n NodeAppearance appearance = determineNodeAppearance(colorDataTexture, treeIndexTextureSize, v_treeIndex);\n if (!determineVisibility(appearance, renderMode)) {\n discard;\n }\n if (isClipped(appearance, vViewPosition)) {\n discard;\n }\n\n vec4 color = determineColor(v_color, appearance);\n updateFragmentColor(renderMode, color, v_treeIndex, normal, gl_FragCoord.z, matCapTexture, GeometryType.Primitive);\n}\n"},function(e,t,n){"use strict";n.r(t),t.default="#define GLSLIFY 1\n// https://stackoverflow.com/questions/7059962/how-do-i-convert-a-vec4-rgba-value-to-a-float @ Arjan\nfloat unpackVec4ToFloat( vec4 packedFloat)\n{\n vec4 rgba = packedFloat;\n float sign = 1.0 - step(128.0, rgba.x) * 2.0;\n float exponent = 2.0 * mod(rgba.x, 128.0) + step(128.0, rgba.y) - 127.0;\n if (exponent == -127.0) return 0.0;\n float mantissa = mod(rgba.y, 128.0) * 65536.0 + rgba.z * 256.0 + rgba.w + 8388608.0;\n return sign * exp2(exponent - 23.0) * mantissa; \n}\n\nfloat unpackFloatFromRGBATexel(vec4 texel){\n float byteValueR = floor((texel.r * 255.0) + 0.5);\n float byteValueG = floor((texel.g * 255.0) + 0.5);\n float byteValueB = floor((texel.b * 255.0) + 0.5);\n float byteValueA = floor((texel.a * 255.0) + 0.5);\n\n return unpackVec4ToFloat(vec4(byteValueR, byteValueG, byteValueB, byteValueA));\n}\n\nmat4 determineMatrixOverride(\n float treeIndex, \n vec2 treeIndexTextureSize, \n sampler2D transformOverrideIndexTexture, \n vec2 transformOverrideTextureSize, \n sampler2D transformOverrideTexture\n) {\n\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = treeIndexTextureSize.x;\n float dataTextureHeight = treeIndexTextureSize.y;\n\n float xTreeIndexTextureCoord = mod(treeIndex, dataTextureWidth);\n float yTreeIndexTextureCoord = floor(treeIndex / dataTextureWidth);\n\n vec2 indexUV = vec2((xTreeIndexTextureCoord + 0.5) / dataTextureWidth, (yTreeIndexTextureCoord + 0.5) / dataTextureHeight);\n\n vec3 indexTexel = texture2D(transformOverrideIndexTexture, indexUV).rgb;\n\n float index = floor(indexTexel.r * 256.0) * 65536.0 + floor(indexTexel.g * 256.0) * 256.0 + floor(indexTexel.b * 256.0);\n \n \n if(index == 0.0){\n return mat4(\n 1.0, 0.0, 0.0, 0.0,\n 0.0, 1.0, 0.0, 0.0,\n 0.0, 0.0, 1.0, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n }\n\n index = index - 1.0;\n float overridesPerRow = transformOverrideTextureSize.x / 16.0;\n\n float xOverrideTextureCoord = mod(index, overridesPerRow);\n float yOverrideTextureCoord = floor(index / overridesPerRow);\n\n float cellWidth = 1.0 / transformOverrideTextureSize.x;\n float cellHeight = 1.0 / transformOverrideTextureSize.y;\n\n float overrideU = (xOverrideTextureCoord / overridesPerRow) + cellWidth / 2.0;\n float overrideV = (yOverrideTextureCoord / transformOverrideTextureSize.y) + cellHeight / 2.0;\n\n vec2 overrideUV = vec2(overrideU, overrideV); \n\n float matrixElements[12];\n\n for(int i = 0; i < 12; i++){\n matrixElements[i] = unpackFloatFromRGBATexel(texture2D(transformOverrideTexture, overrideUV + vec2(float(i) * cellWidth, 0.0)));\n }\n \n return mat4(\n matrixElements[0], matrixElements[4], matrixElements[8], 0,\n matrixElements[1], matrixElements[5], matrixElements[9], 0,\n matrixElements[2], matrixElements[6], matrixElements[10], 0,\n matrixElements[3], matrixElements[7], matrixElements[11], 1\n );\n}\n\nuniform mat4 inverseModelMatrix;\n\nin mat4 a_instanceMatrix;\n\nin float a_treeIndex;\nin vec3 a_color;\nin vec3 a_normal;\n\nout vec2 v_xy;\nout vec3 v_color;\nout vec3 v_normal;\nout float v_treeIndex;\n\nout vec3 vViewPosition;\n\nuniform vec2 treeIndexTextureSize;\n\nuniform sampler2D transformOverrideIndexTexture;\n\nuniform vec2 transformOverrideTextureSize; \nuniform sampler2D transformOverrideTexture;\n\nvoid main() {\n v_xy = vec2(position.x, position.y);\n v_treeIndex = a_treeIndex;\n\n mat4 treeIndexWorldTransform = determineMatrixOverride(\n a_treeIndex, \n treeIndexTextureSize, \n transformOverrideIndexTexture, \n transformOverrideTextureSize, \n transformOverrideTexture\n );\n\n vec3 transformed = (a_instanceMatrix * vec4(position, 1.0)).xyz;\n vec4 mvPosition = viewMatrix * treeIndexWorldTransform * modelMatrix * vec4( transformed, 1.0 );\n v_color = a_color;\n\n v_normal = normalMatrix * normalize(inverseModelMatrix * treeIndexWorldTransform * modelMatrix * vec4(normalize(a_normal), 0.0)).xyz;\n vViewPosition = mvPosition.xyz;\n gl_Position = projectionMatrix * mvPosition;\n}\n"},function(e,t,n){"use strict";n.r(t),t.default='#define GLSLIFY 1\nvec3 mul3(mat4 M, vec3 v) {\n vec4 u = M * vec4(v, 1.0);\n return u.xyz / u.w;\n}\n\nfloat displaceScalar(vec3 point, float scalar, \n float treeIndex, vec3 cameraPosition, mat4 inverseModelMatrix) {\n\n // Displaces a scalar based on distance to camera to avoid z-fighting\n vec3 cameraPositionModelSpace = (inverseModelMatrix * vec4(cameraPosition, 1.0)).xyz;\n vec3 pointToCamera = cameraPositionModelSpace - point;\n\n // "Random" number in the range [0, 1], based on treeIndex\n float rnd = mod(treeIndex, 64.) / 64.;\n // Compute distance to camera, but cap it\n float maxDistanceToCamera = 50.;\n float distanceToCamera = min(length(pointToCamera), maxDistanceToCamera);\n\n float maxDisplacement = 0.01;\n float scaleFactor = 0.01;\n float displacement = min(maxDisplacement, scaleFactor * rnd * distanceToCamera / maxDistanceToCamera);\n return scalar + displacement;\n}\n\nfloat computeFragmentDepth(vec3 p, mat4 projectionMatrix) {\n // Anders Hafreager comments:\n // Depth value can be calculated by transforming the z-component of the intersection point to projection space.\n // The w-component is also needed to scale projection space into clip space.\n // However, the 4th column of the projection matrix is (0, 0, const, 0), so we can exploit this when computing w-value.\n float projected_intersection_z=projectionMatrix[0][2]*p.x+projectionMatrix[1][2]*p.y+projectionMatrix[2][2]*p.z+projectionMatrix[3][2];\n\n // If we want to use orthographic camera, the full w-component is found as\n float projected_intersection_w=projectionMatrix[0][3]*p.x+projectionMatrix[1][3]*p.y+projectionMatrix[2][3]*p.z+projectionMatrix[3][3];\n // float projected_intersection_w = projectionMatrix[2][3]*newPoint.z; // Optimized for perspective camera\n return ((gl_DepthRange.diff * (projected_intersection_z / projected_intersection_w)) + gl_DepthRange.near + gl_DepthRange.far) * .5;\n}\n\n#if defined(gl_FragDepthEXT) || defined(GL_EXT_frag_depth) \n\nfloat updateFragmentDepth(vec3 p,mat4 projectionMatrix) {\n gl_FragDepthEXT = computeFragmentDepth(p, projectionMatrix);\n return gl_FragDepthEXT;\n}\n\n#else\n\nfloat updateFragmentDepth(vec3 p, mat4 projectionMatrix){\n // Extension not available - not much we can do.\n return computeFragmentDepth(p, projectionMatrix);\n}\n\n#endif\n\nstruct NodeAppearance {\n vec4 colorTexel;\n bool isVisible;\n bool renderInFront;\n bool renderGhosted;\n};\n\nfloat floatBitsSubset(float inNumber, int fromLeastSignificantBitIndex, int toMostSignificantBitIndex) {\n float r = float(fromLeastSignificantBitIndex);\n float l = float(toMostSignificantBitIndex);\n\n float bitShift = pow(2.0, r);\n return mod(((inNumber - mod(inNumber, bitShift)) / bitShift), pow(2.0, l - r));\n}\n\n/*\n\nExample:\n\nGet the value from bit 2 to 4 (not inclusive)\n\ninput:\ninNumber = 173 = 1010_1101 , from=2, to=4\n\nexpected output = 1010_|11|01 = 3\n\n1) subtract any bits in the least significant bit-subset\n\n mod(inNumber=173, pow(2.0, from=2)) = mod(inNumber, 4) = 1\n \n inNumber - 1 = 172\n\n2) bitshift such that we remove the least significant bit-subset\n this is guaranteed to be devisible since we subtracted the remainder\n\n (inNumber=172) / pow(2.0, from=2) = 172 / 4 = 43 = 0010_1011\n\n3) lastly, remove the most significant bit-subset\n\n mod((inNumber=43), pow(2.0, to=4 - from=2) = mod(43, 4)\n\n mod(43, 4) = 3\n\n or in binary notation: 0000_0011 which is the expected result.\n\n*/ \n\nNodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture, vec2 textureSize, float treeIndex) {\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = textureSize.x;\n float dataTextureHeight = textureSize.y;\n\n float u = mod(treeIndex, dataTextureWidth);\n float v = floor(treeIndex / dataTextureWidth);\n float uCoord = (u + 0.5) / dataTextureWidth;\n float vCoord = (v + 0.5) / dataTextureHeight;\n vec2 treeIndexUv = vec2(uCoord, vCoord);\n \n vec4 texel = texture2D(nodeAppearanceTexture, treeIndexUv);\n float alphaUnwrapped = floor((texel.a * 255.0) + 0.5);\n\n bool isVisible = floatBitsSubset(alphaUnwrapped, 0, 1) == 1.0;\n bool renderInFront = floatBitsSubset(alphaUnwrapped, 1, 2) == 1.0;\n bool renderGhosted = floatBitsSubset(alphaUnwrapped, 2, 3) == 1.0;\n\n return NodeAppearance(texel, isVisible, renderInFront, renderGhosted);\n}\n\nconst int RenderTypeColor_0 = 1;\nconst int RenderTypeNormal_0 = 2;\nconst int RenderTypeTreeIndex_0 = 3;\nconst int RenderTypePackColorAndNormal_0 = 4;\nconst int RenderTypeDepth_0 = 5;\nconst int RenderTypeEffects_0 = 6;\nconst int RenderTypeGhost_0 = 7;\n\nbool determineVisibility(NodeAppearance nodeAppearance, int renderMode) {\n return \n // In ghost mode\n ((renderMode == RenderTypeGhost_0) && nodeAppearance.isVisible && nodeAppearance.renderGhosted) ||\n // Not ghost mode\n ((renderMode != RenderTypeGhost_0) && \n !nodeAppearance.renderGhosted && nodeAppearance.isVisible && (nodeAppearance.renderInFront || renderMode != RenderTypeEffects_0));\n}\n\nvec4 determineColor(vec3 originalColor, NodeAppearance nodeAppearance) {\n vec4 overrideColor = nodeAppearance.colorTexel;\n if (any(greaterThan(overrideColor.rgb, vec3(0.0)))) {\n return overrideColor;\n }\n return vec4(originalColor.rgb, overrideColor.a);\n}\n\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\n/**\n * Packs the integer part of the number given to a RGB color.\n */\nvec3 packIntToColor(float number) {\n float r = floor(number / (255.0 * 255.0)) / 255.0;\n float g = mod(floor(number / 255.0), 255.0) / 255.0;\n float b = mod(number, 255.0) / 255.0;\n return vec3(r, g, b);\n}\n\nstruct GeometryTypeEnum {\n int Quad;\n int Primitive;\n int TriangleMesh;\n int InstancedMesh;\n};\n\nconst GeometryTypeEnum GeometryType = GeometryTypeEnum(1,2,3,4);\n\nconst int RenderTypeColor_1 = 1;\nconst int RenderTypeNormal_1 = 2;\nconst int RenderTypeTreeIndex_1 = 3;\nconst int RenderTypePackColorAndNormal_1 = 4;\nconst int RenderTypeDepth_1 = 5;\nconst int RenderTypeEffects_1 = 6;\nconst int RenderTypeGhost_1 = 7;\nconst int RenderTypeLOD = 8;\nconst int RenderTypeDepthBufferOnly = 9;\nconst int RenderTypeGeometryType = 10;\n\n#include <packing>\n\nout vec4 outputColor;\n\nvec3 packNormalToRgb( const in vec3 normal ) {\n return normalize( normal ) * 0.5 + 0.5;\n}\n\nvoid updateFragmentColor(\n int renderMode, vec4 color, float treeIndex, \n vec3 normal, float depth, sampler2D matCapTexture, \n int geometryType) {\n if (renderMode == RenderTypeColor_1 || renderMode == RenderTypeEffects_1) {\n vec3 hsv = rgb2hsv(color.rgb);\n hsv.z = min(0.5 * hsv.z + 0.5, 1.0);\n vec3 colorRGB = hsv2rgb(hsv);\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n vec4 albedo = vec4(colorRGB * (0.4 + 0.6 * amplitude), 1.0);\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec4 mc = vec4(texture2D(matCapTexture, cap).rgb, 1.0);\n \n outputColor = vec4(albedo.rgb * mc.rgb * 1.7, color.a);\n } else if (renderMode == RenderTypeGhost_1) {\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n float s = 0.4 + 0.6 * amplitude;\n outputColor = vec4(vec3(s), 0.3);\n } else if (renderMode == RenderTypeDepthBufferOnly) {\n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n } else if (renderMode == RenderTypePackColorAndNormal_1) {\n vec3 hsv = rgb2hsv(color.rgb);\n float a = 0.0;\n if (hsv.y > 0.01) {\n if (hsv.z > 0.5) {\n // light color\n a = (0.55 + hsv.x * 0.45);\n } else {\n // dark color\n a = (0.1 + hsv.x * 0.45);\n }\n } else {\n // no saturation - grayscale\n a = hsv.z * 0.09;\n }\n outputColor = vec4(packNormalToRgb(normal.rgb), a);\n } else if (renderMode == RenderTypeNormal_1) {\n outputColor = vec4(packNormalToRgb(normal), 1.0);\n } else if (renderMode == RenderTypeTreeIndex_1) {\n outputColor = vec4(packIntToColor(treeIndex), 1.0);\n } else if (renderMode == RenderTypeDepth_1) {\n outputColor = packDepthToRGBA(depth);\n } else if (renderMode == RenderTypeLOD) {\n bool isHighDetail = geometryType != GeometryType.Quad;\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture2D(matCapTexture, cap).rgb * 1.5;\n outputColor = isHighDetail ? vec4(vec3(0.0, 1.0, 0.0) * mc, color.a) : vec4(vec3(1.0, 1.0, 0.0) * mc, color.a);\n } else if (renderMode == RenderTypeGeometryType) {\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture2D(matCapTexture, cap).rgb * 1.5;\n vec3 geometryColor = \n float(geometryType == 1) * vec3(1.0, 0.0, 0.0) + // Quads\n float(geometryType == 2) * vec3(0.0, 1.0, 0.0) + // Primitives\n float(geometryType == 3) * vec3(0.0, 0.0, 1.0) + // Triangle meshes\n float(geometryType == 4) * vec3(1.0, 1.0, 0.0); // Instance meshes\n outputColor = vec4(geometryColor * mc, color.a);\n } else {\n // Unknown render mode - should not happen. \n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n }\n}\n\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\n\nbool isClipped(NodeAppearance nodeAppearance, vec3 point) {\n#if NUM_CLIPPING_PLANES > 0\n vec3 pointFlipped = -point;\n vec4 plane;\n\n for (int i = 0; i < UNION_CLIPPING_PLANES; i++) {\n plane = clippingPlanes[i];\n if (dot(pointFlipped, plane.xyz) > plane.w) return true;\n }\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n bool clipped = true;\n for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n clipped = (dot(pointFlipped, plane.xyz) > plane.w) && clipped;\n }\n if ( clipped ) return true;\n#endif\n#endif\n return false;\n}\n\n#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n\nuniform sampler2D colorDataTexture;\nuniform sampler2D overrideVisibilityPerTreeIndex;\nuniform sampler2D matCapTexture;\n\nuniform vec2 treeIndexTextureSize;\n\nuniform mat4 projectionMatrix;\n\nin vec4 v_centerB;\n\nin vec4 v_W;\nin vec4 v_U;\n\nin float v_angle;\nin float v_arcAngle;\n\nin vec4 v_centerA;\nin vec4 v_V;\n\nin float v_treeIndex;\nin vec3 v_color;\nin vec3 v_normal;\n\nuniform int renderMode;\n\nvoid main() {\n NodeAppearance appearance = determineNodeAppearance(colorDataTexture, treeIndexTextureSize, v_treeIndex);\n if (!determineVisibility(appearance, renderMode)) {\n discard;\n }\n\n vec3 normal = normalize( v_normal );\n vec4 color = determineColor(v_color, appearance);\n\n float R1 = v_centerB.w;\n vec4 U = v_U;\n vec4 W = v_W;\n vec4 V = v_V;\n float height = length(v_centerA.xyz - v_centerB.xyz);\n float R2 = v_centerA.w;\n float dR = R2 - R1;\n\n mat3 basis = mat3(U.xyz, V.xyz, W.xyz);\n vec3 surfacePoint = vec3(U.w, V.w, W.w);\n vec3 rayTarget = surfacePoint;\n\n #if defined(COGNITE_ORTHOGRAPHIC_CAMERA)\n vec3 rayDirection = vec3(0.0, 0.0, -1.0);\n #else\n vec3 rayDirection = normalize(rayTarget); // rayOrigin is (0,0,0) in camera space\n #endif\n\n vec3 diff = rayTarget - v_centerB.xyz;\n vec3 E = diff * basis;\n vec3 D = rayDirection * basis;\n\n float a = dot(D.xy, D.xy);\n float b = dot(E.xy, D.xy);\n float c = dot(E.xy, E.xy) - R1*R1;\n\n if (R1 != R2) {\n // Additional terms if radii are different\n float dRLInv = dR / height;\n float dRdRL2Inv = dRLInv * dRLInv;\n a -= D.z * D.z * dRdRL2Inv;\n b -= dRLInv * (E.z * D.z * dRLInv + R1 * D.z);\n c -= dRLInv * (E.z * E.z * dRLInv + 2.0 * R1 * E.z);\n }\n\n // Calculate a dicriminant of the above quadratic equation\n float d = b*b - a*c;\n\n // d < 0.0 means the ray hits outside an infinitely long cone\n if (d < 0.0) {\n discard;\n }\n\n float sqrtd = sqrt(d);\n float dist1 = (-b - sqrtd)/a;\n float dist2 = (-b + sqrtd)/a;\n\n // Make sure dist1 is the smaller one\n if (dist2 < dist1) {\n float tmp = dist1;\n dist1 = dist2;\n dist2 = tmp;\n }\n\n float dist = dist1;\n vec3 intersectionPoint = E + dist * D;\n float theta = atan(intersectionPoint.y, intersectionPoint.x);\n if (theta < v_angle) theta += 2.0 * PI;\n\n // Intersection point in camera space\n vec3 p = rayTarget + dist*rayDirection;\n\n bool isInner = false;\n\n if (intersectionPoint.z <= 0.0 ||\n intersectionPoint.z > height ||\n theta > v_angle + v_arcAngle ||\n isClipped(appearance, p)\n ) {\n // Missed the first point, check the other point\n isInner = true;\n dist = dist2;\n intersectionPoint = E + dist * D;\n theta = atan(intersectionPoint.y, intersectionPoint.x);\n p = rayTarget + dist*rayDirection;\n if (theta < v_angle) theta += 2.0 * PI;\n if (intersectionPoint.z <= 0.0 ||\n intersectionPoint.z > height ||\n theta > v_angle + v_arcAngle ||\n isClipped(appearance, p)\n ) {\n // Missed the other point too\n discard;\n }\n }\n\n #if !defined(COGNITE_RENDER_COLOR_ID) && !defined(COGNITE_RENDER_DEPTH)\n if (R1 != R2)\n {\n // Find normal vector\n vec3 n = -normalize(W.xyz);\n vec3 P1 = v_centerB.xyz;\n vec3 P2 = v_centerA.xyz;\n vec3 A = cross(P1 - p, P2 - p);\n\n vec3 t = normalize(cross(n, A));\n vec3 o1 = P1 + R1 * t;\n vec3 o2 = P2 + R2 * t;\n vec3 B = o2-o1;\n normal = normalize(cross(A, B));\n }\n else\n {\n // Regular cylinder has simpler normal vector in camera space\n vec3 p_local = p - v_centerB.xyz;\n normal = normalize(p_local - W.xyz * dot(p_local, W.xyz));\n }\n #endif\n\n float fragDepth = updateFragmentDepth(p, projectionMatrix);\n updateFragmentColor(renderMode, color, v_treeIndex, normal, fragDepth, matCapTexture, GeometryType.Primitive);\n}\n'},function(e,t,n){"use strict";n.r(t),t.default="#define GLSLIFY 1\nvec3 mul3(mat4 M, vec3 v) {\n vec4 u = M * vec4(v, 1.0);\n return u.xyz / u.w;\n}\n\n// https://stackoverflow.com/questions/7059962/how-do-i-convert-a-vec4-rgba-value-to-a-float @ Arjan\nfloat unpackVec4ToFloat( vec4 packedFloat)\n{\n vec4 rgba = packedFloat;\n float sign = 1.0 - step(128.0, rgba.x) * 2.0;\n float exponent = 2.0 * mod(rgba.x, 128.0) + step(128.0, rgba.y) - 127.0;\n if (exponent == -127.0) return 0.0;\n float mantissa = mod(rgba.y, 128.0) * 65536.0 + rgba.z * 256.0 + rgba.w + 8388608.0;\n return sign * exp2(exponent - 23.0) * mantissa; \n}\n\nfloat unpackFloatFromRGBATexel(vec4 texel){\n float byteValueR = floor((texel.r * 255.0) + 0.5);\n float byteValueG = floor((texel.g * 255.0) + 0.5);\n float byteValueB = floor((texel.b * 255.0) + 0.5);\n float byteValueA = floor((texel.a * 255.0) + 0.5);\n\n return unpackVec4ToFloat(vec4(byteValueR, byteValueG, byteValueB, byteValueA));\n}\n\nmat4 determineMatrixOverride(\n float treeIndex, \n vec2 treeIndexTextureSize, \n sampler2D transformOverrideIndexTexture, \n vec2 transformOverrideTextureSize, \n sampler2D transformOverrideTexture\n) {\n\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = treeIndexTextureSize.x;\n float dataTextureHeight = treeIndexTextureSize.y;\n\n float xTreeIndexTextureCoord = mod(treeIndex, dataTextureWidth);\n float yTreeIndexTextureCoord = floor(treeIndex / dataTextureWidth);\n\n vec2 indexUV = vec2((xTreeIndexTextureCoord + 0.5) / dataTextureWidth, (yTreeIndexTextureCoord + 0.5) / dataTextureHeight);\n\n vec3 indexTexel = texture2D(transformOverrideIndexTexture, indexUV).rgb;\n\n float index = floor(indexTexel.r * 256.0) * 65536.0 + floor(indexTexel.g * 256.0) * 256.0 + floor(indexTexel.b * 256.0);\n \n \n if(index == 0.0){\n return mat4(\n 1.0, 0.0, 0.0, 0.0,\n 0.0, 1.0, 0.0, 0.0,\n 0.0, 0.0, 1.0, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n }\n\n index = index - 1.0;\n float overridesPerRow = transformOverrideTextureSize.x / 16.0;\n\n float xOverrideTextureCoord = mod(index, overridesPerRow);\n float yOverrideTextureCoord = floor(index / overridesPerRow);\n\n float cellWidth = 1.0 / transformOverrideTextureSize.x;\n float cellHeight = 1.0 / transformOverrideTextureSize.y;\n\n float overrideU = (xOverrideTextureCoord / overridesPerRow) + cellWidth / 2.0;\n float overrideV = (yOverrideTextureCoord / transformOverrideTextureSize.y) + cellHeight / 2.0;\n\n vec2 overrideUV = vec2(overrideU, overrideV); \n\n float matrixElements[12];\n\n for(int i = 0; i < 12; i++){\n matrixElements[i] = unpackFloatFromRGBATexel(texture2D(transformOverrideTexture, overrideUV + vec2(float(i) * cellWidth, 0.0)));\n }\n \n return mat4(\n matrixElements[0], matrixElements[4], matrixElements[8], 0,\n matrixElements[1], matrixElements[5], matrixElements[9], 0,\n matrixElements[2], matrixElements[6], matrixElements[10], 0,\n matrixElements[3], matrixElements[7], matrixElements[11], 1\n );\n}\n\nuniform mat4 inverseModelMatrix;\n\nin float a_treeIndex;\nin vec3 a_centerA;\nin vec3 a_centerB;\nin float a_radiusA;\nin float a_radiusB;\nin vec3 a_color;\n// segment ins\nin vec3 a_localXAxis;\nin float a_angle;\nin float a_arcAngle;\n\nout float v_treeIndex;\n// We pack the radii into w-components\nout vec4 v_centerB;\n\n// U, V, axis represent the 3x3 cone basis.\n// They are vec4 to pack extra data into the w-component\n// since Safari on iOS only supports 8 out vec4 registers.\nout vec4 v_U;\nout vec4 v_W;\n\nout vec4 v_centerA;\nout vec4 v_V;\n\nout float v_angle;\nout float v_arcAngle;\n\nout vec3 v_color;\nout vec3 v_normal;\n\nuniform vec2 treeIndexTextureSize;\n\nuniform sampler2D transformOverrideIndexTexture;\n\nuniform vec2 transformOverrideTextureSize; \nuniform sampler2D transformOverrideTexture;\n\nvoid main() {\n mat4 treeIndexWorldTransform = determineMatrixOverride(\n a_treeIndex, \n treeIndexTextureSize, \n transformOverrideIndexTexture, \n transformOverrideTextureSize, \n transformOverrideTexture\n );\n\n mat4 modelTransformOffset = inverseModelMatrix * treeIndexWorldTransform * modelMatrix;\n\n vec3 centerA = mul3(modelTransformOffset, a_centerA);\n vec3 centerB = mul3(modelTransformOffset, a_centerB);\n\n vec3 center = 0.5 * (centerA + centerB);\n float halfHeight = 0.5 * length(centerA - centerB);\n vec3 dir = normalize(centerA - centerB);\n vec3 newPosition = position;\n\n vec3 rayOrigin = (inverseModelMatrix * vec4(cameraPosition, 1.0)).xyz;\n vec3 objectToCameraModelSpace = rayOrigin - center;\n\n float maxRadius = max(a_radiusA, a_radiusB);\n float leftUpScale = maxRadius;\n\n vec3 lDir = dir;\n if (dot(objectToCameraModelSpace, dir) < 0.0) { // direction vector looks away, flip it\n lDir = -lDir;\n }\n\n vec3 left = normalize(cross(objectToCameraModelSpace, lDir));\n vec3 up = normalize(cross(left, lDir));\n\n#ifndef GL_EXT_frag_depth\n // make sure the billboard will not overlap with cap geometry (flickering effect), not important if we write to depth buffer\n newPosition.x *= 1.0 - (maxRadius * (position.x + 1.0) * 0.0025 / halfHeight);\n#endif\n\n vec3 surfacePoint = center + mat3(halfHeight*lDir, leftUpScale*left, leftUpScale*up) * newPosition;\n vec3 transformed = surfacePoint;\n surfacePoint = mul3(modelViewMatrix, surfacePoint);\n\n // out data\n v_treeIndex = a_treeIndex;\n v_angle = a_angle;\n v_arcAngle = a_arcAngle;\n\n // compute basis for cone\n v_W.xyz = dir;\n v_U.xyz = (modelTransformOffset * vec4(a_localXAxis, 0.0)).xyz;\n v_W.xyz = normalize(normalMatrix * v_W.xyz);\n v_U.xyz = normalize(normalMatrix * v_U.xyz);\n // We pack surfacePoint as w-components of U and W\n v_W.w = surfacePoint.z;\n v_U.w = surfacePoint.x;\n\n mat4 modelToTransformOffset = modelMatrix * modelTransformOffset;\n\n float radiusB = length((modelToTransformOffset * vec4(a_localXAxis * a_radiusB, 0.0)).xyz);\n float radiusA = length((modelToTransformOffset * vec4(a_localXAxis * a_radiusA, 0.0)).xyz);\n\n // We pack radii as w-components of v_centerB\n v_centerB.xyz = mul3(modelViewMatrix, centerB);\n v_centerB.w = radiusB;\n\n v_V.xyz = -cross(v_U.xyz, v_W.xyz);\n v_V.w = surfacePoint.y;\n\n v_centerA.xyz = mul3(modelViewMatrix, centerA);\n v_centerA.w = radiusA;\n\n v_color = a_color;\n v_normal = normalMatrix * normal;\n\n vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n\n gl_Position = projectionMatrix * mvPosition;\n}\n"},function(e,t,n){"use strict";n.r(t),t.default='#define GLSLIFY 1\nfloat displaceScalar(vec3 point, float scalar, \n float treeIndex, vec3 cameraPosition, mat4 inverseModelMatrix) {\n\n // Displaces a scalar based on distance to camera to avoid z-fighting\n vec3 cameraPositionModelSpace = (inverseModelMatrix * vec4(cameraPosition, 1.0)).xyz;\n vec3 pointToCamera = cameraPositionModelSpace - point;\n\n // "Random" number in the range [0, 1], based on treeIndex\n float rnd = mod(treeIndex, 64.) / 64.;\n // Compute distance to camera, but cap it\n float maxDistanceToCamera = 50.;\n float distanceToCamera = min(length(pointToCamera), maxDistanceToCamera);\n\n float maxDisplacement = 0.01;\n float scaleFactor = 0.01;\n float displacement = min(maxDisplacement, scaleFactor * rnd * distanceToCamera / maxDistanceToCamera);\n return scalar + displacement;\n}\n\nfloat computeFragmentDepth(vec3 p, mat4 projectionMatrix) {\n // Anders Hafreager comments:\n // Depth value can be calculated by transforming the z-component of the intersection point to projection space.\n // The w-component is also needed to scale projection space into clip space.\n // However, the 4th column of the projection matrix is (0, 0, const, 0), so we can exploit this when computing w-value.\n float projected_intersection_z=projectionMatrix[0][2]*p.x+projectionMatrix[1][2]*p.y+projectionMatrix[2][2]*p.z+projectionMatrix[3][2];\n\n // If we want to use orthographic camera, the full w-component is found as\n float projected_intersection_w=projectionMatrix[0][3]*p.x+projectionMatrix[1][3]*p.y+projectionMatrix[2][3]*p.z+projectionMatrix[3][3];\n // float projected_intersection_w = projectionMatrix[2][3]*newPoint.z; // Optimized for perspective camera\n return ((gl_DepthRange.diff * (projected_intersection_z / projected_intersection_w)) + gl_DepthRange.near + gl_DepthRange.far) * .5;\n}\n\n#if defined(gl_FragDepthEXT) || defined(GL_EXT_frag_depth) \n\nfloat updateFragmentDepth(vec3 p,mat4 projectionMatrix) {\n gl_FragDepthEXT = computeFragmentDepth(p, projectionMatrix);\n return gl_FragDepthEXT;\n}\n\n#else\n\nfloat updateFragmentDepth(vec3 p, mat4 projectionMatrix){\n // Extension not available - not much we can do.\n return computeFragmentDepth(p, projectionMatrix);\n}\n\n#endif\n\nstruct NodeAppearance {\n vec4 colorTexel;\n bool isVisible;\n bool renderInFront;\n bool renderGhosted;\n};\n\nfloat floatBitsSubset(float inNumber, int fromLeastSignificantBitIndex, int toMostSignificantBitIndex) {\n float r = float(fromLeastSignificantBitIndex);\n float l = float(toMostSignificantBitIndex);\n\n float bitShift = pow(2.0, r);\n return mod(((inNumber - mod(inNumber, bitShift)) / bitShift), pow(2.0, l - r));\n}\n\n/*\n\nExample:\n\nGet the value from bit 2 to 4 (not inclusive)\n\ninput:\ninNumber = 173 = 1010_1101 , from=2, to=4\n\nexpected output = 1010_|11|01 = 3\n\n1) subtract any bits in the least significant bit-subset\n\n mod(inNumber=173, pow(2.0, from=2)) = mod(inNumber, 4) = 1\n \n inNumber - 1 = 172\n\n2) bitshift such that we remove the least significant bit-subset\n this is guaranteed to be devisible since we subtracted the remainder\n\n (inNumber=172) / pow(2.0, from=2) = 172 / 4 = 43 = 0010_1011\n\n3) lastly, remove the most significant bit-subset\n\n mod((inNumber=43), pow(2.0, to=4 - from=2) = mod(43, 4)\n\n mod(43, 4) = 3\n\n or in binary notation: 0000_0011 which is the expected result.\n\n*/ \n\nNodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture, vec2 textureSize, float treeIndex) {\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = textureSize.x;\n float dataTextureHeight = textureSize.y;\n\n float u = mod(treeIndex, dataTextureWidth);\n float v = floor(treeIndex / dataTextureWidth);\n float uCoord = (u + 0.5) / dataTextureWidth;\n float vCoord = (v + 0.5) / dataTextureHeight;\n vec2 treeIndexUv = vec2(uCoord, vCoord);\n \n vec4 texel = texture2D(nodeAppearanceTexture, treeIndexUv);\n float alphaUnwrapped = floor((texel.a * 255.0) + 0.5);\n\n bool isVisible = floatBitsSubset(alphaUnwrapped, 0, 1) == 1.0;\n bool renderInFront = floatBitsSubset(alphaUnwrapped, 1, 2) == 1.0;\n bool renderGhosted = floatBitsSubset(alphaUnwrapped, 2, 3) == 1.0;\n\n return NodeAppearance(texel, isVisible, renderInFront, renderGhosted);\n}\n\nconst int RenderTypeColor_0 = 1;\nconst int RenderTypeNormal_0 = 2;\nconst int RenderTypeTreeIndex_0 = 3;\nconst int RenderTypePackColorAndNormal_0 = 4;\nconst int RenderTypeDepth_0 = 5;\nconst int RenderTypeEffects_0 = 6;\nconst int RenderTypeGhost_0 = 7;\n\nbool determineVisibility(NodeAppearance nodeAppearance, int renderMode) {\n return \n // In ghost mode\n ((renderMode == RenderTypeGhost_0) && nodeAppearance.isVisible && nodeAppearance.renderGhosted) ||\n // Not ghost mode\n ((renderMode != RenderTypeGhost_0) && \n !nodeAppearance.renderGhosted && nodeAppearance.isVisible && (nodeAppearance.renderInFront || renderMode != RenderTypeEffects_0));\n}\n\nvec4 determineColor(vec3 originalColor, NodeAppearance nodeAppearance) {\n vec4 overrideColor = nodeAppearance.colorTexel;\n if (any(greaterThan(overrideColor.rgb, vec3(0.0)))) {\n return overrideColor;\n }\n return vec4(originalColor.rgb, overrideColor.a);\n}\n\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\n/**\n * Packs the integer part of the number given to a RGB color.\n */\nvec3 packIntToColor(float number) {\n float r = floor(number / (255.0 * 255.0)) / 255.0;\n float g = mod(floor(number / 255.0), 255.0) / 255.0;\n float b = mod(number, 255.0) / 255.0;\n return vec3(r, g, b);\n}\n\nstruct GeometryTypeEnum {\n int Quad;\n int Primitive;\n int TriangleMesh;\n int InstancedMesh;\n};\n\nconst GeometryTypeEnum GeometryType = GeometryTypeEnum(1,2,3,4);\n\nconst int RenderTypeColor_1 = 1;\nconst int RenderTypeNormal_1 = 2;\nconst int RenderTypeTreeIndex_1 = 3;\nconst int RenderTypePackColorAndNormal_1 = 4;\nconst int RenderTypeDepth_1 = 5;\nconst int RenderTypeEffects_1 = 6;\nconst int RenderTypeGhost_1 = 7;\nconst int RenderTypeLOD = 8;\nconst int RenderTypeDepthBufferOnly = 9;\nconst int RenderTypeGeometryType = 10;\n\n#include <packing>\n\nout vec4 outputColor;\n\nvec3 packNormalToRgb( const in vec3 normal ) {\n return normalize( normal ) * 0.5 + 0.5;\n}\n\nvoid updateFragmentColor(\n int renderMode, vec4 color, float treeIndex, \n vec3 normal, float depth, sampler2D matCapTexture, \n int geometryType) {\n if (renderMode == RenderTypeColor_1 || renderMode == RenderTypeEffects_1) {\n vec3 hsv = rgb2hsv(color.rgb);\n hsv.z = min(0.5 * hsv.z + 0.5, 1.0);\n vec3 colorRGB = hsv2rgb(hsv);\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n vec4 albedo = vec4(colorRGB * (0.4 + 0.6 * amplitude), 1.0);\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec4 mc = vec4(texture2D(matCapTexture, cap).rgb, 1.0);\n \n outputColor = vec4(albedo.rgb * mc.rgb * 1.7, color.a);\n } else if (renderMode == RenderTypeGhost_1) {\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n float s = 0.4 + 0.6 * amplitude;\n outputColor = vec4(vec3(s), 0.3);\n } else if (renderMode == RenderTypeDepthBufferOnly) {\n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n } else if (renderMode == RenderTypePackColorAndNormal_1) {\n vec3 hsv = rgb2hsv(color.rgb);\n float a = 0.0;\n if (hsv.y > 0.01) {\n if (hsv.z > 0.5) {\n // light color\n a = (0.55 + hsv.x * 0.45);\n } else {\n // dark color\n a = (0.1 + hsv.x * 0.45);\n }\n } else {\n // no saturation - grayscale\n a = hsv.z * 0.09;\n }\n outputColor = vec4(packNormalToRgb(normal.rgb), a);\n } else if (renderMode == RenderTypeNormal_1) {\n outputColor = vec4(packNormalToRgb(normal), 1.0);\n } else if (renderMode == RenderTypeTreeIndex_1) {\n outputColor = vec4(packIntToColor(treeIndex), 1.0);\n } else if (renderMode == RenderTypeDepth_1) {\n outputColor = packDepthToRGBA(depth);\n } else if (renderMode == RenderTypeLOD) {\n bool isHighDetail = geometryType != GeometryType.Quad;\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture2D(matCapTexture, cap).rgb * 1.5;\n outputColor = isHighDetail ? vec4(vec3(0.0, 1.0, 0.0) * mc, color.a) : vec4(vec3(1.0, 1.0, 0.0) * mc, color.a);\n } else if (renderMode == RenderTypeGeometryType) {\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture2D(matCapTexture, cap).rgb * 1.5;\n vec3 geometryColor = \n float(geometryType == 1) * vec3(1.0, 0.0, 0.0) + // Quads\n float(geometryType == 2) * vec3(0.0, 1.0, 0.0) + // Primitives\n float(geometryType == 3) * vec3(0.0, 0.0, 1.0) + // Triangle meshes\n float(geometryType == 4) * vec3(1.0, 1.0, 0.0); // Instance meshes\n outputColor = vec4(geometryColor * mc, color.a);\n } else {\n // Unknown render mode - should not happen. \n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n }\n}\n\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\n\nbool isClipped(NodeAppearance nodeAppearance, vec3 point) {\n#if NUM_CLIPPING_PLANES > 0\n vec3 pointFlipped = -point;\n vec4 plane;\n\n for (int i = 0; i < UNION_CLIPPING_PLANES; i++) {\n plane = clippingPlanes[i];\n if (dot(pointFlipped, plane.xyz) > plane.w) return true;\n }\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n bool clipped = true;\n for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n clipped = (dot(pointFlipped, plane.xyz) > plane.w) && clipped;\n }\n if ( clipped ) return true;\n#endif\n#endif\n return false;\n}\n\n#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n\nuniform sampler2D colorDataTexture;\nuniform sampler2D overrideVisibilityPerTreeIndex;\nuniform sampler2D matCapTexture;\n\nuniform vec2 treeIndexTextureSize;\n\nuniform mat4 projectionMatrix;\n\nin vec4 U;\nin vec4 V;\nin vec4 axis;\n\nin vec4 v_centerA;\nin vec4 v_centerB;\nin float height;\n\nin float v_treeIndex;\nin vec3 v_color;\nin vec3 v_normal;\n\nuniform int renderMode;\n\nvoid main() {\n NodeAppearance appearance = determineNodeAppearance(colorDataTexture, treeIndexTextureSize, v_treeIndex);\n if (!determineVisibility(appearance, renderMode)) {\n discard;\n }\n\n vec4 color = determineColor(v_color, appearance);\n vec3 normal = normalize( v_normal );\n mat3 basis = mat3(U.xyz, V.xyz, axis.xyz);\n vec3 surfacePoint = vec3(U.w, V.w, axis.w);\n vec3 rayTarget = surfacePoint;\n\n#if defined(COGNITE_ORTHOGRAPHIC_CAMERA)\n vec3 rayDirection = vec3(0.0, 0.0, -1.0);\n#else\n vec3 rayDirection = normalize(rayTarget); // rayOrigin is (0,0,0) in camera space\n#endif\n\n vec3 diff = rayTarget - v_centerA.xyz;\n vec3 E = diff * basis;\n float L = height;\n vec3 D = rayDirection * basis;\n\n float R1 = v_centerA.w;\n float R2 = v_centerB.w;\n float dR = R2 - R1;\n\n float a = dot(D.xy, D.xy);\n float b = dot(E.xy, D.xy);\n float c = dot(E.xy, E.xy)-R1*R1;\n float L2Inv = 1.0/(L*L);\n\n if (R1 != R2) {\n // Additional terms if radii are different\n float dRLInv = dR/L;\n float dRdRL2Inv = dRLInv*dRLInv;\n a -= D.z*D.z*dRdRL2Inv;\n b -= dRLInv*(E.z*D.z*dRLInv + R1*D.z);\n c -= dRLInv*(E.z*E.z*dRLInv + 2.0*R1*E.z);\n }\n\n // Additional terms when one of the center points is displaced orthogonal to normal vector\n vec2 displacement = ((v_centerB.xyz-v_centerA.xyz)*basis).xy; // In the basis where displacement is in XY only\n float displacementLengthSquared = dot(displacement, displacement);\n a += D.z*(D.z*displacementLengthSquared - 2.0*L*dot(D.xy, displacement))*L2Inv;\n b += (D.z*E.z*displacementLengthSquared - L*(D.x*E.z*displacement.x + D.y*E.z*displacement.y + D.z*E.x*displacement.x + D.z*E.y*displacement.y))*L2Inv;\n c += E.z*(E.z*displacementLengthSquared - 2.*L*dot(E.xy, displacement))*L2Inv;\n\n // Calculate a dicriminant of the above quadratic equation (factor 2 removed from all b-terms above)\n float d = b*b - a*c;\n\n // d < 0.0 means the ray hits outside an infinitely long eccentric cone\n if (d < 0.0) {\n discard;\n }\n float sqrtd = sqrt(d);\n float dist1 = (-b - sqrtd)/a;\n float dist2 = (-b + sqrtd)/a;\n\n // Make sure dist1 is the smaller one\n if (dist2 < dist1) {\n float tmp = dist1;\n dist1 = dist2;\n dist2 = tmp;\n }\n\n // Check the smallest root, it is closest camera. Only test if the z-component is outside the truncated eccentric cone\n float dist = dist1;\n float intersectionPointZ = E.z + dist*D.z;\n // Intersection point in camera space\n vec3 p = rayTarget + dist*rayDirection;\n bool isInner = false;\n\n if (intersectionPointZ <= 0.0 ||\n intersectionPointZ >= L ||\n isClipped(appearance, p)\n ) {\n // Either intersection point is behind starting point (happens inside the cone),\n // or the intersection point is outside the end caps. This is not a valid solution.\n isInner = true;\n dist = dist2;\n intersectionPointZ = E.z + dist*D.z;\n p = rayTarget + dist*rayDirection;\n\n if (intersectionPointZ <= 0.0 ||\n intersectionPointZ >= L ||\n isClipped(appearance, p)\n ) {\n // Missed the other point too\n discard;\n }\n }\n\n#if !defined(COGNITE_RENDER_COLOR_ID) && !defined(COGNITE_RENDER_DEPTH)\n // Find normal vector\n vec3 n = normalize(-axis.xyz);\n vec3 v_centerA = v_centerA.xyz;\n vec3 v_centerB = v_centerB.xyz;\n vec3 A = cross(v_centerA - p, v_centerB - p);\n\n vec3 t = normalize(cross(n, A));\n vec3 o1 = v_centerA + R1 * t;\n vec3 o2 = v_centerB + R2 * t;\n vec3 B = o2-o1;\n normal = normalize(cross(A, B));\n#endif\n\n float fragDepth = updateFragmentDepth(p, projectionMatrix);\n updateFragmentColor(renderMode, color, v_treeIndex, normal, fragDepth, matCapTexture, GeometryType.Primitive);\n}\n'},function(e,t,n){"use strict";n.r(t),t.default="#define GLSLIFY 1\nvec3 mul3(mat4 M, vec3 v) {\n vec4 u = M * vec4(v, 1.0);\n return u.xyz / u.w;\n}\n\n// https://stackoverflow.com/questions/7059962/how-do-i-convert-a-vec4-rgba-value-to-a-float @ Arjan\nfloat unpackVec4ToFloat( vec4 packedFloat)\n{\n vec4 rgba = packedFloat;\n float sign = 1.0 - step(128.0, rgba.x) * 2.0;\n float exponent = 2.0 * mod(rgba.x, 128.0) + step(128.0, rgba.y) - 127.0;\n if (exponent == -127.0) return 0.0;\n float mantissa = mod(rgba.y, 128.0) * 65536.0 + rgba.z * 256.0 + rgba.w + 8388608.0;\n return sign * exp2(exponent - 23.0) * mantissa; \n}\n\nfloat unpackFloatFromRGBATexel(vec4 texel){\n float byteValueR = floor((texel.r * 255.0) + 0.5);\n float byteValueG = floor((texel.g * 255.0) + 0.5);\n float byteValueB = floor((texel.b * 255.0) + 0.5);\n float byteValueA = floor((texel.a * 255.0) + 0.5);\n\n return unpackVec4ToFloat(vec4(byteValueR, byteValueG, byteValueB, byteValueA));\n}\n\nmat4 determineMatrixOverride(\n float treeIndex, \n vec2 treeIndexTextureSize, \n sampler2D transformOverrideIndexTexture, \n vec2 transformOverrideTextureSize, \n sampler2D transformOverrideTexture\n) {\n\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = treeIndexTextureSize.x;\n float dataTextureHeight = treeIndexTextureSize.y;\n\n float xTreeIndexTextureCoord = mod(treeIndex, dataTextureWidth);\n float yTreeIndexTextureCoord = floor(treeIndex / dataTextureWidth);\n\n vec2 indexUV = vec2((xTreeIndexTextureCoord + 0.5) / dataTextureWidth, (yTreeIndexTextureCoord + 0.5) / dataTextureHeight);\n\n vec3 indexTexel = texture2D(transformOverrideIndexTexture, indexUV).rgb;\n\n float index = floor(indexTexel.r * 256.0) * 65536.0 + floor(indexTexel.g * 256.0) * 256.0 + floor(indexTexel.b * 256.0);\n \n \n if(index == 0.0){\n return mat4(\n 1.0, 0.0, 0.0, 0.0,\n 0.0, 1.0, 0.0, 0.0,\n 0.0, 0.0, 1.0, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n }\n\n index = index - 1.0;\n float overridesPerRow = transformOverrideTextureSize.x / 16.0;\n\n float xOverrideTextureCoord = mod(index, overridesPerRow);\n float yOverrideTextureCoord = floor(index / overridesPerRow);\n\n float cellWidth = 1.0 / transformOverrideTextureSize.x;\n float cellHeight = 1.0 / transformOverrideTextureSize.y;\n\n float overrideU = (xOverrideTextureCoord / overridesPerRow) + cellWidth / 2.0;\n float overrideV = (yOverrideTextureCoord / transformOverrideTextureSize.y) + cellHeight / 2.0;\n\n vec2 overrideUV = vec2(overrideU, overrideV); \n\n float matrixElements[12];\n\n for(int i = 0; i < 12; i++){\n matrixElements[i] = unpackFloatFromRGBATexel(texture2D(transformOverrideTexture, overrideUV + vec2(float(i) * cellWidth, 0.0)));\n }\n \n return mat4(\n matrixElements[0], matrixElements[4], matrixElements[8], 0,\n matrixElements[1], matrixElements[5], matrixElements[9], 0,\n matrixElements[2], matrixElements[6], matrixElements[10], 0,\n matrixElements[3], matrixElements[7], matrixElements[11], 1\n );\n}\n\nuniform mat4 inverseModelMatrix;\n\nin float a_treeIndex;\nin vec3 a_centerA;\nin vec3 a_centerB;\nin float a_radiusA;\nin float a_radiusB;\nin vec3 a_normal;\nin vec3 a_color;\n\nout float v_treeIndex;\n// We pack the radii into w-components\nout vec4 v_centerA;\nout vec4 v_centerB;\n\n// U, V, axis represent the 3x3 cone basis.\n// They are vec4 to pack extra data into the w-component\n// since Safari on iOS only supports 8 out vec4 registers.\nout vec4 U;\nout vec4 V;\nout vec4 axis;\nout float height;\n\nout vec3 v_color;\nout vec3 v_normal;\n\nuniform vec2 treeIndexTextureSize;\n\nuniform sampler2D transformOverrideIndexTexture;\n\nuniform vec2 transformOverrideTextureSize; \nuniform sampler2D transformOverrideTexture;\n\nvoid main() {\n\n mat4 treeIndexWorldTransform = determineMatrixOverride(\n a_treeIndex, \n treeIndexTextureSize, \n transformOverrideIndexTexture, \n transformOverrideTextureSize, \n transformOverrideTexture\n );\n\n mat4 modelTransformOffset = inverseModelMatrix * treeIndexWorldTransform * modelMatrix;\n mat4 modelToTransformOffset = modelMatrix * modelTransformOffset;\n\n vec3 centerA = mul3(modelTransformOffset, a_centerA);\n vec3 centerB = mul3(modelTransformOffset, a_centerB);\n\n vec3 normalWithOffset = normalize((modelTransformOffset * vec4(a_normal, 0)).xyz);\n\n float uniformScaleFactor = length(mul3(modelMatrix, normalize(vec3(1.0))));\n\n height = dot(centerA - centerB, normalWithOffset) * uniformScaleFactor;\n\n vec3 lDir;\n vec3 center = 0.5 * (centerA + centerB);\n vec3 newPosition = position;\n\n vec3 rayOrigin = (inverseModelMatrix * vec4(cameraPosition, 1.0)).xyz;\n vec3 objectToCameraModelSpace = rayOrigin - center;\n\n // Find the coordinates of centerA and centerB projected down to the end cap plane\n vec3 maxCenterProjected = centerA - dot(centerA, normalWithOffset) * normalWithOffset;\n vec3 minCenterProjected = centerB - dot(centerB, normalWithOffset) * normalWithOffset;\n float distanceBetweenProjectedCenters = length(maxCenterProjected - minCenterProjected);\n\n lDir = normalWithOffset;\n float dirSign = 1.0;\n if (dot(objectToCameraModelSpace, lDir) < 0.0) { // direction vector looks away, flip it\n dirSign = -1.0;\n lDir *= -1.;\n }\n\n vec3 left = normalize(cross(objectToCameraModelSpace, lDir));\n vec3 up = normalize(cross(left, lDir));\n\n // compute basis for cone\n axis.xyz = -normalWithOffset;\n U.xyz = cross(objectToCameraModelSpace, axis.xyz);\n V.xyz = cross(U.xyz, axis.xyz);\n // Transform to camera space\n axis.xyz = normalize(normalMatrix * axis.xyz);\n U.xyz = normalize(normalMatrix * U.xyz);\n V.xyz = normalize(normalMatrix * V.xyz);\n\n#ifndef GL_EXT_frag_depth\n // make sure the billboard will not overlap with cap geometry (flickering effect), not important if we write to depth buffer\n newPosition.x *= 1.0 - (a_radiusA * (position.x + 1.0) * 0.0025 / height);\n#endif\n\n v_centerA.xyz = mul3(viewMatrix, mul3(modelMatrix, centerA));\n v_centerB.xyz = mul3(viewMatrix, mul3(modelMatrix, centerB));\n\n float radiusA = length((modelToTransformOffset * vec4(normalize(vec3(1.0)) * a_radiusA, 0.0)).xyz);\n float radiusB = length((modelToTransformOffset * vec4(normalize(vec3(1.0)) * a_radiusB, 0.0)).xyz);\n\n // Pack radii as w components of v_centerA and v_centerB\n v_centerA.w = radiusA;\n v_centerB.w = radiusB;\n\n float radiusIncludedDisplacement = 0.5*(2.0*max(a_radiusA, a_radiusB) + distanceBetweenProjectedCenters);\n vec3 surfacePoint = center + mat3(0.5 * height * lDir * (1.0 / uniformScaleFactor), radiusIncludedDisplacement*left, radiusIncludedDisplacement*up) * newPosition;\n vec3 transformed = surfacePoint;\n\n surfacePoint = mul3(modelViewMatrix, surfacePoint);\n\n // We pack surfacePoint as w-components of U, V and axis\n U.w = surfacePoint.x;\n V.w = surfacePoint.y;\n axis.w = surfacePoint.z;\n\n v_treeIndex = a_treeIndex;\n v_color = a_color;\n v_normal = normalMatrix * normal;\n\n vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n gl_Position = projectionMatrix * mvPosition;\n}\n"},function(e,t,n){"use strict";n.r(t),t.default="#define GLSLIFY 1\nfloat computeFragmentDepth(vec3 p, mat4 projectionMatrix) {\n // Anders Hafreager comments:\n // Depth value can be calculated by transforming the z-component of the intersection point to projection space.\n // The w-component is also needed to scale projection space into clip space.\n // However, the 4th column of the projection matrix is (0, 0, const, 0), so we can exploit this when computing w-value.\n float projected_intersection_z=projectionMatrix[0][2]*p.x+projectionMatrix[1][2]*p.y+projectionMatrix[2][2]*p.z+projectionMatrix[3][2];\n\n // If we want to use orthographic camera, the full w-component is found as\n float projected_intersection_w=projectionMatrix[0][3]*p.x+projectionMatrix[1][3]*p.y+projectionMatrix[2][3]*p.z+projectionMatrix[3][3];\n // float projected_intersection_w = projectionMatrix[2][3]*newPoint.z; // Optimized for perspective camera\n return ((gl_DepthRange.diff * (projected_intersection_z / projected_intersection_w)) + gl_DepthRange.near + gl_DepthRange.far) * .5;\n}\n\n#if defined(gl_FragDepthEXT) || defined(GL_EXT_frag_depth) \n\nfloat updateFragmentDepth(vec3 p,mat4 projectionMatrix) {\n gl_FragDepthEXT = computeFragmentDepth(p, projectionMatrix);\n return gl_FragDepthEXT;\n}\n\n#else\n\nfloat updateFragmentDepth(vec3 p, mat4 projectionMatrix){\n // Extension not available - not much we can do.\n return computeFragmentDepth(p, projectionMatrix);\n}\n\n#endif\n\nstruct NodeAppearance {\n vec4 colorTexel;\n bool isVisible;\n bool renderInFront;\n bool renderGhosted;\n};\n\nfloat floatBitsSubset(float inNumber, int fromLeastSignificantBitIndex, int toMostSignificantBitIndex) {\n float r = float(fromLeastSignificantBitIndex);\n float l = float(toMostSignificantBitIndex);\n\n float bitShift = pow(2.0, r);\n return mod(((inNumber - mod(inNumber, bitShift)) / bitShift), pow(2.0, l - r));\n}\n\n/*\n\nExample:\n\nGet the value from bit 2 to 4 (not inclusive)\n\ninput:\ninNumber = 173 = 1010_1101 , from=2, to=4\n\nexpected output = 1010_|11|01 = 3\n\n1) subtract any bits in the least significant bit-subset\n\n mod(inNumber=173, pow(2.0, from=2)) = mod(inNumber, 4) = 1\n \n inNumber - 1 = 172\n\n2) bitshift such that we remove the least significant bit-subset\n this is guaranteed to be devisible since we subtracted the remainder\n\n (inNumber=172) / pow(2.0, from=2) = 172 / 4 = 43 = 0010_1011\n\n3) lastly, remove the most significant bit-subset\n\n mod((inNumber=43), pow(2.0, to=4 - from=2) = mod(43, 4)\n\n mod(43, 4) = 3\n\n or in binary notation: 0000_0011 which is the expected result.\n\n*/ \n\nNodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture, vec2 textureSize, float treeIndex) {\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = textureSize.x;\n float dataTextureHeight = textureSize.y;\n\n float u = mod(treeIndex, dataTextureWidth);\n float v = floor(treeIndex / dataTextureWidth);\n float uCoord = (u + 0.5) / dataTextureWidth;\n float vCoord = (v + 0.5) / dataTextureHeight;\n vec2 treeIndexUv = vec2(uCoord, vCoord);\n \n vec4 texel = texture2D(nodeAppearanceTexture, treeIndexUv);\n float alphaUnwrapped = floor((texel.a * 255.0) + 0.5);\n\n bool isVisible = floatBitsSubset(alphaUnwrapped, 0, 1) == 1.0;\n bool renderInFront = floatBitsSubset(alphaUnwrapped, 1, 2) == 1.0;\n bool renderGhosted = floatBitsSubset(alphaUnwrapped, 2, 3) == 1.0;\n\n return NodeAppearance(texel, isVisible, renderInFront, renderGhosted);\n}\n\nconst int RenderTypeColor_0 = 1;\nconst int RenderTypeNormal_0 = 2;\nconst int RenderTypeTreeIndex_0 = 3;\nconst int RenderTypePackColorAndNormal_0 = 4;\nconst int RenderTypeDepth_0 = 5;\nconst int RenderTypeEffects_0 = 6;\nconst int RenderTypeGhost_0 = 7;\n\nbool determineVisibility(NodeAppearance nodeAppearance, int renderMode) {\n return \n // In ghost mode\n ((renderMode == RenderTypeGhost_0) && nodeAppearance.isVisible && nodeAppearance.renderGhosted) ||\n // Not ghost mode\n ((renderMode != RenderTypeGhost_0) && \n !nodeAppearance.renderGhosted && nodeAppearance.isVisible && (nodeAppearance.renderInFront || renderMode != RenderTypeEffects_0));\n}\n\nvec4 determineColor(vec3 originalColor, NodeAppearance nodeAppearance) {\n vec4 overrideColor = nodeAppearance.colorTexel;\n if (any(greaterThan(overrideColor.rgb, vec3(0.0)))) {\n return overrideColor;\n }\n return vec4(originalColor.rgb, overrideColor.a);\n}\n\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\n/**\n * Packs the integer part of the number given to a RGB color.\n */\nvec3 packIntToColor(float number) {\n float r = floor(number / (255.0 * 255.0)) / 255.0;\n float g = mod(floor(number / 255.0), 255.0) / 255.0;\n float b = mod(number, 255.0) / 255.0;\n return vec3(r, g, b);\n}\n\nstruct GeometryTypeEnum {\n int Quad;\n int Primitive;\n int TriangleMesh;\n int InstancedMesh;\n};\n\nconst GeometryTypeEnum GeometryType = GeometryTypeEnum(1,2,3,4);\n\nconst int RenderTypeColor_1 = 1;\nconst int RenderTypeNormal_1 = 2;\nconst int RenderTypeTreeIndex_1 = 3;\nconst int RenderTypePackColorAndNormal_1 = 4;\nconst int RenderTypeDepth_1 = 5;\nconst int RenderTypeEffects_1 = 6;\nconst int RenderTypeGhost_1 = 7;\nconst int RenderTypeLOD = 8;\nconst int RenderTypeDepthBufferOnly = 9;\nconst int RenderTypeGeometryType = 10;\n\n#include <packing>\n\nout vec4 outputColor;\n\nvec3 packNormalToRgb( const in vec3 normal ) {\n return normalize( normal ) * 0.5 + 0.5;\n}\n\nvoid updateFragmentColor(\n int renderMode, vec4 color, float treeIndex, \n vec3 normal, float depth, sampler2D matCapTexture, \n int geometryType) {\n if (renderMode == RenderTypeColor_1 || renderMode == RenderTypeEffects_1) {\n vec3 hsv = rgb2hsv(color.rgb);\n hsv.z = min(0.5 * hsv.z + 0.5, 1.0);\n vec3 colorRGB = hsv2rgb(hsv);\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n vec4 albedo = vec4(colorRGB * (0.4 + 0.6 * amplitude), 1.0);\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec4 mc = vec4(texture2D(matCapTexture, cap).rgb, 1.0);\n \n outputColor = vec4(albedo.rgb * mc.rgb * 1.7, color.a);\n } else if (renderMode == RenderTypeGhost_1) {\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n float s = 0.4 + 0.6 * amplitude;\n outputColor = vec4(vec3(s), 0.3);\n } else if (renderMode == RenderTypeDepthBufferOnly) {\n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n } else if (renderMode == RenderTypePackColorAndNormal_1) {\n vec3 hsv = rgb2hsv(color.rgb);\n float a = 0.0;\n if (hsv.y > 0.01) {\n if (hsv.z > 0.5) {\n // light color\n a = (0.55 + hsv.x * 0.45);\n } else {\n // dark color\n a = (0.1 + hsv.x * 0.45);\n }\n } else {\n // no saturation - grayscale\n a = hsv.z * 0.09;\n }\n outputColor = vec4(packNormalToRgb(normal.rgb), a);\n } else if (renderMode == RenderTypeNormal_1) {\n outputColor = vec4(packNormalToRgb(normal), 1.0);\n } else if (renderMode == RenderTypeTreeIndex_1) {\n outputColor = vec4(packIntToColor(treeIndex), 1.0);\n } else if (renderMode == RenderTypeDepth_1) {\n outputColor = packDepthToRGBA(depth);\n } else if (renderMode == RenderTypeLOD) {\n bool isHighDetail = geometryType != GeometryType.Quad;\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture2D(matCapTexture, cap).rgb * 1.5;\n outputColor = isHighDetail ? vec4(vec3(0.0, 1.0, 0.0) * mc, color.a) : vec4(vec3(1.0, 1.0, 0.0) * mc, color.a);\n } else if (renderMode == RenderTypeGeometryType) {\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture2D(matCapTexture, cap).rgb * 1.5;\n vec3 geometryColor = \n float(geometryType == 1) * vec3(1.0, 0.0, 0.0) + // Quads\n float(geometryType == 2) * vec3(0.0, 1.0, 0.0) + // Primitives\n float(geometryType == 3) * vec3(0.0, 0.0, 1.0) + // Triangle meshes\n float(geometryType == 4) * vec3(1.0, 1.0, 0.0); // Instance meshes\n outputColor = vec4(geometryColor * mc, color.a);\n } else {\n // Unknown render mode - should not happen. \n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n }\n}\n\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\n\nbool isClipped(NodeAppearance nodeAppearance, vec3 point) {\n#if NUM_CLIPPING_PLANES > 0\n vec3 pointFlipped = -point;\n vec4 plane;\n\n for (int i = 0; i < UNION_CLIPPING_PLANES; i++) {\n plane = clippingPlanes[i];\n if (dot(pointFlipped, plane.xyz) > plane.w) return true;\n }\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n bool clipped = true;\n for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n clipped = (dot(pointFlipped, plane.xyz) > plane.w) && clipped;\n }\n if ( clipped ) return true;\n#endif\n#endif\n return false;\n}\n\nuniform sampler2D colorDataTexture;\nuniform sampler2D overrideVisibilityPerTreeIndex;\nuniform sampler2D matCapTexture;\n\nuniform vec2 treeIndexTextureSize;\n\nuniform mat4 projectionMatrix;\nin vec4 center;\nin float hRadius;\nin float height;\n\nin vec4 U;\nin vec4 V;\nin vec4 sphereNormal;\n\nin float v_treeIndex;\nin vec3 v_color;\nin vec3 v_normal;\n\nuniform int renderMode;\n\nvoid main() {\n NodeAppearance appearance = determineNodeAppearance(colorDataTexture, treeIndexTextureSize, v_treeIndex);\n if (!determineVisibility(appearance, renderMode)) {\n discard;\n }\n\n vec4 color = determineColor(v_color, appearance);\n vec3 normal = normalize(sphereNormal.xyz);\n\n float vRadius = center.w;\n float ratio = vRadius / hRadius;\n mat3 basis = mat3(U.xyz, V.xyz, sphereNormal.xyz);\n mat3 scaledBasis = mat3(ratio * U.xyz, ratio * V.xyz, sphereNormal.xyz);\n vec3 surfacePoint = vec3(U.w, V.w, sphereNormal.w);\n vec3 rayTarget = surfacePoint;\n\n#if defined(COGNITE_ORTHOGRAPHIC_CAMERA)\n vec3 rayDirection = vec3(0.0, 0.0, -1.0);\n#else\n vec3 rayDirection = normalize(rayTarget); // rayOrigin is (0,0,0) in camera space\n#endif\n\n vec3 diff = rayTarget - center.xyz;\n vec3 E = diff * scaledBasis;\n vec3 D = rayDirection * scaledBasis;\n\n float a = dot(D, D);\n float b = dot(E, D);\n float c = dot(E, E) - vRadius*vRadius;\n\n // discriminant of sphere equation (factor 2 removed from b above)\n float d = b*b - a*c;\n if(d < 0.0)\n discard;\n\n float sqrtd = sqrt(d);\n float dist1 = (-b - sqrtd)/a;\n float dist2 = (-b + sqrtd)/a;\n\n // Make sure dist1 is the smaller one\n if (dist2 < dist1) {\n float tmp = dist1;\n dist1 = dist2;\n dist2 = tmp;\n }\n\n float dist = dist1;\n float intersectionPointZ = E.z + dist*D.z;\n // Intersection point in camera space\n vec3 p = rayTarget + dist*rayDirection;\n\n if (intersectionPointZ <= vRadius - height ||\n intersectionPointZ > vRadius ||\n isClipped(appearance, p)\n ) {\n // Missed the first point, check the other point\n\n dist = dist2;\n intersectionPointZ = E.z + dist*D.z;\n p = rayTarget + dist*rayDirection;\n if (intersectionPointZ <= vRadius - height ||\n intersectionPointZ > vRadius ||\n isClipped(appearance, p)\n ) {\n // Missed the other point too\n discard;\n }\n }\n\n#if !defined(COGNITE_RENDER_COLOR_ID) && !defined(COGNITE_RENDER_DEPTH)\n // Find normal vector in local space\n normal = vec3(p - center.xyz) * basis;\n normal.z = normal.z * (hRadius / vRadius) * (hRadius / vRadius);\n // Transform into camera space\n normal = normalize(basis * normal);\n if (dot(normal, rayDirection) > 0.) {\n normal = -normal;\n }\n#endif\n\n float fragDepth = updateFragmentDepth(p, projectionMatrix);\n updateFragmentColor(renderMode, color, v_treeIndex, normal, fragDepth, matCapTexture, GeometryType.Primitive);\n}\n"},function(e,t,n){"use strict";n.r(t),t.default='#define GLSLIFY 1\nvec3 mul3(mat4 M, vec3 v) {\n vec4 u = M * vec4(v, 1.0);\n return u.xyz / u.w;\n}\n\nfloat displaceScalar(vec3 point, float scalar, \n float treeIndex, vec3 cameraPosition, mat4 inverseModelMatrix) {\n\n // Displaces a scalar based on distance to camera to avoid z-fighting\n vec3 cameraPositionModelSpace = (inverseModelMatrix * vec4(cameraPosition, 1.0)).xyz;\n vec3 pointToCamera = cameraPositionModelSpace - point;\n\n // "Random" number in the range [0, 1], based on treeIndex\n float rnd = mod(treeIndex, 64.) / 64.;\n // Compute distance to camera, but cap it\n float maxDistanceToCamera = 50.;\n float distanceToCamera = min(length(pointToCamera), maxDistanceToCamera);\n\n float maxDisplacement = 0.01;\n float scaleFactor = 0.01;\n float displacement = min(maxDisplacement, scaleFactor * rnd * distanceToCamera / maxDistanceToCamera);\n return scalar + displacement;\n}\n\n// https://stackoverflow.com/questions/7059962/how-do-i-convert-a-vec4-rgba-value-to-a-float @ Arjan\nfloat unpackVec4ToFloat( vec4 packedFloat)\n{\n vec4 rgba = packedFloat;\n float sign = 1.0 - step(128.0, rgba.x) * 2.0;\n float exponent = 2.0 * mod(rgba.x, 128.0) + step(128.0, rgba.y) - 127.0;\n if (exponent == -127.0) return 0.0;\n float mantissa = mod(rgba.y, 128.0) * 65536.0 + rgba.z * 256.0 + rgba.w + 8388608.0;\n return sign * exp2(exponent - 23.0) * mantissa; \n}\n\nfloat unpackFloatFromRGBATexel(vec4 texel){\n float byteValueR = floor((texel.r * 255.0) + 0.5);\n float byteValueG = floor((texel.g * 255.0) + 0.5);\n float byteValueB = floor((texel.b * 255.0) + 0.5);\n float byteValueA = floor((texel.a * 255.0) + 0.5);\n\n return unpackVec4ToFloat(vec4(byteValueR, byteValueG, byteValueB, byteValueA));\n}\n\nmat4 determineMatrixOverride(\n float treeIndex, \n vec2 treeIndexTextureSize, \n sampler2D transformOverrideIndexTexture, \n vec2 transformOverrideTextureSize, \n sampler2D transformOverrideTexture\n) {\n\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = treeIndexTextureSize.x;\n float dataTextureHeight = treeIndexTextureSize.y;\n\n float xTreeIndexTextureCoord = mod(treeIndex, dataTextureWidth);\n float yTreeIndexTextureCoord = floor(treeIndex / dataTextureWidth);\n\n vec2 indexUV = vec2((xTreeIndexTextureCoord + 0.5) / dataTextureWidth, (yTreeIndexTextureCoord + 0.5) / dataTextureHeight);\n\n vec3 indexTexel = texture2D(transformOverrideIndexTexture, indexUV).rgb;\n\n float index = floor(indexTexel.r * 256.0) * 65536.0 + floor(indexTexel.g * 256.0) * 256.0 + floor(indexTexel.b * 256.0);\n \n \n if(index == 0.0){\n return mat4(\n 1.0, 0.0, 0.0, 0.0,\n 0.0, 1.0, 0.0, 0.0,\n 0.0, 0.0, 1.0, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n }\n\n index = index - 1.0;\n float overridesPerRow = transformOverrideTextureSize.x / 16.0;\n\n float xOverrideTextureCoord = mod(index, overridesPerRow);\n float yOverrideTextureCoord = floor(index / overridesPerRow);\n\n float cellWidth = 1.0 / transformOverrideTextureSize.x;\n float cellHeight = 1.0 / transformOverrideTextureSize.y;\n\n float overrideU = (xOverrideTextureCoord / overridesPerRow) + cellWidth / 2.0;\n float overrideV = (yOverrideTextureCoord / transformOverrideTextureSize.y) + cellHeight / 2.0;\n\n vec2 overrideUV = vec2(overrideU, overrideV); \n\n float matrixElements[12];\n\n for(int i = 0; i < 12; i++){\n matrixElements[i] = unpackFloatFromRGBATexel(texture2D(transformOverrideTexture, overrideUV + vec2(float(i) * cellWidth, 0.0)));\n }\n \n return mat4(\n matrixElements[0], matrixElements[4], matrixElements[8], 0,\n matrixElements[1], matrixElements[5], matrixElements[9], 0,\n matrixElements[2], matrixElements[6], matrixElements[10], 0,\n matrixElements[3], matrixElements[7], matrixElements[11], 1\n );\n}\n\nuniform mat4 inverseModelMatrix;\nuniform mat4 inverseNormalMatrix;\n\nin float a_treeIndex;\nin vec3 a_color;\nin vec3 a_center;\nin vec3 a_normal;\nin float a_horizontalRadius;\nin float a_verticalRadius;\nin float a_height;\n\nout float v_treeIndex;\n// We pack vRadius as w-component of center\nout vec4 center;\nout float hRadius;\nout float height;\n\n// U, V, axis represent the 3x3 sphere basis.\n// They are vec4 to pack extra data into the w-component\n// since Safari on iOS only supports 8 out vec4 registers.\nout vec4 U;\nout vec4 V;\nout vec4 sphereNormal;\n\nout vec3 v_color;\nout vec3 v_normal;\n\nuniform vec2 treeIndexTextureSize;\n\nuniform sampler2D transformOverrideIndexTexture;\n\nuniform vec2 transformOverrideTextureSize; \nuniform sampler2D transformOverrideTexture;\n\nvoid main() {\n\n mat4 treeIndexWorldTransform = determineMatrixOverride(\n a_treeIndex, \n treeIndexTextureSize, \n transformOverrideIndexTexture, \n transformOverrideTextureSize, \n transformOverrideTexture\n );\n\n mat4 modelTransformOffset = inverseModelMatrix * treeIndexWorldTransform * modelMatrix;\n\n vec3 centerWithOffset = mul3(modelTransformOffset, a_center).xyz;\n\n vec3 normalWithOffset = (modelTransformOffset * vec4(a_normal, 0)).xyz;\n\n vec3 lDir;\n float distanceToCenterOfSegment = a_verticalRadius - a_height * 0.5;\n vec3 centerOfSegment = centerWithOffset + normalWithOffset * distanceToCenterOfSegment;\n\n#if defined(COGNITE_ORTHOGRAPHIC_CAMERA)\n vec3 objectToCameraModelSpace = inverseNormalMatrix * vec3(0.0, 0.0, 1.0);\n#else\n vec3 rayOrigin = (inverseModelMatrix * vec4(cameraPosition, 1.0)).xyz;\n vec3 objectToCameraModelSpace = rayOrigin - centerOfSegment;\n#endif\n\n vec3 newPosition = position;\n\n float bb = dot(objectToCameraModelSpace, normalWithOffset);\n if (bb < 0.0) { // direction vector looks away, flip it\n lDir = -normalWithOffset;\n } else { // direction vector already looks in my direction\n lDir = normalWithOffset;\n }\n\n vec3 left = normalize(cross(objectToCameraModelSpace, lDir));\n vec3 up = normalize(cross(left, lDir));\n\n#ifndef GL_EXT_frag_depth\n // make sure the billboard will not overlap with cap geometry (flickering effect), not important if we write to depth buffer\n newPosition.x *= 1.0 - (a_verticalRadius * (position.x + 1.0) * 0.0025 / a_height);\n#endif\n\n // Negative angle means height larger than radius,\n // so we should have full size so we can render the largest part of the ellipsoid segment\n float ratio = max(0.0, 1.0 - a_height / a_verticalRadius);\n // maxRadiusOfSegment is the radius of the circle (projected ellipsoid) when ellipsoid segment is seen from above\n float maxRadiusOfSegment = a_horizontalRadius * sqrt(1.0 - ratio * ratio);\n\n vec3 displacement = vec3(newPosition.x*a_height*0.5, maxRadiusOfSegment*newPosition.y, maxRadiusOfSegment*newPosition.z);\n vec3 surfacePoint = centerOfSegment + mat3(lDir, left, up) * displacement;\n vec3 transformed = surfacePoint;\n\n v_treeIndex = a_treeIndex;\n surfacePoint = mul3(modelViewMatrix, surfacePoint);\n center.xyz = mul3(modelViewMatrix, centerWithOffset);\n center.w = a_verticalRadius; // Pack radius into w-component\n hRadius = a_horizontalRadius;\n height = a_height;\n v_color = a_color;\n\n // compute basis\n sphereNormal.xyz = normalMatrix * normalWithOffset;\n U.xyz = normalMatrix * up;\n V.xyz = normalMatrix * left;\n\n // We pack surfacePoint as w-components of U, V and axis\n U.w = surfacePoint.x;\n V.w = surfacePoint.y;\n sphereNormal.w = surfacePoint.z;\n\n // TODO should perhaps be a different normal?\n vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n gl_Position = projectionMatrix * mvPosition;\n}\n'},function(e,t,n){"use strict";n.r(t),t.default='precision highp float;\n#define GLSLIFY 1\n\n#define texture2D texture\n#define gl_FragDepthEXT gl_FragDepth \n\nvec3 mul3(mat4 M, vec3 v) {\n vec4 u = M * vec4(v, 1.0);\n return u.xyz / u.w;\n}\n\nfloat displaceScalar(vec3 point, float scalar, \n float treeIndex, vec3 cameraPosition, mat4 inverseModelMatrix) {\n\n // Displaces a scalar based on distance to camera to avoid z-fighting\n vec3 cameraPositionModelSpace = (inverseModelMatrix * vec4(cameraPosition, 1.0)).xyz;\n vec3 pointToCamera = cameraPositionModelSpace - point;\n\n // "Random" number in the range [0, 1], based on treeIndex\n float rnd = mod(treeIndex, 64.) / 64.;\n // Compute distance to camera, but cap it\n float maxDistanceToCamera = 50.;\n float distanceToCamera = min(length(pointToCamera), maxDistanceToCamera);\n\n float maxDisplacement = 0.01;\n float scaleFactor = 0.01;\n float displacement = min(maxDisplacement, scaleFactor * rnd * distanceToCamera / maxDistanceToCamera);\n return scalar + displacement;\n}\n\nfloat computeFragmentDepth(vec3 p, mat4 projectionMatrix) {\n // Anders Hafreager comments:\n // Depth value can be calculated by transforming the z-component of the intersection point to projection space.\n // The w-component is also needed to scale projection space into clip space.\n // However, the 4th column of the projection matrix is (0, 0, const, 0), so we can exploit this when computing w-value.\n float projected_intersection_z=projectionMatrix[0][2]*p.x+projectionMatrix[1][2]*p.y+projectionMatrix[2][2]*p.z+projectionMatrix[3][2];\n\n // If we want to use orthographic camera, the full w-component is found as\n float projected_intersection_w=projectionMatrix[0][3]*p.x+projectionMatrix[1][3]*p.y+projectionMatrix[2][3]*p.z+projectionMatrix[3][3];\n // float projected_intersection_w = projectionMatrix[2][3]*newPoint.z; // Optimized for perspective camera\n return ((gl_DepthRange.diff * (projected_intersection_z / projected_intersection_w)) + gl_DepthRange.near + gl_DepthRange.far) * .5;\n}\n\n#if defined(gl_FragDepthEXT) || defined(GL_EXT_frag_depth) \n\nfloat updateFragmentDepth(vec3 p,mat4 projectionMatrix) {\n gl_FragDepthEXT = computeFragmentDepth(p, projectionMatrix);\n return gl_FragDepthEXT;\n}\n\n#else\n\nfloat updateFragmentDepth(vec3 p, mat4 projectionMatrix){\n // Extension not available - not much we can do.\n return computeFragmentDepth(p, projectionMatrix);\n}\n\n#endif\n\nstruct NodeAppearance {\n vec4 colorTexel;\n bool isVisible;\n bool renderInFront;\n bool renderGhosted;\n};\n\nfloat floatBitsSubset(float inNumber, int fromLeastSignificantBitIndex, int toMostSignificantBitIndex) {\n float r = float(fromLeastSignificantBitIndex);\n float l = float(toMostSignificantBitIndex);\n\n float bitShift = pow(2.0, r);\n return mod(((inNumber - mod(inNumber, bitShift)) / bitShift), pow(2.0, l - r));\n}\n\n/*\n\nExample:\n\nGet the value from bit 2 to 4 (not inclusive)\n\ninput:\ninNumber = 173 = 1010_1101 , from=2, to=4\n\nexpected output = 1010_|11|01 = 3\n\n1) subtract any bits in the least significant bit-subset\n\n mod(inNumber=173, pow(2.0, from=2)) = mod(inNumber, 4) = 1\n \n inNumber - 1 = 172\n\n2) bitshift such that we remove the least significant bit-subset\n this is guaranteed to be devisible since we subtracted the remainder\n\n (inNumber=172) / pow(2.0, from=2) = 172 / 4 = 43 = 0010_1011\n\n3) lastly, remove the most significant bit-subset\n\n mod((inNumber=43), pow(2.0, to=4 - from=2) = mod(43, 4)\n\n mod(43, 4) = 3\n\n or in binary notation: 0000_0011 which is the expected result.\n\n*/ \n\nNodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture, vec2 textureSize, float treeIndex) {\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = textureSize.x;\n float dataTextureHeight = textureSize.y;\n\n float u = mod(treeIndex, dataTextureWidth);\n float v = floor(treeIndex / dataTextureWidth);\n float uCoord = (u + 0.5) / dataTextureWidth;\n float vCoord = (v + 0.5) / dataTextureHeight;\n vec2 treeIndexUv = vec2(uCoord, vCoord);\n \n vec4 texel = texture2D(nodeAppearanceTexture, treeIndexUv);\n float alphaUnwrapped = floor((texel.a * 255.0) + 0.5);\n\n bool isVisible = floatBitsSubset(alphaUnwrapped, 0, 1) == 1.0;\n bool renderInFront = floatBitsSubset(alphaUnwrapped, 1, 2) == 1.0;\n bool renderGhosted = floatBitsSubset(alphaUnwrapped, 2, 3) == 1.0;\n\n return NodeAppearance(texel, isVisible, renderInFront, renderGhosted);\n}\n\nconst int RenderTypeColor_0 = 1;\nconst int RenderTypeNormal_0 = 2;\nconst int RenderTypeTreeIndex_0 = 3;\nconst int RenderTypePackColorAndNormal_0 = 4;\nconst int RenderTypeDepth_0 = 5;\nconst int RenderTypeEffects_0 = 6;\nconst int RenderTypeGhost_0 = 7;\n\nbool determineVisibility(NodeAppearance nodeAppearance, int renderMode) {\n return \n // In ghost mode\n ((renderMode == RenderTypeGhost_0) && nodeAppearance.isVisible && nodeAppearance.renderGhosted) ||\n // Not ghost mode\n ((renderMode != RenderTypeGhost_0) && \n !nodeAppearance.renderGhosted && nodeAppearance.isVisible && (nodeAppearance.renderInFront || renderMode != RenderTypeEffects_0));\n}\n\nvec4 determineColor(vec3 originalColor, NodeAppearance nodeAppearance) {\n vec4 overrideColor = nodeAppearance.colorTexel;\n if (any(greaterThan(overrideColor.rgb, vec3(0.0)))) {\n return overrideColor;\n }\n return vec4(originalColor.rgb, overrideColor.a);\n}\n\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\n/**\n * Packs the integer part of the number given to a RGB color.\n */\nvec3 packIntToColor(float number) {\n float r = floor(number / (255.0 * 255.0)) / 255.0;\n float g = mod(floor(number / 255.0), 255.0) / 255.0;\n float b = mod(number, 255.0) / 255.0;\n return vec3(r, g, b);\n}\n\nstruct GeometryTypeEnum {\n int Quad;\n int Primitive;\n int TriangleMesh;\n int InstancedMesh;\n};\n\nconst GeometryTypeEnum GeometryType = GeometryTypeEnum(1,2,3,4);\n\nconst int RenderTypeColor_1 = 1;\nconst int RenderTypeNormal_1 = 2;\nconst int RenderTypeTreeIndex_1 = 3;\nconst int RenderTypePackColorAndNormal_1 = 4;\nconst int RenderTypeDepth_1 = 5;\nconst int RenderTypeEffects_1 = 6;\nconst int RenderTypeGhost_1 = 7;\nconst int RenderTypeLOD = 8;\nconst int RenderTypeDepthBufferOnly = 9;\nconst int RenderTypeGeometryType = 10;\n\n#include <packing>\n\nout vec4 outputColor;\n\nvec3 packNormalToRgb( const in vec3 normal ) {\n return normalize( normal ) * 0.5 + 0.5;\n}\n\nvoid updateFragmentColor(\n int renderMode, vec4 color, float treeIndex, \n vec3 normal, float depth, sampler2D matCapTexture, \n int geometryType) {\n if (renderMode == RenderTypeColor_1 || renderMode == RenderTypeEffects_1) {\n vec3 hsv = rgb2hsv(color.rgb);\n hsv.z = min(0.5 * hsv.z + 0.5, 1.0);\n vec3 colorRGB = hsv2rgb(hsv);\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n vec4 albedo = vec4(colorRGB * (0.4 + 0.6 * amplitude), 1.0);\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec4 mc = vec4(texture2D(matCapTexture, cap).rgb, 1.0);\n \n outputColor = vec4(albedo.rgb * mc.rgb * 1.7, color.a);\n } else if (renderMode == RenderTypeGhost_1) {\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n float s = 0.4 + 0.6 * amplitude;\n outputColor = vec4(vec3(s), 0.3);\n } else if (renderMode == RenderTypeDepthBufferOnly) {\n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n } else if (renderMode == RenderTypePackColorAndNormal_1) {\n vec3 hsv = rgb2hsv(color.rgb);\n float a = 0.0;\n if (hsv.y > 0.01) {\n if (hsv.z > 0.5) {\n // light color\n a = (0.55 + hsv.x * 0.45);\n } else {\n // dark color\n a = (0.1 + hsv.x * 0.45);\n }\n } else {\n // no saturation - grayscale\n a = hsv.z * 0.09;\n }\n outputColor = vec4(packNormalToRgb(normal.rgb), a);\n } else if (renderMode == RenderTypeNormal_1) {\n outputColor = vec4(packNormalToRgb(normal), 1.0);\n } else if (renderMode == RenderTypeTreeIndex_1) {\n outputColor = vec4(packIntToColor(treeIndex), 1.0);\n } else if (renderMode == RenderTypeDepth_1) {\n outputColor = packDepthToRGBA(depth);\n } else if (renderMode == RenderTypeLOD) {\n bool isHighDetail = geometryType != GeometryType.Quad;\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture2D(matCapTexture, cap).rgb * 1.5;\n outputColor = isHighDetail ? vec4(vec3(0.0, 1.0, 0.0) * mc, color.a) : vec4(vec3(1.0, 1.0, 0.0) * mc, color.a);\n } else if (renderMode == RenderTypeGeometryType) {\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture2D(matCapTexture, cap).rgb * 1.5;\n vec3 geometryColor = \n float(geometryType == 1) * vec3(1.0, 0.0, 0.0) + // Quads\n float(geometryType == 2) * vec3(0.0, 1.0, 0.0) + // Primitives\n float(geometryType == 3) * vec3(0.0, 0.0, 1.0) + // Triangle meshes\n float(geometryType == 4) * vec3(1.0, 1.0, 0.0); // Instance meshes\n outputColor = vec4(geometryColor * mc, color.a);\n } else {\n // Unknown render mode - should not happen. \n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n }\n}\n\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\n\nbool isClipped(NodeAppearance nodeAppearance, vec3 point) {\n#if NUM_CLIPPING_PLANES > 0\n vec3 pointFlipped = -point;\n vec4 plane;\n\n for (int i = 0; i < UNION_CLIPPING_PLANES; i++) {\n plane = clippingPlanes[i];\n if (dot(pointFlipped, plane.xyz) > plane.w) return true;\n }\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n bool clipped = true;\n for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n clipped = (dot(pointFlipped, plane.xyz) > plane.w) && clipped;\n }\n if ( clipped ) return true;\n#endif\n#endif\n return false;\n}\n\n#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n\n// TODO general cylinder and cone are very similar and used\n// the same shader in the old code. Consider de-duplicating\n// parts of this code\n\nuniform sampler2D colorDataTexture;\nuniform sampler2D overrideVisibilityPerTreeIndex;\nuniform sampler2D matCapTexture;\n\nuniform vec2 treeIndexTextureSize;\n\nuniform float dataTextureWidth;\nuniform float dataTextureHeight;\nuniform mat4 projectionMatrix;\n\nin vec4 v_centerB;\n\nin vec4 v_W;\nin vec4 v_U;\n\nin float v_angle;\nin float v_arcAngle;\n\nin float v_surfacePointY;\n\nin vec4 v_planeA;\nin vec4 v_planeB;\n\nin float v_treeIndex;\n\nin vec3 v_color;\n\nin vec3 v_normal;\n\nuniform int renderMode;\n\nvoid main() {\n NodeAppearance appearance = determineNodeAppearance(colorDataTexture, treeIndexTextureSize, v_treeIndex);\n if (!determineVisibility(appearance, renderMode)) {\n discard;\n }\n\n vec4 color = determineColor(v_color, appearance); \n vec3 normal = normalize( v_normal );\n\n float R1 = v_centerB.w;\n vec4 U = v_U;\n vec4 W = v_W;\n vec4 V = vec4(normalize(cross(W.xyz, U.xyz)), v_surfacePointY);\n\n mat3 basis = mat3(U.xyz, V.xyz, W.xyz);\n vec3 surfacePoint = vec3(U.w, V.w, W.w);\n vec3 rayTarget = surfacePoint;\n\n#if defined(COGNITE_ORTHOGRAPHIC_CAMERA)\n vec3 rayDirection = vec3(0.0, 0.0, -1.0);\n#else\n vec3 rayDirection = normalize(rayTarget); // rayOrigin is (0,0,0) in camera space\n#endif\n\n vec3 diff = rayTarget - v_centerB.xyz;\n vec3 E = diff * basis;\n vec3 D = rayDirection * basis;\n\n float a = dot(D.xy, D.xy);\n float b = dot(E.xy, D.xy);\n float c = dot(E.xy, E.xy) - R1*R1;\n\n // Calculate a dicriminant of the above quadratic equation\n float d = b*b - a*c;\n\n // d < 0.0 means the ray hits outside an infinitely long cone\n if (d < 0.0)\n discard;\n\n float sqrtd = sqrt(d);\n float dist1 = (-b - sqrtd)/a;\n float dist2 = (-b + sqrtd)/a;\n\n // Make sure dist1 is the smaller one\n if (dist2 < dist1) {\n float tmp = dist1;\n dist1 = dist2;\n dist2 = tmp;\n }\n\n float dist = dist1;\n vec3 intersectionPoint = E + dist * D;\n float theta = atan(intersectionPoint.y, intersectionPoint.x);\n if (theta < v_angle) theta += 2.0 * PI;\n\n // Intersection point in camera space\n vec3 p = rayTarget + dist*rayDirection;\n\n vec3 planeACenter = vec3(0.0, 0.0, v_planeA.w);\n vec3 planeANormal = v_planeA.xyz;\n vec3 planeBCenter = vec3(0.0, 0.0, v_planeB.w);\n vec3 planeBNormal = v_planeB.xyz;\n bool isInner = false;\n\n if (dot(intersectionPoint - planeACenter, planeANormal) > 0.0 ||\n dot(intersectionPoint - planeBCenter, planeBNormal) > 0.0 ||\n theta > v_arcAngle + v_angle ||\n isClipped(appearance, p)\n ) {\n // Missed the first point, check the other point\n isInner = true;\n dist = dist2;\n intersectionPoint = E + dist * D;\n theta = atan(intersectionPoint.y, intersectionPoint.x);\n p = rayTarget + dist*rayDirection;\n if (theta < v_angle) theta += 2.0 * PI;\n if (dot(intersectionPoint - planeACenter, planeANormal) > 0.0 ||\n dot(intersectionPoint - planeBCenter, planeBNormal) > 0.0 ||\n theta > v_arcAngle + v_angle || isClipped(appearance, p)\n ) {\n // Missed the other point too\n discard;\n }\n }\n\n#if !defined(COGNITE_RENDER_COLOR_ID) && !defined(COGNITE_RENDER_DEPTH)\n // Regular cylinder has simpler normal vector in camera space\n vec3 p_local = p - v_centerB.xyz;\n normal = normalize(p_local - W.xyz * dot(p_local, W.xyz));\n#endif\n\n float fragDepth = updateFragmentDepth(p, projectionMatrix);\n updateFragmentColor(renderMode, color, v_treeIndex, normal, fragDepth, matCapTexture, GeometryType.Primitive);\n}\n'},function(e,t,n){"use strict";n.r(t),t.default="#define GLSLIFY 1\n#define texture2D texture\n\nvec3 mul3(mat4 M, vec3 v) {\n vec4 u = M * vec4(v, 1.0);\n return u.xyz / u.w;\n}\n\n// https://stackoverflow.com/questions/7059962/how-do-i-convert-a-vec4-rgba-value-to-a-float @ Arjan\nfloat unpackVec4ToFloat( vec4 packedFloat)\n{\n vec4 rgba = packedFloat;\n float sign = 1.0 - step(128.0, rgba.x) * 2.0;\n float exponent = 2.0 * mod(rgba.x, 128.0) + step(128.0, rgba.y) - 127.0;\n if (exponent == -127.0) return 0.0;\n float mantissa = mod(rgba.y, 128.0) * 65536.0 + rgba.z * 256.0 + rgba.w + 8388608.0;\n return sign * exp2(exponent - 23.0) * mantissa; \n}\n\nfloat unpackFloatFromRGBATexel(vec4 texel){\n float byteValueR = floor((texel.r * 255.0) + 0.5);\n float byteValueG = floor((texel.g * 255.0) + 0.5);\n float byteValueB = floor((texel.b * 255.0) + 0.5);\n float byteValueA = floor((texel.a * 255.0) + 0.5);\n\n return unpackVec4ToFloat(vec4(byteValueR, byteValueG, byteValueB, byteValueA));\n}\n\nmat4 determineMatrixOverride(\n float treeIndex, \n vec2 treeIndexTextureSize, \n sampler2D transformOverrideIndexTexture, \n vec2 transformOverrideTextureSize, \n sampler2D transformOverrideTexture\n) {\n\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = treeIndexTextureSize.x;\n float dataTextureHeight = treeIndexTextureSize.y;\n\n float xTreeIndexTextureCoord = mod(treeIndex, dataTextureWidth);\n float yTreeIndexTextureCoord = floor(treeIndex / dataTextureWidth);\n\n vec2 indexUV = vec2((xTreeIndexTextureCoord + 0.5) / dataTextureWidth, (yTreeIndexTextureCoord + 0.5) / dataTextureHeight);\n\n vec3 indexTexel = texture2D(transformOverrideIndexTexture, indexUV).rgb;\n\n float index = floor(indexTexel.r * 256.0) * 65536.0 + floor(indexTexel.g * 256.0) * 256.0 + floor(indexTexel.b * 256.0);\n \n \n if(index == 0.0){\n return mat4(\n 1.0, 0.0, 0.0, 0.0,\n 0.0, 1.0, 0.0, 0.0,\n 0.0, 0.0, 1.0, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n }\n\n index = index - 1.0;\n float overridesPerRow = transformOverrideTextureSize.x / 16.0;\n\n float xOverrideTextureCoord = mod(index, overridesPerRow);\n float yOverrideTextureCoord = floor(index / overridesPerRow);\n\n float cellWidth = 1.0 / transformOverrideTextureSize.x;\n float cellHeight = 1.0 / transformOverrideTextureSize.y;\n\n float overrideU = (xOverrideTextureCoord / overridesPerRow) + cellWidth / 2.0;\n float overrideV = (yOverrideTextureCoord / transformOverrideTextureSize.y) + cellHeight / 2.0;\n\n vec2 overrideUV = vec2(overrideU, overrideV); \n\n float matrixElements[12];\n\n for(int i = 0; i < 12; i++){\n matrixElements[i] = unpackFloatFromRGBATexel(texture2D(transformOverrideTexture, overrideUV + vec2(float(i) * cellWidth, 0.0)));\n }\n \n return mat4(\n matrixElements[0], matrixElements[4], matrixElements[8], 0,\n matrixElements[1], matrixElements[5], matrixElements[9], 0,\n matrixElements[2], matrixElements[6], matrixElements[10], 0,\n matrixElements[3], matrixElements[7], matrixElements[11], 1\n );\n}\n\nuniform mat4 inverseModelMatrix;\nuniform mat4 modelMatrix;\nuniform mat4 viewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat3 normalMatrix;\nuniform vec3 cameraPosition;\n\nin vec3 position;\nin vec3 normal;\n\nin float a_treeIndex;\n\nin vec3 a_centerA;\nin vec3 a_centerB;\n\nin float a_radius;\n\nin vec3 a_color;\n// slicing plane attributes\nin vec4 a_planeA;\nin vec4 a_planeB;\n// segment attributes\nin vec3 a_localXAxis;\nin float a_angle;\nin float a_arcAngle;\n\nout float v_treeIndex;\n// We pack the radii into w-components\nout vec4 v_centerB;\n\n// U, V, axis represent the 3x3 cone basis.\n// They are vec4 to pack extra data into the w-component\n// since Safari on iOS only supports 8 varying vec4 registers.\nout vec4 v_U;\nout vec4 v_W;\n\nout vec4 v_planeA;\nout vec4 v_planeB;\n\nout float v_surfacePointY;\n\nout float v_angle;\nout float v_arcAngle;\n\nout vec3 v_color;\n\nout vec3 v_normal;\n\nuniform vec2 treeIndexTextureSize;\n\nuniform sampler2D transformOverrideIndexTexture;\n\nuniform vec2 transformOverrideTextureSize; \nuniform sampler2D transformOverrideTexture;\n\nvoid main() {\n\n mat4 modelViewMatrix = viewMatrix * modelMatrix;\n\n mat4 treeIndexWorldTransform = determineMatrixOverride(\n a_treeIndex, \n treeIndexTextureSize, \n transformOverrideIndexTexture, \n transformOverrideTextureSize, \n transformOverrideTexture\n );\n \n mat4 modelTransformOffset = inverseModelMatrix * treeIndexWorldTransform * modelMatrix;\n\n vec3 centerA = mul3(modelTransformOffset, a_centerA);\n vec3 centerB = mul3(modelTransformOffset, a_centerB);\n\n vec3 center = 0.5 * (centerA + centerB);\n float halfHeight = 0.5 * length(centerA - centerB);\n vec3 dir = normalize(centerA - centerB);\n vec3 newPosition = position;\n\n vec3 rayOrigin = (inverseModelMatrix * vec4(cameraPosition, 1.0)).xyz;\n vec3 objectToCameraModelSpace = rayOrigin - center;\n\n float leftUpScale = a_radius;\n\n vec3 lDir = dir;\n if (dot(objectToCameraModelSpace, dir) < 0.0) { // direction vector looks away, flip it\n lDir = -lDir;\n }\n\n vec3 left = normalize(cross(objectToCameraModelSpace, lDir));\n vec3 up = normalize(cross(left, lDir));\n\n#ifndef GL_EXT_frag_depth\n // make sure the billboard will not overlap with cap geometry (flickering effect), not important if we write to depth buffer\n newPosition.x *= 1.0 - (a_radius * (position.x + 1.0) * 0.0025 / halfHeight);\n#endif\n\n vec3 surfacePoint = center + mat3(halfHeight*lDir, leftUpScale*left, leftUpScale*up) * newPosition;\n vec3 transformed = surfacePoint;\n surfacePoint = mul3(modelViewMatrix, surfacePoint);\n\n // varying data\n v_treeIndex = a_treeIndex;\n v_angle = a_angle;\n v_arcAngle = a_arcAngle;\n\n // compute basis for cone\n v_W.xyz = dir;\n v_U.xyz = (modelTransformOffset * vec4(a_localXAxis, 0)).xyz;\n v_W.xyz = normalize(normalMatrix * v_W.xyz);\n v_U.xyz = normalize(normalMatrix * v_U.xyz);\n // We pack surfacePoint as w-components of U and W\n v_W.w = surfacePoint.z;\n v_U.w = surfacePoint.x;\n\n // We pack radii as w-components of v_centerB\n mat4 modelToTransformOffset = modelMatrix * modelTransformOffset;\n float radius = length((modelToTransformOffset * vec4(a_localXAxis * a_radius, 0.0)).xyz);\n\n centerB = centerB - dir;\n v_centerB.xyz = mul3(modelViewMatrix, centerB);\n v_centerB.w = radius;\n\n vec4 planeA = a_planeA;\n planeA.w = length((modelToTransformOffset * vec4(planeA.xyz * planeA.w, 0.0)).xyz);\n\n vec4 planeB = a_planeB;\n planeB.w = length((modelToTransformOffset * vec4(planeB.xyz * planeB.w, 0.0)).xyz);\n\n v_planeA = planeA;\n v_planeB = planeB;\n v_surfacePointY = surfacePoint.y;\n v_centerB.w = radius;\n\n v_color = a_color;\n v_normal = normalMatrix * normal;\n\n vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n gl_Position = projectionMatrix * mvPosition;\n}\n"},function(e,t,n){"use strict";n.r(t),t.default="precision highp float;\n#define GLSLIFY 1\n\n#define texture2D texture\n#define gl_FragDepthEXT gl_FragDepth \n\nfloat computeFragmentDepth(vec3 p, mat4 projectionMatrix) {\n // Anders Hafreager comments:\n // Depth value can be calculated by transforming the z-component of the intersection point to projection space.\n // The w-component is also needed to scale projection space into clip space.\n // However, the 4th column of the projection matrix is (0, 0, const, 0), so we can exploit this when computing w-value.\n float projected_intersection_z=projectionMatrix[0][2]*p.x+projectionMatrix[1][2]*p.y+projectionMatrix[2][2]*p.z+projectionMatrix[3][2];\n\n // If we want to use orthographic camera, the full w-component is found as\n float projected_intersection_w=projectionMatrix[0][3]*p.x+projectionMatrix[1][3]*p.y+projectionMatrix[2][3]*p.z+projectionMatrix[3][3];\n // float projected_intersection_w = projectionMatrix[2][3]*newPoint.z; // Optimized for perspective camera\n return ((gl_DepthRange.diff * (projected_intersection_z / projected_intersection_w)) + gl_DepthRange.near + gl_DepthRange.far) * .5;\n}\n\n#if defined(gl_FragDepthEXT) || defined(GL_EXT_frag_depth) \n\nfloat updateFragmentDepth(vec3 p,mat4 projectionMatrix) {\n gl_FragDepthEXT = computeFragmentDepth(p, projectionMatrix);\n return gl_FragDepthEXT;\n}\n\n#else\n\nfloat updateFragmentDepth(vec3 p, mat4 projectionMatrix){\n // Extension not available - not much we can do.\n return computeFragmentDepth(p, projectionMatrix);\n}\n\n#endif\n\nstruct NodeAppearance {\n vec4 colorTexel;\n bool isVisible;\n bool renderInFront;\n bool renderGhosted;\n};\n\nfloat floatBitsSubset(float inNumber, int fromLeastSignificantBitIndex, int toMostSignificantBitIndex) {\n float r = float(fromLeastSignificantBitIndex);\n float l = float(toMostSignificantBitIndex);\n\n float bitShift = pow(2.0, r);\n return mod(((inNumber - mod(inNumber, bitShift)) / bitShift), pow(2.0, l - r));\n}\n\n/*\n\nExample:\n\nGet the value from bit 2 to 4 (not inclusive)\n\ninput:\ninNumber = 173 = 1010_1101 , from=2, to=4\n\nexpected output = 1010_|11|01 = 3\n\n1) subtract any bits in the least significant bit-subset\n\n mod(inNumber=173, pow(2.0, from=2)) = mod(inNumber, 4) = 1\n \n inNumber - 1 = 172\n\n2) bitshift such that we remove the least significant bit-subset\n this is guaranteed to be devisible since we subtracted the remainder\n\n (inNumber=172) / pow(2.0, from=2) = 172 / 4 = 43 = 0010_1011\n\n3) lastly, remove the most significant bit-subset\n\n mod((inNumber=43), pow(2.0, to=4 - from=2) = mod(43, 4)\n\n mod(43, 4) = 3\n\n or in binary notation: 0000_0011 which is the expected result.\n\n*/ \n\nNodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture, vec2 textureSize, float treeIndex) {\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = textureSize.x;\n float dataTextureHeight = textureSize.y;\n\n float u = mod(treeIndex, dataTextureWidth);\n float v = floor(treeIndex / dataTextureWidth);\n float uCoord = (u + 0.5) / dataTextureWidth;\n float vCoord = (v + 0.5) / dataTextureHeight;\n vec2 treeIndexUv = vec2(uCoord, vCoord);\n \n vec4 texel = texture2D(nodeAppearanceTexture, treeIndexUv);\n float alphaUnwrapped = floor((texel.a * 255.0) + 0.5);\n\n bool isVisible = floatBitsSubset(alphaUnwrapped, 0, 1) == 1.0;\n bool renderInFront = floatBitsSubset(alphaUnwrapped, 1, 2) == 1.0;\n bool renderGhosted = floatBitsSubset(alphaUnwrapped, 2, 3) == 1.0;\n\n return NodeAppearance(texel, isVisible, renderInFront, renderGhosted);\n}\n\nconst int RenderTypeColor_0 = 1;\nconst int RenderTypeNormal_0 = 2;\nconst int RenderTypeTreeIndex_0 = 3;\nconst int RenderTypePackColorAndNormal_0 = 4;\nconst int RenderTypeDepth_0 = 5;\nconst int RenderTypeEffects_0 = 6;\nconst int RenderTypeGhost_0 = 7;\n\nbool determineVisibility(NodeAppearance nodeAppearance, int renderMode) {\n return \n // In ghost mode\n ((renderMode == RenderTypeGhost_0) && nodeAppearance.isVisible && nodeAppearance.renderGhosted) ||\n // Not ghost mode\n ((renderMode != RenderTypeGhost_0) && \n !nodeAppearance.renderGhosted && nodeAppearance.isVisible && (nodeAppearance.renderInFront || renderMode != RenderTypeEffects_0));\n}\n\nvec4 determineColor(vec3 originalColor, NodeAppearance nodeAppearance) {\n vec4 overrideColor = nodeAppearance.colorTexel;\n if (any(greaterThan(overrideColor.rgb, vec3(0.0)))) {\n return overrideColor;\n }\n return vec4(originalColor.rgb, overrideColor.a);\n}\n\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\n/**\n * Packs the integer part of the number given to a RGB color.\n */\nvec3 packIntToColor(float number) {\n float r = floor(number / (255.0 * 255.0)) / 255.0;\n float g = mod(floor(number / 255.0), 255.0) / 255.0;\n float b = mod(number, 255.0) / 255.0;\n return vec3(r, g, b);\n}\n\nstruct GeometryTypeEnum {\n int Quad;\n int Primitive;\n int TriangleMesh;\n int InstancedMesh;\n};\n\nconst GeometryTypeEnum GeometryType = GeometryTypeEnum(1,2,3,4);\n\nconst int RenderTypeColor_1 = 1;\nconst int RenderTypeNormal_1 = 2;\nconst int RenderTypeTreeIndex_1 = 3;\nconst int RenderTypePackColorAndNormal_1 = 4;\nconst int RenderTypeDepth_1 = 5;\nconst int RenderTypeEffects_1 = 6;\nconst int RenderTypeGhost_1 = 7;\nconst int RenderTypeLOD = 8;\nconst int RenderTypeDepthBufferOnly = 9;\nconst int RenderTypeGeometryType = 10;\n\n#include <packing>\n\nout vec4 outputColor;\n\nvec3 packNormalToRgb( const in vec3 normal ) {\n return normalize( normal ) * 0.5 + 0.5;\n}\n\nvoid updateFragmentColor(\n int renderMode, vec4 color, float treeIndex, \n vec3 normal, float depth, sampler2D matCapTexture, \n int geometryType) {\n if (renderMode == RenderTypeColor_1 || renderMode == RenderTypeEffects_1) {\n vec3 hsv = rgb2hsv(color.rgb);\n hsv.z = min(0.5 * hsv.z + 0.5, 1.0);\n vec3 colorRGB = hsv2rgb(hsv);\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n vec4 albedo = vec4(colorRGB * (0.4 + 0.6 * amplitude), 1.0);\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec4 mc = vec4(texture2D(matCapTexture, cap).rgb, 1.0);\n \n outputColor = vec4(albedo.rgb * mc.rgb * 1.7, color.a);\n } else if (renderMode == RenderTypeGhost_1) {\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n float s = 0.4 + 0.6 * amplitude;\n outputColor = vec4(vec3(s), 0.3);\n } else if (renderMode == RenderTypeDepthBufferOnly) {\n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n } else if (renderMode == RenderTypePackColorAndNormal_1) {\n vec3 hsv = rgb2hsv(color.rgb);\n float a = 0.0;\n if (hsv.y > 0.01) {\n if (hsv.z > 0.5) {\n // light color\n a = (0.55 + hsv.x * 0.45);\n } else {\n // dark color\n a = (0.1 + hsv.x * 0.45);\n }\n } else {\n // no saturation - grayscale\n a = hsv.z * 0.09;\n }\n outputColor = vec4(packNormalToRgb(normal.rgb), a);\n } else if (renderMode == RenderTypeNormal_1) {\n outputColor = vec4(packNormalToRgb(normal), 1.0);\n } else if (renderMode == RenderTypeTreeIndex_1) {\n outputColor = vec4(packIntToColor(treeIndex), 1.0);\n } else if (renderMode == RenderTypeDepth_1) {\n outputColor = packDepthToRGBA(depth);\n } else if (renderMode == RenderTypeLOD) {\n bool isHighDetail = geometryType != GeometryType.Quad;\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture2D(matCapTexture, cap).rgb * 1.5;\n outputColor = isHighDetail ? vec4(vec3(0.0, 1.0, 0.0) * mc, color.a) : vec4(vec3(1.0, 1.0, 0.0) * mc, color.a);\n } else if (renderMode == RenderTypeGeometryType) {\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture2D(matCapTexture, cap).rgb * 1.5;\n vec3 geometryColor = \n float(geometryType == 1) * vec3(1.0, 0.0, 0.0) + // Quads\n float(geometryType == 2) * vec3(0.0, 1.0, 0.0) + // Primitives\n float(geometryType == 3) * vec3(0.0, 0.0, 1.0) + // Triangle meshes\n float(geometryType == 4) * vec3(1.0, 1.0, 0.0); // Instance meshes\n outputColor = vec4(geometryColor * mc, color.a);\n } else {\n // Unknown render mode - should not happen. \n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n }\n}\n\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\n\nbool isClipped(NodeAppearance nodeAppearance, vec3 point) {\n#if NUM_CLIPPING_PLANES > 0\n vec3 pointFlipped = -point;\n vec4 plane;\n\n for (int i = 0; i < UNION_CLIPPING_PLANES; i++) {\n plane = clippingPlanes[i];\n if (dot(pointFlipped, plane.xyz) > plane.w) return true;\n }\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n bool clipped = true;\n for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n clipped = (dot(pointFlipped, plane.xyz) > plane.w) && clipped;\n }\n if ( clipped ) return true;\n#endif\n#endif\n return false;\n}\n\n#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n\nin float v_oneMinusThicknessSqr;\nin vec2 v_xy;\nin float v_angle;\nin float v_arcAngle;\n\nin float v_treeIndex;\nin vec3 v_color;\nin vec3 v_normal;\n\nuniform sampler2D colorDataTexture;\nuniform sampler2D overrideVisibilityPerTreeIndex;\nuniform sampler2D matCapTexture;\n\nuniform vec2 treeIndexTextureSize;\n\nuniform int renderMode;\n\nin vec3 vViewPosition;\n\nvoid main() {\n NodeAppearance appearance = determineNodeAppearance(colorDataTexture, treeIndexTextureSize, v_treeIndex);\n if (!determineVisibility(appearance, renderMode)) {\n discard;\n }\n\n if (isClipped(appearance, vViewPosition)) {\n discard;\n }\n\n vec4 color = determineColor(v_color, appearance);\n float dist = dot(v_xy, v_xy);\n float theta = atan(v_xy.y, v_xy.x);\n vec3 normal = normalize( v_normal );\n if (theta < v_angle) {\n theta += 2.0 * PI;\n }\n if (dist > 0.25 || dist < 0.25 * v_oneMinusThicknessSqr || theta >= v_angle + v_arcAngle) {\n discard;\n }\n\n updateFragmentColor(renderMode, color, v_treeIndex, normal, gl_FragCoord.z, matCapTexture, GeometryType.Primitive);\n}\n"},function(e,t,n){"use strict";n.r(t),t.default="#define GLSLIFY 1\n#define texture2D texture\n\n// https://stackoverflow.com/questions/7059962/how-do-i-convert-a-vec4-rgba-value-to-a-float @ Arjan\nfloat unpackVec4ToFloat( vec4 packedFloat)\n{\n vec4 rgba = packedFloat;\n float sign = 1.0 - step(128.0, rgba.x) * 2.0;\n float exponent = 2.0 * mod(rgba.x, 128.0) + step(128.0, rgba.y) - 127.0;\n if (exponent == -127.0) return 0.0;\n float mantissa = mod(rgba.y, 128.0) * 65536.0 + rgba.z * 256.0 + rgba.w + 8388608.0;\n return sign * exp2(exponent - 23.0) * mantissa; \n}\n\nfloat unpackFloatFromRGBATexel(vec4 texel){\n float byteValueR = floor((texel.r * 255.0) + 0.5);\n float byteValueG = floor((texel.g * 255.0) + 0.5);\n float byteValueB = floor((texel.b * 255.0) + 0.5);\n float byteValueA = floor((texel.a * 255.0) + 0.5);\n\n return unpackVec4ToFloat(vec4(byteValueR, byteValueG, byteValueB, byteValueA));\n}\n\nmat4 determineMatrixOverride(\n float treeIndex, \n vec2 treeIndexTextureSize, \n sampler2D transformOverrideIndexTexture, \n vec2 transformOverrideTextureSize, \n sampler2D transformOverrideTexture\n) {\n\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = treeIndexTextureSize.x;\n float dataTextureHeight = treeIndexTextureSize.y;\n\n float xTreeIndexTextureCoord = mod(treeIndex, dataTextureWidth);\n float yTreeIndexTextureCoord = floor(treeIndex / dataTextureWidth);\n\n vec2 indexUV = vec2((xTreeIndexTextureCoord + 0.5) / dataTextureWidth, (yTreeIndexTextureCoord + 0.5) / dataTextureHeight);\n\n vec3 indexTexel = texture2D(transformOverrideIndexTexture, indexUV).rgb;\n\n float index = floor(indexTexel.r * 256.0) * 65536.0 + floor(indexTexel.g * 256.0) * 256.0 + floor(indexTexel.b * 256.0);\n \n \n if(index == 0.0){\n return mat4(\n 1.0, 0.0, 0.0, 0.0,\n 0.0, 1.0, 0.0, 0.0,\n 0.0, 0.0, 1.0, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n }\n\n index = index - 1.0;\n float overridesPerRow = transformOverrideTextureSize.x / 16.0;\n\n float xOverrideTextureCoord = mod(index, overridesPerRow);\n float yOverrideTextureCoord = floor(index / overridesPerRow);\n\n float cellWidth = 1.0 / transformOverrideTextureSize.x;\n float cellHeight = 1.0 / transformOverrideTextureSize.y;\n\n float overrideU = (xOverrideTextureCoord / overridesPerRow) + cellWidth / 2.0;\n float overrideV = (yOverrideTextureCoord / transformOverrideTextureSize.y) + cellHeight / 2.0;\n\n vec2 overrideUV = vec2(overrideU, overrideV); \n\n float matrixElements[12];\n\n for(int i = 0; i < 12; i++){\n matrixElements[i] = unpackFloatFromRGBATexel(texture2D(transformOverrideTexture, overrideUV + vec2(float(i) * cellWidth, 0.0)));\n }\n \n return mat4(\n matrixElements[0], matrixElements[4], matrixElements[8], 0,\n matrixElements[1], matrixElements[5], matrixElements[9], 0,\n matrixElements[2], matrixElements[6], matrixElements[10], 0,\n matrixElements[3], matrixElements[7], matrixElements[11], 1\n );\n}\n\nuniform mat4 inverseModelMatrix;\n\nin vec3 position;\n\nuniform mat4 modelMatrix;\nuniform mat4 viewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat3 normalMatrix;\n\nin mat4 a_instanceMatrix;\n\nin float a_treeIndex;\nin vec3 a_color;\nin float a_angle;\nin float a_arcAngle;\nin float a_thickness;\nin vec3 a_normal;\n\nout float v_treeIndex;\nout float v_oneMinusThicknessSqr;\nout vec2 v_xy;\nout float v_angle;\nout float v_arcAngle;\n\nout vec3 v_color;\nout vec3 v_normal;\n\nout vec3 vViewPosition;\n\nuniform vec2 treeIndexTextureSize;\n\nuniform sampler2D transformOverrideIndexTexture;\n\nuniform vec2 transformOverrideTextureSize; \nuniform sampler2D transformOverrideTexture;\n\nvoid main() {\n v_treeIndex = a_treeIndex;\n v_oneMinusThicknessSqr = (1.0 - a_thickness) * (1.0 - a_thickness);\n v_xy = vec2(position.x, position.y);\n v_angle = a_angle;\n v_arcAngle = a_arcAngle;\n\n mat4 treeIndexWorldTransform = determineMatrixOverride(\n a_treeIndex, \n treeIndexTextureSize, \n transformOverrideIndexTexture, \n transformOverrideTextureSize, \n transformOverrideTexture\n );\n\n vec3 transformed = (a_instanceMatrix * vec4(position, 1.0)).xyz;\n vec4 mvPosition = viewMatrix * treeIndexWorldTransform * modelMatrix * vec4( transformed, 1.0 );\n v_color = a_color;\n\n v_normal = normalMatrix * normalize(inverseModelMatrix * treeIndexWorldTransform * modelMatrix * vec4(normalize(a_normal), 0.0)).xyz;\n vViewPosition = mvPosition.xyz;\n gl_Position = projectionMatrix * mvPosition;\n}\n"},function(e,t,n){"use strict";n.r(t),t.default="#define GLSLIFY 1\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\n/**\n * Packs the integer part of the number given to a RGB color.\n */\nvec3 packIntToColor(float number) {\n float r = floor(number / (255.0 * 255.0)) / 255.0;\n float g = mod(floor(number / 255.0), 255.0) / 255.0;\n float b = mod(number, 255.0) / 255.0;\n return vec3(r, g, b);\n}\n\nstruct GeometryTypeEnum {\n int Quad;\n int Primitive;\n int TriangleMesh;\n int InstancedMesh;\n};\n\nconst GeometryTypeEnum GeometryType = GeometryTypeEnum(1,2,3,4);\n\nconst int RenderTypeColor_0 = 1;\nconst int RenderTypeNormal_0 = 2;\nconst int RenderTypeTreeIndex_0 = 3;\nconst int RenderTypePackColorAndNormal_0 = 4;\nconst int RenderTypeDepth_0 = 5;\nconst int RenderTypeEffects_0 = 6;\nconst int RenderTypeGhost_0 = 7;\nconst int RenderTypeLOD = 8;\nconst int RenderTypeDepthBufferOnly = 9;\nconst int RenderTypeGeometryType = 10;\n\n#include <packing>\n\nout vec4 outputColor;\n\nvec3 packNormalToRgb( const in vec3 normal ) {\n return normalize( normal ) * 0.5 + 0.5;\n}\n\nvoid updateFragmentColor(\n int renderMode, vec4 color, float treeIndex, \n vec3 normal, float depth, sampler2D matCapTexture, \n int geometryType) {\n if (renderMode == RenderTypeColor_0 || renderMode == RenderTypeEffects_0) {\n vec3 hsv = rgb2hsv(color.rgb);\n hsv.z = min(0.5 * hsv.z + 0.5, 1.0);\n vec3 colorRGB = hsv2rgb(hsv);\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n vec4 albedo = vec4(colorRGB * (0.4 + 0.6 * amplitude), 1.0);\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec4 mc = vec4(texture2D(matCapTexture, cap).rgb, 1.0);\n \n outputColor = vec4(albedo.rgb * mc.rgb * 1.7, color.a);\n } else if (renderMode == RenderTypeGhost_0) {\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n float s = 0.4 + 0.6 * amplitude;\n outputColor = vec4(vec3(s), 0.3);\n } else if (renderMode == RenderTypeDepthBufferOnly) {\n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n } else if (renderMode == RenderTypePackColorAndNormal_0) {\n vec3 hsv = rgb2hsv(color.rgb);\n float a = 0.0;\n if (hsv.y > 0.01) {\n if (hsv.z > 0.5) {\n // light color\n a = (0.55 + hsv.x * 0.45);\n } else {\n // dark color\n a = (0.1 + hsv.x * 0.45);\n }\n } else {\n // no saturation - grayscale\n a = hsv.z * 0.09;\n }\n outputColor = vec4(packNormalToRgb(normal.rgb), a);\n } else if (renderMode == RenderTypeNormal_0) {\n outputColor = vec4(packNormalToRgb(normal), 1.0);\n } else if (renderMode == RenderTypeTreeIndex_0) {\n outputColor = vec4(packIntToColor(treeIndex), 1.0);\n } else if (renderMode == RenderTypeDepth_0) {\n outputColor = packDepthToRGBA(depth);\n } else if (renderMode == RenderTypeLOD) {\n bool isHighDetail = geometryType != GeometryType.Quad;\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture2D(matCapTexture, cap).rgb * 1.5;\n outputColor = isHighDetail ? vec4(vec3(0.0, 1.0, 0.0) * mc, color.a) : vec4(vec3(1.0, 1.0, 0.0) * mc, color.a);\n } else if (renderMode == RenderTypeGeometryType) {\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture2D(matCapTexture, cap).rgb * 1.5;\n vec3 geometryColor = \n float(geometryType == 1) * vec3(1.0, 0.0, 0.0) + // Quads\n float(geometryType == 2) * vec3(0.0, 1.0, 0.0) + // Primitives\n float(geometryType == 3) * vec3(0.0, 0.0, 1.0) + // Triangle meshes\n float(geometryType == 4) * vec3(1.0, 1.0, 0.0); // Instance meshes\n outputColor = vec4(geometryColor * mc, color.a);\n } else {\n // Unknown render mode - should not happen. \n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n }\n}\n\nstruct NodeAppearance {\n vec4 colorTexel;\n bool isVisible;\n bool renderInFront;\n bool renderGhosted;\n};\n\nfloat floatBitsSubset(float inNumber, int fromLeastSignificantBitIndex, int toMostSignificantBitIndex) {\n float r = float(fromLeastSignificantBitIndex);\n float l = float(toMostSignificantBitIndex);\n\n float bitShift = pow(2.0, r);\n return mod(((inNumber - mod(inNumber, bitShift)) / bitShift), pow(2.0, l - r));\n}\n\n/*\n\nExample:\n\nGet the value from bit 2 to 4 (not inclusive)\n\ninput:\ninNumber = 173 = 1010_1101 , from=2, to=4\n\nexpected output = 1010_|11|01 = 3\n\n1) subtract any bits in the least significant bit-subset\n\n mod(inNumber=173, pow(2.0, from=2)) = mod(inNumber, 4) = 1\n \n inNumber - 1 = 172\n\n2) bitshift such that we remove the least significant bit-subset\n this is guaranteed to be devisible since we subtracted the remainder\n\n (inNumber=172) / pow(2.0, from=2) = 172 / 4 = 43 = 0010_1011\n\n3) lastly, remove the most significant bit-subset\n\n mod((inNumber=43), pow(2.0, to=4 - from=2) = mod(43, 4)\n\n mod(43, 4) = 3\n\n or in binary notation: 0000_0011 which is the expected result.\n\n*/ \n\nNodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture, vec2 textureSize, float treeIndex) {\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = textureSize.x;\n float dataTextureHeight = textureSize.y;\n\n float u = mod(treeIndex, dataTextureWidth);\n float v = floor(treeIndex / dataTextureWidth);\n float uCoord = (u + 0.5) / dataTextureWidth;\n float vCoord = (v + 0.5) / dataTextureHeight;\n vec2 treeIndexUv = vec2(uCoord, vCoord);\n \n vec4 texel = texture2D(nodeAppearanceTexture, treeIndexUv);\n float alphaUnwrapped = floor((texel.a * 255.0) + 0.5);\n\n bool isVisible = floatBitsSubset(alphaUnwrapped, 0, 1) == 1.0;\n bool renderInFront = floatBitsSubset(alphaUnwrapped, 1, 2) == 1.0;\n bool renderGhosted = floatBitsSubset(alphaUnwrapped, 2, 3) == 1.0;\n\n return NodeAppearance(texel, isVisible, renderInFront, renderGhosted);\n}\n\nconst int RenderTypeColor_1 = 1;\nconst int RenderTypeNormal_1 = 2;\nconst int RenderTypeTreeIndex_1 = 3;\nconst int RenderTypePackColorAndNormal_1 = 4;\nconst int RenderTypeDepth_1 = 5;\nconst int RenderTypeEffects_1 = 6;\nconst int RenderTypeGhost_1 = 7;\n\nbool determineVisibility(NodeAppearance nodeAppearance, int renderMode) {\n return \n // In ghost mode\n ((renderMode == RenderTypeGhost_1) && nodeAppearance.isVisible && nodeAppearance.renderGhosted) ||\n // Not ghost mode\n ((renderMode != RenderTypeGhost_1) && \n !nodeAppearance.renderGhosted && nodeAppearance.isVisible && (nodeAppearance.renderInFront || renderMode != RenderTypeEffects_1));\n}\n\nvec4 determineColor(vec3 originalColor, NodeAppearance nodeAppearance) {\n vec4 overrideColor = nodeAppearance.colorTexel;\n if (any(greaterThan(overrideColor.rgb, vec3(0.0)))) {\n return overrideColor;\n }\n return vec4(originalColor.rgb, overrideColor.a);\n}\n\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\n\nbool isClipped(NodeAppearance nodeAppearance, vec3 point) {\n#if NUM_CLIPPING_PLANES > 0\n vec3 pointFlipped = -point;\n vec4 plane;\n\n for (int i = 0; i < UNION_CLIPPING_PLANES; i++) {\n plane = clippingPlanes[i];\n if (dot(pointFlipped, plane.xyz) > plane.w) return true;\n }\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n bool clipped = true;\n for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n clipped = (dot(pointFlipped, plane.xyz) > plane.w) && clipped;\n }\n if ( clipped ) return true;\n#endif\n#endif\n return false;\n}\n\nin float v_treeIndex;\nin vec3 v_color;\nin vec3 v_normal;\n\nuniform sampler2D colorDataTexture;\nuniform sampler2D overrideVisibilityPerTreeIndex;\nuniform sampler2D matCapTexture;\n\nuniform vec2 treeIndexTextureSize;\n\nuniform int renderMode;\n\nin vec3 vViewPosition;\n\nvoid main() {\n NodeAppearance appearance = determineNodeAppearance(colorDataTexture, treeIndexTextureSize, v_treeIndex);\n if (!determineVisibility(appearance, renderMode)) {\n discard;\n }\n if (isClipped(appearance, vViewPosition)) {\n discard;\n }\n\n vec4 color = determineColor(v_color, appearance); \n vec3 normal = normalize(v_normal);\n updateFragmentColor(renderMode, color, v_treeIndex, normal, gl_FragCoord.z, matCapTexture, GeometryType.Primitive);\n}\n"},function(e,t,n){"use strict";n.r(t),t.default="#define GLSLIFY 1\n// https://stackoverflow.com/questions/7059962/how-do-i-convert-a-vec4-rgba-value-to-a-float @ Arjan\nfloat unpackVec4ToFloat( vec4 packedFloat)\n{\n vec4 rgba = packedFloat;\n float sign = 1.0 - step(128.0, rgba.x) * 2.0;\n float exponent = 2.0 * mod(rgba.x, 128.0) + step(128.0, rgba.y) - 127.0;\n if (exponent == -127.0) return 0.0;\n float mantissa = mod(rgba.y, 128.0) * 65536.0 + rgba.z * 256.0 + rgba.w + 8388608.0;\n return sign * exp2(exponent - 23.0) * mantissa; \n}\n\nfloat unpackFloatFromRGBATexel(vec4 texel){\n float byteValueR = floor((texel.r * 255.0) + 0.5);\n float byteValueG = floor((texel.g * 255.0) + 0.5);\n float byteValueB = floor((texel.b * 255.0) + 0.5);\n float byteValueA = floor((texel.a * 255.0) + 0.5);\n\n return unpackVec4ToFloat(vec4(byteValueR, byteValueG, byteValueB, byteValueA));\n}\n\nmat4 determineMatrixOverride(\n float treeIndex, \n vec2 treeIndexTextureSize, \n sampler2D transformOverrideIndexTexture, \n vec2 transformOverrideTextureSize, \n sampler2D transformOverrideTexture\n) {\n\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = treeIndexTextureSize.x;\n float dataTextureHeight = treeIndexTextureSize.y;\n\n float xTreeIndexTextureCoord = mod(treeIndex, dataTextureWidth);\n float yTreeIndexTextureCoord = floor(treeIndex / dataTextureWidth);\n\n vec2 indexUV = vec2((xTreeIndexTextureCoord + 0.5) / dataTextureWidth, (yTreeIndexTextureCoord + 0.5) / dataTextureHeight);\n\n vec3 indexTexel = texture2D(transformOverrideIndexTexture, indexUV).rgb;\n\n float index = floor(indexTexel.r * 256.0) * 65536.0 + floor(indexTexel.g * 256.0) * 256.0 + floor(indexTexel.b * 256.0);\n \n \n if(index == 0.0){\n return mat4(\n 1.0, 0.0, 0.0, 0.0,\n 0.0, 1.0, 0.0, 0.0,\n 0.0, 0.0, 1.0, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n }\n\n index = index - 1.0;\n float overridesPerRow = transformOverrideTextureSize.x / 16.0;\n\n float xOverrideTextureCoord = mod(index, overridesPerRow);\n float yOverrideTextureCoord = floor(index / overridesPerRow);\n\n float cellWidth = 1.0 / transformOverrideTextureSize.x;\n float cellHeight = 1.0 / transformOverrideTextureSize.y;\n\n float overrideU = (xOverrideTextureCoord / overridesPerRow) + cellWidth / 2.0;\n float overrideV = (yOverrideTextureCoord / transformOverrideTextureSize.y) + cellHeight / 2.0;\n\n vec2 overrideUV = vec2(overrideU, overrideV); \n\n float matrixElements[12];\n\n for(int i = 0; i < 12; i++){\n matrixElements[i] = unpackFloatFromRGBATexel(texture2D(transformOverrideTexture, overrideUV + vec2(float(i) * cellWidth, 0.0)));\n }\n \n return mat4(\n matrixElements[0], matrixElements[4], matrixElements[8], 0,\n matrixElements[1], matrixElements[5], matrixElements[9], 0,\n matrixElements[2], matrixElements[6], matrixElements[10], 0,\n matrixElements[3], matrixElements[7], matrixElements[11], 1\n );\n}\n\nuniform mat4 inverseModelMatrix;\n\nin mat4 a_instanceMatrix;\n\nin float a_treeIndex;\nin vec3 a_color;\nin float a_arcAngle;\nin float a_radius;\nin float a_tubeRadius;\n\nout float v_treeIndex;\nout vec3 v_color;\nout vec3 v_normal;\n\nout vec3 vViewPosition;\n\nuniform vec2 treeIndexTextureSize;\n\nuniform sampler2D transformOverrideIndexTexture;\n\nuniform vec2 transformOverrideTextureSize; \nuniform sampler2D transformOverrideTexture;\n\nvoid main() {\n // normalized theta and phi are packed into positions\n float theta = position.x * a_arcAngle;\n float phi = position.y;\n float cosTheta = cos(theta);\n float sinTheta = sin(theta);\n vec3 pos3 = vec3(0);\n\n pos3.x = (a_radius + a_tubeRadius*cos(phi)) * cosTheta;\n pos3.y = (a_radius + a_tubeRadius*cos(phi)) * sinTheta;\n pos3.z = a_tubeRadius*sin(phi);\n\n mat4 treeIndexWorldTransform = determineMatrixOverride(\n a_treeIndex, \n treeIndexTextureSize, \n transformOverrideIndexTexture, \n transformOverrideTextureSize, \n transformOverrideTexture\n );\n \n vec3 transformed = (a_instanceMatrix * vec4(pos3, 1.0)).xyz;\n\n // Calculate normal vectors if we're not picking\n vec3 center = (a_instanceMatrix * vec4(a_radius * cosTheta, a_radius * sinTheta, 0.0, 1.0)).xyz;\n vec3 objectNormal = normalize(transformed.xyz - center);\n\n v_treeIndex = a_treeIndex;\n v_color = a_color;\n v_normal = normalMatrix * normalize(inverseModelMatrix * treeIndexWorldTransform * modelMatrix * vec4(objectNormal, 0.0)).xyz;\n\n vec4 modelViewPosition = viewMatrix * treeIndexWorldTransform * modelMatrix * vec4(transformed, 1.0);\n\n vViewPosition = modelViewPosition.xyz;\n\n gl_Position = projectionMatrix * modelViewPosition;\n}\n"},function(e,t,n){"use strict";n.r(t),t.default="#define GLSLIFY 1\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\n/**\n * Packs the integer part of the number given to a RGB color.\n */\nvec3 packIntToColor(float number) {\n float r = floor(number / (255.0 * 255.0)) / 255.0;\n float g = mod(floor(number / 255.0), 255.0) / 255.0;\n float b = mod(number, 255.0) / 255.0;\n return vec3(r, g, b);\n}\n\nstruct GeometryTypeEnum {\n int Quad;\n int Primitive;\n int TriangleMesh;\n int InstancedMesh;\n};\n\nconst GeometryTypeEnum GeometryType = GeometryTypeEnum(1,2,3,4);\n\nconst int RenderTypeColor_0 = 1;\nconst int RenderTypeNormal_0 = 2;\nconst int RenderTypeTreeIndex_0 = 3;\nconst int RenderTypePackColorAndNormal_0 = 4;\nconst int RenderTypeDepth_0 = 5;\nconst int RenderTypeEffects_0 = 6;\nconst int RenderTypeGhost_0 = 7;\nconst int RenderTypeLOD = 8;\nconst int RenderTypeDepthBufferOnly = 9;\nconst int RenderTypeGeometryType = 10;\n\n#include <packing>\n\nout vec4 outputColor;\n\nvec3 packNormalToRgb( const in vec3 normal ) {\n return normalize( normal ) * 0.5 + 0.5;\n}\n\nvoid updateFragmentColor(\n int renderMode, vec4 color, float treeIndex, \n vec3 normal, float depth, sampler2D matCapTexture, \n int geometryType) {\n if (renderMode == RenderTypeColor_0 || renderMode == RenderTypeEffects_0) {\n vec3 hsv = rgb2hsv(color.rgb);\n hsv.z = min(0.5 * hsv.z + 0.5, 1.0);\n vec3 colorRGB = hsv2rgb(hsv);\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n vec4 albedo = vec4(colorRGB * (0.4 + 0.6 * amplitude), 1.0);\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec4 mc = vec4(texture2D(matCapTexture, cap).rgb, 1.0);\n \n outputColor = vec4(albedo.rgb * mc.rgb * 1.7, color.a);\n } else if (renderMode == RenderTypeGhost_0) {\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n float s = 0.4 + 0.6 * amplitude;\n outputColor = vec4(vec3(s), 0.3);\n } else if (renderMode == RenderTypeDepthBufferOnly) {\n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n } else if (renderMode == RenderTypePackColorAndNormal_0) {\n vec3 hsv = rgb2hsv(color.rgb);\n float a = 0.0;\n if (hsv.y > 0.01) {\n if (hsv.z > 0.5) {\n // light color\n a = (0.55 + hsv.x * 0.45);\n } else {\n // dark color\n a = (0.1 + hsv.x * 0.45);\n }\n } else {\n // no saturation - grayscale\n a = hsv.z * 0.09;\n }\n outputColor = vec4(packNormalToRgb(normal.rgb), a);\n } else if (renderMode == RenderTypeNormal_0) {\n outputColor = vec4(packNormalToRgb(normal), 1.0);\n } else if (renderMode == RenderTypeTreeIndex_0) {\n outputColor = vec4(packIntToColor(treeIndex), 1.0);\n } else if (renderMode == RenderTypeDepth_0) {\n outputColor = packDepthToRGBA(depth);\n } else if (renderMode == RenderTypeLOD) {\n bool isHighDetail = geometryType != GeometryType.Quad;\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture2D(matCapTexture, cap).rgb * 1.5;\n outputColor = isHighDetail ? vec4(vec3(0.0, 1.0, 0.0) * mc, color.a) : vec4(vec3(1.0, 1.0, 0.0) * mc, color.a);\n } else if (renderMode == RenderTypeGeometryType) {\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture2D(matCapTexture, cap).rgb * 1.5;\n vec3 geometryColor = \n float(geometryType == 1) * vec3(1.0, 0.0, 0.0) + // Quads\n float(geometryType == 2) * vec3(0.0, 1.0, 0.0) + // Primitives\n float(geometryType == 3) * vec3(0.0, 0.0, 1.0) + // Triangle meshes\n float(geometryType == 4) * vec3(1.0, 1.0, 0.0); // Instance meshes\n outputColor = vec4(geometryColor * mc, color.a);\n } else {\n // Unknown render mode - should not happen. \n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n }\n}\n\nstruct NodeAppearance {\n vec4 colorTexel;\n bool isVisible;\n bool renderInFront;\n bool renderGhosted;\n};\n\nfloat floatBitsSubset(float inNumber, int fromLeastSignificantBitIndex, int toMostSignificantBitIndex) {\n float r = float(fromLeastSignificantBitIndex);\n float l = float(toMostSignificantBitIndex);\n\n float bitShift = pow(2.0, r);\n return mod(((inNumber - mod(inNumber, bitShift)) / bitShift), pow(2.0, l - r));\n}\n\n/*\n\nExample:\n\nGet the value from bit 2 to 4 (not inclusive)\n\ninput:\ninNumber = 173 = 1010_1101 , from=2, to=4\n\nexpected output = 1010_|11|01 = 3\n\n1) subtract any bits in the least significant bit-subset\n\n mod(inNumber=173, pow(2.0, from=2)) = mod(inNumber, 4) = 1\n \n inNumber - 1 = 172\n\n2) bitshift such that we remove the least significant bit-subset\n this is guaranteed to be devisible since we subtracted the remainder\n\n (inNumber=172) / pow(2.0, from=2) = 172 / 4 = 43 = 0010_1011\n\n3) lastly, remove the most significant bit-subset\n\n mod((inNumber=43), pow(2.0, to=4 - from=2) = mod(43, 4)\n\n mod(43, 4) = 3\n\n or in binary notation: 0000_0011 which is the expected result.\n\n*/ \n\nNodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture, vec2 textureSize, float treeIndex) {\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = textureSize.x;\n float dataTextureHeight = textureSize.y;\n\n float u = mod(treeIndex, dataTextureWidth);\n float v = floor(treeIndex / dataTextureWidth);\n float uCoord = (u + 0.5) / dataTextureWidth;\n float vCoord = (v + 0.5) / dataTextureHeight;\n vec2 treeIndexUv = vec2(uCoord, vCoord);\n \n vec4 texel = texture2D(nodeAppearanceTexture, treeIndexUv);\n float alphaUnwrapped = floor((texel.a * 255.0) + 0.5);\n\n bool isVisible = floatBitsSubset(alphaUnwrapped, 0, 1) == 1.0;\n bool renderInFront = floatBitsSubset(alphaUnwrapped, 1, 2) == 1.0;\n bool renderGhosted = floatBitsSubset(alphaUnwrapped, 2, 3) == 1.0;\n\n return NodeAppearance(texel, isVisible, renderInFront, renderGhosted);\n}\n\nconst int RenderTypeColor_1 = 1;\nconst int RenderTypeNormal_1 = 2;\nconst int RenderTypeTreeIndex_1 = 3;\nconst int RenderTypePackColorAndNormal_1 = 4;\nconst int RenderTypeDepth_1 = 5;\nconst int RenderTypeEffects_1 = 6;\nconst int RenderTypeGhost_1 = 7;\n\nbool determineVisibility(NodeAppearance nodeAppearance, int renderMode) {\n return \n // In ghost mode\n ((renderMode == RenderTypeGhost_1) && nodeAppearance.isVisible && nodeAppearance.renderGhosted) ||\n // Not ghost mode\n ((renderMode != RenderTypeGhost_1) && \n !nodeAppearance.renderGhosted && nodeAppearance.isVisible && (nodeAppearance.renderInFront || renderMode != RenderTypeEffects_1));\n}\n\nvec4 determineColor(vec3 originalColor, NodeAppearance nodeAppearance) {\n vec4 overrideColor = nodeAppearance.colorTexel;\n if (any(greaterThan(overrideColor.rgb, vec3(0.0)))) {\n return overrideColor;\n }\n return vec4(originalColor.rgb, overrideColor.a);\n}\n\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\n\nbool isClipped(NodeAppearance nodeAppearance, vec3 point) {\n#if NUM_CLIPPING_PLANES > 0\n vec3 pointFlipped = -point;\n vec4 plane;\n\n for (int i = 0; i < UNION_CLIPPING_PLANES; i++) {\n plane = clippingPlanes[i];\n if (dot(pointFlipped, plane.xyz) > plane.w) return true;\n }\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n bool clipped = true;\n for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n clipped = (dot(pointFlipped, plane.xyz) > plane.w) && clipped;\n }\n if ( clipped ) return true;\n#endif\n#endif\n return false;\n}\n\nin float v_treeIndex;\nin vec3 v_color;\nin vec3 v_normal;\n\nuniform sampler2D colorDataTexture;\nuniform sampler2D overrideVisibilityPerTreeIndex;\nuniform sampler2D matCapTexture;\n\nuniform vec2 treeIndexTextureSize;\n\nuniform int renderMode;\n\nin vec3 vViewPosition;\n\nvoid main() {\n NodeAppearance appearance = determineNodeAppearance(colorDataTexture, treeIndexTextureSize, v_treeIndex);\n if (!determineVisibility(appearance, renderMode)) {\n discard;\n }\n if (isClipped(appearance, vViewPosition)) {\n discard;\n }\n\n vec4 color = determineColor(v_color, appearance); \n vec3 normal = normalize(v_normal);\n updateFragmentColor(renderMode, color, v_treeIndex, normal, gl_FragCoord.z, matCapTexture, GeometryType.Primitive);\n}\n"},function(e,t,n){"use strict";n.r(t),t.default="#define GLSLIFY 1\n// https://stackoverflow.com/questions/7059962/how-do-i-convert-a-vec4-rgba-value-to-a-float @ Arjan\nfloat unpackVec4ToFloat( vec4 packedFloat)\n{\n vec4 rgba = packedFloat;\n float sign = 1.0 - step(128.0, rgba.x) * 2.0;\n float exponent = 2.0 * mod(rgba.x, 128.0) + step(128.0, rgba.y) - 127.0;\n if (exponent == -127.0) return 0.0;\n float mantissa = mod(rgba.y, 128.0) * 65536.0 + rgba.z * 256.0 + rgba.w + 8388608.0;\n return sign * exp2(exponent - 23.0) * mantissa; \n}\n\nfloat unpackFloatFromRGBATexel(vec4 texel){\n float byteValueR = floor((texel.r * 255.0) + 0.5);\n float byteValueG = floor((texel.g * 255.0) + 0.5);\n float byteValueB = floor((texel.b * 255.0) + 0.5);\n float byteValueA = floor((texel.a * 255.0) + 0.5);\n\n return unpackVec4ToFloat(vec4(byteValueR, byteValueG, byteValueB, byteValueA));\n}\n\nmat4 determineMatrixOverride(\n float treeIndex, \n vec2 treeIndexTextureSize, \n sampler2D transformOverrideIndexTexture, \n vec2 transformOverrideTextureSize, \n sampler2D transformOverrideTexture\n) {\n\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = treeIndexTextureSize.x;\n float dataTextureHeight = treeIndexTextureSize.y;\n\n float xTreeIndexTextureCoord = mod(treeIndex, dataTextureWidth);\n float yTreeIndexTextureCoord = floor(treeIndex / dataTextureWidth);\n\n vec2 indexUV = vec2((xTreeIndexTextureCoord + 0.5) / dataTextureWidth, (yTreeIndexTextureCoord + 0.5) / dataTextureHeight);\n\n vec3 indexTexel = texture2D(transformOverrideIndexTexture, indexUV).rgb;\n\n float index = floor(indexTexel.r * 256.0) * 65536.0 + floor(indexTexel.g * 256.0) * 256.0 + floor(indexTexel.b * 256.0);\n \n \n if(index == 0.0){\n return mat4(\n 1.0, 0.0, 0.0, 0.0,\n 0.0, 1.0, 0.0, 0.0,\n 0.0, 0.0, 1.0, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n }\n\n index = index - 1.0;\n float overridesPerRow = transformOverrideTextureSize.x / 16.0;\n\n float xOverrideTextureCoord = mod(index, overridesPerRow);\n float yOverrideTextureCoord = floor(index / overridesPerRow);\n\n float cellWidth = 1.0 / transformOverrideTextureSize.x;\n float cellHeight = 1.0 / transformOverrideTextureSize.y;\n\n float overrideU = (xOverrideTextureCoord / overridesPerRow) + cellWidth / 2.0;\n float overrideV = (yOverrideTextureCoord / transformOverrideTextureSize.y) + cellHeight / 2.0;\n\n vec2 overrideUV = vec2(overrideU, overrideV); \n\n float matrixElements[12];\n\n for(int i = 0; i < 12; i++){\n matrixElements[i] = unpackFloatFromRGBATexel(texture2D(transformOverrideTexture, overrideUV + vec2(float(i) * cellWidth, 0.0)));\n }\n \n return mat4(\n matrixElements[0], matrixElements[4], matrixElements[8], 0,\n matrixElements[1], matrixElements[5], matrixElements[9], 0,\n matrixElements[2], matrixElements[6], matrixElements[10], 0,\n matrixElements[3], matrixElements[7], matrixElements[11], 1\n );\n}\n\nuniform mat4 inverseModelMatrix;\n\nin float a_treeIndex;\nin vec3 a_color;\nin vec3 a_vertex1;\nin vec3 a_vertex2;\nin vec3 a_vertex3;\nin vec3 a_vertex4;\n\nout float v_treeIndex;\nout vec3 v_color;\nout vec3 v_normal;\n\nout vec3 vViewPosition;\n\nuniform vec2 treeIndexTextureSize;\n\nuniform sampler2D transformOverrideIndexTexture;\n\nuniform vec2 transformOverrideTextureSize; \nuniform sampler2D transformOverrideTexture;\n\nvoid main() {\n vec3 transformed;\n // reduce the avarage branchings\n if (position.x < 1.5) {\n transformed = position.x == 0.0 ? a_vertex1 : a_vertex2;\n } else {\n transformed = position.x == 2.0 ? a_vertex3 : a_vertex4;\n }\n\n mat4 treeIndexWorldTransform = determineMatrixOverride(\n a_treeIndex, \n treeIndexTextureSize, \n transformOverrideIndexTexture, \n transformOverrideTextureSize, \n transformOverrideTexture\n );\n\n vec3 objectNormal = cross(a_vertex1 - a_vertex2, a_vertex1 - a_vertex3);\n\n v_treeIndex = a_treeIndex;\n v_color = a_color;\n v_normal = normalMatrix * normalize(inverseModelMatrix * treeIndexWorldTransform * modelMatrix * vec4(objectNormal, 0.0)).xyz;\n\n vec4 mvPosition = viewMatrix * treeIndexWorldTransform * modelMatrix * vec4( transformed, 1.0 );\n vViewPosition = mvPosition.xyz;\n gl_Position = projectionMatrix * mvPosition;\n}\n"},function(e,t,n){"use strict";n.r(t),t.default="#define GLSLIFY 1\nfloat floatBitsSubset(float inNumber, int fromLeastSignificantBitIndex, int toMostSignificantBitIndex) {\n float r = float(fromLeastSignificantBitIndex);\n float l = float(toMostSignificantBitIndex);\n\n float bitShift = pow(2.0, r);\n return mod(((inNumber - mod(inNumber, bitShift)) / bitShift), pow(2.0, l - r));\n}\n\n/*\n\nExample:\n\nGet the value from bit 2 to 4 (not inclusive)\n\ninput:\ninNumber = 173 = 1010_1101 , from=2, to=4\n\nexpected output = 1010_|11|01 = 3\n\n1) subtract any bits in the least significant bit-subset\n\n mod(inNumber=173, pow(2.0, from=2)) = mod(inNumber, 4) = 1\n \n inNumber - 1 = 172\n\n2) bitshift such that we remove the least significant bit-subset\n this is guaranteed to be devisible since we subtracted the remainder\n\n (inNumber=172) / pow(2.0, from=2) = 172 / 4 = 43 = 0010_1011\n\n3) lastly, remove the most significant bit-subset\n\n mod((inNumber=43), pow(2.0, to=4 - from=2) = mod(43, 4)\n\n mod(43, 4) = 3\n\n or in binary notation: 0000_0011 which is the expected result.\n\n*/ \nmat3 G[9];\n// hard coded matrix values!!!! as suggested in https://github.com/neilmendoza/ofxPostProcessing/blob/master/src/EdgePass.cpp#L45\nconst mat3 g0 = mat3( 0.3535533845424652, 0, -0.3535533845424652, 0.5, 0, -0.5, 0.3535533845424652, 0, -0.3535533845424652 );\nconst mat3 g1 = mat3( 0.3535533845424652, 0.5, 0.3535533845424652, 0, 0, 0, -0.3535533845424652, -0.5, -0.3535533845424652 );\nconst mat3 g2 = mat3( 0, 0.3535533845424652, -0.5, -0.3535533845424652, 0, 0.3535533845424652, 0.5, -0.3535533845424652, 0 );\nconst mat3 g3 = mat3( 0.5, -0.3535533845424652, 0, -0.3535533845424652, 0, 0.3535533845424652, 0, 0.3535533845424652, -0.5 );\nconst mat3 g4 = mat3( 0, -0.5, 0, 0.5, 0, 0.5, 0, -0.5, 0 );\nconst mat3 g5 = mat3( -0.5, 0, 0.5, 0, 0, 0, 0.5, 0, -0.5 );\nconst mat3 g6 = mat3( 0.1666666716337204, -0.3333333432674408, 0.1666666716337204, -0.3333333432674408, 0.6666666865348816, -0.3333333432674408, 0.1666666716337204, -0.3333333432674408, 0.1666666716337204 );\nconst mat3 g7 = mat3( -0.3333333432674408, 0.1666666716337204, -0.3333333432674408, 0.1666666716337204, 0.6666666865348816, 0.1666666716337204, -0.3333333432674408, 0.1666666716337204, -0.3333333432674408 );\nconst mat3 g8 = mat3( 0.3333333432674408, 0.3333333432674408, 0.3333333432674408, 0.3333333432674408, 0.3333333432674408, 0.3333333432674408, 0.3333333432674408, 0.3333333432674408, 0.3333333432674408 );\n\nfloat edgeDetectionFilter(sampler2D baseTexture, vec2 uv, vec2 resolution) {\n\n vec2 texel = vec2(1.0 / resolution.x, 1.0 / resolution.y);\n\n\tG[0] = g0,\n\tG[1] = g1,\n\tG[2] = g2,\n\tG[3] = g3,\n\tG[4] = g4,\n\tG[5] = g5,\n\tG[6] = g6,\n\tG[7] = g7,\n\tG[8] = g8;\n\n\tmat3 I;\n\tfloat cnv[9];\n\tvec3 neighbour;\n\n\t/* fetch the 3x3 neighbourhood and use the RGB vector's length as intensity value */\n\tfor (int i=0; i<3; i++) {\n\t\tfor (int j=0; j<3; j++) {\n\t\t\tneighbour = texture2D(baseTexture, uv + texel * vec2(float(i)-1.0,float(j)-1.0) ).rgb;\n\t\t\tI[i][j] = length(neighbour);\n\t\t}\n\t}\n\n\t/* calculate the convolution values for all the masks */\n\tfor (int i=0; i<9; i++) {\n\t\tfloat dp3 = dot(G[i][0], I[0]) + dot(G[i][1], I[1]) + dot(G[i][2], I[2]);\n\t\tcnv[i] = dp3 * dp3;\n\t}\n\n\tfloat M = (cnv[0] + cnv[1]) + (cnv[2] + cnv[3]);\n\tfloat S = (cnv[4] + cnv[5]) + (cnv[6] + cnv[7]) + (cnv[8] + M);\n\n float edgeStrength = sqrt(M/S);\n\n return edgeStrength;\n}\n\n#include <packing>\n\nin vec2 vUv;\n\nin vec2 vUv0;\nin vec2 vUv1;\nin vec2 vUv2;\nin vec2 vUv3;\n\nuniform sampler2D tFront;\nuniform sampler2D tFrontDepth;\n\nuniform sampler2D tBack;\nuniform sampler2D tBackDepth;\n\nuniform sampler2D tCustom;\nuniform sampler2D tCustomDepth;\n\nuniform sampler2D tGhost;\nuniform sampler2D tGhostDepth;\n\nuniform sampler2D tOutlineColors;\n\nuniform float cameraNear;\nuniform float cameraFar;\n\nuniform vec2 resolution;\n\nuniform float edgeStrengthMultiplier;\nuniform float edgeGrayScaleIntensity;\n\nout vec4 outputColor;\n\nconst float infinity = 1e20;\n\nfloat computeFloatEncodedOutlineIndex(float bitEncodedFloat){\n return floatBitsSubset(floor((bitEncodedFloat * 255.0) + 0.5), 5, 8);\n}\n\nvec4 computeNeighborOutlineIndices(sampler2D colorTexture){\n float outlineIndex0 = computeFloatEncodedOutlineIndex(texture2D(colorTexture, vUv0).a);\n float outlineIndex1 = computeFloatEncodedOutlineIndex(texture2D(colorTexture, vUv1).a);\n float outlineIndex2 = computeFloatEncodedOutlineIndex(texture2D(colorTexture, vUv2).a);\n float outlineIndex3 = computeFloatEncodedOutlineIndex(texture2D(colorTexture, vUv3).a);\n\n return vec4(outlineIndex0, outlineIndex1, outlineIndex2, outlineIndex3);\n}\n\nfloat toViewZ(float depth, float near, float far){\n float normalizedDepth = depth * 2.0 - 1.0;\n return 2.0 * near * far / (far + near - normalizedDepth * (far - near)); \n}\n\nvec4 computeNeighborAlphas(sampler2D colorTexture){\n float alpha0 = texture2D(colorTexture, vUv0).a;\n float alpha1 = texture2D(colorTexture, vUv1).a;\n float alpha2 = texture2D(colorTexture, vUv2).a;\n float alpha3 = texture2D(colorTexture, vUv3).a;\n\n return vec4(alpha0, alpha1, alpha2, alpha3);\n}\n\nvoid main() {\n vec4 frontAlbedo = texture2D(tFront, vUv);\n vec4 backAlbedo = texture2D(tBack, vUv);\n vec4 customAlbedo = texture2D(tCustom, vUv);\n vec4 ghostAlbedo = texture2D(tGhost, vUv);\n\n float frontDepth = texture2D(tFrontDepth, vUv).r;\n float backDepth = texture2D(tBackDepth, vUv).r; \n float customDepth = texture2D(tCustomDepth, vUv).r;\n float ghostDepth = texture2D(tGhostDepth, vUv).r;\n\n // This is a hack to make sure that all textures are initialized\n // If a texture is unused, it will have a clear value of 0.0.\n // Without this we've seen issues with MSAA where resizing render targets\n // causes depth to cleared to either 1 or 0 depending on the device/browser\n customDepth = customDepth > 0.0 ? customDepth : 1.0; \n backDepth = backDepth > 0.0 ? backDepth : 1.0;\n ghostDepth = ghostDepth > 0.0 ? ghostDepth : 1.0;\n frontDepth = frontDepth > 0.0 ? frontDepth : 1.0; \n\n if(all(greaterThanEqual(vec4(backDepth, customDepth, ghostDepth, frontDepth), vec4(1.0)))){\n discard;\n }\n \n // Decompose and clamp \"ghost\" color\n vec4 clampedGhostAlbedo = vec4(max(ghostAlbedo.rgb, 0.5), min(ghostAlbedo.a, 0.8));\n\n float frontOutlineIndex = computeFloatEncodedOutlineIndex(frontAlbedo.a);\n vec4 frontNeighborIndices = computeNeighborOutlineIndices(tFront);\n\n // There exsists fragments of rendered objects within the edge width that should have border\n if(any(equal(frontNeighborIndices, vec4(0.0))) && frontOutlineIndex > 0.0) \n { \n float borderColorIndex = max(max(frontNeighborIndices.x, frontNeighborIndices.y), max(frontNeighborIndices.z, frontNeighborIndices.w));\n outputColor = texture2D(tOutlineColors, vec2(0.125 * borderColorIndex + (0.125 / 2.0), 0.5));\n#if defined(gl_FragDepthEXT) || defined(GL_EXT_frag_depth) \n gl_FragDepthEXT = frontDepth;\n#endif\n return;\n }\n\n // texture has drawn fragment\n if(frontDepth < 1.0){\n float customDepthTest = step(customDepth, backDepth); // zero if back is in front\n\n float a = customDepthTest > 0.0 ? ceil(customAlbedo.a) * 0.5 : ceil(backAlbedo.a) * 0.5;\n\n outputColor = vec4(frontAlbedo.rgb, 1.0) * (1.0 - a) + (vec4(backAlbedo.rgb, 1.0) * (1.0 - customDepthTest) + vec4(customAlbedo.rgb, 1.0) * customDepthTest) * a;\n#if defined(gl_FragDepthEXT) || defined(GL_EXT_frag_depth) \n gl_FragDepthEXT = texture2D(tFrontDepth, vUv).r;\n#endif\n return;\n }\n\n if (customDepth >= backDepth) {\n float backOutlineIndex = computeFloatEncodedOutlineIndex(backAlbedo.a);\n vec4 backNeighborIndices = computeNeighborOutlineIndices(tBack);\n\n if( any(equal(backNeighborIndices, vec4(0.0))) && backOutlineIndex > 0.0) \n { \n float borderColorIndex = max(max(backNeighborIndices.x, backNeighborIndices.y), max(backNeighborIndices.z, backNeighborIndices.w));\n outputColor = texture2D(tOutlineColors, vec2(0.125 * borderColorIndex + (0.125 / 2.0), 0.5));\n#if defined(gl_FragDepthEXT) || defined(GL_EXT_frag_depth)\n gl_FragDepthEXT = texture2D(tBackDepth, vUv).r;\n#endif\n return;\n }\n }\n \n float edgeStrength = 0.0;\n#if defined(EDGES)\n if (!any(equal(computeNeighborAlphas(tBack), vec4(0.0)))) {\n float depthEdge = toViewZ(backDepth, cameraNear, cameraFar);\n edgeStrength = (1.0 - smoothstep(10.0, 40.0, depthEdge)) * edgeDetectionFilter(tBack, vUv, resolution) * edgeStrengthMultiplier;\n }\n#endif\n\n // Combine color from ghost, back and custom object\n vec4 color = backAlbedo;\n float depth = backDepth;\n if (customDepth < backDepth && ghostDepth == 1.0) {\n color = vec4(customAlbedo.rgb * customAlbedo.a + (1.0 - customAlbedo.a) * backAlbedo.rgb, 1.0);\n depth = customDepth;\n edgeStrength = 0.0;\n } else if (customDepth < backDepth && ghostDepth < 1.0) {\n float s = (1.0 - step(backDepth, ghostDepth)) * clampedGhostAlbedo.a;\n vec3 modelAlbedo = mix(backAlbedo.rgb, clampedGhostAlbedo.rgb, s);\n color = vec4(customAlbedo.rgb * customAlbedo.a + (1.0 - customAlbedo.a) * modelAlbedo.rgb, 1.0);\n depth = customDepth;\n edgeStrength = 0.0;\n } else {\n float s = (1.0 - step(backDepth, ghostDepth)) * clampedGhostAlbedo.a;\n color = vec4(mix(backAlbedo.rgb, clampedGhostAlbedo.rgb, s), backAlbedo.a);\n depth = mix(backDepth, ghostDepth, s);\n }\n \n outputColor = color * (1.0 - edgeStrength) + vec4(vec3(edgeGrayScaleIntensity) * edgeStrength, 1.0);\n#if defined(gl_FragDepthEXT) || defined(GL_EXT_frag_depth) \n gl_FragDepthEXT = depth;\n#endif\n}\n"},function(e,t,n){"use strict";n.r(t),t.default="#define GLSLIFY 1\nout vec2 vUv;\n\n// selection outline\nuniform vec2 texelSize;\nout vec2 vUv0;\nout vec2 vUv1;\nout vec2 vUv2;\nout vec2 vUv3;\n\nvoid main() {\n vUv = uv;\n\n // selection outline\n vUv0 = vec2(uv.x + texelSize.x, uv.y);\n vUv1 = vec2(uv.x - texelSize.x, uv.y);\n vUv2 = vec2(uv.x, uv.y + texelSize.y);\n vUv3 = vec2(uv.x, uv.y - texelSize.y);\n\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}"},function(e,t,n){"use strict";n.r(t),t.default="#define GLSLIFY 1\n/*!\n *\n * Adapted from:\n * https://github.com/mattdesl/three-shader-fxaa\n * MIT License (MIT) Copyright (c) 2014 Matt DesLauriers\n *\n */\n\nin vec2 v_uv;\nin vec2 v_fragCoord;\nin vec2 v_rgbNW;\nin vec2 v_rgbNE;\nin vec2 v_rgbSW;\nin vec2 v_rgbSE;\nin vec2 v_rgbM;\n\nuniform vec2 inverseResolution;\nuniform vec2 resolution;\nuniform sampler2D tDiffuse;\nuniform sampler2D tDepth;\n\nout vec4 outputColor;\n\n#ifndef FXAA_REDUCE_MIN\n #define FXAA_REDUCE_MIN (1.0/ 128.0)\n#endif\n#ifndef FXAA_REDUCE_MUL\n #define FXAA_REDUCE_MUL (1.0 / 8.0)\n#endif\n#ifndef FXAA_SPAN_MAX\n #define FXAA_SPAN_MAX 8.0\n#endif\n\nvec4 fxaa(sampler2D tex, vec2 fragCoord,\n vec2 resolution, vec2 inverseResolution,\n vec2 v_rgbNW, vec2 v_rgbNE,\n vec2 v_rgbSW, vec2 v_rgbSE,\n vec2 v_rgbM) {\n vec4 color;\n\n vec3 rgbNW = texture2D(tex, v_rgbNW).xyz;\n vec3 rgbNE = texture2D(tex, v_rgbNE).xyz;\n vec3 rgbSW = texture2D(tex, v_rgbSW).xyz;\n vec3 rgbSE = texture2D(tex, v_rgbSE).xyz;\n vec4 texColor = texture2D(tex, v_rgbM);\n vec3 rgbM = texColor.xyz;\n\n vec3 luma = vec3(0.299, 0.587, 0.114);\n float lumaNW = dot(rgbNW, luma);\n float lumaNE = dot(rgbNE, luma);\n float lumaSW = dot(rgbSW, luma);\n float lumaSE = dot(rgbSE, luma);\n float lumaM = dot(rgbM, luma);\n float lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE)));\n float lumaMax = max(lumaM, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE)));\n\n mediump vec2 dir;\n dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE));\n dir.y = ((lumaNW + lumaSW) - (lumaNE + lumaSE));\n\n float dirReduce = max((lumaNW + lumaNE + lumaSW + lumaSE) *\n (0.25 * FXAA_REDUCE_MUL), FXAA_REDUCE_MIN);\n\n float rcpDirMin = 1.0 / (min(abs(dir.x), abs(dir.y)) + dirReduce);\n dir = min(vec2(FXAA_SPAN_MAX, FXAA_SPAN_MAX),\n max(vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX),\n dir * rcpDirMin));\n\n vec4 rgbA = 0.5 * (\n texture2D(tex, inverseResolution * (v_fragCoord + dir * (1.0 / 3.0 - 0.5))) +\n texture2D(tex, inverseResolution * (v_fragCoord + dir * (2.0 / 3.0 - 0.5))));\n vec4 rgbB = rgbA * 0.5 + 0.25 * (\n texture2D(tex, inverseResolution * (v_fragCoord + dir * -0.5)) +\n texture2D(tex, inverseResolution * (v_fragCoord + dir * 0.5)));\n\n float lumaB = dot(rgbB.rgb, luma);\n if ((lumaB < lumaMin) || (lumaB > lumaMax)) {\n color = rgbA;\n } else {\n color = rgbB;\n }\n return color;\n}\n\nvoid main() {\n outputColor = fxaa(tDiffuse, v_fragCoord, \n resolution, inverseResolution, \n v_rgbNW, v_rgbNE, v_rgbSW, v_rgbSE, v_rgbM);\n#if defined(gl_FragDepthEXT) || defined(GL_EXT_frag_depth)\n gl_FragDepthEXT = texture2D(tDepth, v_uv).r;\n#endif\n}\n"},function(e,t,n){"use strict";n.r(t),t.default="#define GLSLIFY 1\n/*!\n *\n * Adapted from:\n * https://github.com/mattdesl/three-shader-fxaa\n * MIT License (MIT) Copyright (c) 2014 Matt DesLauriers\n *\n */\n\nuniform vec2 resolution;\nuniform vec2 inverseResolution;\n\nout vec2 v_uv;\nout vec2 v_fragCoord;\nout vec2 v_rgbNW;\nout vec2 v_rgbNE;\nout vec2 v_rgbSW;\nout vec2 v_rgbSE;\nout vec2 v_rgbM;\n\nvoid main() {\n v_fragCoord = uv * resolution;\n v_rgbNW = (v_fragCoord + vec2(-1.0, -1.0)) * inverseResolution;\n v_rgbNE = (v_fragCoord + vec2(1.0, -1.0)) * inverseResolution;\n v_rgbSW = (v_fragCoord + vec2(-1.0, 1.0)) * inverseResolution;\n v_rgbSE = (v_fragCoord + vec2(1.0, 1.0)) * inverseResolution;\n v_rgbM = vec2(v_fragCoord * inverseResolution);\n v_uv = uv;\n\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}\n"},function(e,t,n){"use strict";n.r(t),t.default="#define GLSLIFY 1\n// From http://www.science-and-fiction.org/rendering/noise.html\nfloat rand2d(in vec2 co){\n return fract(sin(dot(co.xy, vec2(12.9898,78.233))) * 43758.5453);\n}\n\nin vec2 vUv;\n\nuniform mat4 projMatrix;\nuniform mat4 inverseProjectionMatrix;\n\nuniform vec3 kernel[MAX_KERNEL_SIZE];\n\nuniform sampler2D tDepth;\n\nuniform vec2 resolution;\n\nuniform float sampleRadius;\nuniform float bias;\n\nout vec4 outputColor;\n\nvec3 viewPosFromDepth(float depth, vec2 uv) {\n // Depth to clip space: [0, 1] -> [-1, 1]\n float z = depth * 2.0 - 1.0;\n\n // Fragment in clip space\n vec4 clipSpacePosition = vec4(uv * 2.0 - 1.0, z, 1.0);\n vec4 viewSpacePosition = inverseProjectionMatrix * clipSpacePosition;\n\n // Perspective division\n viewSpacePosition /= viewSpacePosition.w;\n\n return viewSpacePosition.xyz;\n}\n\nvec3 computeWorldNormalFromDepth(sampler2D depthTexture, vec2 resolution, vec2 uv, float sampleDepth){\n float dx = 1.0 / resolution.x;\n float dy = 1.0 / resolution.y;\n\n vec2 uv1 = uv + vec2(dx, 0.0); // right\n float d1 = texture2D(depthTexture, uv1).r; \n\n vec2 uv2 = uv + vec2(0.0, dy); // up\n float d2 = texture2D(depthTexture, uv2).r;\n\n vec2 uv3 = uv + vec2(-dx, 0.0); // left\n float d3 = texture2D(depthTexture, uv3).r;\n\n vec2 uv4 = uv + vec2(0.0, -dy); // down\n float d4 = texture2D(depthTexture, uv4).r;\n\n bool horizontalSampleCondition = abs(d1 - sampleDepth) < abs(d3 - sampleDepth);\n\n float horizontalSampleDepth = horizontalSampleCondition ? d1 : d3;\n vec2 horizontalSampleUv = horizontalSampleCondition ? uv1 : uv3;\n\n bool verticalSampleCondition = abs(d2 - sampleDepth) < abs(d4 - sampleDepth);\n\n float verticalSampleDepth = verticalSampleCondition ? d2 : d4;\n vec2 verticalSampleUv = verticalSampleCondition ? uv2 : uv4;\n\n vec3 viewPos = viewPosFromDepth(sampleDepth, vUv);\n \n vec3 viewPos1 = (horizontalSampleCondition == verticalSampleCondition) ? viewPosFromDepth(horizontalSampleDepth, horizontalSampleUv) : viewPosFromDepth(verticalSampleDepth, verticalSampleUv);\n vec3 viewPos2 = (horizontalSampleCondition == verticalSampleCondition) ? viewPosFromDepth(verticalSampleDepth, verticalSampleUv) : viewPosFromDepth(horizontalSampleDepth, horizontalSampleUv);\n\n return normalize(cross(viewPos1 - viewPos, viewPos2 - viewPos));\n}\n\nvoid main(){\n float d = texture2D(tDepth, vUv).r;\n\n vec3 viewNormal = computeWorldNormalFromDepth(tDepth, resolution, vUv, d);\n\n vec3 viewPosition = viewPosFromDepth(d, vUv);\n\n vec3 randomVec = normalize(vec3(rand2d(vUv), rand2d(vUv * 3.0), rand2d(vUv * 5.0)));\n\n vec3 tangent = normalize(randomVec - viewNormal * dot(randomVec, viewNormal));\n\n vec3 bitangent = cross(viewNormal, tangent);\n\n mat3 TBN = mat3(tangent, bitangent, viewNormal);\n\n float occlusion = 0.0;\n\n for (int i = 0; i < MAX_KERNEL_SIZE; i++){\n \n vec3 sampleVector = TBN * kernel[i];\n sampleVector = viewPosition + sampleVector * sampleRadius;\n\n vec4 offset = projMatrix * vec4(sampleVector, 1.0);\n offset.xyz /= offset.w;\n offset.xyz = offset.xyz * 0.5 + 0.5;\n\n float realDepth = texture2D(tDepth, offset.xy).r;\n vec3 realPos = viewPosFromDepth(realDepth, offset.xy);\n\n float rangeCheck = smoothstep(0.0, 1.0, sampleRadius / length(viewPosition - realPos));\n\n occlusion += (realPos.z >= sampleVector.z + bias ? 1.0 : 0.0) * rangeCheck;\n }\n\n float occlusionFactor = 1.0 - clamp(occlusion / float(MAX_KERNEL_SIZE), 0.0, 1.0);\n\n outputColor = vec4(vec3(occlusionFactor), 1.0);\n}"},function(e,t,n){"use strict";n.r(t),t.default="#define GLSLIFY 1\n// Copyright Cognite (C) 2021 Cognite\n//\n// Efficient Gaussian blur based on technique described by Daniel Rákos in\n// http://rastergrid.com/blog/2010/09/efficient-gaussian-blur-with-linear-sampling/\n// generalized for two dimensions\n\nin vec2 vUv;\n\nuniform sampler2D tDiffuse;\nuniform sampler2D tAmbientOcclusion;\n\nuniform vec2 resolution;\n\nout vec4 outputColor;\n\nvoid main() {\n float blurredAO =\n texture2D(tAmbientOcclusion, vUv + vec2(-3.1111111, -3.1111111) / resolution).r * 0.0012360 +\n texture2D(tAmbientOcclusion, vUv + vec2(-1.3333333, -3.1111111) / resolution).r * 0.0115356 +\n texture2D(tAmbientOcclusion, vUv + vec2(-3.1111111, -1.3333333) / resolution).r * 0.0115356 +\n texture2D(tAmbientOcclusion, vUv + vec2(-1.3333333, -1.3333333) / resolution).r * 0.1076660 +\n texture2D(tAmbientOcclusion, vUv + vec2(0.0000000, -3.1111111) / resolution).r * 0.0096130 +\n texture2D(tAmbientOcclusion, vUv + vec2(0.0000000, -1.3333333) / resolution).r * 0.0897217 +\n texture2D(tAmbientOcclusion, vUv + vec2(1.3333333, -3.1111111) / resolution).r * 0.0115356 +\n texture2D(tAmbientOcclusion, vUv + vec2(3.1111111, -3.1111111) / resolution).r * 0.0012360 +\n texture2D(tAmbientOcclusion, vUv + vec2(1.3333333, -1.3333333) / resolution).r * 0.1076660 +\n texture2D(tAmbientOcclusion, vUv + vec2(3.1111111, -1.3333333) / resolution).r * 0.0115356 +\n texture2D(tAmbientOcclusion, vUv + vec2(-3.1111111, 0.0000000) / resolution).r * 0.0096130 +\n texture2D(tAmbientOcclusion, vUv + vec2(-1.3333333, 0.0000000) / resolution).r * 0.0897217 +\n texture2D(tAmbientOcclusion, vUv + vec2(-3.1111111, 1.3333333) / resolution).r * 0.0115356 +\n texture2D(tAmbientOcclusion, vUv + vec2(-1.3333333, 1.3333333) / resolution).r * 0.1076660 +\n texture2D(tAmbientOcclusion, vUv + vec2(-3.1111111, 3.1111111) / resolution).r * 0.0012360 +\n texture2D(tAmbientOcclusion, vUv + vec2(-1.3333333, 3.1111111) / resolution).r * 0.0115356 +\n texture2D(tAmbientOcclusion, vUv + vec2(0.0000000, 1.3333333) / resolution).r * 0.0897217 +\n texture2D(tAmbientOcclusion, vUv + vec2(0.0000000, 3.1111111) / resolution).r * 0.0096130 +\n texture2D(tAmbientOcclusion, vUv + vec2(1.3333333, 1.3333333) / resolution).r * 0.1076660 +\n texture2D(tAmbientOcclusion, vUv + vec2(3.1111111, 1.3333333) / resolution).r * 0.0115356 +\n texture2D(tAmbientOcclusion, vUv + vec2(1.3333333, 3.1111111) / resolution).r * 0.0115356 +\n texture2D(tAmbientOcclusion, vUv + vec2(3.1111111, 3.1111111) / resolution).r * 0.0012360 +\n texture2D(tAmbientOcclusion, vUv + vec2(1.3333333, 0.0000000) / resolution).r * 0.0897217 +\n texture2D(tAmbientOcclusion, vUv + vec2(3.1111111, 0.0000000) / resolution).r * 0.0096130 +\n texture2D(tAmbientOcclusion, vUv).r * 0.0747681;\n\n outputColor = vec4(texture2D(tDiffuse, vUv).rgb * blurredAO, 1.0);\n}\n"},function(e,t,n){"use strict";n.r(t),t.default="#define GLSLIFY 1\n// From http://www.science-and-fiction.org/rendering/noise.html\nfloat rand2d(in vec2 co){\n return fract(sin(dot(co.xy, vec2(12.9898,78.233))) * 43758.5453);\n}\n\nstruct NodeAppearance {\n vec4 colorTexel;\n bool isVisible;\n bool renderInFront;\n bool renderGhosted;\n};\n\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\n\nbool isClipped(NodeAppearance nodeAppearance, vec3 point) {\n#if NUM_CLIPPING_PLANES > 0\n vec3 pointFlipped = -point;\n vec4 plane;\n\n for (int i = 0; i < UNION_CLIPPING_PLANES; i++) {\n plane = clippingPlanes[i];\n if (dot(pointFlipped, plane.xyz) > plane.w) return true;\n }\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n bool clipped = true;\n for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n clipped = (dot(pointFlipped, plane.xyz) > plane.w) && clipped;\n }\n if ( clipped ) return true;\n#endif\n#endif\n return false;\n}\n\nin mediump vec3 v_color;\nin lowp float v_coverageFactor;\nin lowp float v_visible;\nin lowp vec2 v_seed;\n\nin vec3 v_viewPosition;\n\nout vec4 outputColor;\n \nconst NodeAppearance dummyNodeAppearance = NodeAppearance(vec4(0.0), false, false, false);\n\nvoid main() {\n if(v_visible != 1.0 || isClipped(dummyNodeAppearance, v_viewPosition)){\n discard;\n }\n\n float v = rand2d(gl_FragCoord.xy + v_seed);\n if (v >= v_coverageFactor) {\n discard;\n }\n\n outputColor = vec4(v_color, 1.0);\n}\n"},function(e,t,n){"use strict";n.r(t),t.default="#define GLSLIFY 1\n/**\n * Packs the integer part of the number given to a RGB color.\n */\nvec3 packIntToColor(float number) {\n float r = floor(number / (255.0 * 255.0)) / 255.0;\n float g = mod(floor(number / 255.0), 255.0) / 255.0;\n float b = mod(number, 255.0) / 255.0;\n return vec3(r, g, b);\n}\n\nin mediump float a_sectorId;\nin lowp vec3 a_coverageFactor;\nin lowp float a_visible;\n\nout mediump vec3 v_color;\nout lowp float v_coverageFactor;\nout lowp vec2 v_seed;\nout lowp float v_visible;\n\nout vec3 v_viewPosition;\n\nvoid main()\n{\n v_visible = a_visible;\n v_color = packIntToColor(a_sectorId);\n v_coverageFactor = abs(dot(a_coverageFactor, normal));\n // A seed to ensure that two overlapping sectors A and B \n // doesn't produce the same noise pattern\n v_seed = vec2(a_sectorId / 255.0, a_sectorId / 65025.0);\n\n vec4 mvPosition = modelViewMatrix * instanceMatrix * vec4( position, 1.0 );\n\n v_viewPosition = mvPosition.xyz;\n\n gl_Position = projectionMatrix * modelViewMatrix * instanceMatrix * vec4(position, 1.0);\n}\n"},,function(e,t,n){"use strict";n.r(t),n.d(t,"NodeAppearanceProvider",(function(){return y})),n.d(t,"NodeOutlineColor",(function(){return d})),n.d(t,"NodeCollectionBase",(function(){return a})),n.d(t,"TreeIndexNodeCollection",(function(){return f})),n.d(t,"IntersectionNodeCollection",(function(){return h})),n.d(t,"UnionNodeCollection",(function(){return p})),n.d(t,"revealEnv",(function(){return i.t})),n.d(t,"IndexSet",(function(){return i.e})),n.d(t,"NumericRange",(function(){return i.i})),n.d(t,"BoundingBoxClipper",(function(){return Un.a})),n.d(t,"Cognite3DModel",(function(){return q})),n.d(t,"Cognite3DViewer",(function(){return ir})),n.d(t,"CognitePointCloudModel",(function(){return H})),n.d(t,"PotreePointShape",(function(){return rn})),n.d(t,"PotreePointColorType",(function(){return an})),n.d(t,"PotreePointSizeType",(function(){return dn})),n.d(t,"WellKnownAsprsPointClassCodes",(function(){return cn})),n.d(t,"NotSupportedInMigrationWrapperError",(function(){return k})),n.d(t,"PropertyFilterNodeCollection",(function(){return oe})),n.d(t,"SinglePropertyFilterNodeCollection",(function(){return ae})),n.d(t,"AssetNodeCollection",(function(){return te})),n.d(t,"InvertedNodeCollection",(function(){return ie})),n.d(t,"registerCustomNodeCollectionType",(function(){return ce})),n.d(t,"THREE",(function(){return l})),n.d(t,"DefaultNodeAppearance",(function(){return g})),n.d(t,"ClusteredAreaCollection",(function(){return u}));var r=n(3),o=n.n(r),i=n(1);
|
|
211
|
+
var n=r(34),i=r(35),o=r(36);function a(){return c.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function s(e,t){if(a()<t)throw new RangeError("Invalid typed array length");return c.TYPED_ARRAY_SUPPORT?(e=new Uint8Array(t)).__proto__=c.prototype:(null===e&&(e=new c(t)),e.length=t),e}function c(e,t,r){if(!(c.TYPED_ARRAY_SUPPORT||this instanceof c))return new c(e,t,r);if("number"==typeof e){if("string"==typeof t)throw new Error("If encoding is specified then the first argument must be a string");return f(this,e)}return l(this,e,t,r)}function l(e,t,r,n){if("number"==typeof t)throw new TypeError('"value" argument must not be a number');return"undefined"!=typeof ArrayBuffer&&t instanceof ArrayBuffer?function(e,t,r,n){if(t.byteLength,r<0||t.byteLength<r)throw new RangeError("'offset' is out of bounds");if(t.byteLength<r+(n||0))throw new RangeError("'length' is out of bounds");t=void 0===r&&void 0===n?new Uint8Array(t):void 0===n?new Uint8Array(t,r):new Uint8Array(t,r,n);c.TYPED_ARRAY_SUPPORT?(e=t).__proto__=c.prototype:e=u(e,t);return e}(e,t,r,n):"string"==typeof t?function(e,t,r){"string"==typeof r&&""!==r||(r="utf8");if(!c.isEncoding(r))throw new TypeError('"encoding" must be a valid string encoding');var n=0|m(t,r),i=(e=s(e,n)).write(t,r);i!==n&&(e=e.slice(0,i));return e}(e,t,r):function(e,t){if(c.isBuffer(t)){var r=0|p(t.length);return 0===(e=s(e,r)).length||t.copy(e,0,0,r),e}if(t){if("undefined"!=typeof ArrayBuffer&&t.buffer instanceof ArrayBuffer||"length"in t)return"number"!=typeof t.length||(n=t.length)!=n?s(e,0):u(e,t);if("Buffer"===t.type&&o(t.data))return u(e,t.data)}var n;throw new TypeError("First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.")}(e,t)}function d(e){if("number"!=typeof e)throw new TypeError('"size" argument must be a number');if(e<0)throw new RangeError('"size" argument must not be negative')}function f(e,t){if(d(t),e=s(e,t<0?0:0|p(t)),!c.TYPED_ARRAY_SUPPORT)for(var r=0;r<t;++r)e[r]=0;return e}function u(e,t){var r=t.length<0?0:0|p(t.length);e=s(e,r);for(var n=0;n<r;n+=1)e[n]=255&t[n];return e}function p(e){if(e>=a())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+a().toString(16)+" bytes");return 0|e}function m(e,t){if(c.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var r=e.length;if(0===r)return 0;for(var n=!1;;)switch(t){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":case void 0:return U(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return V(e).length;default:if(n)return U(e).length;t=(""+t).toLowerCase(),n=!0}}function h(e,t,r){var n=!1;if((void 0===t||t<0)&&(t=0),t>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(t>>>=0))return"";for(e||(e="utf8");;)switch(e){case"hex":return S(this,t,r);case"utf8":case"utf-8":return C(this,t,r);case"ascii":return M(this,t,r);case"latin1":case"binary":return I(this,t,r);case"base64":return w(this,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return N(this,t,r);default:if(n)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),n=!0}}function b(e,t,r){var n=e[t];e[t]=e[r],e[r]=n}function v(e,t,r,n,i){if(0===e.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),r=+r,isNaN(r)&&(r=i?0:e.length-1),r<0&&(r=e.length+r),r>=e.length){if(i)return-1;r=e.length-1}else if(r<0){if(!i)return-1;r=0}if("string"==typeof t&&(t=c.from(t,n)),c.isBuffer(t))return 0===t.length?-1:g(e,t,r,n,i);if("number"==typeof t)return t&=255,c.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(e,t,r):Uint8Array.prototype.lastIndexOf.call(e,t,r):g(e,[t],r,n,i);throw new TypeError("val must be string, number or Buffer")}function g(e,t,r,n,i){var o,a=1,s=e.length,c=t.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(e.length<2||t.length<2)return-1;a=2,s/=2,c/=2,r/=2}function l(e,t){return 1===a?e[t]:e.readUInt16BE(t*a)}if(i){var d=-1;for(o=r;o<s;o++)if(l(e,o)===l(t,-1===d?0:o-d)){if(-1===d&&(d=o),o-d+1===c)return d*a}else-1!==d&&(o-=o-d),d=-1}else for(r+c>s&&(r=s-c),o=r;o>=0;o--){for(var f=!0,u=0;u<c;u++)if(l(e,o+u)!==l(t,u)){f=!1;break}if(f)return o}return-1}function A(e,t,r,n){r=Number(r)||0;var i=e.length-r;n?(n=Number(n))>i&&(n=i):n=i;var o=t.length;if(o%2!=0)throw new TypeError("Invalid hex string");n>o/2&&(n=o/2);for(var a=0;a<n;++a){var s=parseInt(t.substr(2*a,2),16);if(isNaN(s))return a;e[r+a]=s}return a}function _(e,t,r,n){return L(U(t,e.length-r),e,r,n)}function x(e,t,r,n){return L(function(e){for(var t=[],r=0;r<e.length;++r)t.push(255&e.charCodeAt(r));return t}(t),e,r,n)}function y(e,t,r,n){return x(e,t,r,n)}function k(e,t,r,n){return L(V(t),e,r,n)}function T(e,t,r,n){return L(function(e,t){for(var r,n,i,o=[],a=0;a<e.length&&!((t-=2)<0);++a)r=e.charCodeAt(a),n=r>>8,i=r%256,o.push(i),o.push(n);return o}(t,e.length-r),e,r,n)}function w(e,t,r){return 0===t&&r===e.length?n.fromByteArray(e):n.fromByteArray(e.slice(t,r))}function C(e,t,r){r=Math.min(e.length,r);for(var n=[],i=t;i<r;){var o,a,s,c,l=e[i],d=null,f=l>239?4:l>223?3:l>191?2:1;if(i+f<=r)switch(f){case 1:l<128&&(d=l);break;case 2:128==(192&(o=e[i+1]))&&(c=(31&l)<<6|63&o)>127&&(d=c);break;case 3:o=e[i+1],a=e[i+2],128==(192&o)&&128==(192&a)&&(c=(15&l)<<12|(63&o)<<6|63&a)>2047&&(c<55296||c>57343)&&(d=c);break;case 4:o=e[i+1],a=e[i+2],s=e[i+3],128==(192&o)&&128==(192&a)&&128==(192&s)&&(c=(15&l)<<18|(63&o)<<12|(63&a)<<6|63&s)>65535&&c<1114112&&(d=c)}null===d?(d=65533,f=1):d>65535&&(d-=65536,n.push(d>>>10&1023|55296),d=56320|1023&d),n.push(d),i+=f}return function(e){var t=e.length;if(t<=4096)return String.fromCharCode.apply(String,e);var r="",n=0;for(;n<t;)r+=String.fromCharCode.apply(String,e.slice(n,n+=4096));return r}(n)}t.Buffer=c,t.SlowBuffer=function(e){+e!=e&&(e=0);return c.alloc(+e)},t.INSPECT_MAX_BYTES=50,c.TYPED_ARRAY_SUPPORT=void 0!==e.TYPED_ARRAY_SUPPORT?e.TYPED_ARRAY_SUPPORT:function(){try{var e=new Uint8Array(1);return e.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===e.foo()&&"function"==typeof e.subarray&&0===e.subarray(1,1).byteLength}catch(e){return!1}}(),t.kMaxLength=a(),c.poolSize=8192,c._augment=function(e){return e.__proto__=c.prototype,e},c.from=function(e,t,r){return l(null,e,t,r)},c.TYPED_ARRAY_SUPPORT&&(c.prototype.__proto__=Uint8Array.prototype,c.__proto__=Uint8Array,"undefined"!=typeof Symbol&&Symbol.species&&c[Symbol.species]===c&&Object.defineProperty(c,Symbol.species,{value:null,configurable:!0})),c.alloc=function(e,t,r){return function(e,t,r,n){return d(t),t<=0?s(e,t):void 0!==r?"string"==typeof n?s(e,t).fill(r,n):s(e,t).fill(r):s(e,t)}(null,e,t,r)},c.allocUnsafe=function(e){return f(null,e)},c.allocUnsafeSlow=function(e){return f(null,e)},c.isBuffer=function(e){return!(null==e||!e._isBuffer)},c.compare=function(e,t){if(!c.isBuffer(e)||!c.isBuffer(t))throw new TypeError("Arguments must be Buffers");if(e===t)return 0;for(var r=e.length,n=t.length,i=0,o=Math.min(r,n);i<o;++i)if(e[i]!==t[i]){r=e[i],n=t[i];break}return r<n?-1:n<r?1:0},c.isEncoding=function(e){switch(String(e).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},c.concat=function(e,t){if(!o(e))throw new TypeError('"list" argument must be an Array of Buffers');if(0===e.length)return c.alloc(0);var r;if(void 0===t)for(t=0,r=0;r<e.length;++r)t+=e[r].length;var n=c.allocUnsafe(t),i=0;for(r=0;r<e.length;++r){var a=e[r];if(!c.isBuffer(a))throw new TypeError('"list" argument must be an Array of Buffers');a.copy(n,i),i+=a.length}return n},c.byteLength=m,c.prototype._isBuffer=!0,c.prototype.swap16=function(){var e=this.length;if(e%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var t=0;t<e;t+=2)b(this,t,t+1);return this},c.prototype.swap32=function(){var e=this.length;if(e%4!=0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var t=0;t<e;t+=4)b(this,t,t+3),b(this,t+1,t+2);return this},c.prototype.swap64=function(){var e=this.length;if(e%8!=0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var t=0;t<e;t+=8)b(this,t,t+7),b(this,t+1,t+6),b(this,t+2,t+5),b(this,t+3,t+4);return this},c.prototype.toString=function(){var e=0|this.length;return 0===e?"":0===arguments.length?C(this,0,e):h.apply(this,arguments)},c.prototype.equals=function(e){if(!c.isBuffer(e))throw new TypeError("Argument must be a Buffer");return this===e||0===c.compare(this,e)},c.prototype.inspect=function(){var e="",r=t.INSPECT_MAX_BYTES;return this.length>0&&(e=this.toString("hex",0,r).match(/.{2}/g).join(" "),this.length>r&&(e+=" ... ")),"<Buffer "+e+">"},c.prototype.compare=function(e,t,r,n,i){if(!c.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===r&&(r=e?e.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),t<0||r>e.length||n<0||i>this.length)throw new RangeError("out of range index");if(n>=i&&t>=r)return 0;if(n>=i)return-1;if(t>=r)return 1;if(this===e)return 0;for(var o=(i>>>=0)-(n>>>=0),a=(r>>>=0)-(t>>>=0),s=Math.min(o,a),l=this.slice(n,i),d=e.slice(t,r),f=0;f<s;++f)if(l[f]!==d[f]){o=l[f],a=d[f];break}return o<a?-1:a<o?1:0},c.prototype.includes=function(e,t,r){return-1!==this.indexOf(e,t,r)},c.prototype.indexOf=function(e,t,r){return v(this,e,t,r,!0)},c.prototype.lastIndexOf=function(e,t,r){return v(this,e,t,r,!1)},c.prototype.write=function(e,t,r,n){if(void 0===t)n="utf8",r=this.length,t=0;else if(void 0===r&&"string"==typeof t)n=t,r=this.length,t=0;else{if(!isFinite(t))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");t|=0,isFinite(r)?(r|=0,void 0===n&&(n="utf8")):(n=r,r=void 0)}var i=this.length-t;if((void 0===r||r>i)&&(r=i),e.length>0&&(r<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var o=!1;;)switch(n){case"hex":return A(this,e,t,r);case"utf8":case"utf-8":return _(this,e,t,r);case"ascii":return x(this,e,t,r);case"latin1":case"binary":return y(this,e,t,r);case"base64":return k(this,e,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return T(this,e,t,r);default:if(o)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),o=!0}},c.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function M(e,t,r){var n="";r=Math.min(e.length,r);for(var i=t;i<r;++i)n+=String.fromCharCode(127&e[i]);return n}function I(e,t,r){var n="";r=Math.min(e.length,r);for(var i=t;i<r;++i)n+=String.fromCharCode(e[i]);return n}function S(e,t,r){var n=e.length;(!t||t<0)&&(t=0),(!r||r<0||r>n)&&(r=n);for(var i="",o=t;o<r;++o)i+=G(e[o]);return i}function N(e,t,r){for(var n=e.slice(t,r),i="",o=0;o<n.length;o+=2)i+=String.fromCharCode(n[o]+256*n[o+1]);return i}function R(e,t,r){if(e%1!=0||e<0)throw new RangeError("offset is not uint");if(e+t>r)throw new RangeError("Trying to access beyond buffer length")}function E(e,t,r,n,i,o){if(!c.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>i||t<o)throw new RangeError('"value" argument is out of bounds');if(r+n>e.length)throw new RangeError("Index out of range")}function P(e,t,r,n){t<0&&(t=65535+t+1);for(var i=0,o=Math.min(e.length-r,2);i<o;++i)e[r+i]=(t&255<<8*(n?i:1-i))>>>8*(n?i:1-i)}function B(e,t,r,n){t<0&&(t=4294967295+t+1);for(var i=0,o=Math.min(e.length-r,4);i<o;++i)e[r+i]=t>>>8*(n?i:3-i)&255}function D(e,t,r,n,i,o){if(r+n>e.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function O(e,t,r,n,o){return o||D(e,0,r,4),i.write(e,t,r,n,23,4),r+4}function z(e,t,r,n,o){return o||D(e,0,r,8),i.write(e,t,r,n,52,8),r+8}c.prototype.slice=function(e,t){var r,n=this.length;if((e=~~e)<0?(e+=n)<0&&(e=0):e>n&&(e=n),(t=void 0===t?n:~~t)<0?(t+=n)<0&&(t=0):t>n&&(t=n),t<e&&(t=e),c.TYPED_ARRAY_SUPPORT)(r=this.subarray(e,t)).__proto__=c.prototype;else{var i=t-e;r=new c(i,void 0);for(var o=0;o<i;++o)r[o]=this[o+e]}return r},c.prototype.readUIntLE=function(e,t,r){e|=0,t|=0,r||R(e,t,this.length);for(var n=this[e],i=1,o=0;++o<t&&(i*=256);)n+=this[e+o]*i;return n},c.prototype.readUIntBE=function(e,t,r){e|=0,t|=0,r||R(e,t,this.length);for(var n=this[e+--t],i=1;t>0&&(i*=256);)n+=this[e+--t]*i;return n},c.prototype.readUInt8=function(e,t){return t||R(e,1,this.length),this[e]},c.prototype.readUInt16LE=function(e,t){return t||R(e,2,this.length),this[e]|this[e+1]<<8},c.prototype.readUInt16BE=function(e,t){return t||R(e,2,this.length),this[e]<<8|this[e+1]},c.prototype.readUInt32LE=function(e,t){return t||R(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},c.prototype.readUInt32BE=function(e,t){return t||R(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},c.prototype.readIntLE=function(e,t,r){e|=0,t|=0,r||R(e,t,this.length);for(var n=this[e],i=1,o=0;++o<t&&(i*=256);)n+=this[e+o]*i;return n>=(i*=128)&&(n-=Math.pow(2,8*t)),n},c.prototype.readIntBE=function(e,t,r){e|=0,t|=0,r||R(e,t,this.length);for(var n=t,i=1,o=this[e+--n];n>0&&(i*=256);)o+=this[e+--n]*i;return o>=(i*=128)&&(o-=Math.pow(2,8*t)),o},c.prototype.readInt8=function(e,t){return t||R(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},c.prototype.readInt16LE=function(e,t){t||R(e,2,this.length);var r=this[e]|this[e+1]<<8;return 32768&r?4294901760|r:r},c.prototype.readInt16BE=function(e,t){t||R(e,2,this.length);var r=this[e+1]|this[e]<<8;return 32768&r?4294901760|r:r},c.prototype.readInt32LE=function(e,t){return t||R(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},c.prototype.readInt32BE=function(e,t){return t||R(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},c.prototype.readFloatLE=function(e,t){return t||R(e,4,this.length),i.read(this,e,!0,23,4)},c.prototype.readFloatBE=function(e,t){return t||R(e,4,this.length),i.read(this,e,!1,23,4)},c.prototype.readDoubleLE=function(e,t){return t||R(e,8,this.length),i.read(this,e,!0,52,8)},c.prototype.readDoubleBE=function(e,t){return t||R(e,8,this.length),i.read(this,e,!1,52,8)},c.prototype.writeUIntLE=function(e,t,r,n){(e=+e,t|=0,r|=0,n)||E(this,e,t,r,Math.pow(2,8*r)-1,0);var i=1,o=0;for(this[t]=255&e;++o<r&&(i*=256);)this[t+o]=e/i&255;return t+r},c.prototype.writeUIntBE=function(e,t,r,n){(e=+e,t|=0,r|=0,n)||E(this,e,t,r,Math.pow(2,8*r)-1,0);var i=r-1,o=1;for(this[t+i]=255&e;--i>=0&&(o*=256);)this[t+i]=e/o&255;return t+r},c.prototype.writeUInt8=function(e,t,r){return e=+e,t|=0,r||E(this,e,t,1,255,0),c.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},c.prototype.writeUInt16LE=function(e,t,r){return e=+e,t|=0,r||E(this,e,t,2,65535,0),c.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):P(this,e,t,!0),t+2},c.prototype.writeUInt16BE=function(e,t,r){return e=+e,t|=0,r||E(this,e,t,2,65535,0),c.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):P(this,e,t,!1),t+2},c.prototype.writeUInt32LE=function(e,t,r){return e=+e,t|=0,r||E(this,e,t,4,4294967295,0),c.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):B(this,e,t,!0),t+4},c.prototype.writeUInt32BE=function(e,t,r){return e=+e,t|=0,r||E(this,e,t,4,4294967295,0),c.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):B(this,e,t,!1),t+4},c.prototype.writeIntLE=function(e,t,r,n){if(e=+e,t|=0,!n){var i=Math.pow(2,8*r-1);E(this,e,t,r,i-1,-i)}var o=0,a=1,s=0;for(this[t]=255&e;++o<r&&(a*=256);)e<0&&0===s&&0!==this[t+o-1]&&(s=1),this[t+o]=(e/a>>0)-s&255;return t+r},c.prototype.writeIntBE=function(e,t,r,n){if(e=+e,t|=0,!n){var i=Math.pow(2,8*r-1);E(this,e,t,r,i-1,-i)}var o=r-1,a=1,s=0;for(this[t+o]=255&e;--o>=0&&(a*=256);)e<0&&0===s&&0!==this[t+o+1]&&(s=1),this[t+o]=(e/a>>0)-s&255;return t+r},c.prototype.writeInt8=function(e,t,r){return e=+e,t|=0,r||E(this,e,t,1,127,-128),c.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),e<0&&(e=255+e+1),this[t]=255&e,t+1},c.prototype.writeInt16LE=function(e,t,r){return e=+e,t|=0,r||E(this,e,t,2,32767,-32768),c.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):P(this,e,t,!0),t+2},c.prototype.writeInt16BE=function(e,t,r){return e=+e,t|=0,r||E(this,e,t,2,32767,-32768),c.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):P(this,e,t,!1),t+2},c.prototype.writeInt32LE=function(e,t,r){return e=+e,t|=0,r||E(this,e,t,4,2147483647,-2147483648),c.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):B(this,e,t,!0),t+4},c.prototype.writeInt32BE=function(e,t,r){return e=+e,t|=0,r||E(this,e,t,4,2147483647,-2147483648),e<0&&(e=4294967295+e+1),c.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):B(this,e,t,!1),t+4},c.prototype.writeFloatLE=function(e,t,r){return O(this,e,t,!0,r)},c.prototype.writeFloatBE=function(e,t,r){return O(this,e,t,!1,r)},c.prototype.writeDoubleLE=function(e,t,r){return z(this,e,t,!0,r)},c.prototype.writeDoubleBE=function(e,t,r){return z(this,e,t,!1,r)},c.prototype.copy=function(e,t,r,n){if(r||(r=0),n||0===n||(n=this.length),t>=e.length&&(t=e.length),t||(t=0),n>0&&n<r&&(n=r),n===r)return 0;if(0===e.length||0===this.length)return 0;if(t<0)throw new RangeError("targetStart out of bounds");if(r<0||r>=this.length)throw new RangeError("sourceStart out of bounds");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),e.length-t<n-r&&(n=e.length-t+r);var i,o=n-r;if(this===e&&r<t&&t<n)for(i=o-1;i>=0;--i)e[i+t]=this[i+r];else if(o<1e3||!c.TYPED_ARRAY_SUPPORT)for(i=0;i<o;++i)e[i+t]=this[i+r];else Uint8Array.prototype.set.call(e,this.subarray(r,r+o),t);return o},c.prototype.fill=function(e,t,r,n){if("string"==typeof e){if("string"==typeof t?(n=t,t=0,r=this.length):"string"==typeof r&&(n=r,r=this.length),1===e.length){var i=e.charCodeAt(0);i<256&&(e=i)}if(void 0!==n&&"string"!=typeof n)throw new TypeError("encoding must be a string");if("string"==typeof n&&!c.isEncoding(n))throw new TypeError("Unknown encoding: "+n)}else"number"==typeof e&&(e&=255);if(t<0||this.length<t||this.length<r)throw new RangeError("Out of range index");if(r<=t)return this;var o;if(t>>>=0,r=void 0===r?this.length:r>>>0,e||(e=0),"number"==typeof e)for(o=t;o<r;++o)this[o]=e;else{var a=c.isBuffer(e)?e:U(new c(e,n).toString()),s=a.length;for(o=0;o<r-t;++o)this[o+t]=a[o%s]}return this};var F=/[^+\/0-9A-Za-z-_]/g;function G(e){return e<16?"0"+e.toString(16):e.toString(16)}function U(e,t){var r;t=t||1/0;for(var n=e.length,i=null,o=[],a=0;a<n;++a){if((r=e.charCodeAt(a))>55295&&r<57344){if(!i){if(r>56319){(t-=3)>-1&&o.push(239,191,189);continue}if(a+1===n){(t-=3)>-1&&o.push(239,191,189);continue}i=r;continue}if(r<56320){(t-=3)>-1&&o.push(239,191,189),i=r;continue}r=65536+(i-55296<<10|r-56320)}else i&&(t-=3)>-1&&o.push(239,191,189);if(i=null,r<128){if((t-=1)<0)break;o.push(r)}else if(r<2048){if((t-=2)<0)break;o.push(r>>6|192,63&r|128)}else if(r<65536){if((t-=3)<0)break;o.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;o.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return o}function V(e){return n.toByteArray(function(e){if((e=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}(e).replace(F,"")).length<2)return"";for(;e.length%4!=0;)e+="=";return e}(e))}function L(e,t,r,n){for(var i=0;i<n&&!(i+r>=t.length||i>=e.length);++i)t[i+r]=e[i];return i}}).call(this,r(33))},function(e,t){var r;r=function(){return this}();try{r=r||new Function("return this")()}catch(e){"object"==typeof window&&(r=window)}e.exports=r},function(e,t){e.exports=require("base64-js")},function(e,t){e.exports=require("ieee754")},function(e,t){e.exports=require("isarray")},function(e,t){e.exports=require("@cognite/sdk")},function(e,t,r){"use strict";r.r(t),t.default="#define GLSLIFY 1\nuniform mat4 modelMatrix;\nuniform mat4 viewMatrix;\nuniform mat4 projectionMatrix;\n\nin vec3 position;\nin vec2 uv;\n\nout vec2 vUv;\n\nvoid main() {\n vUv = uv;\n gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);\n}\n"},function(e,t){e.exports=require("lodash/omit")},function(e,t){e.exports=require("lodash/throttle")},,function(e,t,r){"use strict";r.r(t),t.default="precision highp float;\n#define GLSLIFY 1\n\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\n/**\n * Packs the integer part of the number given to a RGB color.\n */\nvec3 packIntToColor(float number) {\n float r = floor(number / (255.0 * 255.0)) / 255.0;\n float g = mod(floor(number / 255.0), 255.0) / 255.0;\n float b = mod(number, 255.0) / 255.0;\n return vec3(r, g, b);\n}\n\nstruct GeometryTypeEnum {\n int Quad;\n int Primitive;\n int TriangleMesh;\n int InstancedMesh;\n};\n\nconst GeometryTypeEnum GeometryType = GeometryTypeEnum(1,2,3,4);\n\nconst int RenderTypeColor = 1;\nconst int RenderTypeNormal = 2;\nconst int RenderTypeTreeIndex = 3;\nconst int RenderTypePackColorAndNormal = 4;\nconst int RenderTypeDepth = 5;\nconst int RenderTypeEffects = 6;\nconst int RenderTypeGhost = 7;\nconst int RenderTypeLOD = 8;\nconst int RenderTypeDepthBufferOnly = 9;\nconst int RenderTypeGeometryType = 10;\n\n#include <packing>\n\nout vec4 outputColor;\n\nvec3 packNormalToRgb( const in vec3 normal ) {\n return normalize( normal ) * 0.5 + 0.5;\n}\n\nvoid updateFragmentColor(\n int renderMode, vec4 color, float treeIndex, \n vec3 normal, float depth, sampler2D matCapTexture, \n int geometryType) {\n if (renderMode == RenderTypeColor || renderMode == RenderTypeEffects) {\n vec3 hsv = rgb2hsv(color.rgb);\n hsv.z = min(0.5 * hsv.z + 0.5, 1.0);\n vec3 colorRGB = hsv2rgb(hsv);\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n vec4 albedo = vec4(colorRGB * (0.4 + 0.6 * amplitude), 1.0);\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec4 mc = vec4(texture(matCapTexture, cap).rgb, 1.0);\n \n outputColor = vec4(albedo.rgb * mc.rgb * 1.7, color.a);\n } else if (renderMode == RenderTypeGhost) {\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n float s = 0.4 + 0.6 * amplitude;\n outputColor = vec4(vec3(s), 0.3);\n } else if (renderMode == RenderTypeDepthBufferOnly) {\n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n } else if (renderMode == RenderTypePackColorAndNormal) {\n vec3 hsv = rgb2hsv(color.rgb);\n float a = 0.0;\n if (hsv.y > 0.01) {\n if (hsv.z > 0.5) {\n // light color\n a = (0.55 + hsv.x * 0.45);\n } else {\n // dark color\n a = (0.1 + hsv.x * 0.45);\n }\n } else {\n // no saturation - grayscale\n a = hsv.z * 0.09;\n }\n outputColor = vec4(packNormalToRgb(normal.rgb), a);\n } else if (renderMode == RenderTypeNormal) {\n outputColor = vec4(packNormalToRgb(normal), 1.0);\n } else if (renderMode == RenderTypeTreeIndex) {\n outputColor = vec4(packIntToColor(treeIndex), 1.0);\n } else if (renderMode == RenderTypeDepth) {\n outputColor = packDepthToRGBA(depth);\n } else if (renderMode == RenderTypeLOD) {\n bool isHighDetail = geometryType != GeometryType.Quad;\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture(matCapTexture, cap).rgb * 1.5;\n outputColor = isHighDetail ? vec4(vec3(0.0, 1.0, 0.0) * mc, color.a) : vec4(vec3(1.0, 1.0, 0.0) * mc, color.a);\n } else if (renderMode == RenderTypeGeometryType) {\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture(matCapTexture, cap).rgb * 1.5;\n vec3 geometryColor = \n float(geometryType == 1) * vec3(1.0, 0.0, 0.0) + // Quads\n float(geometryType == 2) * vec3(0.0, 1.0, 0.0) + // Primitives\n float(geometryType == 3) * vec3(0.0, 0.0, 1.0) + // Triangle meshes\n float(geometryType == 4) * vec3(1.0, 1.0, 0.0); // Instance meshes\n outputColor = vec4(geometryColor * mc, color.a);\n } else {\n // Unknown render mode - should not happen. \n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n }\n}\n\nstruct NodeAppearance {\n vec4 colorTexel;\n bool isVisible;\n bool renderInFront;\n bool renderGhosted;\n};\n\nfloat floatBitsSubset(float inNumber, int fromLeastSignificantBitIndex, int toMostSignificantBitIndex) {\n float r = float(fromLeastSignificantBitIndex);\n float l = float(toMostSignificantBitIndex);\n\n float bitShift = pow(2.0, r);\n return mod(((inNumber - mod(inNumber, bitShift)) / bitShift), pow(2.0, l - r));\n}\n\n/*\n\nExample:\n\nGet the value from bit 2 to 4 (not inclusive)\n\ninput:\ninNumber = 173 = 1010_1101 , from=2, to=4\n\nexpected output = 1010_|11|01 = 3\n\n1) subtract any bits in the least significant bit-subset\n\n mod(inNumber=173, pow(2.0, from=2)) = mod(inNumber, 4) = 1\n \n inNumber - 1 = 172\n\n2) bitshift such that we remove the least significant bit-subset\n this is guaranteed to be devisible since we subtracted the remainder\n\n (inNumber=172) / pow(2.0, from=2) = 172 / 4 = 43 = 0010_1011\n\n3) lastly, remove the most significant bit-subset\n\n mod((inNumber=43), pow(2.0, to=4 - from=2) = mod(43, 4)\n\n mod(43, 4) = 3\n\n or in binary notation: 0000_0011 which is the expected result.\n\n*/ \n\nNodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture, vec2 textureSize, float treeIndex) {\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = textureSize.x;\n float dataTextureHeight = textureSize.y;\n\n float u = mod(treeIndex, dataTextureWidth);\n float v = floor(treeIndex / dataTextureWidth);\n float uCoord = (u + 0.5) / dataTextureWidth;\n float vCoord = (v + 0.5) / dataTextureHeight;\n vec2 treeIndexUv = vec2(uCoord, vCoord);\n \n vec4 texel = texture(nodeAppearanceTexture, treeIndexUv);\n float alphaUnwrapped = floor((texel.a * 255.0) + 0.5);\n\n bool isVisible = floatBitsSubset(alphaUnwrapped, 0, 1) == 1.0;\n bool renderInFront = floatBitsSubset(alphaUnwrapped, 1, 2) == 1.0;\n bool renderGhosted = floatBitsSubset(alphaUnwrapped, 2, 3) == 1.0;\n\n return NodeAppearance(texel, isVisible, renderInFront, renderGhosted);\n}\n\nbool determineVisibility(NodeAppearance nodeAppearance, int renderMode) {\n return \n // In ghost mode\n ((renderMode == RenderTypeGhost) && nodeAppearance.isVisible && nodeAppearance.renderGhosted) ||\n // Not ghost mode\n ((renderMode != RenderTypeGhost) && \n !nodeAppearance.renderGhosted && nodeAppearance.isVisible && (nodeAppearance.renderInFront || renderMode != RenderTypeEffects));\n}\n\nvec4 determineColor(vec3 originalColor, NodeAppearance nodeAppearance) {\n vec4 overrideColor = nodeAppearance.colorTexel;\n if (any(greaterThan(overrideColor.rgb, vec3(0.0)))) {\n return overrideColor;\n }\n return vec4(originalColor.rgb, overrideColor.a);\n}\n\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\n\nbool isClipped(NodeAppearance nodeAppearance, vec3 point) {\n#if NUM_CLIPPING_PLANES > 0\n vec3 pointFlipped = -point;\n vec4 plane;\n\n for (int i = 0; i < UNION_CLIPPING_PLANES; i++) {\n plane = clippingPlanes[i];\n if (dot(pointFlipped, plane.xyz) > plane.w) return true;\n }\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n bool clipped = true;\n for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n clipped = (dot(pointFlipped, plane.xyz) > plane.w) && clipped;\n }\n if ( clipped ) return true;\n#endif\n#endif\n return false;\n}\n\nuniform sampler2D colorDataTexture;\nuniform sampler2D matCapTexture;\nuniform vec2 treeIndexTextureSize;\nuniform int renderMode;\n\nin float v_treeIndex;\nin vec3 v_color;\nin vec3 v_normal;\nin vec3 vViewPosition;\n\nvoid main() {\n NodeAppearance appearance = determineNodeAppearance(colorDataTexture, treeIndexTextureSize, v_treeIndex);\n if (!determineVisibility(appearance, renderMode)) {\n discard;\n }\n if (isClipped(appearance, vViewPosition)) {\n discard;\n }\n\n vec4 color = determineColor(v_color, appearance);\n updateFragmentColor(renderMode, color, v_treeIndex, v_normal, gl_FragCoord.z, matCapTexture, GeometryType.Quad);\n}\n"},function(e,t,r){"use strict";r.r(t),t.default="#define GLSLIFY 1\n// https://stackoverflow.com/questions/7059962/how-do-i-convert-a-vec4-rgba-value-to-a-float @ Arjan\nfloat unpackVec4ToFloat( vec4 packedFloat)\n{\n vec4 rgba = packedFloat;\n float sign = 1.0 - step(128.0, rgba.x) * 2.0;\n float exponent = 2.0 * mod(rgba.x, 128.0) + step(128.0, rgba.y) - 127.0;\n if (exponent == -127.0) return 0.0;\n float mantissa = mod(rgba.y, 128.0) * 65536.0 + rgba.z * 256.0 + rgba.w + 8388608.0;\n return sign * exp2(exponent - 23.0) * mantissa; \n}\n\nfloat unpackFloatFromRGBATexel(vec4 texel){\n float byteValueR = floor((texel.r * 255.0) + 0.5);\n float byteValueG = floor((texel.g * 255.0) + 0.5);\n float byteValueB = floor((texel.b * 255.0) + 0.5);\n float byteValueA = floor((texel.a * 255.0) + 0.5);\n\n return unpackVec4ToFloat(vec4(byteValueR, byteValueG, byteValueB, byteValueA));\n}\n\nmat4 determineMatrixOverride(\n float treeIndex, \n vec2 treeIndexTextureSize, \n sampler2D transformOverrideIndexTexture, \n vec2 transformOverrideTextureSize, \n sampler2D transformOverrideTexture\n) {\n\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = treeIndexTextureSize.x;\n float dataTextureHeight = treeIndexTextureSize.y;\n\n float xTreeIndexTextureCoord = mod(treeIndex, dataTextureWidth);\n float yTreeIndexTextureCoord = floor(treeIndex / dataTextureWidth);\n\n vec2 indexUV = vec2((xTreeIndexTextureCoord + 0.5) / dataTextureWidth, (yTreeIndexTextureCoord + 0.5) / dataTextureHeight);\n\n vec3 indexTexel = texture(transformOverrideIndexTexture, indexUV).rgb;\n\n float index = floor(indexTexel.r * 256.0) * 65536.0 + floor(indexTexel.g * 256.0) * 256.0 + floor(indexTexel.b * 256.0);\n \n \n if(index == 0.0){\n return mat4(\n 1.0, 0.0, 0.0, 0.0,\n 0.0, 1.0, 0.0, 0.0,\n 0.0, 0.0, 1.0, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n }\n\n index = index - 1.0;\n float overridesPerRow = transformOverrideTextureSize.x / 16.0;\n\n float xOverrideTextureCoord = mod(index, overridesPerRow);\n float yOverrideTextureCoord = floor(index / overridesPerRow);\n\n float cellWidth = 1.0 / transformOverrideTextureSize.x;\n float cellHeight = 1.0 / transformOverrideTextureSize.y;\n\n float overrideU = (xOverrideTextureCoord / overridesPerRow) + cellWidth / 2.0;\n float overrideV = (yOverrideTextureCoord / transformOverrideTextureSize.y) + cellHeight / 2.0;\n\n vec2 overrideUV = vec2(overrideU, overrideV); \n\n float matrixElements[12];\n\n for(int i = 0; i < 12; i++){\n matrixElements[i] = unpackFloatFromRGBATexel(texture(transformOverrideTexture, overrideUV + vec2(float(i) * cellWidth, 0.0)));\n }\n \n return mat4(\n matrixElements[0], matrixElements[4], matrixElements[8], 0,\n matrixElements[1], matrixElements[5], matrixElements[9], 0,\n matrixElements[2], matrixElements[6], matrixElements[10], 0,\n matrixElements[3], matrixElements[7], matrixElements[11], 1\n );\n}\n\nuniform mat4 inverseModelMatrix;\nuniform mat4 modelMatrix;\nuniform mat4 viewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat3 normalMatrix;\nuniform vec2 treeIndexTextureSize;\nuniform vec2 transformOverrideTextureSize;\nuniform sampler2D transformOverrideIndexTexture;\nuniform sampler2D transformOverrideTexture;\n\nin vec3 position;\nin vec3 normal;\nin vec3 color;\nin float treeIndex;\nin vec4 matrix0;\nin vec4 matrix1;\nin vec4 matrix2;\nin vec4 matrix3;\n\nout float v_treeIndex;\nout vec3 v_color;\nout vec3 v_normal;\nout vec3 vViewPosition;\n\nvoid main() {\n \n mat4 treeIndexWorldTransform = determineMatrixOverride(\n treeIndex, \n treeIndexTextureSize, \n transformOverrideIndexTexture, \n transformOverrideTextureSize, \n transformOverrideTexture\n );\n\n v_treeIndex = treeIndex;\n v_color = color;\n v_normal = normalize(normalMatrix * (inverseModelMatrix * treeIndexWorldTransform * modelMatrix * vec4(normalize(normal), 0.0)).xyz);\n mat4 instanceMatrix = mat4(matrix0, matrix1, matrix2, matrix3);\n vec3 transformed = (instanceMatrix * vec4(position, 1.0)).xyz;\n vec4 mvPosition = viewMatrix * treeIndexWorldTransform * modelMatrix * vec4( transformed, 1.0 );\n vViewPosition = mvPosition.xyz;\n gl_Position = projectionMatrix * mvPosition;\n}\n"},function(e,t,r){"use strict";r.r(t),t.default="precision highp float;\n#define GLSLIFY 1\n\nvec3 derivateNormal(vec3 v_viewPosition) {\n vec3 fdx = vec3(dFdx(v_viewPosition.x), dFdx(v_viewPosition.y), dFdx(v_viewPosition.z));\n vec3 fdy = vec3(dFdy(v_viewPosition.x), dFdy(v_viewPosition.y), dFdy(v_viewPosition.z));\n vec3 normal = normalize(cross(fdx, fdy));\n return normal;\n}\n\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\n/**\n * Packs the integer part of the number given to a RGB color.\n */\nvec3 packIntToColor(float number) {\n float r = floor(number / (255.0 * 255.0)) / 255.0;\n float g = mod(floor(number / 255.0), 255.0) / 255.0;\n float b = mod(number, 255.0) / 255.0;\n return vec3(r, g, b);\n}\n\nstruct GeometryTypeEnum {\n int Quad;\n int Primitive;\n int TriangleMesh;\n int InstancedMesh;\n};\n\nconst GeometryTypeEnum GeometryType = GeometryTypeEnum(1,2,3,4);\n\nconst int RenderTypeColor = 1;\nconst int RenderTypeNormal = 2;\nconst int RenderTypeTreeIndex = 3;\nconst int RenderTypePackColorAndNormal = 4;\nconst int RenderTypeDepth = 5;\nconst int RenderTypeEffects = 6;\nconst int RenderTypeGhost = 7;\nconst int RenderTypeLOD = 8;\nconst int RenderTypeDepthBufferOnly = 9;\nconst int RenderTypeGeometryType = 10;\n\n#include <packing>\n\nout vec4 outputColor;\n\nvec3 packNormalToRgb( const in vec3 normal ) {\n return normalize( normal ) * 0.5 + 0.5;\n}\n\nvoid updateFragmentColor(\n int renderMode, vec4 color, float treeIndex, \n vec3 normal, float depth, sampler2D matCapTexture, \n int geometryType) {\n if (renderMode == RenderTypeColor || renderMode == RenderTypeEffects) {\n vec3 hsv = rgb2hsv(color.rgb);\n hsv.z = min(0.5 * hsv.z + 0.5, 1.0);\n vec3 colorRGB = hsv2rgb(hsv);\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n vec4 albedo = vec4(colorRGB * (0.4 + 0.6 * amplitude), 1.0);\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec4 mc = vec4(texture(matCapTexture, cap).rgb, 1.0);\n \n outputColor = vec4(albedo.rgb * mc.rgb * 1.7, color.a);\n } else if (renderMode == RenderTypeGhost) {\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n float s = 0.4 + 0.6 * amplitude;\n outputColor = vec4(vec3(s), 0.3);\n } else if (renderMode == RenderTypeDepthBufferOnly) {\n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n } else if (renderMode == RenderTypePackColorAndNormal) {\n vec3 hsv = rgb2hsv(color.rgb);\n float a = 0.0;\n if (hsv.y > 0.01) {\n if (hsv.z > 0.5) {\n // light color\n a = (0.55 + hsv.x * 0.45);\n } else {\n // dark color\n a = (0.1 + hsv.x * 0.45);\n }\n } else {\n // no saturation - grayscale\n a = hsv.z * 0.09;\n }\n outputColor = vec4(packNormalToRgb(normal.rgb), a);\n } else if (renderMode == RenderTypeNormal) {\n outputColor = vec4(packNormalToRgb(normal), 1.0);\n } else if (renderMode == RenderTypeTreeIndex) {\n outputColor = vec4(packIntToColor(treeIndex), 1.0);\n } else if (renderMode == RenderTypeDepth) {\n outputColor = packDepthToRGBA(depth);\n } else if (renderMode == RenderTypeLOD) {\n bool isHighDetail = geometryType != GeometryType.Quad;\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture(matCapTexture, cap).rgb * 1.5;\n outputColor = isHighDetail ? vec4(vec3(0.0, 1.0, 0.0) * mc, color.a) : vec4(vec3(1.0, 1.0, 0.0) * mc, color.a);\n } else if (renderMode == RenderTypeGeometryType) {\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture(matCapTexture, cap).rgb * 1.5;\n vec3 geometryColor = \n float(geometryType == 1) * vec3(1.0, 0.0, 0.0) + // Quads\n float(geometryType == 2) * vec3(0.0, 1.0, 0.0) + // Primitives\n float(geometryType == 3) * vec3(0.0, 0.0, 1.0) + // Triangle meshes\n float(geometryType == 4) * vec3(1.0, 1.0, 0.0); // Instance meshes\n outputColor = vec4(geometryColor * mc, color.a);\n } else {\n // Unknown render mode - should not happen. \n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n }\n}\n\nstruct NodeAppearance {\n vec4 colorTexel;\n bool isVisible;\n bool renderInFront;\n bool renderGhosted;\n};\n\nfloat floatBitsSubset(float inNumber, int fromLeastSignificantBitIndex, int toMostSignificantBitIndex) {\n float r = float(fromLeastSignificantBitIndex);\n float l = float(toMostSignificantBitIndex);\n\n float bitShift = pow(2.0, r);\n return mod(((inNumber - mod(inNumber, bitShift)) / bitShift), pow(2.0, l - r));\n}\n\n/*\n\nExample:\n\nGet the value from bit 2 to 4 (not inclusive)\n\ninput:\ninNumber = 173 = 1010_1101 , from=2, to=4\n\nexpected output = 1010_|11|01 = 3\n\n1) subtract any bits in the least significant bit-subset\n\n mod(inNumber=173, pow(2.0, from=2)) = mod(inNumber, 4) = 1\n \n inNumber - 1 = 172\n\n2) bitshift such that we remove the least significant bit-subset\n this is guaranteed to be devisible since we subtracted the remainder\n\n (inNumber=172) / pow(2.0, from=2) = 172 / 4 = 43 = 0010_1011\n\n3) lastly, remove the most significant bit-subset\n\n mod((inNumber=43), pow(2.0, to=4 - from=2) = mod(43, 4)\n\n mod(43, 4) = 3\n\n or in binary notation: 0000_0011 which is the expected result.\n\n*/ \n\nNodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture, vec2 textureSize, float treeIndex) {\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = textureSize.x;\n float dataTextureHeight = textureSize.y;\n\n float u = mod(treeIndex, dataTextureWidth);\n float v = floor(treeIndex / dataTextureWidth);\n float uCoord = (u + 0.5) / dataTextureWidth;\n float vCoord = (v + 0.5) / dataTextureHeight;\n vec2 treeIndexUv = vec2(uCoord, vCoord);\n \n vec4 texel = texture(nodeAppearanceTexture, treeIndexUv);\n float alphaUnwrapped = floor((texel.a * 255.0) + 0.5);\n\n bool isVisible = floatBitsSubset(alphaUnwrapped, 0, 1) == 1.0;\n bool renderInFront = floatBitsSubset(alphaUnwrapped, 1, 2) == 1.0;\n bool renderGhosted = floatBitsSubset(alphaUnwrapped, 2, 3) == 1.0;\n\n return NodeAppearance(texel, isVisible, renderInFront, renderGhosted);\n}\n\nvec4 determineColor(vec3 originalColor, NodeAppearance nodeAppearance) {\n vec4 overrideColor = nodeAppearance.colorTexel;\n if (any(greaterThan(overrideColor.rgb, vec3(0.0)))) {\n return overrideColor;\n }\n return vec4(originalColor.rgb, overrideColor.a);\n}\n\nbool determineVisibility(NodeAppearance nodeAppearance, int renderMode) {\n return \n // In ghost mode\n ((renderMode == RenderTypeGhost) && nodeAppearance.isVisible && nodeAppearance.renderGhosted) ||\n // Not ghost mode\n ((renderMode != RenderTypeGhost) && \n !nodeAppearance.renderGhosted && nodeAppearance.isVisible && (nodeAppearance.renderInFront || renderMode != RenderTypeEffects));\n}\n\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\n\nbool isClipped(NodeAppearance nodeAppearance, vec3 point) {\n#if NUM_CLIPPING_PLANES > 0\n vec3 pointFlipped = -point;\n vec4 plane;\n\n for (int i = 0; i < UNION_CLIPPING_PLANES; i++) {\n plane = clippingPlanes[i];\n if (dot(pointFlipped, plane.xyz) > plane.w) return true;\n }\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n bool clipped = true;\n for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n clipped = (dot(pointFlipped, plane.xyz) > plane.w) && clipped;\n }\n if ( clipped ) return true;\n#endif\n#endif\n return false;\n}\n\nuniform sampler2D colorDataTexture;\nuniform sampler2D matCapTexture;\nuniform vec2 treeIndexTextureSize;\nuniform int renderMode;\n\nin float v_treeIndex;\nin vec3 v_color;\nin vec3 v_viewPosition;\n\nvoid main()\n{\n NodeAppearance appearance = determineNodeAppearance(colorDataTexture, treeIndexTextureSize, v_treeIndex);\n if (!determineVisibility(appearance, renderMode)) {\n discard;\n }\n\n if (isClipped(appearance, v_viewPosition)) {\n discard;\n }\n\n vec4 color = determineColor(v_color, appearance);\n vec3 normal = derivateNormal(v_viewPosition);\n updateFragmentColor(renderMode, color, v_treeIndex, normal, gl_FragCoord.z, matCapTexture, GeometryType.TriangleMesh);\n}\n"},function(e,t,r){"use strict";r.r(t),t.default="#define GLSLIFY 1\n// https://stackoverflow.com/questions/7059962/how-do-i-convert-a-vec4-rgba-value-to-a-float @ Arjan\nfloat unpackVec4ToFloat( vec4 packedFloat)\n{\n vec4 rgba = packedFloat;\n float sign = 1.0 - step(128.0, rgba.x) * 2.0;\n float exponent = 2.0 * mod(rgba.x, 128.0) + step(128.0, rgba.y) - 127.0;\n if (exponent == -127.0) return 0.0;\n float mantissa = mod(rgba.y, 128.0) * 65536.0 + rgba.z * 256.0 + rgba.w + 8388608.0;\n return sign * exp2(exponent - 23.0) * mantissa; \n}\n\nfloat unpackFloatFromRGBATexel(vec4 texel){\n float byteValueR = floor((texel.r * 255.0) + 0.5);\n float byteValueG = floor((texel.g * 255.0) + 0.5);\n float byteValueB = floor((texel.b * 255.0) + 0.5);\n float byteValueA = floor((texel.a * 255.0) + 0.5);\n\n return unpackVec4ToFloat(vec4(byteValueR, byteValueG, byteValueB, byteValueA));\n}\n\nmat4 determineMatrixOverride(\n float treeIndex, \n vec2 treeIndexTextureSize, \n sampler2D transformOverrideIndexTexture, \n vec2 transformOverrideTextureSize, \n sampler2D transformOverrideTexture\n) {\n\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = treeIndexTextureSize.x;\n float dataTextureHeight = treeIndexTextureSize.y;\n\n float xTreeIndexTextureCoord = mod(treeIndex, dataTextureWidth);\n float yTreeIndexTextureCoord = floor(treeIndex / dataTextureWidth);\n\n vec2 indexUV = vec2((xTreeIndexTextureCoord + 0.5) / dataTextureWidth, (yTreeIndexTextureCoord + 0.5) / dataTextureHeight);\n\n vec3 indexTexel = texture(transformOverrideIndexTexture, indexUV).rgb;\n\n float index = floor(indexTexel.r * 256.0) * 65536.0 + floor(indexTexel.g * 256.0) * 256.0 + floor(indexTexel.b * 256.0);\n \n \n if(index == 0.0){\n return mat4(\n 1.0, 0.0, 0.0, 0.0,\n 0.0, 1.0, 0.0, 0.0,\n 0.0, 0.0, 1.0, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n }\n\n index = index - 1.0;\n float overridesPerRow = transformOverrideTextureSize.x / 16.0;\n\n float xOverrideTextureCoord = mod(index, overridesPerRow);\n float yOverrideTextureCoord = floor(index / overridesPerRow);\n\n float cellWidth = 1.0 / transformOverrideTextureSize.x;\n float cellHeight = 1.0 / transformOverrideTextureSize.y;\n\n float overrideU = (xOverrideTextureCoord / overridesPerRow) + cellWidth / 2.0;\n float overrideV = (yOverrideTextureCoord / transformOverrideTextureSize.y) + cellHeight / 2.0;\n\n vec2 overrideUV = vec2(overrideU, overrideV); \n\n float matrixElements[12];\n\n for(int i = 0; i < 12; i++){\n matrixElements[i] = unpackFloatFromRGBATexel(texture(transformOverrideTexture, overrideUV + vec2(float(i) * cellWidth, 0.0)));\n }\n \n return mat4(\n matrixElements[0], matrixElements[4], matrixElements[8], 0,\n matrixElements[1], matrixElements[5], matrixElements[9], 0,\n matrixElements[2], matrixElements[6], matrixElements[10], 0,\n matrixElements[3], matrixElements[7], matrixElements[11], 1\n );\n}\n\nuniform mat4 modelMatrix;\nuniform mat4 viewMatrix;\nuniform mat4 projectionMatrix;\nuniform vec2 treeIndexTextureSize;\nuniform vec2 transformOverrideTextureSize;\nuniform sampler2D transformOverrideIndexTexture;\nuniform sampler2D transformOverrideTexture;\n\nin vec3 position;\nin vec3 color;\nin float treeIndex; \n\nout vec3 v_color;\nout float v_treeIndex;\nout vec3 v_viewPosition;\n\nvoid main() {\n v_color = color;\n v_treeIndex = treeIndex;\n\n mat4 treeIndexWorldTransform = determineMatrixOverride(\n treeIndex, \n treeIndexTextureSize, \n transformOverrideIndexTexture, \n transformOverrideTextureSize, \n transformOverrideTexture\n );\n\n vec4 modelViewPosition = viewMatrix * treeIndexWorldTransform * modelMatrix * vec4(position, 1.0);\n v_viewPosition = modelViewPosition.xyz;\n gl_Position = projectionMatrix * modelViewPosition;\n}\n"},function(e,t,r){"use strict";r.r(t),t.default="precision highp float;\n#define GLSLIFY 1\n\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\n/**\n * Packs the integer part of the number given to a RGB color.\n */\nvec3 packIntToColor(float number) {\n float r = floor(number / (255.0 * 255.0)) / 255.0;\n float g = mod(floor(number / 255.0), 255.0) / 255.0;\n float b = mod(number, 255.0) / 255.0;\n return vec3(r, g, b);\n}\n\nstruct GeometryTypeEnum {\n int Quad;\n int Primitive;\n int TriangleMesh;\n int InstancedMesh;\n};\n\nconst GeometryTypeEnum GeometryType = GeometryTypeEnum(1,2,3,4);\n\nconst int RenderTypeColor = 1;\nconst int RenderTypeNormal = 2;\nconst int RenderTypeTreeIndex = 3;\nconst int RenderTypePackColorAndNormal = 4;\nconst int RenderTypeDepth = 5;\nconst int RenderTypeEffects = 6;\nconst int RenderTypeGhost = 7;\nconst int RenderTypeLOD = 8;\nconst int RenderTypeDepthBufferOnly = 9;\nconst int RenderTypeGeometryType = 10;\n\n#include <packing>\n\nout vec4 outputColor;\n\nvec3 packNormalToRgb( const in vec3 normal ) {\n return normalize( normal ) * 0.5 + 0.5;\n}\n\nvoid updateFragmentColor(\n int renderMode, vec4 color, float treeIndex, \n vec3 normal, float depth, sampler2D matCapTexture, \n int geometryType) {\n if (renderMode == RenderTypeColor || renderMode == RenderTypeEffects) {\n vec3 hsv = rgb2hsv(color.rgb);\n hsv.z = min(0.5 * hsv.z + 0.5, 1.0);\n vec3 colorRGB = hsv2rgb(hsv);\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n vec4 albedo = vec4(colorRGB * (0.4 + 0.6 * amplitude), 1.0);\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec4 mc = vec4(texture(matCapTexture, cap).rgb, 1.0);\n \n outputColor = vec4(albedo.rgb * mc.rgb * 1.7, color.a);\n } else if (renderMode == RenderTypeGhost) {\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n float s = 0.4 + 0.6 * amplitude;\n outputColor = vec4(vec3(s), 0.3);\n } else if (renderMode == RenderTypeDepthBufferOnly) {\n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n } else if (renderMode == RenderTypePackColorAndNormal) {\n vec3 hsv = rgb2hsv(color.rgb);\n float a = 0.0;\n if (hsv.y > 0.01) {\n if (hsv.z > 0.5) {\n // light color\n a = (0.55 + hsv.x * 0.45);\n } else {\n // dark color\n a = (0.1 + hsv.x * 0.45);\n }\n } else {\n // no saturation - grayscale\n a = hsv.z * 0.09;\n }\n outputColor = vec4(packNormalToRgb(normal.rgb), a);\n } else if (renderMode == RenderTypeNormal) {\n outputColor = vec4(packNormalToRgb(normal), 1.0);\n } else if (renderMode == RenderTypeTreeIndex) {\n outputColor = vec4(packIntToColor(treeIndex), 1.0);\n } else if (renderMode == RenderTypeDepth) {\n outputColor = packDepthToRGBA(depth);\n } else if (renderMode == RenderTypeLOD) {\n bool isHighDetail = geometryType != GeometryType.Quad;\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture(matCapTexture, cap).rgb * 1.5;\n outputColor = isHighDetail ? vec4(vec3(0.0, 1.0, 0.0) * mc, color.a) : vec4(vec3(1.0, 1.0, 0.0) * mc, color.a);\n } else if (renderMode == RenderTypeGeometryType) {\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture(matCapTexture, cap).rgb * 1.5;\n vec3 geometryColor = \n float(geometryType == 1) * vec3(1.0, 0.0, 0.0) + // Quads\n float(geometryType == 2) * vec3(0.0, 1.0, 0.0) + // Primitives\n float(geometryType == 3) * vec3(0.0, 0.0, 1.0) + // Triangle meshes\n float(geometryType == 4) * vec3(1.0, 1.0, 0.0); // Instance meshes\n outputColor = vec4(geometryColor * mc, color.a);\n } else {\n // Unknown render mode - should not happen. \n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n }\n}\n\nstruct NodeAppearance {\n vec4 colorTexel;\n bool isVisible;\n bool renderInFront;\n bool renderGhosted;\n};\n\nfloat floatBitsSubset(float inNumber, int fromLeastSignificantBitIndex, int toMostSignificantBitIndex) {\n float r = float(fromLeastSignificantBitIndex);\n float l = float(toMostSignificantBitIndex);\n\n float bitShift = pow(2.0, r);\n return mod(((inNumber - mod(inNumber, bitShift)) / bitShift), pow(2.0, l - r));\n}\n\n/*\n\nExample:\n\nGet the value from bit 2 to 4 (not inclusive)\n\ninput:\ninNumber = 173 = 1010_1101 , from=2, to=4\n\nexpected output = 1010_|11|01 = 3\n\n1) subtract any bits in the least significant bit-subset\n\n mod(inNumber=173, pow(2.0, from=2)) = mod(inNumber, 4) = 1\n \n inNumber - 1 = 172\n\n2) bitshift such that we remove the least significant bit-subset\n this is guaranteed to be devisible since we subtracted the remainder\n\n (inNumber=172) / pow(2.0, from=2) = 172 / 4 = 43 = 0010_1011\n\n3) lastly, remove the most significant bit-subset\n\n mod((inNumber=43), pow(2.0, to=4 - from=2) = mod(43, 4)\n\n mod(43, 4) = 3\n\n or in binary notation: 0000_0011 which is the expected result.\n\n*/ \n\nNodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture, vec2 textureSize, float treeIndex) {\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = textureSize.x;\n float dataTextureHeight = textureSize.y;\n\n float u = mod(treeIndex, dataTextureWidth);\n float v = floor(treeIndex / dataTextureWidth);\n float uCoord = (u + 0.5) / dataTextureWidth;\n float vCoord = (v + 0.5) / dataTextureHeight;\n vec2 treeIndexUv = vec2(uCoord, vCoord);\n \n vec4 texel = texture(nodeAppearanceTexture, treeIndexUv);\n float alphaUnwrapped = floor((texel.a * 255.0) + 0.5);\n\n bool isVisible = floatBitsSubset(alphaUnwrapped, 0, 1) == 1.0;\n bool renderInFront = floatBitsSubset(alphaUnwrapped, 1, 2) == 1.0;\n bool renderGhosted = floatBitsSubset(alphaUnwrapped, 2, 3) == 1.0;\n\n return NodeAppearance(texel, isVisible, renderInFront, renderGhosted);\n}\n\nbool determineVisibility(NodeAppearance nodeAppearance, int renderMode) {\n return \n // In ghost mode\n ((renderMode == RenderTypeGhost) && nodeAppearance.isVisible && nodeAppearance.renderGhosted) ||\n // Not ghost mode\n ((renderMode != RenderTypeGhost) && \n !nodeAppearance.renderGhosted && nodeAppearance.isVisible && (nodeAppearance.renderInFront || renderMode != RenderTypeEffects));\n}\n\nvec4 determineColor(vec3 originalColor, NodeAppearance nodeAppearance) {\n vec4 overrideColor = nodeAppearance.colorTexel;\n if (any(greaterThan(overrideColor.rgb, vec3(0.0)))) {\n return overrideColor;\n }\n return vec4(originalColor.rgb, overrideColor.a);\n}\n\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\n\nbool isClipped(NodeAppearance nodeAppearance, vec3 point) {\n#if NUM_CLIPPING_PLANES > 0\n vec3 pointFlipped = -point;\n vec4 plane;\n\n for (int i = 0; i < UNION_CLIPPING_PLANES; i++) {\n plane = clippingPlanes[i];\n if (dot(pointFlipped, plane.xyz) > plane.w) return true;\n }\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n bool clipped = true;\n for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n clipped = (dot(pointFlipped, plane.xyz) > plane.w) && clipped;\n }\n if ( clipped ) return true;\n#endif\n#endif\n return false;\n}\n\nuniform sampler2D colorDataTexture;\nuniform sampler2D matCapTexture;\nuniform vec2 treeIndexTextureSize;\nuniform int renderMode;\n\nin float v_treeIndex;\nin vec2 v_xy;\nin vec3 v_color;\nin vec3 v_normal;\nin vec3 vViewPosition;\n\nvoid main() {\n float dist = dot(v_xy, v_xy);\n vec3 normal = normalize( v_normal );\n if (dist > 0.25)\n discard;\n \n NodeAppearance appearance = determineNodeAppearance(colorDataTexture, treeIndexTextureSize, v_treeIndex);\n if (!determineVisibility(appearance, renderMode)) {\n discard;\n }\n if (isClipped(appearance, vViewPosition)) {\n discard;\n }\n\n vec4 color = determineColor(v_color, appearance);\n updateFragmentColor(renderMode, color, v_treeIndex, normal, gl_FragCoord.z, matCapTexture, GeometryType.Primitive);\n}\n"},function(e,t,r){"use strict";r.r(t),t.default="#define GLSLIFY 1\n// https://stackoverflow.com/questions/7059962/how-do-i-convert-a-vec4-rgba-value-to-a-float @ Arjan\nfloat unpackVec4ToFloat( vec4 packedFloat)\n{\n vec4 rgba = packedFloat;\n float sign = 1.0 - step(128.0, rgba.x) * 2.0;\n float exponent = 2.0 * mod(rgba.x, 128.0) + step(128.0, rgba.y) - 127.0;\n if (exponent == -127.0) return 0.0;\n float mantissa = mod(rgba.y, 128.0) * 65536.0 + rgba.z * 256.0 + rgba.w + 8388608.0;\n return sign * exp2(exponent - 23.0) * mantissa; \n}\n\nfloat unpackFloatFromRGBATexel(vec4 texel){\n float byteValueR = floor((texel.r * 255.0) + 0.5);\n float byteValueG = floor((texel.g * 255.0) + 0.5);\n float byteValueB = floor((texel.b * 255.0) + 0.5);\n float byteValueA = floor((texel.a * 255.0) + 0.5);\n\n return unpackVec4ToFloat(vec4(byteValueR, byteValueG, byteValueB, byteValueA));\n}\n\nmat4 determineMatrixOverride(\n float treeIndex, \n vec2 treeIndexTextureSize, \n sampler2D transformOverrideIndexTexture, \n vec2 transformOverrideTextureSize, \n sampler2D transformOverrideTexture\n) {\n\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = treeIndexTextureSize.x;\n float dataTextureHeight = treeIndexTextureSize.y;\n\n float xTreeIndexTextureCoord = mod(treeIndex, dataTextureWidth);\n float yTreeIndexTextureCoord = floor(treeIndex / dataTextureWidth);\n\n vec2 indexUV = vec2((xTreeIndexTextureCoord + 0.5) / dataTextureWidth, (yTreeIndexTextureCoord + 0.5) / dataTextureHeight);\n\n vec3 indexTexel = texture(transformOverrideIndexTexture, indexUV).rgb;\n\n float index = floor(indexTexel.r * 256.0) * 65536.0 + floor(indexTexel.g * 256.0) * 256.0 + floor(indexTexel.b * 256.0);\n \n \n if(index == 0.0){\n return mat4(\n 1.0, 0.0, 0.0, 0.0,\n 0.0, 1.0, 0.0, 0.0,\n 0.0, 0.0, 1.0, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n }\n\n index = index - 1.0;\n float overridesPerRow = transformOverrideTextureSize.x / 16.0;\n\n float xOverrideTextureCoord = mod(index, overridesPerRow);\n float yOverrideTextureCoord = floor(index / overridesPerRow);\n\n float cellWidth = 1.0 / transformOverrideTextureSize.x;\n float cellHeight = 1.0 / transformOverrideTextureSize.y;\n\n float overrideU = (xOverrideTextureCoord / overridesPerRow) + cellWidth / 2.0;\n float overrideV = (yOverrideTextureCoord / transformOverrideTextureSize.y) + cellHeight / 2.0;\n\n vec2 overrideUV = vec2(overrideU, overrideV); \n\n float matrixElements[12];\n\n for(int i = 0; i < 12; i++){\n matrixElements[i] = unpackFloatFromRGBATexel(texture(transformOverrideTexture, overrideUV + vec2(float(i) * cellWidth, 0.0)));\n }\n \n return mat4(\n matrixElements[0], matrixElements[4], matrixElements[8], 0,\n matrixElements[1], matrixElements[5], matrixElements[9], 0,\n matrixElements[2], matrixElements[6], matrixElements[10], 0,\n matrixElements[3], matrixElements[7], matrixElements[11], 1\n );\n}\n\nuniform mat4 inverseModelMatrix;\nuniform mat4 modelMatrix;\nuniform mat4 viewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat3 normalMatrix;\nuniform vec2 treeIndexTextureSize;\nuniform vec2 transformOverrideTextureSize;\nuniform sampler2D transformOverrideIndexTexture;\nuniform sampler2D transformOverrideTexture;\n\nin vec3 position;\nin mat4 a_instanceMatrix;\nin float a_treeIndex;\nin vec3 a_color;\nin vec3 a_normal;\n\nout vec2 v_xy;\nout vec3 v_color;\nout vec3 v_normal;\nout float v_treeIndex;\nout vec3 vViewPosition;\n\nvoid main() {\n v_xy = vec2(position.x, position.y);\n v_treeIndex = a_treeIndex;\n\n mat4 treeIndexWorldTransform = determineMatrixOverride(\n a_treeIndex, \n treeIndexTextureSize, \n transformOverrideIndexTexture, \n transformOverrideTextureSize, \n transformOverrideTexture\n );\n\n vec3 transformed = (a_instanceMatrix * vec4(position, 1.0)).xyz;\n vec4 mvPosition = viewMatrix * treeIndexWorldTransform * modelMatrix * vec4( transformed, 1.0 );\n v_color = a_color;\n\n v_normal = normalMatrix * normalize(inverseModelMatrix * treeIndexWorldTransform * modelMatrix * vec4(normalize(a_normal), 0.0)).xyz;\n vViewPosition = mvPosition.xyz;\n gl_Position = projectionMatrix * mvPosition;\n}\n"},function(e,t,r){"use strict";r.r(t),t.default="precision highp float;\n#define GLSLIFY 1\n\nstruct NodeAppearance {\n vec4 colorTexel;\n bool isVisible;\n bool renderInFront;\n bool renderGhosted;\n};\n\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\n/**\n * Packs the integer part of the number given to a RGB color.\n */\nvec3 packIntToColor(float number) {\n float r = floor(number / (255.0 * 255.0)) / 255.0;\n float g = mod(floor(number / 255.0), 255.0) / 255.0;\n float b = mod(number, 255.0) / 255.0;\n return vec3(r, g, b);\n}\n\nstruct GeometryTypeEnum {\n int Quad;\n int Primitive;\n int TriangleMesh;\n int InstancedMesh;\n};\n\nconst GeometryTypeEnum GeometryType = GeometryTypeEnum(1,2,3,4);\n\nconst int RenderTypeColor = 1;\nconst int RenderTypeNormal = 2;\nconst int RenderTypeTreeIndex = 3;\nconst int RenderTypePackColorAndNormal = 4;\nconst int RenderTypeDepth = 5;\nconst int RenderTypeEffects = 6;\nconst int RenderTypeGhost = 7;\nconst int RenderTypeLOD = 8;\nconst int RenderTypeDepthBufferOnly = 9;\nconst int RenderTypeGeometryType = 10;\n\n#include <packing>\n\nout vec4 outputColor;\n\nvec3 packNormalToRgb( const in vec3 normal ) {\n return normalize( normal ) * 0.5 + 0.5;\n}\n\nvoid updateFragmentColor(\n int renderMode, vec4 color, float treeIndex, \n vec3 normal, float depth, sampler2D matCapTexture, \n int geometryType) {\n if (renderMode == RenderTypeColor || renderMode == RenderTypeEffects) {\n vec3 hsv = rgb2hsv(color.rgb);\n hsv.z = min(0.5 * hsv.z + 0.5, 1.0);\n vec3 colorRGB = hsv2rgb(hsv);\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n vec4 albedo = vec4(colorRGB * (0.4 + 0.6 * amplitude), 1.0);\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec4 mc = vec4(texture(matCapTexture, cap).rgb, 1.0);\n \n outputColor = vec4(albedo.rgb * mc.rgb * 1.7, color.a);\n } else if (renderMode == RenderTypeGhost) {\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n float s = 0.4 + 0.6 * amplitude;\n outputColor = vec4(vec3(s), 0.3);\n } else if (renderMode == RenderTypeDepthBufferOnly) {\n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n } else if (renderMode == RenderTypePackColorAndNormal) {\n vec3 hsv = rgb2hsv(color.rgb);\n float a = 0.0;\n if (hsv.y > 0.01) {\n if (hsv.z > 0.5) {\n // light color\n a = (0.55 + hsv.x * 0.45);\n } else {\n // dark color\n a = (0.1 + hsv.x * 0.45);\n }\n } else {\n // no saturation - grayscale\n a = hsv.z * 0.09;\n }\n outputColor = vec4(packNormalToRgb(normal.rgb), a);\n } else if (renderMode == RenderTypeNormal) {\n outputColor = vec4(packNormalToRgb(normal), 1.0);\n } else if (renderMode == RenderTypeTreeIndex) {\n outputColor = vec4(packIntToColor(treeIndex), 1.0);\n } else if (renderMode == RenderTypeDepth) {\n outputColor = packDepthToRGBA(depth);\n } else if (renderMode == RenderTypeLOD) {\n bool isHighDetail = geometryType != GeometryType.Quad;\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture(matCapTexture, cap).rgb * 1.5;\n outputColor = isHighDetail ? vec4(vec3(0.0, 1.0, 0.0) * mc, color.a) : vec4(vec3(1.0, 1.0, 0.0) * mc, color.a);\n } else if (renderMode == RenderTypeGeometryType) {\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture(matCapTexture, cap).rgb * 1.5;\n vec3 geometryColor = \n float(geometryType == 1) * vec3(1.0, 0.0, 0.0) + // Quads\n float(geometryType == 2) * vec3(0.0, 1.0, 0.0) + // Primitives\n float(geometryType == 3) * vec3(0.0, 0.0, 1.0) + // Triangle meshes\n float(geometryType == 4) * vec3(1.0, 1.0, 0.0); // Instance meshes\n outputColor = vec4(geometryColor * mc, color.a);\n } else {\n // Unknown render mode - should not happen. \n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n }\n}\n\nfloat floatBitsSubset(float inNumber, int fromLeastSignificantBitIndex, int toMostSignificantBitIndex) {\n float r = float(fromLeastSignificantBitIndex);\n float l = float(toMostSignificantBitIndex);\n\n float bitShift = pow(2.0, r);\n return mod(((inNumber - mod(inNumber, bitShift)) / bitShift), pow(2.0, l - r));\n}\n\n/*\n\nExample:\n\nGet the value from bit 2 to 4 (not inclusive)\n\ninput:\ninNumber = 173 = 1010_1101 , from=2, to=4\n\nexpected output = 1010_|11|01 = 3\n\n1) subtract any bits in the least significant bit-subset\n\n mod(inNumber=173, pow(2.0, from=2)) = mod(inNumber, 4) = 1\n \n inNumber - 1 = 172\n\n2) bitshift such that we remove the least significant bit-subset\n this is guaranteed to be devisible since we subtracted the remainder\n\n (inNumber=172) / pow(2.0, from=2) = 172 / 4 = 43 = 0010_1011\n\n3) lastly, remove the most significant bit-subset\n\n mod((inNumber=43), pow(2.0, to=4 - from=2) = mod(43, 4)\n\n mod(43, 4) = 3\n\n or in binary notation: 0000_0011 which is the expected result.\n\n*/ \n\nNodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture, vec2 textureSize, float treeIndex) {\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = textureSize.x;\n float dataTextureHeight = textureSize.y;\n\n float u = mod(treeIndex, dataTextureWidth);\n float v = floor(treeIndex / dataTextureWidth);\n float uCoord = (u + 0.5) / dataTextureWidth;\n float vCoord = (v + 0.5) / dataTextureHeight;\n vec2 treeIndexUv = vec2(uCoord, vCoord);\n \n vec4 texel = texture(nodeAppearanceTexture, treeIndexUv);\n float alphaUnwrapped = floor((texel.a * 255.0) + 0.5);\n\n bool isVisible = floatBitsSubset(alphaUnwrapped, 0, 1) == 1.0;\n bool renderInFront = floatBitsSubset(alphaUnwrapped, 1, 2) == 1.0;\n bool renderGhosted = floatBitsSubset(alphaUnwrapped, 2, 3) == 1.0;\n\n return NodeAppearance(texel, isVisible, renderInFront, renderGhosted);\n}\n\nbool determineVisibility(NodeAppearance nodeAppearance, int renderMode) {\n return \n // In ghost mode\n ((renderMode == RenderTypeGhost) && nodeAppearance.isVisible && nodeAppearance.renderGhosted) ||\n // Not ghost mode\n ((renderMode != RenderTypeGhost) && \n !nodeAppearance.renderGhosted && nodeAppearance.isVisible && (nodeAppearance.renderInFront || renderMode != RenderTypeEffects));\n}\n\nvec4 determineColor(vec3 originalColor, NodeAppearance nodeAppearance) {\n vec4 overrideColor = nodeAppearance.colorTexel;\n if (any(greaterThan(overrideColor.rgb, vec3(0.0)))) {\n return overrideColor;\n }\n return vec4(originalColor.rgb, overrideColor.a);\n}\n\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\n\nbool isClipped(NodeAppearance nodeAppearance, vec3 point) {\n#if NUM_CLIPPING_PLANES > 0\n vec3 pointFlipped = -point;\n vec4 plane;\n\n for (int i = 0; i < UNION_CLIPPING_PLANES; i++) {\n plane = clippingPlanes[i];\n if (dot(pointFlipped, plane.xyz) > plane.w) return true;\n }\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n bool clipped = true;\n for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n clipped = (dot(pointFlipped, plane.xyz) > plane.w) && clipped;\n }\n if ( clipped ) return true;\n#endif\n#endif\n return false;\n}\n\n#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n\nuniform sampler2D colorDataTexture;\nuniform sampler2D matCapTexture;\nuniform vec2 treeIndexTextureSize;\nuniform mat4 projectionMatrix;\nuniform int renderMode;\n\n// Note! Must be placed after all uniforms in order for this to work on iOS (REV-287)\nfloat computeFragmentDepth(vec3 p, mat4 projectionMatrix) {\n // Anders Hafreager comments:\n // Depth value can be calculated by transforming the z-component of the intersection point to projection space.\n // The w-component is also needed to scale projection space into clip space.\n // However, the 4th column of the projection matrix is (0, 0, const, 0), so we can exploit this when computing w-value.\n float projected_intersection_z = projectionMatrix[0][2] * p.x + projectionMatrix[1][2] * p.y + projectionMatrix[2][2] * p.z + projectionMatrix[3][2];\n\n // If we want to use orthographic camera, the full w-component is found as\n float projected_intersection_w = projectionMatrix[0][3] * p.x + projectionMatrix[1][3] * p.y + projectionMatrix[2][3] * p.z + projectionMatrix[3][3];\n // float projected_intersection_w = projectionMatrix[2][3]*newPoint.z; // Optimized for perspective camera\n return ((gl_DepthRange.diff * (projected_intersection_z / projected_intersection_w)) + gl_DepthRange.near + gl_DepthRange.far) * .5;\n}\n\nfloat updateFragmentDepth(vec3 p, mat4 projectionMatrix) {\n gl_FragDepth = computeFragmentDepth(p, projectionMatrix);\n return gl_FragDepth;\n}\n\nin vec4 v_centerB;\nin vec4 v_W;\nin vec4 v_U;\nin float v_angle;\nin float v_arcAngle;\nin vec4 v_centerA;\nin vec4 v_V;\nin float v_treeIndex;\nin vec3 v_color;\nin vec3 v_normal;\n\nvoid main() {\n NodeAppearance appearance = determineNodeAppearance(colorDataTexture, treeIndexTextureSize, v_treeIndex);\n if (!determineVisibility(appearance, renderMode)) {\n discard;\n }\n\n vec3 normal = normalize( v_normal );\n vec4 color = determineColor(v_color, appearance);\n\n float R1 = v_centerB.w;\n vec4 U = v_U;\n vec4 W = v_W;\n vec4 V = v_V;\n float height = length(v_centerA.xyz - v_centerB.xyz);\n float R2 = v_centerA.w;\n float dR = R2 - R1;\n\n mat3 basis = mat3(U.xyz, V.xyz, W.xyz);\n vec3 surfacePoint = vec3(U.w, V.w, W.w);\n vec3 rayTarget = surfacePoint;\n\n #if defined(COGNITE_ORTHOGRAPHIC_CAMERA)\n vec3 rayDirection = vec3(0.0, 0.0, -1.0);\n #else\n vec3 rayDirection = normalize(rayTarget); // rayOrigin is (0,0,0) in camera space\n #endif\n\n vec3 diff = rayTarget - v_centerB.xyz;\n vec3 E = diff * basis;\n vec3 D = rayDirection * basis;\n\n float a = dot(D.xy, D.xy);\n float b = dot(E.xy, D.xy);\n float c = dot(E.xy, E.xy) - R1*R1;\n\n if (R1 != R2) {\n // Additional terms if radii are different\n float dRLInv = dR / height;\n float dRdRL2Inv = dRLInv * dRLInv;\n a -= D.z * D.z * dRdRL2Inv;\n b -= dRLInv * (E.z * D.z * dRLInv + R1 * D.z);\n c -= dRLInv * (E.z * E.z * dRLInv + 2.0 * R1 * E.z);\n }\n\n // Calculate a dicriminant of the above quadratic equation\n float d = b*b - a*c;\n\n // d < 0.0 means the ray hits outside an infinitely long cone\n if (d < 0.0) {\n discard;\n }\n\n float sqrtd = sqrt(d);\n float dist1 = (-b - sqrtd) / a;\n float dist2 = (-b + sqrtd) / a;\n\n // Make sure dist1 is the smaller one\n if (dist2 < dist1) {\n float tmp = dist1;\n dist1 = dist2;\n dist2 = tmp;\n }\n\n float dist = dist1;\n vec3 intersectionPoint = E + dist * D;\n float theta = atan(intersectionPoint.y, intersectionPoint.x);\n if (theta < v_angle) theta += 2.0 * PI;\n\n // Intersection point in camera space\n vec3 p = rayTarget + dist * rayDirection;\n\n bool isInner = false;\n\n if (intersectionPoint.z <= 0.0 ||\n intersectionPoint.z > height ||\n theta > v_angle + v_arcAngle ||\n isClipped(appearance, p)\n ) {\n // Missed the first point, check the other point\n isInner = true;\n dist = dist2;\n intersectionPoint = E + dist * D;\n theta = atan(intersectionPoint.y, intersectionPoint.x);\n p = rayTarget + dist*rayDirection;\n if (theta < v_angle) theta += 2.0 * PI;\n if (intersectionPoint.z <= 0.0 ||\n intersectionPoint.z > height ||\n theta > v_angle + v_arcAngle ||\n isClipped(appearance, p)\n ) {\n // Missed the other point too\n discard;\n }\n }\n\n #if !defined(COGNITE_RENDER_COLOR_ID) && !defined(COGNITE_RENDER_DEPTH)\n if (R1 != R2)\n {\n // Find normal vector\n vec3 n = -normalize(W.xyz);\n vec3 P1 = v_centerB.xyz;\n vec3 P2 = v_centerA.xyz;\n vec3 A = cross(P1 - p, P2 - p);\n\n vec3 t = normalize(cross(n, A));\n vec3 o1 = P1 + R1 * t;\n vec3 o2 = P2 + R2 * t;\n vec3 B = o2-o1;\n normal = normalize(cross(A, B));\n }\n else\n {\n // Regular cylinder has simpler normal vector in camera space\n vec3 p_local = p - v_centerB.xyz;\n normal = normalize(p_local - W.xyz * dot(p_local, W.xyz));\n }\n #endif\n\n float fragDepth = updateFragmentDepth(p, projectionMatrix);\n updateFragmentColor(renderMode, color, v_treeIndex, normal, fragDepth, matCapTexture, GeometryType.Primitive);\n}\n"},function(e,t,r){"use strict";r.r(t),t.default="#define GLSLIFY 1\nvec3 mul3(mat4 M, vec3 v) {\n vec4 u = M * vec4(v, 1.0);\n return u.xyz / u.w;\n}\n\n// https://stackoverflow.com/questions/7059962/how-do-i-convert-a-vec4-rgba-value-to-a-float @ Arjan\nfloat unpackVec4ToFloat( vec4 packedFloat)\n{\n vec4 rgba = packedFloat;\n float sign = 1.0 - step(128.0, rgba.x) * 2.0;\n float exponent = 2.0 * mod(rgba.x, 128.0) + step(128.0, rgba.y) - 127.0;\n if (exponent == -127.0) return 0.0;\n float mantissa = mod(rgba.y, 128.0) * 65536.0 + rgba.z * 256.0 + rgba.w + 8388608.0;\n return sign * exp2(exponent - 23.0) * mantissa; \n}\n\nfloat unpackFloatFromRGBATexel(vec4 texel){\n float byteValueR = floor((texel.r * 255.0) + 0.5);\n float byteValueG = floor((texel.g * 255.0) + 0.5);\n float byteValueB = floor((texel.b * 255.0) + 0.5);\n float byteValueA = floor((texel.a * 255.0) + 0.5);\n\n return unpackVec4ToFloat(vec4(byteValueR, byteValueG, byteValueB, byteValueA));\n}\n\nmat4 determineMatrixOverride(\n float treeIndex, \n vec2 treeIndexTextureSize, \n sampler2D transformOverrideIndexTexture, \n vec2 transformOverrideTextureSize, \n sampler2D transformOverrideTexture\n) {\n\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = treeIndexTextureSize.x;\n float dataTextureHeight = treeIndexTextureSize.y;\n\n float xTreeIndexTextureCoord = mod(treeIndex, dataTextureWidth);\n float yTreeIndexTextureCoord = floor(treeIndex / dataTextureWidth);\n\n vec2 indexUV = vec2((xTreeIndexTextureCoord + 0.5) / dataTextureWidth, (yTreeIndexTextureCoord + 0.5) / dataTextureHeight);\n\n vec3 indexTexel = texture(transformOverrideIndexTexture, indexUV).rgb;\n\n float index = floor(indexTexel.r * 256.0) * 65536.0 + floor(indexTexel.g * 256.0) * 256.0 + floor(indexTexel.b * 256.0);\n \n \n if(index == 0.0){\n return mat4(\n 1.0, 0.0, 0.0, 0.0,\n 0.0, 1.0, 0.0, 0.0,\n 0.0, 0.0, 1.0, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n }\n\n index = index - 1.0;\n float overridesPerRow = transformOverrideTextureSize.x / 16.0;\n\n float xOverrideTextureCoord = mod(index, overridesPerRow);\n float yOverrideTextureCoord = floor(index / overridesPerRow);\n\n float cellWidth = 1.0 / transformOverrideTextureSize.x;\n float cellHeight = 1.0 / transformOverrideTextureSize.y;\n\n float overrideU = (xOverrideTextureCoord / overridesPerRow) + cellWidth / 2.0;\n float overrideV = (yOverrideTextureCoord / transformOverrideTextureSize.y) + cellHeight / 2.0;\n\n vec2 overrideUV = vec2(overrideU, overrideV); \n\n float matrixElements[12];\n\n for(int i = 0; i < 12; i++){\n matrixElements[i] = unpackFloatFromRGBATexel(texture(transformOverrideTexture, overrideUV + vec2(float(i) * cellWidth, 0.0)));\n }\n \n return mat4(\n matrixElements[0], matrixElements[4], matrixElements[8], 0,\n matrixElements[1], matrixElements[5], matrixElements[9], 0,\n matrixElements[2], matrixElements[6], matrixElements[10], 0,\n matrixElements[3], matrixElements[7], matrixElements[11], 1\n );\n}\n\nuniform mat4 inverseModelMatrix;\nuniform mat4 modelMatrix;\nuniform mat4 viewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat3 normalMatrix;\nuniform vec3 cameraPosition;\nuniform vec2 treeIndexTextureSize;\nuniform vec2 transformOverrideTextureSize;\nuniform sampler2D transformOverrideIndexTexture;\nuniform sampler2D transformOverrideTexture;\n\nin vec3 position;\nin vec3 normal;\nin float a_treeIndex;\nin vec3 a_centerA;\nin vec3 a_centerB;\nin float a_radiusA;\nin float a_radiusB;\nin vec3 a_color;\n// segment ins\nin vec3 a_localXAxis;\nin float a_angle;\nin float a_arcAngle;\n\nout float v_treeIndex;\n// We pack the radii into w-components\nout vec4 v_centerB;\n// U, V, axis represent the 3x3 cone basis.\n// They are vec4 to pack extra data into the w-component\n// since Safari on iOS only supports 8 out vec4 registers.\nout vec4 v_U;\nout vec4 v_W;\nout vec4 v_centerA;\nout vec4 v_V;\nout float v_angle;\nout float v_arcAngle;\nout vec3 v_color;\nout vec3 v_normal;\n\nvoid main() {\n mat4 treeIndexWorldTransform = determineMatrixOverride(\n a_treeIndex, \n treeIndexTextureSize, \n transformOverrideIndexTexture, \n transformOverrideTextureSize, \n transformOverrideTexture\n );\n\n mat4 modelViewMatrix = viewMatrix * modelMatrix;\n\n mat4 modelTransformOffset = inverseModelMatrix * treeIndexWorldTransform * modelMatrix;\n\n vec3 centerA = mul3(modelTransformOffset, a_centerA);\n vec3 centerB = mul3(modelTransformOffset, a_centerB);\n\n vec3 center = 0.5 * (centerA + centerB);\n float halfHeight = 0.5 * length(centerA - centerB);\n vec3 dir = normalize(centerA - centerB);\n vec3 newPosition = position;\n\n vec3 rayOrigin = (inverseModelMatrix * vec4(cameraPosition, 1.0)).xyz;\n vec3 objectToCameraModelSpace = rayOrigin - center;\n\n float maxRadius = max(a_radiusA, a_radiusB);\n float leftUpScale = maxRadius;\n\n vec3 lDir = dir;\n if (dot(objectToCameraModelSpace, dir) < 0.0) { // direction vector looks away, flip it\n lDir = -lDir;\n }\n\n vec3 left = normalize(cross(objectToCameraModelSpace, lDir));\n vec3 up = normalize(cross(left, lDir));\n\n // make sure the billboard will not overlap with cap geometry (flickering effect), not important if we write to depth buffer\n newPosition.x *= 1.0 - (maxRadius * (position.x + 1.0) * 0.0025 / halfHeight);\n\n vec3 surfacePoint = center + mat3(halfHeight * lDir, leftUpScale * left, leftUpScale * up) * newPosition;\n vec3 transformed = surfacePoint;\n surfacePoint = mul3(modelViewMatrix, surfacePoint);\n\n // out data\n v_treeIndex = a_treeIndex;\n v_angle = a_angle;\n v_arcAngle = a_arcAngle;\n\n // compute basis for cone\n v_W.xyz = dir;\n v_U.xyz = (modelTransformOffset * vec4(a_localXAxis, 0.0)).xyz;\n v_W.xyz = normalize(normalMatrix * v_W.xyz);\n v_U.xyz = normalize(normalMatrix * v_U.xyz);\n // We pack surfacePoint as w-components of U and W\n v_W.w = surfacePoint.z;\n v_U.w = surfacePoint.x;\n\n mat4 modelToTransformOffset = modelMatrix * modelTransformOffset;\n\n float radiusB = length((modelToTransformOffset * vec4(a_localXAxis * a_radiusB, 0.0)).xyz);\n float radiusA = length((modelToTransformOffset * vec4(a_localXAxis * a_radiusA, 0.0)).xyz);\n\n // We pack radii as w-components of v_centerB\n v_centerB.xyz = mul3(modelViewMatrix, centerB);\n v_centerB.w = radiusB;\n\n v_V.xyz = -cross(v_U.xyz, v_W.xyz);\n v_V.w = surfacePoint.y;\n\n v_centerA.xyz = mul3(modelViewMatrix, centerA);\n v_centerA.w = radiusA;\n\n v_color = a_color;\n v_normal = normalMatrix * normal;\n\n vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n\n gl_Position = projectionMatrix * mvPosition;\n}\n"},function(e,t,r){"use strict";r.r(t),t.default="precision highp float;\n#define GLSLIFY 1\n\nstruct NodeAppearance {\n vec4 colorTexel;\n bool isVisible;\n bool renderInFront;\n bool renderGhosted;\n};\n\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\n/**\n * Packs the integer part of the number given to a RGB color.\n */\nvec3 packIntToColor(float number) {\n float r = floor(number / (255.0 * 255.0)) / 255.0;\n float g = mod(floor(number / 255.0), 255.0) / 255.0;\n float b = mod(number, 255.0) / 255.0;\n return vec3(r, g, b);\n}\n\nstruct GeometryTypeEnum {\n int Quad;\n int Primitive;\n int TriangleMesh;\n int InstancedMesh;\n};\n\nconst GeometryTypeEnum GeometryType = GeometryTypeEnum(1,2,3,4);\n\nconst int RenderTypeColor = 1;\nconst int RenderTypeNormal = 2;\nconst int RenderTypeTreeIndex = 3;\nconst int RenderTypePackColorAndNormal = 4;\nconst int RenderTypeDepth = 5;\nconst int RenderTypeEffects = 6;\nconst int RenderTypeGhost = 7;\nconst int RenderTypeLOD = 8;\nconst int RenderTypeDepthBufferOnly = 9;\nconst int RenderTypeGeometryType = 10;\n\n#include <packing>\n\nout vec4 outputColor;\n\nvec3 packNormalToRgb( const in vec3 normal ) {\n return normalize( normal ) * 0.5 + 0.5;\n}\n\nvoid updateFragmentColor(\n int renderMode, vec4 color, float treeIndex, \n vec3 normal, float depth, sampler2D matCapTexture, \n int geometryType) {\n if (renderMode == RenderTypeColor || renderMode == RenderTypeEffects) {\n vec3 hsv = rgb2hsv(color.rgb);\n hsv.z = min(0.5 * hsv.z + 0.5, 1.0);\n vec3 colorRGB = hsv2rgb(hsv);\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n vec4 albedo = vec4(colorRGB * (0.4 + 0.6 * amplitude), 1.0);\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec4 mc = vec4(texture(matCapTexture, cap).rgb, 1.0);\n \n outputColor = vec4(albedo.rgb * mc.rgb * 1.7, color.a);\n } else if (renderMode == RenderTypeGhost) {\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n float s = 0.4 + 0.6 * amplitude;\n outputColor = vec4(vec3(s), 0.3);\n } else if (renderMode == RenderTypeDepthBufferOnly) {\n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n } else if (renderMode == RenderTypePackColorAndNormal) {\n vec3 hsv = rgb2hsv(color.rgb);\n float a = 0.0;\n if (hsv.y > 0.01) {\n if (hsv.z > 0.5) {\n // light color\n a = (0.55 + hsv.x * 0.45);\n } else {\n // dark color\n a = (0.1 + hsv.x * 0.45);\n }\n } else {\n // no saturation - grayscale\n a = hsv.z * 0.09;\n }\n outputColor = vec4(packNormalToRgb(normal.rgb), a);\n } else if (renderMode == RenderTypeNormal) {\n outputColor = vec4(packNormalToRgb(normal), 1.0);\n } else if (renderMode == RenderTypeTreeIndex) {\n outputColor = vec4(packIntToColor(treeIndex), 1.0);\n } else if (renderMode == RenderTypeDepth) {\n outputColor = packDepthToRGBA(depth);\n } else if (renderMode == RenderTypeLOD) {\n bool isHighDetail = geometryType != GeometryType.Quad;\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture(matCapTexture, cap).rgb * 1.5;\n outputColor = isHighDetail ? vec4(vec3(0.0, 1.0, 0.0) * mc, color.a) : vec4(vec3(1.0, 1.0, 0.0) * mc, color.a);\n } else if (renderMode == RenderTypeGeometryType) {\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture(matCapTexture, cap).rgb * 1.5;\n vec3 geometryColor = \n float(geometryType == 1) * vec3(1.0, 0.0, 0.0) + // Quads\n float(geometryType == 2) * vec3(0.0, 1.0, 0.0) + // Primitives\n float(geometryType == 3) * vec3(0.0, 0.0, 1.0) + // Triangle meshes\n float(geometryType == 4) * vec3(1.0, 1.0, 0.0); // Instance meshes\n outputColor = vec4(geometryColor * mc, color.a);\n } else {\n // Unknown render mode - should not happen. \n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n }\n}\n\nfloat floatBitsSubset(float inNumber, int fromLeastSignificantBitIndex, int toMostSignificantBitIndex) {\n float r = float(fromLeastSignificantBitIndex);\n float l = float(toMostSignificantBitIndex);\n\n float bitShift = pow(2.0, r);\n return mod(((inNumber - mod(inNumber, bitShift)) / bitShift), pow(2.0, l - r));\n}\n\n/*\n\nExample:\n\nGet the value from bit 2 to 4 (not inclusive)\n\ninput:\ninNumber = 173 = 1010_1101 , from=2, to=4\n\nexpected output = 1010_|11|01 = 3\n\n1) subtract any bits in the least significant bit-subset\n\n mod(inNumber=173, pow(2.0, from=2)) = mod(inNumber, 4) = 1\n \n inNumber - 1 = 172\n\n2) bitshift such that we remove the least significant bit-subset\n this is guaranteed to be devisible since we subtracted the remainder\n\n (inNumber=172) / pow(2.0, from=2) = 172 / 4 = 43 = 0010_1011\n\n3) lastly, remove the most significant bit-subset\n\n mod((inNumber=43), pow(2.0, to=4 - from=2) = mod(43, 4)\n\n mod(43, 4) = 3\n\n or in binary notation: 0000_0011 which is the expected result.\n\n*/ \n\nNodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture, vec2 textureSize, float treeIndex) {\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = textureSize.x;\n float dataTextureHeight = textureSize.y;\n\n float u = mod(treeIndex, dataTextureWidth);\n float v = floor(treeIndex / dataTextureWidth);\n float uCoord = (u + 0.5) / dataTextureWidth;\n float vCoord = (v + 0.5) / dataTextureHeight;\n vec2 treeIndexUv = vec2(uCoord, vCoord);\n \n vec4 texel = texture(nodeAppearanceTexture, treeIndexUv);\n float alphaUnwrapped = floor((texel.a * 255.0) + 0.5);\n\n bool isVisible = floatBitsSubset(alphaUnwrapped, 0, 1) == 1.0;\n bool renderInFront = floatBitsSubset(alphaUnwrapped, 1, 2) == 1.0;\n bool renderGhosted = floatBitsSubset(alphaUnwrapped, 2, 3) == 1.0;\n\n return NodeAppearance(texel, isVisible, renderInFront, renderGhosted);\n}\n\nbool determineVisibility(NodeAppearance nodeAppearance, int renderMode) {\n return \n // In ghost mode\n ((renderMode == RenderTypeGhost) && nodeAppearance.isVisible && nodeAppearance.renderGhosted) ||\n // Not ghost mode\n ((renderMode != RenderTypeGhost) && \n !nodeAppearance.renderGhosted && nodeAppearance.isVisible && (nodeAppearance.renderInFront || renderMode != RenderTypeEffects));\n}\n\nvec4 determineColor(vec3 originalColor, NodeAppearance nodeAppearance) {\n vec4 overrideColor = nodeAppearance.colorTexel;\n if (any(greaterThan(overrideColor.rgb, vec3(0.0)))) {\n return overrideColor;\n }\n return vec4(originalColor.rgb, overrideColor.a);\n}\n\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\n\nbool isClipped(NodeAppearance nodeAppearance, vec3 point) {\n#if NUM_CLIPPING_PLANES > 0\n vec3 pointFlipped = -point;\n vec4 plane;\n\n for (int i = 0; i < UNION_CLIPPING_PLANES; i++) {\n plane = clippingPlanes[i];\n if (dot(pointFlipped, plane.xyz) > plane.w) return true;\n }\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n bool clipped = true;\n for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n clipped = (dot(pointFlipped, plane.xyz) > plane.w) && clipped;\n }\n if ( clipped ) return true;\n#endif\n#endif\n return false;\n}\n\n#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n\nuniform sampler2D colorDataTexture;\nuniform sampler2D matCapTexture;\nuniform vec2 treeIndexTextureSize;\nuniform mat4 projectionMatrix;\nuniform int renderMode;\n\n// Note! Must be placed after all uniforms in order for this to work on iOS (REV-287)\nfloat computeFragmentDepth(vec3 p, mat4 projectionMatrix) {\n // Anders Hafreager comments:\n // Depth value can be calculated by transforming the z-component of the intersection point to projection space.\n // The w-component is also needed to scale projection space into clip space.\n // However, the 4th column of the projection matrix is (0, 0, const, 0), so we can exploit this when computing w-value.\n float projected_intersection_z = projectionMatrix[0][2] * p.x + projectionMatrix[1][2] * p.y + projectionMatrix[2][2] * p.z + projectionMatrix[3][2];\n\n // If we want to use orthographic camera, the full w-component is found as\n float projected_intersection_w = projectionMatrix[0][3] * p.x + projectionMatrix[1][3] * p.y + projectionMatrix[2][3] * p.z + projectionMatrix[3][3];\n // float projected_intersection_w = projectionMatrix[2][3]*newPoint.z; // Optimized for perspective camera\n return ((gl_DepthRange.diff * (projected_intersection_z / projected_intersection_w)) + gl_DepthRange.near + gl_DepthRange.far) * .5;\n}\n\nfloat updateFragmentDepth(vec3 p, mat4 projectionMatrix) {\n gl_FragDepth = computeFragmentDepth(p, projectionMatrix);\n return gl_FragDepth;\n}\n\nin vec4 U;\nin vec4 V;\nin vec4 axis;\nin vec4 v_centerA;\nin vec4 v_centerB;\nin float height;\nin float v_treeIndex;\nin vec3 v_color;\nin vec3 v_normal;\n\nvoid main() {\n NodeAppearance appearance = determineNodeAppearance(colorDataTexture, treeIndexTextureSize, v_treeIndex);\n if (!determineVisibility(appearance, renderMode)) {\n discard;\n }\n\n vec4 color = determineColor(v_color, appearance);\n vec3 normal = normalize( v_normal );\n mat3 basis = mat3(U.xyz, V.xyz, axis.xyz);\n vec3 surfacePoint = vec3(U.w, V.w, axis.w);\n vec3 rayTarget = surfacePoint;\n\n#if defined(COGNITE_ORTHOGRAPHIC_CAMERA)\n vec3 rayDirection = vec3(0.0, 0.0, -1.0);\n#else\n vec3 rayDirection = normalize(rayTarget); // rayOrigin is (0,0,0) in camera space\n#endif\n\n vec3 diff = rayTarget - v_centerA.xyz;\n vec3 E = diff * basis;\n float L = height;\n vec3 D = rayDirection * basis;\n\n float R1 = v_centerA.w;\n float R2 = v_centerB.w;\n float dR = R2 - R1;\n\n float a = dot(D.xy, D.xy);\n float b = dot(E.xy, D.xy);\n float c = dot(E.xy, E.xy) - R1 * R1;\n float L2Inv = 1.0 / (L * L);\n\n if (R1 != R2) {\n // Additional terms if radii are different\n float dRLInv = dR / L;\n float dRdRL2Inv = dRLInv * dRLInv;\n a -= D.z * D.z * dRdRL2Inv;\n b -= dRLInv * (E.z * D.z * dRLInv + R1 * D.z);\n c -= dRLInv * (E.z * E.z * dRLInv + 2.0 * R1 * E.z);\n }\n\n // Additional terms when one of the center points is displaced orthogonal to normal vector\n vec2 displacement = ((v_centerB.xyz - v_centerA.xyz) * basis).xy; // In the basis where displacement is in XY only\n float displacementLengthSquared = dot(displacement, displacement);\n a += D.z * (D.z * displacementLengthSquared - 2.0 * L * dot(D.xy, displacement)) * L2Inv;\n b += (D.z * E.z * displacementLengthSquared - L * (D.x * E.z * displacement.x + D.y * E.z * displacement.y + D.z * E.x * displacement.x + D.z * E.y * displacement.y)) * L2Inv;\n c += E.z * (E.z * displacementLengthSquared - 2.0 * L * dot(E.xy, displacement)) * L2Inv;\n\n // Calculate a dicriminant of the above quadratic equation (factor 2 removed from all b-terms above)\n float d = b*b - a*c;\n\n // d < 0.0 means the ray hits outside an infinitely long eccentric cone\n if (d < 0.0) {\n discard;\n }\n float sqrtd = sqrt(d);\n float dist1 = (-b - sqrtd) / a;\n float dist2 = (-b + sqrtd) / a;\n\n // Make sure dist1 is the smaller one\n if (dist2 < dist1) {\n float tmp = dist1;\n dist1 = dist2;\n dist2 = tmp;\n }\n\n // Check the smallest root, it is closest camera. Only test if the z-component is outside the truncated eccentric cone\n float dist = dist1;\n float intersectionPointZ = E.z + dist * D.z;\n // Intersection point in camera space\n vec3 p = rayTarget + dist * rayDirection;\n bool isInner = false;\n\n if (intersectionPointZ <= 0.0 ||\n intersectionPointZ >= L ||\n isClipped(appearance, p)\n ) {\n // Either intersection point is behind starting point (happens inside the cone),\n // or the intersection point is outside the end caps. This is not a valid solution.\n isInner = true;\n dist = dist2;\n intersectionPointZ = E.z + dist * D.z;\n p = rayTarget + dist * rayDirection;\n\n if (intersectionPointZ <= 0.0 ||\n intersectionPointZ >= L ||\n isClipped(appearance, p)\n ) {\n // Missed the other point too\n discard;\n }\n }\n\n#if !defined(COGNITE_RENDER_COLOR_ID) && !defined(COGNITE_RENDER_DEPTH)\n // Find normal vector\n vec3 n = normalize(-axis.xyz);\n vec3 v_centerA = v_centerA.xyz;\n vec3 v_centerB = v_centerB.xyz;\n vec3 A = cross(v_centerA - p, v_centerB - p);\n\n vec3 t = normalize(cross(n, A));\n vec3 o1 = v_centerA + R1 * t;\n vec3 o2 = v_centerB + R2 * t;\n vec3 B = o2 - o1;\n normal = normalize(cross(A, B));\n#endif\n\n float fragDepth = updateFragmentDepth(p, projectionMatrix);\n updateFragmentColor(renderMode, color, v_treeIndex, normal, fragDepth, matCapTexture, GeometryType.Primitive);\n}\n"},function(e,t,r){"use strict";r.r(t),t.default="#define GLSLIFY 1\nvec3 mul3(mat4 M, vec3 v) {\n vec4 u = M * vec4(v, 1.0);\n return u.xyz / u.w;\n}\n\n// https://stackoverflow.com/questions/7059962/how-do-i-convert-a-vec4-rgba-value-to-a-float @ Arjan\nfloat unpackVec4ToFloat( vec4 packedFloat)\n{\n vec4 rgba = packedFloat;\n float sign = 1.0 - step(128.0, rgba.x) * 2.0;\n float exponent = 2.0 * mod(rgba.x, 128.0) + step(128.0, rgba.y) - 127.0;\n if (exponent == -127.0) return 0.0;\n float mantissa = mod(rgba.y, 128.0) * 65536.0 + rgba.z * 256.0 + rgba.w + 8388608.0;\n return sign * exp2(exponent - 23.0) * mantissa; \n}\n\nfloat unpackFloatFromRGBATexel(vec4 texel){\n float byteValueR = floor((texel.r * 255.0) + 0.5);\n float byteValueG = floor((texel.g * 255.0) + 0.5);\n float byteValueB = floor((texel.b * 255.0) + 0.5);\n float byteValueA = floor((texel.a * 255.0) + 0.5);\n\n return unpackVec4ToFloat(vec4(byteValueR, byteValueG, byteValueB, byteValueA));\n}\n\nmat4 determineMatrixOverride(\n float treeIndex, \n vec2 treeIndexTextureSize, \n sampler2D transformOverrideIndexTexture, \n vec2 transformOverrideTextureSize, \n sampler2D transformOverrideTexture\n) {\n\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = treeIndexTextureSize.x;\n float dataTextureHeight = treeIndexTextureSize.y;\n\n float xTreeIndexTextureCoord = mod(treeIndex, dataTextureWidth);\n float yTreeIndexTextureCoord = floor(treeIndex / dataTextureWidth);\n\n vec2 indexUV = vec2((xTreeIndexTextureCoord + 0.5) / dataTextureWidth, (yTreeIndexTextureCoord + 0.5) / dataTextureHeight);\n\n vec3 indexTexel = texture(transformOverrideIndexTexture, indexUV).rgb;\n\n float index = floor(indexTexel.r * 256.0) * 65536.0 + floor(indexTexel.g * 256.0) * 256.0 + floor(indexTexel.b * 256.0);\n \n \n if(index == 0.0){\n return mat4(\n 1.0, 0.0, 0.0, 0.0,\n 0.0, 1.0, 0.0, 0.0,\n 0.0, 0.0, 1.0, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n }\n\n index = index - 1.0;\n float overridesPerRow = transformOverrideTextureSize.x / 16.0;\n\n float xOverrideTextureCoord = mod(index, overridesPerRow);\n float yOverrideTextureCoord = floor(index / overridesPerRow);\n\n float cellWidth = 1.0 / transformOverrideTextureSize.x;\n float cellHeight = 1.0 / transformOverrideTextureSize.y;\n\n float overrideU = (xOverrideTextureCoord / overridesPerRow) + cellWidth / 2.0;\n float overrideV = (yOverrideTextureCoord / transformOverrideTextureSize.y) + cellHeight / 2.0;\n\n vec2 overrideUV = vec2(overrideU, overrideV); \n\n float matrixElements[12];\n\n for(int i = 0; i < 12; i++){\n matrixElements[i] = unpackFloatFromRGBATexel(texture(transformOverrideTexture, overrideUV + vec2(float(i) * cellWidth, 0.0)));\n }\n \n return mat4(\n matrixElements[0], matrixElements[4], matrixElements[8], 0,\n matrixElements[1], matrixElements[5], matrixElements[9], 0,\n matrixElements[2], matrixElements[6], matrixElements[10], 0,\n matrixElements[3], matrixElements[7], matrixElements[11], 1\n );\n}\n\nuniform mat4 inverseModelMatrix;\nuniform mat4 modelMatrix;\nuniform mat4 viewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat3 normalMatrix;\nuniform vec3 cameraPosition;\nuniform vec2 treeIndexTextureSize;\nuniform vec2 transformOverrideTextureSize;\nuniform sampler2D transformOverrideIndexTexture;\nuniform sampler2D transformOverrideTexture;\n\nin vec3 position;\nin vec3 normal;\nin float a_treeIndex;\nin vec3 a_centerA;\nin vec3 a_centerB;\nin float a_radiusA;\nin float a_radiusB;\nin vec3 a_normal;\nin vec3 a_color;\n\nout float v_treeIndex;\n// We pack the radii into w-components\nout vec4 v_centerA;\nout vec4 v_centerB;\n// U, V, axis represent the 3x3 cone basis.\n// They are vec4 to pack extra data into the w-component\n// since Safari on iOS only supports 8 out vec4 registers.\nout vec4 U;\nout vec4 V;\nout vec4 axis;\nout float height;\nout vec3 v_color;\nout vec3 v_normal;\n\nvoid main() {\n\n mat4 treeIndexWorldTransform = determineMatrixOverride(\n a_treeIndex, \n treeIndexTextureSize, \n transformOverrideIndexTexture, \n transformOverrideTextureSize, \n transformOverrideTexture\n );\n\n mat4 modelViewMatrix = viewMatrix * modelMatrix;\n\n mat4 modelTransformOffset = inverseModelMatrix * treeIndexWorldTransform * modelMatrix;\n mat4 modelToTransformOffset = modelMatrix * modelTransformOffset;\n\n vec3 centerA = mul3(modelTransformOffset, a_centerA);\n vec3 centerB = mul3(modelTransformOffset, a_centerB);\n\n vec3 normalWithOffset = normalize((modelTransformOffset * vec4(a_normal, 0)).xyz);\n\n float uniformScaleFactor = length(mul3(modelMatrix, normalize(vec3(1.0))));\n\n height = dot(centerA - centerB, normalWithOffset) * uniformScaleFactor;\n\n vec3 lDir;\n vec3 center = 0.5 * (centerA + centerB);\n vec3 newPosition = position;\n\n vec3 rayOrigin = (inverseModelMatrix * vec4(cameraPosition, 1.0)).xyz;\n vec3 objectToCameraModelSpace = rayOrigin - center;\n\n // Find the coordinates of centerA and centerB projected down to the end cap plane\n vec3 maxCenterProjected = centerA - dot(centerA, normalWithOffset) * normalWithOffset;\n vec3 minCenterProjected = centerB - dot(centerB, normalWithOffset) * normalWithOffset;\n float distanceBetweenProjectedCenters = length(maxCenterProjected - minCenterProjected);\n\n lDir = normalWithOffset;\n float dirSign = 1.0;\n if (dot(objectToCameraModelSpace, lDir) < 0.0) { // direction vector looks away, flip it\n dirSign = -1.0;\n lDir *= -1.;\n }\n\n vec3 left = normalize(cross(objectToCameraModelSpace, lDir));\n vec3 up = normalize(cross(left, lDir));\n\n // compute basis for cone\n axis.xyz = -normalWithOffset;\n U.xyz = cross(objectToCameraModelSpace, axis.xyz);\n V.xyz = cross(U.xyz, axis.xyz);\n // Transform to camera space\n axis.xyz = normalize(normalMatrix * axis.xyz);\n U.xyz = normalize(normalMatrix * U.xyz);\n V.xyz = normalize(normalMatrix * V.xyz);\n\n // make sure the billboard will not overlap with cap geometry (flickering effect), not important if we write to depth buffer\n newPosition.x *= 1.0 - (a_radiusA * (position.x + 1.0) * 0.0025 / height);\n\n v_centerA.xyz = mul3(viewMatrix, mul3(modelMatrix, centerA));\n v_centerB.xyz = mul3(viewMatrix, mul3(modelMatrix, centerB));\n\n float radiusA = length((modelToTransformOffset * vec4(normalize(vec3(1.0)) * a_radiusA, 0.0)).xyz);\n float radiusB = length((modelToTransformOffset * vec4(normalize(vec3(1.0)) * a_radiusB, 0.0)).xyz);\n\n // Pack radii as w components of v_centerA and v_centerB\n v_centerA.w = radiusA;\n v_centerB.w = radiusB;\n\n float radiusIncludedDisplacement = 0.5 * (2.0 * max(a_radiusA, a_radiusB) + distanceBetweenProjectedCenters);\n vec3 surfacePoint = center + mat3(0.5 * height * lDir * (1.0 / uniformScaleFactor), radiusIncludedDisplacement * left, radiusIncludedDisplacement * up) * newPosition;\n vec3 transformed = surfacePoint;\n\n surfacePoint = mul3(modelViewMatrix, surfacePoint);\n\n // We pack surfacePoint as w-components of U, V and axis\n U.w = surfacePoint.x;\n V.w = surfacePoint.y;\n axis.w = surfacePoint.z;\n\n v_treeIndex = a_treeIndex;\n v_color = a_color;\n v_normal = normalMatrix * normal;\n\n vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n gl_Position = projectionMatrix * mvPosition;\n}\n"},function(e,t,r){"use strict";r.r(t),t.default="precision highp float;\n#define GLSLIFY 1\n\nstruct NodeAppearance {\n vec4 colorTexel;\n bool isVisible;\n bool renderInFront;\n bool renderGhosted;\n};\n\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\n/**\n * Packs the integer part of the number given to a RGB color.\n */\nvec3 packIntToColor(float number) {\n float r = floor(number / (255.0 * 255.0)) / 255.0;\n float g = mod(floor(number / 255.0), 255.0) / 255.0;\n float b = mod(number, 255.0) / 255.0;\n return vec3(r, g, b);\n}\n\nstruct GeometryTypeEnum {\n int Quad;\n int Primitive;\n int TriangleMesh;\n int InstancedMesh;\n};\n\nconst GeometryTypeEnum GeometryType = GeometryTypeEnum(1,2,3,4);\n\nconst int RenderTypeColor = 1;\nconst int RenderTypeNormal = 2;\nconst int RenderTypeTreeIndex = 3;\nconst int RenderTypePackColorAndNormal = 4;\nconst int RenderTypeDepth = 5;\nconst int RenderTypeEffects = 6;\nconst int RenderTypeGhost = 7;\nconst int RenderTypeLOD = 8;\nconst int RenderTypeDepthBufferOnly = 9;\nconst int RenderTypeGeometryType = 10;\n\n#include <packing>\n\nout vec4 outputColor;\n\nvec3 packNormalToRgb( const in vec3 normal ) {\n return normalize( normal ) * 0.5 + 0.5;\n}\n\nvoid updateFragmentColor(\n int renderMode, vec4 color, float treeIndex, \n vec3 normal, float depth, sampler2D matCapTexture, \n int geometryType) {\n if (renderMode == RenderTypeColor || renderMode == RenderTypeEffects) {\n vec3 hsv = rgb2hsv(color.rgb);\n hsv.z = min(0.5 * hsv.z + 0.5, 1.0);\n vec3 colorRGB = hsv2rgb(hsv);\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n vec4 albedo = vec4(colorRGB * (0.4 + 0.6 * amplitude), 1.0);\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec4 mc = vec4(texture(matCapTexture, cap).rgb, 1.0);\n \n outputColor = vec4(albedo.rgb * mc.rgb * 1.7, color.a);\n } else if (renderMode == RenderTypeGhost) {\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n float s = 0.4 + 0.6 * amplitude;\n outputColor = vec4(vec3(s), 0.3);\n } else if (renderMode == RenderTypeDepthBufferOnly) {\n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n } else if (renderMode == RenderTypePackColorAndNormal) {\n vec3 hsv = rgb2hsv(color.rgb);\n float a = 0.0;\n if (hsv.y > 0.01) {\n if (hsv.z > 0.5) {\n // light color\n a = (0.55 + hsv.x * 0.45);\n } else {\n // dark color\n a = (0.1 + hsv.x * 0.45);\n }\n } else {\n // no saturation - grayscale\n a = hsv.z * 0.09;\n }\n outputColor = vec4(packNormalToRgb(normal.rgb), a);\n } else if (renderMode == RenderTypeNormal) {\n outputColor = vec4(packNormalToRgb(normal), 1.0);\n } else if (renderMode == RenderTypeTreeIndex) {\n outputColor = vec4(packIntToColor(treeIndex), 1.0);\n } else if (renderMode == RenderTypeDepth) {\n outputColor = packDepthToRGBA(depth);\n } else if (renderMode == RenderTypeLOD) {\n bool isHighDetail = geometryType != GeometryType.Quad;\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture(matCapTexture, cap).rgb * 1.5;\n outputColor = isHighDetail ? vec4(vec3(0.0, 1.0, 0.0) * mc, color.a) : vec4(vec3(1.0, 1.0, 0.0) * mc, color.a);\n } else if (renderMode == RenderTypeGeometryType) {\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture(matCapTexture, cap).rgb * 1.5;\n vec3 geometryColor = \n float(geometryType == 1) * vec3(1.0, 0.0, 0.0) + // Quads\n float(geometryType == 2) * vec3(0.0, 1.0, 0.0) + // Primitives\n float(geometryType == 3) * vec3(0.0, 0.0, 1.0) + // Triangle meshes\n float(geometryType == 4) * vec3(1.0, 1.0, 0.0); // Instance meshes\n outputColor = vec4(geometryColor * mc, color.a);\n } else {\n // Unknown render mode - should not happen. \n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n }\n}\n\nfloat floatBitsSubset(float inNumber, int fromLeastSignificantBitIndex, int toMostSignificantBitIndex) {\n float r = float(fromLeastSignificantBitIndex);\n float l = float(toMostSignificantBitIndex);\n\n float bitShift = pow(2.0, r);\n return mod(((inNumber - mod(inNumber, bitShift)) / bitShift), pow(2.0, l - r));\n}\n\n/*\n\nExample:\n\nGet the value from bit 2 to 4 (not inclusive)\n\ninput:\ninNumber = 173 = 1010_1101 , from=2, to=4\n\nexpected output = 1010_|11|01 = 3\n\n1) subtract any bits in the least significant bit-subset\n\n mod(inNumber=173, pow(2.0, from=2)) = mod(inNumber, 4) = 1\n \n inNumber - 1 = 172\n\n2) bitshift such that we remove the least significant bit-subset\n this is guaranteed to be devisible since we subtracted the remainder\n\n (inNumber=172) / pow(2.0, from=2) = 172 / 4 = 43 = 0010_1011\n\n3) lastly, remove the most significant bit-subset\n\n mod((inNumber=43), pow(2.0, to=4 - from=2) = mod(43, 4)\n\n mod(43, 4) = 3\n\n or in binary notation: 0000_0011 which is the expected result.\n\n*/ \n\nNodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture, vec2 textureSize, float treeIndex) {\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = textureSize.x;\n float dataTextureHeight = textureSize.y;\n\n float u = mod(treeIndex, dataTextureWidth);\n float v = floor(treeIndex / dataTextureWidth);\n float uCoord = (u + 0.5) / dataTextureWidth;\n float vCoord = (v + 0.5) / dataTextureHeight;\n vec2 treeIndexUv = vec2(uCoord, vCoord);\n \n vec4 texel = texture(nodeAppearanceTexture, treeIndexUv);\n float alphaUnwrapped = floor((texel.a * 255.0) + 0.5);\n\n bool isVisible = floatBitsSubset(alphaUnwrapped, 0, 1) == 1.0;\n bool renderInFront = floatBitsSubset(alphaUnwrapped, 1, 2) == 1.0;\n bool renderGhosted = floatBitsSubset(alphaUnwrapped, 2, 3) == 1.0;\n\n return NodeAppearance(texel, isVisible, renderInFront, renderGhosted);\n}\n\nbool determineVisibility(NodeAppearance nodeAppearance, int renderMode) {\n return \n // In ghost mode\n ((renderMode == RenderTypeGhost) && nodeAppearance.isVisible && nodeAppearance.renderGhosted) ||\n // Not ghost mode\n ((renderMode != RenderTypeGhost) && \n !nodeAppearance.renderGhosted && nodeAppearance.isVisible && (nodeAppearance.renderInFront || renderMode != RenderTypeEffects));\n}\n\nvec4 determineColor(vec3 originalColor, NodeAppearance nodeAppearance) {\n vec4 overrideColor = nodeAppearance.colorTexel;\n if (any(greaterThan(overrideColor.rgb, vec3(0.0)))) {\n return overrideColor;\n }\n return vec4(originalColor.rgb, overrideColor.a);\n}\n\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\n\nbool isClipped(NodeAppearance nodeAppearance, vec3 point) {\n#if NUM_CLIPPING_PLANES > 0\n vec3 pointFlipped = -point;\n vec4 plane;\n\n for (int i = 0; i < UNION_CLIPPING_PLANES; i++) {\n plane = clippingPlanes[i];\n if (dot(pointFlipped, plane.xyz) > plane.w) return true;\n }\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n bool clipped = true;\n for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n clipped = (dot(pointFlipped, plane.xyz) > plane.w) && clipped;\n }\n if ( clipped ) return true;\n#endif\n#endif\n return false;\n}\n\nuniform sampler2D colorDataTexture;\nuniform sampler2D matCapTexture;\nuniform vec2 treeIndexTextureSize;\nuniform mat4 projectionMatrix;\nuniform int renderMode;\n\n// Note! Must be placed after all uniforms in order for this to work on iOS (REV-287)\nfloat computeFragmentDepth(vec3 p, mat4 projectionMatrix) {\n // Anders Hafreager comments:\n // Depth value can be calculated by transforming the z-component of the intersection point to projection space.\n // The w-component is also needed to scale projection space into clip space.\n // However, the 4th column of the projection matrix is (0, 0, const, 0), so we can exploit this when computing w-value.\n float projected_intersection_z = projectionMatrix[0][2] * p.x + projectionMatrix[1][2] * p.y + projectionMatrix[2][2] * p.z + projectionMatrix[3][2];\n\n // If we want to use orthographic camera, the full w-component is found as\n float projected_intersection_w = projectionMatrix[0][3] * p.x + projectionMatrix[1][3] * p.y + projectionMatrix[2][3] * p.z + projectionMatrix[3][3];\n // float projected_intersection_w = projectionMatrix[2][3]*newPoint.z; // Optimized for perspective camera\n return ((gl_DepthRange.diff * (projected_intersection_z / projected_intersection_w)) + gl_DepthRange.near + gl_DepthRange.far) * .5;\n}\n\nfloat updateFragmentDepth(vec3 p, mat4 projectionMatrix) {\n gl_FragDepth = computeFragmentDepth(p, projectionMatrix);\n return gl_FragDepth;\n}\n\nin vec4 center;\nin float hRadius;\nin float height;\nin vec4 U;\nin vec4 V;\nin vec4 sphereNormal;\nin float v_treeIndex;\nin vec3 v_color;\nin vec3 v_normal;\n\nvoid main() {\n NodeAppearance appearance = determineNodeAppearance(colorDataTexture, treeIndexTextureSize, v_treeIndex);\n if (!determineVisibility(appearance, renderMode)) {\n discard;\n }\n\n vec4 color = determineColor(v_color, appearance);\n vec3 normal = normalize(sphereNormal.xyz);\n\n float vRadius = center.w;\n float ratio = vRadius / hRadius;\n mat3 basis = mat3(U.xyz, V.xyz, sphereNormal.xyz);\n mat3 scaledBasis = mat3(ratio * U.xyz, ratio * V.xyz, sphereNormal.xyz);\n vec3 surfacePoint = vec3(U.w, V.w, sphereNormal.w);\n vec3 rayTarget = surfacePoint;\n\n#if defined(COGNITE_ORTHOGRAPHIC_CAMERA)\n vec3 rayDirection = vec3(0.0, 0.0, -1.0);\n#else\n vec3 rayDirection = normalize(rayTarget); // rayOrigin is (0,0,0) in camera space\n#endif\n\n vec3 diff = rayTarget - center.xyz;\n vec3 E = diff * scaledBasis;\n vec3 D = rayDirection * scaledBasis;\n\n float a = dot(D, D);\n float b = dot(E, D);\n float c = dot(E, E) - vRadius * vRadius;\n\n // discriminant of sphere equation (factor 2 removed from b above)\n float d = b*b - a*c;\n if(d < 0.0)\n discard;\n\n float sqrtd = sqrt(d);\n float dist1 = (-b - sqrtd) / a;\n float dist2 = (-b + sqrtd) / a;\n\n // Make sure dist1 is the smaller one\n if (dist2 < dist1) {\n float tmp = dist1;\n dist1 = dist2;\n dist2 = tmp;\n }\n\n float dist = dist1;\n float intersectionPointZ = E.z + dist * D.z;\n // Intersection point in camera space\n vec3 p = rayTarget + dist * rayDirection;\n\n if (intersectionPointZ <= vRadius - height ||\n intersectionPointZ > vRadius ||\n isClipped(appearance, p)\n ) {\n // Missed the first point, check the other point\n\n dist = dist2;\n intersectionPointZ = E.z + dist * D.z;\n p = rayTarget + dist * rayDirection;\n if (intersectionPointZ <= vRadius - height ||\n intersectionPointZ > vRadius ||\n isClipped(appearance, p)\n ) {\n // Missed the other point too\n discard;\n }\n }\n\n#if !defined(COGNITE_RENDER_COLOR_ID) && !defined(COGNITE_RENDER_DEPTH)\n // Find normal vector in local space\n normal = vec3(p - center.xyz) * basis;\n normal.z = normal.z * (hRadius / vRadius) * (hRadius / vRadius);\n // Transform into camera space\n normal = normalize(basis * normal);\n if (dot(normal, rayDirection) > 0.) {\n normal = -normal;\n }\n#endif\n\n float fragDepth = updateFragmentDepth(p, projectionMatrix);\n updateFragmentColor(renderMode, color, v_treeIndex, normal, fragDepth, matCapTexture, GeometryType.Primitive);\n}\n"},function(e,t,r){"use strict";r.r(t),t.default="#define GLSLIFY 1\nvec3 mul3(mat4 M, vec3 v) {\n vec4 u = M * vec4(v, 1.0);\n return u.xyz / u.w;\n}\n\n// https://stackoverflow.com/questions/7059962/how-do-i-convert-a-vec4-rgba-value-to-a-float @ Arjan\nfloat unpackVec4ToFloat( vec4 packedFloat)\n{\n vec4 rgba = packedFloat;\n float sign = 1.0 - step(128.0, rgba.x) * 2.0;\n float exponent = 2.0 * mod(rgba.x, 128.0) + step(128.0, rgba.y) - 127.0;\n if (exponent == -127.0) return 0.0;\n float mantissa = mod(rgba.y, 128.0) * 65536.0 + rgba.z * 256.0 + rgba.w + 8388608.0;\n return sign * exp2(exponent - 23.0) * mantissa; \n}\n\nfloat unpackFloatFromRGBATexel(vec4 texel){\n float byteValueR = floor((texel.r * 255.0) + 0.5);\n float byteValueG = floor((texel.g * 255.0) + 0.5);\n float byteValueB = floor((texel.b * 255.0) + 0.5);\n float byteValueA = floor((texel.a * 255.0) + 0.5);\n\n return unpackVec4ToFloat(vec4(byteValueR, byteValueG, byteValueB, byteValueA));\n}\n\nmat4 determineMatrixOverride(\n float treeIndex, \n vec2 treeIndexTextureSize, \n sampler2D transformOverrideIndexTexture, \n vec2 transformOverrideTextureSize, \n sampler2D transformOverrideTexture\n) {\n\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = treeIndexTextureSize.x;\n float dataTextureHeight = treeIndexTextureSize.y;\n\n float xTreeIndexTextureCoord = mod(treeIndex, dataTextureWidth);\n float yTreeIndexTextureCoord = floor(treeIndex / dataTextureWidth);\n\n vec2 indexUV = vec2((xTreeIndexTextureCoord + 0.5) / dataTextureWidth, (yTreeIndexTextureCoord + 0.5) / dataTextureHeight);\n\n vec3 indexTexel = texture(transformOverrideIndexTexture, indexUV).rgb;\n\n float index = floor(indexTexel.r * 256.0) * 65536.0 + floor(indexTexel.g * 256.0) * 256.0 + floor(indexTexel.b * 256.0);\n \n \n if(index == 0.0){\n return mat4(\n 1.0, 0.0, 0.0, 0.0,\n 0.0, 1.0, 0.0, 0.0,\n 0.0, 0.0, 1.0, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n }\n\n index = index - 1.0;\n float overridesPerRow = transformOverrideTextureSize.x / 16.0;\n\n float xOverrideTextureCoord = mod(index, overridesPerRow);\n float yOverrideTextureCoord = floor(index / overridesPerRow);\n\n float cellWidth = 1.0 / transformOverrideTextureSize.x;\n float cellHeight = 1.0 / transformOverrideTextureSize.y;\n\n float overrideU = (xOverrideTextureCoord / overridesPerRow) + cellWidth / 2.0;\n float overrideV = (yOverrideTextureCoord / transformOverrideTextureSize.y) + cellHeight / 2.0;\n\n vec2 overrideUV = vec2(overrideU, overrideV); \n\n float matrixElements[12];\n\n for(int i = 0; i < 12; i++){\n matrixElements[i] = unpackFloatFromRGBATexel(texture(transformOverrideTexture, overrideUV + vec2(float(i) * cellWidth, 0.0)));\n }\n \n return mat4(\n matrixElements[0], matrixElements[4], matrixElements[8], 0,\n matrixElements[1], matrixElements[5], matrixElements[9], 0,\n matrixElements[2], matrixElements[6], matrixElements[10], 0,\n matrixElements[3], matrixElements[7], matrixElements[11], 1\n );\n}\n\nuniform mat4 inverseModelMatrix;\nuniform mat4 inverseNormalMatrix;\nuniform mat4 modelMatrix;\nuniform mat4 viewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat3 normalMatrix;\nuniform vec3 cameraPosition;\nuniform vec2 treeIndexTextureSize;\nuniform vec2 transformOverrideTextureSize;\nuniform sampler2D transformOverrideIndexTexture;\nuniform sampler2D transformOverrideTexture;\n\nin vec3 position;\nin float a_treeIndex;\nin vec3 a_color;\nin vec3 a_center;\nin vec3 a_normal;\nin float a_horizontalRadius;\nin float a_verticalRadius;\nin float a_height;\n\nout float v_treeIndex;\n// We pack vRadius as w-component of center\nout vec4 center;\nout float hRadius;\nout float height;\n// U, V, axis represent the 3x3 sphere basis.\n// They are vec4 to pack extra data into the w-component\n// since Safari on iOS only supports 8 out vec4 registers.\nout vec4 U;\nout vec4 V;\nout vec4 sphereNormal;\nout vec3 v_color;\nout vec3 v_normal;\n\nvoid main() {\n\n mat4 treeIndexWorldTransform = determineMatrixOverride(\n a_treeIndex, \n treeIndexTextureSize, \n transformOverrideIndexTexture, \n transformOverrideTextureSize, \n transformOverrideTexture\n );\n\n mat4 modelViewMatrix = viewMatrix * modelMatrix;\n\n mat4 modelTransformOffset = inverseModelMatrix * treeIndexWorldTransform * modelMatrix;\n\n vec3 centerWithOffset = mul3(modelTransformOffset, a_center).xyz;\n\n vec3 normalWithOffset = (modelTransformOffset * vec4(a_normal, 0)).xyz;\n\n vec3 lDir;\n float distanceToCenterOfSegment = a_verticalRadius - a_height * 0.5;\n vec3 centerOfSegment = centerWithOffset + normalWithOffset * distanceToCenterOfSegment;\n\n#if defined(COGNITE_ORTHOGRAPHIC_CAMERA)\n vec3 objectToCameraModelSpace = inverseNormalMatrix * vec3(0.0, 0.0, 1.0);\n#else\n vec3 rayOrigin = (inverseModelMatrix * vec4(cameraPosition, 1.0)).xyz;\n vec3 objectToCameraModelSpace = rayOrigin - centerOfSegment;\n#endif\n\n vec3 newPosition = position;\n\n float bb = dot(objectToCameraModelSpace, normalWithOffset);\n if (bb < 0.0) { // direction vector looks away, flip it\n lDir = -normalWithOffset;\n } else { // direction vector already looks in my direction\n lDir = normalWithOffset;\n }\n\n vec3 left = normalize(cross(objectToCameraModelSpace, lDir));\n vec3 up = normalize(cross(left, lDir));\n\n // make sure the billboard will not overlap with cap geometry (flickering effect), not important if we write to depth buffer\n newPosition.x *= 1.0 - (a_verticalRadius * (position.x + 1.0) * 0.0025 / a_height);\n\n // Negative angle means height larger than radius,\n // so we should have full size so we can render the largest part of the ellipsoid segment\n float ratio = max(0.0, 1.0 - a_height / a_verticalRadius);\n // maxRadiusOfSegment is the radius of the circle (projected ellipsoid) when ellipsoid segment is seen from above\n float maxRadiusOfSegment = a_horizontalRadius * sqrt(1.0 - ratio * ratio);\n\n vec3 displacement = vec3(newPosition.x * a_height * 0.5, maxRadiusOfSegment * newPosition.y, maxRadiusOfSegment * newPosition.z);\n vec3 surfacePoint = centerOfSegment + mat3(lDir, left, up) * displacement;\n vec3 transformed = surfacePoint;\n\n v_treeIndex = a_treeIndex;\n surfacePoint = mul3(modelViewMatrix, surfacePoint);\n center.xyz = mul3(modelViewMatrix, centerWithOffset);\n center.w = a_verticalRadius; // Pack radius into w-component\n hRadius = a_horizontalRadius;\n height = a_height;\n v_color = a_color;\n\n // compute basis\n sphereNormal.xyz = normalMatrix * normalWithOffset;\n U.xyz = normalMatrix * up;\n V.xyz = normalMatrix * left;\n\n // We pack surfacePoint as w-components of U, V and axis\n U.w = surfacePoint.x;\n V.w = surfacePoint.y;\n sphereNormal.w = surfacePoint.z;\n\n // TODO should perhaps be a different normal?\n vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n gl_Position = projectionMatrix * mvPosition;\n}\n"},function(e,t,r){"use strict";r.r(t),t.default="precision highp float;\n#define GLSLIFY 1\n\nstruct NodeAppearance {\n vec4 colorTexel;\n bool isVisible;\n bool renderInFront;\n bool renderGhosted;\n};\n\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\n/**\n * Packs the integer part of the number given to a RGB color.\n */\nvec3 packIntToColor(float number) {\n float r = floor(number / (255.0 * 255.0)) / 255.0;\n float g = mod(floor(number / 255.0), 255.0) / 255.0;\n float b = mod(number, 255.0) / 255.0;\n return vec3(r, g, b);\n}\n\nstruct GeometryTypeEnum {\n int Quad;\n int Primitive;\n int TriangleMesh;\n int InstancedMesh;\n};\n\nconst GeometryTypeEnum GeometryType = GeometryTypeEnum(1,2,3,4);\n\nconst int RenderTypeColor = 1;\nconst int RenderTypeNormal = 2;\nconst int RenderTypeTreeIndex = 3;\nconst int RenderTypePackColorAndNormal = 4;\nconst int RenderTypeDepth = 5;\nconst int RenderTypeEffects = 6;\nconst int RenderTypeGhost = 7;\nconst int RenderTypeLOD = 8;\nconst int RenderTypeDepthBufferOnly = 9;\nconst int RenderTypeGeometryType = 10;\n\n#include <packing>\n\nout vec4 outputColor;\n\nvec3 packNormalToRgb( const in vec3 normal ) {\n return normalize( normal ) * 0.5 + 0.5;\n}\n\nvoid updateFragmentColor(\n int renderMode, vec4 color, float treeIndex, \n vec3 normal, float depth, sampler2D matCapTexture, \n int geometryType) {\n if (renderMode == RenderTypeColor || renderMode == RenderTypeEffects) {\n vec3 hsv = rgb2hsv(color.rgb);\n hsv.z = min(0.5 * hsv.z + 0.5, 1.0);\n vec3 colorRGB = hsv2rgb(hsv);\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n vec4 albedo = vec4(colorRGB * (0.4 + 0.6 * amplitude), 1.0);\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec4 mc = vec4(texture(matCapTexture, cap).rgb, 1.0);\n \n outputColor = vec4(albedo.rgb * mc.rgb * 1.7, color.a);\n } else if (renderMode == RenderTypeGhost) {\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n float s = 0.4 + 0.6 * amplitude;\n outputColor = vec4(vec3(s), 0.3);\n } else if (renderMode == RenderTypeDepthBufferOnly) {\n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n } else if (renderMode == RenderTypePackColorAndNormal) {\n vec3 hsv = rgb2hsv(color.rgb);\n float a = 0.0;\n if (hsv.y > 0.01) {\n if (hsv.z > 0.5) {\n // light color\n a = (0.55 + hsv.x * 0.45);\n } else {\n // dark color\n a = (0.1 + hsv.x * 0.45);\n }\n } else {\n // no saturation - grayscale\n a = hsv.z * 0.09;\n }\n outputColor = vec4(packNormalToRgb(normal.rgb), a);\n } else if (renderMode == RenderTypeNormal) {\n outputColor = vec4(packNormalToRgb(normal), 1.0);\n } else if (renderMode == RenderTypeTreeIndex) {\n outputColor = vec4(packIntToColor(treeIndex), 1.0);\n } else if (renderMode == RenderTypeDepth) {\n outputColor = packDepthToRGBA(depth);\n } else if (renderMode == RenderTypeLOD) {\n bool isHighDetail = geometryType != GeometryType.Quad;\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture(matCapTexture, cap).rgb * 1.5;\n outputColor = isHighDetail ? vec4(vec3(0.0, 1.0, 0.0) * mc, color.a) : vec4(vec3(1.0, 1.0, 0.0) * mc, color.a);\n } else if (renderMode == RenderTypeGeometryType) {\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture(matCapTexture, cap).rgb * 1.5;\n vec3 geometryColor = \n float(geometryType == 1) * vec3(1.0, 0.0, 0.0) + // Quads\n float(geometryType == 2) * vec3(0.0, 1.0, 0.0) + // Primitives\n float(geometryType == 3) * vec3(0.0, 0.0, 1.0) + // Triangle meshes\n float(geometryType == 4) * vec3(1.0, 1.0, 0.0); // Instance meshes\n outputColor = vec4(geometryColor * mc, color.a);\n } else {\n // Unknown render mode - should not happen. \n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n }\n}\n\nfloat floatBitsSubset(float inNumber, int fromLeastSignificantBitIndex, int toMostSignificantBitIndex) {\n float r = float(fromLeastSignificantBitIndex);\n float l = float(toMostSignificantBitIndex);\n\n float bitShift = pow(2.0, r);\n return mod(((inNumber - mod(inNumber, bitShift)) / bitShift), pow(2.0, l - r));\n}\n\n/*\n\nExample:\n\nGet the value from bit 2 to 4 (not inclusive)\n\ninput:\ninNumber = 173 = 1010_1101 , from=2, to=4\n\nexpected output = 1010_|11|01 = 3\n\n1) subtract any bits in the least significant bit-subset\n\n mod(inNumber=173, pow(2.0, from=2)) = mod(inNumber, 4) = 1\n \n inNumber - 1 = 172\n\n2) bitshift such that we remove the least significant bit-subset\n this is guaranteed to be devisible since we subtracted the remainder\n\n (inNumber=172) / pow(2.0, from=2) = 172 / 4 = 43 = 0010_1011\n\n3) lastly, remove the most significant bit-subset\n\n mod((inNumber=43), pow(2.0, to=4 - from=2) = mod(43, 4)\n\n mod(43, 4) = 3\n\n or in binary notation: 0000_0011 which is the expected result.\n\n*/ \n\nNodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture, vec2 textureSize, float treeIndex) {\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = textureSize.x;\n float dataTextureHeight = textureSize.y;\n\n float u = mod(treeIndex, dataTextureWidth);\n float v = floor(treeIndex / dataTextureWidth);\n float uCoord = (u + 0.5) / dataTextureWidth;\n float vCoord = (v + 0.5) / dataTextureHeight;\n vec2 treeIndexUv = vec2(uCoord, vCoord);\n \n vec4 texel = texture(nodeAppearanceTexture, treeIndexUv);\n float alphaUnwrapped = floor((texel.a * 255.0) + 0.5);\n\n bool isVisible = floatBitsSubset(alphaUnwrapped, 0, 1) == 1.0;\n bool renderInFront = floatBitsSubset(alphaUnwrapped, 1, 2) == 1.0;\n bool renderGhosted = floatBitsSubset(alphaUnwrapped, 2, 3) == 1.0;\n\n return NodeAppearance(texel, isVisible, renderInFront, renderGhosted);\n}\n\nbool determineVisibility(NodeAppearance nodeAppearance, int renderMode) {\n return \n // In ghost mode\n ((renderMode == RenderTypeGhost) && nodeAppearance.isVisible && nodeAppearance.renderGhosted) ||\n // Not ghost mode\n ((renderMode != RenderTypeGhost) && \n !nodeAppearance.renderGhosted && nodeAppearance.isVisible && (nodeAppearance.renderInFront || renderMode != RenderTypeEffects));\n}\n\nvec4 determineColor(vec3 originalColor, NodeAppearance nodeAppearance) {\n vec4 overrideColor = nodeAppearance.colorTexel;\n if (any(greaterThan(overrideColor.rgb, vec3(0.0)))) {\n return overrideColor;\n }\n return vec4(originalColor.rgb, overrideColor.a);\n}\n\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\n\nbool isClipped(NodeAppearance nodeAppearance, vec3 point) {\n#if NUM_CLIPPING_PLANES > 0\n vec3 pointFlipped = -point;\n vec4 plane;\n\n for (int i = 0; i < UNION_CLIPPING_PLANES; i++) {\n plane = clippingPlanes[i];\n if (dot(pointFlipped, plane.xyz) > plane.w) return true;\n }\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n bool clipped = true;\n for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n clipped = (dot(pointFlipped, plane.xyz) > plane.w) && clipped;\n }\n if ( clipped ) return true;\n#endif\n#endif\n return false;\n}\n\n#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n\n// TODO general cylinder and cone are very similar and used\n// the same shader in the old code. Consider de-duplicating\n// parts of this code\n\nuniform sampler2D colorDataTexture;\nuniform sampler2D matCapTexture;\nuniform vec2 treeIndexTextureSize;\nuniform mat4 projectionMatrix;\nuniform int renderMode;\n\n// Note! Must be placed after all uniforms in order for this to work on iOS (REV-287)\nfloat computeFragmentDepth(vec3 p, mat4 projectionMatrix) {\n // Anders Hafreager comments:\n // Depth value can be calculated by transforming the z-component of the intersection point to projection space.\n // The w-component is also needed to scale projection space into clip space.\n // However, the 4th column of the projection matrix is (0, 0, const, 0), so we can exploit this when computing w-value.\n float projected_intersection_z = projectionMatrix[0][2] * p.x + projectionMatrix[1][2] * p.y + projectionMatrix[2][2] * p.z + projectionMatrix[3][2];\n\n // If we want to use orthographic camera, the full w-component is found as\n float projected_intersection_w = projectionMatrix[0][3] * p.x + projectionMatrix[1][3] * p.y + projectionMatrix[2][3] * p.z + projectionMatrix[3][3];\n // float projected_intersection_w = projectionMatrix[2][3]*newPoint.z; // Optimized for perspective camera\n return ((gl_DepthRange.diff * (projected_intersection_z / projected_intersection_w)) + gl_DepthRange.near + gl_DepthRange.far) * .5;\n}\n\nfloat updateFragmentDepth(vec3 p, mat4 projectionMatrix) {\n gl_FragDepth = computeFragmentDepth(p, projectionMatrix);\n return gl_FragDepth;\n}\n\nin vec4 v_centerB;\nin vec4 v_W;\nin vec4 v_U;\nin float v_angle;\nin float v_arcAngle;\nin float v_surfacePointY;\nin vec4 v_planeA;\nin vec4 v_planeB;\nin float v_treeIndex;\nin vec3 v_color;\nin vec3 v_normal;\n\nvoid main() {\n NodeAppearance appearance = determineNodeAppearance(colorDataTexture, treeIndexTextureSize, v_treeIndex);\n if (!determineVisibility(appearance, renderMode)) {\n discard;\n }\n\n vec4 color = determineColor(v_color, appearance); \n vec3 normal = normalize( v_normal );\n\n float R1 = v_centerB.w;\n vec4 U = v_U;\n vec4 W = v_W;\n vec4 V = vec4(normalize(cross(W.xyz, U.xyz)), v_surfacePointY);\n\n mat3 basis = mat3(U.xyz, V.xyz, W.xyz);\n vec3 surfacePoint = vec3(U.w, V.w, W.w);\n vec3 rayTarget = surfacePoint;\n\n#if defined(COGNITE_ORTHOGRAPHIC_CAMERA)\n vec3 rayDirection = vec3(0.0, 0.0, -1.0);\n#else\n vec3 rayDirection = normalize(rayTarget); // rayOrigin is (0,0,0) in camera space\n#endif\n\n vec3 diff = rayTarget - v_centerB.xyz;\n vec3 E = diff * basis;\n vec3 D = rayDirection * basis;\n\n float a = dot(D.xy, D.xy);\n float b = dot(E.xy, D.xy);\n float c = dot(E.xy, E.xy) - R1*R1;\n\n // Calculate a dicriminant of the above quadratic equation\n float d = b*b - a*c;\n\n // d < 0.0 means the ray hits outside an infinitely long cone\n if (d < 0.0)\n discard;\n\n float sqrtd = sqrt(d);\n float dist1 = (-b - sqrtd) / a;\n float dist2 = (-b + sqrtd) / a;\n\n // Make sure dist1 is the smaller one\n if (dist2 < dist1) {\n float tmp = dist1;\n dist1 = dist2;\n dist2 = tmp;\n }\n\n float dist = dist1;\n vec3 intersectionPoint = E + dist * D;\n float theta = atan(intersectionPoint.y, intersectionPoint.x);\n if (theta < v_angle) theta += 2.0 * PI;\n\n // Intersection point in camera space\n vec3 p = rayTarget + dist * rayDirection;\n\n vec3 planeACenter = vec3(0.0, 0.0, v_planeA.w);\n vec3 planeANormal = v_planeA.xyz;\n vec3 planeBCenter = vec3(0.0, 0.0, v_planeB.w);\n vec3 planeBNormal = v_planeB.xyz;\n bool isInner = false;\n\n if (dot(intersectionPoint - planeACenter, planeANormal) > 0.0 ||\n dot(intersectionPoint - planeBCenter, planeBNormal) > 0.0 ||\n theta > v_arcAngle + v_angle ||\n isClipped(appearance, p)\n ) {\n // Missed the first point, check the other point\n isInner = true;\n dist = dist2;\n intersectionPoint = E + dist * D;\n theta = atan(intersectionPoint.y, intersectionPoint.x);\n p = rayTarget + dist*rayDirection;\n if (theta < v_angle) theta += 2.0 * PI;\n if (dot(intersectionPoint - planeACenter, planeANormal) > 0.0 ||\n dot(intersectionPoint - planeBCenter, planeBNormal) > 0.0 ||\n theta > v_arcAngle + v_angle || isClipped(appearance, p)\n ) {\n // Missed the other point too\n discard;\n }\n }\n\n#if !defined(COGNITE_RENDER_COLOR_ID) && !defined(COGNITE_RENDER_DEPTH)\n // Regular cylinder has simpler normal vector in camera space\n vec3 p_local = p - v_centerB.xyz;\n normal = normalize(p_local - W.xyz * dot(p_local, W.xyz));\n#endif\n\n float fragDepth = updateFragmentDepth(p, projectionMatrix);\n updateFragmentColor(renderMode, color, v_treeIndex, normal, fragDepth, matCapTexture, GeometryType.Primitive);\n}\n"},function(e,t,r){"use strict";r.r(t),t.default="#define GLSLIFY 1\nvec3 mul3(mat4 M, vec3 v) {\n vec4 u = M * vec4(v, 1.0);\n return u.xyz / u.w;\n}\n\n// https://stackoverflow.com/questions/7059962/how-do-i-convert-a-vec4-rgba-value-to-a-float @ Arjan\nfloat unpackVec4ToFloat( vec4 packedFloat)\n{\n vec4 rgba = packedFloat;\n float sign = 1.0 - step(128.0, rgba.x) * 2.0;\n float exponent = 2.0 * mod(rgba.x, 128.0) + step(128.0, rgba.y) - 127.0;\n if (exponent == -127.0) return 0.0;\n float mantissa = mod(rgba.y, 128.0) * 65536.0 + rgba.z * 256.0 + rgba.w + 8388608.0;\n return sign * exp2(exponent - 23.0) * mantissa; \n}\n\nfloat unpackFloatFromRGBATexel(vec4 texel){\n float byteValueR = floor((texel.r * 255.0) + 0.5);\n float byteValueG = floor((texel.g * 255.0) + 0.5);\n float byteValueB = floor((texel.b * 255.0) + 0.5);\n float byteValueA = floor((texel.a * 255.0) + 0.5);\n\n return unpackVec4ToFloat(vec4(byteValueR, byteValueG, byteValueB, byteValueA));\n}\n\nmat4 determineMatrixOverride(\n float treeIndex, \n vec2 treeIndexTextureSize, \n sampler2D transformOverrideIndexTexture, \n vec2 transformOverrideTextureSize, \n sampler2D transformOverrideTexture\n) {\n\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = treeIndexTextureSize.x;\n float dataTextureHeight = treeIndexTextureSize.y;\n\n float xTreeIndexTextureCoord = mod(treeIndex, dataTextureWidth);\n float yTreeIndexTextureCoord = floor(treeIndex / dataTextureWidth);\n\n vec2 indexUV = vec2((xTreeIndexTextureCoord + 0.5) / dataTextureWidth, (yTreeIndexTextureCoord + 0.5) / dataTextureHeight);\n\n vec3 indexTexel = texture(transformOverrideIndexTexture, indexUV).rgb;\n\n float index = floor(indexTexel.r * 256.0) * 65536.0 + floor(indexTexel.g * 256.0) * 256.0 + floor(indexTexel.b * 256.0);\n \n \n if(index == 0.0){\n return mat4(\n 1.0, 0.0, 0.0, 0.0,\n 0.0, 1.0, 0.0, 0.0,\n 0.0, 0.0, 1.0, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n }\n\n index = index - 1.0;\n float overridesPerRow = transformOverrideTextureSize.x / 16.0;\n\n float xOverrideTextureCoord = mod(index, overridesPerRow);\n float yOverrideTextureCoord = floor(index / overridesPerRow);\n\n float cellWidth = 1.0 / transformOverrideTextureSize.x;\n float cellHeight = 1.0 / transformOverrideTextureSize.y;\n\n float overrideU = (xOverrideTextureCoord / overridesPerRow) + cellWidth / 2.0;\n float overrideV = (yOverrideTextureCoord / transformOverrideTextureSize.y) + cellHeight / 2.0;\n\n vec2 overrideUV = vec2(overrideU, overrideV); \n\n float matrixElements[12];\n\n for(int i = 0; i < 12; i++){\n matrixElements[i] = unpackFloatFromRGBATexel(texture(transformOverrideTexture, overrideUV + vec2(float(i) * cellWidth, 0.0)));\n }\n \n return mat4(\n matrixElements[0], matrixElements[4], matrixElements[8], 0,\n matrixElements[1], matrixElements[5], matrixElements[9], 0,\n matrixElements[2], matrixElements[6], matrixElements[10], 0,\n matrixElements[3], matrixElements[7], matrixElements[11], 1\n );\n}\n\nuniform mat4 inverseModelMatrix;\nuniform mat4 modelMatrix;\nuniform mat4 viewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat3 normalMatrix;\nuniform vec3 cameraPosition;\nuniform vec2 treeIndexTextureSize;\nuniform vec2 transformOverrideTextureSize;\nuniform sampler2D transformOverrideIndexTexture;\nuniform sampler2D transformOverrideTexture;\n\nin vec3 position;\nin vec3 normal;\nin float a_treeIndex;\nin vec3 a_centerA;\nin vec3 a_centerB;\nin float a_radius;\nin vec3 a_color;\n// slicing plane attributes\nin vec4 a_planeA;\nin vec4 a_planeB;\n// segment attributes\nin vec3 a_localXAxis;\nin float a_angle;\nin float a_arcAngle;\n\nout float v_treeIndex;\n// We pack the radii into w-components\nout vec4 v_centerB;\n// U, V, axis represent the 3x3 cone basis.\n// They are vec4 to pack extra data into the w-component\n// since Safari on iOS only supports 8 varying vec4 registers.\nout vec4 v_U;\nout vec4 v_W;\nout vec4 v_planeA;\nout vec4 v_planeB;\nout float v_surfacePointY;\nout float v_angle;\nout float v_arcAngle;\nout vec3 v_color;\nout vec3 v_normal;\n\nvoid main() {\n\n mat4 modelViewMatrix = viewMatrix * modelMatrix;\n\n mat4 treeIndexWorldTransform = determineMatrixOverride(\n a_treeIndex, \n treeIndexTextureSize, \n transformOverrideIndexTexture, \n transformOverrideTextureSize, \n transformOverrideTexture\n );\n \n mat4 modelTransformOffset = inverseModelMatrix * treeIndexWorldTransform * modelMatrix;\n\n vec3 centerA = mul3(modelTransformOffset, a_centerA);\n vec3 centerB = mul3(modelTransformOffset, a_centerB);\n\n vec3 center = 0.5 * (centerA + centerB);\n float halfHeight = 0.5 * length(centerA - centerB);\n vec3 dir = normalize(centerA - centerB);\n vec3 newPosition = position;\n\n vec3 rayOrigin = (inverseModelMatrix * vec4(cameraPosition, 1.0)).xyz;\n vec3 objectToCameraModelSpace = rayOrigin - center;\n\n float leftUpScale = a_radius;\n\n vec3 lDir = dir;\n if (dot(objectToCameraModelSpace, dir) < 0.0) { // direction vector looks away, flip it\n lDir = -lDir;\n }\n\n vec3 left = normalize(cross(objectToCameraModelSpace, lDir));\n vec3 up = normalize(cross(left, lDir));\n\n // make sure the billboard will not overlap with cap geometry (flickering effect), not important if we write to depth buffer\n newPosition.x *= 1.0 - (a_radius * (position.x + 1.0) * 0.0025 / halfHeight);\n\n vec3 surfacePoint = center + mat3(halfHeight * lDir, leftUpScale * left, leftUpScale * up) * newPosition;\n vec3 transformed = surfacePoint;\n surfacePoint = mul3(modelViewMatrix, surfacePoint);\n\n // varying data\n v_treeIndex = a_treeIndex;\n v_angle = a_angle;\n v_arcAngle = a_arcAngle;\n\n // compute basis for cone\n v_W.xyz = dir;\n v_U.xyz = (modelTransformOffset * vec4(a_localXAxis, 0)).xyz;\n v_W.xyz = normalize(normalMatrix * v_W.xyz);\n v_U.xyz = normalize(normalMatrix * v_U.xyz);\n // We pack surfacePoint as w-components of U and W\n v_W.w = surfacePoint.z;\n v_U.w = surfacePoint.x;\n\n // We pack radii as w-components of v_centerB\n mat4 modelToTransformOffset = modelMatrix * modelTransformOffset;\n float radius = length((modelToTransformOffset * vec4(a_localXAxis * a_radius, 0.0)).xyz);\n\n centerB = centerB - dir;\n v_centerB.xyz = mul3(modelViewMatrix, centerB);\n v_centerB.w = radius;\n\n vec4 planeA = a_planeA;\n planeA.w = length((modelToTransformOffset * vec4(planeA.xyz * planeA.w, 0.0)).xyz);\n\n vec4 planeB = a_planeB;\n planeB.w = length((modelToTransformOffset * vec4(planeB.xyz * planeB.w, 0.0)).xyz);\n\n v_planeA = planeA;\n v_planeB = planeB;\n v_surfacePointY = surfacePoint.y;\n v_centerB.w = radius;\n\n v_color = a_color;\n v_normal = normalMatrix * normal;\n\n vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n gl_Position = projectionMatrix * mvPosition;\n}\n"},function(e,t,r){"use strict";r.r(t),t.default="precision highp float;\n#define GLSLIFY 1\n\nstruct NodeAppearance {\n vec4 colorTexel;\n bool isVisible;\n bool renderInFront;\n bool renderGhosted;\n};\n\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\n/**\n * Packs the integer part of the number given to a RGB color.\n */\nvec3 packIntToColor(float number) {\n float r = floor(number / (255.0 * 255.0)) / 255.0;\n float g = mod(floor(number / 255.0), 255.0) / 255.0;\n float b = mod(number, 255.0) / 255.0;\n return vec3(r, g, b);\n}\n\nstruct GeometryTypeEnum {\n int Quad;\n int Primitive;\n int TriangleMesh;\n int InstancedMesh;\n};\n\nconst GeometryTypeEnum GeometryType = GeometryTypeEnum(1,2,3,4);\n\nconst int RenderTypeColor = 1;\nconst int RenderTypeNormal = 2;\nconst int RenderTypeTreeIndex = 3;\nconst int RenderTypePackColorAndNormal = 4;\nconst int RenderTypeDepth = 5;\nconst int RenderTypeEffects = 6;\nconst int RenderTypeGhost = 7;\nconst int RenderTypeLOD = 8;\nconst int RenderTypeDepthBufferOnly = 9;\nconst int RenderTypeGeometryType = 10;\n\n#include <packing>\n\nout vec4 outputColor;\n\nvec3 packNormalToRgb( const in vec3 normal ) {\n return normalize( normal ) * 0.5 + 0.5;\n}\n\nvoid updateFragmentColor(\n int renderMode, vec4 color, float treeIndex, \n vec3 normal, float depth, sampler2D matCapTexture, \n int geometryType) {\n if (renderMode == RenderTypeColor || renderMode == RenderTypeEffects) {\n vec3 hsv = rgb2hsv(color.rgb);\n hsv.z = min(0.5 * hsv.z + 0.5, 1.0);\n vec3 colorRGB = hsv2rgb(hsv);\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n vec4 albedo = vec4(colorRGB * (0.4 + 0.6 * amplitude), 1.0);\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec4 mc = vec4(texture(matCapTexture, cap).rgb, 1.0);\n \n outputColor = vec4(albedo.rgb * mc.rgb * 1.7, color.a);\n } else if (renderMode == RenderTypeGhost) {\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n float s = 0.4 + 0.6 * amplitude;\n outputColor = vec4(vec3(s), 0.3);\n } else if (renderMode == RenderTypeDepthBufferOnly) {\n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n } else if (renderMode == RenderTypePackColorAndNormal) {\n vec3 hsv = rgb2hsv(color.rgb);\n float a = 0.0;\n if (hsv.y > 0.01) {\n if (hsv.z > 0.5) {\n // light color\n a = (0.55 + hsv.x * 0.45);\n } else {\n // dark color\n a = (0.1 + hsv.x * 0.45);\n }\n } else {\n // no saturation - grayscale\n a = hsv.z * 0.09;\n }\n outputColor = vec4(packNormalToRgb(normal.rgb), a);\n } else if (renderMode == RenderTypeNormal) {\n outputColor = vec4(packNormalToRgb(normal), 1.0);\n } else if (renderMode == RenderTypeTreeIndex) {\n outputColor = vec4(packIntToColor(treeIndex), 1.0);\n } else if (renderMode == RenderTypeDepth) {\n outputColor = packDepthToRGBA(depth);\n } else if (renderMode == RenderTypeLOD) {\n bool isHighDetail = geometryType != GeometryType.Quad;\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture(matCapTexture, cap).rgb * 1.5;\n outputColor = isHighDetail ? vec4(vec3(0.0, 1.0, 0.0) * mc, color.a) : vec4(vec3(1.0, 1.0, 0.0) * mc, color.a);\n } else if (renderMode == RenderTypeGeometryType) {\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture(matCapTexture, cap).rgb * 1.5;\n vec3 geometryColor = \n float(geometryType == 1) * vec3(1.0, 0.0, 0.0) + // Quads\n float(geometryType == 2) * vec3(0.0, 1.0, 0.0) + // Primitives\n float(geometryType == 3) * vec3(0.0, 0.0, 1.0) + // Triangle meshes\n float(geometryType == 4) * vec3(1.0, 1.0, 0.0); // Instance meshes\n outputColor = vec4(geometryColor * mc, color.a);\n } else {\n // Unknown render mode - should not happen. \n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n }\n}\n\nfloat floatBitsSubset(float inNumber, int fromLeastSignificantBitIndex, int toMostSignificantBitIndex) {\n float r = float(fromLeastSignificantBitIndex);\n float l = float(toMostSignificantBitIndex);\n\n float bitShift = pow(2.0, r);\n return mod(((inNumber - mod(inNumber, bitShift)) / bitShift), pow(2.0, l - r));\n}\n\n/*\n\nExample:\n\nGet the value from bit 2 to 4 (not inclusive)\n\ninput:\ninNumber = 173 = 1010_1101 , from=2, to=4\n\nexpected output = 1010_|11|01 = 3\n\n1) subtract any bits in the least significant bit-subset\n\n mod(inNumber=173, pow(2.0, from=2)) = mod(inNumber, 4) = 1\n \n inNumber - 1 = 172\n\n2) bitshift such that we remove the least significant bit-subset\n this is guaranteed to be devisible since we subtracted the remainder\n\n (inNumber=172) / pow(2.0, from=2) = 172 / 4 = 43 = 0010_1011\n\n3) lastly, remove the most significant bit-subset\n\n mod((inNumber=43), pow(2.0, to=4 - from=2) = mod(43, 4)\n\n mod(43, 4) = 3\n\n or in binary notation: 0000_0011 which is the expected result.\n\n*/ \n\nNodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture, vec2 textureSize, float treeIndex) {\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = textureSize.x;\n float dataTextureHeight = textureSize.y;\n\n float u = mod(treeIndex, dataTextureWidth);\n float v = floor(treeIndex / dataTextureWidth);\n float uCoord = (u + 0.5) / dataTextureWidth;\n float vCoord = (v + 0.5) / dataTextureHeight;\n vec2 treeIndexUv = vec2(uCoord, vCoord);\n \n vec4 texel = texture(nodeAppearanceTexture, treeIndexUv);\n float alphaUnwrapped = floor((texel.a * 255.0) + 0.5);\n\n bool isVisible = floatBitsSubset(alphaUnwrapped, 0, 1) == 1.0;\n bool renderInFront = floatBitsSubset(alphaUnwrapped, 1, 2) == 1.0;\n bool renderGhosted = floatBitsSubset(alphaUnwrapped, 2, 3) == 1.0;\n\n return NodeAppearance(texel, isVisible, renderInFront, renderGhosted);\n}\n\nbool determineVisibility(NodeAppearance nodeAppearance, int renderMode) {\n return \n // In ghost mode\n ((renderMode == RenderTypeGhost) && nodeAppearance.isVisible && nodeAppearance.renderGhosted) ||\n // Not ghost mode\n ((renderMode != RenderTypeGhost) && \n !nodeAppearance.renderGhosted && nodeAppearance.isVisible && (nodeAppearance.renderInFront || renderMode != RenderTypeEffects));\n}\n\nvec4 determineColor(vec3 originalColor, NodeAppearance nodeAppearance) {\n vec4 overrideColor = nodeAppearance.colorTexel;\n if (any(greaterThan(overrideColor.rgb, vec3(0.0)))) {\n return overrideColor;\n }\n return vec4(originalColor.rgb, overrideColor.a);\n}\n\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\n\nbool isClipped(NodeAppearance nodeAppearance, vec3 point) {\n#if NUM_CLIPPING_PLANES > 0\n vec3 pointFlipped = -point;\n vec4 plane;\n\n for (int i = 0; i < UNION_CLIPPING_PLANES; i++) {\n plane = clippingPlanes[i];\n if (dot(pointFlipped, plane.xyz) > plane.w) return true;\n }\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n bool clipped = true;\n for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n clipped = (dot(pointFlipped, plane.xyz) > plane.w) && clipped;\n }\n if ( clipped ) return true;\n#endif\n#endif\n return false;\n}\n\n#define PI 3.14159265359\n#define PI2 6.28318530718\n#define PI_HALF 1.5707963267949\n\nuniform sampler2D colorDataTexture;\nuniform sampler2D matCapTexture;\nuniform vec2 treeIndexTextureSize;\nuniform int renderMode;\n\nin float v_oneMinusThicknessSqr;\nin vec2 v_xy;\nin float v_angle;\nin float v_arcAngle;\nin float v_treeIndex;\nin vec3 v_color;\nin vec3 v_normal;\nin vec3 vViewPosition;\n\nvoid main() {\n NodeAppearance appearance = determineNodeAppearance(colorDataTexture, treeIndexTextureSize, v_treeIndex);\n if (!determineVisibility(appearance, renderMode)) {\n discard;\n }\n\n if (isClipped(appearance, vViewPosition)) {\n discard;\n }\n\n vec4 color = determineColor(v_color, appearance);\n float dist = dot(v_xy, v_xy);\n float theta = atan(v_xy.y, v_xy.x);\n vec3 normal = normalize( v_normal );\n if (theta < v_angle) {\n theta += 2.0 * PI;\n }\n if (dist > 0.25 || dist < 0.25 * v_oneMinusThicknessSqr || theta >= v_angle + v_arcAngle) {\n discard;\n }\n\n updateFragmentColor(renderMode, color, v_treeIndex, normal, gl_FragCoord.z, matCapTexture, GeometryType.Primitive);\n}\n"},function(e,t,r){"use strict";r.r(t),t.default="#define GLSLIFY 1\n// https://stackoverflow.com/questions/7059962/how-do-i-convert-a-vec4-rgba-value-to-a-float @ Arjan\nfloat unpackVec4ToFloat( vec4 packedFloat)\n{\n vec4 rgba = packedFloat;\n float sign = 1.0 - step(128.0, rgba.x) * 2.0;\n float exponent = 2.0 * mod(rgba.x, 128.0) + step(128.0, rgba.y) - 127.0;\n if (exponent == -127.0) return 0.0;\n float mantissa = mod(rgba.y, 128.0) * 65536.0 + rgba.z * 256.0 + rgba.w + 8388608.0;\n return sign * exp2(exponent - 23.0) * mantissa; \n}\n\nfloat unpackFloatFromRGBATexel(vec4 texel){\n float byteValueR = floor((texel.r * 255.0) + 0.5);\n float byteValueG = floor((texel.g * 255.0) + 0.5);\n float byteValueB = floor((texel.b * 255.0) + 0.5);\n float byteValueA = floor((texel.a * 255.0) + 0.5);\n\n return unpackVec4ToFloat(vec4(byteValueR, byteValueG, byteValueB, byteValueA));\n}\n\nmat4 determineMatrixOverride(\n float treeIndex, \n vec2 treeIndexTextureSize, \n sampler2D transformOverrideIndexTexture, \n vec2 transformOverrideTextureSize, \n sampler2D transformOverrideTexture\n) {\n\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = treeIndexTextureSize.x;\n float dataTextureHeight = treeIndexTextureSize.y;\n\n float xTreeIndexTextureCoord = mod(treeIndex, dataTextureWidth);\n float yTreeIndexTextureCoord = floor(treeIndex / dataTextureWidth);\n\n vec2 indexUV = vec2((xTreeIndexTextureCoord + 0.5) / dataTextureWidth, (yTreeIndexTextureCoord + 0.5) / dataTextureHeight);\n\n vec3 indexTexel = texture(transformOverrideIndexTexture, indexUV).rgb;\n\n float index = floor(indexTexel.r * 256.0) * 65536.0 + floor(indexTexel.g * 256.0) * 256.0 + floor(indexTexel.b * 256.0);\n \n \n if(index == 0.0){\n return mat4(\n 1.0, 0.0, 0.0, 0.0,\n 0.0, 1.0, 0.0, 0.0,\n 0.0, 0.0, 1.0, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n }\n\n index = index - 1.0;\n float overridesPerRow = transformOverrideTextureSize.x / 16.0;\n\n float xOverrideTextureCoord = mod(index, overridesPerRow);\n float yOverrideTextureCoord = floor(index / overridesPerRow);\n\n float cellWidth = 1.0 / transformOverrideTextureSize.x;\n float cellHeight = 1.0 / transformOverrideTextureSize.y;\n\n float overrideU = (xOverrideTextureCoord / overridesPerRow) + cellWidth / 2.0;\n float overrideV = (yOverrideTextureCoord / transformOverrideTextureSize.y) + cellHeight / 2.0;\n\n vec2 overrideUV = vec2(overrideU, overrideV); \n\n float matrixElements[12];\n\n for(int i = 0; i < 12; i++){\n matrixElements[i] = unpackFloatFromRGBATexel(texture(transformOverrideTexture, overrideUV + vec2(float(i) * cellWidth, 0.0)));\n }\n \n return mat4(\n matrixElements[0], matrixElements[4], matrixElements[8], 0,\n matrixElements[1], matrixElements[5], matrixElements[9], 0,\n matrixElements[2], matrixElements[6], matrixElements[10], 0,\n matrixElements[3], matrixElements[7], matrixElements[11], 1\n );\n}\n\nuniform mat4 inverseModelMatrix;\nuniform mat4 modelMatrix;\nuniform mat4 viewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat3 normalMatrix;\nuniform vec2 treeIndexTextureSize;\nuniform vec2 transformOverrideTextureSize;\nuniform sampler2D transformOverrideIndexTexture;\nuniform sampler2D transformOverrideTexture;\n\nin vec3 position;\nin mat4 a_instanceMatrix;\nin float a_treeIndex;\nin vec3 a_color;\nin float a_angle;\nin float a_arcAngle;\nin float a_thickness;\nin vec3 a_normal;\n\nout float v_treeIndex;\nout float v_oneMinusThicknessSqr;\nout vec2 v_xy;\nout float v_angle;\nout float v_arcAngle;\nout vec3 v_color;\nout vec3 v_normal;\nout vec3 vViewPosition;\n\nvoid main() {\n v_treeIndex = a_treeIndex;\n v_oneMinusThicknessSqr = (1.0 - a_thickness) * (1.0 - a_thickness);\n v_xy = vec2(position.x, position.y);\n v_angle = a_angle;\n v_arcAngle = a_arcAngle;\n\n mat4 treeIndexWorldTransform = determineMatrixOverride(\n a_treeIndex, \n treeIndexTextureSize, \n transformOverrideIndexTexture, \n transformOverrideTextureSize, \n transformOverrideTexture\n );\n\n vec3 transformed = (a_instanceMatrix * vec4(position, 1.0)).xyz;\n vec4 mvPosition = viewMatrix * treeIndexWorldTransform * modelMatrix * vec4( transformed, 1.0 );\n v_color = a_color;\n\n v_normal = normalMatrix * normalize(inverseModelMatrix * treeIndexWorldTransform * modelMatrix * vec4(normalize(a_normal), 0.0)).xyz;\n vViewPosition = mvPosition.xyz;\n gl_Position = projectionMatrix * mvPosition;\n}\n"},function(e,t,r){"use strict";r.r(t),t.default="precision highp float;\n#define GLSLIFY 1\n\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\n/**\n * Packs the integer part of the number given to a RGB color.\n */\nvec3 packIntToColor(float number) {\n float r = floor(number / (255.0 * 255.0)) / 255.0;\n float g = mod(floor(number / 255.0), 255.0) / 255.0;\n float b = mod(number, 255.0) / 255.0;\n return vec3(r, g, b);\n}\n\nstruct GeometryTypeEnum {\n int Quad;\n int Primitive;\n int TriangleMesh;\n int InstancedMesh;\n};\n\nconst GeometryTypeEnum GeometryType = GeometryTypeEnum(1,2,3,4);\n\nconst int RenderTypeColor = 1;\nconst int RenderTypeNormal = 2;\nconst int RenderTypeTreeIndex = 3;\nconst int RenderTypePackColorAndNormal = 4;\nconst int RenderTypeDepth = 5;\nconst int RenderTypeEffects = 6;\nconst int RenderTypeGhost = 7;\nconst int RenderTypeLOD = 8;\nconst int RenderTypeDepthBufferOnly = 9;\nconst int RenderTypeGeometryType = 10;\n\n#include <packing>\n\nout vec4 outputColor;\n\nvec3 packNormalToRgb( const in vec3 normal ) {\n return normalize( normal ) * 0.5 + 0.5;\n}\n\nvoid updateFragmentColor(\n int renderMode, vec4 color, float treeIndex, \n vec3 normal, float depth, sampler2D matCapTexture, \n int geometryType) {\n if (renderMode == RenderTypeColor || renderMode == RenderTypeEffects) {\n vec3 hsv = rgb2hsv(color.rgb);\n hsv.z = min(0.5 * hsv.z + 0.5, 1.0);\n vec3 colorRGB = hsv2rgb(hsv);\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n vec4 albedo = vec4(colorRGB * (0.4 + 0.6 * amplitude), 1.0);\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec4 mc = vec4(texture(matCapTexture, cap).rgb, 1.0);\n \n outputColor = vec4(albedo.rgb * mc.rgb * 1.7, color.a);\n } else if (renderMode == RenderTypeGhost) {\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n float s = 0.4 + 0.6 * amplitude;\n outputColor = vec4(vec3(s), 0.3);\n } else if (renderMode == RenderTypeDepthBufferOnly) {\n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n } else if (renderMode == RenderTypePackColorAndNormal) {\n vec3 hsv = rgb2hsv(color.rgb);\n float a = 0.0;\n if (hsv.y > 0.01) {\n if (hsv.z > 0.5) {\n // light color\n a = (0.55 + hsv.x * 0.45);\n } else {\n // dark color\n a = (0.1 + hsv.x * 0.45);\n }\n } else {\n // no saturation - grayscale\n a = hsv.z * 0.09;\n }\n outputColor = vec4(packNormalToRgb(normal.rgb), a);\n } else if (renderMode == RenderTypeNormal) {\n outputColor = vec4(packNormalToRgb(normal), 1.0);\n } else if (renderMode == RenderTypeTreeIndex) {\n outputColor = vec4(packIntToColor(treeIndex), 1.0);\n } else if (renderMode == RenderTypeDepth) {\n outputColor = packDepthToRGBA(depth);\n } else if (renderMode == RenderTypeLOD) {\n bool isHighDetail = geometryType != GeometryType.Quad;\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture(matCapTexture, cap).rgb * 1.5;\n outputColor = isHighDetail ? vec4(vec3(0.0, 1.0, 0.0) * mc, color.a) : vec4(vec3(1.0, 1.0, 0.0) * mc, color.a);\n } else if (renderMode == RenderTypeGeometryType) {\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture(matCapTexture, cap).rgb * 1.5;\n vec3 geometryColor = \n float(geometryType == 1) * vec3(1.0, 0.0, 0.0) + // Quads\n float(geometryType == 2) * vec3(0.0, 1.0, 0.0) + // Primitives\n float(geometryType == 3) * vec3(0.0, 0.0, 1.0) + // Triangle meshes\n float(geometryType == 4) * vec3(1.0, 1.0, 0.0); // Instance meshes\n outputColor = vec4(geometryColor * mc, color.a);\n } else {\n // Unknown render mode - should not happen. \n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n }\n}\n\nstruct NodeAppearance {\n vec4 colorTexel;\n bool isVisible;\n bool renderInFront;\n bool renderGhosted;\n};\n\nfloat floatBitsSubset(float inNumber, int fromLeastSignificantBitIndex, int toMostSignificantBitIndex) {\n float r = float(fromLeastSignificantBitIndex);\n float l = float(toMostSignificantBitIndex);\n\n float bitShift = pow(2.0, r);\n return mod(((inNumber - mod(inNumber, bitShift)) / bitShift), pow(2.0, l - r));\n}\n\n/*\n\nExample:\n\nGet the value from bit 2 to 4 (not inclusive)\n\ninput:\ninNumber = 173 = 1010_1101 , from=2, to=4\n\nexpected output = 1010_|11|01 = 3\n\n1) subtract any bits in the least significant bit-subset\n\n mod(inNumber=173, pow(2.0, from=2)) = mod(inNumber, 4) = 1\n \n inNumber - 1 = 172\n\n2) bitshift such that we remove the least significant bit-subset\n this is guaranteed to be devisible since we subtracted the remainder\n\n (inNumber=172) / pow(2.0, from=2) = 172 / 4 = 43 = 0010_1011\n\n3) lastly, remove the most significant bit-subset\n\n mod((inNumber=43), pow(2.0, to=4 - from=2) = mod(43, 4)\n\n mod(43, 4) = 3\n\n or in binary notation: 0000_0011 which is the expected result.\n\n*/ \n\nNodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture, vec2 textureSize, float treeIndex) {\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = textureSize.x;\n float dataTextureHeight = textureSize.y;\n\n float u = mod(treeIndex, dataTextureWidth);\n float v = floor(treeIndex / dataTextureWidth);\n float uCoord = (u + 0.5) / dataTextureWidth;\n float vCoord = (v + 0.5) / dataTextureHeight;\n vec2 treeIndexUv = vec2(uCoord, vCoord);\n \n vec4 texel = texture(nodeAppearanceTexture, treeIndexUv);\n float alphaUnwrapped = floor((texel.a * 255.0) + 0.5);\n\n bool isVisible = floatBitsSubset(alphaUnwrapped, 0, 1) == 1.0;\n bool renderInFront = floatBitsSubset(alphaUnwrapped, 1, 2) == 1.0;\n bool renderGhosted = floatBitsSubset(alphaUnwrapped, 2, 3) == 1.0;\n\n return NodeAppearance(texel, isVisible, renderInFront, renderGhosted);\n}\n\nbool determineVisibility(NodeAppearance nodeAppearance, int renderMode) {\n return \n // In ghost mode\n ((renderMode == RenderTypeGhost) && nodeAppearance.isVisible && nodeAppearance.renderGhosted) ||\n // Not ghost mode\n ((renderMode != RenderTypeGhost) && \n !nodeAppearance.renderGhosted && nodeAppearance.isVisible && (nodeAppearance.renderInFront || renderMode != RenderTypeEffects));\n}\n\nvec4 determineColor(vec3 originalColor, NodeAppearance nodeAppearance) {\n vec4 overrideColor = nodeAppearance.colorTexel;\n if (any(greaterThan(overrideColor.rgb, vec3(0.0)))) {\n return overrideColor;\n }\n return vec4(originalColor.rgb, overrideColor.a);\n}\n\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\n\nbool isClipped(NodeAppearance nodeAppearance, vec3 point) {\n#if NUM_CLIPPING_PLANES > 0\n vec3 pointFlipped = -point;\n vec4 plane;\n\n for (int i = 0; i < UNION_CLIPPING_PLANES; i++) {\n plane = clippingPlanes[i];\n if (dot(pointFlipped, plane.xyz) > plane.w) return true;\n }\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n bool clipped = true;\n for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n clipped = (dot(pointFlipped, plane.xyz) > plane.w) && clipped;\n }\n if ( clipped ) return true;\n#endif\n#endif\n return false;\n}\n\nuniform sampler2D colorDataTexture;\nuniform sampler2D matCapTexture;\nuniform vec2 treeIndexTextureSize;\nuniform int renderMode;\n\nin float v_treeIndex;\nin vec3 v_color;\nin vec3 v_normal;\nin vec3 vViewPosition;\n\nvoid main() {\n NodeAppearance appearance = determineNodeAppearance(colorDataTexture, treeIndexTextureSize, v_treeIndex);\n if (!determineVisibility(appearance, renderMode)) {\n discard;\n }\n if (isClipped(appearance, vViewPosition)) {\n discard;\n }\n\n vec4 color = determineColor(v_color, appearance); \n vec3 normal = normalize(v_normal);\n updateFragmentColor(renderMode, color, v_treeIndex, normal, gl_FragCoord.z, matCapTexture, GeometryType.Primitive);\n}\n"},function(e,t,r){"use strict";r.r(t),t.default="#define GLSLIFY 1\n// https://stackoverflow.com/questions/7059962/how-do-i-convert-a-vec4-rgba-value-to-a-float @ Arjan\nfloat unpackVec4ToFloat( vec4 packedFloat)\n{\n vec4 rgba = packedFloat;\n float sign = 1.0 - step(128.0, rgba.x) * 2.0;\n float exponent = 2.0 * mod(rgba.x, 128.0) + step(128.0, rgba.y) - 127.0;\n if (exponent == -127.0) return 0.0;\n float mantissa = mod(rgba.y, 128.0) * 65536.0 + rgba.z * 256.0 + rgba.w + 8388608.0;\n return sign * exp2(exponent - 23.0) * mantissa; \n}\n\nfloat unpackFloatFromRGBATexel(vec4 texel){\n float byteValueR = floor((texel.r * 255.0) + 0.5);\n float byteValueG = floor((texel.g * 255.0) + 0.5);\n float byteValueB = floor((texel.b * 255.0) + 0.5);\n float byteValueA = floor((texel.a * 255.0) + 0.5);\n\n return unpackVec4ToFloat(vec4(byteValueR, byteValueG, byteValueB, byteValueA));\n}\n\nmat4 determineMatrixOverride(\n float treeIndex, \n vec2 treeIndexTextureSize, \n sampler2D transformOverrideIndexTexture, \n vec2 transformOverrideTextureSize, \n sampler2D transformOverrideTexture\n) {\n\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = treeIndexTextureSize.x;\n float dataTextureHeight = treeIndexTextureSize.y;\n\n float xTreeIndexTextureCoord = mod(treeIndex, dataTextureWidth);\n float yTreeIndexTextureCoord = floor(treeIndex / dataTextureWidth);\n\n vec2 indexUV = vec2((xTreeIndexTextureCoord + 0.5) / dataTextureWidth, (yTreeIndexTextureCoord + 0.5) / dataTextureHeight);\n\n vec3 indexTexel = texture(transformOverrideIndexTexture, indexUV).rgb;\n\n float index = floor(indexTexel.r * 256.0) * 65536.0 + floor(indexTexel.g * 256.0) * 256.0 + floor(indexTexel.b * 256.0);\n \n \n if(index == 0.0){\n return mat4(\n 1.0, 0.0, 0.0, 0.0,\n 0.0, 1.0, 0.0, 0.0,\n 0.0, 0.0, 1.0, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n }\n\n index = index - 1.0;\n float overridesPerRow = transformOverrideTextureSize.x / 16.0;\n\n float xOverrideTextureCoord = mod(index, overridesPerRow);\n float yOverrideTextureCoord = floor(index / overridesPerRow);\n\n float cellWidth = 1.0 / transformOverrideTextureSize.x;\n float cellHeight = 1.0 / transformOverrideTextureSize.y;\n\n float overrideU = (xOverrideTextureCoord / overridesPerRow) + cellWidth / 2.0;\n float overrideV = (yOverrideTextureCoord / transformOverrideTextureSize.y) + cellHeight / 2.0;\n\n vec2 overrideUV = vec2(overrideU, overrideV); \n\n float matrixElements[12];\n\n for(int i = 0; i < 12; i++){\n matrixElements[i] = unpackFloatFromRGBATexel(texture(transformOverrideTexture, overrideUV + vec2(float(i) * cellWidth, 0.0)));\n }\n \n return mat4(\n matrixElements[0], matrixElements[4], matrixElements[8], 0,\n matrixElements[1], matrixElements[5], matrixElements[9], 0,\n matrixElements[2], matrixElements[6], matrixElements[10], 0,\n matrixElements[3], matrixElements[7], matrixElements[11], 1\n );\n}\n\nuniform mat4 inverseModelMatrix;\nuniform mat4 modelMatrix;\nuniform mat4 viewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat3 normalMatrix;\nuniform vec2 treeIndexTextureSize;\nuniform vec2 transformOverrideTextureSize;\nuniform sampler2D transformOverrideIndexTexture;\nuniform sampler2D transformOverrideTexture;\n\nin vec3 position;\nin mat4 a_instanceMatrix;\nin float a_treeIndex;\nin vec3 a_color;\nin float a_arcAngle;\nin float a_radius;\nin float a_tubeRadius;\n\nout float v_treeIndex;\nout vec3 v_color;\nout vec3 v_normal;\nout vec3 vViewPosition;\n\nvoid main() {\n // normalized theta and phi are packed into positions\n float theta = position.x * a_arcAngle;\n float phi = position.y;\n float cosTheta = cos(theta);\n float sinTheta = sin(theta);\n vec3 pos3 = vec3(0);\n\n pos3.x = (a_radius + a_tubeRadius * cos(phi)) * cosTheta;\n pos3.y = (a_radius + a_tubeRadius * cos(phi)) * sinTheta;\n pos3.z = a_tubeRadius * sin(phi);\n\n mat4 treeIndexWorldTransform = determineMatrixOverride(\n a_treeIndex, \n treeIndexTextureSize, \n transformOverrideIndexTexture, \n transformOverrideTextureSize, \n transformOverrideTexture\n );\n \n vec3 transformed = (a_instanceMatrix * vec4(pos3, 1.0)).xyz;\n\n // Calculate normal vectors if we're not picking\n vec3 center = (a_instanceMatrix * vec4(a_radius * cosTheta, a_radius * sinTheta, 0.0, 1.0)).xyz;\n vec3 objectNormal = normalize(transformed.xyz - center);\n\n v_treeIndex = a_treeIndex;\n v_color = a_color;\n v_normal = normalMatrix * normalize(inverseModelMatrix * treeIndexWorldTransform * modelMatrix * vec4(objectNormal, 0.0)).xyz;\n\n vec4 modelViewPosition = viewMatrix * treeIndexWorldTransform * modelMatrix * vec4(transformed, 1.0);\n\n vViewPosition = modelViewPosition.xyz;\n\n gl_Position = projectionMatrix * modelViewPosition;\n}\n"},function(e,t,r){"use strict";r.r(t),t.default="precision highp float;\n#define GLSLIFY 1\n\nvec3 rgb2hsv(vec3 c)\n{\n vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0);\n vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g));\n vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r));\n\n float d = q.x - min(q.w, q.y);\n float e = 1.0e-10;\n return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x);\n}\n\nvec3 hsv2rgb(vec3 c)\n{\n vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);\n vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);\n return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);\n}\n\n/**\n * Packs the integer part of the number given to a RGB color.\n */\nvec3 packIntToColor(float number) {\n float r = floor(number / (255.0 * 255.0)) / 255.0;\n float g = mod(floor(number / 255.0), 255.0) / 255.0;\n float b = mod(number, 255.0) / 255.0;\n return vec3(r, g, b);\n}\n\nstruct GeometryTypeEnum {\n int Quad;\n int Primitive;\n int TriangleMesh;\n int InstancedMesh;\n};\n\nconst GeometryTypeEnum GeometryType = GeometryTypeEnum(1,2,3,4);\n\nconst int RenderTypeColor = 1;\nconst int RenderTypeNormal = 2;\nconst int RenderTypeTreeIndex = 3;\nconst int RenderTypePackColorAndNormal = 4;\nconst int RenderTypeDepth = 5;\nconst int RenderTypeEffects = 6;\nconst int RenderTypeGhost = 7;\nconst int RenderTypeLOD = 8;\nconst int RenderTypeDepthBufferOnly = 9;\nconst int RenderTypeGeometryType = 10;\n\n#include <packing>\n\nout vec4 outputColor;\n\nvec3 packNormalToRgb( const in vec3 normal ) {\n return normalize( normal ) * 0.5 + 0.5;\n}\n\nvoid updateFragmentColor(\n int renderMode, vec4 color, float treeIndex, \n vec3 normal, float depth, sampler2D matCapTexture, \n int geometryType) {\n if (renderMode == RenderTypeColor || renderMode == RenderTypeEffects) {\n vec3 hsv = rgb2hsv(color.rgb);\n hsv.z = min(0.5 * hsv.z + 0.5, 1.0);\n vec3 colorRGB = hsv2rgb(hsv);\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n vec4 albedo = vec4(colorRGB * (0.4 + 0.6 * amplitude), 1.0);\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec4 mc = vec4(texture(matCapTexture, cap).rgb, 1.0);\n \n outputColor = vec4(albedo.rgb * mc.rgb * 1.7, color.a);\n } else if (renderMode == RenderTypeGhost) {\n float amplitude = max(0.0, dot(normal, vec3(0.0, 0.0, 1.0)));\n float s = 0.4 + 0.6 * amplitude;\n outputColor = vec4(vec3(s), 0.3);\n } else if (renderMode == RenderTypeDepthBufferOnly) {\n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n } else if (renderMode == RenderTypePackColorAndNormal) {\n vec3 hsv = rgb2hsv(color.rgb);\n float a = 0.0;\n if (hsv.y > 0.01) {\n if (hsv.z > 0.5) {\n // light color\n a = (0.55 + hsv.x * 0.45);\n } else {\n // dark color\n a = (0.1 + hsv.x * 0.45);\n }\n } else {\n // no saturation - grayscale\n a = hsv.z * 0.09;\n }\n outputColor = vec4(packNormalToRgb(normal.rgb), a);\n } else if (renderMode == RenderTypeNormal) {\n outputColor = vec4(packNormalToRgb(normal), 1.0);\n } else if (renderMode == RenderTypeTreeIndex) {\n outputColor = vec4(packIntToColor(treeIndex), 1.0);\n } else if (renderMode == RenderTypeDepth) {\n outputColor = packDepthToRGBA(depth);\n } else if (renderMode == RenderTypeLOD) {\n bool isHighDetail = geometryType != GeometryType.Quad;\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture(matCapTexture, cap).rgb * 1.5;\n outputColor = isHighDetail ? vec4(vec3(0.0, 1.0, 0.0) * mc, color.a) : vec4(vec3(1.0, 1.0, 0.0) * mc, color.a);\n } else if (renderMode == RenderTypeGeometryType) {\n vec2 cap = normal.xy * 0.5 + 0.5;\n vec3 mc = texture(matCapTexture, cap).rgb * 1.5;\n vec3 geometryColor = \n float(geometryType == 1) * vec3(1.0, 0.0, 0.0) + // Quads\n float(geometryType == 2) * vec3(0.0, 1.0, 0.0) + // Primitives\n float(geometryType == 3) * vec3(0.0, 0.0, 1.0) + // Triangle meshes\n float(geometryType == 4) * vec3(1.0, 1.0, 0.0); // Instance meshes\n outputColor = vec4(geometryColor * mc, color.a);\n } else {\n // Unknown render mode - should not happen. \n outputColor = vec4(1.0, 0.0, 1.0, 1.0);\n }\n}\n\nstruct NodeAppearance {\n vec4 colorTexel;\n bool isVisible;\n bool renderInFront;\n bool renderGhosted;\n};\n\nfloat floatBitsSubset(float inNumber, int fromLeastSignificantBitIndex, int toMostSignificantBitIndex) {\n float r = float(fromLeastSignificantBitIndex);\n float l = float(toMostSignificantBitIndex);\n\n float bitShift = pow(2.0, r);\n return mod(((inNumber - mod(inNumber, bitShift)) / bitShift), pow(2.0, l - r));\n}\n\n/*\n\nExample:\n\nGet the value from bit 2 to 4 (not inclusive)\n\ninput:\ninNumber = 173 = 1010_1101 , from=2, to=4\n\nexpected output = 1010_|11|01 = 3\n\n1) subtract any bits in the least significant bit-subset\n\n mod(inNumber=173, pow(2.0, from=2)) = mod(inNumber, 4) = 1\n \n inNumber - 1 = 172\n\n2) bitshift such that we remove the least significant bit-subset\n this is guaranteed to be devisible since we subtracted the remainder\n\n (inNumber=172) / pow(2.0, from=2) = 172 / 4 = 43 = 0010_1011\n\n3) lastly, remove the most significant bit-subset\n\n mod((inNumber=43), pow(2.0, to=4 - from=2) = mod(43, 4)\n\n mod(43, 4) = 3\n\n or in binary notation: 0000_0011 which is the expected result.\n\n*/ \n\nNodeAppearance determineNodeAppearance(sampler2D nodeAppearanceTexture, vec2 textureSize, float treeIndex) {\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = textureSize.x;\n float dataTextureHeight = textureSize.y;\n\n float u = mod(treeIndex, dataTextureWidth);\n float v = floor(treeIndex / dataTextureWidth);\n float uCoord = (u + 0.5) / dataTextureWidth;\n float vCoord = (v + 0.5) / dataTextureHeight;\n vec2 treeIndexUv = vec2(uCoord, vCoord);\n \n vec4 texel = texture(nodeAppearanceTexture, treeIndexUv);\n float alphaUnwrapped = floor((texel.a * 255.0) + 0.5);\n\n bool isVisible = floatBitsSubset(alphaUnwrapped, 0, 1) == 1.0;\n bool renderInFront = floatBitsSubset(alphaUnwrapped, 1, 2) == 1.0;\n bool renderGhosted = floatBitsSubset(alphaUnwrapped, 2, 3) == 1.0;\n\n return NodeAppearance(texel, isVisible, renderInFront, renderGhosted);\n}\n\nbool determineVisibility(NodeAppearance nodeAppearance, int renderMode) {\n return \n // In ghost mode\n ((renderMode == RenderTypeGhost) && nodeAppearance.isVisible && nodeAppearance.renderGhosted) ||\n // Not ghost mode\n ((renderMode != RenderTypeGhost) && \n !nodeAppearance.renderGhosted && nodeAppearance.isVisible && (nodeAppearance.renderInFront || renderMode != RenderTypeEffects));\n}\n\nvec4 determineColor(vec3 originalColor, NodeAppearance nodeAppearance) {\n vec4 overrideColor = nodeAppearance.colorTexel;\n if (any(greaterThan(overrideColor.rgb, vec3(0.0)))) {\n return overrideColor;\n }\n return vec4(originalColor.rgb, overrideColor.a);\n}\n\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\n\nbool isClipped(NodeAppearance nodeAppearance, vec3 point) {\n#if NUM_CLIPPING_PLANES > 0\n vec3 pointFlipped = -point;\n vec4 plane;\n\n for (int i = 0; i < UNION_CLIPPING_PLANES; i++) {\n plane = clippingPlanes[i];\n if (dot(pointFlipped, plane.xyz) > plane.w) return true;\n }\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n bool clipped = true;\n for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n clipped = (dot(pointFlipped, plane.xyz) > plane.w) && clipped;\n }\n if ( clipped ) return true;\n#endif\n#endif\n return false;\n}\n\nuniform sampler2D colorDataTexture;\nuniform sampler2D matCapTexture;\nuniform vec2 treeIndexTextureSize;\nuniform int renderMode;\n\nin float v_treeIndex;\nin vec3 v_color;\nin vec3 v_normal;\nin vec3 vViewPosition;\n\nvoid main() {\n NodeAppearance appearance = determineNodeAppearance(colorDataTexture, treeIndexTextureSize, v_treeIndex);\n if (!determineVisibility(appearance, renderMode)) {\n discard;\n }\n if (isClipped(appearance, vViewPosition)) {\n discard;\n }\n\n vec4 color = determineColor(v_color, appearance); \n vec3 normal = normalize(v_normal);\n updateFragmentColor(renderMode, color, v_treeIndex, normal, gl_FragCoord.z, matCapTexture, GeometryType.Primitive);\n}\n"},function(e,t,r){"use strict";r.r(t),t.default="#define GLSLIFY 1\n// https://stackoverflow.com/questions/7059962/how-do-i-convert-a-vec4-rgba-value-to-a-float @ Arjan\nfloat unpackVec4ToFloat( vec4 packedFloat)\n{\n vec4 rgba = packedFloat;\n float sign = 1.0 - step(128.0, rgba.x) * 2.0;\n float exponent = 2.0 * mod(rgba.x, 128.0) + step(128.0, rgba.y) - 127.0;\n if (exponent == -127.0) return 0.0;\n float mantissa = mod(rgba.y, 128.0) * 65536.0 + rgba.z * 256.0 + rgba.w + 8388608.0;\n return sign * exp2(exponent - 23.0) * mantissa; \n}\n\nfloat unpackFloatFromRGBATexel(vec4 texel){\n float byteValueR = floor((texel.r * 255.0) + 0.5);\n float byteValueG = floor((texel.g * 255.0) + 0.5);\n float byteValueB = floor((texel.b * 255.0) + 0.5);\n float byteValueA = floor((texel.a * 255.0) + 0.5);\n\n return unpackVec4ToFloat(vec4(byteValueR, byteValueG, byteValueB, byteValueA));\n}\n\nmat4 determineMatrixOverride(\n float treeIndex, \n vec2 treeIndexTextureSize, \n sampler2D transformOverrideIndexTexture, \n vec2 transformOverrideTextureSize, \n sampler2D transformOverrideTexture\n) {\n\n treeIndex = floor(treeIndex + 0.5);\n float dataTextureWidth = treeIndexTextureSize.x;\n float dataTextureHeight = treeIndexTextureSize.y;\n\n float xTreeIndexTextureCoord = mod(treeIndex, dataTextureWidth);\n float yTreeIndexTextureCoord = floor(treeIndex / dataTextureWidth);\n\n vec2 indexUV = vec2((xTreeIndexTextureCoord + 0.5) / dataTextureWidth, (yTreeIndexTextureCoord + 0.5) / dataTextureHeight);\n\n vec3 indexTexel = texture(transformOverrideIndexTexture, indexUV).rgb;\n\n float index = floor(indexTexel.r * 256.0) * 65536.0 + floor(indexTexel.g * 256.0) * 256.0 + floor(indexTexel.b * 256.0);\n \n \n if(index == 0.0){\n return mat4(\n 1.0, 0.0, 0.0, 0.0,\n 0.0, 1.0, 0.0, 0.0,\n 0.0, 0.0, 1.0, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n }\n\n index = index - 1.0;\n float overridesPerRow = transformOverrideTextureSize.x / 16.0;\n\n float xOverrideTextureCoord = mod(index, overridesPerRow);\n float yOverrideTextureCoord = floor(index / overridesPerRow);\n\n float cellWidth = 1.0 / transformOverrideTextureSize.x;\n float cellHeight = 1.0 / transformOverrideTextureSize.y;\n\n float overrideU = (xOverrideTextureCoord / overridesPerRow) + cellWidth / 2.0;\n float overrideV = (yOverrideTextureCoord / transformOverrideTextureSize.y) + cellHeight / 2.0;\n\n vec2 overrideUV = vec2(overrideU, overrideV); \n\n float matrixElements[12];\n\n for(int i = 0; i < 12; i++){\n matrixElements[i] = unpackFloatFromRGBATexel(texture(transformOverrideTexture, overrideUV + vec2(float(i) * cellWidth, 0.0)));\n }\n \n return mat4(\n matrixElements[0], matrixElements[4], matrixElements[8], 0,\n matrixElements[1], matrixElements[5], matrixElements[9], 0,\n matrixElements[2], matrixElements[6], matrixElements[10], 0,\n matrixElements[3], matrixElements[7], matrixElements[11], 1\n );\n}\n\nuniform mat4 inverseModelMatrix;\nuniform mat4 modelMatrix;\nuniform mat4 viewMatrix;\nuniform mat4 projectionMatrix;\nuniform mat3 normalMatrix;\nuniform vec2 treeIndexTextureSize;\nuniform vec2 transformOverrideTextureSize;\nuniform sampler2D transformOverrideIndexTexture;\nuniform sampler2D transformOverrideTexture;\n\nin vec3 position;\nin float a_treeIndex;\nin vec3 a_color;\nin vec3 a_vertex1;\nin vec3 a_vertex2;\nin vec3 a_vertex3;\nin vec3 a_vertex4;\n\nout float v_treeIndex;\nout vec3 v_color;\nout vec3 v_normal;\nout vec3 vViewPosition;\n\nvoid main() {\n vec3 transformed;\n // reduce the avarage branchings\n if (position.x < 1.5) {\n transformed = position.x == 0.0 ? a_vertex1 : a_vertex2;\n } else {\n transformed = position.x == 2.0 ? a_vertex3 : a_vertex4;\n }\n\n mat4 treeIndexWorldTransform = determineMatrixOverride(\n a_treeIndex, \n treeIndexTextureSize, \n transformOverrideIndexTexture, \n transformOverrideTextureSize, \n transformOverrideTexture\n );\n\n vec3 objectNormal = cross(a_vertex1 - a_vertex2, a_vertex1 - a_vertex3);\n\n v_treeIndex = a_treeIndex;\n v_color = a_color;\n v_normal = normalMatrix * normalize(inverseModelMatrix * treeIndexWorldTransform * modelMatrix * vec4(objectNormal, 0.0)).xyz;\n\n vec4 mvPosition = viewMatrix * treeIndexWorldTransform * modelMatrix * vec4( transformed, 1.0 );\n vViewPosition = mvPosition.xyz;\n gl_Position = projectionMatrix * mvPosition;\n}\n"},function(e,t,r){"use strict";r.r(t),t.default="precision highp float;\n#define GLSLIFY 1\n\nfloat floatBitsSubset(float inNumber, int fromLeastSignificantBitIndex, int toMostSignificantBitIndex) {\n float r = float(fromLeastSignificantBitIndex);\n float l = float(toMostSignificantBitIndex);\n\n float bitShift = pow(2.0, r);\n return mod(((inNumber - mod(inNumber, bitShift)) / bitShift), pow(2.0, l - r));\n}\n\n/*\n\nExample:\n\nGet the value from bit 2 to 4 (not inclusive)\n\ninput:\ninNumber = 173 = 1010_1101 , from=2, to=4\n\nexpected output = 1010_|11|01 = 3\n\n1) subtract any bits in the least significant bit-subset\n\n mod(inNumber=173, pow(2.0, from=2)) = mod(inNumber, 4) = 1\n \n inNumber - 1 = 172\n\n2) bitshift such that we remove the least significant bit-subset\n this is guaranteed to be devisible since we subtracted the remainder\n\n (inNumber=172) / pow(2.0, from=2) = 172 / 4 = 43 = 0010_1011\n\n3) lastly, remove the most significant bit-subset\n\n mod((inNumber=43), pow(2.0, to=4 - from=2) = mod(43, 4)\n\n mod(43, 4) = 3\n\n or in binary notation: 0000_0011 which is the expected result.\n\n*/ \nmat3 G[9];\n// hard coded matrix values!!!! as suggested in https://github.com/neilmendoza/ofxPostProcessing/blob/master/src/EdgePass.cpp#L45\nconst mat3 g0 = mat3( 0.3535533845424652, 0, -0.3535533845424652, 0.5, 0, -0.5, 0.3535533845424652, 0, -0.3535533845424652 );\nconst mat3 g1 = mat3( 0.3535533845424652, 0.5, 0.3535533845424652, 0, 0, 0, -0.3535533845424652, -0.5, -0.3535533845424652 );\nconst mat3 g2 = mat3( 0, 0.3535533845424652, -0.5, -0.3535533845424652, 0, 0.3535533845424652, 0.5, -0.3535533845424652, 0 );\nconst mat3 g3 = mat3( 0.5, -0.3535533845424652, 0, -0.3535533845424652, 0, 0.3535533845424652, 0, 0.3535533845424652, -0.5 );\nconst mat3 g4 = mat3( 0, -0.5, 0, 0.5, 0, 0.5, 0, -0.5, 0 );\nconst mat3 g5 = mat3( -0.5, 0, 0.5, 0, 0, 0, 0.5, 0, -0.5 );\nconst mat3 g6 = mat3( 0.1666666716337204, -0.3333333432674408, 0.1666666716337204, -0.3333333432674408, 0.6666666865348816, -0.3333333432674408, 0.1666666716337204, -0.3333333432674408, 0.1666666716337204 );\nconst mat3 g7 = mat3( -0.3333333432674408, 0.1666666716337204, -0.3333333432674408, 0.1666666716337204, 0.6666666865348816, 0.1666666716337204, -0.3333333432674408, 0.1666666716337204, -0.3333333432674408 );\nconst mat3 g8 = mat3( 0.3333333432674408, 0.3333333432674408, 0.3333333432674408, 0.3333333432674408, 0.3333333432674408, 0.3333333432674408, 0.3333333432674408, 0.3333333432674408, 0.3333333432674408 );\n\nfloat edgeDetectionFilter(sampler2D baseTexture, vec2 uv, vec2 resolution) {\n\n vec2 texel = vec2(1.0 / resolution.x, 1.0 / resolution.y);\n\n\tG[0] = g0,\n\tG[1] = g1,\n\tG[2] = g2,\n\tG[3] = g3,\n\tG[4] = g4,\n\tG[5] = g5,\n\tG[6] = g6,\n\tG[7] = g7,\n\tG[8] = g8;\n\n\tmat3 I;\n\tfloat cnv[9];\n\tvec3 neighbour;\n\n\t/* fetch the 3x3 neighbourhood and use the RGB vector's length as intensity value */\n\tfor (int i=0; i<3; i++) {\n\t\tfor (int j=0; j<3; j++) {\n\t\t\tneighbour = texture(baseTexture, uv + texel * vec2(float(i)-1.0,float(j)-1.0) ).rgb;\n\t\t\tI[i][j] = length(neighbour);\n\t\t}\n\t}\n\n\t/* calculate the convolution values for all the masks */\n\tfor (int i=0; i<9; i++) {\n\t\tfloat dp3 = dot(G[i][0], I[0]) + dot(G[i][1], I[1]) + dot(G[i][2], I[2]);\n\t\tcnv[i] = dp3 * dp3;\n\t}\n\n\tfloat M = (cnv[0] + cnv[1]) + (cnv[2] + cnv[3]);\n\tfloat S = (cnv[4] + cnv[5]) + (cnv[6] + cnv[7]) + (cnv[8] + M);\n\n float edgeStrength = sqrt(M/S);\n\n return edgeStrength;\n}\n\n#include <packing>\n\nuniform sampler2D tFront;\nuniform sampler2D tFrontDepth;\nuniform sampler2D tBack;\nuniform sampler2D tBackDepth;\nuniform sampler2D tCustom;\nuniform sampler2D tCustomDepth;\nuniform sampler2D tGhost;\nuniform sampler2D tGhostDepth;\nuniform sampler2D tOutlineColors;\nuniform float cameraNear;\nuniform float cameraFar;\nuniform vec2 resolution;\nuniform float edgeStrengthMultiplier;\nuniform float edgeGrayScaleIntensity;\n\nin vec2 vUv;\nin vec2 vUv0;\nin vec2 vUv1;\nin vec2 vUv2;\nin vec2 vUv3;\n\nout vec4 outputColor;\n\nconst float infinity = 1e20;\n\nfloat computeFloatEncodedOutlineIndex(float bitEncodedFloat){\n return floatBitsSubset(floor((bitEncodedFloat * 255.0) + 0.5), 5, 8);\n}\n\nvec4 computeNeighborOutlineIndices(sampler2D colorTexture){\n float outlineIndex0 = computeFloatEncodedOutlineIndex(texture(colorTexture, vUv0).a);\n float outlineIndex1 = computeFloatEncodedOutlineIndex(texture(colorTexture, vUv1).a);\n float outlineIndex2 = computeFloatEncodedOutlineIndex(texture(colorTexture, vUv2).a);\n float outlineIndex3 = computeFloatEncodedOutlineIndex(texture(colorTexture, vUv3).a);\n\n return vec4(outlineIndex0, outlineIndex1, outlineIndex2, outlineIndex3);\n}\n\nfloat toViewZ(float depth, float near, float far){\n float normalizedDepth = depth * 2.0 - 1.0;\n return 2.0 * near * far / (far + near - normalizedDepth * (far - near)); \n}\n\nvec4 computeNeighborAlphas(sampler2D colorTexture){\n float alpha0 = texture(colorTexture, vUv0).a;\n float alpha1 = texture(colorTexture, vUv1).a;\n float alpha2 = texture(colorTexture, vUv2).a;\n float alpha3 = texture(colorTexture, vUv3).a;\n\n return vec4(alpha0, alpha1, alpha2, alpha3);\n}\n\nvoid main() {\n vec4 frontAlbedo = texture(tFront, vUv);\n vec4 backAlbedo = texture(tBack, vUv);\n vec4 customAlbedo = texture(tCustom, vUv);\n vec4 ghostAlbedo = texture(tGhost, vUv);\n\n float frontDepth = texture(tFrontDepth, vUv).r;\n float backDepth = texture(tBackDepth, vUv).r; \n float customDepth = texture(tCustomDepth, vUv).r;\n float ghostDepth = texture(tGhostDepth, vUv).r;\n\n // This is a hack to make sure that all textures are initialized\n // If a texture is unused, it will have a clear value of 0.0.\n // Without this we've seen issues with MSAA where resizing render targets\n // causes depth to cleared to either 1 or 0 depending on the device/browser\n customDepth = customDepth > 0.0 ? customDepth : 1.0; \n backDepth = backDepth > 0.0 ? backDepth : 1.0;\n ghostDepth = ghostDepth > 0.0 ? ghostDepth : 1.0;\n frontDepth = frontDepth > 0.0 ? frontDepth : 1.0; \n\n if(all(greaterThanEqual(vec4(backDepth, customDepth, ghostDepth, frontDepth), vec4(1.0)))){\n discard;\n }\n \n // Decompose and clamp \"ghost\" color\n vec4 clampedGhostAlbedo = vec4(max(ghostAlbedo.rgb, 0.5), min(ghostAlbedo.a, 0.8));\n\n float frontOutlineIndex = computeFloatEncodedOutlineIndex(frontAlbedo.a);\n vec4 frontNeighborIndices = computeNeighborOutlineIndices(tFront);\n\n // There exsists fragments of rendered objects within the edge width that should have border\n if(any(equal(frontNeighborIndices, vec4(0.0))) && frontOutlineIndex > 0.0) \n { \n float borderColorIndex = max(max(frontNeighborIndices.x, frontNeighborIndices.y), max(frontNeighborIndices.z, frontNeighborIndices.w));\n outputColor = texture(tOutlineColors, vec2(0.125 * borderColorIndex + (0.125 / 2.0), 0.5));\n gl_FragDepth = frontDepth;\n return;\n }\n\n // texture has drawn fragment\n if(frontDepth < 1.0){\n float customDepthTest = step(customDepth, backDepth); // zero if back is in front\n\n float a = customDepthTest > 0.0 ? ceil(customAlbedo.a) * 0.5 : ceil(backAlbedo.a) * 0.5;\n\n outputColor = vec4(frontAlbedo.rgb, 1.0) * (1.0 - a) + (vec4(backAlbedo.rgb, 1.0) * (1.0 - customDepthTest) + vec4(customAlbedo.rgb, 1.0) * customDepthTest) * a;\n gl_FragDepth = texture(tFrontDepth, vUv).r;\n return;\n }\n\n if (customDepth >= backDepth) {\n float backOutlineIndex = computeFloatEncodedOutlineIndex(backAlbedo.a);\n vec4 backNeighborIndices = computeNeighborOutlineIndices(tBack);\n\n if( any(equal(backNeighborIndices, vec4(0.0))) && backOutlineIndex > 0.0) \n { \n float borderColorIndex = max(max(backNeighborIndices.x, backNeighborIndices.y), max(backNeighborIndices.z, backNeighborIndices.w));\n outputColor = texture(tOutlineColors, vec2(0.125 * borderColorIndex + (0.125 / 2.0), 0.5));\n gl_FragDepth = texture(tBackDepth, vUv).r;\n return;\n }\n }\n \n float edgeStrength = 0.0;\n#if defined(EDGES)\n if (!any(equal(computeNeighborAlphas(tBack), vec4(0.0)))) {\n float depthEdge = toViewZ(backDepth, cameraNear, cameraFar);\n edgeStrength = (1.0 - smoothstep(10.0, 40.0, depthEdge)) * edgeDetectionFilter(tBack, vUv, resolution) * edgeStrengthMultiplier;\n }\n#endif\n\n // Combine color from ghost, back and custom object\n vec4 color = backAlbedo;\n float depth = backDepth;\n if (customDepth < backDepth && ghostDepth == 1.0) {\n color = vec4(customAlbedo.rgb * customAlbedo.a + (1.0 - customAlbedo.a) * backAlbedo.rgb, 1.0);\n depth = customDepth;\n edgeStrength = 0.0;\n } else if (customDepth < backDepth && ghostDepth < 1.0) {\n float s = (1.0 - step(backDepth, ghostDepth)) * clampedGhostAlbedo.a;\n vec3 modelAlbedo = mix(backAlbedo.rgb, clampedGhostAlbedo.rgb, s);\n color = vec4(customAlbedo.rgb * customAlbedo.a + (1.0 - customAlbedo.a) * modelAlbedo.rgb, 1.0);\n depth = customDepth;\n edgeStrength = 0.0;\n } else {\n float s = (1.0 - step(backDepth, ghostDepth)) * clampedGhostAlbedo.a;\n color = vec4(mix(backAlbedo.rgb, clampedGhostAlbedo.rgb, s), backAlbedo.a);\n depth = mix(backDepth, ghostDepth, s);\n }\n \n outputColor = color * (1.0 - edgeStrength) + vec4(vec3(edgeGrayScaleIntensity) * edgeStrength, 1.0);\n gl_FragDepth = depth;\n}\n"},function(e,t,r){"use strict";r.r(t),t.default="#define GLSLIFY 1\nuniform mat4 modelMatrix;\nuniform mat4 viewMatrix;\nuniform mat4 projectionMatrix;\n// selection outline\nuniform vec2 texelSize;\n\nin vec3 position;\nin vec2 uv;\n\nout vec2 vUv;\nout vec2 vUv0;\nout vec2 vUv1;\nout vec2 vUv2;\nout vec2 vUv3;\n\nvoid main() {\n vUv = uv;\n\n // selection outline\n vUv0 = vec2(uv.x + texelSize.x, uv.y);\n vUv1 = vec2(uv.x - texelSize.x, uv.y);\n vUv2 = vec2(uv.x, uv.y + texelSize.y);\n vUv3 = vec2(uv.x, uv.y - texelSize.y);\n\n gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);\n}"},function(e,t,r){"use strict";r.r(t),t.default="/*!\n *\n * Adapted from:\n * https://github.com/mattdesl/three-shader-fxaa\n * MIT License (MIT) Copyright (c) 2014 Matt DesLauriers\n *\n */\nprecision highp float;\n#define GLSLIFY 1\n\nuniform vec2 inverseResolution;\nuniform vec2 resolution;\nuniform sampler2D tDiffuse;\nuniform sampler2D tDepth;\n\nin vec2 v_uv;\nin vec2 v_fragCoord;\nin vec2 v_rgbNW;\nin vec2 v_rgbNE;\nin vec2 v_rgbSW;\nin vec2 v_rgbSE;\nin vec2 v_rgbM;\n\nout vec4 outputColor;\n\n#ifndef FXAA_REDUCE_MIN\n #define FXAA_REDUCE_MIN (1.0/ 128.0)\n#endif\n#ifndef FXAA_REDUCE_MUL\n #define FXAA_REDUCE_MUL (1.0 / 8.0)\n#endif\n#ifndef FXAA_SPAN_MAX\n #define FXAA_SPAN_MAX 8.0\n#endif\n\nvec4 fxaa(sampler2D tex, vec2 fragCoord,\n vec2 resolution, vec2 inverseResolution,\n vec2 v_rgbNW, vec2 v_rgbNE,\n vec2 v_rgbSW, vec2 v_rgbSE,\n vec2 v_rgbM) {\n vec4 color;\n\n vec3 rgbNW = texture(tex, v_rgbNW).xyz;\n vec3 rgbNE = texture(tex, v_rgbNE).xyz;\n vec3 rgbSW = texture(tex, v_rgbSW).xyz;\n vec3 rgbSE = texture(tex, v_rgbSE).xyz;\n vec4 texColor = texture(tex, v_rgbM);\n vec3 rgbM = texColor.xyz;\n\n vec3 luma = vec3(0.299, 0.587, 0.114);\n float lumaNW = dot(rgbNW, luma);\n float lumaNE = dot(rgbNE, luma);\n float lumaSW = dot(rgbSW, luma);\n float lumaSE = dot(rgbSE, luma);\n float lumaM = dot(rgbM, luma);\n float lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE)));\n float lumaMax = max(lumaM, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE)));\n\n mediump vec2 dir;\n dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE));\n dir.y = ((lumaNW + lumaSW) - (lumaNE + lumaSE));\n\n float dirReduce = max((lumaNW + lumaNE + lumaSW + lumaSE) *\n (0.25 * FXAA_REDUCE_MUL), FXAA_REDUCE_MIN);\n\n float rcpDirMin = 1.0 / (min(abs(dir.x), abs(dir.y)) + dirReduce);\n dir = min(vec2(FXAA_SPAN_MAX, FXAA_SPAN_MAX),\n max(vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX),\n dir * rcpDirMin));\n\n vec4 rgbA = 0.5 * (\n texture(tex, inverseResolution * (v_fragCoord + dir * (1.0 / 3.0 - 0.5))) +\n texture(tex, inverseResolution * (v_fragCoord + dir * (2.0 / 3.0 - 0.5))));\n vec4 rgbB = rgbA * 0.5 + 0.25 * (\n texture(tex, inverseResolution * (v_fragCoord + dir * -0.5)) +\n texture(tex, inverseResolution * (v_fragCoord + dir * 0.5)));\n\n float lumaB = dot(rgbB.rgb, luma);\n if ((lumaB < lumaMin) || (lumaB > lumaMax)) {\n color = rgbA;\n } else {\n color = rgbB;\n }\n return color;\n}\n\nvoid main() {\n outputColor = fxaa(tDiffuse, v_fragCoord, \n resolution, inverseResolution, \n v_rgbNW, v_rgbNE, v_rgbSW, v_rgbSE, v_rgbM);\n gl_FragDepth = texture(tDepth, v_uv).r;\n}\n"},function(e,t,r){"use strict";r.r(t),t.default="#define GLSLIFY 1\n/*!\n *\n * Adapted from:\n * https://github.com/mattdesl/three-shader-fxaa\n * MIT License (MIT) Copyright (c) 2014 Matt DesLauriers\n *\n */\n\nuniform mat4 modelMatrix;\nuniform mat4 viewMatrix;\nuniform mat4 projectionMatrix;\nuniform vec2 resolution;\nuniform vec2 inverseResolution;\n\nin vec3 position;\nin vec2 uv;\n\nout vec2 v_uv;\nout vec2 v_fragCoord;\nout vec2 v_rgbNW;\nout vec2 v_rgbNE;\nout vec2 v_rgbSW;\nout vec2 v_rgbSE;\nout vec2 v_rgbM;\n\nvoid main() {\n v_fragCoord = uv * resolution;\n v_rgbNW = (v_fragCoord + vec2(-1.0, -1.0)) * inverseResolution;\n v_rgbNE = (v_fragCoord + vec2(1.0, -1.0)) * inverseResolution;\n v_rgbSW = (v_fragCoord + vec2(-1.0, 1.0)) * inverseResolution;\n v_rgbSE = (v_fragCoord + vec2(1.0, 1.0)) * inverseResolution;\n v_rgbM = vec2(v_fragCoord * inverseResolution);\n v_uv = uv;\n\n gl_Position = projectionMatrix * viewMatrix * modelMatrix * vec4(position, 1.0);\n}\n"},function(e,t,r){"use strict";r.r(t),t.default="precision highp float;\n#define GLSLIFY 1\n\n// From http://www.science-and-fiction.org/rendering/noise.html\nfloat rand2d(in vec2 co){\n return fract(sin(dot(co.xy, vec2(12.9898,78.233))) * 43758.5453);\n}\n\nuniform mat4 projMatrix;\nuniform mat4 inverseProjectionMatrix;\nuniform vec3 kernel[MAX_KERNEL_SIZE];\nuniform sampler2D tDepth;\nuniform vec2 resolution;\nuniform float sampleRadius;\nuniform float bias;\n\nin vec2 vUv;\n\nout vec4 outputColor;\n\nvec3 viewPosFromDepth(float depth, vec2 uv) {\n // Depth to clip space: [0, 1] -> [-1, 1]\n float z = depth * 2.0 - 1.0;\n\n // Fragment in clip space\n vec4 clipSpacePosition = vec4(uv * 2.0 - 1.0, z, 1.0);\n vec4 viewSpacePosition = inverseProjectionMatrix * clipSpacePosition;\n\n // Perspective division\n viewSpacePosition /= viewSpacePosition.w;\n\n return viewSpacePosition.xyz;\n}\n\nvec3 computeWorldNormalFromDepth(sampler2D depthTexture, vec2 resolution, vec2 uv, float sampleDepth){\n float dx = 1.0 / resolution.x;\n float dy = 1.0 / resolution.y;\n\n vec2 uv1 = uv + vec2(dx, 0.0); // right\n float d1 = texture(depthTexture, uv1).r; \n\n vec2 uv2 = uv + vec2(0.0, dy); // up\n float d2 = texture(depthTexture, uv2).r;\n\n vec2 uv3 = uv + vec2(-dx, 0.0); // left\n float d3 = texture(depthTexture, uv3).r;\n\n vec2 uv4 = uv + vec2(0.0, -dy); // down\n float d4 = texture(depthTexture, uv4).r;\n\n bool horizontalSampleCondition = abs(d1 - sampleDepth) < abs(d3 - sampleDepth);\n\n float horizontalSampleDepth = horizontalSampleCondition ? d1 : d3;\n vec2 horizontalSampleUv = horizontalSampleCondition ? uv1 : uv3;\n\n bool verticalSampleCondition = abs(d2 - sampleDepth) < abs(d4 - sampleDepth);\n\n float verticalSampleDepth = verticalSampleCondition ? d2 : d4;\n vec2 verticalSampleUv = verticalSampleCondition ? uv2 : uv4;\n\n vec3 viewPos = viewPosFromDepth(sampleDepth, vUv);\n \n vec3 viewPos1 = (horizontalSampleCondition == verticalSampleCondition) ? viewPosFromDepth(horizontalSampleDepth, horizontalSampleUv) : viewPosFromDepth(verticalSampleDepth, verticalSampleUv);\n vec3 viewPos2 = (horizontalSampleCondition == verticalSampleCondition) ? viewPosFromDepth(verticalSampleDepth, verticalSampleUv) : viewPosFromDepth(horizontalSampleDepth, horizontalSampleUv);\n\n return normalize(cross(viewPos1 - viewPos, viewPos2 - viewPos));\n}\n\nvoid main(){\n float d = texture(tDepth, vUv).r;\n\n vec3 viewNormal = computeWorldNormalFromDepth(tDepth, resolution, vUv, d);\n\n vec3 viewPosition = viewPosFromDepth(d, vUv);\n\n vec3 randomVec = normalize(vec3(rand2d(vUv), rand2d(vUv * 3.0), rand2d(vUv * 5.0)));\n\n vec3 tangent = normalize(randomVec - viewNormal * dot(randomVec, viewNormal));\n\n vec3 bitangent = cross(viewNormal, tangent);\n\n mat3 TBN = mat3(tangent, bitangent, viewNormal);\n\n float occlusion = 0.0;\n\n for (int i = 0; i < MAX_KERNEL_SIZE; i++){\n \n vec3 sampleVector = TBN * kernel[i];\n sampleVector = viewPosition + sampleVector * sampleRadius;\n\n vec4 offset = projMatrix * vec4(sampleVector, 1.0);\n offset.xyz /= offset.w;\n offset.xyz = offset.xyz * 0.5 + 0.5;\n\n float realDepth = texture(tDepth, offset.xy).r;\n vec3 realPos = viewPosFromDepth(realDepth, offset.xy);\n\n float rangeCheck = smoothstep(0.0, 1.0, sampleRadius / length(viewPosition - realPos));\n\n occlusion += (realPos.z >= sampleVector.z + bias ? 1.0 : 0.0) * rangeCheck;\n }\n\n float occlusionFactor = 1.0 - clamp(occlusion / float(MAX_KERNEL_SIZE), 0.0, 1.0);\n\n outputColor = vec4(vec3(occlusionFactor), 1.0);\n}"},function(e,t,r){"use strict";r.r(t),t.default="// Copyright Cognite (C) 2021 Cognite\n//\n// Efficient Gaussian blur based on technique described by Daniel Rákos in\n// http://rastergrid.com/blog/2010/09/efficient-gaussian-blur-with-linear-sampling/\n// generalized for two dimensions\n\nprecision highp float;\n#define GLSLIFY 1\n\nuniform sampler2D tDiffuse;\nuniform sampler2D tAmbientOcclusion;\nuniform vec2 resolution;\n\nin vec2 vUv;\n\nout vec4 outputColor;\n\nvoid main() {\n float blurredAO =\n texture(tAmbientOcclusion, vUv + vec2(-3.1111111, -3.1111111) / resolution).r * 0.0012360 +\n texture(tAmbientOcclusion, vUv + vec2(-1.3333333, -3.1111111) / resolution).r * 0.0115356 +\n texture(tAmbientOcclusion, vUv + vec2(-3.1111111, -1.3333333) / resolution).r * 0.0115356 +\n texture(tAmbientOcclusion, vUv + vec2(-1.3333333, -1.3333333) / resolution).r * 0.1076660 +\n texture(tAmbientOcclusion, vUv + vec2(0.0000000, -3.1111111) / resolution).r * 0.0096130 +\n texture(tAmbientOcclusion, vUv + vec2(0.0000000, -1.3333333) / resolution).r * 0.0897217 +\n texture(tAmbientOcclusion, vUv + vec2(1.3333333, -3.1111111) / resolution).r * 0.0115356 +\n texture(tAmbientOcclusion, vUv + vec2(3.1111111, -3.1111111) / resolution).r * 0.0012360 +\n texture(tAmbientOcclusion, vUv + vec2(1.3333333, -1.3333333) / resolution).r * 0.1076660 +\n texture(tAmbientOcclusion, vUv + vec2(3.1111111, -1.3333333) / resolution).r * 0.0115356 +\n texture(tAmbientOcclusion, vUv + vec2(-3.1111111, 0.0000000) / resolution).r * 0.0096130 +\n texture(tAmbientOcclusion, vUv + vec2(-1.3333333, 0.0000000) / resolution).r * 0.0897217 +\n texture(tAmbientOcclusion, vUv + vec2(-3.1111111, 1.3333333) / resolution).r * 0.0115356 +\n texture(tAmbientOcclusion, vUv + vec2(-1.3333333, 1.3333333) / resolution).r * 0.1076660 +\n texture(tAmbientOcclusion, vUv + vec2(-3.1111111, 3.1111111) / resolution).r * 0.0012360 +\n texture(tAmbientOcclusion, vUv + vec2(-1.3333333, 3.1111111) / resolution).r * 0.0115356 +\n texture(tAmbientOcclusion, vUv + vec2(0.0000000, 1.3333333) / resolution).r * 0.0897217 +\n texture(tAmbientOcclusion, vUv + vec2(0.0000000, 3.1111111) / resolution).r * 0.0096130 +\n texture(tAmbientOcclusion, vUv + vec2(1.3333333, 1.3333333) / resolution).r * 0.1076660 +\n texture(tAmbientOcclusion, vUv + vec2(3.1111111, 1.3333333) / resolution).r * 0.0115356 +\n texture(tAmbientOcclusion, vUv + vec2(1.3333333, 3.1111111) / resolution).r * 0.0115356 +\n texture(tAmbientOcclusion, vUv + vec2(3.1111111, 3.1111111) / resolution).r * 0.0012360 +\n texture(tAmbientOcclusion, vUv + vec2(1.3333333, 0.0000000) / resolution).r * 0.0897217 +\n texture(tAmbientOcclusion, vUv + vec2(3.1111111, 0.0000000) / resolution).r * 0.0096130 +\n texture(tAmbientOcclusion, vUv).r * 0.0747681;\n\n outputColor = vec4(texture(tDiffuse, vUv).rgb * blurredAO, 1.0);\n}\n"},function(e,t,r){"use strict";r.r(t),t.default="precision highp float;\n#define GLSLIFY 1\n\n// From http://www.science-and-fiction.org/rendering/noise.html\nfloat rand2d(in vec2 co){\n return fract(sin(dot(co.xy, vec2(12.9898,78.233))) * 43758.5453);\n}\n\nstruct NodeAppearance {\n vec4 colorTexel;\n bool isVisible;\n bool renderInFront;\n bool renderGhosted;\n};\n\n#if NUM_CLIPPING_PLANES > 0\nuniform vec4 clippingPlanes[NUM_CLIPPING_PLANES];\n#endif\n\nbool isClipped(NodeAppearance nodeAppearance, vec3 point) {\n#if NUM_CLIPPING_PLANES > 0\n vec3 pointFlipped = -point;\n vec4 plane;\n\n for (int i = 0; i < UNION_CLIPPING_PLANES; i++) {\n plane = clippingPlanes[i];\n if (dot(pointFlipped, plane.xyz) > plane.w) return true;\n }\n#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n bool clipped = true;\n for ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n plane = clippingPlanes[ i ];\n clipped = (dot(pointFlipped, plane.xyz) > plane.w) && clipped;\n }\n if ( clipped ) return true;\n#endif\n#endif\n return false;\n}\n\nin mediump vec3 v_color;\nin lowp float v_coverageFactor;\nin lowp float v_visible;\nin lowp vec2 v_seed;\nin vec3 v_viewPosition;\n\nout vec4 outputColor;\n \nconst NodeAppearance dummyNodeAppearance = NodeAppearance(vec4(0.0), false, false, false);\n\nvoid main() {\n if(v_visible != 1.0 || isClipped(dummyNodeAppearance, v_viewPosition)){\n discard;\n }\n\n float v = rand2d(gl_FragCoord.xy + v_seed);\n if (v >= v_coverageFactor) {\n discard;\n }\n\n outputColor = vec4(v_color, 1.0);\n}\n"},function(e,t,r){"use strict";r.r(t),t.default="#define GLSLIFY 1\n/**\n * Packs the integer part of the number given to a RGB color.\n */\nvec3 packIntToColor(float number) {\n float r = floor(number / (255.0 * 255.0)) / 255.0;\n float g = mod(floor(number / 255.0), 255.0) / 255.0;\n float b = mod(number, 255.0) / 255.0;\n return vec3(r, g, b);\n}\n\nuniform mat4 modelMatrix;\nuniform mat4 viewMatrix;\nuniform mat4 projectionMatrix;\n\nin mat4 instanceMatrix;\n\nin vec3 position;\nin vec3 normal;\nin mediump float a_sectorId;\nin lowp vec3 a_coverageFactor;\nin lowp float a_visible;\n\nout mediump vec3 v_color;\nout lowp float v_coverageFactor;\nout lowp vec2 v_seed;\nout lowp float v_visible;\nout vec3 v_viewPosition;\n\nvoid main()\n{\n v_visible = a_visible;\n v_color = packIntToColor(a_sectorId);\n v_coverageFactor = abs(dot(a_coverageFactor, normal));\n // A seed to ensure that two overlapping sectors A and B \n // doesn't produce the same noise pattern\n v_seed = vec2(a_sectorId / 255.0, a_sectorId / 65025.0);\n\n mat4 modelViewMatrix = viewMatrix * modelMatrix;\n\n vec4 mvPosition = modelViewMatrix * instanceMatrix * vec4( position, 1.0 );\n\n v_viewPosition = mvPosition.xyz;\n\n gl_Position = projectionMatrix * modelViewMatrix * instanceMatrix * vec4(position, 1.0);\n}\n"},,function(e,t,r){"use strict";r.r(t),r.d(t,"Cognite3DViewer",(function(){return zr})),r.d(t,"PotreePointShape",(function(){return ot})),r.d(t,"PotreePointColorType",(function(){return st})),r.d(t,"PotreePointSizeType",(function(){return lt})),r.d(t,"WellKnownAsprsPointClassCodes",(function(){return ft})),r.d(t,"NotSupportedInMigrationWrapperError",(function(){return xt})),r.d(t,"THREE",(function(){return o})),r.d(t,"REVEAL_VERSION",(function(){return Gr})),r.d(t,"DefaultCameraManager",(function(){return Nr})),r.d(t,"CameraManagerHelper",(function(){return Sr})),r.d(t,"ComboControls",(function(){return Ir})),r.d(t,"ClusteredAreaCollection",(function(){return Mt})),r.d(t,"NodeAppearanceProvider",(function(){return Jt})),r.d(t,"NodeOutlineColor",(function(){return Pt})),r.d(t,"DefaultNodeAppearance",(function(){return qt})),r.d(t,"NodeCollection",(function(){return Tt})),r.d(t,"TreeIndexNodeCollection",(function(){return Rt})),r.d(t,"IntersectionNodeCollection",(function(){return Nt})),r.d(t,"UnionNodeCollection",(function(){return It})),r.d(t,"PropertyFilterNodeCollection",(function(){return Ft})),r.d(t,"SinglePropertyFilterNodeCollection",(function(){return Gt})),r.d(t,"AssetNodeCollection",(function(){return Lt})),r.d(t,"InvertedNodeCollection",(function(){return jt})),r.d(t,"registerCustomNodeCollectionType",(function(){return Zt})),r.d(t,"revealEnv",(function(){return u.v})),r.d(t,"IndexSet",(function(){return u.f})),r.d(t,"NumericRange",(function(){return u.j})),r.d(t,"Cognite3DModel",(function(){return et})),r.d(t,"BoundingBoxClipper",(function(){return ke})),r.d(t,"CognitePointCloudModel",(function(){return _t}));var n,i,o=r(0),a=r(12),s=r.n(a),c=r(39),l=r.n(c),d=r(8);!function(e){e[e.NoAA=0]="NoAA",e[e.FXAA=1]="FXAA"}(n||(n={})),function(e){e[e.Medium=32]="Medium",e[e.High=64]="High",e[e.VeryHigh=128]="VeryHigh",e[e.None=1]="None",e[e.Default=32]="Default"}(i||(i={}));const f={antiAliasing:n.FXAA,multiSampleCountHint:1,ssaoRenderParameters:{sampleSize:i.Default,sampleRadius:1,depthCheckBias:.0125},edgeDetectionParameters:{enabled:!0}};var u=r(1),p=r(9),m=r(3);
|
|
188
212
|
/*!
|
|
189
213
|
* Copyright 2021 Cognite AS
|
|
190
214
|
*/
|
|
191
|
-
|
|
215
|
+
const h={highDetailProximityThreshold:10,maximumRenderCost:15e6},b=Object(u.t)()?{highDetailProximityThreshold:5,maximumRenderCost:7e6}:h;var v=r(4);
|
|
192
216
|
/*!
|
|
193
217
|
* Copyright 2021 Cognite AS
|
|
194
|
-
*/
|
|
218
|
+
*/function g(e){return Object(d.pipe)(Object(v.switchMap)(t=>function(e){return Object(d.of)(!1).pipe(Object(v.delay)(e),Object(v.startWith)(!0))}
|
|
195
219
|
/*!
|
|
196
220
|
* Copyright 2021 Cognite AS
|
|
197
|
-
*/
|
|
221
|
+
*/(e)),Object(v.distinctUntilChanged)())}function A({models:e,loadingHints:t}){return e.length>0&&!0!==t.suspendLoading}var _=r(17),x=r.n(_);
|
|
198
222
|
/*!
|
|
199
223
|
* Copyright 2021 Cognite AS
|
|
200
224
|
*/
|
|
201
|
-
class
|
|
225
|
+
class y{static async*raceUntilAllCompleted(e){const t=new Map(e.map(e=>[e,e.then(t=>[e,{result:t}]).catch(t=>[e,{error:t}])]));for(;t.size>0;){const[e,r]=await Promise.race(t.values());t.delete(e),yield r}}}
|
|
202
226
|
/*!
|
|
203
227
|
* Copyright 2021 Cognite AS
|
|
204
228
|
*/
|
|
205
|
-
class f extends a{constructor(e){super(f.classToken),e instanceof i.e?this._treeIndices=e:(i.i.isNumericRange(e),this._treeIndices=new i.e(e))}updateSet(e){this._treeIndices=e,this.notifyChanged()}clear(){this._treeIndices=new i.e,this.notifyChanged()}getIndexSet(){return this._treeIndices}getAreas(){if(!this._areaCollection){if(0===this._treeIndices.count)return m.instance();throw new Error("The AreaCollection returned by getAreas() for TreeIndexNodeCollection must be constructed manually using addAreas() and addAreaPoints()")}return this._areaCollection}addAreas(e){this._areaCollection||(this._areaCollection=new u),this._areaCollection.addAreas(e)}addAreaPoints(e){this._areaCollection||(this._areaCollection=new u);const t=e.map(e=>(new l.Box3).setFromCenterAndSize(e,new l.Vector3(1,1,1)));this._areaCollection.addAreas(t)}clearAreas(){this._areaCollection=void 0}get isLoading(){return!1}serialize(){return{token:this.classToken,state:this._treeIndices.toRangeArray(),options:{areas:this._areaCollection?[...this._areaCollection.areas()]:void 0}}}}f.classToken="TreeIndexNodeCollection",function(e){e[e.NoOutline=0]="NoOutline",e[e.White=1]="White",e[e.Black=2]="Black",e[e.Cyan=3]="Cyan",e[e.Blue=4]="Blue",e[e.Green=5]="Green",e[e.Red=6]="Red",e[e.Orange=7]="Orange"}(d||(d={}));const v={visible:!0,outlineColor:d.White},x={visible:!0,renderInFront:!0},g={Default:{visible:!0,renderGhosted:!1,renderInFront:!1,outlineColor:d.NoOutline,color:[0,0,0],prioritizedForLoadingHint:0},Outlined:v,Hidden:{visible:!1},InFront:x,Ghosted:{visible:!0,renderGhosted:!0},Highlighted:{...x,visible:!0,color:[100,100,255],...v}};var b=n(16),_=n.n(b);
|
|
206
229
|
/*!
|
|
207
230
|
* Copyright 2021 Cognite AS
|
|
208
231
|
*/
|
|
209
|
-
|
|
232
|
+
const k=new o.Box3(new o.Vector3(-1,-1,-1),new o.Vector3(1,1,1)),T=new o.Box3;function w(e,t){return function(e,t,r){const n=void 0!==r?r:new o.Box3;n.makeEmpty(),Object(u.z)(e,e=>{e.project(t),n.expandByPoint(e)})}(t,e,T),T.intersect(k),T.isEmpty()?0:.25*(T.max.x-T.min.x)*(T.max.y-T.min.y)}
|
|
210
233
|
/*!
|
|
211
234
|
* Copyright 2021 Cognite AS
|
|
212
|
-
*/
|
|
235
|
+
*/const C={transformedBounds:new o.Box3};class M{constructor(e){this._minSectorDistance=1/0,this._maxSectorDistance=-1/0,this._camera=e;const{near:t,far:r}=e,n=r-t;this._modifiedFrustums=[{near:t,far:t+.05*n,weight:.1},{near:t+.05*n,far:t+.4*n,weight:.7},{near:t+.4*n,far:t+1*n,weight:.2}].map(t=>{const r=function(e,t,r){const n=e.clone();return n.near=t,n.far=r,n.updateProjectionMatrix(),n.projectionMatrix}(e,t.near,t.far),n=(new o.Matrix4).multiplyMatrices(r,this._camera.matrixWorldInverse),i=(new o.Frustum).setFromProjectionMatrix(n);return{...t,frustum:i}})}addCandidateSectors(e,t){const{minDistance:r,maxDistance:n}=e.reduce((e,r)=>{const n=this.distanceToCamera(r,t);return e.maxDistance=Math.max(e.maxDistance,n),e.minDistance=Math.min(e.minDistance,n),e},{minDistance:1/0,maxDistance:-1/0});this._minSectorDistance=r,this._maxSectorDistance=n}computeTransformedSectorBounds(e,t,r){r.copy(e),r.applyMatrix4(t)}computeDistanceToCameraWeight(e){const t=this._minSectorDistance,r=this._maxSectorDistance;return 1-(e.distanceToPoint(this._camera.position)-t)/(r-t)}computeScreenAreaWeight(e){return e.distanceToPoint(this._camera.position)>0?w(this._camera,e):1}computeFrustumDepthWeight(e){return this._modifiedFrustums.reduce((t,r)=>{const{frustum:n,weight:i}=r;return t+(n.intersectsBox(e)?i:0)},0)}computeSectorTreePlacementWeight(e){return 1===e.depth?1:1/3}computeMaximumNodeScreenSizeWeight(e,t){const r=e.distanceToPoint(this._camera.position);if(0===r)return 1;const n=this._camera.getWorldDirection(new o.Vector3).multiplyScalar(r).add(this._camera.position),i=n.clone().addScaledVector(this._camera.up,t);n.project(this._camera),i.project(this._camera);const a=i.distanceToSquared(n)/4;return Math.min(1,a/.05)}computePrioritizedAreaWeight(e,t){return t.reduce((t,r)=>e.intersectsBox(r.area)?Math.max(r.extraPriority,t):t,0)}distanceToCamera(e,t){const{transformedBounds:r}=C;return r.copy(e.subtreeBoundingBox),r.applyMatrix4(t),r.distanceToPoint(this._camera.position)}}function I(e,t){const r=e;switch(t){case m.d.Detailed:return{downloadSize:r.downloadSize,drawCalls:r.estimatedDrawCallCount,renderCost:r.estimatedRenderCost};case m.d.Simple:throw new Error("Not supported");default:throw new Error("Can't compute cost for lod "+t)}}function S(e,t){e.downloadSize+=t.downloadSize,e.drawCalls+=t.drawCalls,e.renderCost+=t.renderCost}class N{computeSpentBudget(){const e=this.modelsMetadata,t=this.collectWantedSectors().filter(e=>e.levelOfDetail!==m.d.Discarded),r=e.reduce((e,t)=>e+t.scene.sectorCount,0),n=t.length,i=t.filter(e=>e.levelOfDetail===m.d.Simple).length,o=t.filter(e=>!Number.isFinite(e.priority)).length,a=t.filter(e=>Number.isFinite(e.priority)&&e.priority>0).reduce((e,t)=>e+t.priority,0);return{drawCalls:this.totalCost.drawCalls,downloadSize:this.totalCost.downloadSize,renderCost:this.totalCost.renderCost,totalSectorCount:r,forcedDetailedSectorCount:o,loadedSectorCount:n,simpleSectorCount:i,detailedSectorCount:n-i,accumulatedPriority:a}}}var R=r(2),E=r.n(R);
|
|
213
236
|
/*!
|
|
214
237
|
* Copyright 2021 Cognite AS
|
|
215
238
|
*/
|
|
216
|
-
|
|
239
|
+
class P extends N{constructor(e){super(),this._totalCost={downloadSize:0,drawCalls:0,renderCost:0},this._models=new Map,this.determineSectorCost=e}get totalCost(){return{...this._totalCost}}get modelsMetadata(){return Array.from(this._models.values()).map(e=>e.modelMetadata)}initializeScene(e){E()(9===e.scene.version,"Only sector version 9 is supported, but got "+e.scene.version),this._models.set(e.modelIdentifier,{modelMetadata:e,sectorIds:new Map})}markSectorDetailed(e,t,r){const n=this._models.get(e.modelIdentifier);E()(!!n,"Could not find sector tree for "+e.modelIdentifier);const{sectorIds:i}=n,o=i.get(t);if(void 0!==o)i.set(t,Math.max(r,o));else{const n=e.scene.getSectorById(t);E()(void 0!==n);const o=this.determineSectorCost(n,m.d.Detailed);S(this._totalCost,o),i.set(t,r)}}isWithinBudget(e){return this._totalCost.renderCost<e.maximumRenderCost}collectWantedSectors(){const e=new Array;for(const[t,r]of this._models){const{modelMetadata:n,sectorIds:i}=r,o=new Map;Object(u.y)(n.scene.root,e=>(o.set(e.id,B(t,n,e,m.d.Discarded,-1,n.geometryClipBox)),!0));for(const[e,r]of i){const i=n.scene.getSectorById(e),a=B(t,n,i,m.d.Detailed,r,n.geometryClipBox);o.set(e,a)}o.forEach(t=>e.push(t))}return e.sort((e,t)=>e.levelOfDetail===m.d.Discarded?-1:t.levelOfDetail===m.d.Discarded?1:t.priority-e.priority),e}clear(){this._models.clear()}}function B(e,t,r,n,i,o){return{modelIdentifier:e,modelBaseUrl:t.modelBaseUrl,geometryClipBox:o,levelOfDetail:n,metadata:r,priority:i}}var D=r(11);
|
|
217
240
|
/*!
|
|
218
241
|
* Copyright 2021 Cognite AS
|
|
219
|
-
*/class
|
|
242
|
+
*/class O{constructor(e,t){this.sectors=[],this._totalCost={downloadSize:0,drawCalls:0,renderCost:0},this.determineSectorCost=t,Object(u.y)(e,e=>(this.sectors.length=Math.max(this.sectors.length,e.id),this.sectors[e.id]={sector:e,parentIndex:-1,priority:-1,cost:{downloadSize:0,drawCalls:0,renderCost:0},lod:m.d.Discarded},!0));for(let e=0;e<this.sectors.length;++e){const t=this.sectors[e];if(void 0!==t){const r=t.sector.children.map(e=>e.id);for(const t of r)this.sectors[t].parentIndex=e}}e.facesFile.fileName&&this.setSectorLod(e.id,m.d.Simple)}get totalCost(){return this._totalCost}getWantedSectorCount(){return this.sectors.reduce((e,t)=>e=t.lod!==m.d.Discarded?e+1:e,0)}toWantedSectors(e,t,r){return this.sectors.filter(e=>void 0!==e).map(n=>({modelIdentifier:e,modelBaseUrl:t,levelOfDetail:n.lod,metadata:n.sector,priority:n.priority,geometryClipBox:r})).sort((e,t)=>t.priority-e.priority)}markSectorDetailed(e,t){if(this.setSectorPriority(e,t),this.sectors[e].lod===m.d.Detailed)return;let r=this.sectors[e];for(;;){switch(r.lod){case m.d.Simple:this.replaceSimpleWithDetailed(r.sector.id);break;case m.d.Discarded:this.setSectorLod(r.sector.id,m.d.Detailed)}if(-1===r.parentIndex)break;r=this.sectors[r.parentIndex]}this.markAllDiscardedChildrenAsSimple(e)}replaceSimpleWithDetailed(e){z(this.sectors[e].lod===m.d.Simple,`Sector ${e} must be a Simple-sector, but got ${this.sectors[e].lod}`),this.setSectorLod(e,m.d.Detailed),this.markAllDiscardedChildrenAsSimple(e)}markAllDiscardedChildrenAsSimple(e){for(const t of this.sectors[e].sector.children)this.getSectorLod(t.id)===m.d.Discarded&&null!==t.facesFile.fileName&&this.setSectorLod(t.id,m.d.Simple)}setSectorLod(e,t){var r,n;z(t!==m.d.Simple||null!==this.sectors[e].sector.facesFile.fileName),this.sectors[e].lod=t,r=this._totalCost,n=this.sectors[e].cost,r.downloadSize-=n.downloadSize,r.drawCalls-=n.drawCalls,r.renderCost-=n.renderCost,this.sectors[e].cost=this.determineSectorCost(this.sectors[e].sector,t),S(this._totalCost,this.sectors[e].cost)}setSectorPriority(e,t){this.sectors[e].priority=t}getSectorLod(e){return this.sectors[e].lod}}function z(e,t="assertion hit"){e||D.a.error("[ASSERT]",t)}
|
|
220
243
|
/*!
|
|
221
244
|
* Copyright 2021 Cognite AS
|
|
222
|
-
*/class
|
|
245
|
+
*/class F extends N{constructor(e){super(),this._takenSectorTrees=new Map,this.determineSectorCost=e}get totalCost(){const e={downloadSize:0,drawCalls:0,renderCost:0};return this._takenSectorTrees.forEach(({sectorTree:t})=>{S(e,t.totalCost)}),e}get modelsMetadata(){return Array.from(this._takenSectorTrees.values()).map(e=>e.modelMetadata)}initializeScene(e){E()(8===e.scene.version,"Only sector version 8 is supported, but got "+e.scene.version);const t=e.scene.root;this._takenSectorTrees.set(e.modelIdentifier,{sectorTree:new O(t,this.determineSectorCost),modelMetadata:e})}getWantedSectorCount(){let e=0;return this._takenSectorTrees.forEach(({sectorTree:t})=>{e+=t.getWantedSectorCount()}),e}markSectorDetailed(e,t,r){const n=this._takenSectorTrees.get(e.modelIdentifier);E()(!!n,`Could not find sector tree for ${e.modelIdentifier} (have trees ${Array.from(this._takenSectorTrees.keys()).join(", ")})`);const{sectorTree:i}=n;i.markSectorDetailed(t,r)}isWithinBudget(e){return this.totalCost.renderCost<e.maximumRenderCost}collectWantedSectors(){const e=new Array;for(const[t,{sectorTree:r,modelMetadata:n}]of this._takenSectorTrees)e.push(...r.toWantedSectors(t,n.modelBaseUrl,n.geometryClipBox));return e.sort((e,t)=>t.priority-e.priority),e}clear(){this._takenSectorTrees.clear()}}
|
|
223
246
|
/*!
|
|
224
247
|
* Copyright 2021 Cognite AS
|
|
225
|
-
*/
|
|
248
|
+
*/
|
|
226
249
|
/*!
|
|
227
250
|
* Copyright 2021 Cognite AS
|
|
228
|
-
*/
|
|
251
|
+
*/class G{constructor(e){this._determineSectorCost=(null==e?void 0:e.determineSectorCost)||I}determineSectors(e){const t=new P(this._determineSectorCost),{cadModelsMetadata:r,camera:n}=e,i=n.matrixWorldInverse,a=n.projectionMatrix,s=new M(n),c=function(e,t,r,n){return e.reduce((e,i)=>{const a=function(e,t,r,n,i){if(9!==n.version)throw new Error("Expected model version 9, but got "+n.version);const a=new o.Matrix4;a.multiplyMatrices(e,r);const s=n.getSectorsIntersectingFrustum(t,a).map(e=>e);if(i.length<=0)return s;const c=new o.Box3;return s.filter(e=>{c.copy(e.subtreeBoundingBox),c.applyMatrix4(r);return i.every(e=>Object(u.s)(c,e))})}(t,r,i.modelMatrix,i.scene,n.clippingPlanes);return e.set(i,a),e},new Map)}(r,i,a,e);!function(e,t,r){for(const[n,i]of e)t.initializeScene(n),r.addCandidateSectors(i,n.modelMatrix)}(c,t,s);const l=function(e,t,r){const{transformedBounds:n}=U,i=new Array;for(const[o,a]of e)a.forEach(e=>{const a=e;t.computeTransformedSectorBounds(a.geometryBoundingBox,o.modelMatrix,n);const s=V(t,a,n,r);i.push({model:o,sectorId:a.id,priority:s})});return i.sort((e,t)=>t.priority-e.priority),i}(c,s,e.prioritizedAreas),d=function(e,t,r){let n=0;for(let i=0;e.isWithinBudget(t.budget)&&i<r.length;++i){const{model:t,sectorId:o,priority:a}=r[i];e.markSectorDetailed(t,o,a),n=i}return n}(t,e,l);D.a.debug("Scheduled",d,"of",l.length,"candidates");const f=t.collectWantedSectors(),p=t.computeSpentBudget();return D.a.debug("Budget:",{...e.budget}),D.a.debug("Spent:",{...p}),{spentBudget:p,wantedSectors:f}}filterSectorsToLoad(e,t){return Promise.resolve(t)}dispose(){}}const U={transformedBounds:new o.Box3};function V(e,t,r,n){return 2*e.computeSectorTreePlacementWeight(t)+1*e.computeDistanceToCameraWeight(r)+.3*e.computeScreenAreaWeight(r)+.2*e.computeFrustumDepthWeight(r)+1*(void 0!==t.maxDiagonalLength?e.computeMaximumNodeScreenSizeWeight(r,t.maxDiagonalLength):1)+1*e.computePrioritizedAreaWeight(r,n)}var L=r(6);
|
|
229
252
|
/*!
|
|
230
|
-
* Copyright
|
|
231
|
-
*/class
|
|
253
|
+
* Copyright 2022 Cognite AS
|
|
254
|
+
*/class j{constructor(e=20){this._maxConcurrentSectorDownloads=e,this._pendingSectorDownloads=new Map,this._queuedSectorDownloads=new Map,this._sectorDownloadQueue=[]}get numberOfPendingDownloads(){return this._pendingSectorDownloads.size}get numberOfQueuedDownloads(){return this._queuedSectorDownloads.size}queueSectorBatchForDownload(e){return e.map(e=>{const{sector:t,downloadSector:r}=e,n=this.getSectorIdentifier(t.modelIdentifier,t.metadata.id),i=this._pendingSectorDownloads.get(n);return void 0!==i?i:this._pendingSectorDownloads.size<this._maxConcurrentSectorDownloads?this.addSectorToPendingDownloads(r,t,n):this.getOrAddToQueuedDownloads(t,n,r)})}getOrAddToQueuedDownloads(e,t,r){const n=this._queuedSectorDownloads.get(t);if(void 0!==n){const{queuedDeferredPromise:e}=n;return e}const i=new u.c;return this._sectorDownloadQueue.push(t),this._queuedSectorDownloads.set(t,{sector:e,downloadSector:r,queuedDeferredPromise:i}),i}addSectorToPendingDownloads(e,t,r){const n=e(t).catch(e=>(D.a.error("Failed to load sector",t,"error:",e),{modelIdentifier:t.modelIdentifier,metadata:t.metadata,levelOfDetail:m.d.Discarded,group:void 0,instancedMeshes:void 0}));return this._pendingSectorDownloads.set(r,n),this.processNextQueuedSectorDownload(n,r),n}processNextQueuedSectorDownload(e,t){e.then(e=>{this._pendingSectorDownloads.delete(t);const r=this._sectorDownloadQueue.shift();if(void 0===r)return;const n=this._queuedSectorDownloads.get(r);this._queuedSectorDownloads.delete(r),E()(void 0!==n);const{sector:i,downloadSector:o,queuedDeferredPromise:a}=n,s=o(i);this._pendingSectorDownloads.set(r,s),s.then(e=>{a.resolve(e)}),this.processNextQueuedSectorDownload(s,r)})}getSectorIdentifier(e,t){return`${t}-${e}`}}
|
|
232
255
|
/*!
|
|
233
256
|
* Copyright 2021 Cognite AS
|
|
234
|
-
*/class
|
|
257
|
+
*/class W{constructor(e,t,r,n,i){this._batchId=0,this._v8SectorCuller=e,this._gltfSectorCuller=new G,this._sectorDownloadScheduler=new j(20),this._modelStateHandler=t,this._collectStatisticsCallback=r,this._progressCallback=n,this._continuousModelStreaming=i}async*loadSectors(e){if(!this.shouldLoad(e))return[];const t=e.models,r={...e,cadModelsMetadata:t.filter(e=>e.visible).map(e=>e.cadModelMetadata)};if(r.cadModelsMetadata.length<=0)return[];const n=this.getSectorCuller(r),i=n.determineSectors(r);this._collectStatisticsCallback(i.spentBudget);const o=this._modelStateHandler.hasStateChanged.bind(this._modelStateHandler),a=i.wantedSectors.filter(e=>o(e.modelIdentifier,e.metadata.id,e.levelOfDetail)),s=new Z(this._progressCallback);s.start(a.length),this._batchId++;const c=this._batchId;for(const e of x()(a,20)){const i=await this.filterSectors(r,e,n,s),o=this.startLoadingBatch(i,t);for await(const e of y.raceUntilAllCompleted(o)){const t=e.result;c===this._batchId&&void 0!==t&&(this._modelStateHandler.updateState(t.modelIdentifier,t.metadata.id,t.levelOfDetail),yield t),s.reportNewSectorsLoaded(1)}}}shouldLoad(e){return 0!=e.models.length&&(H(e.models[0].cadModelMetadata)?!e.cameraInMotion:this._continuousModelStreaming||!e.cameraInMotion)}getSectorCuller(e){if(H(e.cadModelsMetadata[0]))return this._v8SectorCuller;if((t=e.cadModelsMetadata[0]).format===L.d.GltfCadModel&&9===t.formatVersion)return this._gltfSectorCuller;var t;
|
|
235
258
|
/*!
|
|
236
259
|
* Copyright 2021 Cognite AS
|
|
237
|
-
*/
|
|
238
|
-
class K{constructor(e){this._loading=!1,K.loadStyles(),this.el=document.createElement("div"),this.el.title=K.titles.idle,this.el.className=K.classnames.base,this.el.classList.add(K.classnames.topLeft),this.el.innerHTML='<svg fill="none" xmlns="http://www.w3.org/2000/svg" width="64" height="38" viewBox="0 0 64 38">\n <path id="reveal-spinner-top-1" fill-rule="evenodd" clip-rule="evenodd" fill="currentColor" d="M50.4542 15.3288c-28.2275 5.9674-28.7378 6.0661-29.2355 6.1624h-.0001c-1.3944.2698-2.6891.5203-3.9772.7036v-6.3583c-.0652-1.475-1.2799-2.6372-2.7563-2.6372s-2.6911 1.1622-2.7563 2.6372v7.1072z"/>\n <path id="reveal-spinner-top-2" fill-rule="evenodd" clip-rule="evenodd" fill="currentColor" d="M50.4542 15.3288c-16.8452 3.375-17.0189 3.4183-17.1711 3.506-1.7276.3694-3.3435.7389-4.9594 1.1083l-.0571.013V7.6106c-.0465-1.48876-1.2668-2.67155-2.7563-2.67155S22.8005 6.12184 22.754 7.6106v13.5866z"/>\n <path id="reveal-spinner-top-3" fill-rule="evenodd" clip-rule="evenodd" fill="currentColor" d="M50.4542 15.3288c-7.274 1.2593-9.1537 1.6344-11.0347 2.0095V2.74337c-.0338-1.54541-1.3116-2.7721267-2.8571-2.74285692h-.0134C35.0327.00556379 33.8015 1.2272 33.7846 2.74337V18.7098z"/>\n <path id="reveal-spinner-top-4" fill-rule="evenodd" clip-rule="evenodd" fill="currentColor" d="M50.4542 15.3288v-3.2274c0-1.5594-1.2642-2.82358-2.8236-2.82358s-2.8235 1.26418-2.8235 2.82358v4.4z"/>\n <path id="reveal-spinner-center" fill-rule="evenodd" clip-rule="evenodd" fill="currentColor" d="M50.4542 15.3288C5.46324 23.6926 1.83164 23.4439 1.45248 22.3172c-.773329-1.6548 3.63593-3.8942 5.79662-4.9915.28489-.1447.53068-.2695.72036-.3706v-.1237h-.12505c-1.62823.6226-8.646718 3.4958-7.768735 5.9832.875294 2.7456 11.653125 3.4958 34.086725-1.9939 18.7926-4.6145 27.4393-5.4925 28.3173-3.7446.6266 1.4952-4.0121 4.3644-8.5217 6.3597-.0966.0984-.1427.2357-.125.3724l.002.002c.1243.1244.2474.2475.3745.1231 1.6268-.6266 10.1499-4.238 9.7721-7.2323-.3738-1.9935-4.8842-2.6175-13.5274-1.3722z"/>\n <path id="reveal-spinner-bot-1" fill-rule="evenodd" clip-rule="evenodd" fill="currentColor" d="M11.7557 30.5551v-2.0894c1.8291-.1048 3.6511-.3108 5.4575-.6171v2.7065c-.033 1.4835-1.245 2.6689-2.7288 2.6689s-2.6958-1.1854-2.7287-2.6689z"/>\n <path id="reveal-spinner-bot-2" fill-rule="evenodd" clip-rule="evenodd" fill="currentColor" d="M22.7715 26.9222v7.602c-.0132 1.496 1.1804 2.7238 2.6762 2.7529 1.4957.0291 2.7362-1.1513 2.7813-2.6467v-8.8309c-1.7953.4821-3.6177.857-5.4575 1.1227z"/>\n <path id="reveal-spinner-bot-3" fill-rule="evenodd" clip-rule="evenodd" fill="currentColor" d="M33.87 24.7193h-.3764v5.3419c.066 1.5151 1.3136 2.7095 2.8302 2.7095s2.7642-1.1944 2.8303-2.7095v-6.5883c-.3876.0886-.7821.1771-1.1838.2671l-.0007.0002c-1.2926.2897-2.6585.5959-4.0996.9764v.0027z"/>\n <path id="reveal-spinner-bot-4" fill-rule="evenodd" clip-rule="evenodd" fill="currentColor" d="M44.5094 22.2377c2.1383-.3726 4.0242-.7438 5.6578-1.1137v4.3375c-.0249 1.5094-1.2534 2.7212-2.763 2.7254h-.0162c-.7432.0206-1.4641-.255-2.004-.7662-.54-.5112-.8546-1.216-.8746-1.9592v-3.2238z"/>\n</svg>\n',e.style.position="relative",e.appendChild(this.el)}static loadStyles(){if(document.getElementById(K.stylesId))return;const e=document.createElement("style");e.id=K.stylesId,e.appendChild(document.createTextNode(".reveal-viewer-spinner-top-left {\n top: 10px;\n left: 10px;\n}\n\n.reveal-viewer-spinner-top-right {\n top: 10px;\n right: 10px;\n}\n\n.reveal-viewer-spinner-bottom-left {\n bottom: 10px;\n left: 10px;\n}\n\n.reveal-viewer-spinner-bottom-right {\n bottom: 10px;\n right: 10px;\n}\n\n.reveal-viewer-spinner {\n position: absolute;\n color: white;\n}\n.reveal-viewer-spinner--dark {\n color: black;\n}\n\n.reveal-viewer-spinner--loading #reveal-spinner-bot-1,\n.reveal-viewer-spinner--loading #reveal-spinner-top-1 {\n animation: reveal-loading-opacity 0.8s ease-out infinite alternate;\n}\n.reveal-viewer-spinner--loading #reveal-spinner-bot-2,\n.reveal-viewer-spinner--loading #reveal-spinner-top-2 {\n animation: reveal-loading-opacity 0.8s ease-out 0.2s infinite alternate;\n}\n.reveal-viewer-spinner--loading #reveal-spinner-bot-3,\n.reveal-viewer-spinner--loading #reveal-spinner-top-3 {\n animation: reveal-loading-opacity 0.8s ease-out 0.4s infinite alternate;\n}\n.reveal-viewer-spinner--loading #reveal-spinner-bot-4,\n.reveal-viewer-spinner--loading #reveal-spinner-top-4 {\n animation: reveal-loading-opacity 0.8s ease-out 0.6s infinite alternate;\n}\n\n.reveal-viewer-spinner--loading #center {\n transform-origin: center;\n animation: reveal-loading-scale 1.6s ease-out infinite 0.8s alternate,\n reveal-loading-opacity 1.6s ease-out infinite alternate;\n}\n\n@keyframes reveal-loading-opacity {\n 0% {\n opacity: 1;\n }\n 100% {\n opacity: 0.2;\n }\n}\n\n@keyframes reveal-loading-scale {\n 100% {\n transform: scaleY(1.2) translateY(0.6px);\n }\n}\n")),document.head.appendChild(e)}set placement(e){switch(this.el.classList.remove(K.classnames.bottomLeft,K.classnames.bottomRight,K.classnames.topLeft,K.classnames.topRight),e){case"topLeft":this.el.classList.add(K.classnames.topLeft);break;case"topRight":this.el.classList.add(K.classnames.topRight);break;case"bottomLeft":this.el.classList.add(K.classnames.bottomLeft);break;case"bottomRight":this.el.classList.add(K.classnames.bottomRight);break;default:Object(i.l)(e,"Invalid placement: "+e)}}set opacity(e){this.el.style.opacity=""+e}get loading(){return this._loading}set loading(e){this._loading=e,e?(this.el.classList.add(K.classnames.loading),this.el.title=K.titles.loading):(this.el.classList.remove(K.classnames.loading),this.el.title=K.titles.idle)}updateBackgroundColor(e){const{l:t}=e.getHSL({h:0,s:0,l:0});t>.5?this.el.classList.add(K.classnames.dark):this.el.classList.remove(K.classnames.dark)}dispose(){this.el.remove();const e=document.getElementById(K.stylesId);e&&e.remove()}}K.stylesId="reveal-viewer-spinner-styles",K.classnames={base:"reveal-viewer-spinner",topLeft:"reveal-viewer-spinner-top-left",topRight:"reveal-viewer-spinner-top-right",bottomLeft:"reveal-viewer-spinner-bottom-left",bottomRight:"reveal-viewer-spinner-bottom-right",loading:"reveal-viewer-spinner--loading",dark:"reveal-viewer-spinner--dark"},K.titles={idle:"3.0.0-alpha.2",loading:"3.0.0-alpha.2 Loading..."};var X=n(9);
|
|
260
|
+
*/throw new Error("No supported sector culler for format "+e.cadModelsMetadata[0].format)}async filterSectors(e,t,r,n){const i=await r.filterSectorsToLoad(e,t);return n.reportNewSectorsCulled(t.length-i.length),i}startLoadingBatch(e,t){const r=e.map(e=>{const r=t.filter(t=>t.cadModelMetadata.modelIdentifier===e.modelIdentifier)[0];return{sector:e,downloadSector:r.loadSector.bind(r)}});return this._sectorDownloadScheduler.queueSectorBatchForDownload(r)}}class Z{constructor(e){this._sectorsScheduled=0,this._sectorsLoaded=0,this._sectorsCulled=0,this._progressCallback=e}start(e){this._sectorsScheduled=e,this._sectorsLoaded=0,this._sectorsCulled=0,this.triggerCallback()}reportNewSectorsLoaded(e){this._sectorsLoaded+=e,this.triggerCallback()}reportNewSectorsCulled(e){this._sectorsCulled+=e,this._sectorsLoaded+=e,this.triggerCallback()}triggerCallback(){this._progressCallback(this._sectorsLoaded,this._sectorsScheduled,this._sectorsCulled)}}function H(e){return e.format===L.d.RevealCadModel&&8===e.formatVersion}class Y{constructor(){this._sceneModelState={}}hasStateChanged(e,t,r){const n=this._sceneModelState[e];E()(void 0!==n,`Model ${e} has not been added`);const i=n[t];return void 0!==i?i!==r:r!==m.d.Discarded}addModel(e){E()(void 0===this._sceneModelState[e],`Model ${e} is already added`),this._sceneModelState[e]={}}removeModel(e){E()(void 0!==this._sceneModelState[e],`Model ${e} is not added`),delete this._sceneModelState[e]}updateState(e,t,r){if(void 0===this._sceneModelState[e])return;const n=this._sceneModelState[e];r===m.d.Discarded?delete n[t]:n[t]=r}}
|
|
239
261
|
/*!
|
|
240
262
|
* Copyright 2021 Cognite AS
|
|
241
|
-
*/const
|
|
263
|
+
*/const q={isLoading:!1,itemsLoaded:0,itemsRequested:0,itemsCulled:0};class Q{constructor(e,t=!1){this._cameraSubject=new d.Subject,this._clippingPlaneSubject=new d.Subject,this._loadingHintsSubject=new d.Subject,this._prioritizedLoadingHintsSubject=new d.Subject,this._modelSubject=new d.Subject,this._budgetSubject=new d.Subject,this._progressSubject=new d.BehaviorSubject(q),this._sectorCuller=e,this._modelStateHandler=new Y,this._budget=b,this._lastSpent={downloadSize:0,drawCalls:0,renderCost:0,loadedSectorCount:0,simpleSectorCount:0,detailedSectorCount:0,forcedDetailedSectorCount:0,totalSectorCount:0,accumulatedPriority:0};const r=Object(d.combineLatest)([Object(d.combineLatest)([this._loadingHintsSubject.pipe(Object(v.startWith)({})),this._budgetSubject.pipe(Object(v.startWith)(this._budget))]).pipe(Object(v.map)(X)),this._prioritizedLoadingHintsSubject.pipe(Object(v.startWith)(void 0)),Object(d.combineLatest)([this._cameraSubject.pipe(Object(v.auditTime)(500)),this._cameraSubject.pipe(Object(v.auditTime)(250),g(600))]).pipe(Object(v.map)(J)),Object(d.combineLatest)([this._clippingPlaneSubject.pipe(Object(v.startWith)([]))]).pipe(Object(v.map)(K)),this.loadingModelObservable()]),n=new W(e,this._modelStateHandler,e=>{this._lastSpent=e},(e,t,r)=>{const n={isLoading:t>e,itemsRequested:t,itemsLoaded:e,itemsCulled:r};this._progressSubject.next(n)},t);this._updateObservable=r.pipe(Object(v.observeOn)(d.asyncScheduler),Object(v.auditTime)(250),Object(v.map)($),Object(v.filter)(A),Object(v.mergeMap)(async e=>async function*(e){for await(const t of n.loadSectors(e))yield t}(e)),Object(v.mergeMap)(e=>e))}dispose(){delete this._updateObservable,this._modelSubject.unsubscribe(),this._sectorCuller.dispose()}updateCamera(e){this._cameraSubject.next(e)}set clippingPlanes(e){this._clippingPlaneSubject.next(e)}get budget(){return this._budget}set budget(e){this._budget=e,this._budgetSubject.next(e)}get lastBudgetSpendage(){return this._lastSpent}addModel(e){this._modelStateHandler.addModel(e.cadModelMetadata.modelIdentifier),this._modelSubject.next({model:e,operation:"add"}),e.nodeAppearanceProvider.on("prioritizedAreasChanged",()=>this.updatePrioritizedAreas())}removeModel(e){this._modelStateHandler.removeModel(e.cadModelMetadata.modelIdentifier),this._modelSubject.next({model:e,operation:"remove"})}updateLoadingHints(e){this._loadingHintsSubject.next(e)}updatePrioritizedAreas(){this._prioritizedLoadingHintsSubject.next()}consumedSectorObservable(){return this._updateObservable.pipe(Object(v.share)())}getLoadingStateObserver(){return this._progressSubject}loadingModelObservable(){return this._modelSubject.pipe(Object(v.scan)((e,t)=>{const{model:r,operation:n}=t;switch(n){case"add":return e.push(r),e;case"remove":return e.filter(e=>e.cadModelMetadata.modelIdentifier!==r.cadModelMetadata.modelIdentifier);default:Object(u.m)(n)}},[]))}}function X([e,t]){return{loadingHints:e,budget:t}}function J([e,t]){return{camera:e,cameraInMotion:t}}function K([e]){return{clippingPlanes:e}}function $([e,t,r,n,i]){return{...r,...e,...n,prioritizedAreas:i.flatMap(e=>e.prioritizedAreas),models:i}}
|
|
242
264
|
/*!
|
|
243
265
|
* Copyright 2021 Cognite AS
|
|
244
|
-
*/(e.
|
|
266
|
+
*/class ee{constructor(e){this.options={renderer:e.renderer,determineSectorCost:e&&e.determineSectorCost?e.determineSectorCost:te,logCallback:e&&e.logCallback?e.logCallback:()=>{},coverageUtil:e.coverageUtil},this.takenSectors=new F(this.options.determineSectorCost)}dispose(){this.options.coverageUtil.dispose()}determineSectors(e){const t=this.update(e.camera,e.cadModelsMetadata,e.clippingPlanes,e.budget),r=t.collectWantedSectors();return{spentBudget:t.computeSpentBudget(),wantedSectors:r}}filterSectorsToLoad(e,t){const r=this.options.coverageUtil.cullOccludedSectors(e.camera,t);return Promise.resolve(r)}update(e,t,r,n){const{coverageUtil:i}=this.options,o=this.takenSectors;o.clear(),t.forEach(e=>o.initializeScene(e)),i.setModels(t),i.setClipping(r);const a=i.orderSectorsByVisibility(e);this.addHighDetailsForNearSectors(e,t,n,o,r);let s=0;const c=a.length;let l=0;for(l=0;l<c&&o.isWithinBudget(n);l++){const e=a[l];o.markSectorDetailed(e.model,e.sectorId,e.priority),s+=e.priority}return this.log(`Retrieving ${l} of ${c} (last: ${a.length>0?a[l-1]:null})`),this.log(`Total scheduled: ${o.getWantedSectorCount()} of ${c} (cost: ${o.totalCost.renderCost}/${n.maximumRenderCost}, priority: ${s})`),o}addHighDetailsForNearSectors(e,t,r,n,i){const a=e.clone(!0);a.far=r.highDetailProximityThreshold,a.updateProjectionMatrix();const s=a.matrixWorldInverse,c=a.projectionMatrix,l=new o.Matrix4;t.forEach(e=>{l.multiplyMatrices(s,e.modelMatrix);let t=e.scene.getSectorsIntersectingFrustum(c,l).map(e=>e);null!=i&&i.length>0&&(t=this.testForClippingOcclusion(t,i,e.modelMatrix)),this.markSectorsAsDetailed(t,n,e)})}testForClippingOcclusion(e,t,r){const n=[],i=new o.Box3;for(let o=0;o<e.length;o++){i.copy(e[o].subtreeBoundingBox),i.applyMatrix4(r);t.every(e=>Object(u.s)(i,e))&&n.push(e[o])}return n}markSectorsAsDetailed(e,t,r){for(let n=0;n<e.length;n++)t.markSectorDetailed(r,e[n].id,1/0)}log(e,...t){this.options.logCallback(e,...t)}}function te(e,t){switch(t){case m.d.Detailed:return{downloadSize:e.indexFile.downloadSize,drawCalls:e.estimatedDrawCallCount,renderCost:e.estimatedRenderCost};case m.d.Simple:return{downloadSize:e.facesFile.downloadSize,drawCalls:1,renderCost:Math.ceil(e.facesFile.downloadSize/100)};default:throw new Error("Can't compute cost for lod "+t)}}var re=r(7),ne=r.n(re);
|
|
245
267
|
/*!
|
|
246
268
|
* Copyright 2021 Cognite AS
|
|
247
269
|
*/
|
|
248
|
-
|
|
270
|
+
const ie={defines:{COGNITE_COLOR_BY_TREE_INDEX:!1}},oe={simpleMesh:{fragment:ne()(r(42).default),vertex:ne()(r(43).default)},detailedMesh:{fragment:ne()(r(44).default),vertex:ne()(r(45).default)},instancedMesh:{fragment:ne()(r(30).default),vertex:ne()(r(31).default)},boxPrimitive:{fragment:ne()(r(30).default),vertex:ne()(r(31).default)},circlePrimitive:{fragment:ne()(r(46).default),vertex:ne()(r(47).default)},conePrimitive:{fragment:ne()(r(48).default),vertex:ne()(r(49).default)},eccentricConePrimitive:{fragment:ne()(r(50).default),vertex:ne()(r(51).default)},ellipsoidSegmentPrimitive:{fragment:ne()(r(52).default),vertex:ne()(r(53).default)},generalCylinderPrimitive:{fragment:ne()(r(54).default),vertex:ne()(r(55).default)},generalRingPrimitive:{fragment:ne()(r(56).default),vertex:ne()(r(57).default)},nutPrimitive:{fragment:ne()(r(30).default),vertex:ne()(r(31).default)},quadPrimitive:{fragment:ne()(r(30).default),vertex:ne()(r(31).default)},torusSegmentPrimitive:{fragment:ne()(r(58).default),vertex:ne()(r(59).default)},trapeziumPrimitive:{fragment:ne()(r(60).default),vertex:ne()(r(61).default)}},ae={fragment:ne()(r(62).default),vertex:ne()(r(63).default)},se={fragment:ne()(r(64).default),vertex:ne()(r(65).default)},ce={fragment:ne()(r(66).default),vertex:ne()(r(38).default)},le={fragment:ne()(r(67).default),vertex:ne()(r(38).default)},de={fragment:ne()(r(68).default),vertex:ne()(r(69).default)};
|
|
249
271
|
/*!
|
|
250
272
|
* Copyright 2021 Cognite AS
|
|
251
273
|
*/
|
|
252
|
-
class
|
|
274
|
+
class fe{constructor(e){this._renderManager=e}renderOccludingGeometry(e,t){const r={renderTarget:this._renderManager.getRenderTarget(),autoSize:this._renderManager.getRenderTargetAutoSize()};try{this._renderManager.setRenderTarget(e),this._renderManager.renderDetailedToDepthOnly(t)}finally{this._renderManager.setRenderTarget(r.renderTarget),this._renderManager.setRenderTargetAutoSize(r.autoSize)}}}
|
|
275
|
+
/*!
|
|
276
|
+
* Copyright 2021 Cognite AS
|
|
277
|
+
*/const ue=new o.Quaternion;class pe{constructor(e){this.sectorIdOffset=0,this.scene=new o.Scene,this.containers=new Map,this.buffers={size:new o.Vector2,rtBuffer:new Uint8Array,sectorVisibilityBuffer:[]},this.coverageMaterial=new o.RawShaderMaterial({vertexShader:de.vertex,fragmentShader:de.fragment,clipping:!0,side:o.DoubleSide,uniforms:{instanceMatrix:{value:new o.Matrix4}},glslVersion:o.GLSL3}),this._ensureBuffersCorrectSizeVars={size:new o.Vector2},this._renderer=e.renderer,this._alreadyLoadedProvider=new fe(e.renderManager),this.renderTarget=new o.WebGLRenderTarget(1,1,{generateMipmaps:!1,type:o.UnsignedByteType,format:o.RGBAFormat,stencilBuffer:!1})}dispose(){this._renderer.dispose()}get renderer(){return this._renderer}createDebugCanvas(e){if(this._debugImageElement)throw new Error("createDebugCanvas() can only be called once");const t=e?e.width:this.renderTarget.width,r=e?e.height:this.renderTarget.height;return this._debugImageElement=document.createElement("img"),this._debugImageElement.style.width=t+"px",this._debugImageElement.style.height=r+"px",this._debugImageElement}setModels(e){const t=new Set;for(const r of e){const e=r.modelIdentifier;t.add(e);const n=this.containers.get(e);n?this.updateModel(n,r):this.addModel(r)}const r=new Set(this.containers.keys()),n=new Set([...r].filter(e=>!t.has(e)));for(const e of n)this.removeModel(e)}setClipping(e){this.coverageMaterial.clippingPlanes=e}cullOccludedSectors(e,t){try{this.setAllSectorsVisible(!1),this.setSectorsVisibility(t,!0);const r=this.orderSectorsByVisibility(e);return t.filter(t=>{const n=this.containers.get(t.modelIdentifier);if(void 0===n)throw new Error(`Model ${t.modelIdentifier} is not registered`);const i=t.metadata;E()(void 0!==i,i+" is not of type supported type V8SectorMetadata");const o=function(e,t,r){const{sectorBounds:n}=me;return n.copy(t.subtreeBoundingBox),n.applyMatrix4(e.modelMatrix),n.containsPoint(r)}(n.model,i,e.position);return r.some(e=>e.model.modelIdentifier===t.modelIdentifier&&e.sectorId===t.metadata.id)||o})}finally{this.setAllSectorsVisible(!0)}}orderSectorsByVisibility(e){this._debugImageElement&&(this.renderSectors(null,e),this._debugImageElement.src=this._renderer.domElement.toDataURL()),this.ensureBuffersCorrectSize(),this.renderSectors(this.renderTarget,e),this._renderer.readRenderTargetPixels(this.renderTarget,0,0,this.renderTarget.width,this.renderTarget.height,this.buffers.rtBuffer);const t=this.unpackSectorVisibility(this.renderTarget.width,this.renderTarget.height,this.buffers.rtBuffer),r=t.reduce((e,t)=>t.weight+e,0);return t.filter(e=>e.weight>0).sort((e,t)=>e&&t?t.weight-e.weight:e?-1:t?1:0).map(e=>{const t=this.findSectorContainer(e.sectorIdWithOffset),n=e.sectorIdWithOffset-t.sectorIdOffset;return{model:t.model,sectorId:n,priority:e.weight/r,depth:e.distance}})}ensureBuffersCorrectSize(){const{size:e}=this._ensureBuffersCorrectSizeVars;if(this._renderer.getSize(e),!this.buffers.size.equals(e)){const t=Math.max(Math.floor(e.width*pe.CoverageRenderTargetScalingFactor),64),r=Math.max(Math.floor(e.height*pe.CoverageRenderTargetScalingFactor),64);this.renderTarget.setSize(t,r),this.buffers.rtBuffer.length<4*t*r&&(this.buffers.rtBuffer=new Uint8Array(4*t*r)),this.buffers.size.copy(e)}}renderSectors(e,t){const r=new u.k(this._renderer);try{r.localClippingEnabled=!0,r.setRenderTarget(e),r.setClearColor("#FFFFFF",1),r.autoClear=!1,r.setSize(this.buffers.size.width,this.buffers.size.height),this._renderer.clear(!0,!0),this._alreadyLoadedProvider.renderOccludingGeometry(e,t),this._renderer.render(this.scene,t)}finally{r.resetState()}}setAllSectorsVisible(e){const t=e?1:0;this.containers.forEach(e=>{for(let r=0;r<e.sectors.length;++r){const n=e.sectors[r].id,i=e.sectorIndexById[n];e.attributesValues[5*i+4]=t}e.attributesBuffer.needsUpdate=!0})}setSectorsVisibility(e,t){const r=t?1:0;e.forEach(e=>{const t=e.metadata.id,n=this.containers.get(e.modelIdentifier);if(void 0===n)throw new Error(`Sector ${e} is from a model not added`);const i=n.sectorIndexById[t];n.attributesValues[5*i+4]=r,n.attributesBuffer.needsUpdate=!0})}removeModel(e){const t=this.containers.get(e);if(!t)throw new Error(`Could not find model '${e}'`);t.mesh.geometry.dispose(),this.deleteSectorsFromBuffers(t.sectorIdOffset,t.lastSectorIdWithOffset),this.scene.remove(t.renderable),this.containers.delete(e)}deleteSectorsFromBuffers(e,t){const r=this.buffers.sectorVisibilityBuffer;for(let n=e;n<=t;++n)r[n]={sectorIdWithOffset:-1,weight:-1,distance:1/0}}addModel(e){const t=e.scene.getAllSectors().map(e=>e),[r,n,i]=this.createSectorTreeGeometry(this.sectorIdOffset,t),a=new o.Group;a.matrixAutoUpdate=!1,a.applyMatrix4(e.modelMatrix),a.updateMatrixWorld(),a.add(r);const s=t.reduce((e,t)=>Math.max(t.id,e),0),c=new Array(s);t.forEach((e,t)=>c[e.id]=t),this.containers.set(e.modelIdentifier,{model:e,sectors:t,sectorIndexById:c,sectorIdOffset:this.sectorIdOffset,lastSectorIdWithOffset:this.sectorIdOffset+s,renderable:a,mesh:r,attributesBuffer:n,attributesValues:i}),this.sectorIdOffset+=s+1,this.scene.add(a)}updateModel(e,t){e.renderable.matrix.copy(t.modelMatrix),e.renderable.updateMatrixWorld(!0)}findSectorContainer(e){for(const t of this.containers.values())if(e>=t.sectorIdOffset&&e<=t.lastSectorIdWithOffset)return t;throw new Error(`Sector ID ${e} is out of range`)}unpackSectorVisibility(e,t,r){function n(e,t){const r=e*e+t*t;return.5*(2.5-r)+Math.exp(-Math.sqrt(r))}const i=this.buffers.sectorVisibilityBuffer;!function(e){for(let t=0;t<e.length;t++){const r=e[t];r&&(r.weight=0)}}(i);const o=t/2,a=e/2;for(let s=0;s<t;s++){const c=(s-t/2)/o;for(let t=0;t<e;t++){const o=t+e*s,l=r[4*o+0],d=r[4*o+1],f=r[4*o+2],u=r[4*o+3];if(255!==l||255!==d||255!==f){const e=(s-a)/a,t=f+255*d+255*l*255,r=i[t]||{sectorIdWithOffset:t,weight:0,distance:u};r.weight+=n(e,c),r.distance=Math.min(r.distance,u),i[t]=r}}}return i}createSectorTreeGeometry(e,t){const r=new o.Vector3,n=new o.Vector3,i=t.length,a=new Float32Array(5*i),s=new o.BoxBufferGeometry,c=new o.InstancedMesh(s,this.coverageMaterial,i),l=new o.Vector3;t.forEach((t,i)=>{const{xy:s,xz:d,yz:f}=t.facesFile.coverageFactors;l.set(f,d,s),((t,i,s,l)=>{t.getCenter(r),t.getSize(n);const d=(new o.Matrix4).compose(r,ue,n);c.setMatrixAt(i,d),a[5*i+0]=e+s,a[5*i+1]=l.x,a[5*i+2]=l.y,a[5*i+3]=l.z,a[5*i+4]=1})(t.subtreeBoundingBox,i,t.id,l)});const d=new o.InstancedInterleavedBuffer(a,5);return s.setAttribute("a_sectorId",new o.InterleavedBufferAttribute(d,1,0)),s.setAttribute("a_coverageFactor",new o.InterleavedBufferAttribute(d,3,1)),s.setAttribute("a_visible",new o.InterleavedBufferAttribute(d,1,4)),[c,d,a]}}pe.CoverageRenderTargetScalingFactor=.5;const me={sectorBounds:new o.Box3};
|
|
253
278
|
/*!
|
|
254
279
|
* Copyright 2021 Cognite AS
|
|
255
280
|
*/
|
|
256
|
-
class ae extends a{constructor(e,t,n={}){super(ae.classToken),this._indexSet=new i.e,this._areas=m.instance(),this._filter={propertyCategory:"",propertyKey:"",propertyValues:new Array},this._client=e,this._model=t,this._options={requestPartitions:1,...n}}get isLoading(){return void 0!==this._fetchResultHelper&&this._fetchResultHelper.isLoading}async executeFilter(e,t,n){const{requestPartitions:r}=this._options;void 0!==this._fetchResultHelper&&this._fetchResultHelper.interrupt();const o=new J(e=>e.map(e=>new i.i(e.treeIndex,e.subtreeSize)),async e=>e.map(e=>{const t=new l.Box3;return void 0!==e.boundingBox&&(Object(i.u)(e.boundingBox,t),this._model.mapBoxFromCdfToModelCoordinates(t,t)),t}),()=>this.notifyChanged());this._fetchResultHelper=o,this._indexSet=o.indexSet,this._areas=o.areas;const a=this.buildUrl(),s=Array.from(function*(e){for(let t=0;t<e.length;t+=1e3){const n=e.slice(t,Math.min(e.length,t+1e3));yield n}}(n)).flatMap(n=>{const i={properties:{[""+e]:{[""+t]:n}}};return re()(1,r+1).map(async e=>{const t=async function(e,t,n){const r=await de(e,t,n);return new se(e,t,n,r)}(this._client,a,{data:{filter:i,limit:1e3,partition:`${e}/${r}`}});return o.pageResults(t)})});this.notifyChanged(),await Promise.all(s)}clear(){void 0!==this._fetchResultHelper&&this._fetchResultHelper.interrupt(),this._indexSet.clear(),this.notifyChanged()}getIndexSet(){return this._indexSet}getAreas(){return this._areas}buildUrl(){return`${this._client.getBaseUrl()}/api/v1/projects/${this._client.project}/3d/models/${this._model.modelId}/revisions/${this._model.revisionId}/nodes/list`}serialize(){return{token:this.classToken,state:ee()(this._filter),options:{...this._options}}}}ae.classToken="SinglePropertyNodeCollection";class se{constructor(e,t,n,r){this.items=r.items,this.nextCursor=r.nextCursor,void 0!==this.nextCursor&&(this.next=async()=>{const r={...n,data:{...n.data,cursor:this.nextCursor}},o=await de(e,t,r);return new se(e,t,n,o)})}}async function de(e,t,n){const r=await e.post(t,n);if(200===r.status)return r.data;throw new Error(`Unexpected status from server while POST ${t}: ${r.status} (body: ${r.data})`)}
|
|
257
281
|
/*!
|
|
258
282
|
* Copyright 2021 Cognite AS
|
|
259
|
-
*/
|
|
283
|
+
*/
|
|
284
|
+
class he{constructor(e,t,r){this._cadModelMap=new Map,this._subscription=new d.Subscription,this._compatibleFileFormat=void 0,this._needsRedraw=!1,this._markNeedsRedrawBound=this.markNeedsRedraw.bind(this),this._materialsChangedListener=this.handleMaterialsChanged.bind(this),this._materialManager=e,this._cadModelFactory=t,this._cadModelUpdateHandler=r,this._materialManager.on("materialsChanged",this._materialsChangedListener);this._subscription.add(this._cadModelUpdateHandler.consumedSectorObservable().subscribe({next:e=>{const t=this._cadModelMap.get(e.modelIdentifier);if(!t)return;e.instancedMeshes&&e.levelOfDetail===m.d.Detailed?t.updateInstancedMeshes(e.instancedMeshes,e.modelIdentifier,e.metadata.id):e.levelOfDetail!==m.d.Simple&&e.levelOfDetail!==m.d.Discarded||(t.discardInstancedMeshes(e.metadata.id),t.removeBatchedSectorGeometries(e.metadata.id)),e.geometryBatchingQueue&&e.geometryBatchingQueue.length>0&&e.levelOfDetail===m.d.Detailed&&t.batchGeometry(e.geometryBatchingQueue,e.metadata.id);const r=t.rootSector.sectorNodeMap.get(e.metadata.id);if(!r)throw new Error(`Could not find 3D node for sector ${e.metadata.id} - invalid id?`);e.group&&r.add(e.group),r.updateGeometry(e.group,e.levelOfDetail),this.markNeedsRedraw()},error:e=>{p.a.trackError(e,{moduleName:"CadManager",methodName:"constructor"})}}))}get materialManager(){return this._materialManager}get budget(){return this._cadModelUpdateHandler.budget}set budget(e){this._cadModelUpdateHandler.budget=e;const t=200/h.maximumRenderCost;for(const r of this._cadModelMap.values())r.setCacheSize(Math.floor(t*e.maximumRenderCost))}get loadedStatistics(){return this._cadModelUpdateHandler.lastBudgetSpendage}dispose(){this._cadModelUpdateHandler.dispose(),this._materialManager.dispose(),this._cadModelFactory.dispose(),this._subscription.unsubscribe(),this._materialManager.off("materialsChanged",this._materialsChangedListener)}requestRedraw(){this._needsRedraw=!0}resetRedraw(){this._needsRedraw=!1}get needsRedraw(){return this._needsRedraw}updateCamera(e){this._cadModelUpdateHandler.updateCamera(e),this._needsRedraw=!0}get clippingPlanes(){return this._materialManager.clippingPlanes}set clippingPlanes(e){this._materialManager.clippingPlanes=e,this._cadModelUpdateHandler.clippingPlanes=e,this._needsRedraw=!0}get renderMode(){return this._materialManager.getRenderMode()}set renderMode(e){this._materialManager.setRenderMode(e)}doesModelHaveCompatibleFormat(e){return void 0===this._compatibleFileFormat||this._compatibleFileFormat.format===e.format&&this._compatibleFileFormat.version===e.formatVersion}updateModelCompatibilityFormat(e){var t;this._compatibleFileFormat=null!==(t=this._compatibleFileFormat)&&void 0!==t?t:{format:e.format,version:e.formatVersion}}async addModel(e,t){const r=await this._cadModelFactory.loadModelMetadata(e);if(!this.doesModelHaveCompatibleFormat(r))throw Error(`The added model had format ${r.format} and version ${r.formatVersion} which is incompatible with previously added models of format ${this._compatibleFileFormat.format} and version `+this._compatibleFileFormat.version);this.updateModelCompatibilityFormat(r);const n=await this._cadModelFactory.createModel(r,t);return n.addEventListener("update",this._markNeedsRedrawBound),this._cadModelMap.set(n.cadModelIdentifier,n),this._cadModelUpdateHandler.addModel(n),n}removeModel(e){if(!this._cadModelMap.delete(e.cadModelIdentifier))throw new Error(`Could not remove model ${e.cadModelIdentifier} because it's not added`);e.removeEventListener("update",this._markNeedsRedrawBound),this._cadModelUpdateHandler.removeModel(e),e.dispose()}getLoadingStateObserver(){return this._cadModelUpdateHandler.getLoadingStateObserver()}markNeedsRedraw(){this._needsRedraw=!0}handleMaterialsChanged(){this.requestRedraw()}}
|
|
260
285
|
/*!
|
|
261
286
|
* Copyright 2021 Cognite AS
|
|
262
|
-
*/
|
|
287
|
+
*/var be;!function(e){e[e.Color=1]="Color",e[e.Normal=2]="Normal",e[e.TreeIndex=3]="TreeIndex",e[e.PackColorAndNormal=4]="PackColorAndNormal",e[e.Depth=5]="Depth",e[e.Effects=6]="Effects",e[e.Ghost=7]="Ghost",e[e.LOD=8]="LOD",e[e.DepthBufferOnly=9]="DepthBufferOnly",e[e.GeometryType=10]="GeometryType"}(be||(be={}));
|
|
263
288
|
/*!
|
|
264
289
|
* Copyright 2021 Cognite AS
|
|
265
|
-
*/
|
|
290
|
+
*/
|
|
291
|
+
const ve=new o.Color("black");function ge(e,t){const{camera:r,normalizedCoords:n,renderer:i,domElement:a}=t,s=new o.Scene,c=e.parent;s.add(e);try{const t={normalizedCoords:n,camera:r,renderer:i,domElement:a,scene:s,cadNode:e},u=function(e){const{cadNode:t}=e,r=t.renderMode;let n;t.renderMode=be.TreeIndex;try{n=ye(e,ve,0)}finally{t.renderMode=r}if(0===n[3])return;return 255*n[0]*255+255*n[1]+n[2]}(t);if(void 0===u)return;const p=function(e){const{cadNode:t}=e,r=t.renderMode;t.renderMode=be.Depth;const n=ye(e,ve,0);t.renderMode=r;return i=n,Ae.fromArray(i).multiplyScalar(1/255).dot(_e);var i}(t),m=function(e,t){const{camera:r,normalizedCoords:n}=e,i=new o.Vector3;return i.set(n.x,n.y,.5).applyMatrix4(r.projectionMatrixInverse),i.multiplyScalar(t/i.z),i.applyMatrix4(r.matrixWorld),i}(t,(l=p,d=r.near,f=r.far,d*f/((f-d)*l-f)));return{distance:(new o.Vector3).subVectors(m,r.position).length(),point:m,treeIndex:u,object:e,cadNode:e}}finally{c&&c.add(e)}var l,d,f}const Ae=new o.Vector4,_e=new o.Vector4(255/256/16777216,255/256/65536,255/256/256,255/256);const xe={renderTarget:new o.WebGLRenderTarget(1,1),pixelBuffer:new Uint8Array(4)};function ye(e,t,r){const{renderTarget:n,pixelBuffer:i}=xe,{scene:a,camera:s,normalizedCoords:c,renderer:l,domElement:d}=e,f=s.clone(),p={x:(c.x+1)/2*d.clientWidth,y:(1-c.y)/2*d.clientHeight};f.setViewOffset(d.clientWidth,d.clientHeight,p.x,p.y,1,1);const m=new u.k(l);try{const{width:e,height:s}=l.getSize(new o.Vector2);n.setSize(e,s),m.setRenderTarget(n),m.setClearColor(t,r),l.clearColor(),l.render(a,f),l.readRenderTargetPixels(n,0,0,1,1,i)}finally{m.resetState()}return i}
|
|
266
292
|
/*!
|
|
267
293
|
* Copyright 2021 Cognite AS
|
|
268
|
-
*/class
|
|
294
|
+
*/class ke{constructor(e){this._clippingPlanes=[new o.Plane,new o.Plane,new o.Plane,new o.Plane,new o.Plane,new o.Plane],this._box=e||new o.Box3,this.updatePlanes()}set minX(e){this._box.min.x=e,this.updatePlanes()}get minX(){return this._box.min.x}set minY(e){this._box.min.y=e,this.updatePlanes()}get minY(){return this._box.min.y}set minZ(e){this._box.min.z=e,this.updatePlanes()}get minZ(){return this._box.min.z}set maxX(e){this._box.max.x=e,this.updatePlanes()}get maxX(){return this._box.max.x}set maxY(e){this._box.max.y=e,this.updatePlanes()}get maxY(){return this._box.max.y}set maxZ(e){this._box.max.z=e,this.updatePlanes()}get maxZ(){return this._box.max.z}updatePlanes(){this._clippingPlanes[0].setFromNormalAndCoplanarPoint(new o.Vector3(1,0,0),new o.Vector3(this.minX,0,0)),this._clippingPlanes[1].setFromNormalAndCoplanarPoint(new o.Vector3(-1,0,0),new o.Vector3(this.maxX,0,0)),this._clippingPlanes[2].setFromNormalAndCoplanarPoint(new o.Vector3(0,1,0),new o.Vector3(0,this.minY,0)),this._clippingPlanes[3].setFromNormalAndCoplanarPoint(new o.Vector3(0,-1,0),new o.Vector3(0,this.maxY,0)),this._clippingPlanes[4].setFromNormalAndCoplanarPoint(new o.Vector3(0,0,1),new o.Vector3(0,0,this.minZ)),this._clippingPlanes[5].setFromNormalAndCoplanarPoint(new o.Vector3(0,0,-1),new o.Vector3(0,0,this.maxZ))}get clippingPlanes(){return this._clippingPlanes}}
|
|
269
295
|
/*!
|
|
270
296
|
* Copyright 2021 Cognite AS
|
|
271
|
-
*/const
|
|
297
|
+
*/const Te=new Float32Array([-.5,-.5,0,.5,-.5,0,.5,.5,0,.5,.5,0,-.5,.5,0,-.5,-.5,0]),we=new o.Float32BufferAttribute(Te.buffer,3),Ce=(new o.Box3).setFromArray(Te),Me=new Map([["color",{offset:0,size:12}],["treeIndex",{offset:12,size:4}],["normal",{offset:16,size:12}],["instanceMatrix",{offset:28,size:64}]]);
|
|
272
298
|
/*!
|
|
273
299
|
* Copyright 2021 Cognite AS
|
|
274
300
|
*/
|
|
275
|
-
function*
|
|
301
|
+
function*Ie(e,t,r,n=null){const i=e.primitives;if(Se(i.boxCollection)&&(yield function(e,t,r,n){const i=Object(m.m)(e,t,m.h,n),a=new o.InstancedBufferGeometry,s=new o.Mesh(a,r);return a.setIndex(m.g.index),a.setAttribute("position",m.g.position),Ne(a,i,t,s),Oe(a),s.onBeforeRender=(e,t,n)=>{Ee(r,s,n)},s.name="Primitives (Boxes)",s}(i.boxCollection,i.boxAttributes,t.box,n)),Se(i.circleCollection)&&(yield function(e,t,r,n){const i=Object(m.m)(e,t,m.u,n),a=new o.InstancedBufferGeometry,s=new o.Mesh(a,r);return a.setIndex(m.t.index),a.setAttribute("position",m.t.position),a.setAttribute("normal",m.t.position),Ne(a,i,t,s),Oe(a),s.onBeforeRender=(e,t,n)=>{Ee(r,s,n)},s.name="Primitives (Circles)",s}(i.circleCollection,i.circleAttributes,t.circle,n)),Se(i.coneCollection)&&(yield function(e,t,r,n,i){const a=Object(m.n)(e,t,i);if(0===a.length)return null;const s=new o.InstancedBufferGeometry,c=new o.Mesh(s,r);return s.setIndex(m.i.index),s.setAttribute("position",m.i.position),Ne(s,a,t,c),Pe(s,n),c.onBeforeRender=(e,t,n)=>{Ee(r,c,n)},c.name="Primitives (Cones)",c}(i.coneCollection,i.coneAttributes,t.cone,r,n)),Se(i.eccentricConeCollection)&&(yield function(e,t,r,n,i){const a=Object(m.n)(e,t,i),s=new o.InstancedBufferGeometry,c=new o.Mesh(s,r);return s.setIndex(m.i.index),s.setAttribute("position",m.i.position),Ne(s,a,t,c),Pe(s,n),c.onBeforeRender=(e,t,n)=>{Ee(r,c,n)},c.name="Primitives (EccentricCones)",c}(i.eccentricConeCollection,i.eccentricConeAttributes,t.eccentricCone,r,n)),Se(i.ellipsoidSegmentCollection)&&(yield function(e,t,r,n,i){const a=Object(m.o)(e,t,i),s=new o.InstancedBufferGeometry,c=new o.Mesh(s,r);return s.setIndex(m.i.index),s.setAttribute("position",m.i.position),Ne(s,a,t,c),Pe(s,n),c.onBeforeRender=(e,t,n)=>{Ee(r,c,n)},c.name="Primitives (EllipsoidSegments)",c}(i.ellipsoidSegmentCollection,i.ellipsoidSegmentAttributes,t.ellipsoidSegment,r,n)),Se(i.generalCylinderCollection)){const e=function(e,t,r,n,i){const a=Object(m.n)(e,t,i,"radius","radius");if(0===a.length)return null;const s=new o.InstancedBufferGeometry,c=new o.Mesh(s,r);return s.setIndex(m.i.index),s.setAttribute("position",m.i.position),Ne(s,a,t,c),Pe(s,n),c.onBeforeRender=(e,t,n)=>{Ee(r,c,n)},c.name="Primitives (GeneralCylinders)",c}(i.generalCylinderCollection,i.generalCylinderAttributes,t.generalCylinder,r,n);e&&(yield e)}Se(i.generalRingCollection)&&(yield function(e,t,r,n){const i=Object(m.m)(e,t,m.u,n),a=new o.InstancedBufferGeometry,s=new o.Mesh(a,r);return a.setIndex(m.t.index),a.setAttribute("position",m.t.position),Ne(a,i,t,s),Oe(a),s.onBeforeRender=(e,t,n)=>{Ee(r,s,n)},s.name="Primitives (GeneralRings)",s}(i.generalRingCollection,i.generalRingAttributes,t.generalRing,n)),Se(i.quadCollection)&&(yield function(e,t,r,n){const i=Object(m.m)(e,t,m.u,n),a=new o.InstancedBufferGeometry,s=new o.Mesh(a,r);return a.setIndex(m.t.index),a.setAttribute("position",m.t.position),a.setAttribute("normal",m.t.normal),Ne(a,i,t,s),Oe(a),s.name="Primitives (Quads)",s}(i.quadCollection,i.quadAttributes,t.quad,n)),Se(i.sphericalSegmentCollection)&&(yield function(e,t,r,n,i){const a=Object(m.o)(e,t,i,"radius","radius"),s=new o.InstancedBufferGeometry,c=new o.Mesh(s,r);return s.setIndex(m.i.index),s.setAttribute("position",m.i.position),Ne(s,a,t,c),Pe(s,n),s.setAttribute("a_horizontalRadius",s.getAttribute("a_radius")),s.setAttribute("a_verticalRadius",s.getAttribute("a_radius")),c.onBeforeRender=(e,t,n)=>{Ee(r,c,n)},c.name="Primitives (EllipsoidSegments)",c}(i.sphericalSegmentCollection,i.sphericalSegmentAttributes,t.sphericalSegment,r,n)),Se(i.torusSegmentCollection)&&(yield function(e,t,r,n){const i=function(e,t){const r=Array.from(t.values()).reduce((e,t)=>e+t.size,0),n=e.length/r;let i=0;const o=new DataView(e.buffer),a=t.get("size").offset;for(let e=0;e<n;e++)i=Math.max(i,o.getFloat32(e*r+a,!0));return i}(e,t),a=new u.b(new o.Box3);a.name="Primitives (TorusSegments)";let s=null,c=null;for(const[n,l]of m.v.entries()){const d=new o.InstancedBufferGeometry,f=new o.Mesh(d,r);if(d.setIndex(l.index),d.setAttribute("position",l.position),Ne(d,e,t,f),null===s){const e=De(d);s=e.boundingBox,c=e.boundingSphere,a.setBoundingBox(s)}d.boundingBox=s,d.boundingSphere=c,f.name="Primitives (TorusSegments) - LOD "+n,a.addLevel(f,Re(i,n)),f.onBeforeRender=(e,t,n)=>{Ee(r,f,n)}}return a}(i.torusSegmentCollection,i.torusSegmentAttributes,t.torusSegment)),Se(i.trapeziumCollection)&&(yield function(e,t,r,n){const i=Object(m.p)(e,t,n),a=new o.InstancedBufferGeometry,s=new o.Mesh(a,r);return a.setIndex(m.w.index),a.setAttribute("position",m.w.position),Ne(a,i,t,s),function(e){const{bbox:t,p:r}=ze;t.makeEmpty();const n=e.getAttribute("a_vertex1"),i=e.getAttribute("a_vertex2"),a=e.getAttribute("a_vertex3"),s=e.getAttribute("a_vertex4");E()(void 0!==n&&void 0!==i&&void 0!==a&&void 0!==s);for(let e=0;e<n.count;++e)r.set(n.getX(e),n.getY(e),n.getZ(e)),t.expandByPoint(r),r.set(i.getX(e),i.getY(e),i.getZ(e)),t.expandByPoint(r),r.set(a.getX(e),a.getY(e),a.getZ(e)),t.expandByPoint(r),r.set(s.getX(e),s.getY(e),s.getZ(e)),t.expandByPoint(r);e.boundingBox=t,e.boundingSphere=e.boundingSphere||new o.Sphere,e.boundingBox.getBoundingSphere(e.boundingSphere)}
|
|
276
302
|
/*!
|
|
277
303
|
* Copyright 2021 Cognite AS
|
|
278
|
-
*/(a),s.onBeforeRender=()=>
|
|
304
|
+
*/(a),s.onBeforeRender=(e,t,n)=>{Ee(r,s,n)},s.name="Primitives (Trapeziums)",s}(i.trapeziumCollection,i.trapeziumAttributes,t.trapezium,n)),Se(i.nutCollection)&&(yield function(e,t,r,n){const i=Object(m.m)(e,t,m.s,n),a=new o.InstancedBufferGeometry,s=new o.Mesh(a,r);return a.setIndex(m.r.index),a.setAttribute("position",m.r.position),a.setAttribute("normal",m.r.normal),Ne(a,i,t,s),Oe(a),s.name="Primitives (Nuts)",s}(i.nutCollection,i.nutAttributes,t.nut,n))}function Se(e){return e.length>0}function Ne(e,t,r,n){const i=Array.from(r.values()).reduce((e,t)=>e+t.size,0),a=new o.InstancedInterleavedBuffer(t,i),s=new o.InstancedInterleavedBuffer(new Float32Array(t.buffer),i/4);for(const[t,n]of r){const r="color"===t,i=r?a:s,c=r?n.size:n.size/4,l=r?n.offset:n.offset/4;e.setAttribute("a_"+t,new o.InterleavedBufferAttribute(i,c,l,r))}n.onAfterRender=()=>{u.p.bind(s)(),u.p.bind(a)(),n.onAfterRender=()=>{}},e.instanceCount=t.length/i,function(){const o=new DataView(t.buffer),a=r.get("treeIndex").offset,s=new Map;for(let t=0;t<e.instanceCount;t++)Object(u.r)(s,o.getFloat32(t*i+a,!0));n.userData.treeIndices=s}()}function Re(e,t){if(0===t)return 0;return e*5**t}function Ee(e,t,r){var n,i;null===(i=null===(n=e.uniforms.cameraPosition)||void 0===n?void 0:n.value)||void 0===i||i.copy(r.position);e.uniforms.inverseModelMatrix.value.copy(t.matrixWorld).invert()}function Pe(e,t){e.boundingSphere=e.boundingSphere||new o.Sphere,t.getBoundingSphere(e.boundingSphere)}const Be={baseBoundingBox:new o.Box3,instanceBoundingBox:new o.Box3,instanceMatrix:new o.Matrix4,p:new o.Vector3};function De(e){const{baseBoundingBox:t,instanceBoundingBox:r,instanceMatrix:n,p:i}=Be;t.makeEmpty();const a=new o.Box3,s=e.getAttribute("position");for(let e=0;e<s.count;++e)i.set(s.getX(e),s.getY(e),s.getZ(e)),t.expandByPoint(i);const c=e.getAttribute("a_instanceMatrix");E()(void 0!==c);const l=c.offset,d=c.data.count,f=c.data.stride,u=new Float32Array(c.array);for(let e=0;e<d;++e){const i=l+e*f;n.set(u[i],u[i+4],u[i+8],u[i+12],u[i+1],u[i+5],u[i+9],u[i+13],u[i+2],u[i+6],u[i+10],u[i+14],u[i+3],u[i+7],u[i+11],u[i+15]),r.copy(t).applyMatrix4(n),a.expandByPoint(r.min),a.expandByPoint(r.max)}return{boundingBox:a,boundingSphere:a.getBoundingSphere(new o.Sphere)}}function Oe(e){const{boundingBox:t,boundingSphere:r}=De(e);e.boundingBox=t,e.boundingSphere=r}const ze={bbox:new o.Box3,p:new o.Vector3};function Fe(e,t,r,n){const i=new u.a;if(i.name="Quads",0===e.buffer.byteLength)return{sectorMeshes:new u.a,instancedMeshes:[]};const a=function(e,t,r,n){const i=new Uint8Array(e.buffer),a=Object(m.m)(i,Me,Ce,n);if(0===a.byteLength)return;const s=new Float32Array(a.buffer);if(a.byteLength%23!=0)throw new Error("Expected buffer size to be multiple of 23, but got "+s.byteLength);const c=new o.InstancedBufferGeometry,l=new o.InstancedInterleavedBuffer(s,23),d=new o.InterleavedBufferAttribute(l,3,0,!0),f=new o.InterleavedBufferAttribute(l,1,3,!1),p=new o.InterleavedBufferAttribute(l,3,4,!0),h=new o.InterleavedBufferAttribute(l,4,7,!1),b=new o.InterleavedBufferAttribute(l,4,11,!1),v=new o.InterleavedBufferAttribute(l,4,15,!1),g=new o.InterleavedBufferAttribute(l,4,19,!1);c.setAttribute("position",we),c.setAttribute("color",d),c.setAttribute("treeIndex",f),c.setAttribute("normal",p),c.setAttribute("matrix0",h),c.setAttribute("matrix1",b),c.setAttribute("matrix2",v),c.setAttribute("matrix3",g);const A=new o.Mesh(c,t.simple);return A.name="Low detail geometry",A.onAfterRender=()=>{u.p.bind(l)(),A.onAfterRender=()=>{}},A.onBeforeRender=()=>{t.simple.uniforms.inverseModelMatrix.value.copy(A.matrixWorld).invert()},function(){const t=new Map;for(let r=0;r<e.length/23;r++)Object(u.r)(t,e[23*r+3]);A.userData.treeIndices=t}(),A.geometry.boundingSphere=new o.Sphere,r.getBoundingSphere(A.geometry.boundingSphere),A}(e.buffer,r,t,n);return void 0!==a&&i.add(a),{sectorMeshes:i,instancedMeshes:[]}}
|
|
279
305
|
/*!
|
|
280
306
|
* Copyright 2021 Cognite AS
|
|
281
307
|
*/
|
|
282
|
-
class
|
|
283
|
-
/*!
|
|
284
|
-
* Copyright 2021 Cognite AS
|
|
285
|
-
*/function*Be(e){const t=new Array(e.length);for(let n=0;n<e.length;++n)t[n]={fileId:e[n],index:n};t.sort((e,t)=>e.fileId-t.fileId);let n=0;for(;n<t.length;){const e=t[n].fileId,r=Oe(t,e,n,e=>e.fileId),o=new Array(r+1-n);for(let e=n;e<r+1;e++)o[e-n]=t[e].index;yield{id:e,meshIndices:o},n=r+1}}function Oe(e,t,n,r){let o=n,i=e.length-1,a=e.length;for(;o<=i;){const n=Math.floor((o+i)/2),s=r(e[n]);s>t?i=n-1:(s<t||(a=n),o=n+1)}return a}
|
|
308
|
+
class Ge{constructor(e){this.materialManager=e}transformSimpleSector(e,t,r,n){const i=this.materialManager.getModelMaterials(e);return E()(void 0!==i,"Could not find materials for model '"+e),Promise.resolve(Fe(r,t.subtreeBoundingBox,i,n))}transformDetailedSector(e,t,r,n){const i=this.materialManager.getModelMaterials(e);return E()(void 0!==i,"Could not find materials for model '"+e),Promise.resolve(function(e,t,r,n){const i=t.subtreeBoundingBox;null!==n&&function(e,t,r=1e-4){const n=e,i=t;return n.min.x-i.min.x>=r&&i.max.x-n.max.x>=r&&n.min.y-i.min.y>=r&&i.max.y-n.max.y>=r&&n.min.z-i.min.z>=r&&i.max.z-n.max.z>=r}(n,i)&&(n=null);const o=new u.a;for(const t of Ie(e,r,i,n))o.add(t);const a=Object(m.j)(e.triangleMeshes,i,r.triangleMesh,n);for(const e of a)o.add(e);return{sectorMeshes:o,instancedMeshes:e.instanceMeshes.map(e=>{const t=e.instances.map(t=>Object(m.l)(e.vertices,e.indices,t,n)).filter(e=>e.treeIndices.length>0);return{fileId:e.fileId,vertices:e.vertices,indices:e.indices,instances:t}}).filter(e=>e.instances.length>0)}}(r,t,i,n))}}
|
|
286
309
|
/*!
|
|
287
310
|
* Copyright 2021 Cognite AS
|
|
288
|
-
*/function
|
|
311
|
+
*/function*Ue(e){const t=new Array(e.length);for(let r=0;r<e.length;++r)t[r]={fileId:e[r],index:r};t.sort((e,t)=>e.fileId-t.fileId);let r=0;for(;r<t.length;){const e=t[r].fileId,n=Ve(t,e,r,e=>e.fileId),i=new Array(n+1-r);for(let e=r;e<n+1;e++)i[e-r]=t[e].index;yield{id:e,meshIndices:i},r=n+1}}function Ve(e,t,r,n){let i=r,o=e.length-1,a=e.length;for(;i<=o;){const r=Math.floor((i+o)/2),s=n(e[r]);s>t?o=r-1:(s<t||(a=r),i=r+1)}return a}
|
|
289
312
|
/*!
|
|
290
313
|
* Copyright 2021 Cognite AS
|
|
291
|
-
*/
|
|
314
|
+
*/function Le(e){const t=new Array(e.length);return e.forEach((r,n)=>{t[n]=n>0?t[n-1]+e[n-1]:0}),t}
|
|
292
315
|
/*!
|
|
293
316
|
* Copyright 2021 Cognite AS
|
|
294
|
-
*/
|
|
295
|
-
function(e,t,n=((e,t)=>[e,t,0])){const r=[],o=[],i=1/e,a=1/t;for(let o=0;o<=t;o++)for(let t=0;t<=e;t++){const[e,s,d]=n(t*i,o*a);r.push(e||0,s||0,d||0)}for(let n=1;n<=t;n++)for(let t=1;t<=e;t++){const r=(e+1)*n+t-1,i=(e+1)*(n-1)+t-1,a=(e+1)*(n-1)+t,s=(e+1)*n+t;o.push(r,i,s),o.push(i,a,s)}return{index:new l.Uint16BufferAttribute(o,1),position:new l.Float32BufferAttribute(r,3)}}(t[0].radialSegments,t[0].tubularSegments,(e,t)=>[e,2*t*Math.PI]);return e.setIndex(n.index),e.setAttribute("position",n.position),(new l.Box3).setFromArray(n.position.array)}function Ue(e,t){switch(e){case Le.BoxCollection:!function(e){const t=new l.BoxBufferGeometry(1,1,1,1,1,1);e.setIndex(t.getIndex()),e.setAttribute("position",t.getAttribute("position")),e.setAttribute("normal",t.getAttribute("normal")),e.computeBoundingBox(),e.boundingBox}(t);break;case Le.CircleCollection:ke(t);break;case Le.ConeCollection:case Le.EccentricConeCollection:case Le.EllipsoidSegmentCollection:case Le.GeneralCylinderCollection:Ge(t);break;case Le.GeneralRingCollection:ke(t,!1);break;case Le.NutCollection:!function(e){const t=new l.CylinderBufferGeometry(.5,.5,1,6);t.applyMatrix4((new l.Matrix4).makeRotationX(-Math.PI/2)),e.setIndex(t.getIndex()),e.setAttribute("position",t.getAttribute("position")),e.setAttribute("normal",t.getAttribute("normal")),(new l.Box3).setFromArray(t.getAttribute("position").array)}(t);break;case Le.QuadCollection:ke(t);break;case Le.TrapeziumCollection:!function(e){const t=[0,0,0,1,1,1,2,2,2,3,3,3];e.setIndex(new l.BufferAttribute(new Uint16Array([0,1,3,0,3,2]),1)),e.setAttribute("position",new l.BufferAttribute(new Float32Array(t),3)),(new l.Box3).setFromArray(t)}(t);break;case Le.TorusSegmentCollection:Ve(t);break;case Le.InstanceMesh:case Le.TriangleMesh:break;default:Object(i.l)(e)}}
|
|
317
|
+
*/class je{constructor(e,t){this._modelSectorProvider=e,this._modelDataParser=new m.c,this._modelDataTransformer=new Ge(t),this._consumedSectorCache=new u.h(50,e=>{void 0!==e.group&&e.group.dereference()}),this._ctmFileCache=new u.i(10)}setCacheSize(e){this._consumedSectorCache.resize(e)}clearCache(){this._consumedSectorCache.clear(),this._ctmFileCache.clear()}async loadSector(e){var t,r;const n=this.wantedSectorCacheKey(e);try{if(this._consumedSectorCache.has(n))return this._consumedSectorCache.get(n);switch(e.levelOfDetail){case m.d.Detailed:{const r=await this.loadDetailedSectorFromNetwork(e);return this._consumedSectorCache.forceInsert(n,r),null===(t=null==r?void 0:r.group)||void 0===t||t.reference(),r}case m.d.Simple:{const t=await this.loadSimpleSectorFromNetwork(e);return this._consumedSectorCache.forceInsert(n,t),null===(r=null==t?void 0:t.group)||void 0===r||r.reference(),t}case m.d.Discarded:return{modelIdentifier:e.modelIdentifier,metadata:e.metadata,levelOfDetail:e.levelOfDetail,instancedMeshes:[],group:void 0};default:Object(u.m)(e.levelOfDetail)}}catch(e){throw this._consumedSectorCache.remove(n),p.a.trackError(e,{methodName:"loadSector",moduleName:"CachedRepository"}),e}}async loadSimpleSectorFromNetwork(e){const t=e.metadata,r=await this._modelSectorProvider.getBinaryFile(e.modelBaseUrl,t.facesFile.fileName),n=await this._modelDataParser.parseF3D(new Uint8Array(r)),i=await this._modelDataTransformer.transformSimpleSector(e.modelIdentifier,t,n,e.geometryClipBox);return{...e,group:i.sectorMeshes,instancedMeshes:i.instancedMeshes}}async loadI3DFromNetwork(e,t){const r=await this._modelSectorProvider.getBinaryFile(e,t);return this._modelDataParser.parseI3D(new Uint8Array(r))}async loadCtmsFromNetwork(e,t){const r=await Promise.all(t.map(t=>this.loadCtmFileFromNetwork(e,t)));return t.reduce((e,t,n)=>e.set(t,r[n]),new Map)}async loadDetailedSectorFromNetwork(e){const t=e.metadata,r=t.indexFile,n=this.loadI3DFromNetwork(e.modelBaseUrl,r.fileName),i=this.loadCtmsFromNetwork(e.modelBaseUrl,r.peripheralFiles),o=await n,a=await i,s=this.finalizeDetailed(o,a),c=await this._modelDataTransformer.transformDetailedSector(e.modelIdentifier,t,s,e.geometryClipBox);return{...e,group:c.sectorMeshes,instancedMeshes:c.instancedMeshes}}async loadCtmFileFromNetwork(e,t){const r=this.ctmFileCacheKey(e,t),n=this._ctmFileCache.get(r);if(void 0!==n)return n;const i=this._modelSectorProvider.getBinaryFile(e,t).then(e=>this._modelDataParser.parseCTM(new Uint8Array(e)));return this._ctmFileCache.set(r,i),i}finalizeDetailed(e,t){const{instanceMeshes:r,triangleMeshes:n}=e,i=(()=>{const{fileIds:e,colors:r,triangleCounts:i,treeIndices:o}=n,a=[];for(const{id:n,meshIndices:s}of Ue(e)){const e=s.map(e=>i[e]),c=Le(e),l=`mesh_${n}.ctm`,{indices:d,vertices:f,normals:u}=t.get(l),p=new Uint8Array(3*d.length),m=new Float32Array(d.length);for(let t=0;t<s.length;t++){const n=s[t],i=o[n],a=c[t],l=e[t],[f,u,h]=[r[4*n+0],r[4*n+1],r[4*n+2]];for(let e=a;e<a+l;e++)for(let t=0;t<3;t++){const r=d[3*e+t];m[r]=i,p[3*r]=f,p[3*r+1]=u,p[3*r+2]=h}}const h={colors:p,fileId:n,treeIndices:m,indices:d,vertices:f,normals:u};a.push(h)}return a})(),o=(()=>{const{fileIds:e,colors:n,treeIndices:i,triangleCounts:o,triangleOffsets:a,instanceMatrices:s}=r,c=[];for(const{id:r,meshIndices:l}of Ue(e)){const e=`mesh_${r}.ctm`,d=t.get(e),f=d.indices,u=d.vertices,p=[],m=new Float64Array(l.map(e=>a[e])),h=new Float64Array(l.map(e=>o[e]));for(const{id:e,meshIndices:t}of Ue(m)){const r=h[t[0]],o=new Float32Array(16*t.length),a=new Float32Array(t.length),c=new Uint8Array(4*t.length);for(let e=0;e<t.length;e++){const r=l[t[e]],d=i[r],f=s.subarray(16*r,16*r+16);o.set(f,16*e),a[e]=d;const u=n.subarray(4*r,4*r+4);c.set(u,4*e)}p.push({triangleCount:r,triangleOffset:e,instanceMatrices:o,colors:c,treeIndices:a})}const b={fileId:r,indices:f,vertices:u,instances:p};c.push(b)}return c})();return{primitives:e.primitives,instanceMeshes:o,triangleMeshes:i}}wantedSectorCacheKey(e){return e.modelIdentifier+"."+e.metadata.id+"."+e.levelOfDetail}ctmFileCacheKey(e,t){return e+"."+t}}var We=r(5);
|
|
296
318
|
/*!
|
|
297
|
-
* Copyright
|
|
298
|
-
|
|
319
|
+
* Copyright 2022 Cognite AS
|
|
320
|
+
*/class Ze{constructor(e,t){this._gltfSectorParser=new We.a,this._sectorFileProvider=e,this._materialManager=t}async loadSector(e){const t=e.metadata;try{const r=await this._sectorFileProvider.getBinaryFile(e.modelBaseUrl,t.sectorFileName),n=new u.a,i=await this._gltfSectorParser.parseSector(r),o=this._materialManager.getModelMaterials(e.modelIdentifier),a=[];return i.forEach(t=>{var r;const i=t.type,s=Object(m.k)(t.geometryBuffer,i,null!==(r=e.geometryClipBox)&&void 0!==r?r:void 0);if(s)switch(i){case We.b.BoxCollection:case We.b.CircleCollection:case We.b.ConeCollection:case We.b.EccentricConeCollection:case We.b.EllipsoidSegmentCollection:case We.b.GeneralCylinderCollection:case We.b.GeneralRingCollection:case We.b.QuadCollection:case We.b.TorusSegmentCollection:case We.b.TrapeziumCollection:case We.b.NutCollection:a.push({type:i,geometryBuffer:s,instanceId:We.b[i].toString()});break;case We.b.InstanceMesh:a.push({type:i,geometryBuffer:s,instanceId:t.instanceId});break;case We.b.TriangleMesh:this.createMesh(n,t.geometryBuffer,o.triangleMesh);break;default:Object(u.m)(i)}}),{levelOfDetail:e.levelOfDetail,group:n,instancedMeshes:[],metadata:t,modelIdentifier:e.modelIdentifier,geometryBatchingQueue:a}}catch(e){throw p.a.trackError(e,{moduleName:"GltfSectorLoader",methodName:"loadSector"}),e}}createTreeIndexSet(e){const t=e.attributes.treeIndex;E()(void 0!==t);const r=new Map;for(let e=0;e<t.count;e++)Object(u.r)(r,t.getX(e));return r}createMesh(e,t,r){const n=new o.Mesh(t,r);e.add(n),n.frustumCulled=!1,n.userData.treeIndices=this.createTreeIndexSet(t),void 0!==r.uniforms.inverseModelMatrix&&(n.onBeforeRender=()=>{r.uniforms.inverseModelMatrix.value.copy(n.matrixWorld).invert()})}}
|
|
299
321
|
/*!
|
|
300
322
|
* Copyright 2021 Cognite AS
|
|
301
|
-
*/
|
|
302
|
-
class We{constructor(){this._glbMetadataParser=new je}parseSector(e){const t=this._glbMetadataParser.parseGlbMetadata(e),n=t.json;return this.traverseDefaultSceneNodes(n,t,e)}traverseDefaultSceneNodes(e,t,n){const r=[];return e.scenes[e.scene].nodes.map(t=>e.nodes[t]).forEach(e=>{const o=this.processNode(e,t,n);void 0!==o&&r.push(o)}),r}processNode(e,t,n){var r;const i=null===(r=e.extensions)||void 0===r?void 0:r.EXT_mesh_gpu_instancing,a=e.mesh;if(void 0===i&&void 0===a)return;const s=i?new l.InstancedBufferGeometry:new l.BufferGeometry,d=Le[e.name],c={bufferGeometry:s,geometryType:d,glbHeaderData:t,instancingExtension:i,meshId:a,data:n};switch(d){case Le.InstanceMesh:return o()(void 0!==c.instancingExtension),this.processInstancedTriangleMesh(c);case Le.TriangleMesh:o()(void 0===c.instancingExtension),this.processTriangleMesh(c);break;default:o()(void 0!==c.instancingExtension),this.processPrimitiveCollection(c)}return{type:d,geometryBuffer:s}}processInstancedTriangleMesh(e){var t;const{bufferGeometry:n,glbHeaderData:r,meshId:i,data:a}=e,s=r.json;o()(void 0!==i);const d=s.meshes[i];o()(1===d.primitives.length),o()(void 0!==(null===(t=d.extras)||void 0===t?void 0:t.InstanceId));const c=d.primitives[0];this.setIndexBuffer(e,c,a,n),this.setPositionBuffer(e,c,a,n);return this.setInterleavedBufferAttributes(e.glbHeaderData,e.instancingExtension.attributes,e.data,e=>"a"+e,e.bufferGeometry,l.InstancedInterleavedBuffer),{type:Le.InstanceMesh,geometryBuffer:e.bufferGeometry,instanceId:d.extras.InstanceId.toString()}}processPrimitiveCollection(e){o()(null!==e.instancingExtension,"Primitive does not contain the instanced gltf extension"),Ue(e.geometryType,e.bufferGeometry);this.setInterleavedBufferAttributes(e.glbHeaderData,e.instancingExtension.attributes,e.data,e=>"a"+e,e.bufferGeometry,l.InstancedInterleavedBuffer)}processTriangleMesh(e){const{bufferGeometry:t,glbHeaderData:n,meshId:r,data:i}=e,a=n.json;o()(void 0!==r);const s=a.meshes[r];o()(1===s.primitives.length);const d=s.primitives[0];this.setIndexBuffer(e,d,i,t),this.setInterleavedBufferAttributes(e.glbHeaderData,d.attributes,e.data,(function(e){switch(e){case"COLOR_0":return"color";case"POSITION":return"position";case"_treeIndex":return"treeIndex";default:throw new Error}}),e.bufferGeometry,l.InterleavedBuffer)}setIndexBuffer(e,t,n,r){var o;const i=e.glbHeaderData.json,a=e.glbHeaderData.byteOffsetToBinContent,s=i.accessors[t.indices],d=i.bufferViews[s.bufferView];d.byteOffset=null!==(o=d.byteOffset)&&void 0!==o?o:0;const c=We.DATA_TYPE_BYTE_SIZES.get(s.componentType),u=new c(n,a+d.byteOffset,d.byteLength/c.BYTES_PER_ELEMENT),p=We.COLLECTION_TYPE_SIZES.get(s.type);r.setIndex(new l.BufferAttribute(u,p))}setPositionBuffer(e,t,n,r){var o;const i=e.glbHeaderData.json,a=e.glbHeaderData.byteOffsetToBinContent,s=i.accessors[t.attributes.POSITION],d=i.bufferViews[s.bufferView];d.byteOffset=null!==(o=d.byteOffset)&&void 0!==o?o:0;const c=We.DATA_TYPE_BYTE_SIZES.get(s.componentType),u=new c(n,a+d.byteOffset,d.byteLength/c.BYTES_PER_ELEMENT),p=We.COLLECTION_TYPE_SIZES.get(s.type);r.setAttribute("position",new l.BufferAttribute(u,p))}setInterleavedBufferAttributes(e,t,n,r,i,a){var s;const d=e.json,l=Object.values(t).map(e=>d.accessors[e].bufferView);o()(l.length>0);const c=l[0];for(let e=1;e<l.length;e++)o()(l[e]===c,"Unexpected number of unique buffer views");const u=d.bufferViews[c];u.byteOffset=null!==(s=u.byteOffset)&&void 0!==s?s:0;const p=e.byteOffsetToBinContent,m=Object.values(t).map(e=>d.accessors[e].componentType),h=this.getUniqueComponentViews(m,n,p,u,a);this.setAttributes(t,d,h,r,i)}setAttributes(e,t,n,r,i){Object.keys(e).forEach(a=>{var s;const d=t.accessors[e[a]],c=null!==(s=d.byteOffset)&&void 0!==s?s:0,u=n[d.componentType],p=We.COLLECTION_TYPE_SIZES.get(d.type);o()(void 0!==p);const m=We.DATA_TYPE_BYTE_SIZES.get(d.componentType);o()(void 0!==m);const h=m.BYTES_PER_ELEMENT;o()(void 0!==h);const f=new l.InterleavedBufferAttribute(u,p,c/h),v=r(a);i.setAttribute(v,f)})}getUniqueComponentViews(e,t,n,r,o){var i;const a=null!==(i=r.byteOffset)&&void 0!==i?i:0,s=[...new Set(e)].map(e=>{const i=We.DATA_TYPE_BYTE_SIZES.get(e),s=new i(t,n+a,r.byteLength/i.BYTES_PER_ELEMENT);return{componentType:e,interleavedBuffer:new o(s,r.byteStride/i.BYTES_PER_ELEMENT)}});return Object.assign({},...s.map(e=>({[e.componentType]:e.interleavedBuffer})))}}We.COLLECTION_TYPE_SIZES=new Map([["SCALAR",1],["VEC2",2],["VEC3",3],["VEC4",4],["MAT2",4],["MAT3",9],["MAT4",16]]),We.DATA_TYPE_BYTE_SIZES=new Map([[5120,Int8Array],[5121,Uint8Array],[5122,Int16Array],[5123,Uint16Array],[5125,Uint32Array],[5126,Float32Array]]);
|
|
323
|
+
*/class He{constructor(e,t){this._gltfSectorLoader=new Ze(e,t),this._gltfCache=new u.h(200,async e=>{var t;return null===(t=e.group)||void 0===t?void 0:t.dereference()},50)}async getEmptySectorWithLod(e,t,r){return Promise.resolve({modelIdentifier:t,metadata:r,levelOfDetail:e,group:void 0,instancedMeshes:[]})}async getEmptyDetailedSector(e,t){return this.getEmptySectorWithLod(m.d.Detailed,e,t)}async getEmptyDiscardedSector(e,t){return this.getEmptySectorWithLod(m.d.Discarded,e,t)}async loadSector(e){var t;const r=e.metadata;if(void 0===r.sectorFileName||0===r.downloadSize)return this.getEmptyDetailedSector(e.modelIdentifier,r);if(e.levelOfDetail===m.d.Discarded)return this.getEmptyDiscardedSector(e.modelIdentifier,r);const n=this.wantedSectorCacheKey(e);if(this._gltfCache.has(n))return this._gltfCache.get(n);const i=await this._gltfSectorLoader.loadSector(e);return null===(t=i.group)||void 0===t||t.reference(),this._gltfCache.forceInsert(n,i),i}setCacheSize(e){this._gltfCache.resize(e)}clearCache(){this._gltfCache.clear()}wantedSectorCacheKey(e){return e.modelIdentifier+"."+e.metadata.id}}
|
|
303
324
|
/*!
|
|
304
325
|
* Copyright 2021 Cognite AS
|
|
305
326
|
*/
|
|
306
|
-
var qe=n(11),He=n(13);
|
|
307
327
|
/*!
|
|
308
328
|
* Copyright 2021 Cognite AS
|
|
309
|
-
*/
|
|
310
|
-
function Ke(e,t,n){if(!n)return e;if(t===Le.InstanceMesh||t===Le.TriangleMesh){const t=e.boundingBox;return!t||t.intersectsBox(n)?e:void 0}const r=Qe(e,l.InterleavedBufferAttribute);let o;switch(t){case Le.BoxCollection:o=function(e,t){return $e(e,Ze,t)}(r,n);break;case Le.CircleCollection:o=function(e,t){return $e(e,Ye,t)}(r,n);break;case Le.ConeCollection:case Le.EccentricConeCollection:o=function(e,t){return et(e,t,"a_radiusA","a_radiusB")}(r,n);break;case Le.EllipsoidSegmentCollection:o=function(e,t){return function(e,t){const{center:n}=nt;return Je(e,(t,r,o,i)=>{const a=e.get("a_horizontalRadius").getX(t),s=e.get("a_verticalRadius").getX(t),d=e.get("a_height").getX(t),l=e.get("a_center");return n.set(l.getX(t),l.getY(t),l.getZ(t)),Object(qe.c)(a,s,d,n,i)},t)}(e,t)}(r,n);break;case Le.GeneralCylinderCollection:o=function(e,t){return et(e,t,"a_radius","a_radius")}(r,n);break;case Le.GeneralRingCollection:case Le.QuadCollection:o=function(e,t){return $e(e,Ye,t)}(r,n);break;case Le.TorusSegmentCollection:o=function(e,t){return function(e,t){const{boundingBox:n}=tt;return Je(e,(t,r,o,i)=>{const a=e.get("a_radius").getX(t),s=e.get("a_tubeRadius").getX(t);n.min.set(-a-s,-a-s,-s),n.max.set(a+s,a+s,s);const d=e.get("a_instanceMatrix"),l=d.offset*d.array.BYTES_PER_ELEMENT;return Object(qe.d)(o,l,r,t,n,i)},t)}(e,t)}(r,n);break;case Le.TrapeziumCollection:o=function(e,t){return function(e,t){return Je(e,(t,n,r,o)=>{const i=e.get("a_vertex1"),a=e.get("a_vertex2"),s=e.get("a_vertex3"),d=e.get("a_vertex4"),l=i.array.BYTES_PER_ELEMENT,c=i.offset*l,u=a.offset*l,p=s.offset*l,m=d.offset*l;return Object(qe.e)(c,u,p,m,r,n,t,o)},t)}(e,t)}(r,n);break;case Le.NutCollection:o=function(e,t){return $e(e,Ze,t)}
|
|
329
|
+
*/class Ye{constructor(e,t){this._materialManager=t,this._instancedGeometryMap=new Map,this._instancedAttributeMap=new Map,this._processedSectorMap=new Map,this._instancedMeshGroup=e}addInstanceMeshes(e,t,r){if(this._processedSectorMap.has(r))return;this._instancedGeometryMap.has(e.fileId)||this._instancedGeometryMap.set(e.fileId,{vertices:new o.Float32BufferAttribute(e.vertices.buffer,3),indices:new o.Uint32BufferAttribute(e.indices.buffer,1)});const n=this._instancedGeometryMap.get(e.fileId),i=this._materialManager.getModelMaterials(t).instancedMesh;for(const t of e.instances){const o=JSON.stringify([e.fileId,t.triangleOffset]);if(this._instancedAttributeMap.has(o)){const e=this._instancedAttributeMap.get(o),i=e.treeIndexBuffer.add(t.treeIndices),a=e.colorBuffer.add(t.colors),s=e.instanceMatrixBuffer.add(t.instanceMatrices);e.updateAttributes(),this.addBatchDescriptor(o,i.batchId,a.batchId,s.batchId,r),e.mesh.count=e.treeIndexBuffer.length,(i.bufferIsReallocated||a.bufferIsReallocated||s.bufferIsReallocated)&&this.recreateBufferGeometry(n,e,t,o)}else this.createInstance(t,n,i,o,r)}}removeSectorInstancedMeshes(e){const t=this._processedSectorMap.get(e);if(t){for(const r of t){const t=this._instancedAttributeMap.get(r.instanceIdentifier);if(void 0===t)throw new Error("Cannot resolve instance identifier for sector "+e);t.treeIndexBuffer.remove(r.treeIndicesbatchId),t.colorBuffer.remove(r.colorsBatchId),t.instanceMatrixBuffer.remove(r.instanceMatricesBatchId),t.updateAttributes(),t.mesh.count=t.treeIndexBuffer.length}this._processedSectorMap.delete(e)}}createInstancedBufferGeometry(e,t,r,n,i){const a=new o.InstancedBufferGeometry;a.setIndex(t),a.setAttribute("position",e);const s=new o.InstancedBufferAttribute(r.bufferView,1);a.setAttribute("a_treeIndex",s);const c=new o.InstancedBufferAttribute(n.bufferView,4,!0);a.setAttribute("a_color",c);const l=new o.InstancedBufferAttribute(i.bufferView,16);a.setAttribute("a_instanceMatrix",l);return[a,()=>{s.needsUpdate=!0,c.needsUpdate=!0,l.needsUpdate=!0}]}recreateBufferGeometry(e,t,r,n){const[i,o]=this.createInstancedBufferGeometry(e.vertices,e.indices,t.treeIndexBuffer,t.colorBuffer,t.instanceMatrixBuffer);i.setDrawRange(3*r.triangleOffset,3*r.triangleCount),t.mesh.geometry.dispose(),t.mesh.geometry=i,t.mesh.count=t.treeIndexBuffer.length,this._instancedAttributeMap.set(n,{mesh:t.mesh,treeIndexBuffer:t.treeIndexBuffer,colorBuffer:t.colorBuffer,instanceMatrixBuffer:t.instanceMatrixBuffer,updateAttributes:o})}createInstance(e,t,r,n,i){const a=new u.d(e.treeIndices.length,Float32Array),s=a.add(e.treeIndices),c=new u.d(e.colors.length,Uint8Array),l=c.add(e.colors),d=new u.d(e.instanceMatrices.length,Float32Array),f=d.add(e.instanceMatrices);this.addBatchDescriptor(n,s.batchId,l.batchId,f.batchId,i);const[p,m]=this.createInstancedBufferGeometry(t.vertices,t.indices,a,c,d);p.setDrawRange(3*e.triangleOffset,3*e.triangleCount);const h=new o.InstancedMesh(p,r,a.length);h.frustumCulled=!1,this._instancedAttributeMap.set(n,{mesh:h,treeIndexBuffer:a,colorBuffer:c,instanceMatrixBuffer:d,updateAttributes:m}),this._instancedMeshGroup.add(h),h.updateMatrixWorld(!0)}addBatchDescriptor(e,t,r,n,i){const o={instanceIdentifier:e,treeIndicesbatchId:t,colorsBatchId:r,instanceMatricesBatchId:n},a=this._processedSectorMap.get(i);a?a.push(o):this._processedSectorMap.set(i,[o])}}
|
|
311
330
|
/*!
|
|
312
331
|
* Copyright 2021 Cognite AS
|
|
313
|
-
*/(
|
|
332
|
+
*/class qe{constructor(e,t){this._batchedGeometriesGroup=e,this._materials=t,this._instancedTypeMap=new Map,this._sectorMap=new Map}dispose(){for(const e of this._sectorMap.keys())this.removeSectorBatches(e);for(const e of this._batchedGeometriesGroup.children)e instanceof o.Mesh&&(e.geometry.dispose(),delete e.geometry);this._batchedGeometriesGroup.clear()}batchGeometries(e,t){void 0===this._sectorMap.get(t)&&e.forEach(e=>{const{type:r,geometryBuffer:n,instanceId:i}=e;this.processGeometries(n,i,r,t)})}removeSectorBatches(e){const t=this._sectorMap.get(e);void 0!==t&&(t.forEach(e=>{const[t,r,n]=e,i=this._instancedTypeMap.get(t);if(void 0===i)return;const{defragBuffer:o,mesh:a}=i,s=o.getRangeForBatchId(r);this.removeTreeIndicesFromMeshUserData(a,s);const c=o.remove(r);this.updateInstanceAttributes(a,c),a.count-=n}),this._sectorMap.delete(e))}processGeometries(e,t,r,n){var i,a;const s=this.getAttributes(e,o.InterleavedBufferAttribute),c=this.getInstanceAttributesSharedView(s),l=this.getTreeIndexAttribute(s);E()(void 0!==t);const d=null!==(i=this._instancedTypeMap.get(t))&&void 0!==i?i:this.createInstanceMeshGeometry(e,r,t),f=c.buffer,{defragBuffer:p,mesh:m}=d,h=c.byteLength,b=c.byteOffset,v=new Uint8Array(f,b,h),{batchId:g,bufferIsReallocated:A,updateRange:_}=p.add(v),x=c.BYTES_PER_ELEMENT*s[0].attribute.data.stride;E()(_.byteCount%x==0),E()(_.byteOffset%x==0);for(let e=0;e<l.count;e++)Object(u.r)(m.userData.treeIndices,l.getX(e));const y=null!==(a=this._sectorMap.get(n))&&void 0!==a?a:this.createSectorBatch(n);E()(s.length>0);const k=s[0].attribute.count;y.push([t,g,k]),A?this.reallocateBufferGeometry(m,p):this.updateInstanceAttributes(m,_),m.count+=k}updateInstanceAttributes(e,t){this.getAttributes(e.geometry,o.InterleavedBufferAttribute).forEach(e=>{const r=e.attribute;this.extendUpdateRange(r,t),r.data.needsUpdate=!0})}extendUpdateRange(e,t){const r=e.data.array.BYTES_PER_ELEMENT,n=t.byteOffset/r,i=t.byteCount/r,{offset:o,count:a}=e.data.updateRange;if(-1===a)return e.data.updateRange={offset:n,count:i},void(e.data.needsUpdate=!0);const s=Math.min(o,n),c=Math.max(o+a,n+i)-s;e.data.updateRange={offset:s,count:c}}reallocateBufferGeometry(e,t){const r=this.createDefragmentedBufferGeometry(e.geometry,t);e.geometry.dispose(),e.geometry=r}createSectorBatch(e){const t=[];return this._sectorMap.set(e,t),t}createInstanceMeshGeometry(e,t,r){const n=new u.d(64,Uint8Array),i=this.createDefragmentedBufferGeometry(e,n),o=this.getShaderMaterial(t,this._materials),a={defragBuffer:n,mesh:this.createInstanceMesh(this._batchedGeometriesGroup,i,o,r)};return this._instancedTypeMap.set(r,a),a}getInstanceAttributesSharedView(e){E()(e.length>0);const t=e[0].attribute.array;for(let r=1;r<e.length;r++){const n=e[r].attribute.array;E()(t.buffer.byteLength===n.buffer.byteLength)}return t}getTreeIndexAttribute(e){const t=e.filter(e=>"a_treeIndex"===e.name);return E()(t.length>0),t[0].attribute}removeTreeIndicesFromMeshUserData(e,t){const{byteOffset:r,byteCount:n}=t,i=this.getAttributes(e.geometry,o.InterleavedBufferAttribute),a=this.getTreeIndexAttribute(i),s=a.data.array,c=a.data.stride*s.BYTES_PER_ELEMENT;E()(r%c==0),E()(n%c==0);const l=(r+n)/c;for(let t=r/c;t<l;t++){const r=a.getX(t);E()(e.userData.treeIndices.has(r)),Object(u.n)(e.userData.treeIndices,r)}}createDefragmentedBufferGeometry(e,t){const r=this.getAttributes(e,o.InterleavedBufferAttribute),n=this.copyGeometryWithBufferAttributes(e);return r.forEach(e=>{const{name:r,attribute:i}=e,a=i.data.stride,s=i.array.BYTES_PER_ELEMENT,c=t.bufferView.buffer,l=qe.TypedArrayViews.get(s),d=new o.InstancedInterleavedBuffer(new l(c),a);n.setAttribute(r,new o.InterleavedBufferAttribute(d,i.itemSize,i.offset,i.normalized))}),n}createInstanceMesh(e,t,r,n){const i=new o.InstancedMesh(t,r,0);return e.add(i),i.frustumCulled=!1,i.name=n,i.onBeforeRender=(e,t,n)=>{var o,a,s,c;null===(a=null===(o=r.uniforms.inverseModelMatrix)||void 0===o?void 0:o.value)||void 0===a||a.copy(i.matrixWorld).invert(),null===(c=null===(s=r.uniforms.cameraPosition)||void 0===s?void 0:s.value)||void 0===c||c.copy(n.position)},i.userData.treeIndices=new Map,i.updateMatrixWorld(!0),i}getAttributes(e,t){return Object.entries(e.attributes).filter(e=>e[1]instanceof t).map(e=>({name:e[0],attribute:e[1]}))}copyGeometryWithBufferAttributes(e){const t=new o.BufferGeometry;return this.getAttributes(e,o.BufferAttribute).forEach(e=>{t.setAttribute(e.name,e.attribute)}),t.setIndex(e.getIndex()),t}getShaderMaterial(e,t){switch(e){case We.b.BoxCollection:return t.box;case We.b.CircleCollection:return t.circle;case We.b.ConeCollection:return t.cone;case We.b.EccentricConeCollection:return t.eccentricCone;case We.b.EllipsoidSegmentCollection:return t.ellipsoidSegment;case We.b.GeneralCylinderCollection:return t.generalCylinder;case We.b.GeneralRingCollection:return t.generalRing;case We.b.QuadCollection:return t.quad;case We.b.TorusSegmentCollection:return t.torusSegment;case We.b.TrapeziumCollection:return t.trapezium;case We.b.NutCollection:return t.nut;case We.b.TriangleMesh:return t.triangleMesh;case We.b.InstanceMesh:return t.instancedMesh;default:Object(u.m)(e)}}}qe.TypedArrayViews=new Map([[1,Uint8Array],[4,Float32Array]]);class Qe extends o.Object3D{constructor(e,t,r){super(),this.type="CadNode",this.name="Sector model",this._materialManager=t,this._sectorRepository=r;const n=new o.Group;n.name="InstancedMeshes";const i=new o.Group;i.name="Batched Geometry",this._instancedMeshManager=new Ye(n,t);const a=t.getModelMaterials(e.modelIdentifier);this._geometryBatchingManager=new qe(i,a),this._rootSector=new m.e(e),this._rootSector.add(n),this._rootSector.add(i),this._cadModelMetadata=e;const{scene:s}=e;this._sectorScene=s,this.add(this._rootSector),this.matrixAutoUpdate=!1,this.updateMatrixWorld(),this.setModelTransformation(e.modelMatrix)}get nodeTransformProvider(){return this._materialManager.getModelNodeTransformProvider(this._cadModelMetadata.modelIdentifier)}get nodeAppearanceProvider(){return this._materialManager.getModelNodeAppearanceProvider(this._cadModelMetadata.modelIdentifier)}get defaultNodeAppearance(){return this._materialManager.getModelDefaultNodeAppearance(this._cadModelMetadata.modelIdentifier)}set defaultNodeAppearance(e){this._materialManager.setModelDefaultNodeAppearance(this._cadModelMetadata.modelIdentifier,e)}get clippingPlanes(){return this._materialManager.clippingPlanes}set clippingPlanes(e){this._materialManager.clippingPlanes=e}get cadModelMetadata(){return this._cadModelMetadata}get cadModelIdentifier(){return this._cadModelMetadata.modelIdentifier}get sectorScene(){return this._sectorScene}get rootSector(){return this._rootSector}get materialManager(){return this._materialManager}set renderMode(e){this._materialManager.setRenderMode(e)}get renderMode(){return this._materialManager.getRenderMode()}loadSector(e){return this._sectorRepository.loadSector(e)}setModelTransformation(e){this._rootSector.setModelTransformation(e),this._cadModelMetadata.modelMatrix.copy(e)}getModelTransformation(e){return this._rootSector.getModelTransformation(e)}get prioritizedAreas(){return this.nodeAppearanceProvider.getPrioritizedAreas()}updateInstancedMeshes(e,t,r){for(const n of e)this._instancedMeshManager.addInstanceMeshes(n,t,r)}discardInstancedMeshes(e){this._instancedMeshManager.removeSectorInstancedMeshes(e)}batchGeometry(e,t){this._geometryBatchingManager.batchGeometries(e,t)}removeBatchedSectorGeometries(e){this._geometryBatchingManager.removeSectorBatches(e)}setCacheSize(e){this._sectorRepository.setCacheSize(e)}dispose(){this._sectorRepository.clearCache(),this._materialManager.removeModelMaterials(this._cadModelMetadata.modelIdentifier),this._geometryBatchingManager.dispose(),this._rootSector.dereferenceAllNodes(),this._rootSector.clear(),this.clear(),delete this._geometryBatchingManager,delete this._rootSector,delete this._sectorScene}}
|
|
314
333
|
/*!
|
|
315
334
|
* Copyright 2021 Cognite AS
|
|
316
|
-
*/
|
|
335
|
+
*/class Xe{constructor(e,t,r){this._materialManager=e,this._modelDataProvider=r,this._cadModelMetadataRepository=new m.b(t,r)}loadModelMetadata(e){return this._cadModelMetadataRepository.loadData(e)}async createModel(e,t){const r=function(e,t){if(null===t)return e;return new m.a(t).createClippedModel(e)}
|
|
317
336
|
/*!
|
|
318
337
|
* Copyright 2021 Cognite AS
|
|
319
|
-
*/
|
|
338
|
+
*/(e,function(e,t){if(void 0===e||void 0===e.boundingBox)return null;if(!e.isBoundingBoxInModelCoordinates)return e.boundingBox;const r=e.boundingBox.clone();return r.applyMatrix4(t.inverseModelMatrix),r}(t,e)),{modelIdentifier:n,scene:i,format:a,formatVersion:s}=r;p.a.trackLoadModel({type:"cad"},n,s);const c=this.getSectorRepository(a,s);this._materialManager.addModelMaterials(n,i.maxTreeIndex);const l=new Qe(r,this._materialManager,c);if(null!==r.geometryClipBox){const e=function(e,t){const r=e.min.clone().applyMatrix4(t.modelMatrix),n=e.max.clone().applyMatrix4(t.modelMatrix);return(new o.Box3).setFromPoints([r,n])}(r.geometryClipBox,r),t=new ke(e).clippingPlanes;this._materialManager.setModelClippingPlanes(r.modelIdentifier,t)}return l}getSectorRepository(e,t){var r,n;if(e===L.d.RevealCadModel&&8===t)return this._v8SectorRepository=null!==(r=this._v8SectorRepository)&&void 0!==r?r:new je(this._modelDataProvider,this._materialManager),this._v8SectorRepository;if(e===L.d.GltfCadModel&&9===t)return this._gltfSectorRepository=null!==(n=this._gltfSectorRepository)&&void 0!==n?n:new He(this._modelDataProvider,this._materialManager),this._gltfSectorRepository;throw new Error(`Model format [${e} v${t}] is not supported (only version 8 and 9 is supported)`)}dispose(){var e,t;null===(e=this._v8SectorRepository)||void 0===e||e.clearCache(),null===(t=this._gltfSectorRepository)||void 0===t||t.clearCache()}}function Je(e,t,r,n,i,o){const a=new Xe(n,e,t),s=o&&o.sectorCuller?o.sectorCuller:function(e,t){const r=new pe({renderer:e,renderManager:t});return new ee({renderer:e,coverageUtil:r})}(r,i),c=new Q(s,o.continuousModelStreaming);return new he(n,a,c)}
|
|
320
339
|
/*!
|
|
321
340
|
* Copyright 2021 Cognite AS
|
|
322
|
-
*/
|
|
323
|
-
class ot{constructor(e,t){this._materialManager=t,this._instancedGeometryMap=new Map,this._instancedAttributeMap=new Map,this._processedSectorMap=new Map,this._instancedMeshGroup=e}addInstanceMeshes(e,t,n){if(this._processedSectorMap.has(n))return;this._instancedGeometryMap.has(e.fileId)||this._instancedGeometryMap.set(e.fileId,{vertices:new l.Float32BufferAttribute(e.vertices.buffer,3),indices:new l.Uint32BufferAttribute(e.indices.buffer,1)});const r=this._instancedGeometryMap.get(e.fileId),o=this._materialManager.getModelMaterials(t).instancedMesh;for(const t of e.instances){const i=JSON.stringify([e.fileId,t.triangleOffset]);if(this._instancedAttributeMap.has(i)){const e=this._instancedAttributeMap.get(i),o=e.treeIndexBuffer.add(t.treeIndices),a=e.colorBuffer.add(t.colors),s=e.instanceMatrixBuffer.add(t.instanceMatrices);e.updateAttributes(),this.addBatchDescriptor(i,o.batchId,a.batchId,s.batchId,n),e.mesh.count=e.treeIndexBuffer.length,(o.bufferIsReallocated||a.bufferIsReallocated||s.bufferIsReallocated)&&this.recreateBufferGeometry(r,e,t,i)}else this.createInstance(t,r,o,i,n)}}removeSectorInstancedMeshes(e){const t=this._processedSectorMap.get(e);if(t){for(const n of t){const t=this._instancedAttributeMap.get(n.instanceIdentifier);if(void 0===t)throw new Error("Cannot resolve instance identifier for sector "+e);t.treeIndexBuffer.remove(n.treeIndicesbatchId),t.colorBuffer.remove(n.colorsBatchId),t.instanceMatrixBuffer.remove(n.instanceMatricesBatchId),t.updateAttributes(),t.mesh.count=t.treeIndexBuffer.length}this._processedSectorMap.delete(e)}}createInstancedBufferGeometry(e,t,n,r,o){const i=new l.InstancedBufferGeometry;i.setIndex(t),i.setAttribute("position",e);const a=new l.InstancedBufferAttribute(n.bufferView,1);i.setAttribute("a_treeIndex",a);const s=new l.InstancedBufferAttribute(r.bufferView,4,!0);i.setAttribute("a_color",s);const d=new l.InstancedBufferAttribute(o.bufferView,16);i.setAttribute("a_instanceMatrix",d);return[i,()=>{a.needsUpdate=!0,s.needsUpdate=!0,d.needsUpdate=!0}]}recreateBufferGeometry(e,t,n,r){const[o,i]=this.createInstancedBufferGeometry(e.vertices,e.indices,t.treeIndexBuffer,t.colorBuffer,t.instanceMatrixBuffer);o.setDrawRange(3*n.triangleOffset,3*n.triangleCount),t.mesh.geometry.dispose(),t.mesh.geometry=o,t.mesh.count=t.treeIndexBuffer.length,this._instancedAttributeMap.set(r,{mesh:t.mesh,treeIndexBuffer:t.treeIndexBuffer,colorBuffer:t.colorBuffer,instanceMatrixBuffer:t.instanceMatrixBuffer,updateAttributes:i})}createInstance(e,t,n,r,o){const a=new i.c(e.treeIndices.length,Float32Array),s=a.add(e.treeIndices),d=new i.c(e.colors.length,Uint8Array),c=d.add(e.colors),u=new i.c(e.instanceMatrices.length,Float32Array),p=u.add(e.instanceMatrices);this.addBatchDescriptor(r,s.batchId,c.batchId,p.batchId,o);const[m,h]=this.createInstancedBufferGeometry(t.vertices,t.indices,a,d,u);m.setDrawRange(3*e.triangleOffset,3*e.triangleCount);const f=new l.InstancedMesh(m,n,a.length);f.frustumCulled=!1,this._instancedAttributeMap.set(r,{mesh:f,treeIndexBuffer:a,colorBuffer:d,instanceMatrixBuffer:u,updateAttributes:h}),this._instancedMeshGroup.add(f),f.updateMatrixWorld(!0)}addBatchDescriptor(e,t,n,r,o){const i={instanceIdentifier:e,treeIndicesbatchId:t,colorsBatchId:n,instanceMatricesBatchId:r},a=this._processedSectorMap.get(o);a?a.push(i):this._processedSectorMap.set(o,[i])}}
|
|
341
|
+
*/async function Ke(e,t,r,n=15e3){let i=e;return new Promise(e=>{!function o(){for(let e=0;e<n&&i<=t;e++)r(i++);i<=t?setTimeout(o):e()}()})}
|
|
324
342
|
/*!
|
|
325
343
|
* Copyright 2021 Cognite AS
|
|
326
|
-
*/class
|
|
344
|
+
*/class $e{constructor(e,t,r){this.modelId=e,this.revisionId=t,this.nodesApiClient=r,this.nodeIdToTreeIndexMap=new Map,this.treeIndexToNodeIdMap=new Map,this.treeIndexSubTreeSizeMap=new Map,this.nodeIdRequestObservable=new d.Subject,this.nodeIdResponse=this.nodeIdRequestObservable.pipe(Object(v.bufferTime)(50),Object(v.filter)(e=>e.length>0),Object(v.mergeMap)(async e=>{const t=await this.nodesApiClient.mapNodeIdsToTreeIndices(this.modelId,this.revisionId,e);return e.map((e,r)=>({nodeId:e,treeIndex:t[r]}))}),Object(v.mergeAll)(),Object(v.tap)(e=>{this.nodeIdToTreeIndexMap.set(e.nodeId,e.treeIndex),this.treeIndexToNodeIdMap.set(e.treeIndex,e.nodeId)}),Object(v.share)()),this.treeIndexRequestObservable=new d.Subject,this.treeIndexResponse=this.treeIndexRequestObservable.pipe(Object(v.bufferTime)(50),Object(v.filter)(e=>e.length>0),Object(v.mergeMap)(async e=>{const t=await this.nodesApiClient.mapTreeIndicesToNodeIds(this.modelId,this.revisionId,e);return e.map((e,r)=>({nodeId:t[r],treeIndex:e}))}),Object(v.mergeAll)(),Object(v.tap)(e=>{this.nodeIdToTreeIndexMap.set(e.nodeId,e.treeIndex),this.treeIndexToNodeIdMap.set(e.treeIndex,e.nodeId)}),Object(v.share)()),this.subtreeSizeObservable=new d.Subject,this.subtreeSizeResponse=this.subtreeSizeObservable.pipe(Object(v.bufferTime)(50),Object(v.filter)(e=>e.length>0),Object(v.mergeMap)(async e=>this.nodesApiClient.determineTreeIndexAndSubtreeSizesByNodeIds(this.modelId,this.revisionId,e)),Object(v.mergeAll)(),Object(v.tap)(e=>{this.treeIndexSubTreeSizeMap.set(e.treeIndex,e.subtreeSize)}),Object(v.share)())}async getTreeIndex(e){const t=this.nodeIdToTreeIndexMap.get(e);if(void 0!==t)return t;const r=this.nodeIdResponse.pipe(Object(v.first)(t=>t.nodeId===e),Object(v.map)(e=>e.treeIndex)).toPromise();return this.nodeIdRequestObservable.next(e),await r}async getNodeId(e){const t=this.treeIndexToNodeIdMap.get(e);if(void 0!==t)return t;const r=this.treeIndexResponse.pipe(Object(v.first)(t=>t.treeIndex===e),Object(v.map)(e=>e.nodeId)).toPromise();return this.treeIndexRequestObservable.next(e),await r}async getSubtreeSize(e){const t=this.treeIndexSubTreeSizeMap.get(e);if(t)return t;const r=await this.getNodeId(e),n=this.subtreeSizeResponse.pipe(Object(v.first)(t=>t.treeIndex===e),Object(v.map)(e=>e.subtreeSize)).toPromise();return this.subtreeSizeObservable.next(r),await n}async getTreeIndices(e){const t=e.map(e=>this.nodeIdToTreeIndexMap.get(e)||-1),r=e.filter((e,r)=>-1===t[r]);if(0===r.length)return t;const n=new Map(e.map((e,t)=>[e,t])),i=await this.nodesApiClient.mapNodeIdsToTreeIndices(this.modelId,this.revisionId,r);console.assert(r.length===i.length);for(let e=0;e<i.length;e++){const o=r[e],a=i[e],s=n.get(o);t[s]=a,this.add(o,a)}return t}async getNodeIds(e){const t=e.map(e=>this.treeIndexToNodeIdMap.get(e)||-1),r=e.filter((e,r)=>-1===t[r]);if(0===r.length)return t;const n=new Map(e.map((e,t)=>[e,t])),i=await this.nodesApiClient.mapTreeIndicesToNodeIds(this.modelId,this.revisionId,r);console.assert(i.length===r.length);for(let e=0;e<i.length;e++){const o=i[e],a=r[e],s=n.get(a);t[s]=o,this.add(o,a)}return t}add(e,t){this.nodeIdToTreeIndexMap.set(e,t),this.treeIndexToNodeIdMap.set(t,e)}}
|
|
327
345
|
/*!
|
|
328
|
-
* Copyright
|
|
329
|
-
*/
|
|
346
|
+
* Copyright 2022 Cognite AS
|
|
347
|
+
*/
|
|
330
348
|
/*!
|
|
331
349
|
* Copyright 2021 Cognite AS
|
|
332
|
-
*/(n,
|
|
350
|
+
*/class et extends o.Object3D{constructor(e,t,r,n){super(),this.type="cad",this._styledNodeCollections=[],this.modelId=e,this.revisionId=t,this.cadModel=r.cadModelMetadata,this.nodesApiClient=n,this.nodeIdAndTreeIndexMaps=new $e(e,t,this.nodesApiClient),this.cadNode=r,this.add(this.cadNode),Object.defineProperty(this,"visible",{get:()=>this.cadNode.visible,set:e=>{this.cadNode.visible=e}})}get nodeTransformProvider(){return this.cadNode.nodeTransformProvider}get modelUnit(){return this.cadNode.cadModelMetadata.scene.unit}get modelUnitToMetersFactor(){return Object(m.q)(this.modelUnit)}setDefaultNodeAppearance(e){this.cadNode.defaultNodeAppearance=e}getDefaultNodeAppearance(){return this.cadNode.defaultNodeAppearance}get styledNodeCollections(){return[...this._styledNodeCollections]}assignStyledNodeCollection(e,t){p.a.trackCadModelStyled(e.classToken,t);const r=this._styledNodeCollections.findIndex(t=>t.nodeCollection===e);-1!==r?this._styledNodeCollections[r].appearance=t:this._styledNodeCollections.push({nodeCollection:e,appearance:t}),this.cadNode.nodeAppearanceProvider.assignStyledNodeCollection(e,t)}unassignStyledNodeCollection(e){const t=this._styledNodeCollections.findIndex(t=>t.nodeCollection===e);if(-1===t)throw new Error("Node collection has not been assigned to model");this._styledNodeCollections.splice(t,1),this.cadNode.nodeAppearanceProvider.unassignStyledNodeCollection(e)}removeAllStyledNodeCollections(){this._styledNodeCollections.splice(0),this.cadNode.nodeAppearanceProvider.clear()}setNodeTransform(e,t){this.nodeTransformProvider.setNodeTransform(e,t)}resetNodeTransform(e){this.nodeTransformProvider.resetNodeTransform(e)}mapFromCdfToModelCoordinates(e,t){return(t=void 0!==t?t:new o.Vector3)!==e&&t.copy(e),t.applyMatrix4(this.cadModel.modelMatrix),t}mapPositionFromModelToCdfCoordinates(e,t){return(t=void 0!==t?t:new o.Vector3)!==e&&t.copy(e),t.applyMatrix4(this.cadModel.inverseModelMatrix),t}mapBoxFromModelToCdfCoordinates(e,t){return(t=null!=t?t:new o.Box3)!==e&&t.copy(e),t.applyMatrix4(this.cadModel.inverseModelMatrix),t}mapBoxFromCdfToModelCoordinates(e,t){return(t=null!=t?t:new o.Box3)!==e&&t.copy(e),t.applyMatrix4(this.cadModel.modelMatrix),t}dispose(){this.children=[]}async getSubtreeTreeIndices(e){return this.determineTreeIndices(e,!0)}async getAncestorTreeIndices(e,t){const r=await this.mapTreeIndexToNodeId(e),n=await this.nodesApiClient.determineNodeAncestorsByNodeId(this.modelId,this.revisionId,r,t);return new u.j(n.treeIndex,n.subtreeSize)}getModelBoundingBox(e,t){const r=t?this.cadModel.scene.getBoundsOfMostGeometry():this.cadModel.scene.root.subtreeBoundingBox;return(e=e||new o.Box3).copy(r),e.applyMatrix4(this.cadModel.modelMatrix),e}getCameraConfiguration(){return this.cadModel.cameraConfiguration}setModelTransformation(e){this.cadNode.setModelTransformation(e)}getModelTransformation(e){return this.cadNode.getModelTransformation(e)}async getBoundingBoxByNodeId(e,t){try{return(t=(await this.nodesApiClient.getBoundingBoxesByNodeIds(this.modelId,this.revisionId,[e]))[0]).applyMatrix4(this.cadModel.modelMatrix),t}catch(e){throw p.a.trackError(e,{moduleName:"Cognite3DModel",methodName:"getBoundingBoxByNodeId"}),e}}async getBoundingBoxByTreeIndex(e,t){const r=await this.nodeIdAndTreeIndexMaps.getNodeId(e);return this.getBoundingBoxByNodeId(r,t)}iterateNodesByTreeIndex(e){return Ke(0,this.cadModel.scene.maxTreeIndex,e)}get nodeCount(){return this.cadModel.scene.maxTreeIndex+1}async iterateSubtreeByTreeIndex(e,t){const r=await this.determineTreeIndices(e,!0);return Ke(r.from,r.toInclusive,t)}async setNodeTransformByTreeIndex(e,t,r=!0){const n=await this.determineTreeIndices(e,r);return this.nodeTransformProvider.setNodeTransform(n,t),n.count}async resetNodeTransformByTreeIndex(e,t=!0){const r=await this.determineTreeIndices(e,t);return this.nodeTransformProvider.resetNodeTransform(r),r.count}async mapNodeIdsToTreeIndices(e){return this.nodeIdAndTreeIndexMaps.getTreeIndices(e)}async mapNodeIdToTreeIndex(e){return this.nodeIdAndTreeIndexMaps.getTreeIndex(e)}async mapTreeIndicesToNodeIds(e){return this.nodeIdAndTreeIndexMaps.getNodeIds(e)}async mapTreeIndexToNodeId(e){return this.nodeIdAndTreeIndexMaps.getNodeId(e)}async determineTreeIndices(e,t){let r=1;if(t){const t=await this.nodeIdAndTreeIndexMaps.getSubtreeSize(e);r=t||1}return new u.j(e,r)}}
|
|
333
351
|
/*!
|
|
334
|
-
* Copyright
|
|
335
|
-
*/
|
|
352
|
+
* Copyright 2022 Cognite AS
|
|
353
|
+
*/var tt=r(10);
|
|
336
354
|
/*!
|
|
337
355
|
* Copyright 2021 Cognite AS
|
|
338
|
-
*/
|
|
339
|
-
class mt{static async*raceUntilAllCompleted(e){const t=new Map(e.map(e=>[e,e.then(t=>[e,{result:t}]).catch(t=>[e,{error:t}])]));for(;t.size>0;){const[e,n]=await Promise.race(t.values());t.delete(e),yield n}}}
|
|
356
|
+
*/const rt=new o.Vector2,nt=new o.Raycaster;function it(e,t,r=.05){const{normalizedCoords:n,camera:i}=t;rt.set(n.x,n.y),nt.setFromCamera(n,i),nt.params.Points={threshold:r};return nt.intersectObjects(e,!0).filter(e=>function(e,t){let r=!0;for(let n=0;r&&n<t.length;++n)r=t[n].distanceToPoint(e)>=0;return r}
|
|
340
357
|
/*!
|
|
341
358
|
* Copyright 2021 Cognite AS
|
|
342
|
-
*/
|
|
359
|
+
*/(e.point,t.clippingPlanes)).map(t=>{const r=function(e,t){for(;"Points"===e.type&&null!==e.parent;)e=e.parent;if(e instanceof tt.PointCloudOctree){const r=e.root;return t.find(e=>r.pointcloud===e.potreeNode.octtree)||null}return null}(t.object,e);if(null===r)throw new Error("Could not find PointCloudNode for intersected point");return{distance:t.distance,point:t.point,pointIndex:t.index,pointCloudNode:r,object:t.object}})}var ot,at,st,ct,lt,dt,ft;(at=ot||(ot={}))[at.Circle=tt.PointShape.CIRCLE]="Circle",at[at.Square=tt.PointShape.SQUARE]="Square",(ct=st||(st={}))[ct.Rgb=tt.PointColorType.RGB]="Rgb",ct[ct.Depth=tt.PointColorType.DEPTH]="Depth",ct[ct.Height=tt.PointColorType.HEIGHT]="Height",ct[ct.PointIndex=tt.PointColorType.POINT_INDEX]="PointIndex",ct[ct.LevelOfDetail=tt.PointColorType.LOD]="LevelOfDetail",ct[ct.Classification=tt.PointColorType.CLASSIFICATION]="Classification",ct[ct.Intensity=tt.PointColorType.INTENSITY]="Intensity",(dt=lt||(lt={}))[dt.Adaptive=tt.PointSizeType.ADAPTIVE]="Adaptive",dt[dt.Fixed=tt.PointSizeType.FIXED]="Fixed",function(e){e[e.Default=-1]="Default",e[e.Created=0]="Created",e[e.Unclassified=1]="Unclassified",e[e.Ground=2]="Ground",e[e.LowVegetation=3]="LowVegetation",e[e.MedVegetation=4]="MedVegetation",e[e.HighVegetation=5]="HighVegetation",e[e.Building=6]="Building",e[e.LowPoint=7]="LowPoint",e[e.ReservedOrHighPoint=8]="ReservedOrHighPoint",e[e.Water=9]="Water",e[e.Rail=10]="Rail",e[e.RoadSurface=11]="RoadSurface",e[e.ReservedOrBridgeDeck=12]="ReservedOrBridgeDeck",e[e.WireGuard=13]="WireGuard",e[e.WireConductor=14]="WireConductor",e[e.TransmissionTower=15]="TransmissionTower",e[e.WireStructureConnector=16]="WireStructureConnector",e[e.BridgeDeck=17]="BridgeDeck",e[e.HighNoise=18]="HighNoise",e[e.OverheadStructure=19]="OverheadStructure",e[e.IgnoredGround=20]="IgnoredGround",e[e.Snow=21]="Snow",e[e.TemporalExclusion=22]="TemporalExclusion",e[e.UserDefinableOffset=64]="UserDefinableOffset"}(ft||(ft={}));class ut extends o.Group{constructor(e,t,r){super(),this.name="PointCloudNode",this._potreeGroup=e,this._potreeNode=t,this._cameraConfiguration=r,this.add(this._potreeGroup),this.matrixAutoUpdate=!1}get potreeGroup(){return this._potreeGroup}get potreeNode(){return this._potreeNode}get hasCameraConfiguration(){return void 0!==this._cameraConfiguration}get cameraConfiguration(){return this._cameraConfiguration}get needsRedraw(){return this._potreeGroup.needsRedraw}requestRedraw(){this._potreeGroup.requestRedraw()}get pointSize(){return this._potreeNode.pointSize}set pointSize(e){this._potreeNode.pointSize=e}get pointSizeType(){return this._potreeNode.pointSizeType}set pointSizeType(e){this._potreeNode.pointSizeType=e}get pointBudget(){return this._potreeNode.pointBudget}set pointBudget(e){this._potreeNode.pointBudget=e}get visiblePointCount(){return this._potreeNode.visiblePointCount}get pointColorType(){return this._potreeNode.pointColorType}set pointColorType(e){this._potreeNode.pointColorType=e}get pointShape(){return this._potreeNode.pointShape}set pointShape(e){this._potreeNode.pointShape=e}setClassVisible(e,t){if(!this.hasClass(e))throw new Error("Point cloud model doesn't have class "+e);const r=pt(e);this._potreeNode.classification[r].w=t?1:0,this._potreeNode.recomputeClassification(),this.requestRedraw()}isClassVisible(e){if(!this.hasClass(e))throw new Error("Point cloud model doesn't have class "+e);const t=pt(e);return 0!==this._potreeNode.classification[t].w}hasClass(e){const t=pt(e);return void 0!==this._potreeNode.classification[t]}getClasses(){return Object.keys(this._potreeNode.classification).map(e=>"DEFAULT"===e?-1:parseInt(e,10)).sort((e,t)=>e-t)}getBoundingBox(e){return(e=e||new o.Box3).copy(this._potreeNode.boundingBox),e.applyMatrix4(this.matrixWorld),e}setModelTransformation(e){this.matrix.copy(e),this.updateMatrixWorld(!0)}getModelTransformation(e=new o.Matrix4){return e.copy(this.matrix)}}function pt(e){return e===ft.Default?"DEFAULT":e}
|
|
343
360
|
/*!
|
|
344
361
|
* Copyright 2021 Cognite AS
|
|
345
|
-
*/
|
|
346
|
-
const ht=new l.Box3(new l.Vector3(-1,-1,-1),new l.Vector3(1,1,1)),ft=new l.Box3;function vt(e,t){return function(e,t,n){const r=void 0!==n?n:new l.Box3;r.makeEmpty(),Object(i.x)(e,e=>{e.project(t),r.expandByPoint(e)})}(t,e,ft),ft.intersect(ht),ft.isEmpty()?0:.25*(ft.max.x-ft.min.x)*(ft.max.y-ft.min.y)}
|
|
362
|
+
*/class mt extends o.Object3D{constructor(e=200){super(),this._needsRedraw=!1,this._lastDrawPointBuffersHash=0,this._forceLoadingSubject=new d.Subject,this.nodes=[],this.numNodesLoadingAfterLastRedraw=0,this.numChildrenAfterLastRedraw=0,this.potreeGroup=new tt.Group,this.potreeGroup.name="Potree.Group",this.name="Potree point cloud wrapper",this.add(this.potreeGroup);const t=new o.Mesh(new o.BufferGeometry);t.name="onAfterRender trigger (no geometry)",t.frustumCulled=!1,t.onAfterRender=()=>{this.resetRedraw(),this._lastDrawPointBuffersHash=this.pointBuffersHash},this.add(t),this._loadingObservable=this.createLoadingStateObservable(e),this._lastDrawPointBuffersHash=this.pointBuffersHash,this.pointBudget=2e6}get needsRedraw(){return this._needsRedraw||this._lastDrawPointBuffersHash!==this.pointBuffersHash||tt.Global.numNodesLoading!==this.numNodesLoadingAfterLastRedraw||this.numChildrenAfterLastRedraw!==this.potreeGroup.children.length||this.nodes.some(e=>e.needsRedraw)}get pointBudget(){return this.potreeGroup.pointBudget}set pointBudget(e){this.potreeGroup.pointBudget=e}getLoadingStateObserver(){return this._loadingObservable}addPointCloud(e){this.potreeGroup.add(e.octtree),this.nodes.push(e),this._forceLoadingSubject.next(),this.requestRedraw()}removePointCloud(e){const t=this.nodes.indexOf(e);if(-1===t)throw new Error("Point cloud is not added - cannot remove it");this.potreeGroup.remove(e.octtree),this.nodes.splice(t,1)}requestRedraw(){this._needsRedraw=!0}resetRedraw(){this._needsRedraw=!1,this.numNodesLoadingAfterLastRedraw=tt.Global.numNodesLoading,this.numChildrenAfterLastRedraw=this.potreeGroup.children.length,this.nodes.forEach(e=>e.resetRedraw())}createLoadingStateObservable(e){const t=this._forceLoadingSubject.pipe((r=5*e,Object(d.pipe)(Object(v.switchMap)(()=>Object(d.of)(!1).pipe(Object(v.delay)(r),Object(v.startWith)(!0))),Object(v.distinctUntilChanged)())));var r;return Object(d.combineLatest)([Object(d.interval)(e).pipe(Object(v.map)(()=>function(e){const t=tt.Global.numNodesLoading;return{isLoading:t>0,itemsLoaded:e.length-t,itemsRequested:e.length,itemsCulled:0}}
|
|
347
363
|
/*!
|
|
348
364
|
* Copyright 2021 Cognite AS
|
|
349
|
-
*/
|
|
365
|
+
*/(this.nodes)),Object(v.distinctUntilChanged)((e,t)=>e.isLoading===t.isLoading&&e.itemsLoaded===t.itemsLoaded&&e.itemsRequested===t.itemsRequested)),t]).pipe(Object(v.map)(e=>{const[t,r]=e;return r&&!t.isLoading?{isLoading:!0,itemsLoaded:0,itemsRequested:1,itemsCulled:0}:t}),Object(v.startWith)({isLoading:!1,itemsLoaded:0,itemsRequested:0,itemsCulled:0}),Object(v.distinctUntilChanged)(),Object(v.share)())}get pointBuffersHash(){const e=this.potreeGroup.pointclouds;let t=3131961357;for(const r of e)r.traverseVisible(e=>{if(e.isPoints){const r=e.geometry;t^=r.getAttribute("position").count}}),t^=r.id;return t}}class ht{constructor(e,t){this._pointCloudMetadataRepository=e,this._pointCloudFactory=t,this._pointCloudGroupWrapper=new mt}requestRedraw(){this._pointCloudGroupWrapper.requestRedraw()}resetRedraw(){this._pointCloudGroupWrapper.resetRedraw()}get pointBudget(){return this._pointCloudGroupWrapper.pointBudget}set pointBudget(e){this._pointCloudGroupWrapper.pointBudget=e}get needsRedraw(){return this._pointCloudGroupWrapper.needsRedraw}set clippingPlanes(e){this._pointCloudGroupWrapper.traverse(t=>{if(t.material){const r=t.material;r.clipping=!0,r.clipIntersection=!1,r.clippingPlanes=e}})}getLoadingStateObserver(){return this._pointCloudGroupWrapper.getLoadingStateObserver()}updateCamera(e){}async addModel(e){const t=await this._pointCloudMetadataRepository.loadData(e);p.a.trackLoadModel({type:"pointcloud"},e,t.formatVersion);const r=this._pointCloudFactory.createModel(t);this._pointCloudGroupWrapper.addPointCloud(r);const n=new ut(this._pointCloudGroupWrapper,r,t.cameraConfiguration);return n.setModelTransformation(t.modelMatrix),n}removeModel(e){this._pointCloudGroupWrapper.removePointCloud(e.potreeNode)}}
|
|
350
366
|
/*!
|
|
351
367
|
* Copyright 2021 Cognite AS
|
|
352
|
-
*/
|
|
368
|
+
*/const bt=(new o.Matrix4).identity();class vt{constructor(e,t,r="ept.json"){this._modelMetadataProvider=e,this._modelDataProvider=t,this._blobFileName=r}async loadData(e){const t=await this.getSupportedOutput(e),r=this._modelMetadataProvider.getModelUri(e,t),n=this._modelMetadataProvider.getModelMatrix(e,t.format),i=this._modelMetadataProvider.getModelCamera(e),o=await r,a=await n,s=await this._modelDataProvider.getJsonFile(o,this._blobFileName),c=await i;return{format:t.format,formatVersion:t.version,modelBaseUrl:o,modelMatrix:a,cameraConfiguration:Object(u.x)(c,bt),scene:s}}async getSupportedOutput(e){const t=(await this._modelMetadataProvider.getModelOutputs(e)).find(e=>e.format===L.d.EptPointCloud);if(!t)throw new Error(`Model does not contain supported point cloud output [${L.d.EptPointCloud}]`);return t}}
|
|
353
369
|
/*!
|
|
354
370
|
* Copyright 2021 Cognite AS
|
|
355
|
-
*/class
|
|
371
|
+
*/class gt{constructor(e){this._needsRedraw=!1,this.octtree=e,this.pointSize=2,this.pointSizeType=lt.Adaptive,this.pointColorType=st.Rgb,this.pointShape=ot.Circle,this.pointBudget=1/0}get needsRedraw(){return this._needsRedraw}get pointSize(){return this.octtree.material.size}set pointSize(e){this.octtree.material.size=e,this._needsRedraw=!0}get pointSizeType(){return this.octtree.material.pointSizeType}set pointSizeType(e){this.octtree.material.pointSizeType=e,this._needsRedraw=!0}get pointBudget(){return this.octtree.pointBudget}set pointBudget(e){this.octtree.pointBudget=e,this._needsRedraw=!0}get visiblePointCount(){return this.octtree.numVisiblePoints||0}get boundingBox(){const e=this.octtree.pcoGeometry.tightBoundingBox||this.octtree.pcoGeometry.boundingBox||this.octtree.boundingBox,t=new o.Vector3(e.min.x,e.min.z,-e.min.y),r=new o.Vector3(e.max.x,e.max.z,-e.max.y);return(new o.Box3).setFromPoints([t,r])}get pointColorType(){return this.octtree.material.pointColorType}set pointColorType(e){this.octtree.material.pointColorType=e,this._needsRedraw=!0}get pointShape(){return this.octtree.material.shape}set pointShape(e){this.octtree.material.shape=e,this._needsRedraw=!0}get classification(){return this.octtree.material.classification}recomputeClassification(){this.octtree.material.recomputeClassification()}resetRedraw(){this._needsRedraw=!1}}
|
|
356
372
|
/*!
|
|
357
373
|
* Copyright 2021 Cognite AS
|
|
358
|
-
*/class
|
|
374
|
+
*/class At{constructor(e){this._httpHeadersProvider=e}createModel(e){this.initializePointCloudXhrRequestHeaders();const{modelBaseUrl:t,scene:r}=e,n=new tt.PointCloudEptGeometry(t+"/",r),i=n.offset.x,o=n.offset.y,a=n.offset.z,s=new tt.PointCloudEptGeometryNode(n,n.boundingBox,0,i,o,a);n.root=s,n.root.load();const c=new tt.PointCloudOctree(n);c.name="PointCloudOctree: "+t;return new gt(c)}initializePointCloudXhrRequestHeaders(){const e=this._httpHeadersProvider.headers;let t=tt.XHRFactory.config.customHeaders;for(const[r,n]of Object.entries(e))t=t.filter(e=>e.header!==r),t.push({header:r,value:n});tt.XHRFactory.config.customHeaders=t.filter(e=>e.header)}}
|
|
359
375
|
/*!
|
|
360
376
|
* Copyright 2021 Cognite AS
|
|
361
377
|
*/
|
|
362
378
|
/*!
|
|
363
379
|
* Copyright 2021 Cognite AS
|
|
364
|
-
*/
|
|
365
|
-
|
|
366
|
-
* Copyright 2022 Cognite AS
|
|
367
|
-
*/class At{constructor(){this._state="pending",this._promise=new Promise((e,t)=>{this._resolve=e,this._reject=t})}get state(){return this._state}finally(e){return this._promise.finally(e)}then(e,t){return this._promise.then(e,t)}catch(e){return this._promise.catch(e)}resolve(e){this._resolve(e),this._state="fulfilled"}reject(e){this._reject(e),this._state="rejected"}}Symbol.toStringTag;
|
|
380
|
+
*/
|
|
381
|
+
class _t extends o.Object3D{constructor(e,t,r){super(),this.type="pointcloud",this.modelId=e,this.revisionId=t,this.pointCloudNode=r,this.add(r)}dispose(){this.children=[]}getModelBoundingBox(e){return this.pointCloudNode.getBoundingBox(e)}getCameraConfiguration(){return this.pointCloudNode.cameraConfiguration}setModelTransformation(e){this.pointCloudNode.setModelTransformation(e)}getModelTransformation(e){return this.pointCloudNode.getModelTransformation(e)}setClassVisible(e,t){this.pointCloudNode.setClassVisible(e,t)}isClassVisible(e){return this.pointCloudNode.isClassVisible(e)}hasClass(e){return this.pointCloudNode.hasClass(e)}getClasses(){return this.pointCloudNode.getClasses()}get visiblePointCount(){return this.pointCloudNode.visiblePointCount}get pointColorType(){return this.pointCloudNode.pointColorType}set pointColorType(e){this.pointCloudNode.pointColorType=e}get pointSize(){return this.pointCloudNode.pointSize}set pointSize(e){this.pointCloudNode.pointSize=e}get pointShape(){return this.pointCloudNode.pointShape}set pointShape(e){this.pointCloudNode.pointShape=e}}
|
|
368
382
|
/*!
|
|
369
383
|
* Copyright 2022 Cognite AS
|
|
370
384
|
*/
|
|
371
|
-
class Rt{constructor(e=20){this._maxConcurrentSectorDownloads=e,this._pendingSectorDownloads=new Map,this._queuedSectorDownloads=new Map,this._sectorDownloadQueue=[]}get numberOfPendingDownloads(){return this._pendingSectorDownloads.size}get numberOfQueuedDownloads(){return this._queuedSectorDownloads.size}queueSectorBatchForDownload(e){return e.map(e=>{const{sector:t,downloadSector:n}=e,r=this.getSectorIdentifier(t.modelIdentifier,t.metadata.id),o=this._pendingSectorDownloads.get(r);return void 0!==o?o:this._pendingSectorDownloads.size<this._maxConcurrentSectorDownloads?this.addSectorToPendingDownloads(n,t,r):this.getOrAddToQueuedDownloads(t,r,n)})}getOrAddToQueuedDownloads(e,t,n){const r=this._queuedSectorDownloads.get(t);if(void 0!==r){const{queuedDeferredPromise:e}=r;return e}const o=new At;return this._sectorDownloadQueue.push(t),this._queuedSectorDownloads.set(t,{sector:e,downloadSector:n,queuedDeferredPromise:o}),o}addSectorToPendingDownloads(e,t,n){const r=e(t).catch(e=>(wt.a.error("Failed to load sector",t,"error:",e),{modelIdentifier:t.modelIdentifier,metadata:t.metadata,levelOfDetail:W.c.Discarded,group:void 0,instancedMeshes:void 0}));return this._pendingSectorDownloads.set(n,r),this.processNextQueuedSectorDownload(r,n),r}processNextQueuedSectorDownload(e,t){e.then(e=>{this._pendingSectorDownloads.delete(t);const n=this._sectorDownloadQueue.shift();if(void 0===n)return;const r=this._queuedSectorDownloads.get(n);this._queuedSectorDownloads.delete(n),o()(void 0!==r);const{sector:i,downloadSector:a,queuedDeferredPromise:s}=r,d=a(i);this._pendingSectorDownloads.set(n,d),d.then(e=>{s.resolve(e)}),this.processNextQueuedSectorDownload(d,n)})}getSectorIdentifier(e,t){return`${t}-${e}`}}
|
|
372
385
|
/*!
|
|
373
386
|
* Copyright 2021 Cognite AS
|
|
374
|
-
*/class
|
|
387
|
+
*/class xt extends Error{constructor(e){super(e)}}
|
|
375
388
|
/*!
|
|
376
389
|
* Copyright 2021 Cognite AS
|
|
377
|
-
*/
|
|
390
|
+
*/class yt{constructor(e){this.redraw=()=>{this._needsRedraw=!0},this._camera=e,this._needsRedraw=!0,this._lastCameraPosition=new o.Vector3,this._lastCameraRotation=new o.Euler,this._lastCameraZoom=0,window.addEventListener("focus",this.redraw)}get needsRedraw(){return this._needsRedraw}update(){const{_camera:e,_lastCameraPosition:t,_lastCameraRotation:r,_lastCameraZoom:n}=this,{position:i,rotation:o,zoom:a}=e,s=!i.equals(t)||!o.equals(r)||a!==n;t.copy(i),r.copy(o),this._lastCameraZoom=a,s&&(this._needsRedraw=!0)}dispose(){window.removeEventListener("focus",this.redraw)}clearNeedsRedraw(){this._needsRedraw=!1}}
|
|
378
391
|
/*!
|
|
379
392
|
* Copyright 2021 Cognite AS
|
|
380
|
-
*/
|
|
393
|
+
*/
|
|
394
|
+
class kt{constructor(e){this._loading=!1,kt.loadStyles(),this.el=document.createElement("div"),this.el.title=kt.titles.idle,this.el.className=kt.classnames.base,this.el.classList.add(kt.classnames.topLeft),this.el.innerHTML='<svg fill="none" xmlns="http://www.w3.org/2000/svg" width="64" height="38" viewBox="0 0 64 38">\n <path id="reveal-spinner-top-1" fill-rule="evenodd" clip-rule="evenodd" fill="currentColor" d="M50.4542 15.3288c-28.2275 5.9674-28.7378 6.0661-29.2355 6.1624h-.0001c-1.3944.2698-2.6891.5203-3.9772.7036v-6.3583c-.0652-1.475-1.2799-2.6372-2.7563-2.6372s-2.6911 1.1622-2.7563 2.6372v7.1072z"/>\n <path id="reveal-spinner-top-2" fill-rule="evenodd" clip-rule="evenodd" fill="currentColor" d="M50.4542 15.3288c-16.8452 3.375-17.0189 3.4183-17.1711 3.506-1.7276.3694-3.3435.7389-4.9594 1.1083l-.0571.013V7.6106c-.0465-1.48876-1.2668-2.67155-2.7563-2.67155S22.8005 6.12184 22.754 7.6106v13.5866z"/>\n <path id="reveal-spinner-top-3" fill-rule="evenodd" clip-rule="evenodd" fill="currentColor" d="M50.4542 15.3288c-7.274 1.2593-9.1537 1.6344-11.0347 2.0095V2.74337c-.0338-1.54541-1.3116-2.7721267-2.8571-2.74285692h-.0134C35.0327.00556379 33.8015 1.2272 33.7846 2.74337V18.7098z"/>\n <path id="reveal-spinner-top-4" fill-rule="evenodd" clip-rule="evenodd" fill="currentColor" d="M50.4542 15.3288v-3.2274c0-1.5594-1.2642-2.82358-2.8236-2.82358s-2.8235 1.26418-2.8235 2.82358v4.4z"/>\n <path id="reveal-spinner-center" fill-rule="evenodd" clip-rule="evenodd" fill="currentColor" d="M50.4542 15.3288C5.46324 23.6926 1.83164 23.4439 1.45248 22.3172c-.773329-1.6548 3.63593-3.8942 5.79662-4.9915.28489-.1447.53068-.2695.72036-.3706v-.1237h-.12505c-1.62823.6226-8.646718 3.4958-7.768735 5.9832.875294 2.7456 11.653125 3.4958 34.086725-1.9939 18.7926-4.6145 27.4393-5.4925 28.3173-3.7446.6266 1.4952-4.0121 4.3644-8.5217 6.3597-.0966.0984-.1427.2357-.125.3724l.002.002c.1243.1244.2474.2475.3745.1231 1.6268-.6266 10.1499-4.238 9.7721-7.2323-.3738-1.9935-4.8842-2.6175-13.5274-1.3722z"/>\n <path id="reveal-spinner-bot-1" fill-rule="evenodd" clip-rule="evenodd" fill="currentColor" d="M11.7557 30.5551v-2.0894c1.8291-.1048 3.6511-.3108 5.4575-.6171v2.7065c-.033 1.4835-1.245 2.6689-2.7288 2.6689s-2.6958-1.1854-2.7287-2.6689z"/>\n <path id="reveal-spinner-bot-2" fill-rule="evenodd" clip-rule="evenodd" fill="currentColor" d="M22.7715 26.9222v7.602c-.0132 1.496 1.1804 2.7238 2.6762 2.7529 1.4957.0291 2.7362-1.1513 2.7813-2.6467v-8.8309c-1.7953.4821-3.6177.857-5.4575 1.1227z"/>\n <path id="reveal-spinner-bot-3" fill-rule="evenodd" clip-rule="evenodd" fill="currentColor" d="M33.87 24.7193h-.3764v5.3419c.066 1.5151 1.3136 2.7095 2.8302 2.7095s2.7642-1.1944 2.8303-2.7095v-6.5883c-.3876.0886-.7821.1771-1.1838.2671l-.0007.0002c-1.2926.2897-2.6585.5959-4.0996.9764v.0027z"/>\n <path id="reveal-spinner-bot-4" fill-rule="evenodd" clip-rule="evenodd" fill="currentColor" d="M44.5094 22.2377c2.1383-.3726 4.0242-.7438 5.6578-1.1137v4.3375c-.0249 1.5094-1.2534 2.7212-2.763 2.7254h-.0162c-.7432.0206-1.4641-.255-2.004-.7662-.54-.5112-.8546-1.216-.8746-1.9592v-3.2238z"/>\n</svg>\n',e.style.position="relative",e.appendChild(this.el)}static loadStyles(){if(document.getElementById(kt.stylesId))return;const e=document.createElement("style");e.id=kt.stylesId,e.appendChild(document.createTextNode(".reveal-viewer-spinner-top-left {\n top: 10px;\n left: 10px;\n}\n\n.reveal-viewer-spinner-top-right {\n top: 10px;\n right: 10px;\n}\n\n.reveal-viewer-spinner-bottom-left {\n bottom: 10px;\n left: 10px;\n}\n\n.reveal-viewer-spinner-bottom-right {\n bottom: 10px;\n right: 10px;\n}\n\n.reveal-viewer-spinner {\n position: absolute;\n color: white;\n}\n.reveal-viewer-spinner--dark {\n color: black;\n}\n\n.reveal-viewer-spinner--loading #reveal-spinner-bot-1,\n.reveal-viewer-spinner--loading #reveal-spinner-top-1 {\n animation: reveal-loading-opacity 0.8s ease-out infinite alternate;\n}\n.reveal-viewer-spinner--loading #reveal-spinner-bot-2,\n.reveal-viewer-spinner--loading #reveal-spinner-top-2 {\n animation: reveal-loading-opacity 0.8s ease-out 0.2s infinite alternate;\n}\n.reveal-viewer-spinner--loading #reveal-spinner-bot-3,\n.reveal-viewer-spinner--loading #reveal-spinner-top-3 {\n animation: reveal-loading-opacity 0.8s ease-out 0.4s infinite alternate;\n}\n.reveal-viewer-spinner--loading #reveal-spinner-bot-4,\n.reveal-viewer-spinner--loading #reveal-spinner-top-4 {\n animation: reveal-loading-opacity 0.8s ease-out 0.6s infinite alternate;\n}\n\n.reveal-viewer-spinner--loading #center {\n transform-origin: center;\n animation: reveal-loading-scale 1.6s ease-out infinite 0.8s alternate,\n reveal-loading-opacity 1.6s ease-out infinite alternate;\n}\n\n@keyframes reveal-loading-opacity {\n 0% {\n opacity: 1;\n }\n 100% {\n opacity: 0.2;\n }\n}\n\n@keyframes reveal-loading-scale {\n 100% {\n transform: scaleY(1.2) translateY(0.6px);\n }\n}\n")),document.head.appendChild(e)}set placement(e){switch(this.el.classList.remove(kt.classnames.bottomLeft,kt.classnames.bottomRight,kt.classnames.topLeft,kt.classnames.topRight),e){case"topLeft":this.el.classList.add(kt.classnames.topLeft);break;case"topRight":this.el.classList.add(kt.classnames.topRight);break;case"bottomLeft":this.el.classList.add(kt.classnames.bottomLeft);break;case"bottomRight":this.el.classList.add(kt.classnames.bottomRight);break;default:Object(u.m)(e,"Invalid placement: "+e)}}set opacity(e){this.el.style.opacity=""+e}get loading(){return this._loading}set loading(e){this._loading=e,e?(this.el.classList.add(kt.classnames.loading),this.el.title=kt.titles.loading):(this.el.classList.remove(kt.classnames.loading),this.el.title=kt.titles.idle)}updateBackgroundColor(e){const{l:t}=e.getHSL({h:0,s:0,l:0});t>.5?this.el.classList.add(kt.classnames.dark):this.el.classList.remove(kt.classnames.dark)}dispose(){this.el.remove();const e=document.getElementById(kt.stylesId);e&&e.remove()}}kt.stylesId="reveal-viewer-spinner-styles",kt.classnames={base:"reveal-viewer-spinner",topLeft:"reveal-viewer-spinner-top-left",topRight:"reveal-viewer-spinner-top-right",bottomLeft:"reveal-viewer-spinner-bottom-left",bottomRight:"reveal-viewer-spinner-bottom-right",loading:"reveal-viewer-spinner--loading",dark:"reveal-viewer-spinner--dark"},kt.titles={idle:"3.0.0",loading:"3.0.0 Loading..."};
|
|
395
|
+
/*!
|
|
396
|
+
* Copyright 2021 Cognite AS
|
|
397
|
+
*/
|
|
398
|
+
class Tt{constructor(e){this._changedEvent=new u.e,this._classToken=e}get classToken(){return this._classToken}on(e,t){E()("changed"===e),this._changedEvent.subscribe(t)}off(e,t){E()("changed"===e),this._changedEvent.unsubscribe(t)}notifyChanged(){this._changedEvent.fire()}}class wt extends Tt{constructor(e,t){super(e),this._cachedCombinedIndexSet=void 0,this._nodeCollections=[],this._changedUnderlyingNodeCollectionHandler=this.makeDirty.bind(this),t&&t.forEach(e=>this.add(e))}add(e){e.on("changed",this._changedUnderlyingNodeCollectionHandler),this._nodeCollections.push(e),this.makeDirty()}remove(e){const t=this._nodeCollections.indexOf(e);if(t<0)throw new Error("Could not find set");e.off("changed",this._changedUnderlyingNodeCollectionHandler),this._nodeCollections.splice(t,1),this.makeDirty()}clear(){throw new Error(this.classToken+" does not support clear()")}makeDirty(){void 0!==this._cachedCombinedIndexSet&&(this._cachedCombinedIndexSet=void 0,this.notifyChanged())}getIndexSet(){var e;return this._cachedCombinedIndexSet=null!==(e=this._cachedCombinedIndexSet)&&void 0!==e?e:this.createCombinedIndexSet(),this._cachedCombinedIndexSet}get isLoading(){return this._nodeCollections.some(e=>e.isLoading)}}
|
|
381
399
|
/*!
|
|
382
400
|
* Copyright 2021 Cognite AS
|
|
383
|
-
*/
|
|
401
|
+
*/class Ct{constructor(e){this.addedSinceSquash=0,this._surfaceAreaVars={size:new o.Vector3},this._shouldMergeBoxesVars={inputBox:new o.Box3},this.resultBoxes=null!=e?e:[]}mergeBoxesAtIndices(e,t){this.resultBoxes[e].union(this.resultBoxes[t]),this.resultBoxes[t]=this.resultBoxes[this.resultBoxes.length-1],this.resultBoxes.pop()}surfaceArea(e){const{size:t}=this._surfaceAreaVars;return e.getSize(t),2*(t.x*t.y+t.y*t.z+t.z*t.x)}shouldMergeBoxes(e,t){const{inputBox:r}=this._shouldMergeBoxesVars;r.copy(e);const n=r.union(t);return this.surfaceArea(n)<1*(this.surfaceArea(e)+this.surfaceArea(t))+8}addBox(e){let t=!1;for(let r=0;r<this.resultBoxes.length;r++)if(this.shouldMergeBoxes(e,this.resultBoxes[r])){this.resultBoxes[r].union(e),t=!0;break}t||this.resultBoxes.push(e.clone()),this.addedSinceSquash+=1}get boxCount(){return this.resultBoxes.length}addBoxes(e){for(const t of e)this.addBox(t)}squashBoxes(){for(let e=0;e<this.resultBoxes.length;e++)for(let t=e+1;t<this.resultBoxes.length;t++){this.shouldMergeBoxes(this.resultBoxes[e],this.resultBoxes[t])&&(this.mergeBoxesAtIndices(e,t),t--)}}*getBoxes(){this.addedSinceSquash>.3*this.resultBoxes.length&&(this.squashBoxes(),this.addedSinceSquash=0);for(const e of this.resultBoxes)yield e.clone()}intersectsBox(e){for(const t of this.resultBoxes)if(e.intersectsBox(t))return!0;return!1}union(e){const t=[];for(const e of this.resultBoxes)t.push(e.clone());const r=new Ct(t);return r.addBoxes(e),r}addIntersectionIfNonempty(e,t,r){const n=e.clone().intersect(t);n.isEmpty()||r.push(n)}intersection(e){const t=[...e],r=this.resultBoxes,n=[];for(const e of r)for(const r of t)this.addIntersectionIfNonempty(e,r,n);const i=new Ct(n);return i.squashBoxes(),i}}
|
|
384
402
|
/*!
|
|
385
403
|
* Copyright 2021 Cognite AS
|
|
386
|
-
*/class
|
|
404
|
+
*/class Mt{constructor(){this._clusterer=new Ct}get isEmpty(){return 0==this._clusterer.boxCount}*areas(){yield*this._clusterer.getBoxes()}intersectsBox(e){for(const t of this._clusterer.getBoxes())if(e.intersectsBox(t))return!0;return!1}addAreas(e){this._clusterer.addBoxes(e)}intersectWith(e){this._clusterer.intersection(e)}}class It extends wt{constructor(e){super(It.classToken,e),this._cachedNodeAreas=void 0}serialize(){return{token:this.classToken,state:{subCollections:this._nodeCollections.map(e=>e.serialize())}}}createCombinedIndexSet(){if(0===this._nodeCollections.length)return new u.f;const e=this._nodeCollections[0].getIndexSet().clone();for(let t=1;t<this._nodeCollections.length;++t)e.unionWith(this._nodeCollections[t].getIndexSet());return e}getAreas(){if(this._cachedNodeAreas)return this._cachedNodeAreas;const e=new Mt;for(let t=0;t<this._nodeCollections.length;++t)e.addAreas(this._nodeCollections[t].getAreas().areas());return this._cachedNodeAreas=e,e}}It.classToken="UnionNodeCollection";
|
|
387
405
|
/*!
|
|
388
406
|
* Copyright 2021 Cognite AS
|
|
389
407
|
*/
|
|
390
|
-
|
|
408
|
+
class St{constructor(){}static instance(){return St._instance=St._instance||new St,St._instance}*areas(){}intersectsBox(e){return!1}addAreas(e){throw new Error("addAreas() not defined for EmptyAreaCollection")}intersectWith(e){}get isEmpty(){return!0}}class Nt extends wt{constructor(e){super(It.classToken,e),this._cachedNodeAreas=void 0}serialize(){return{token:this.classToken,state:{subCollections:this._nodeCollections.map(e=>e.serialize())}}}createCombinedIndexSet(){if(0===this._nodeCollections.length)return new u.f;const e=this._nodeCollections[0].getIndexSet().clone();for(let t=1;t<this._nodeCollections.length;++t)e.intersectWith(this._nodeCollections[t].getIndexSet());return e}makeDirty(){super.makeDirty(),this._cachedNodeAreas=void 0}getAreas(){if(this._cachedNodeAreas)return this._cachedNodeAreas;if(0===this._nodeCollections.length)return this._cachedNodeAreas=St.instance(),this._cachedNodeAreas;const e=new Mt;e.addAreas(this._nodeCollections[0].getAreas().areas());for(let t=1;t<this._nodeCollections.length;++t)e.intersectWith(this._nodeCollections[t].getAreas().areas());return this._cachedNodeAreas=e,e}}Nt.classToken="IntersectionNodeCollection";
|
|
391
409
|
/*!
|
|
392
410
|
* Copyright 2021 Cognite AS
|
|
393
411
|
*/
|
|
412
|
+
class Rt extends Tt{constructor(e){super(Rt.classToken),e instanceof u.f?this._treeIndices=e:(u.j.isNumericRange(e),this._treeIndices=new u.f(e))}updateSet(e){this._treeIndices=e,this.notifyChanged()}clear(){this._treeIndices=new u.f,this.notifyChanged()}getIndexSet(){return this._treeIndices}getAreas(){if(!this._areaCollection){if(0===this._treeIndices.count)return St.instance();throw new Error("The AreaCollection returned by getAreas() for TreeIndexNodeCollection must be constructed manually using addAreas() and addAreaPoints()")}return this._areaCollection}addAreas(e){this._areaCollection||(this._areaCollection=new Mt),this._areaCollection.addAreas(e)}addAreaPoints(e){this._areaCollection||(this._areaCollection=new Mt);const t=e.map(e=>(new o.Box3).setFromCenterAndSize(e,new o.Vector3(1,1,1)));this._areaCollection.addAreas(t)}clearAreas(){this._areaCollection=void 0}get isLoading(){return!1}serialize(){return{token:this.classToken,state:this._treeIndices.toRangeArray(),options:{areas:this._areaCollection?[...this._areaCollection.areas()]:void 0}}}}Rt.classToken="TreeIndexNodeCollection";
|
|
394
413
|
/*!
|
|
395
414
|
* Copyright 2021 Cognite AS
|
|
396
415
|
*/
|
|
397
|
-
|
|
416
|
+
class Et{constructor(e,t,r){this._ongoingOperations=0,this._interrupted=!1,this._indexSet=new u.f,this._areas=new Mt,this._itemsToTreeIndexRangesCallback=e,this._itemsToAreasCallback=t,this._notifyChangedCallback=r}interrupt(){this._interrupted=!0}get isLoading(){return!this._interrupted&&this._ongoingOperations>0}get indexSet(){return this._indexSet}get areas(){return this._areas}async pageResults(e){const t=this._indexSet;this._ongoingOperations++;try{let r=await e;for(;!this._interrupted;){const e=r.next?r.next():void 0;this._itemsToTreeIndexRangesCallback(r.items).forEach(e=>t.addRange(e));const n=await this._itemsToAreasCallback(r.items);if(this._areas.addAreas(n),this._notifyChangedCallback(),!e)break;r=await e}return!this._interrupted}finally{this._ongoingOperations--}}}var Pt,Bt=r(15),Dt=r.n(Bt),Ot=r(16),zt=r.n(Ot);
|
|
398
417
|
/*!
|
|
399
418
|
* Copyright 2021 Cognite AS
|
|
400
|
-
*/
|
|
419
|
+
*/
|
|
420
|
+
class Ft extends Tt{constructor(e,t,r={}){super(Ft.classToken),this._indexSet=new u.f,this._areas=St.instance(),this._filter={},this._client=e,this._model=t,this._options={requestPartitions:1,...r}}get isLoading(){return void 0!==this._fetchResultHelper&&this._fetchResultHelper.isLoading}async executeFilter(e){const{requestPartitions:t}=this._options;void 0!==this._fetchResultHelper&&this._fetchResultHelper.interrupt();const r=new Et(e=>e.map(e=>new u.j(e.treeIndex,e.subtreeSize)),async e=>e.map(e=>{const t=new o.Box3;return void 0!==e.boundingBox&&(Object(u.w)(e.boundingBox,t),this._model.mapBoxFromCdfToModelCoordinates(t,t)),t}),()=>this.notifyChanged());this._fetchResultHelper=r,this._indexSet=r.indexSet,this._areas=r.areas;const{modelId:n,revisionId:i}=this._model,a=Dt()(1,t+1).map(async o=>{const a=this._client.revisions3D.list3DNodes(n,i,{properties:e,limit:1e3,sortByNodeId:!0,partition:`${o}/${t}`});return r.pageResults(a)});this._filter=e,this.notifyChanged(),await Promise.all(a)}clear(){void 0!==this._fetchResultHelper&&this._fetchResultHelper.interrupt(),this._indexSet.clear(),this.notifyChanged()}getIndexSet(){return this._indexSet}getAreas(){return this._areas}serialize(){return{token:this.classToken,state:zt()(this._filter),options:{...this._options}}}}Ft.classToken="PropertyFilterNodeCollection";
|
|
401
421
|
/*!
|
|
402
422
|
* Copyright 2021 Cognite AS
|
|
403
|
-
*/
|
|
423
|
+
*/
|
|
424
|
+
class Gt extends Tt{constructor(e,t,r={}){super(Gt.classToken),this._indexSet=new u.f,this._areas=St.instance(),this._filter={propertyCategory:"",propertyKey:"",propertyValues:new Array},this._client=e,this._model=t,this._options={requestPartitions:1,...r}}get isLoading(){return void 0!==this._fetchResultHelper&&this._fetchResultHelper.isLoading}async executeFilter(e,t,r){const{requestPartitions:n}=this._options;void 0!==this._fetchResultHelper&&this._fetchResultHelper.interrupt();const i=new Et(e=>e.map(e=>new u.j(e.treeIndex,e.subtreeSize)),async e=>e.map(e=>{const t=new o.Box3;return void 0!==e.boundingBox&&(Object(u.w)(e.boundingBox,t),this._model.mapBoxFromCdfToModelCoordinates(t,t)),t}),()=>this.notifyChanged());this._fetchResultHelper=i,this._indexSet=i.indexSet,this._areas=i.areas;const a=this.buildUrl(),s=Array.from(function*(e){for(let t=0;t<e.length;t+=1e3){const r=e.slice(t,Math.min(e.length,t+1e3));yield r}}(r)).flatMap(r=>{const o={properties:{[""+e]:{[""+t]:r}}};return Dt()(1,n+1).map(async e=>{const t=async function(e,t,r){const n=await Vt(e,t,r);return new Ut(e,t,r,n)}(this._client,a,{data:{filter:o,limit:1e3,partition:`${e}/${n}`}});return i.pageResults(t)})});this.notifyChanged(),await Promise.all(s)}clear(){void 0!==this._fetchResultHelper&&this._fetchResultHelper.interrupt(),this._indexSet.clear(),this.notifyChanged()}getIndexSet(){return this._indexSet}getAreas(){return this._areas}buildUrl(){return`${this._client.getBaseUrl()}/api/v1/projects/${this._client.project}/3d/models/${this._model.modelId}/revisions/${this._model.revisionId}/nodes/list`}serialize(){return{token:this.classToken,state:zt()(this._filter),options:{...this._options}}}}Gt.classToken="SinglePropertyNodeCollection";class Ut{constructor(e,t,r,n){this.items=n.items,this.nextCursor=n.nextCursor,void 0!==this.nextCursor&&(this.next=async()=>{const n={...r,data:{...r.data,cursor:this.nextCursor}},i=await Vt(e,t,n);return new Ut(e,t,r,i)})}}async function Vt(e,t,r){const n=await e.post(t,r);if(200===n.status)return n.data;throw new Error(`Unexpected status from server while POST ${t}: ${n.status} (body: ${n.data})`)}
|
|
404
425
|
/*!
|
|
405
426
|
* Copyright 2021 Cognite AS
|
|
406
|
-
*/class
|
|
427
|
+
*/class Lt extends Tt{constructor(e,t){super(Lt.classToken),this._indexSet=new u.f,this._areas=St.instance(),this._client=e,this._modelMetadataProvider=t,this._fetchResultHelper=void 0}get isLoading(){return void 0!==this._fetchResultHelper&&this._fetchResultHelper.isLoading}async executeFilter(e){const t=this._modelMetadataProvider;void 0!==this._fetchResultHelper&&this._fetchResultHelper.interrupt();const r=new Et(e=>e.map(e=>new u.j(e.treeIndex,e.subtreeSize)),e=>this.fetchBoundingBoxesForAssetMappings(e),()=>this.notifyChanged());this._fetchResultHelper=r;const n={assetId:e.assetId,intersectsBoundingBox:function(e){if(void 0===e)return;const r=(new o.Box3).copy(e);return t.mapBoxFromModelToCdfCoordinates(r,r),{min:[r.min.x,r.min.y,r.min.z],max:[r.max.x,r.max.y,r.max.z]}}(e.boundingBox),limit:1e3};this._indexSet=r.indexSet,this._areas=r.areas,this._filter=e;const i=this._client.assetMappings3D.list(t.modelId,t.revisionId,n);await r.pageResults(i)&&(this._fetchResultHelper=void 0)}async fetchBoundingBoxesForAssetMappings(e){return(await this._client.revisions3D.retrieve3DNodes(this._modelMetadataProvider.modelId,this._modelMetadataProvider.revisionId,e.map(e=>({id:e.nodeId})))).filter(e=>e.boundingBox).map(e=>{const t=e.boundingBox.min,r=e.boundingBox.max;return(new o.Box3).setFromArray([t[0],t[1],t[2],r[0],r[1],r[2]])})}getFilter(){return this._filter}clear(){void 0!==this._fetchResultHelper&&this._fetchResultHelper.interrupt(),this._indexSet.clear()}getIndexSet(){return this._indexSet}getAreas(){return this._areas}serialize(){return{token:this.classToken,state:zt()(this._filter)}}}Lt.classToken="AssetNodeCollection";
|
|
407
428
|
/*!
|
|
408
429
|
* Copyright 2021 Cognite AS
|
|
409
|
-
*/
|
|
430
|
+
*/
|
|
431
|
+
class jt extends Tt{constructor(e,t){super(jt.classToken),this._innerCollection=t,this._innerCollection.on("changed",()=>{this._cachedIndexSet=void 0,this.notifyChanged()}),this._allTreeIndicesRange=new u.j(0,e.nodeCount)}get isLoading(){return this._innerCollection.isLoading}getIndexSet(){if(void 0===this._cachedIndexSet){const e=this._innerCollection.getIndexSet(),t=new u.f;t.addRange(this._allTreeIndicesRange),t.differenceWith(e),this._cachedIndexSet=t}return this._cachedIndexSet}getAreas(){throw new Error(`${this.getAreas.name} is not supported for ${jt.name}`)}serialize(){return{token:this.classToken,state:{innerCollection:this._innerCollection.serialize()}}}clear(){throw new Error("clear() is not supported")}}jt.classToken="InvertedNodeCollection";
|
|
410
432
|
/*!
|
|
411
433
|
* Copyright 2021 Cognite AS
|
|
412
|
-
*/
|
|
434
|
+
*/
|
|
435
|
+
class Wt{constructor(){this._types=new Map,this._types=new Map,this.registerWellKnownNodeCollectionTypes()}registerNodeCollectionType(e,t){this._types.set(e,{deserializer:(e,r)=>t(e,r)})}async deserialize(e,t,r){const n={client:e,model:t};return this.getDeserializer(r.token)(r,n)}getDeserializer(e){const t=this._types.get(e);return E()(void 0!==t),t.deserializer}registerWellKnownNodeCollectionTypes(){this.registerNodeCollectionType(Lt.classToken,async(e,t)=>{const r=new Lt(t.client,t.model);return await r.executeFilter(e.state),r}),this.registerNodeCollectionType(Ft.classToken,async(e,t)=>{const r=new Ft(t.client,t.model,e.options);return await r.executeFilter(e.state),r}),this.registerNodeCollectionType(Gt.classToken,async(e,t)=>{const r=new Gt(t.client,t.model,e.options),{propertyCategory:n,propertyKey:i,propertyValues:o}=e.state;return await r.executeFilter(n,i,o),r}),this.registerNodeCollectionType(Rt.classToken,e=>{var t;const r=new u.f;e.state.forEach(e=>r.addRange(new u.j(e.from,e.count)));const n=new Rt(r);return void 0!==(null===(t=e.options)||void 0===t?void 0:t.areas)&&n.addAreas(e.options.areas),Promise.resolve(n)}),this.registerNodeCollectionType(Nt.classToken,async(e,t)=>{const r=await Promise.all(e.state.subCollections.map(e=>this.deserialize(t.client,t.model,e)));return new Nt(r)}),this.registerNodeCollectionType(It.classToken,async(e,t)=>{const r=await Promise.all(e.state.subCollections.map(e=>this.deserialize(t.client,t.model,e)));return new It(r)}),this.registerNodeCollectionType(jt.classToken,async(e,t)=>{const r=await this.deserialize(t.client,t.model,e.state.innerSet);return new jt(t.model,r)})}}function Zt(e,t){Wt.Instance.registerNodeCollectionType(e,t)}
|
|
413
436
|
/*!
|
|
414
437
|
* Copyright 2021 Cognite AS
|
|
415
|
-
*/
|
|
438
|
+
*/Wt.Instance=new Wt,function(e){e[e.NoOutline=0]="NoOutline",e[e.White=1]="White",e[e.Black=2]="Black",e[e.Cyan=3]="Cyan",e[e.Blue=4]="Blue",e[e.Green=5]="Green",e[e.Red=6]="Red",e[e.Orange=7]="Orange"}(Pt||(Pt={}));const Ht={visible:!0,outlineColor:Pt.White},Yt={visible:!0,renderInFront:!0},qt={Default:{visible:!0,renderGhosted:!1,renderInFront:!1,outlineColor:Pt.NoOutline,color:[0,0,0],prioritizedForLoadingHint:0},Outlined:Ht,Hidden:{visible:!1},InFront:Yt,Ghosted:{visible:!0,renderGhosted:!0},Highlighted:{...Yt,visible:!0,renderGhosted:!1,color:[100,100,255],...Ht}};var Qt=r(14),Xt=r.n(Qt);
|
|
416
439
|
/*!
|
|
417
440
|
* Copyright 2021 Cognite AS
|
|
418
441
|
*/
|
|
442
|
+
class Jt{constructor(){this._styledCollections=new Array,this._cachedPrioritizedAreas=void 0,this._events={changed:new u.e,loadingStateChanged:new u.e,prioritizedAreasChanged:new u.e},this.scheduleNotifyChanged=Xt()(()=>this.notifyChanged(),0)}on(e,t){switch(e){case"changed":this._events.changed.subscribe(t);break;case"loadingStateChanged":this._events.loadingStateChanged.subscribe(t);break;case"prioritizedAreasChanged":this._events.prioritizedAreasChanged.subscribe(t);break;default:Object(u.m)(e,`Unsupported event: '${e}'`)}}off(e,t){switch(e){case"changed":this._events.changed.unsubscribe(t);break;case"loadingStateChanged":this._events.loadingStateChanged.unsubscribe(t);break;case"prioritizedAreasChanged":this._events.prioritizedAreasChanged.unsubscribe(t);break;default:Object(u.m)(e,`Unsupported event: '${e}'`)}}assignStyledNodeCollection(e,t){const r=this._styledCollections.find(t=>t.nodeCollection===e);if(void 0!==r)r.appearance=t,this.handleNodeCollectionChanged(r);else{const r={nodeCollection:e,appearance:t,handleNodeCollectionChangedListener:()=>{this.handleNodeCollectionChanged(r)}};this._styledCollections.push(r),e.on("changed",r.handleNodeCollectionChangedListener),this.scheduleNotifyChanged()}t.prioritizedForLoadingHint&&this.notifyPrioritizedAreasChanged()}unassignStyledNodeCollection(e){const t=this._styledCollections.findIndex(t=>t.nodeCollection===e);if(-1===t)throw new Error("NodeCollection not added");const r=this._styledCollections[t];this._styledCollections.splice(t,1),e.off("changed",r.handleNodeCollectionChangedListener),this.scheduleNotifyChanged()}applyStyles(e){this._styledCollections.forEach(t=>{const r=t.nodeCollection.getIndexSet();e(r,t.appearance)})}getPrioritizedAreas(){if(this._cachedPrioritizedAreas)return this._cachedPrioritizedAreas;const e=this._styledCollections.filter(e=>e.appearance.prioritizedForLoadingHint).flatMap(e=>{const t=[];for(const r of e.nodeCollection.getAreas().areas())t.push({area:r,extraPriority:e.appearance.prioritizedForLoadingHint});return t});return this._cachedPrioritizedAreas=e,this._cachedPrioritizedAreas}clear(){for(const e of this._styledCollections){e.nodeCollection.off("changed",e.handleNodeCollectionChangedListener)}this._styledCollections.splice(0),this.scheduleNotifyChanged()}get isLoading(){return this._styledCollections.some(e=>e.nodeCollection.isLoading)}notifyChanged(){this._cachedPrioritizedAreas=void 0,this._events.changed.fire()}notifyLoadingStateChanged(){this._lastFiredLoadingState!==this.isLoading&&(this._lastFiredLoadingState=this.isLoading,this._events.loadingStateChanged.fire(this.isLoading))}handleNodeCollectionChanged(e){this.scheduleNotifyChanged(),this.notifyLoadingStateChanged()}notifyPrioritizedAreasChanged(){this._events.prioritizedAreasChanged.fire()}}
|
|
419
443
|
/*!
|
|
420
444
|
* Copyright 2021 Cognite AS
|
|
421
445
|
*/
|
|
422
|
-
class _n{constructor(e,t,n){this._lastCamera={position:new l.Vector3(NaN,NaN,NaN),quaternion:new l.Quaternion(NaN,NaN,NaN,NaN),zoom:NaN},this._isDisposed=!1,this._subscriptions=new P.Subscription,this._events={loadingStateChanged:new i.d},this._effectRenderManager=t,this._cadManager=e,this._pointCloudManager=n,this.initLoadingStateObserver(this._cadManager,this._pointCloudManager),this._updateSubject=new P.Subject,this._updateSubject.pipe(Object(V.auditTime)(5e3),Object(V.tap)(()=>{R.a.trackCameraNavigation({moduleName:"RevealManager",methodName:"update"})})).subscribe()}dispose(){this._isDisposed||(this._cadManager.dispose(),this._subscriptions.unsubscribe(),this._isDisposed=!0)}requestRedraw(){this._cadManager.requestRedraw(),this._pointCloudManager.requestRedraw()}resetRedraw(){this._cadManager.resetRedraw(),this._pointCloudManager.resetRedraw()}get debugRenderTiming(){return this._effectRenderManager.debugRenderTimings}set debugRenderTiming(e){this._effectRenderManager.debugRenderTimings=e}get renderOptions(){return this._effectRenderManager.renderOptions}set renderOptions(e){this._effectRenderManager.renderOptions=null!=e?e:N}get needsRedraw(){return this._cadManager.needsRedraw||this._pointCloudManager.needsRedraw}update(e){(this._lastCamera.zoom!==e.zoom||!this._lastCamera.position.equals(e.position)||!this._lastCamera.quaternion.equals(e.quaternion))&&(this._lastCamera.position.copy(e.position),this._lastCamera.quaternion.copy(e.quaternion),this._lastCamera.zoom=e.zoom,this._cadManager.updateCamera(e),this._updateSubject.next())}get cadBudget(){return this._cadManager.budget}set cadBudget(e){this._cadManager.budget=e}get cadLoadedStatistics(){return this._cadManager.loadedStatistics}get cadRenderMode(){return this._cadManager.renderMode}set cadRenderMode(e){this._cadManager.renderMode=e}get pointCloudBudget(){return{numberOfPoints:this._pointCloudManager.pointBudget}}set pointCloudBudget(e){this._pointCloudManager.pointBudget=e.numberOfPoints}set clippingPlanes(e){this._cadManager.clippingPlanes=e,this._pointCloudManager.clippingPlanes=e}get clippingPlanes(){return this._cadManager.clippingPlanes}on(e,t){switch(e){case"loadingStateChanged":this._events.loadingStateChanged.subscribe(t);break;default:throw new Error(`Unsupported event '${e}'`)}}off(e,t){switch(e){case"loadingStateChanged":this._events.loadingStateChanged.unsubscribe(t);break;default:throw new Error(`Unsupported event '${e}'`)}}render(e){this._effectRenderManager.render(e),this.resetRedraw()}setRenderTarget(e,t=!0){this._effectRenderManager.setRenderTarget(e),this._effectRenderManager.setRenderTargetAutoSize(t)}async addModel(e,t,n){switch(e){case"cad":return this._cadManager.addModel(t,null==n?void 0:n.geometryFilter);case"pointcloud":return this._pointCloudManager.addModel(t);default:throw new Error(`Model type '${e}' is not supported`)}}removeModel(e,t){switch(e){case"cad":this._cadManager.removeModel(t);break;case"pointcloud":this._pointCloudManager.removeModel(t);break;default:Object(i.l)(e)}}addUiObject(e,t,n){this._effectRenderManager.addUiObject(e,t,n),this.requestRedraw()}removeUiObject(e){this._effectRenderManager.removeUiObject(e),this.requestRedraw()}notifyLoadingStateChanged(e){this._events.loadingStateChanged.fire(e)}initLoadingStateObserver(e,t){this._subscriptions.add(Object(P.combineLatest)([e.getLoadingStateObserver(),t.getLoadingStateObserver()]).pipe(Object(V.observeOn)(P.asyncScheduler),Object(V.subscribeOn)(P.asyncScheduler),Object(V.map)(([e,t])=>({isLoading:e.isLoading||t.isLoading,itemsLoaded:e.itemsLoaded+t.itemsLoaded,itemsRequested:e.itemsRequested+t.itemsRequested,itemsCulled:e.itemsCulled+t.itemsCulled})),Object(V.distinctUntilChanged)((e,t)=>e.itemsLoaded===t.itemsLoaded&&e.itemsRequested===t.itemsRequested)).subscribe(this.notifyLoadingStateChanged.bind(this),e=>R.a.trackError(e,{moduleName:"RevealManager",methodName:"constructor"})))}}
|
|
423
446
|
/*!
|
|
424
447
|
* Copyright 2021 Cognite AS
|
|
425
|
-
*/class
|
|
448
|
+
*/class Kt{constructor(e,t){this._viewer=e,this._cdfClient=t,this._cameraManager=e.cameraManager}getCurrentState(){const{position:e,target:t}=this._cameraManager.getCameraState();return{camera:{position:e,target:t},models:this.getModelsState(),clippingPlanes:this.getClippingPlanesState()}}async setState(e){void 0!==e.camera&&this.setCameraFromState(e.camera),void 0!==e.models&&this.setModelState(e.models),void 0!==e.clippingPlanes&&this.setClippingPlanesState(e.clippingPlanes)}getModelsState(){return this._viewer.models.filter(e=>e instanceof et).map(e=>e).map(e=>({defaultNodeAppearance:e.getDefaultNodeAppearance(),modelId:e.modelId,revisionId:e.revisionId,styledSets:e.styledNodeCollections.map(e=>{const{nodeCollection:t,appearance:r}=e;return{...t.serialize(),appearance:r}})}))}getClippingPlanesState(){return this._viewer.getClippingPlanes().map(e=>({nx:e.normal.x,ny:e.normal.y,nz:e.normal.z,constant:e.constant}))}setCameraFromState(e){const t=e.position,r=e.target;this._cameraManager.setCameraState({position:new o.Vector3(t.x,t.y,t.z),target:new o.Vector3(r.x,r.y,r.z)})}async setModelState(e){const t=this._viewer.models.filter(e=>e instanceof et).map(e=>e);await Promise.all(e.map(e=>{const r=t.find(t=>t.modelId==e.modelId&&t.revisionId==e.revisionId);if(void 0===r)throw new Error(`Cannot apply model state. Model (modelId: ${e.modelId}, revisionId: ${e.revisionId}) has not been added to viewer.`);return{model:r,state:e}}).map(async e=>{const{model:t,state:r}=e;t.setDefaultNodeAppearance(r.defaultNodeAppearance),await Promise.all(r.styledSets.map(async e=>{const r=await Wt.Instance.deserialize(this._cdfClient,t,{token:e.token,state:e.state,options:e.options});t.assignStyledNodeCollection(r,e.appearance)}))}))}setClippingPlanesState(e){const t=e.map(e=>(new o.Plane).setComponents(e.nx,e.ny,e.nz,e.constant));this._viewer.setClippingPlanes(t)}}
|
|
426
449
|
/*!
|
|
427
450
|
* Copyright 2021 Cognite AS
|
|
428
|
-
*/class
|
|
451
|
+
*/class $t{constructor(e,t,r){this._lastCamera={position:new o.Vector3(NaN,NaN,NaN),quaternion:new o.Quaternion(NaN,NaN,NaN,NaN),zoom:NaN},this._isDisposed=!1,this._subscriptions=new d.Subscription,this._events={loadingStateChanged:new u.e},this._effectRenderManager=t,this._cadManager=e,this._pointCloudManager=r,this.initLoadingStateObserver(this._cadManager,this._pointCloudManager),this._updateSubject=new d.Subject,this._updateSubject.pipe(Object(v.auditTime)(5e3),Object(v.tap)(()=>{p.a.trackCameraNavigation({moduleName:"RevealManager",methodName:"update"})})).subscribe()}dispose(){this._isDisposed||(this._cadManager.dispose(),this._subscriptions.unsubscribe(),this._isDisposed=!0)}requestRedraw(){this._cadManager.requestRedraw(),this._pointCloudManager.requestRedraw()}resetRedraw(){this._cadManager.resetRedraw(),this._pointCloudManager.resetRedraw()}get debugRenderTiming(){return this._effectRenderManager.debugRenderTimings}set debugRenderTiming(e){this._effectRenderManager.debugRenderTimings=e}get renderOptions(){return this._effectRenderManager.renderOptions}set renderOptions(e){this._effectRenderManager.renderOptions=null!=e?e:f}get needsRedraw(){return this._cadManager.needsRedraw||this._pointCloudManager.needsRedraw}update(e){(this._lastCamera.zoom!==e.zoom||!this._lastCamera.position.equals(e.position)||!this._lastCamera.quaternion.equals(e.quaternion))&&(this._lastCamera.position.copy(e.position),this._lastCamera.quaternion.copy(e.quaternion),this._lastCamera.zoom=e.zoom,this._cadManager.updateCamera(e),this._updateSubject.next())}get cadBudget(){return this._cadManager.budget}set cadBudget(e){this._cadManager.budget=e}get cadLoadedStatistics(){return this._cadManager.loadedStatistics}get cadRenderMode(){return this._cadManager.renderMode}set cadRenderMode(e){this._cadManager.renderMode=e}get pointCloudBudget(){return{numberOfPoints:this._pointCloudManager.pointBudget}}set pointCloudBudget(e){this._pointCloudManager.pointBudget=e.numberOfPoints}set clippingPlanes(e){this._cadManager.clippingPlanes=e,this._pointCloudManager.clippingPlanes=e}get clippingPlanes(){return this._cadManager.clippingPlanes}on(e,t){switch(e){case"loadingStateChanged":this._events.loadingStateChanged.subscribe(t);break;default:throw new Error(`Unsupported event '${e}'`)}}off(e,t){switch(e){case"loadingStateChanged":this._events.loadingStateChanged.unsubscribe(t);break;default:throw new Error(`Unsupported event '${e}'`)}}render(e){this._effectRenderManager.render(e),this.resetRedraw()}setRenderTarget(e,t=!0){this._effectRenderManager.setRenderTarget(e),this._effectRenderManager.setRenderTargetAutoSize(t)}async addModel(e,t,r){switch(e){case"cad":return this._cadManager.addModel(t,null==r?void 0:r.geometryFilter);case"pointcloud":return this._pointCloudManager.addModel(t);default:throw new Error(`Model type '${e}' is not supported`)}}removeModel(e,t){switch(e){case"cad":this._cadManager.removeModel(t);break;case"pointcloud":this._pointCloudManager.removeModel(t);break;default:Object(u.m)(e)}}addUiObject(e,t,r){this._effectRenderManager.addUiObject(e,t,r),this.requestRedraw()}removeUiObject(e){this._effectRenderManager.removeUiObject(e),this.requestRedraw()}notifyLoadingStateChanged(e){this._events.loadingStateChanged.fire(e)}initLoadingStateObserver(e,t){this._subscriptions.add(Object(d.combineLatest)([e.getLoadingStateObserver(),t.getLoadingStateObserver()]).pipe(Object(v.observeOn)(d.asyncScheduler),Object(v.subscribeOn)(d.asyncScheduler),Object(v.map)(([e,t])=>({isLoading:e.isLoading||t.isLoading,itemsLoaded:e.itemsLoaded+t.itemsLoaded,itemsRequested:e.itemsRequested+t.itemsRequested,itemsCulled:e.itemsCulled+t.itemsCulled})),Object(v.distinctUntilChanged)((e,t)=>e.itemsLoaded===t.itemsLoaded&&e.itemsRequested===t.itemsRequested)).subscribe(this.notifyLoadingStateChanged.bind(this),e=>p.a.trackError(e,{moduleName:"RevealManager",methodName:"constructor"})))}}
|
|
429
452
|
/*!
|
|
430
453
|
* Copyright 2021 Cognite AS
|
|
431
|
-
*/(
|
|
454
|
+
*/class er{constructor(e,t){this._defaultAppearance={},this._handleStylesChangedListener=this.handleStylesChanged.bind(this),this._needsUpdate=!0,this._allTreeIndices=new u.f,this._allTreeIndices.addRange(new u.j(0,e)),this._styleProvider=t,this._styleProvider.on("changed",this._handleStylesChangedListener),this._overrideColorPerTreeIndexTexture=function(e){const{width:t,height:r}=Object(u.o)(e),n=t*r;return new o.DataTexture(new Uint8ClampedArray(4*n),t,r)}(e),this._overrideColorDefaultAppearanceRgba=new Uint8ClampedArray(this._overrideColorPerTreeIndexTexture.image.data.length),this._regularNodesTreeIndices=new u.f,this._ghostedNodesTreeIndices=new u.f,this._infrontNodesTreeIndices=new u.f,this.setDefaultAppearance(qt.Default)}getDefaultAppearance(){return this._defaultAppearance}setDefaultAppearance(e){var t,r;
|
|
455
|
+
/*!
|
|
456
|
+
* Copyright 2021 Cognite AS
|
|
457
|
+
*/(t=e,r=this._defaultAppearance,JSON.stringify(t)!==JSON.stringify(r))&&(this._defaultAppearance=e,function(e,t){const[r,n,i,o]=tr(t);for(let t=0;t<e.length;++t)e[4*t+0]=r,e[4*t+1]=n,e[4*t+2]=i,e[4*t+3]=o}(this._overrideColorDefaultAppearanceRgba,e),this._needsUpdate=!0)}get regularNodeTreeIndices(){return this._regularNodesTreeIndices}get ghostedNodeTreeIndices(){return this._ghostedNodesTreeIndices}get infrontNodeTreeIndices(){return this._infrontNodesTreeIndices}get needsUpdate(){return this._needsUpdate}get overrideColorPerTreeIndexTexture(){return this._overrideColorPerTreeIndexTexture}dispose(){this._styleProvider.off("changed",this._handleStylesChangedListener),this._overrideColorPerTreeIndexTexture.dispose()}build(){if(!this._needsUpdate)return;const e=this._overrideColorPerTreeIndexTexture.image.data;this.populateTexture(e),this.populateNodeSets(e),this._needsUpdate=!1}populateTexture(e){e.set(this._overrideColorDefaultAppearanceRgba),this._styleProvider.applyStyles((e,t)=>{const r={...this._defaultAppearance,...t};this.applyStyleToNodes(e,r)}),this._overrideColorPerTreeIndexTexture.needsUpdate=!0}populateNodeSets(e){this._regularNodesTreeIndices.clear(),this._infrontNodesTreeIndices.clear(),this._ghostedNodesTreeIndices.clear();const t={rangeStart:-1,inFront:!1,ghosted:!1},r=e=>{const r=u.j.createFromInterval(t.rangeStart,e-1);t.inFront?this._infrontNodesTreeIndices.addRange(r):t.ghosted?this._ghostedNodesTreeIndices.addRange(r):this._regularNodesTreeIndices.addRange(r)};for(let n=0;n<this._allTreeIndices.count;++n){const i=0!=(2&e[4*n+3]),o=0!=(4&e[4*n+3]);-1===t.rangeStart?(t.rangeStart=n,t.inFront=i,t.ghosted=o):t.inFront===i&&t.ghosted===o||(r(n),t.rangeStart=n,t.inFront=i,t.ghosted=o)}-1!==t.rangeStart&&r(this._allTreeIndices.count)}applyStyleToNodes(e,t){0!==e.count&&function(e,t,r){const[n,i,o,a]=tr(r),s=void 0===r.color||r.color.every(e=>0===e)?0:255,c=~s,l=n&s,d=i&s,f=o&s,u=(void 0!==r.visible?1:0)|(void 0!==r.renderInFront?2:0)|(void 0!==r.renderGhosted?4:0)|(void 0!==r.outlineColor?224:0),p=~u,m=a&u;t.forEachRange(t=>{for(let r=t.from;r<=t.toInclusive;++r){const t=e[4*r+0],n=e[4*r+1],i=e[4*r+2];e[4*r+0]=t&c|l,e[4*r+1]=n&c|d,e[4*r+2]=i&c|f,e[4*r+3]=e[4*r+3]&p|m}})}(this._overrideColorPerTreeIndexTexture.image.data,e,t)}handleStylesChanged(){this._needsUpdate=!0}}function tr(e){const[t,r,n]=e.color||[0,0,0];return[t,r,n,(void 0===e.visible||!!e.visible?1:0)+(!!e.renderInFront?2:0)+(!!e.renderGhosted?4:0)+((e.outlineColor?Number(e.outlineColor):0)<<5)]}class rr{constructor(e){this._textureBuffer=new Uint8Array(rr.MIN_NUMBER_OF_TREE_INDICES*rr.NUMBER_OF_ELEMENTS_PER_MATRIX*rr.BYTES_PER_FLOAT),this._dataTexture=new o.DataTexture(this._textureBuffer,rr.NUMBER_OF_ELEMENTS_PER_MATRIX,rr.MIN_NUMBER_OF_TREE_INDICES),this._onGenerateNewDataTextureCallback=e,this._unusedIndices=[...Array(rr.MIN_NUMBER_OF_TREE_INDICES).keys()].map((e,t)=>t),this._treeIndexToOverrideIndex=new Map}get dataTexture(){return this._dataTexture}get overrideIndices(){return this._treeIndexToOverrideIndex}dispose(){this._dataTexture.dispose(),delete this._dataTexture.image}addOverrideTransform(e,t){const r=t.toArray();let n;this._treeIndexToOverrideIndex.has(e)?n=this._treeIndexToOverrideIndex.get(e):(n=this._unusedIndices.pop(),void 0===n&&(this.recomputeDataTexture(),n=this._unusedIndices.pop()),this._treeIndexToOverrideIndex.set(e,n));for(let e=0;e<rr.NUMBER_OF_ELEMENTS_PER_MATRIX;e++){const t=(n*rr.NUMBER_OF_ELEMENTS_PER_MATRIX+e)*rr.BYTES_PER_FLOAT,i=r[e%4*4+Math.floor(e/4)];Object(u.u)(i,this._dataTexture.image.data,t)}return this._dataTexture.needsUpdate=!0,n}removeOverrideTransform(e){if(!this._treeIndexToOverrideIndex.has(e))return;const t=this._treeIndexToOverrideIndex.get(e);this._unusedIndices.push(t),this._treeIndexToOverrideIndex.delete(e)}recomputeDataTexture(){const e=this._textureBuffer.length,t=new Uint8Array(2*e);t.set(this._textureBuffer);const r=Object(u.o)(2*e/rr.BYTES_PER_FLOAT),n=new o.DataTexture(t,r.width,r.height),i=e/(rr.BYTES_PER_FLOAT*rr.NUMBER_OF_ELEMENTS_PER_MATRIX);for(let e=i;e<2*i;e++)this._unusedIndices.push(e);this._textureBuffer=t,this._dataTexture=n,this._onGenerateNewDataTextureCallback(n)}}rr.MIN_NUMBER_OF_TREE_INDICES=16,rr.NUMBER_OF_ELEMENTS_PER_MATRIX=16,rr.BYTES_PER_FLOAT=4;
|
|
432
458
|
/*!
|
|
433
459
|
* Copyright 2021 Cognite AS
|
|
434
460
|
*/
|
|
435
|
-
class
|
|
461
|
+
class nr{constructor(e,t){this._needsUpdate=!1,this._handleTransformChangedBound=this.handleTransformChanged.bind(this),this._transformOverrideIndexTexture=function(e){const{width:t,height:r}=Object(u.o)(e),n=new Uint8ClampedArray(t*r*4);return new o.DataTexture(n,t,r,o.RGBAFormat)}
|
|
436
462
|
/*!
|
|
437
463
|
* Copyright 2021 Cognite AS
|
|
438
|
-
*/(e)
|
|
464
|
+
*/(e),this._transformOverrideBuffer=new rr(this.handleNewTransformTexture.bind(this)),this._transformProvider=t,this._transformProvider.on("changed",this._handleTransformChangedBound)}dispose(){this._transformOverrideBuffer.dispose(),this._transformOverrideIndexTexture.dispose(),this._transformProvider.off("changed",this._handleTransformChangedBound)}get needsUpdate(){return this._needsUpdate}get overrideTransformIndexTexture(){return this._transformOverrideIndexTexture}get transformLookupTexture(){return this._transformOverrideBuffer.dataTexture}build(){this._needsUpdate=!1}setNodeTransform(e,t){const r=this._transformOverrideBuffer.addOverrideTransform(e.from,t);e.forEach(e=>this.setOverrideIndex(e,r)),this._needsUpdate=!0}resetNodeTransform(e){this._transformOverrideBuffer.removeOverrideTransform(e.from),e.forEach(e=>this.setOverrideIndex(e,-1)),this._needsUpdate=!0}setOverrideIndex(e,t){const r=this._transformOverrideIndexTexture.image.data;r[4*e+0]=t+1>>16,r[4*e+1]=t+1>>8,r[4*e+2]=t+1>>0,this._transformOverrideIndexTexture.needsUpdate=!0}handleNewTransformTexture(){this._needsUpdate=!0}handleTransformChanged(e,t,r){switch(e){case"set":this.setNodeTransform(t,r);break;case"reset":this.resetNodeTransform(t);break;default:Object(u.m)(e,`Unexpected change type '${e}'`)}}}const ir=(new o.Matrix4).identity();class or{constructor(){this._events={changed:new u.e}}on(e,t){switch(e){case"changed":this._events.changed.subscribe(t);break;default:Object(u.m)(e,`Unsupported event: '${e}'`)}}off(e,t){switch(e){case"changed":this._events.changed.unsubscribe(t);break;default:Object(u.m)(e,`Unsupported event: '${e}'`)}}setNodeTransform(e,t){this._events.changed.fire("set",e,t)}resetNodeTransform(e){this._events.changed.fire("reset",e,ir)}}
|
|
439
465
|
/*!
|
|
440
466
|
* Copyright 2021 Cognite AS
|
|
441
|
-
*/const Pn=new Image;Pn.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAABgGlDQ1BJQ0MgcHJvZmlsZQAAKJFjYGCqSCwoyGFhYGDIzSspCnJ3UoiIjFJgv8PAzcDDIMRgxSCemFxc4BgQ4MOAE3y7xsAIoi/rgsxqOqd2d+pGwehjat+yq+1cc3DrAwPulNTiZAYGRg4gOyWlODkXyAbp0UsuKCoBsucA2brlJQUg9hkgW6QI6EAg+wGInQ5hfwGxk8BsJg6wmpAgZyBbBsgWSIKwdUDsdAjbBsROzkhMAbJB/tKBuAEMuIJdFAzNDXx1HQk4nFSQm1MKswMUWjypeaHBQFoIiGUYghlcGBQYDBnMGQwYfBl0GYCWl6RWlIAUO+cXVBZlpmeUKDgCQzdVwTk/t6C0JLVIR8EzL1lPR8HIwNAApA4UbxDjPweBbWAUO48Qy5rMwGDxhoGBuQohlrKcgWGLPQODeDBCTH020EnvGRh2hBckFiXCHc/4jYUQvzjN2AjC5nFiYGC99///ZzUGBvZJDAx/J/7//3vR//9/FwPtv8PAcCAHALbUa33lfYEHAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5AobCyAEEhU0UQAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAACAASURBVHjalV3bkiLXESzoC9cZdle7lixF7IMj7Ad/qn/RVliybMmyZhkGGKCBBj+s6ig7yTqNJmJjbzPN6XOpysrKqjP429/+djUzu16vNhgMbDAY2HA4tLIsbTKZWFmW1rat7fd7O5/P1ratXS4Xw5+5Xq82HA47v1+vVzOz9Hcz6/zc5XKxtm07z/Ev/34elz9vOBzaYDCwtm3tfD7b6XSy6/Vq5/M5fU9RFFbXtZVlaXVdm5mlZ1wuFyvLMn2GP78oCjMzO51Odjqd0rNxrP5VFEXnl7+nf4bP4+VySe/jn+Hj97nzMU+nUyuKwo7HY3onfGZRFDabzWyxWNjpdLLVamVN06Tvw3nHL5xb/LfL5WIlDsJ/90Vu29bKsrTr9Wpt23YWHxfocrl0Jtf/HQeE/68GpDaBP5tfwsdzPp/tcrnYcDi0qqpsNptZVVVW17UVRZEWwZ91PB7TJuHF8gnxBR0MBukQ+Lh9kx2Px84iFUVhZVlaWZbpM3Hjq7nCeTezNObL5WLn81keoLqubTqd2vl8ts1mY03TpHGphY/mFte69P/gTaBOLf7CBR0Oh9a2rQ2Hw5tF8pfljYaf65/hz8Hv8/8/nU5p0cuytNFoZKPRyKqqSiceFxInECfRTzlaFPydLZSP1Z8zHo9tNBqlzXA6naxpGjsej3Y4HNJmqOu680z/bJ7H6/WaNu3lcrHD4ZDmDdfBF9/MbL1e236/l3OFm1ptAt4MJU4Un27frfhwPvG+0GaWTheamMgMqQ2AL+QL0DSNnc/nNPnT6dTG47FVVWWXy+XmM/CXLxr/P1shXxh2P/w8f0devNFolMbcNI01TWObzSZtVLcqfDh83t1FuYXiuSrL0sbjsRVFYa+vr2lO+DRHi8//jgei4wLYLKEFwIfipsAHKlPEbsD/7j/DE3q9Xu10OtnxeEy+ej6fp5PuC+obEn0qnlb/HceMC41+GBfbD4JbFDTZuFkQE7jFGQwGaZO6RXh9fU2bt67rjoVyrDUYDOxwOEi/79akqiprmsb2+33CJYy5/J0iF8DWouMCcKH5FLA7wMlmP+0P9wnCF1bPRdxxOp3scDiYmSVTy2bUzb0vBO9uXEj8N5wsPgkM3HDh8eTi+7CP5w3sG3c6nVrTNHY4HGy321ld1+k0O25wPKHG65vEN5SDPv8+drO5Lwad1+vVSpw0BSR48ZWJ50lEk46m3jcLY4jz+Wz7/d7MzCaTiY3H405UgSi9LEuJotmPIwD033E8yiziBLKlUT4Ux6Asqf8aj8c2Ho/tfD6nk+6Wwt0cR09u2aqqSt9zPB5vcJjCWJEVUAel7DMXKkrAk4MbQ/0M/r/7bNwg+/3ertdr8u24iH7a/d9wlzv6xs9UoSJvCPb/yl/ySeF/ZzPt74KuyDcbbtCyLG02m9nxeLTlcmnr9boTauM40d0cDoe0+BGuUqFzzhI44C5VWKJMmzrx/H3RTvOXc2DXtq3tdrt0OqbT6c3pcx/M5h9NI5rhnAnk08LjRovC40Bcge+IGwMxA4NqPiyOazzeX61WVlVVQvg4FneLDo755OM40MKyJYxcQbIA/NDIfCCCxYHyKcdFcfLIB7jf761pGiuKwubzeQJG7mv9xLMlYB/NII5fjMOo6KSrU65cCm9qhSXYwuAYGF9UVWXv3r2zpmlsuVzadrtNmGE0Gtn5fLamaTqRUUTm8EG455397yWHfAzsGDUiaFOxpm8QRpwO8Nq2tel0mtCvLzqSKMpcqZBMvVhkFpU7UBtMPVtZumizoFtSB8ldl5/4wWCQNsJ6vbbL5WJffPGFtW1rx+Mx+5loYdW7RiAZfy/ZxOMH9G0ChejdAvjv/iL7/d6KorDFYiERvZ98NGEK6KD5V0RPNFF4Chn0KbPPoFfNQy7WZvCLOMCt3uFw6LiFN2/e2MvLi/3jH/+wh4eHRA5dr1cry7IzN7zROWTNYRt0ryX7cwYZiNpVjM+cAVoBZ7aOx2MCOz7JfuJ9UdD0c6zOuABPm0LCjD944ftOewRsmRPhRVbg0RfFf7aqKptMJtY0TWfDOU56//697XY7Wy6XKWR0V6rcNLu6vq8bkolPj4rpmRLOoU8ndy6Xi+12O2vb1h4fH7t+B0I5PNFMaiDVrHw/x+/3+EF2MfckTnI4QJ0wB4Uq9h6Px50owefVreBkMkkU99PTk202G5vP5535UGPhOWGgGkUGQ4WIOeTLgUIflLNTnkXbbDZmZvbw8NAhNHzx0fw7y4exPsb+vFkQATMw5BOuACQyg8oN8IRGG94XmRlK3NA4Vmf0PBJifsPNvLOg7969s7qubbPZdDKnmLBjfKBctTqk/ueSzRxSnNGu4ZPmg3FSZ7PZWF3XNp/POz4nonHVCceQBicqOtF8Mpmq7ov1owhIAVLlShStnOjWX13faDRKC8zP8twGxvxuPXe7na3X60SJq3dCfKA4EA7fE/ZQ8TsnaCIziMSOZ8VeX19TbO8vzwvINGeExvHvjq5V7K8yYYrQ4mRQxI71bYK+UJFdElq/3W53Q/e6yXdSrCiK5PNPp1PSCaxWK5tOpwkcKmJKhZ6RBTCz3yxAn+lQdDCe+uPxaNvt1kajkU0mk87i4knHiVfiCPydQV4U4qgdz36Pn63Qfk5U0cccKs4BN3pVVck94pdbShfc8OINh0M7nU42Go3s7du39unTJ5vNZglLME7jw9PHGg45XufJZ3yA3+chXtM0tt1uE4/vQM99Gy40U7ycuUOqGK0RAy4kXSLTG0UtDB7v/cq5iQhLIFbwhA/O8WKxsMFgkEgfprI9RHRxzvv37ztJIU6JMwvIhwA35WAwsKECCYzWVU7AxRCHw8HW63VKeLgUC+N7NufI/CkWUqmJWJiCoCjiANRpxZdX38efo/QRymVE6Nx/d5CM3/P4+GiTycS2220KC3EhfQ18jtq2taIo7O3bt0kXwGAwEogo63S9Xm0YERbKr+BEOFW52WxSrtuFCxzjq8VnQQbG9Zg34J3tCFqZP/+ZSCSCAhTMp0fRzT0hJIet/Hmoe8D/H4/H9vDwYOv12g6Hww2NzVwJsozD4dDevXtnu92uIx9Dy+hzhO+KVH7CJzn5EJ9G1sVtt1ur69pGo1FSv6DpR9dRVVVnctACKHGo2tEMSO/RwanwMQJFvFlzz+bf2TqwtcS/V1Vlj4+PdjgcUrgcRV58iHy8ZVnaYrGw19fXThTmohJXL+XY3Ov1+hkDRKecdw/G+a+vr4m4iDRwatAe9+MmUdIuJoFyC6iUOQr98gJFGUx10nPkl+JReBPg5vcIabVadUx4n7ADuRNUS202Gzufz8nKsAVQhziNF3eof7CLL9mMuOnfbrdmZimp4+ZfWQ5W1Mznc/v48aN98cUXHTm1ynqxG1J4RAFAxQJGGkUlO+9zAyqrxtR0pGr2uVqv1wkXMKGj8hN+WPCzLpdLcr/r9TqtmzrpYRiLA2X/iYvvO8w1aXjy0VfxwB3I+NdoNLIPHz7YH/7wh5scO6pwGRiyzDuaZLWwyqzzpEesopKOq39ncKkApH/PbrfroPhc3p6BNOZO6rq26/VqDw8PNhgMkjtQqqUIGJd9oQ9ugP1+b/v9PpERTO0qMoTB0Xa7tR9//DHt4FyYxSpkxA/olljVq15YkUIKKKq6BUVQRZOMIR4mgvDnnOqNSKvISiFuSlRuWdrpdLLFYmHPz89Ja8GgV2kkzew3RVBfbYCreKqqsqqqOmlNJngY6WOat21b+/nnn+/i4BlguctAMKjSooq34CKRKNcfbQLFlnKaWlkdfj4DwkjHwGOPimNQiPL4+Jjk6FhowuPthPosjMBkA7oGlzdPp9MbAsd3Ji4UZsMGg4FVVSUFlszIKbUNF1cwsFHWR20Qj6Mj/95HG7MUS/ECnEhjidY9GUac25zcnj/XaxT8oPr7qkKT5AI4z81MHypS5/N5h+hRIQqKOB28RJOAAFBtRD5VeLr4pRTZhAQNppvVZKiSN1VIweOLijAUd8CJNrXhlb7BP8utB6eGHWedz2ebTCZJQj4ejyXNjfNTIkGhTpGHfF6Nw3G+CtkYbEVaOvWiKoOnJNwKP/wenj4KD9Umjfw8vw9L3vkU42HDwlGmw/F70b36IiMmYJbwfD7bbDZLHA1GYgpwllEs7IN+fX1NzBXLtPGlMQRyfX9RFNY0Ta+eD/16tBH59KF/yxE3OZDFG6Ev0xidzD4pNi42RywqJa3EppEa2zcBbgbXHbgMzzcHR0+yLgB9//F4tLZtUx4aK2AVJ+6boCgK+/rrr62ua/v3v/+deO5cJQ/69hz1yieFcUWfNPwegicifaJows2zqoD2PzuvojaHUjnl1Fio2/C/Y2n85XKx+Xxuz8/PxhaesVfJOx+R6uFwSFW4zuDxALlmzwd0OBxukkkKAEbmkpU8+L2cM2DSKYrFGZmzrDqXSYwKY1URLZ9YP4G4cLl6hByHgGNgsanPjeOj6XRq2+3WHh4e0uexrqLkl/IvL2FySZcvPgM+9QKXy8U+ffpkq9WqUzShkK7K0eOCKgEkAz6up1eIPIoM1AZVglgGyQpIKq0CLzjTvlEdZq5Gg78HRbIOqN0K7HY7Ox6PnSYZiKFKPAFu/p308eJM1tPhLlLNFdCSMBOYyzxGNGu0qBiKRdnLKAZWYZwSkOQKZHJ6AVUHGdG9rEvgRY4KeCMXgfPpGUcPw7mQZOgL5pkjL832ej1H/FzCzaDPQz6UfXHlkKrdizQA+GL4ghxloOBEFZDk6GEUdXJFUo4+jYpJ8d9yMi0Oadn8I7B2F9u38dSzXE42HA5vCkvTBmDT7QWbTiQoAQW/HCZ1ol2uMm7RIvVJuHmTOTuZE2gqmRZPsHJlKr/PHUmQ/FK4Rsm1ImuXqnZ/xU+oc2D8owplMNLwn314eEjtZLzeMM0xL5JnqNxkqDx8TjSCp52zd7nYnXsLsNWI2D/k2ZUKKccPRMkfLjyJ0txK4II1D4qLjwpsWEDqgLFv4VVvJnw39P++CXBDDdn0+A9wvR738olKoZSIFF0BLti9ihs+wVztg1qDvuyXeo/xeJxCXdxAqstIJJ5ly5UTpkaAlCloLiqN8hNctcz5icvlYrPZrNOEwjfBkJFq27Y2m81SzI9FnKr4k09nTnuPANF9HLdZi4Af73LvG6QYOHXKIzc2mUzsm2++sY8fP9r79+9vElzRxnTMpLALS+Aj8osl8vyeyrQr/V+fwPV8PicrwBT6EHUA3toENfuo7OU0YyS85EVQfLyLF1QuXrkS1NBj6OoRBkqhFL+vNoNXLj0+PtpoNLLFYtHBEpjb4OTX27dv7e3bt1KDF9U25MApWzelYWSQGPH8OF6k7Ou67qiGLpfL5w2AqNETCKpok30sPihqRKTy2MhmqdJmBk94ir755hv78ssvE17Bz0Okq1yIcguo1nVtvppkNO2TycQ+fvxoHz9+tIeHh45Qlq1AZL6VGIWbS/KpVwkrnD+2eniYL5eLjUajToOptm2tdPPvyNBjf25r1hcWqTCNY2EVEqk+A5z08e9tmsZWq5X99a9/tePxaE9PTx2dgT+PGT8mlHDCttut/fTTTzYcDlPnTbeInA7m/LoTZOwOo3K1HL5BjMRKZ5U5RGV0LoLCVjWj0cg2m42dTqfkEko8PQ6ClJ9SG4CTFUxCqMRJLn8fsX44hv/85z82Ho/t3bt39vT0ZOfzuZPt8g2Ai5ir9vGNxCdOjccnc7vd2g8//GBFUdh6vb5h5WazmRVFkbSTPJaorgC/T4leGOzhZlel6Vym3ratjUajBPRTcaj/53Q6vYnvlc9X1Tw5LNCnsuWBcg6ew6h//vOfKdvogBA3gdI15j6L2TvF6jHj6d08eB6qqrJvvvnG6rq2H3/80ZbL5Q0oVJlXThMrMQlrJllWx+6DtY9t26YsoYPoIZoJ7JEbMVY5ti0nwuTkiWK2nNRBkz2ZTGyxWNycYG+Vys/B2FmVl+XUOWhyVeZSpWN5wh2bIJnDTa9U+KiqozgyQFwRFb6oSiZ059gAMymCfGe4egcnU1GcESUZDYw7kESly6rJw/l8tj/96U+22+3su+++k/42om+jvn8Rr99X94d/5kaYPkeHw8H+9a9/2XQ6TU0vPV1clmVi5fb7fW/TB6VC4p5AUSfXKA/ifQp8zVNdgNenI9qPkjLKX7IuPurioWrxVaoVZU7ffvutDQYDm8/nlqtl5LHhaYmaODKxpXL9GAarDcWfsd/vbblcpnJvfLfRaJTK55yKVhY3IqIi6xm5VWy84e9eVVWKdkrfTd54IOpEGZUtMUGEZicqcmBLgKbVuQh/OW+Z9t1333W0hgrxRp/HYaoytRhD89hUY0iuWeBwTG3Q0+lkr6+v6fmLxcI+fPhgm83Gfv755xSJMf7hpJhqapWzIPxOvtZt237WBHJm7J48uiIrlComCoEUIsZCUew+ggWWub44qh4hkorj5Kl4H8uz2TJhroK7lUZ0uP/ZS+q8NNwrhI/Ho/3yyy/SKubo9ahcTrXDZxDZtq0N3Tep7FfUCJonCZUmyryyKe5rxcKgyReeFcecgeOxMIHD1icaC5pNVSfJERFHC6qFjurA4l1APW/Pc8RiD6y8Vhb4HlzDVmvojQc6JcPEnSsNXh9B5C/uL6nSxrmmCqpejtO5yhqoTKBqOq1MJfcGwA2FixlpFKOmknyC/Tnr9bqjl1SSfC7OURgod2VMpIN0fFWi2eXYkxdN9aTJJWFUzV8uWuC4FjckM4ZRkiWXjkZlLH6WWlgUuJ5Op5s5wGiAMcY9m2AwGNhms7GffvrJ5vO5LZdLKaHHknyl+mG2U9HFqtWvg/6SgQTGieoyBv4QlexQdWgsBlVsHy+a6nkTpWijsA+tgCJSfOH9RKCF8EnCfAEjcUzecASB4FBxCOfz2Z6enmy5XIbKKAdseEVM1KJXsYaROAf0C+VNOOSnA82OYth4QfvKnnIl3oo8Yl5A8d3qciYOz9j/4+8fPnywtm3t06dPYbNJb9TEuQDFGCr3qe4pYHenzDluOi/66NMWqjnCMfszXPMxVHIuJaDgU88Lyrl9lk0pWravSZOipZX1iEIh1WeIy8j++Mc/2rt37zob5i9/+Yu9efMmxfGYUWM6XJVzRxFErhZBgUzPVXg1MfdaUA0gmAuJtJZwZU0pmaNIY8YxMwMl3iSqzInDtIjUQD+NUYYCVaoalyMb9e9///vfb3ICP/74ox0OBxsOh/bnP//ZvvvuO1utVimdiu3yFcmk4vGcDEyFocj6cTpYpYdz8jAFpr3DSMlgSBVH8I5V3b8UMkZRI4d47ttQXaNEoz4ZKGTEujj+xWxjdLWN/9mrnvH7PIEzHA7t+++/t6ZprK7rRON++eWX9vT0ZKvV6qZzuYPG6OJIRSQp8KzawOKBVA20ouqoTjEo0P2DweC3W8OiFit9SQYEWHxrBloJVMx4MYdvvijs5CSN6tatiis5KuCESFQMwwLO6/Vqz8/PKWxaLpf21Vdf2ddff935P3w/DN0QtEUWLFfYij6c8QBGNFHSTV31w1xI6R0mMPnDk6PoUMwaMv8eTSbHuXhd6n6/T63Trtdr6nRRlmXKq/PNWhENnLsoMkoOcRcPlGe7fM2tw7fffmur1aqzkeu67txxyFp+VgZxqjfXtj833qiLisIFLCsbDoefK4PQz6LWTlXiRMSL6mad6zjuz/nw4UNqjb5YLOzt27epIcVkMrGqquz5+TnRpNgSjYWbDNhU+baiVVWXMt/MHP7t93v74YcfOnODdyqrOgB2P6p1m7pfKMfwKc0gWjoFNPH5/n2lDz7qzRu1M3HFMJssjKXV9XH4fGfDvIs2K1mc+mT1S9QyTlX9qMZXbNX4NCnwxBskYt0U6IpOqNoErDFQtRSKEIoSUMql4zNKVI0yv85EB1fBqElFLgE3QVQfuFwuOy3QvQml3yh2PB5tt9vdtJFXyZwPHz4kda/n5r///nvJYURavQitRz2Vo43FFoIvlc718EdXzCrhnKYhCuf5Kh/8zBIJBqXaiQonUQnLDCBe8Ij6PA5z/FQ4BtlsNqkhRV3X9t///je1qOGaObYsZpawgn+/X7qUaxAZ9SpWrKfCRlFDZgav6FZyIDC3WH3C0qgRVC4LW+IV7JiocGsQ5feRo+b+OyigZI2Ain85MnAFMHbQVoWYLBnf7Xa23++TyDOq2GVwmkue5Pj9SHmj7jFWlkOF3SpiUalsdb08W6Xo4quOK+eXUehU7XjuUKGUQmx6o4nHGN7DySipoZA6jo1Lzxj5Rr4wEoIq/35P7X5UnMJzGgFCdVpz4bmy3HiAWQ/gn1MyEMKya9XESN0BHHX1iLpx5nwZRwxsrlk+heCQQafKOjIzqQQUTMsqnkQdHLWJIqAYbRw0/4zq++4GRveIa4J9gnAtzufz5zCQrxyNBAfRtaROK7JQgweh2DA+obw4yuRyiKbAmbe25WtquPBC1R2quFkBPEVDR907VPUuz4OqnVCp+JzVUdfVMW2P710q/R/XnDMAyl1IpGJgpdRljkC1heer3DHJxI2YFOePqV60ZNyePmqujIvIUvMINHI4misHj274VMmbeyMOjBpUcgnnpm3b35pFs89TDQ4RJGKygs04mxp1kll5rFgsjCjw55TPYyHlzYvSFfKRikaNQ+kf7uldFNVERh1B1FgiU88/E3USVXON71Fyu1a+sJHboirqFHco07C4ee5pdcIhFPtADFm9OJSRME8IF22qhheRwkhpJVU4qWRyUcZPAVyOTriXT1RxHc1hdKkF/l8qDkV5U0Qm5O74UbsZJx19cZ9ciSMNJn4Y8CgaV4E0Vvuo+r9IucMKKRaV8viQ94hYuYgLUPqLaIMqljJXycQ5m+v1+pkH8ELBXK99VQShysQU2ENAGCUqolIybHTI2r2ojDsq4+IcRVSmpWTZWLeg5GdcFNt3e6dqO8/AOXcJBrfr442jxoAZRD8Upep8He20qMqHVbjYPFLRsDnyRWUhWX+HJ00JKRR6jpizHMOmQF6OGIquuFPm+vemhu9RPXEndbd6qgQ/9QfwH4yuU8stvAJxDIByeepIIBFZiqjMC8eGiS2+kCqaVMVrRGPmLGOkQFI0sYpU+m4qVcomfAa/nyLGVFrYN0ip2r2xsvXmssGgxRuqilUVCw5Y8QlKIJmbVL+N0wkirgdkd6FSshwb9/nsXDvZvqIM1UcwKrfrE3qqht2RNVRVRe4KS6xcjV5E9eBVSRHuAaTQOde+K8CV09Mz2VEUhX311Ve22+3s5eUl1DKiKeT7CCIAmMv65ZIykc+/B7UrwWxf63ylKFYVUS4yLYoiXWBdeqjG3bE4BMtJxHjCOe2p+HgGJBGAi7qH+vdVVZVu3PYaO7QyKu7nEDcqCv09JjqSzvWJXxXax0qg6OLN6Fq4SCugoqK6rq3EzlH4gGjxlXiRlSxR2ZJqO6N6/uViVwasl8vFnp6eUvrZXYK6twdZRSVAUQg9KtDM5RlyTF/OiiiNAja84LsVVBeQHPDFNUobwGvF8Yvr4SNRJWfcUMjQNwGK31d3BEcnxuldNO+uK4hy9pxhU1fZRMUhCh/0RS8qNOy70DraCEx5K7wRqaT4GS5tL8vSht4XL+nEodWp6qun/FtEVXJcmruOViUz7hVEKCTvZg41hMqn8wmLFiPXJY0roFV003dbiapm5iwq9xlSBFhUiIMXgHhziF/HPEwdI1AIijtG3UjJiD2K9bnIUXHYSrBxT8UrdtbKNV7Kxd65f0MxSw6kjkajpG7OJWByBTAqP8CAMAoh1cbmZ/lt706hpwsjfACOCvF+Geb4FVDDU6dSyhHTpvxylAlD369YQdWbUJnqKOLIMYcMYplg8hYy3jDS9YxKvxhFBSqncE+95b38AY+j0ybOY2inObFYg5tF5VDy7yE41G5lV6C6hUfAUNXvRT0M2R+r5JdyWYqS9XE0TZNKyTysvsfUR+xkFMfnXGFOBIpaSrdq3uByiD1lPUbMceqqrRmb+SjH3vcrwheKo1cNqxEdqz7B3JQ6QtC5tiyqZOt8Ptt6vU79f9R7KCwUldRFSap7Fj4ShvqzveAmrTveTOFuICpsiDaDMrNRWzmVD1d3DnCLWbUYSpiRk3vnJOARWo+IHbZOrkC+p01LBDKjjmdRoqyvJ5HKRzRNk3I1g8Hg840hTqhgtkvJm3Pp29yt2arFuco55HrxR9agj77NTaA6QUgcKUsX3R8YgVfl76PkUK4WIbpmPqdm4s3tEY/7/4QBMJTZ7Xb28PDQAYNcsKAaL0R1A4rDz5n7KL2r0tT3mMSofCxqdhHJp3MW5B5iJ9rYUeY191m5cJjdMeZo/E5h0gj+NkF1XSc3wFe4YciF+YEoXle7mJMYkUmMmlUpsibCGSqppNLXCjhFobA6ibnCE/WluPvIGuQkYQyGcyGv/7lpms4NsKk83L/cDex2O5tMJp2SJoxVc02fVLMGJpSiiWYqNgeaIq18X46dpdNqQXONnbiqKZJ5Ky5enWKlpVTRj5KeM15T7tijG7/C9+Zyb5zwtm1tPB6nDaAWgAs91WlU1Tw8aWweuQeuyoJFDFvuPh3+d59kLC9jNTKGhHi6WFiBCTPmKaJ6h5wkLHJBCnQyDxM9A83/aDS6vZ+YpVIOEA6Hw02Ha97BUf/AiJDgMrH5fJ4aJHJ+PufjVReNnFtRVCu+W45lU3oFZAlzl0UpU50Doip05HSuqrrKVWYNh0M7HA6J6r/BReyf/V6e3W4X1qlH9fY5lk0t0HQ6tTdv3nQuprynK7mimqN2qY58lSI2pwdkqlbpDFi4mqNpVYlYdFCiSuZc7iWnMt7tdlbX9U29x2Aw+CwI4YUejUbWNE26RURl9iKdWa6aGF+wbVt7eXnpXFDJNQiRHu6epBTToEhVq7Erqll1GlWtc90VcVCcmwAACrxJREFUcL2EqkTKZRBzQFCRT9GB8Dkuy9Kapkl3QWFpXcIBKtvlzRk2m83NzlftYLGtKcf8zA7iRluv1/by8pImq67rTtuZnNQqyjoq/psxB/t9ZX1UTWOuKIOtjGoBn5PC33PrKiuBVM9F7u+42WzS/UBSpqZiXu9rb/a5QyXX1qnMH19+hKlYXBQmSBCFs8o36uARsWtoPXCRlannTF/fla7chk3VCCpuoS+TmOt6nsMG7Io4GVZVVSqv9w2AUYY/o1SXGPnkTSYT2263aTPwSWFTGpV95+hf1P+rCc6FjSpe9uew9IuRvVqAqL8P9zJWdDdrHVUxS870MyBFF8J4Symv2PWWZWmfPn36LesHFqkTskdKF9T3bzab1C2rz4z1UZJ9SFhlBXMKl6jxgqKwOcyMmLk+di66mSPi4/siDH+uK7F4kRWNzkQdvmNVVbZerztrGLahy+n9zMym06nt9/tOKzmFUrmnPi+OuiRSmWVG50p8krs9O6pEVmxlpFKK8EYkic/5dNVeNqoSqus69fCNGL7IdWC3Fr8BHq+miSKPYU7m5AObTCa2Wq06N4pHcW7OOkSMW8TIqYxWdJ2NUteoNHJkbfqijOhEq8ZPqr5PYQR8Vl3XNp1OO4DNDxsKXyJq29+nLEtbrVZWlmVqvhX1D7xer583gKqwwZZxzgp6Sze+4p2JHvbj2EOPTZfKl0eFFLk7DJX5VUxkBEpzXEaEG/pqGThSyfVVwK5gLr9TuYic7tD5G2d08eq6CD+VuZOGoGg+n9vz87ONRqMU80aFnkwv50qjWHUU+SpFJed4dSX3UpEEbiZ1KUVfZjJK5UZ8Apd3I/D2Cx2jqMK1fCyju1wuKXez3W5tNptJt6jmpezrlIUuYjKZ2HK5tPfv33dMlCpcVNfAcZ4g0ujxhsmlaCPhQy4yyYlVuNlUbnHVpsuVdedqIvF6HRVq8vO5OqooCvvll19sOp3enPpcTeJQyb7xA/Dk+HWt7mOwQTKaV9XiPIcbchp8Zaa5aVVOcRRtLKWZU9fh3KO94xI0/gzuzqVOIp78XHdTzgU4abdcLq0sS5tOp507oHNjTyAwusJN9brx8isPDVkurnLUEUDknZm701eRK4rDiKIZhQ8Uq5kDsrmMmxqzN6pi8Mr1+pEWIddxDAmf5+dnO5/PNp1ObyKjHLk1GAw+9wiKZMiqD79fcbbdbq1pmrQJItZNycmia1lytQB48nM5/z7tnGqIpU5ZjuPIJXUUJ6HqF3jTYKgcye/w5Ltia7PZJL8fSe1yX8Mo/FKCD5y42Wxmq9UqScndEmB/2wikReRNn8lVdGjU0JHj9Rxaxw2YUzf16e+jcJjzFZFiKgqVOc+CiZ7VamXT6TTUL0YbIR1s1vb1vTzKyCeTiT0/P3d680Vl11wZpPLbOc38PVU2fRKzqJomB/b6yuD6tP+sqWQ3k0uW4S88YF7csVqtbDKZhAdC3aF4g/VyA4/MOJIX4/HYPn36FE6kMl8RSufIQW08NUG/pwVLpHO8J5uYk55xJBRtXGY7VSWVqkvgQtjn52cbj8dJ5BlhJqar+d6mYdSaVeW+Fdjy27D9/pwoFOpD9VGGL7rWJaex6xOM5iYqp8LN5e9VQUjUExA3nUr2cGYUw1JefGYEo45hkcCljKpflDhCoW7v6z8YDOz5+dnevHmTyqO4x4ACWmoDclu5HE6IFiXCNUq4mdMf5OoK1bWuOYzAvRhVG1hOqfv/1XVt+/3eXl5ebDabpZOv7nlmJXbOIpWR7+U+/1wQya3NncN+eXmxh4cHq+s6AURWDLPPUyxd1FiSFwzVRMpMcx1AdIVaX/dwRZnnupcoSZjqHRxlD/HZTvFuNpvO4vdZS9WxhX+mvAeJRxODcWxRFDYajWw4HNp6vbaHh4d0zx76H54wXxyWROcqd1XpuUoCRQ2ZFXGkZNX3CDgjyTdrG6LOnbzo3PK2qirbbDa22Wzs8fGxo0Jm85+7H5FTyGkDRL6PW8FGBQ58Unx3bjYbO5/PNpvNkjqIawNY0x6d4qhrR7Qhojau0QbpSwblqn4iV6O6nEXEjkqQ+aZ+eXmxpmns8fGxk91TafHcGDEqkMkg7sHTp2Pnxccd5pLv3W5n5/PZFovFjQZfgSN1+yX7RwVMWcmjJkmZXmVdVDzdF3bmLABzIuqwqXa9g8HAVquVtW1r8/m8c/Lv6Q+g6juVdH2owj9uL9ZHKnCrWD/ps9ksXQzl5ozJEG51rkIgJELUBY2KZ8iVb0Wtb6IoQOUT+qxErjsp5wkwDewxvl9mvVgskqRbnXh+h2itIkay7CNbOGd9j1XAD59Op3Y8Hu35+dlms5nNZrMOYo40dgzwVA6BrQbr6iNFM+sDI+4i14uP9ZN9rWf58xURVJalrddra5rGZrNZquML1TwBfZ/bqNgsItUF9PEAaNpzzYgVZ+9hYlVVtt/vrWkaWywWhjeWRrdps2nnhApLtSMBqQJeEXmUGwsveqT46esn7OJV7HjWtq09PT3ZYDCw+Xze6besOpfcE+Jx5MWHqCiKWz2A6pLdRyxwLaAqw/YXOxwOtlwubTqd2mw2kyVOqmBD5erZp6F5QyyTYxoVgRLJp7CiKCKeGIfkxJ0+9u12mzR8k8kkdWtTauWoiimX9IqIrMvl8tkF5KRPLFmKwoyopy6bYb8O1q2BcwaqVQuesoho6Us65W4fizaYAlJ9esIICPL1tNjy7XA4pBK8+XzeEXDyHCh53D2ZyQivpeqhCLhwL/uIo88lYlRxhZNGdV3b4XCw9XptVVUlgiMifBSC5jHeZLqCzmbMeEY99nJJHQaz7KZUHsRPddM09vr6mrR7KAePxDmRVcoplCOLgPihZFKGOeiI5eoTSOQ2B1LIzhhuNhsrisKm02mnjJk7fkeiFS5Nd1PN16hFt33mJGTKKkUdRqIWMd6Ea7fb2eVySQvPsvFIxaT+LZd3ENKvGzY3WYC+Xvi5+3RyjOE9HILr2cbjsZ1OJ3t9fbXdbmfT6TS5C9fKqVtKWCTCpEeuVWzU01+BwL7iFnUZtYtlmqZJal1vKslhncp9qL7DvQKP4F4mNP2dBhG5erbcxN3LDCr0GsXW4/HYRqORnc9ne319tfV6bePxONHKHisr3MGXQTGZpe7tU5MaXegUsYUM8HxDe/Vzasv+q16Pr7/Dkxm1z4k4GLbWag1yjGGHCu7jAiJFLg+QO4iwv1b4gusFPGw8nU623+/tf//7n5VlabPZrAOUONpgppEznNgGv09MosSuSrGMFul4PHbuPB4Oh+m0R00ocxRuX0kZ1yoii6i6qysLkiWC+pJDSqacawKVa7nGhEsiKn7lCxwnOIj0AhVPQPmFF03TdBZQET54jWr0/qq6B822T/7pdLLD4dBxU2VZdnw8/pzqtJbLQEYUL46Hay9YNa2ypZ0NoNQsfRyzMj0KZavFjSwJ3+zpP1NVVZpUpFAxjPJNgTeg4Wd7Qkq5O743gMeHoahvxuPxmGRaZVmmghnVERSf7xs10laouxiiu5zQEqhEUt9NJWbWZQL7Up4KKEZ3/+QAS3TTJpeFMRPpk435hsvlkjbCer3u+NeyLFPTiaIoUl0DXlLBp7pt29RV43g82vF4TKebGUH06RGhxuKPXIUx8wf3MH2clbw3UeSf+X/9B04mXw6cfAAAAABJRU5ErkJggg==";var Nn=Pn;
|
|
467
|
+
*/const ar=new Image;ar.src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAACACAYAAADDPmHLAAABgGlDQ1BJQ0MgcHJvZmlsZQAAKJFjYGCqSCwoyGFhYGDIzSspCnJ3UoiIjFJgv8PAzcDDIMRgxSCemFxc4BgQ4MOAE3y7xsAIoi/rgsxqOqd2d+pGwehjat+yq+1cc3DrAwPulNTiZAYGRg4gOyWlODkXyAbp0UsuKCoBsucA2brlJQUg9hkgW6QI6EAg+wGInQ5hfwGxk8BsJg6wmpAgZyBbBsgWSIKwdUDsdAjbBsROzkhMAbJB/tKBuAEMuIJdFAzNDXx1HQk4nFSQm1MKswMUWjypeaHBQFoIiGUYghlcGBQYDBnMGQwYfBl0GYCWl6RWlIAUO+cXVBZlpmeUKDgCQzdVwTk/t6C0JLVIR8EzL1lPR8HIwNAApA4UbxDjPweBbWAUO48Qy5rMwGDxhoGBuQohlrKcgWGLPQODeDBCTH020EnvGRh2hBckFiXCHc/4jYUQvzjN2AjC5nFiYGC99///ZzUGBvZJDAx/J/7//3vR//9/FwPtv8PAcCAHALbUa33lfYEHAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH5AobCyAEEhU0UQAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAACAASURBVHjalV3bkiLXESzoC9cZdle7lixF7IMj7Ad/qn/RVliybMmyZhkGGKCBBj+s6ig7yTqNJmJjbzPN6XOpysrKqjP429/+djUzu16vNhgMbDAY2HA4tLIsbTKZWFmW1rat7fd7O5/P1ratXS4Xw5+5Xq82HA47v1+vVzOz9Hcz6/zc5XKxtm07z/Ev/34elz9vOBzaYDCwtm3tfD7b6XSy6/Vq5/M5fU9RFFbXtZVlaXVdm5mlZ1wuFyvLMn2GP78oCjMzO51Odjqd0rNxrP5VFEXnl7+nf4bP4+VySe/jn+Hj97nzMU+nUyuKwo7HY3onfGZRFDabzWyxWNjpdLLVamVN06Tvw3nHL5xb/LfL5WIlDsJ/90Vu29bKsrTr9Wpt23YWHxfocrl0Jtf/HQeE/68GpDaBP5tfwsdzPp/tcrnYcDi0qqpsNptZVVVW17UVRZEWwZ91PB7TJuHF8gnxBR0MBukQ+Lh9kx2Px84iFUVhZVlaWZbpM3Hjq7nCeTezNObL5WLn81keoLqubTqd2vl8ts1mY03TpHGphY/mFte69P/gTaBOLf7CBR0Oh9a2rQ2Hw5tF8pfljYaf65/hz8Hv8/8/nU5p0cuytNFoZKPRyKqqSiceFxInECfRTzlaFPydLZSP1Z8zHo9tNBqlzXA6naxpGjsej3Y4HNJmqOu680z/bJ7H6/WaNu3lcrHD4ZDmDdfBF9/MbL1e236/l3OFm1ptAt4MJU4Un27frfhwPvG+0GaWTheamMgMqQ2AL+QL0DSNnc/nNPnT6dTG47FVVWWXy+XmM/CXLxr/P1shXxh2P/w8f0devNFolMbcNI01TWObzSZtVLcqfDh83t1FuYXiuSrL0sbjsRVFYa+vr2lO+DRHi8//jgei4wLYLKEFwIfipsAHKlPEbsD/7j/DE3q9Xu10OtnxeEy+ej6fp5PuC+obEn0qnlb/HceMC41+GBfbD4JbFDTZuFkQE7jFGQwGaZO6RXh9fU2bt67rjoVyrDUYDOxwOEi/79akqiprmsb2+33CJYy5/J0iF8DWouMCcKH5FLA7wMlmP+0P9wnCF1bPRdxxOp3scDiYmSVTy2bUzb0vBO9uXEj8N5wsPgkM3HDh8eTi+7CP5w3sG3c6nVrTNHY4HGy321ld1+k0O25wPKHG65vEN5SDPv8+drO5Lwad1+vVSpw0BSR48ZWJ50lEk46m3jcLY4jz+Wz7/d7MzCaTiY3H405UgSi9LEuJotmPIwD033E8yiziBLKlUT4Ux6Asqf8aj8c2Ho/tfD6nk+6Wwt0cR09u2aqqSt9zPB5vcJjCWJEVUAel7DMXKkrAk4MbQ/0M/r/7bNwg+/3ertdr8u24iH7a/d9wlzv6xs9UoSJvCPb/yl/ySeF/ZzPt74KuyDcbbtCyLG02m9nxeLTlcmnr9boTauM40d0cDoe0+BGuUqFzzhI44C5VWKJMmzrx/H3RTvOXc2DXtq3tdrt0OqbT6c3pcx/M5h9NI5rhnAnk08LjRovC40Bcge+IGwMxA4NqPiyOazzeX61WVlVVQvg4FneLDo755OM40MKyJYxcQbIA/NDIfCCCxYHyKcdFcfLIB7jf761pGiuKwubzeQJG7mv9xLMlYB/NII5fjMOo6KSrU65cCm9qhSXYwuAYGF9UVWXv3r2zpmlsuVzadrtNmGE0Gtn5fLamaTqRUUTm8EG455397yWHfAzsGDUiaFOxpm8QRpwO8Nq2tel0mtCvLzqSKMpcqZBMvVhkFpU7UBtMPVtZumizoFtSB8ldl5/4wWCQNsJ6vbbL5WJffPGFtW1rx+Mx+5loYdW7RiAZfy/ZxOMH9G0ChejdAvjv/iL7/d6KorDFYiERvZ98NGEK6KD5V0RPNFF4Chn0KbPPoFfNQy7WZvCLOMCt3uFw6LiFN2/e2MvLi/3jH/+wh4eHRA5dr1cry7IzN7zROWTNYRt0ryX7cwYZiNpVjM+cAVoBZ7aOx2MCOz7JfuJ9UdD0c6zOuABPm0LCjD944ftOewRsmRPhRVbg0RfFf7aqKptMJtY0TWfDOU56//697XY7Wy6XKWR0V6rcNLu6vq8bkolPj4rpmRLOoU8ndy6Xi+12O2vb1h4fH7t+B0I5PNFMaiDVrHw/x+/3+EF2MfckTnI4QJ0wB4Uq9h6Px50owefVreBkMkkU99PTk202G5vP5535UGPhOWGgGkUGQ4WIOeTLgUIflLNTnkXbbDZmZvbw8NAhNHzx0fw7y4exPsb+vFkQATMw5BOuACQyg8oN8IRGG94XmRlK3NA4Vmf0PBJifsPNvLOg7969s7qubbPZdDKnmLBjfKBctTqk/ueSzRxSnNGu4ZPmg3FSZ7PZWF3XNp/POz4nonHVCceQBicqOtF8Mpmq7ov1owhIAVLlShStnOjWX13faDRKC8zP8twGxvxuPXe7na3X60SJq3dCfKA4EA7fE/ZQ8TsnaCIziMSOZ8VeX19TbO8vzwvINGeExvHvjq5V7K8yYYrQ4mRQxI71bYK+UJFdElq/3W53Q/e6yXdSrCiK5PNPp1PSCaxWK5tOpwkcKmJKhZ6RBTCz3yxAn+lQdDCe+uPxaNvt1kajkU0mk87i4knHiVfiCPydQV4U4qgdz36Pn63Qfk5U0cccKs4BN3pVVck94pdbShfc8OINh0M7nU42Go3s7du39unTJ5vNZglLME7jw9PHGg45XufJZ3yA3+chXtM0tt1uE4/vQM99Gy40U7ycuUOqGK0RAy4kXSLTG0UtDB7v/cq5iQhLIFbwhA/O8WKxsMFgkEgfprI9RHRxzvv37ztJIU6JMwvIhwA35WAwsKECCYzWVU7AxRCHw8HW63VKeLgUC+N7NufI/CkWUqmJWJiCoCjiANRpxZdX38efo/QRymVE6Nx/d5CM3/P4+GiTycS2220KC3EhfQ18jtq2taIo7O3bt0kXwGAwEogo63S9Xm0YERbKr+BEOFW52WxSrtuFCxzjq8VnQQbG9Zg34J3tCFqZP/+ZSCSCAhTMp0fRzT0hJIet/Hmoe8D/H4/H9vDwYOv12g6Hww2NzVwJsozD4dDevXtnu92uIx9Dy+hzhO+KVH7CJzn5EJ9G1sVtt1ur69pGo1FSv6DpR9dRVVVnctACKHGo2tEMSO/RwanwMQJFvFlzz+bf2TqwtcS/V1Vlj4+PdjgcUrgcRV58iHy8ZVnaYrGw19fXThTmohJXL+XY3Ov1+hkDRKecdw/G+a+vr4m4iDRwatAe9+MmUdIuJoFyC6iUOQr98gJFGUx10nPkl+JReBPg5vcIabVadUx4n7ADuRNUS202Gzufz8nKsAVQhziNF3eof7CLL9mMuOnfbrdmZimp4+ZfWQ5W1Mznc/v48aN98cUXHTm1ynqxG1J4RAFAxQJGGkUlO+9zAyqrxtR0pGr2uVqv1wkXMKGj8hN+WPCzLpdLcr/r9TqtmzrpYRiLA2X/iYvvO8w1aXjy0VfxwB3I+NdoNLIPHz7YH/7wh5scO6pwGRiyzDuaZLWwyqzzpEesopKOq39ncKkApH/PbrfroPhc3p6BNOZO6rq26/VqDw8PNhgMkjtQqqUIGJd9oQ9ugP1+b/v9PpERTO0qMoTB0Xa7tR9//DHt4FyYxSpkxA/olljVq15YkUIKKKq6BUVQRZOMIR4mgvDnnOqNSKvISiFuSlRuWdrpdLLFYmHPz89Ja8GgV2kkzew3RVBfbYCreKqqsqqqOmlNJngY6WOat21b+/nnn+/i4BlguctAMKjSooq34CKRKNcfbQLFlnKaWlkdfj4DwkjHwGOPimNQiPL4+Jjk6FhowuPthPosjMBkA7oGlzdPp9MbAsd3Ji4UZsMGg4FVVSUFlszIKbUNF1cwsFHWR20Qj6Mj/95HG7MUS/ECnEhjidY9GUac25zcnj/XaxT8oPr7qkKT5AI4z81MHypS5/N5h+hRIQqKOB28RJOAAFBtRD5VeLr4pRTZhAQNppvVZKiSN1VIweOLijAUd8CJNrXhlb7BP8utB6eGHWedz2ebTCZJQj4ejyXNjfNTIkGhTpGHfF6Nw3G+CtkYbEVaOvWiKoOnJNwKP/wenj4KD9Umjfw8vw9L3vkU42HDwlGmw/F70b36IiMmYJbwfD7bbDZLHA1GYgpwllEs7IN+fX1NzBXLtPGlMQRyfX9RFNY0Ta+eD/16tBH59KF/yxE3OZDFG6Ev0xidzD4pNi42RywqJa3EppEa2zcBbgbXHbgMzzcHR0+yLgB9//F4tLZtUx4aK2AVJ+6boCgK+/rrr62ua/v3v/+deO5cJQ/69hz1yieFcUWfNPwegicifaJows2zqoD2PzuvojaHUjnl1Fio2/C/Y2n85XKx+Xxuz8/PxhaesVfJOx+R6uFwSFW4zuDxALlmzwd0OBxukkkKAEbmkpU8+L2cM2DSKYrFGZmzrDqXSYwKY1URLZ9YP4G4cLl6hByHgGNgsanPjeOj6XRq2+3WHh4e0uexrqLkl/IvL2FySZcvPgM+9QKXy8U+ffpkq9WqUzShkK7K0eOCKgEkAz6up1eIPIoM1AZVglgGyQpIKq0CLzjTvlEdZq5Gg78HRbIOqN0K7HY7Ox6PnSYZiKFKPAFu/p308eJM1tPhLlLNFdCSMBOYyzxGNGu0qBiKRdnLKAZWYZwSkOQKZHJ6AVUHGdG9rEvgRY4KeCMXgfPpGUcPw7mQZOgL5pkjL832ej1H/FzCzaDPQz6UfXHlkKrdizQA+GL4ghxloOBEFZDk6GEUdXJFUo4+jYpJ8d9yMi0Oadn8I7B2F9u38dSzXE42HA5vCkvTBmDT7QWbTiQoAQW/HCZ1ol2uMm7RIvVJuHmTOTuZE2gqmRZPsHJlKr/PHUmQ/FK4Rsm1ImuXqnZ/xU+oc2D8owplMNLwn314eEjtZLzeMM0xL5JnqNxkqDx8TjSCp52zd7nYnXsLsNWI2D/k2ZUKKccPRMkfLjyJ0txK4II1D4qLjwpsWEDqgLFv4VVvJnw39P++CXBDDdn0+A9wvR738olKoZSIFF0BLti9ihs+wVztg1qDvuyXeo/xeJxCXdxAqstIJJ5ly5UTpkaAlCloLiqN8hNctcz5icvlYrPZrNOEwjfBkJFq27Y2m81SzI9FnKr4k09nTnuPANF9HLdZi4Af73LvG6QYOHXKIzc2mUzsm2++sY8fP9r79+9vElzRxnTMpLALS+Aj8osl8vyeyrQr/V+fwPV8PicrwBT6EHUA3toENfuo7OU0YyS85EVQfLyLF1QuXrkS1NBj6OoRBkqhFL+vNoNXLj0+PtpoNLLFYtHBEpjb4OTX27dv7e3bt1KDF9U25MApWzelYWSQGPH8OF6k7Ou67qiGLpfL5w2AqNETCKpok30sPihqRKTy2MhmqdJmBk94ir755hv78ssvE17Bz0Okq1yIcguo1nVtvppkNO2TycQ+fvxoHz9+tIeHh45Qlq1AZL6VGIWbS/KpVwkrnD+2eniYL5eLjUajToOptm2tdPPvyNBjf25r1hcWqTCNY2EVEqk+A5z08e9tmsZWq5X99a9/tePxaE9PTx2dgT+PGT8mlHDCttut/fTTTzYcDlPnTbeInA7m/LoTZOwOo3K1HL5BjMRKZ5U5RGV0LoLCVjWj0cg2m42dTqfkEko8PQ6ClJ9SG4CTFUxCqMRJLn8fsX44hv/85z82Ho/t3bt39vT0ZOfzuZPt8g2Ai5ir9vGNxCdOjccnc7vd2g8//GBFUdh6vb5h5WazmRVFkbSTPJaorgC/T4leGOzhZlel6Vym3ratjUajBPRTcaj/53Q6vYnvlc9X1Tw5LNCnsuWBcg6ew6h//vOfKdvogBA3gdI15j6L2TvF6jHj6d08eB6qqrJvvvnG6rq2H3/80ZbL5Q0oVJlXThMrMQlrJllWx+6DtY9t26YsoYPoIZoJ7JEbMVY5ti0nwuTkiWK2nNRBkz2ZTGyxWNycYG+Vys/B2FmVl+XUOWhyVeZSpWN5wh2bIJnDTa9U+KiqozgyQFwRFb6oSiZ059gAMymCfGe4egcnU1GcESUZDYw7kESly6rJw/l8tj/96U+22+3su+++k/42om+jvn8Rr99X94d/5kaYPkeHw8H+9a9/2XQ6TU0vPV1clmVi5fb7fW/TB6VC4p5AUSfXKA/ifQp8zVNdgNenI9qPkjLKX7IuPurioWrxVaoVZU7ffvutDQYDm8/nlqtl5LHhaYmaODKxpXL9GAarDcWfsd/vbblcpnJvfLfRaJTK55yKVhY3IqIi6xm5VWy84e9eVVWKdkrfTd54IOpEGZUtMUGEZicqcmBLgKbVuQh/OW+Z9t1333W0hgrxRp/HYaoytRhD89hUY0iuWeBwTG3Q0+lkr6+v6fmLxcI+fPhgm83Gfv755xSJMf7hpJhqapWzIPxOvtZt237WBHJm7J48uiIrlComCoEUIsZCUew+ggWWub44qh4hkorj5Kl4H8uz2TJhroK7lUZ0uP/ZS+q8NNwrhI/Ho/3yyy/SKubo9ahcTrXDZxDZtq0N3Tep7FfUCJonCZUmyryyKe5rxcKgyReeFcecgeOxMIHD1icaC5pNVSfJERFHC6qFjurA4l1APW/Pc8RiD6y8Vhb4HlzDVmvojQc6JcPEnSsNXh9B5C/uL6nSxrmmCqpejtO5yhqoTKBqOq1MJfcGwA2FixlpFKOmknyC/Tnr9bqjl1SSfC7OURgod2VMpIN0fFWi2eXYkxdN9aTJJWFUzV8uWuC4FjckM4ZRkiWXjkZlLH6WWlgUuJ5Op5s5wGiAMcY9m2AwGNhms7GffvrJ5vO5LZdLKaHHknyl+mG2U9HFqtWvg/6SgQTGieoyBv4QlexQdWgsBlVsHy+a6nkTpWijsA+tgCJSfOH9RKCF8EnCfAEjcUzecASB4FBxCOfz2Z6enmy5XIbKKAdseEVM1KJXsYaROAf0C+VNOOSnA82OYth4QfvKnnIl3oo8Yl5A8d3qciYOz9j/4+8fPnywtm3t06dPYbNJb9TEuQDFGCr3qe4pYHenzDluOi/66NMWqjnCMfszXPMxVHIuJaDgU88Lyrl9lk0pWravSZOipZX1iEIh1WeIy8j++Mc/2rt37zob5i9/+Yu9efMmxfGYUWM6XJVzRxFErhZBgUzPVXg1MfdaUA0gmAuJtJZwZU0pmaNIY8YxMwMl3iSqzInDtIjUQD+NUYYCVaoalyMb9e9///vfb3ICP/74ox0OBxsOh/bnP//ZvvvuO1utVimdiu3yFcmk4vGcDEyFocj6cTpYpYdz8jAFpr3DSMlgSBVH8I5V3b8UMkZRI4d47ttQXaNEoz4ZKGTEujj+xWxjdLWN/9mrnvH7PIEzHA7t+++/t6ZprK7rRON++eWX9vT0ZKvV6qZzuYPG6OJIRSQp8KzawOKBVA20ouqoTjEo0P2DweC3W8OiFit9SQYEWHxrBloJVMx4MYdvvijs5CSN6tatiis5KuCESFQMwwLO6/Vqz8/PKWxaLpf21Vdf2ddff935P3w/DN0QtEUWLFfYij6c8QBGNFHSTV31w1xI6R0mMPnDk6PoUMwaMv8eTSbHuXhd6n6/T63Trtdr6nRRlmXKq/PNWhENnLsoMkoOcRcPlGe7fM2tw7fffmur1aqzkeu67txxyFp+VgZxqjfXtj833qiLisIFLCsbDoefK4PQz6LWTlXiRMSL6mad6zjuz/nw4UNqjb5YLOzt27epIcVkMrGqquz5+TnRpNgSjYWbDNhU+baiVVWXMt/MHP7t93v74YcfOnODdyqrOgB2P6p1m7pfKMfwKc0gWjoFNPH5/n2lDz7qzRu1M3HFMJssjKXV9XH4fGfDvIs2K1mc+mT1S9QyTlX9qMZXbNX4NCnwxBskYt0U6IpOqNoErDFQtRSKEIoSUMql4zNKVI0yv85EB1fBqElFLgE3QVQfuFwuOy3QvQml3yh2PB5tt9vdtJFXyZwPHz4kda/n5r///nvJYURavQitRz2Vo43FFoIvlc718EdXzCrhnKYhCuf5Kh/8zBIJBqXaiQonUQnLDCBe8Ij6PA5z/FQ4BtlsNqkhRV3X9t///je1qOGaObYsZpawgn+/X7qUaxAZ9SpWrKfCRlFDZgav6FZyIDC3WH3C0qgRVC4LW+IV7JiocGsQ5feRo+b+OyigZI2Ain85MnAFMHbQVoWYLBnf7Xa23++TyDOq2GVwmkue5Pj9SHmj7jFWlkOF3SpiUalsdb08W6Xo4quOK+eXUehU7XjuUKGUQmx6o4nHGN7DySipoZA6jo1Lzxj5Rr4wEoIq/35P7X5UnMJzGgFCdVpz4bmy3HiAWQ/gn1MyEMKya9XESN0BHHX1iLpx5nwZRwxsrlk+heCQQafKOjIzqQQUTMsqnkQdHLWJIqAYbRw0/4zq++4GRveIa4J9gnAtzufz5zCQrxyNBAfRtaROK7JQgweh2DA+obw4yuRyiKbAmbe25WtquPBC1R2quFkBPEVDR907VPUuz4OqnVCp+JzVUdfVMW2P710q/R/XnDMAyl1IpGJgpdRljkC1heer3DHJxI2YFOePqV60ZNyePmqujIvIUvMINHI4misHj274VMmbeyMOjBpUcgnnpm3b35pFs89TDQ4RJGKygs04mxp1kll5rFgsjCjw55TPYyHlzYvSFfKRikaNQ+kf7uldFNVERh1B1FgiU88/E3USVXON71Fyu1a+sJHboirqFHco07C4ee5pdcIhFPtADFm9OJSRME8IF22qhheRwkhpJVU4qWRyUcZPAVyOTriXT1RxHc1hdKkF/l8qDkV5U0Qm5O74UbsZJx19cZ9ciSMNJn4Y8CgaV4E0Vvuo+r9IucMKKRaV8viQ94hYuYgLUPqLaIMqljJXycQ5m+v1+pkH8ELBXK99VQShysQU2ENAGCUqolIybHTI2r2ojDsq4+IcRVSmpWTZWLeg5GdcFNt3e6dqO8/AOXcJBrfr442jxoAZRD8Upep8He20qMqHVbjYPFLRsDnyRWUhWX+HJ00JKRR6jpizHMOmQF6OGIquuFPm+vemhu9RPXEndbd6qgQ/9QfwH4yuU8stvAJxDIByeepIIBFZiqjMC8eGiS2+kCqaVMVrRGPmLGOkQFI0sYpU+m4qVcomfAa/nyLGVFrYN0ip2r2xsvXmssGgxRuqilUVCw5Y8QlKIJmbVL+N0wkirgdkd6FSshwb9/nsXDvZvqIM1UcwKrfrE3qqht2RNVRVRe4KS6xcjV5E9eBVSRHuAaTQOde+K8CV09Mz2VEUhX311Ve22+3s5eUl1DKiKeT7CCIAmMv65ZIykc+/B7UrwWxf63ylKFYVUS4yLYoiXWBdeqjG3bE4BMtJxHjCOe2p+HgGJBGAi7qH+vdVVZVu3PYaO7QyKu7nEDcqCv09JjqSzvWJXxXax0qg6OLN6Fq4SCugoqK6rq3EzlH4gGjxlXiRlSxR2ZJqO6N6/uViVwasl8vFnp6eUvrZXYK6twdZRSVAUQg9KtDM5RlyTF/OiiiNAja84LsVVBeQHPDFNUobwGvF8Yvr4SNRJWfcUMjQNwGK31d3BEcnxuldNO+uK4hy9pxhU1fZRMUhCh/0RS8qNOy70DraCEx5K7wRqaT4GS5tL8vSht4XL+nEodWp6qun/FtEVXJcmruOViUz7hVEKCTvZg41hMqn8wmLFiPXJY0roFV003dbiapm5iwq9xlSBFhUiIMXgHhziF/HPEwdI1AIijtG3UjJiD2K9bnIUXHYSrBxT8UrdtbKNV7Kxd65f0MxSw6kjkajpG7OJWByBTAqP8CAMAoh1cbmZ/lt706hpwsjfACOCvF+Geb4FVDDU6dSyhHTpvxylAlD369YQdWbUJnqKOLIMYcMYplg8hYy3jDS9YxKvxhFBSqncE+95b38AY+j0ybOY2inObFYg5tF5VDy7yE41G5lV6C6hUfAUNXvRT0M2R+r5JdyWYqS9XE0TZNKyTysvsfUR+xkFMfnXGFOBIpaSrdq3uByiD1lPUbMceqqrRmb+SjH3vcrwheKo1cNqxEdqz7B3JQ6QtC5tiyqZOt8Ptt6vU79f9R7KCwUldRFSap7Fj4ShvqzveAmrTveTOFuICpsiDaDMrNRWzmVD1d3DnCLWbUYSpiRk3vnJOARWo+IHbZOrkC+p01LBDKjjmdRoqyvJ5HKRzRNk3I1g8Hg840hTqhgtkvJm3Pp29yt2arFuco55HrxR9agj77NTaA6QUgcKUsX3R8YgVfl76PkUK4WIbpmPqdm4s3tEY/7/4QBMJTZ7Xb28PDQAYNcsKAaL0R1A4rDz5n7KL2r0tT3mMSofCxqdhHJp3MW5B5iJ9rYUeY191m5cJjdMeZo/E5h0gj+NkF1XSc3wFe4YciF+YEoXle7mJMYkUmMmlUpsibCGSqppNLXCjhFobA6ibnCE/WluPvIGuQkYQyGcyGv/7lpms4NsKk83L/cDex2O5tMJp2SJoxVc02fVLMGJpSiiWYqNgeaIq18X46dpdNqQXONnbiqKZJ5Ky5enWKlpVTRj5KeM15T7tijG7/C9+Zyb5zwtm1tPB6nDaAWgAs91WlU1Tw8aWweuQeuyoJFDFvuPh3+d59kLC9jNTKGhHi6WFiBCTPmKaJ6h5wkLHJBCnQyDxM9A83/aDS6vZ+YpVIOEA6Hw02Ha97BUf/AiJDgMrH5fJ4aJHJ+PufjVReNnFtRVCu+W45lU3oFZAlzl0UpU50Doip05HSuqrrKVWYNh0M7HA6J6r/BReyf/V6e3W4X1qlH9fY5lk0t0HQ6tTdv3nQuprynK7mimqN2qY58lSI2pwdkqlbpDFi4mqNpVYlYdFCiSuZc7iWnMt7tdlbX9U29x2Aw+CwI4YUejUbWNE26RURl9iKdWa6aGF+wbVt7eXnpXFDJNQiRHu6epBTToEhVq7Erqll1GlWtc90VcVCcmwAACrxJREFUcL2EqkTKZRBzQFCRT9GB8Dkuy9Kapkl3QWFpXcIBKtvlzRk2m83NzlftYLGtKcf8zA7iRluv1/by8pImq67rTtuZnNQqyjoq/psxB/t9ZX1UTWOuKIOtjGoBn5PC33PrKiuBVM9F7u+42WzS/UBSpqZiXu9rb/a5QyXX1qnMH19+hKlYXBQmSBCFs8o36uARsWtoPXCRlannTF/fla7chk3VCCpuoS+TmOt6nsMG7Io4GVZVVSqv9w2AUYY/o1SXGPnkTSYT2263aTPwSWFTGpV95+hf1P+rCc6FjSpe9uew9IuRvVqAqL8P9zJWdDdrHVUxS870MyBFF8J4Symv2PWWZWmfPn36LesHFqkTskdKF9T3bzab1C2rz4z1UZJ9SFhlBXMKl6jxgqKwOcyMmLk+di66mSPi4/siDH+uK7F4kRWNzkQdvmNVVbZerztrGLahy+n9zMym06nt9/tOKzmFUrmnPi+OuiRSmWVG50p8krs9O6pEVmxlpFKK8EYkic/5dNVeNqoSqus69fCNGL7IdWC3Fr8BHq+miSKPYU7m5AObTCa2Wq06N4pHcW7OOkSMW8TIqYxWdJ2NUteoNHJkbfqijOhEq8ZPqr5PYQR8Vl3XNp1OO4DNDxsKXyJq29+nLEtbrVZWlmVqvhX1D7xer583gKqwwZZxzgp6Sze+4p2JHvbj2EOPTZfKl0eFFLk7DJX5VUxkBEpzXEaEG/pqGThSyfVVwK5gLr9TuYic7tD5G2d08eq6CD+VuZOGoGg+n9vz87ONRqMU80aFnkwv50qjWHUU+SpFJed4dSX3UpEEbiZ1KUVfZjJK5UZ8Apd3I/D2Cx2jqMK1fCyju1wuKXez3W5tNptJt6jmpezrlIUuYjKZ2HK5tPfv33dMlCpcVNfAcZ4g0ujxhsmlaCPhQy4yyYlVuNlUbnHVpsuVdedqIvF6HRVq8vO5OqooCvvll19sOp3enPpcTeJQyb7xA/Dk+HWt7mOwQTKaV9XiPIcbchp8Zaa5aVVOcRRtLKWZU9fh3KO94xI0/gzuzqVOIp78XHdTzgU4abdcLq0sS5tOp507oHNjTyAwusJN9brx8isPDVkurnLUEUDknZm701eRK4rDiKIZhQ8Uq5kDsrmMmxqzN6pi8Mr1+pEWIddxDAmf5+dnO5/PNp1ObyKjHLk1GAw+9wiKZMiqD79fcbbdbq1pmrQJItZNycmia1lytQB48nM5/z7tnGqIpU5ZjuPIJXUUJ6HqF3jTYKgcye/w5Ltia7PZJL8fSe1yX8Mo/FKCD5y42Wxmq9UqScndEmB/2wikReRNn8lVdGjU0JHj9Rxaxw2YUzf16e+jcJjzFZFiKgqVOc+CiZ7VamXT6TTUL0YbIR1s1vb1vTzKyCeTiT0/P3d680Vl11wZpPLbOc38PVU2fRKzqJomB/b6yuD6tP+sqWQ3k0uW4S88YF7csVqtbDKZhAdC3aF4g/VyA4/MOJIX4/HYPn36FE6kMl8RSufIQW08NUG/pwVLpHO8J5uYk55xJBRtXGY7VSWVqkvgQtjn52cbj8dJ5BlhJqar+d6mYdSaVeW+Fdjy27D9/pwoFOpD9VGGL7rWJaex6xOM5iYqp8LN5e9VQUjUExA3nUr2cGYUw1JefGYEo45hkcCljKpflDhCoW7v6z8YDOz5+dnevHmTyqO4x4ACWmoDclu5HE6IFiXCNUq4mdMf5OoK1bWuOYzAvRhVG1hOqfv/1XVt+/3eXl5ebDabpZOv7nlmJXbOIpWR7+U+/1wQya3NncN+eXmxh4cHq+s6AURWDLPPUyxd1FiSFwzVRMpMcx1AdIVaX/dwRZnnupcoSZjqHRxlD/HZTvFuNpvO4vdZS9WxhX+mvAeJRxODcWxRFDYajWw4HNp6vbaHh4d0zx76H54wXxyWROcqd1XpuUoCRQ2ZFXGkZNX3CDgjyTdrG6LOnbzo3PK2qirbbDa22Wzs8fGxo0Jm85+7H5FTyGkDRL6PW8FGBQ58Unx3bjYbO5/PNpvNkjqIawNY0x6d4qhrR7Qhojau0QbpSwblqn4iV6O6nEXEjkqQ+aZ+eXmxpmns8fGxk91TafHcGDEqkMkg7sHTp2Pnxccd5pLv3W5n5/PZFovFjQZfgSN1+yX7RwVMWcmjJkmZXmVdVDzdF3bmLABzIuqwqXa9g8HAVquVtW1r8/m8c/Lv6Q+g6juVdH2owj9uL9ZHKnCrWD/ps9ksXQzl5ozJEG51rkIgJELUBY2KZ8iVb0Wtb6IoQOUT+qxErjsp5wkwDewxvl9mvVgskqRbnXh+h2itIkay7CNbOGd9j1XAD59Op3Y8Hu35+dlms5nNZrMOYo40dgzwVA6BrQbr6iNFM+sDI+4i14uP9ZN9rWf58xURVJalrddra5rGZrNZquML1TwBfZ/bqNgsItUF9PEAaNpzzYgVZ+9hYlVVtt/vrWkaWywWhjeWRrdps2nnhApLtSMBqQJeEXmUGwsveqT46esn7OJV7HjWtq09PT3ZYDCw+Xze6besOpfcE+Jx5MWHqCiKWz2A6pLdRyxwLaAqw/YXOxwOtlwubTqd2mw2kyVOqmBD5erZp6F5QyyTYxoVgRLJp7CiKCKeGIfkxJ0+9u12mzR8k8kkdWtTauWoiimX9IqIrMvl8tkF5KRPLFmKwoyopy6bYb8O1q2BcwaqVQuesoho6Us65W4fizaYAlJ9esIICPL1tNjy7XA4pBK8+XzeEXDyHCh53D2ZyQivpeqhCLhwL/uIo88lYlRxhZNGdV3b4XCw9XptVVUlgiMifBSC5jHeZLqCzmbMeEY99nJJHQaz7KZUHsRPddM09vr6mrR7KAePxDmRVcoplCOLgPihZFKGOeiI5eoTSOQ2B1LIzhhuNhsrisKm02mnjJk7fkeiFS5Nd1PN16hFt33mJGTKKkUdRqIWMd6Ea7fb2eVySQvPsvFIxaT+LZd3ENKvGzY3WYC+Xvi5+3RyjOE9HILr2cbjsZ1OJ3t9fbXdbmfT6TS5C9fKqVtKWCTCpEeuVWzU01+BwL7iFnUZtYtlmqZJal1vKslhncp9qL7DvQKP4F4mNP2dBhG5erbcxN3LDCr0GsXW4/HYRqORnc9ne319tfV6bePxONHKHisr3MGXQTGZpe7tU5MaXegUsYUM8HxDe/Vzasv+q16Pr7/Dkxm1z4k4GLbWag1yjGGHCu7jAiJFLg+QO4iwv1b4gusFPGw8nU623+/tf//7n5VlabPZrAOUONpgppEznNgGv09MosSuSrGMFul4PHbuPB4Oh+m0R00ocxRuX0kZ1yoii6i6qysLkiWC+pJDSqacawKVa7nGhEsiKn7lCxwnOIj0AhVPQPmFF03TdBZQET54jWr0/qq6B822T/7pdLLD4dBxU2VZdnw8/pzqtJbLQEYUL46Hay9YNa2ypZ0NoNQsfRyzMj0KZavFjSwJ3+zpP1NVVZpUpFAxjPJNgTeg4Wd7Qkq5O743gMeHoahvxuPxmGRaZVmmghnVERSf7xs10laouxiiu5zQEqhEUt9NJWbWZQL7Up4KKEZ3/+QAS3TTJpeFMRPpk435hsvlkjbCer3u+NeyLFPTiaIoUl0DXlLBp7pt29RV43g82vF4TKebGUH06RGhxuKPXIUx8wf3MH2clbw3UeSf+X/9B04mXw6cfAAAAABJRU5ErkJggg==";var sr=ar;
|
|
442
468
|
/*!
|
|
443
469
|
* Copyright 2021 Cognite AS
|
|
444
|
-
*/function
|
|
470
|
+
*/function cr(e,t,r,n,i,a){const s=new o.Vector2(t.image.width,t.image.height),c=new o.Vector2(n.image.width,n.image.height),l=e.uniforms;e.setValues({...ie,uniforms:{...l,renderMode:{value:a},treeIndexTextureSize:{value:s},transformOverrideTextureSize:{value:c},colorDataTexture:{value:t},transformOverrideIndexTexture:{value:r},transformOverrideTexture:{value:n},matCapTexture:{value:i}}}),e.uniformsNeedUpdate=!0}var lr=r(40),dr=r.n(lr);
|
|
445
471
|
/*!
|
|
446
472
|
* Copyright 2021 Cognite AS
|
|
447
473
|
*/
|
|
448
|
-
class
|
|
474
|
+
class fr{constructor(){this._events={materialsChanged:new u.e},this._renderMode=be.Color,this.materialsMap=new Map,this._clippingPlanes=[]}get clippingPlanes(){return this._clippingPlanes}set clippingPlanes(e){this._clippingPlanes=e;for(const e of this.materialsMap.keys())this.updateClippingPlanesForModel(e);this.triggerMaterialsChanged()}on(e,t){switch(e){case"materialsChanged":this._events.materialsChanged.subscribe(t);break;default:Object(u.m)(e,"Unexpected event '"+e)}}off(e,t){switch(e){case"materialsChanged":this._events.materialsChanged.unsubscribe(t);break;default:Object(u.m)(e,"Unexpected event '"+e)}}addModelMaterials(e,t){const r=new Jt,n=new er(t+1,r);n.build();const i=new or,a=new nr(t+1,i);a.build();const s=dr()(()=>this.updateMaterials(e),75,{leading:!0,trailing:!0}),c=()=>this.updateTransforms(e);r.on("changed",s),i.on("changed",c);const l=function(e,t,r,n,i){const a=new o.Texture(sr);a.needsUpdate=!0;const s=new o.RawShaderMaterial({name:"Primitives (Box)",clipping:!0,clippingPlanes:t,vertexShader:oe.boxPrimitive.vertex,fragmentShader:oe.boxPrimitive.fragment,side:o.DoubleSide,uniforms:{inverseModelMatrix:{value:new o.Matrix4}},glslVersion:o.GLSL3}),c=new o.RawShaderMaterial({name:"Primitives (Circle)",clipping:!0,clippingPlanes:t,vertexShader:oe.circlePrimitive.vertex,fragmentShader:oe.circlePrimitive.fragment,side:o.DoubleSide,uniforms:{inverseModelMatrix:{value:new o.Matrix4}},glslVersion:o.GLSL3}),l=new o.RawShaderMaterial({name:"Primitives (Nuts)",clipping:!0,clippingPlanes:t,vertexShader:oe.nutPrimitive.vertex,fragmentShader:oe.nutPrimitive.fragment,side:o.DoubleSide,glslVersion:o.GLSL3}),d=new o.RawShaderMaterial({name:"Primitives (Quads)",clipping:!0,clippingPlanes:t,vertexShader:oe.quadPrimitive.vertex,fragmentShader:oe.quadPrimitive.fragment,side:o.DoubleSide,glslVersion:o.GLSL3}),f=new o.RawShaderMaterial({name:"Primitives (General rings)",clipping:!0,clippingPlanes:t,uniforms:{inverseModelMatrix:{value:new o.Matrix4}},vertexShader:oe.generalRingPrimitive.vertex,fragmentShader:oe.generalRingPrimitive.fragment,side:o.DoubleSide,glslVersion:o.GLSL3}),u=new o.RawShaderMaterial({name:"Primitives (Cone)",clipping:!0,clippingPlanes:t,uniforms:{inverseModelMatrix:{value:new o.Matrix4}},vertexShader:oe.conePrimitive.vertex,fragmentShader:oe.conePrimitive.fragment,side:o.DoubleSide,glslVersion:o.GLSL3}),p=new o.RawShaderMaterial({name:"Primitives (Eccentric cone)",clipping:!0,clippingPlanes:t,uniforms:{inverseModelMatrix:{value:new o.Matrix4}},vertexShader:oe.eccentricConePrimitive.vertex,fragmentShader:oe.eccentricConePrimitive.fragment,side:o.DoubleSide,glslVersion:o.GLSL3}),m=new o.RawShaderMaterial({name:"Primitives (Ellipsoid segments)",clipping:!0,clippingPlanes:t,uniforms:{inverseModelMatrix:{value:new o.Matrix4}},vertexShader:oe.ellipsoidSegmentPrimitive.vertex,fragmentShader:oe.ellipsoidSegmentPrimitive.fragment,side:o.DoubleSide,glslVersion:o.GLSL3}),h=new o.RawShaderMaterial({name:"Primitives (General cylinder)",clipping:!0,clippingPlanes:t,uniforms:{inverseModelMatrix:{value:new o.Matrix4},cameraPosition:{value:new o.Vector3}},vertexShader:oe.generalCylinderPrimitive.vertex,fragmentShader:oe.generalCylinderPrimitive.fragment,side:o.DoubleSide,glslVersion:o.GLSL3}),b=new o.RawShaderMaterial({name:"Primitives (Trapezium)",clipping:!0,clippingPlanes:t,uniforms:{inverseModelMatrix:{value:new o.Matrix4}},vertexShader:oe.trapeziumPrimitive.vertex,fragmentShader:oe.trapeziumPrimitive.fragment,side:o.DoubleSide,glslVersion:o.GLSL3}),v=new o.RawShaderMaterial({name:"Primitives (Torus segment)",clipping:!0,clippingPlanes:t,uniforms:{inverseModelMatrix:{value:new o.Matrix4}},extensions:{derivatives:!0},vertexShader:oe.torusSegmentPrimitive.vertex,fragmentShader:oe.torusSegmentPrimitive.fragment,side:o.DoubleSide,glslVersion:o.GLSL3}),g=new o.RawShaderMaterial({name:"Primitives (Spherical segment)",clipping:!0,clippingPlanes:t,uniforms:{inverseModelMatrix:{value:new o.Matrix4}},vertexShader:oe.ellipsoidSegmentPrimitive.vertex,fragmentShader:oe.ellipsoidSegmentPrimitive.fragment,side:o.DoubleSide,glslVersion:o.GLSL3}),A=new o.RawShaderMaterial({name:"Triangle meshes",clipping:!0,clippingPlanes:t,extensions:{derivatives:!0},side:o.DoubleSide,fragmentShader:oe.detailedMesh.fragment,vertexShader:oe.detailedMesh.vertex,glslVersion:o.GLSL3}),_={box:s,circle:c,nut:l,generalRing:f,quad:d,cone:u,eccentricCone:p,sphericalSegment:g,torusSegment:v,generalCylinder:h,trapezium:b,ellipsoidSegment:m,instancedMesh:new o.RawShaderMaterial({name:"Instanced meshes",clipping:!0,clippingPlanes:t,extensions:{derivatives:!0},side:o.DoubleSide,fragmentShader:oe.instancedMesh.fragment,vertexShader:oe.instancedMesh.vertex,glslVersion:o.GLSL3}),triangleMesh:A,simple:new o.RawShaderMaterial({name:"Low detail material",clipping:!0,clippingPlanes:t,uniforms:{inverseModelMatrix:{value:new o.Matrix4}},side:o.FrontSide,fragmentShader:oe.simpleMesh.fragment,vertexShader:oe.simpleMesh.vertex,glslVersion:o.GLSL3})};for(const t of Object.values(_))cr(t,r,n,i,a,e);return{..._}}(this._renderMode,this._clippingPlanes,n.overrideColorPerTreeIndexTexture,a.overrideTransformIndexTexture,a.transformLookupTexture);this.materialsMap.set(e,{materials:l,perModelClippingPlanes:[],nodeAppearanceProvider:r,nodeTransformProvider:i,nodeAppearanceTextureBuilder:n,nodeTransformTextureBuilder:a,updateMaterialsCallback:s,updateTransformsCallback:c}),this.updateClippingPlanesForModel(e)}removeModelMaterials(e){const t=this.materialsMap.get(e);for(const e of Object.values(t.materials))e.dispose();this.materialsMap.delete(e),t.nodeTransformTextureBuilder.dispose(),t.nodeAppearanceTextureBuilder.dispose()}getModelMaterials(e){return this.getModelMaterialsWrapper(e).materials}getModelNodeAppearanceProvider(e){return this.getModelMaterialsWrapper(e).nodeAppearanceProvider}getModelNodeTransformProvider(e){return this.getModelMaterialsWrapper(e).nodeTransformProvider}getModelDefaultNodeAppearance(e){return this.getModelMaterialsWrapper(e).nodeAppearanceTextureBuilder.getDefaultAppearance()}setModelClippingPlanes(e,t){const r=this.materialsMap.get(e);if(void 0===r)throw new Error(`Materials for model ${e} has not been added, call ${this.addModelMaterials.name} first`);r.perModelClippingPlanes=t,this.updateClippingPlanesForModel(e),this.triggerMaterialsChanged()}setModelDefaultNodeAppearance(e,t){this.getModelMaterialsWrapper(e).nodeAppearanceTextureBuilder.setDefaultAppearance(t),this.updateMaterials(e)}getModelBackTreeIndices(e){return this.getModelMaterialsWrapper(e).nodeAppearanceTextureBuilder.regularNodeTreeIndices}getModelInFrontTreeIndices(e){return this.getModelMaterialsWrapper(e).nodeAppearanceTextureBuilder.infrontNodeTreeIndices}getModelGhostedTreeIndices(e){return this.getModelMaterialsWrapper(e).nodeAppearanceTextureBuilder.ghostedNodeTreeIndices}setRenderMode(e){this._renderMode=e;const t=e!==be.DepthBufferOnly;this.applyToAllMaterials(r=>{r.uniforms.renderMode.value=e,r.colorWrite=t})}getRenderMode(){return this._renderMode}dispose(){for(const[e,t]of this.materialsMap)t.nodeAppearanceTextureBuilder.dispose(),t.nodeTransformTextureBuilder.dispose()}updateClippingPlanesForModel(e){const t=this.materialsMap.get(e);if(void 0===t)throw new Error(`Materials for model ${e} has not been added, call ${this.addModelMaterials.name} first`);const r=[...t.perModelClippingPlanes,...this.clippingPlanes],n=r.map(e=>new o.Vector4(e.normal.x,e.normal.y,e.normal.z,-e.constant));ur(t.materials,e=>{e.clipping=r.length>0,e.clipIntersection=!1,e.clippingPlanes=r,e.defines={...e.defines,NUM_CLIPPING_PLANES:n.length,UNION_CLIPPING_PLANES:0},e.needsUpdate=!0})}updateMaterials(e){const t=this.getModelMaterialsWrapper(e);if(t.nodeAppearanceTextureBuilder.needsUpdate){const{nodeAppearanceTextureBuilder:e}=t;e.build()}this.triggerMaterialsChanged()}updateTransforms(e){const t=this.getModelMaterialsWrapper(e);if(t.nodeTransformTextureBuilder.needsUpdate){const{nodeTransformTextureBuilder:e,materials:r}=t;e.build();const n=e.transformLookupTexture,i=new o.Vector2(n.image.width,n.image.height);ur(r,e=>{e.uniforms.transformOverrideTexture.value=n,e.uniforms.transformOverrideTextureSize.value=i})}this.triggerMaterialsChanged()}getModelMaterialsWrapper(e){const t=this.materialsMap.get(e);if(void 0===t)throw new Error(`Model ${e} has not been added to MaterialManager`);return t}applyToAllMaterials(e){for(const t of this.materialsMap.values()){ur(t.materials,e)}}triggerMaterialsChanged(){this._events.materialsChanged.fire()}}function ur(e,t){t(e.box),t(e.circle),t(e.generalRing),t(e.nut),t(e.quad),t(e.cone),t(e.eccentricCone),t(e.sphericalSegment),t(e.torusSegment),t(e.generalCylinder),t(e.trapezium),t(e.ellipsoidSegment),t(e.instancedMesh),t(e.triangleMesh),t(e.simple)}
|
|
449
475
|
/*!
|
|
450
476
|
* Copyright 2021 Cognite AS
|
|
451
|
-
*/
|
|
477
|
+
*/class pr{}pr.Black=new o.Color("rgb(0, 0, 0)"),pr.White=new o.Color("rgb(255, 255, 255)"),pr.Cyan=new o.Color("rgb(102, 213, 234)"),pr.Blue=new o.Color("rgb(77, 106, 242)"),pr.Purple=new o.Color("rgb(186, 82, 212)"),pr.Pink=new o.Color("rgb(232, 64, 117)"),pr.Orange=new o.Color("rgb(238, 113, 53)"),pr.Yellow=new o.Color("rgb(246, 189, 65)"),pr.VeryLightGray=new o.Color("rgb(247, 246, 245)"),pr.LightGray=new o.Color("rgb(242, 241, 240)");class mr{}mr.Red=new o.Color("rgb(235,0,4)"),mr.Green=new o.Color("rgb(46,164,79)");
|
|
452
478
|
/*!
|
|
453
479
|
* Copyright 2021 Cognite AS
|
|
454
480
|
*/
|
|
455
|
-
class Fn{constructor(e,t,n,r){var o,i;this._lastFrameSceneState={hasBackElements:!0,hasInFrontElements:!0,hasGhostElements:!0,hasCustomObjects:!0},this._rootSectorNodeBuffer=new Set,this._outlineTexelSize=2,this._autoSetTargetSize=!1,this._debugRenderTimings=!1,this._uiObjects=[],this._deepFlushRendererArgs={buffer:new ArrayBuffer(4)},this._renderer=e,this._renderOptions=r,this._materialManager=n,this._orthographicCamera=new l.OrthographicCamera(-1,1,1,-1,-1,1),this._renderTarget=null,this._originalScene=t,this._cadScene=new l.Scene,this._cadScene.autoUpdate=!1,this._normalScene=new l.Scene,this._normalScene.autoUpdate=!1,this._inFrontScene=new l.Scene,this._inFrontScene.autoUpdate=!1,this._compositionScene=new l.Scene,this._compositionScene.autoUpdate=!1,this._fxaaScene=new l.Scene,this._fxaaScene.autoUpdate=!1,this._ssaoScene=new l.Scene,this._ssaoScene.autoUpdate=!1,this._ssaoBlurCombineScene=new l.Scene,this._ssaoBlurCombineScene.autoUpdate=!1,this._emptyScene=new l.Scene,this._emptyScene.autoUpdate=!1;const a=e.capabilities.isWebGL2,s=this.createOutlineColorTexture();this._inFrontRenderedCadModelTarget=Ln(a,this.multiSampleCountHint,{stencilBuffer:!1}),this._inFrontRenderedCadModelTarget.depthTexture=new l.DepthTexture(0,0),this._inFrontRenderedCadModelTarget.depthTexture.format=l.DepthFormat,this._inFrontRenderedCadModelTarget.depthTexture.type=l.UnsignedIntType,this._normalRenderedCadModelTarget=Ln(a,this.multiSampleCountHint,{stencilBuffer:!1}),this._normalRenderedCadModelTarget.depthTexture=new l.DepthTexture(0,0),this._normalRenderedCadModelTarget.depthTexture.format=l.DepthFormat,this._normalRenderedCadModelTarget.depthTexture.type=l.UnsignedIntType,this._ghostObjectRenderTarget=Ln(a,this.multiSampleCountHint,{stencilBuffer:!1}),this._ghostObjectRenderTarget.depthTexture=new l.DepthTexture(0,0),this._ghostObjectRenderTarget.depthTexture.format=l.DepthFormat,this._ghostObjectRenderTarget.depthTexture.type=l.UnsignedIntType,this._customObjectRenderTarget=Ln(a,this.multiSampleCountHint,{stencilBuffer:!1}),this._customObjectRenderTarget.depthTexture=new l.DepthTexture(0,0),this._customObjectRenderTarget.depthTexture.format=l.DepthFormat,this._customObjectRenderTarget.depthTexture.type=l.UnsignedIntType,this._compositionTarget=new l.WebGLRenderTarget(0,0,{stencilBuffer:!1}),this._compositionTarget.depthTexture=new l.DepthTexture(0,0),this._compositionTarget.depthTexture.format=l.DepthFormat,this._compositionTarget.depthTexture.type=l.UnsignedIntType,this._ssaoTarget=new l.WebGLRenderTarget(0,0,{stencilBuffer:!1}),this._ssaoTarget.depthTexture=new l.DepthTexture(0,0),this._ssaoTarget.depthTexture.format=l.DepthFormat,this._ssaoTarget.depthTexture.type=l.UnsignedIntType,this._ssaoBlurCombineTarget=new l.WebGLRenderTarget(0,0,{stencilBuffer:!1}),this._ssaoBlurCombineTarget.depthTexture=new l.DepthTexture(0,0),this._ssaoBlurCombineTarget.depthTexture.format=l.DepthFormat,this._ssaoBlurCombineTarget.depthTexture.type=l.UnsignedIntType,this._combineOutlineDetectionMaterial=new l.ShaderMaterial({vertexShader:Xt.vertex,fragmentShader:Xt.fragment,uniforms:{tFront:{value:this._inFrontRenderedCadModelTarget.texture},tFrontDepth:{value:this._inFrontRenderedCadModelTarget.depthTexture},tBack:{value:this._normalRenderedCadModelTarget.texture},tBackDepth:{value:this._normalRenderedCadModelTarget.depthTexture},tCustom:{value:this._customObjectRenderTarget.texture},tCustomDepth:{value:this._customObjectRenderTarget.depthTexture},tGhost:{value:this._ghostObjectRenderTarget.texture},tGhostDepth:{value:this._ghostObjectRenderTarget.depthTexture},tOutlineColors:{value:s},resolution:{value:new l.Vector2(0,0)},texelSize:{value:new l.Vector2(0,0)},cameraNear:{value:.1},cameraFar:{value:1e4},edgeStrengthMultiplier:{value:2.5},edgeGrayScaleIntensity:{value:.1}},extensions:{fragDepth:!0},defines:{EDGES:null!==(i=null===(o=this._renderOptions.edgeDetectionParameters)||void 0===o?void 0:o.enabled)&&void 0!==i?i:N.edgeDetectionParameters.enabled},glslVersion:l.GLSL3});const d=this.ssaoParameters(this._renderOptions),c=d.sampleSize,u=this.createKernel(c),p=d.sampleRadius,m=d.depthCheckBias;this._ssaoMaterial=new l.ShaderMaterial({uniforms:{tDepth:{value:this._compositionTarget.depthTexture},kernel:{value:u},sampleRadius:{value:p},bias:{value:m},projMatrix:{value:new l.Matrix4},inverseProjectionMatrix:{value:new l.Matrix4},resolution:{value:new l.Vector2}},defines:{MAX_KERNEL_SIZE:c},vertexShader:Zt.vertex,fragmentShader:Zt.fragment,glslVersion:l.GLSL3}),this._ssaoBlurCombineMaterial=new l.ShaderMaterial({uniforms:{tDiffuse:{value:this._compositionTarget.texture},tAmbientOcclusion:{value:this._ssaoTarget.texture},resolution:{value:new l.Vector2}},vertexShader:Qt.vertex,fragmentShader:Qt.fragment,glslVersion:l.GLSL3});const h=this.supportsSsao(d)?this._ssaoBlurCombineTarget.texture:this._compositionTarget.texture;this._fxaaMaterial=new l.ShaderMaterial({uniforms:{tDiffuse:{value:h},tDepth:{value:this._compositionTarget.depthTexture},resolution:{value:new l.Vector2},inverseResolution:{value:new l.Vector2}},vertexShader:Yt.vertex,fragmentShader:Yt.fragment,extensions:{fragDepth:!0},glslVersion:l.GLSL3}),this.setupCompositionScene(),this.setupSsaoScene(),this.setupSsaoBlurCombineScene(),this.setupFxaaScene(),this._normalSceneBuilder=new Gn(this._normalScene),this._inFrontSceneBuilder=new Gn(this._inFrontScene)}set renderOptions(e){const t=this.ssaoParameters(e),n={...t};this.setSsaoParameters(n),this._renderOptions={...e,ssaoRenderParameters:{...t}}}set debugRenderTimings(e){this._debugRenderTimings=e}get debugRenderTimings(){return this._debugRenderTimings}addUiObject(e,t,n){this._uiObjects.push({object:e,screenPos:t,width:n.x,height:n.y})}removeUiObject(e){this._uiObjects=this._uiObjects.filter(t=>{const n=t.object;return e!==n})}ssaoParameters(e){var t;return null!==(t=null==e?void 0:e.ssaoRenderParameters)&&void 0!==t?t:{...N.ssaoRenderParameters}}get antiAliasingMode(){const{antiAliasing:e=N.antiAliasing}=this._renderOptions;return e}get multiSampleCountHint(){const{multiSampleCountHint:e=N.multiSampleCountHint}=this._renderOptions;return e}supportsSsao(e){return!Object(i.r)()&&(this._renderer.capabilities.isWebGL2||this._renderer.extensions.has("EXT_frag_depth"))&&e.sampleSize!==C.None}renderDetailedToDepthOnly(e){const t={renderMode:this._materialManager.getRenderMode()},n=new i.j(this._renderer);this._materialManager.setRenderMode(A.DepthBufferOnly);try{n.setRenderTarget(this._renderTarget),this.setVisibilityOfSectors(W.c.Simple,!1),this.traverseForRootSectorNode(this._originalScene),this.extractCadNodes(this._originalScene),this.clearTarget(this._renderTarget);const{hasBackElements:r,hasInFrontElements:o,hasGhostElements:i}=this.splitToScenes();r&&!i?this.renderNormalCadModelsFromBaseScene(e,this._renderTarget):r&&i&&(this.renderNormalCadModels(e,this._renderTarget),this._normalSceneBuilder.restoreOriginalScene()),o&&(this.renderInFrontCadModels(e),this._inFrontSceneBuilder.restoreOriginalScene())}finally{this._materialManager.setRenderMode(t.renderMode),n.resetState(),this.restoreCadNodes(),this.setVisibilityOfSectors(W.c.Simple,!0)}}render(e){this.setupRenderTargetSpectorDebugging(),this._debugRenderTimings&&wt.a.debug("============== RENDER BEGIN ==============");const t=this._renderer,n=this._originalScene,r=new i.j(t),o={autoClear:t.autoClear,clearAlpha:t.getClearAlpha(),renderMode:this._materialManager.getRenderMode()};t.info.autoReset=!1,t.info.reset(),r.autoClear=!1;try{r.setRenderTarget(this._renderTarget),this.updateRenderSize(t),t.info.autoReset=!1,t.info.reset(),r.autoClear=!1,this.traverseForRootSectorNode(n),this.extractCadNodes(n),this.clearTarget(this._ghostObjectRenderTarget),this.clearTarget(this._compositionTarget),this.clearTarget(this._customObjectRenderTarget),t.setClearAlpha(0),this.clearTarget(this._normalRenderedCadModelTarget),this.clearTarget(this._inFrontRenderedCadModelTarget),t.setClearAlpha(o.clearAlpha);const i={...this._lastFrameSceneState},{hasBackElements:a,hasInFrontElements:s,hasGhostElements:d}=this.splitToScenes(),l=n.children.length>0;this._lastFrameSceneState={hasBackElements:a,hasInFrontElements:s,hasGhostElements:d,hasCustomObjects:l},a&&!d?this.renderNormalCadModelsFromBaseScene(e):a&&d?(this.renderNormalCadModels(e),this._normalSceneBuilder.restoreOriginalScene(),this.renderGhostedCadModelsFromBaseScene(e)):!a&&d&&this.renderGhostedCadModelsFromBaseScene(e),s&&(this.renderInFrontCadModels(e),this._inFrontSceneBuilder.restoreOriginalScene()),l&&this.renderCustomObjects(n,e),t.capabilities.isWebGL2&&(!a&&i.hasBackElements&&this.explicitFlushRender(e,this._normalRenderedCadModelTarget),!d&&i.hasGhostElements&&this.explicitFlushRender(e,this._ghostObjectRenderTarget),!s&&i.hasInFrontElements&&this.explicitFlushRender(e,this._inFrontRenderedCadModelTarget),!l&&i.hasInFrontElements&&this.explicitFlushRender(e,this._customObjectRenderTarget));const c=this.supportsSsao(this.ssaoParameters(this._renderOptions));switch(this.antiAliasingMode){case T.FXAA:this.renderComposition(e,this._compositionTarget),r.autoClear=o.autoClear,c&&(this.renderSsao(this._ssaoTarget,e),this.renderPostProcessStep("ssao-blur-combine",this._ssaoBlurCombineTarget,this._ssaoBlurCombineScene)),this.renderPostProcessStep("fxaa",this._renderTarget,this._fxaaScene);break;case T.NoAA:t.autoClear=o.autoClear,c?(this.renderComposition(e,this._compositionTarget),this.renderSsao(this._ssaoTarget,e),this.renderPostProcessStep("ssao-blur-combine",this._renderTarget,this._ssaoBlurCombineScene)):this.renderComposition(e,this._renderTarget);break;default:throw new Error("Unsupported anti-aliasing mode: "+this.antiAliasingMode)}}finally{r.resetState(),this._materialManager.setRenderMode(o.renderMode),this.restoreCadNodes(),this._debugRenderTimings&&wt.a.debug("=============== RENDER END ===============")}}restoreCadNodes(){this._rootSectorNodeBuffer.forEach(e=>{e[1].add(e[0])}),this._rootSectorNodeBuffer.clear()}extractCadNodes(e){this._rootSectorNodeBuffer.forEach(t=>{if(t[1].parent!==e&&null!==t[1].parent&&t[1].parent.parent!==e)throw new Error("CadNode must be put at scene root");this._cadScene.add(t[0])})}setRenderTarget(e){this._renderTarget=e}getRenderTarget(){return this._renderTarget}setRenderTargetAutoSize(e){this._autoSetTargetSize=e}getRenderTargetAutoSize(){return this._autoSetTargetSize}clearTarget(e){this._renderer.setRenderTarget(e),this._renderer.clear()}explicitFlushRender(e,t){this._renderer.setRenderTarget(t),this.renderStep("flushRender",this._emptyScene,e)}splitToScenes(){const e={hasBackElements:!1,hasInFrontElements:!1,hasGhostElements:!1};this._rootSectorNodeBuffer.forEach(t=>{const n=t[1],r=this._materialManager.getModelBackTreeIndices(n.cadModelMetadata.modelIdentifier),o=this._materialManager.getModelInFrontTreeIndices(n.cadModelMetadata.modelIdentifier),i=this._materialManager.getModelGhostedTreeIndices(n.cadModelMetadata.modelIdentifier),a=r.count>0,s=o.count>0,d=i.count>0;e.hasBackElements=e.hasBackElements||a,e.hasInFrontElements=e.hasInFrontElements||s,e.hasGhostElements=e.hasGhostElements||d});const{hasBackElements:t,hasInFrontElements:n,hasGhostElements:r}=e;return this._rootSectorNodeBuffer.forEach(e=>{const o=e[0],i=e[1],a=this._materialManager.getModelBackTreeIndices(i.cadModelMetadata.modelIdentifier),s=this._materialManager.getModelInFrontTreeIndices(i.cadModelMetadata.modelIdentifier),d=new l.Object3D;d.applyMatrix4(o.matrix),t&&r&&this._normalScene.add(d);const c=new l.Object3D;c.applyMatrix4(o.matrix),n&&this._inFrontScene.add(c);const u=[e[0]];for(;u.length>0;){const e=u.pop(),o=e.userData.treeIndices;o?(n&&s.hasIntersectionWith(o)&&this._inFrontSceneBuilder.addElement(e,c),t&&!r||r&&a.hasIntersectionWith(o)&&this._normalSceneBuilder.addElement(e,d)):u.push(...e.children)}}),e}renderNormalCadModels(e,t=this._normalRenderedCadModelTarget){this._normalSceneBuilder.populateTemporaryScene(),this._renderer.setRenderTarget(t),this.renderStep("normal",this._normalScene,e)}renderNormalCadModelsFromBaseScene(e,t=this._normalRenderedCadModelTarget){this._renderer.setRenderTarget(t),this.renderStep("normalCadModelsFromBaseScene",this._cadScene,e)}renderInFrontCadModels(e,t=this._inFrontRenderedCadModelTarget){this._inFrontSceneBuilder.populateTemporaryScene(),this._renderer.setRenderTarget(t),this._materialManager.setRenderMode(A.Effects),this.renderStep("infront",this._inFrontScene,e)}renderGhostedCadModelsFromBaseScene(e){this._renderer.setRenderTarget(this._ghostObjectRenderTarget),this._materialManager.setRenderMode(A.Ghost),this.renderStep("ghosted",this._cadScene,e)}renderCustomObjects(e,t){const n=e.autoUpdate;try{e.autoUpdate=!0,this._renderer.setRenderTarget(this._customObjectRenderTarget),this.renderStep("customobjects",e,t)}finally{e.autoUpdate=n}}updateRenderSize(e){const t=new l.Vector2;return e.getSize(t),this._renderTarget&&this._autoSetTargetSize&&t.x!==this._renderTarget.width&&t.y!==this._renderTarget.height&&this._renderTarget.setSize(t.x,t.y),t.x===this._normalRenderedCadModelTarget.width&&t.y===this._normalRenderedCadModelTarget.height||(this._normalRenderedCadModelTarget.setSize(t.x,t.y),this._inFrontRenderedCadModelTarget.setSize(t.x,t.y),this._customObjectRenderTarget.setSize(t.x,t.y),this._ghostObjectRenderTarget.setSize(t.x,t.y),this._compositionTarget.setSize(t.x,t.y),this._ssaoTarget.setSize(t.x,t.y),this._ssaoBlurCombineTarget.setSize(t.x,t.y),this._combineOutlineDetectionMaterial.uniforms.texelSize.value=new l.Vector2(this._outlineTexelSize/t.x,this._outlineTexelSize/t.y),this._combineOutlineDetectionMaterial.uniforms.resolution.value=t,this._ssaoMaterial.uniforms.resolution.value=t,this._ssaoBlurCombineMaterial.uniforms.resolution.value=t,this._fxaaMaterial.uniforms.resolution.value=t,this._fxaaMaterial.uniforms.inverseResolution.value=new l.Vector2(1/t.x,1/t.y)),t}renderComposition(e,t){this._combineOutlineDetectionMaterial.uniforms.cameraNear.value=e.near,this._combineOutlineDetectionMaterial.uniforms.cameraFar.value=e.far,this.renderPostProcessStep("composition",t,this._compositionScene)}setSsaoParameters(e){var t;const n=N.ssaoRenderParameters;if(this._ssaoMaterial.uniforms.sampleRadius.value=e.sampleRadius,this._ssaoMaterial.uniforms.bias.value=e.depthCheckBias,e.sampleSize!==this.ssaoParameters(this._renderOptions).sampleSize){const r=null!==(t=null==e?void 0:e.sampleSize)&&void 0!==t?t:n.sampleSize,o=this.createKernel(r);this._fxaaMaterial.uniforms.tDiffuse.value=e.sampleSize!==C.None?this._ssaoBlurCombineTarget.texture:this._compositionTarget.texture,this._ssaoMaterial.uniforms.kernel.value=o,this._ssaoMaterial.defines={MAX_KERNEL_SIZE:r},this._ssaoMaterial.needsUpdate=!0}}renderPostProcessStep(e,t,n){const r=this._renderer;if(r.setRenderTarget(t),this.renderStep(e,n,this._orthographicCamera),t===this._renderTarget){const e=r.getSize(new l.Vector2),t=new l.Vector2(r.domElement.clientWidth,r.domElement.clientHeight),n=new l.Vector2(e.x/t.x,e.y/t.y);r.autoClear=!1,this._uiObjects.forEach(e=>{const t=new l.Scene;t.add(e.object);const o=e.screenPos.clone().multiply(n),i=e.width*n.x,a=e.height*n.y;r.setViewport(o.x,o.y,i,a),r.clearDepth(),r.render(t,this._orthographicCamera)}),r.setViewport(0,0,e.x,e.y),r.autoClear=!0}}renderSsao(e,t){this._ssaoMaterial.uniforms.inverseProjectionMatrix.value=t.projectionMatrixInverse,this._ssaoMaterial.uniforms.projMatrix.value=t.projectionMatrix,this.renderPostProcessStep("ssao",e,this._ssaoScene)}renderStep(e,t,n){if(!this._debugRenderTimings)return void this._renderer.render(t,n);this.deepFlushRenderer();const r=performance.now();this._renderer.render(t,n),this.deepFlushRenderer(),wt.a.log(`Render stage '${e}' took ${performance.now()-r} ms`)}deepFlushRenderer(){const{buffer:e}=this._deepFlushRendererArgs,t=this._renderer.getContext(),n=this._renderer.getRenderTarget();t.flush(),t.finish(),null!==n&&this._renderer.readRenderTargetPixels(n,0,0,1,1,e)}createOutlineColorTexture(){const e=new Uint8Array(32),t=new l.DataTexture(e,8,1);return kn(t.image.data,d.White,On.White),kn(t.image.data,d.Black,On.Black),kn(t.image.data,d.Cyan,On.Cyan),kn(t.image.data,d.Blue,On.Blue),kn(t.image.data,d.Green,zn.Green),kn(t.image.data,d.Red,zn.Red),kn(t.image.data,d.Orange,On.Orange),t}setupCompositionScene(){const e=this.createRenderTriangle(),t=new l.Mesh(e,this._combineOutlineDetectionMaterial);this._compositionScene.add(t)}setupFxaaScene(){const e=this.createRenderTriangle(),t=new l.Mesh(e,this._fxaaMaterial);this._fxaaScene.add(t)}setupSsaoScene(){const e=this.createRenderTriangle(),t=new l.Mesh(e,this._ssaoMaterial);this._ssaoScene.add(t)}setupSsaoBlurCombineScene(){const e=this.createRenderTriangle(),t=new l.Mesh(e,this._ssaoBlurCombineMaterial);this._ssaoBlurCombineScene.add(t)}createKernel(e){const t=[];for(let r=0;r<e;r++){const o=new l.Vector3;for(;o.length()<.5;)o.x=2*Math.random()-1,o.y=2*Math.random()-1,o.z=Math.random();o.normalize();let i=r/e;i=n(.1,1,i*i),o.multiplyScalar(i),t.push(o)}return t;function n(e,t,n){return e+(t-e)*(n=(n=n<0?0:n)>1?1:n)}}createRenderTriangle(){const e=new l.BufferGeometry,t=new Float32Array([-1,-1,0,3,-1,0,-1,3,0]),n=new Float32Array([0,0,2,0,0,2]);return e.setAttribute("position",new l.BufferAttribute(t,3)),e.setAttribute("uv",new l.BufferAttribute(n,2)),e}traverseForRootSectorNode(e){const t=[e];for(;t.length>0;){const e=t.pop();if(e instanceof W.d){const t=e.parent;t.visible&&this._rootSectorNodeBuffer.add([e,t])}else e instanceof l.Group||t.push(...e.children)}}setVisibilityOfSectors(e,t){this._originalScene.traverse(n=>{n instanceof W.e&&n.levelOfDetail===e&&(n.visible=t)})}setupRenderTargetSpectorDebugging(){!1}assignSpectorJsMetadataToRenderTarget(e,t){const n=this._renderer.getRenderTarget();try{this._renderer.setRenderTarget(e);const r=this._renderer.getContext();r.getParameter(r.FRAMEBUFFER_BINDING).__SPECTOR_Metadata=t}finally{this._renderer.setRenderTarget(n)}}}function Ln(e,t,n){if(e&&t>1){const e=new l.WebGLMultisampleRenderTarget(0,0,{...n,ignoreDepth:!1});return e.samples=t,e}return new l.WebGLRenderTarget(0,0,n)}function kn(e,t,n){e[4*t+0]=Math.floor(255*n.r),e[4*t+1]=Math.floor(255*n.g),e[4*t+2]=Math.floor(255*n.b),e[4*t+3]=255}class Gn{constructor(e){this.buffer=[],this.temporaryScene=e}addElement(e,t){this.buffer.push({object:e,parent:e.parent,sceneParent:t})}populateTemporaryScene(){this.buffer.forEach(e=>e.sceneParent.add(e.object))}restoreOriginalScene(){this.buffer.forEach(e=>{e.parent.add(e.object)}),this.buffer.length=0,this.temporaryScene.remove(...this.temporaryScene.children)}}function Vn(e,t,n,r,o,i,a={}){R.a.init(!1!==a.logMetrics,e,t,{constructorOptions:a});const s=a.renderOptions||{},d=new En,l=new Fn(o,i,d,s),c=nn(n,r,o,d,new yn(l),a),u=function(e,t){const n=new xn(e,t),r=new bn(t);return new fn(n,r)}(n,r);return new _n(c,l,u)}var Un=n(21);
|
|
481
|
+
class hr{constructor(e,t,r,n){var i,a;this._lastFrameSceneState={hasBackElements:!0,hasInFrontElements:!0,hasGhostElements:!0,hasCustomObjects:!0},this._rootSectorNodeBuffer=new Set,this._outlineTexelSize=2,this._autoSetTargetSize=!1,this._debugRenderTimings=!1,this._uiObjects=[],this._deepFlushRendererArgs={buffer:new ArrayBuffer(4)},this._renderer=e,this._renderOptions=n,this._materialManager=r,this._orthographicCamera=new o.OrthographicCamera(-1,1,1,-1,-1,1),this._renderTarget=null,this._originalScene=t,this._cadScene=new o.Scene,this._cadScene.autoUpdate=!1,this._normalScene=new o.Scene,this._normalScene.autoUpdate=!1,this._inFrontScene=new o.Scene,this._inFrontScene.autoUpdate=!1,this._compositionScene=new o.Scene,this._compositionScene.autoUpdate=!1,this._fxaaScene=new o.Scene,this._fxaaScene.autoUpdate=!1,this._ssaoScene=new o.Scene,this._ssaoScene.autoUpdate=!1,this._ssaoBlurCombineScene=new o.Scene,this._ssaoBlurCombineScene.autoUpdate=!1,this._emptyScene=new o.Scene,this._emptyScene.autoUpdate=!1;const s=this.createOutlineColorTexture();this._inFrontRenderedCadModelTarget=br(this.multiSampleCountHint,{stencilBuffer:!1}),this._inFrontRenderedCadModelTarget.depthTexture=new o.DepthTexture(1,1),this._inFrontRenderedCadModelTarget.depthTexture.format=o.DepthFormat,this._inFrontRenderedCadModelTarget.depthTexture.type=o.UnsignedIntType,this._normalRenderedCadModelTarget=br(this.multiSampleCountHint,{stencilBuffer:!1}),this._normalRenderedCadModelTarget.depthTexture=new o.DepthTexture(1,1),this._normalRenderedCadModelTarget.depthTexture.format=o.DepthFormat,this._normalRenderedCadModelTarget.depthTexture.type=o.UnsignedIntType,this._ghostObjectRenderTarget=br(this.multiSampleCountHint,{stencilBuffer:!1}),this._ghostObjectRenderTarget.depthTexture=new o.DepthTexture(1,1),this._ghostObjectRenderTarget.depthTexture.format=o.DepthFormat,this._ghostObjectRenderTarget.depthTexture.type=o.UnsignedIntType,this._customObjectRenderTarget=br(this.multiSampleCountHint,{stencilBuffer:!1}),this._customObjectRenderTarget.depthTexture=new o.DepthTexture(1,1),this._customObjectRenderTarget.depthTexture.format=o.DepthFormat,this._customObjectRenderTarget.depthTexture.type=o.UnsignedIntType,this._compositionTarget=new o.WebGLRenderTarget(1,1,{stencilBuffer:!1}),this._compositionTarget.depthTexture=new o.DepthTexture(1,1),this._compositionTarget.depthTexture.format=o.DepthFormat,this._compositionTarget.depthTexture.type=o.UnsignedIntType,this._ssaoTarget=new o.WebGLRenderTarget(1,1,{stencilBuffer:!1}),this._ssaoTarget.depthTexture=new o.DepthTexture(1,1),this._ssaoTarget.depthTexture.format=o.DepthFormat,this._ssaoTarget.depthTexture.type=o.UnsignedIntType,this._ssaoBlurCombineTarget=new o.WebGLRenderTarget(1,1,{stencilBuffer:!1}),this._ssaoBlurCombineTarget.depthTexture=new o.DepthTexture(1,1),this._ssaoBlurCombineTarget.depthTexture.format=o.DepthFormat,this._ssaoBlurCombineTarget.depthTexture.type=o.UnsignedIntType,this._combineOutlineDetectionMaterial=new o.RawShaderMaterial({vertexShader:ae.vertex,fragmentShader:ae.fragment,uniforms:{tFront:{value:this._inFrontRenderedCadModelTarget.texture},tFrontDepth:{value:this._inFrontRenderedCadModelTarget.depthTexture},tBack:{value:this._normalRenderedCadModelTarget.texture},tBackDepth:{value:this._normalRenderedCadModelTarget.depthTexture},tCustom:{value:this._customObjectRenderTarget.texture},tCustomDepth:{value:this._customObjectRenderTarget.depthTexture},tGhost:{value:this._ghostObjectRenderTarget.texture},tGhostDepth:{value:this._ghostObjectRenderTarget.depthTexture},tOutlineColors:{value:s},resolution:{value:new o.Vector2(0,0)},texelSize:{value:new o.Vector2(0,0)},cameraNear:{value:.1},cameraFar:{value:1e4},edgeStrengthMultiplier:{value:2.5},edgeGrayScaleIntensity:{value:.1}},defines:{EDGES:null!==(a=null===(i=this._renderOptions.edgeDetectionParameters)||void 0===i?void 0:i.enabled)&&void 0!==a?a:f.edgeDetectionParameters.enabled},glslVersion:o.GLSL3});const c=this.ssaoParameters(this._renderOptions),l=c.sampleSize,d=this.createKernel(l),u=c.sampleRadius,p=c.depthCheckBias;this._ssaoMaterial=new o.RawShaderMaterial({uniforms:{tDepth:{value:this._compositionTarget.depthTexture},kernel:{value:d},sampleRadius:{value:u},bias:{value:p},projMatrix:{value:new o.Matrix4},inverseProjectionMatrix:{value:new o.Matrix4},resolution:{value:new o.Vector2}},defines:{MAX_KERNEL_SIZE:l},vertexShader:ce.vertex,fragmentShader:ce.fragment,glslVersion:o.GLSL3}),this._ssaoBlurCombineMaterial=new o.RawShaderMaterial({uniforms:{tDiffuse:{value:this._compositionTarget.texture},tAmbientOcclusion:{value:this._ssaoTarget.texture},resolution:{value:new o.Vector2}},vertexShader:le.vertex,fragmentShader:le.fragment,glslVersion:o.GLSL3});const m=this.supportsSsao(c)?this._ssaoBlurCombineTarget.texture:this._compositionTarget.texture;this._fxaaMaterial=new o.RawShaderMaterial({uniforms:{tDiffuse:{value:m},tDepth:{value:this._compositionTarget.depthTexture},resolution:{value:new o.Vector2},inverseResolution:{value:new o.Vector2}},vertexShader:se.vertex,fragmentShader:se.fragment,glslVersion:o.GLSL3}),this.setupCompositionScene(),this.setupSsaoScene(),this.setupSsaoBlurCombineScene(),this.setupFxaaScene(),this._normalSceneBuilder=new gr(this._normalScene),this._inFrontSceneBuilder=new gr(this._inFrontScene)}set renderOptions(e){const t=this.ssaoParameters(e),r={...t};this.setSsaoParameters(r),this._renderOptions={...e,ssaoRenderParameters:{...t}}}set debugRenderTimings(e){this._debugRenderTimings=e}get debugRenderTimings(){return this._debugRenderTimings}addUiObject(e,t,r){this._uiObjects.push({object:e,screenPos:t,width:r.x,height:r.y})}removeUiObject(e){this._uiObjects=this._uiObjects.filter(t=>{const r=t.object;return e!==r})}ssaoParameters(e){var t;return null!==(t=null==e?void 0:e.ssaoRenderParameters)&&void 0!==t?t:{...f.ssaoRenderParameters}}get antiAliasingMode(){const{antiAliasing:e=f.antiAliasing}=this._renderOptions;return e}get multiSampleCountHint(){const{multiSampleCountHint:e=f.multiSampleCountHint}=this._renderOptions;return e}supportsSsao(e){return!Object(u.t)()&&e.sampleSize!==i.None}renderDetailedToDepthOnly(e){const t={renderMode:this._materialManager.getRenderMode()},r=new u.k(this._renderer);this._materialManager.setRenderMode(be.DepthBufferOnly);try{r.setRenderTarget(this._renderTarget),this.setVisibilityOfSectors(m.d.Simple,!1),this.traverseForRootSectorNode(this._originalScene),this.extractCadNodes(this._originalScene),this.clearTarget(this._renderTarget);const{hasBackElements:n,hasInFrontElements:i,hasGhostElements:o}=this.splitToScenes();n&&!o?this.renderNormalCadModelsFromBaseScene(e,this._renderTarget):n&&o&&(this.renderNormalCadModels(e,this._renderTarget),this._normalSceneBuilder.restoreOriginalScene()),i&&(this.renderInFrontCadModels(e),this._inFrontSceneBuilder.restoreOriginalScene())}finally{this._materialManager.setRenderMode(t.renderMode),r.resetState(),this.restoreCadNodes(),this.setVisibilityOfSectors(m.d.Simple,!0)}}render(e){this.setupRenderTargetSpectorDebugging(),this._debugRenderTimings&&D.a.debug("============== RENDER BEGIN ==============");const t=this._renderer,r=this._originalScene,i=new u.k(t),o={autoClear:t.autoClear,clearAlpha:t.getClearAlpha(),renderMode:this._materialManager.getRenderMode()};t.info.autoReset=!1,t.info.reset(),i.autoClear=!1;try{i.setRenderTarget(this._renderTarget),this.updateRenderSize(t),t.info.autoReset=!1,t.info.reset(),i.autoClear=!1,this.traverseForRootSectorNode(r),this.extractCadNodes(r),this.clearTarget(this._ghostObjectRenderTarget),this.clearTarget(this._compositionTarget),this.clearTarget(this._customObjectRenderTarget),t.setClearAlpha(0),this.clearTarget(this._normalRenderedCadModelTarget),this.clearTarget(this._inFrontRenderedCadModelTarget),t.setClearAlpha(o.clearAlpha);const a={...this._lastFrameSceneState},{hasBackElements:s,hasInFrontElements:c,hasGhostElements:l}=this.splitToScenes(),d=r.children.length>0;this._lastFrameSceneState={hasBackElements:s,hasInFrontElements:c,hasGhostElements:l,hasCustomObjects:d},s&&!l?this.renderNormalCadModelsFromBaseScene(e):s&&l?(this.renderNormalCadModels(e),this._normalSceneBuilder.restoreOriginalScene(),this.renderGhostedCadModelsFromBaseScene(e)):!s&&l&&this.renderGhostedCadModelsFromBaseScene(e),c&&(this.renderInFrontCadModels(e),this._inFrontSceneBuilder.restoreOriginalScene()),d&&this.renderCustomObjects(r,e),!s&&a.hasBackElements&&this.explicitFlushRender(e,this._normalRenderedCadModelTarget),!l&&a.hasGhostElements&&this.explicitFlushRender(e,this._ghostObjectRenderTarget),!c&&a.hasInFrontElements&&this.explicitFlushRender(e,this._inFrontRenderedCadModelTarget),!d&&a.hasInFrontElements&&this.explicitFlushRender(e,this._customObjectRenderTarget);const f=this.supportsSsao(this.ssaoParameters(this._renderOptions));switch(this.antiAliasingMode){case n.FXAA:this.renderComposition(e,this._compositionTarget),i.autoClear=o.autoClear,f&&(this.renderSsao(this._ssaoTarget,e),this.renderPostProcessStep("ssao-blur-combine",this._ssaoBlurCombineTarget,this._ssaoBlurCombineScene)),this.renderPostProcessStep("fxaa",this._renderTarget,this._fxaaScene);break;case n.NoAA:t.autoClear=o.autoClear,f?(this.renderComposition(e,this._compositionTarget),this.renderSsao(this._ssaoTarget,e),this.renderPostProcessStep("ssao-blur-combine",this._renderTarget,this._ssaoBlurCombineScene)):this.renderComposition(e,this._renderTarget);break;default:throw new Error("Unsupported anti-aliasing mode: "+this.antiAliasingMode)}}finally{i.resetState(),this._materialManager.setRenderMode(o.renderMode),this.restoreCadNodes(),this._debugRenderTimings&&D.a.debug("=============== RENDER END ===============")}}restoreCadNodes(){this._rootSectorNodeBuffer.forEach(e=>{e[1].add(e[0])}),this._rootSectorNodeBuffer.clear()}extractCadNodes(e){this._rootSectorNodeBuffer.forEach(t=>{if(t[1].parent!==e&&null!==t[1].parent&&t[1].parent.parent!==e)throw new Error("CadNode must be put at scene root");this._cadScene.add(t[0])})}setRenderTarget(e){this._renderTarget=e}getRenderTarget(){return this._renderTarget}setRenderTargetAutoSize(e){this._autoSetTargetSize=e}getRenderTargetAutoSize(){return this._autoSetTargetSize}clearTarget(e){this._renderer.setRenderTarget(e),this._renderer.clear()}explicitFlushRender(e,t){this._renderer.setRenderTarget(t),this.renderStep("flushRender",this._emptyScene,e)}splitToScenes(){const e={hasBackElements:!1,hasInFrontElements:!1,hasGhostElements:!1};this._rootSectorNodeBuffer.forEach(t=>{const r=t[1],n=this._materialManager.getModelBackTreeIndices(r.cadModelMetadata.modelIdentifier),i=this._materialManager.getModelInFrontTreeIndices(r.cadModelMetadata.modelIdentifier),o=this._materialManager.getModelGhostedTreeIndices(r.cadModelMetadata.modelIdentifier),a=n.count>0,s=i.count>0,c=o.count>0;e.hasBackElements=e.hasBackElements||a,e.hasInFrontElements=e.hasInFrontElements||s,e.hasGhostElements=e.hasGhostElements||c});const{hasBackElements:t,hasInFrontElements:r,hasGhostElements:n}=e;return this._rootSectorNodeBuffer.forEach(e=>{const i=e[0],a=e[1],s=this._materialManager.getModelBackTreeIndices(a.cadModelMetadata.modelIdentifier),c=this._materialManager.getModelInFrontTreeIndices(a.cadModelMetadata.modelIdentifier),l=new o.Object3D;l.applyMatrix4(i.matrix),t&&n&&this._normalScene.add(l);const d=new o.Object3D;d.applyMatrix4(i.matrix),r&&this._inFrontScene.add(d);const f=[e[0]];for(;f.length>0;){const e=f.pop(),i=e.userData.treeIndices;i?(r&&c.hasIntersectionWith(i)&&this._inFrontSceneBuilder.addElement(e,d),t&&!n||n&&s.hasIntersectionWith(i)&&this._normalSceneBuilder.addElement(e,l)):f.push(...e.children)}}),e}renderNormalCadModels(e,t=this._normalRenderedCadModelTarget){this._normalSceneBuilder.populateTemporaryScene(),this._renderer.setRenderTarget(t),this.renderStep("normal",this._normalScene,e)}renderNormalCadModelsFromBaseScene(e,t=this._normalRenderedCadModelTarget){this._renderer.setRenderTarget(t),this.renderStep("normalCadModelsFromBaseScene",this._cadScene,e)}renderInFrontCadModels(e,t=this._inFrontRenderedCadModelTarget){this._inFrontSceneBuilder.populateTemporaryScene(),this._renderer.setRenderTarget(t),this._materialManager.setRenderMode(be.Effects),this.renderStep("infront",this._inFrontScene,e)}renderGhostedCadModelsFromBaseScene(e){this._renderer.setRenderTarget(this._ghostObjectRenderTarget),this._materialManager.setRenderMode(be.Ghost),this.renderStep("ghosted",this._cadScene,e)}renderCustomObjects(e,t){const r=e.autoUpdate;try{e.autoUpdate=!0,this._renderer.setRenderTarget(this._customObjectRenderTarget),this.renderStep("customobjects",e,t)}finally{e.autoUpdate=r}}updateRenderSize(e){const t=new o.Vector2;return e.getSize(t),this._renderTarget&&this._autoSetTargetSize&&t.x!==this._renderTarget.width&&t.y!==this._renderTarget.height&&this._renderTarget.setSize(t.x,t.y),t.x===this._normalRenderedCadModelTarget.width&&t.y===this._normalRenderedCadModelTarget.height||(this._normalRenderedCadModelTarget.setSize(t.x,t.y),this._inFrontRenderedCadModelTarget.setSize(t.x,t.y),this._customObjectRenderTarget.setSize(t.x,t.y),this._ghostObjectRenderTarget.setSize(t.x,t.y),this._compositionTarget.setSize(t.x,t.y),this._ssaoTarget.setSize(t.x,t.y),this._ssaoBlurCombineTarget.setSize(t.x,t.y),this._combineOutlineDetectionMaterial.uniforms.texelSize.value=new o.Vector2(this._outlineTexelSize/t.x,this._outlineTexelSize/t.y),this._combineOutlineDetectionMaterial.uniforms.resolution.value=t,this._ssaoMaterial.uniforms.resolution.value=t,this._ssaoBlurCombineMaterial.uniforms.resolution.value=t,this._fxaaMaterial.uniforms.resolution.value=t,this._fxaaMaterial.uniforms.inverseResolution.value=new o.Vector2(1/t.x,1/t.y)),t}renderComposition(e,t){this._combineOutlineDetectionMaterial.uniforms.cameraNear.value=e.near,this._combineOutlineDetectionMaterial.uniforms.cameraFar.value=e.far,this.renderPostProcessStep("composition",t,this._compositionScene)}setSsaoParameters(e){var t;const r=f.ssaoRenderParameters;if(this._ssaoMaterial.uniforms.sampleRadius.value=e.sampleRadius,this._ssaoMaterial.uniforms.bias.value=e.depthCheckBias,e.sampleSize!==this.ssaoParameters(this._renderOptions).sampleSize){const n=null!==(t=null==e?void 0:e.sampleSize)&&void 0!==t?t:r.sampleSize,o=this.createKernel(n);this._fxaaMaterial.uniforms.tDiffuse.value=e.sampleSize!==i.None?this._ssaoBlurCombineTarget.texture:this._compositionTarget.texture,this._ssaoMaterial.uniforms.kernel.value=o,this._ssaoMaterial.defines={MAX_KERNEL_SIZE:n},this._ssaoMaterial.needsUpdate=!0}}renderPostProcessStep(e,t,r){const n=this._renderer;if(n.setRenderTarget(t),this.renderStep(e,r,this._orthographicCamera),t===this._renderTarget){const e=n.getSize(new o.Vector2),t=new o.Vector2(n.domElement.clientWidth,n.domElement.clientHeight),r=new o.Vector2(e.x/t.x,e.y/t.y);n.autoClear=!1,this._uiObjects.forEach(e=>{const t=new o.Scene;t.add(e.object);const i=e.screenPos.clone().multiply(r),a=e.width*r.x,s=e.height*r.y;n.setViewport(i.x,i.y,a,s),n.clearDepth(),n.render(t,this._orthographicCamera)}),n.setViewport(0,0,e.x,e.y),n.autoClear=!0}}renderSsao(e,t){this._ssaoMaterial.uniforms.inverseProjectionMatrix.value=t.projectionMatrixInverse,this._ssaoMaterial.uniforms.projMatrix.value=t.projectionMatrix,this.renderPostProcessStep("ssao",e,this._ssaoScene)}renderStep(e,t,r){if(!this._debugRenderTimings)return void this._renderer.render(t,r);this.deepFlushRenderer();const n=performance.now();this._renderer.render(t,r),this.deepFlushRenderer(),D.a.log(`Render stage '${e}' took ${performance.now()-n} ms`)}deepFlushRenderer(){const{buffer:e}=this._deepFlushRendererArgs,t=this._renderer.getContext(),r=this._renderer.getRenderTarget();t.flush(),t.finish(),null!==r&&this._renderer.readRenderTargetPixels(r,0,0,1,1,e)}createOutlineColorTexture(){const e=new Uint8Array(32),t=new o.DataTexture(e,8,1);return vr(t.image.data,Pt.White,pr.White),vr(t.image.data,Pt.Black,pr.Black),vr(t.image.data,Pt.Cyan,pr.Cyan),vr(t.image.data,Pt.Blue,pr.Blue),vr(t.image.data,Pt.Green,mr.Green),vr(t.image.data,Pt.Red,mr.Red),vr(t.image.data,Pt.Orange,pr.Orange),t.needsUpdate=!0,t}setupCompositionScene(){const e=this.createRenderTriangle(),t=new o.Mesh(e,this._combineOutlineDetectionMaterial);this._compositionScene.add(t)}setupFxaaScene(){const e=this.createRenderTriangle(),t=new o.Mesh(e,this._fxaaMaterial);this._fxaaScene.add(t)}setupSsaoScene(){const e=this.createRenderTriangle(),t=new o.Mesh(e,this._ssaoMaterial);this._ssaoScene.add(t)}setupSsaoBlurCombineScene(){const e=this.createRenderTriangle(),t=new o.Mesh(e,this._ssaoBlurCombineMaterial);this._ssaoBlurCombineScene.add(t)}createKernel(e){const t=[];for(let n=0;n<e;n++){const i=new o.Vector3;for(;i.length()<.5;)i.x=2*Math.random()-1,i.y=2*Math.random()-1,i.z=Math.random();i.normalize();let a=n/e;a=r(.1,1,a*a),i.multiplyScalar(a),t.push(i)}return t;function r(e,t,r){return e+(t-e)*(r=(r=r<0?0:r)>1?1:r)}}createRenderTriangle(){const e=new o.BufferGeometry,t=new Float32Array([-1,-1,0,3,-1,0,-1,3,0]),r=new Float32Array([0,0,2,0,0,2]);return e.setAttribute("position",new o.BufferAttribute(t,3)),e.setAttribute("uv",new o.BufferAttribute(r,2)),e}traverseForRootSectorNode(e){const t=[e];for(;t.length>0;){const e=t.pop();if(e instanceof m.e){const t=e.parent;t.visible&&this._rootSectorNodeBuffer.add([e,t])}else e instanceof o.Group||t.push(...e.children)}}setVisibilityOfSectors(e,t){this._originalScene.traverse(r=>{r instanceof m.f&&r.levelOfDetail===e&&(r.visible=t)})}setupRenderTargetSpectorDebugging(){!1}assignSpectorJsMetadataToRenderTarget(e,t){const r=this._renderer.getRenderTarget();try{this._renderer.setRenderTarget(e);const n=this._renderer.getContext();n.getParameter(n.FRAMEBUFFER_BINDING).__SPECTOR_Metadata=t}finally{this._renderer.setRenderTarget(r)}}}function br(e,t){if(e>1){return new o.WebGLRenderTarget(1,1,{...t,sample:e})}return new o.WebGLRenderTarget(1,1,t)}function vr(e,t,r){e[4*t+0]=Math.floor(255*r.r),e[4*t+1]=Math.floor(255*r.g),e[4*t+2]=Math.floor(255*r.b),e[4*t+3]=255}class gr{constructor(e){this.buffer=[],this.temporaryScene=e}addElement(e,t){this.buffer.push({object:e,parent:e.parent,sceneParent:t})}populateTemporaryScene(){this.buffer.forEach(e=>e.sceneParent.add(e.object))}restoreOriginalScene(){this.buffer.forEach(e=>{e.parent.add(e.object)}),this.buffer.length=0,this.temporaryScene.remove(...this.temporaryScene.children)}}function Ar(e,t,r,n,i,o,a={}){var s;p.a.init(!1!==a.logMetrics,e,t,{constructorOptions:a});const c=a.renderOptions||{},l=new fr,d=new hr(i,o,l,c),f=Je(r,n,i,l,d,{...null===(s=a.internal)||void 0===s?void 0:s.cad,continuousModelStreaming:a.continuousModelStreaming}),u=function(e,t){const r=new vt(e,t),n=new At(t);return new ht(r,n)}(r,n);return new $t(f,d,u)}r(24);
|
|
456
482
|
/*!
|
|
457
483
|
* Copyright 2021 Cognite AS
|
|
458
|
-
*/class
|
|
484
|
+
*/class _r{constructor(e,t){switch(this._revealManager=t,e){case"cdf":this.addCadModel=e=>_r.addCdfCadModel(e,t),this.addPointCloudModel=e=>_r.addCdfPointCloudModel(e,t);break;case"local":this.addCadModel=e=>_r.addLocalCadModel(e,t),this.addPointCloudModel=e=>_r.addLocalPointCloudModel(e,t);break;default:Object(u.m)(e)}}static createLocalHelper(e,t,r){const n=function(e,t,r={}){return Ar("local","local-dataSource-appId",new L.g,new L.e,e,t,r)}(e,t,r);return new _r("local",n)}static createCdfHelper(e,t,r,n){const i=function(e,t,r,n={}){const i=e.getDefaultRequestHeaders()["x-cdp-app"]||"unknown",o=new L.c(e),a=new L.a(e);return Ar(e.project,i,o,a,t,r,n)}(n,e,t,r);return new _r("cdf",i)}static createCustomDataSourceHelper(e,t,r,n){const i=Ar("custom-datasource","custom-datasource-app",n.getModelMetadataProvider(),n.getModelDataProvider(),e,t,r);return new _r("cdf",i)}get revealManager(){return this._revealManager}static addLocalCadModel(e,t){if(void 0===e.localPath)throw new Error("addLocalCadModel only works with local models");const r=new L.f(e.localPath);return t.addModel("cad",r,{geometryFilter:e.geometryFilter})}static addCdfCadModel(e,t){if(-1===e.modelId||-1===e.revisionId)throw new Error("addCdfCadModel only works with CDF hosted models");const r=new L.b(e.modelId,e.revisionId);return t.addModel("cad",r,{geometryFilter:e.geometryFilter})}static addLocalPointCloudModel(e,t){if(void 0===e.localPath)throw new Error("addLocalPointCloudModel only works with local models");const r=new L.f(e.localPath);return t.addModel("pointcloud",r)}static addCdfPointCloudModel(e,t){if(-1===e.modelId||-1===e.revisionId)throw new Error("addCdfPointCloudModel only works with CDF hosted models");const r=new L.b(e.modelId,e.revisionId);return t.addModel("pointcloud",r)}}
|
|
459
485
|
/*!
|
|
460
486
|
* Copyright 2021 Cognite AS
|
|
461
|
-
*/const
|
|
487
|
+
*/const xr={16:"shift",17:"ctrl",18:"alt",27:"escape",32:"space",37:"left",38:"up",39:"right",40:"down",65:"a",66:"b",67:"c",68:"d",69:"e",70:"f",81:"q",83:"s",87:"w"};class yr{constructor(){this.keys={},this._disabled=!1,this.addEventListeners=()=>{this.clearPressedKeys(),window.addEventListener("keydown",this.onKeydown),window.addEventListener("keyup",this.onKeyup),window.addEventListener("blur",this.clearPressedKeys)},this.removeEventListeners=()=>{window.removeEventListener("keydown",this.onKeydown),window.removeEventListener("keyup",this.onKeyup),window.removeEventListener("blur",this.clearPressedKeys)},this.onKeydown=e=>{e.metaKey||e.altKey||e.ctrlKey||e.keyCode in xr&&(0===this.keys[xr[e.keyCode]]&&(this.keys[xr[e.keyCode]]=2),e.preventDefault())},this.onKeyup=e=>{e.keyCode in xr&&(this.keys[xr[e.keyCode]]=0)},this.clearPressedKeys=()=>{Object.keys(xr).forEach(e=>{this.keys[xr[e]]=0})},this.addEventListeners()}get disabled(){return this._disabled}set disabled(e){this._disabled=e,e?this.removeEventListeners():this.addEventListeners()}isPressed(e){return this.keys[e]>=1}comsumePressed(e){const t=2===this.keys[e];return t&&(this.keys[e]=1),t}}
|
|
462
488
|
/*!
|
|
463
489
|
* Copyright 2021 Cognite AS
|
|
464
|
-
*/const Hn=-1!==navigator.userAgent.toLowerCase().indexOf("firefox");function Kn(e,t,n){return new l.Vector2(t-e.offsetLeft,n-e.offsetTop)}function Xn(e,t){if(2!==t.length)throw new Error("getPinchInfo only works if touches.length === 2");const n=[t[0],t[1]].map(({clientX:t,clientY:n})=>Kn(e,t,n));return{center:n[0].clone().add(n[1]).multiplyScalar(.5),distance:n[0].distanceTo(n[1]),offsets:n}}const Yn=Math.PI/360,Zn=10*Yn;class Qn extends l.EventDispatcher{constructor(e,t){super(),this.enabled=!0,this.enableDamping=!0,this.dampingFactor=.25,this.dynamicTarget=!0,this.minDistance=.8,this.minZoomDistance=.4,this.dollyFactor=.99,this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.minAzimuthAngle=-1/0,this.maxAzimuthAngle=1/0,this.panDollyMinDistanceFactor=10,this.firstPersonRotationFactor=.4,this.pointerRotationSpeedAzimuth=Yn,this.pointerRotationSpeedPolar=Yn,this.enableKeyboardNavigation=!0,this.keyboardRotationSpeedAzimuth=Zn,this.keyboardRotationSpeedPolar=Zn,this.mouseFirstPersonRotationSpeed=2*Yn,this.keyboardDollySpeed=2,this.keyboardPanSpeed=10,this.keyboardSpeedFactor=3,this.pinchEpsilon=2,this.pinchPanSpeed=1,this.EPSILON=.001,this.minZoom=0,this.maxZoom=1/0,this.orthographicCameraDollyFactor=.3,this.lookAtViewTarget=!1,this.useScrollTarget=!1,this.zoomToCursor=!0,this.minDeltaRatio=1,this.maxDeltaRatio=8,this.minDeltaDownscaleCoefficient=.1,this.maxDeltaDownscaleCoefficient=1,this._temporarilyDisableDamping=!1,this._firstPersonMode=!1,this._reusableVector3=new l.Vector3,this._accumulatedMouseMove=new l.Vector2,this._target=new l.Vector3,this._viewTarget=new l.Vector3,this._scrollTarget=new l.Vector3,this._targetEnd=new l.Vector3,this._spherical=new l.Spherical,this._sphericalEnd=new l.Spherical,this._deltaTarget=new l.Vector3,this._keyboard=new qn,this._offsetVector=new l.Vector3,this._panVector=new l.Vector3,this._raycaster=new l.Raycaster,this._targetFPS=30,this._targetFPSOverActualFPS=1,this._isFocused=!1,this.update=e=>{const{_camera:t,_target:n,_targetEnd:r,_spherical:o,_sphericalEnd:i,_deltaTarget:a,handleKeyboard:s,enableDamping:d,dampingFactor:l,EPSILON:c,_targetFPS:u,enabled:p}=this;if(!p)return!1;const m=Math.min(1/e,u);this._targetFPSOverActualFPS=u/m,s(),this._accumulatedMouseMove.lengthSq()>0&&(this.rotate(this._accumulatedMouseMove.x,this._accumulatedMouseMove.y),this._accumulatedMouseMove.set(0,0));let h=0;this._firstPersonMode?h+=this.calculateShortestDeltaTheta(i.theta,o.theta):h=i.theta-o.theta;const f=i.phi-o.phi,v=i.radius-o.radius;a.subVectors(r,n);let x=!1;const g=d&&!this._temporarilyDisableDamping?Math.min(l*this._targetFPSOverActualFPS,1):1;return this._temporarilyDisableDamping=!1,Math.abs(h)>c||Math.abs(f)>c||Math.abs(v)>c||Math.abs(a.x)>c||Math.abs(a.y)>c||Math.abs(a.z)>c?(o.set(o.radius+v*g,o.phi+f*g,o.theta+h*g),n.add(a.multiplyScalar(g)),x=!0):(o.copy(i),n.copy(r)),o.makeSafe(),t.position.setFromSpherical(o).add(n),t.lookAt(this.lookAtViewTarget?this._viewTarget:n),x&&this.triggerCameraChangeEvent(),x},this.getState=()=>{const{_target:e,_camera:t}=this;return{target:e.clone(),position:t.position.clone()}},this.setState=(e,t)=>{const n=e.clone().sub(t);this._targetEnd.copy(t),this._sphericalEnd.setFromVector3(n),this._target.copy(this._targetEnd),this._scrollTarget.copy(t),this._spherical.copy(this._sphericalEnd),this.update(1e3/this._targetFPS),this.triggerCameraChangeEvent()},this.setViewTarget=e=>{this._viewTarget.copy(e)},this.setScrollTarget=e=>{this._scrollTarget.copy(e)},this.triggerCameraChangeEvent=()=>{const{_camera:e,_target:t}=this;this.dispatchEvent({type:"cameraChange",camera:{position:e.position,target:t}})},this.convertPixelCoordinatesToNormalized=(e,t)=>({x:e/this._domElement.clientWidth*2-1,y:t/this._domElement.clientHeight*-2+1}),this.onMouseDown=e=>{if(this.enabled)switch(this._firstPersonMode=!1,this._sphericalEnd.copy(this._spherical),e.button){case l.MOUSE.LEFT:this.startMouseRotation(e);break;case l.MOUSE.RIGHT:e.preventDefault(),this.startMousePan(e)}},this.onMouseUp=e=>{this._accumulatedMouseMove.set(0,0)},this.onMouseWheel=e=>{if(!this.enabled)return;e.preventDefault();let t=0;if(e.wheelDelta)t=-e.wheelDelta/40;else if(e.detail)t=e.detail;else if(e.deltaY){const n=Hn?1:40;t=e.deltaY/n}const{x:n,y:r}=this.convertPixelCoordinatesToNormalized(e.offsetX,e.offsetY),o=t<0,i=this._camera.isPerspectiveCamera?this.getDollyDeltaDistance(o,Math.abs(t)):Math.sign(t)*this.orthographicCameraDollyFactor;this.dolly(n,r,i,!1)},this.onTouchStart=e=>{if(this.enabled)switch(e.preventDefault(),this._firstPersonMode=!1,this._sphericalEnd.copy(this._spherical),e.touches.length){case 1:this.startTouchRotation(e);break;case 2:this.startTouchPinch(e)}},this.onFocusChanged=e=>{this._isFocused="blur"!==e.type&&(this.isDescendant(this._domElement.parentElement,e.target)||document.activeElement===this._domElement),this._keyboard.disabled=!this._isFocused},this.isDescendant=(e,t)=>{let n=t.parentNode;for(;null!==n;){if(n===e)return!0;n=n.parentNode}return!1},this.onContextMenu=e=>{this.enabled&&e.preventDefault()},this.rotate=(e,t)=>{if(0===e&&0===t)return;const n=(this._firstPersonMode?this.mouseFirstPersonRotationSpeed:this.pointerRotationSpeedAzimuth)*e,r=(this._firstPersonMode?this.mouseFirstPersonRotationSpeed:this.pointerRotationSpeedPolar)*t;this._firstPersonMode?(this._temporarilyDisableDamping=!0,this.rotateFirstPersonMode(n,r)):this.rotateSpherical(n,r)},this.startMouseRotation=e=>{let t=Kn(this._domElement,e.clientX,e.clientY);const n=e=>{const n=Kn(this._domElement,e.clientX,e.clientY),r=t.clone().sub(n);this._accumulatedMouseMove.add(r),t=n},r=()=>{window.removeEventListener("mousemove",n),window.removeEventListener("mouseup",r)};window.addEventListener("mousemove",n,{passive:!1}),window.addEventListener("mouseup",r,{passive:!1})},this.startMousePan=e=>{let t=Kn(this._domElement,e.clientX,e.clientY);const n=e=>{const n=Kn(this._domElement,e.clientX,e.clientY),r=n.x-t.x,o=n.y-t.y;t=n,this.pan(r,o)},r=()=>{window.removeEventListener("mousemove",n),window.removeEventListener("mouseup",r)};window.addEventListener("mousemove",n,{passive:!1}),window.addEventListener("mouseup",r,{passive:!1})},this.startTouchRotation=e=>{const{_domElement:t}=this;let n=Kn(t,e.touches[0].clientX,e.touches[0].clientY);const r=e=>{if(1!==e.touches.length)return;const r=Kn(t,e.touches[0].clientX,e.touches[0].clientY);this.rotate(n.x-r.x,n.y-r.y),n=r},o=e=>{1!==e.touches.length&&a()},i=()=>{a()},a=()=>{document.removeEventListener("touchstart",o),document.removeEventListener("touchmove",r),document.removeEventListener("touchend",i)};document.addEventListener("touchstart",o),document.addEventListener("touchmove",r,{passive:!1}),document.addEventListener("touchend",i,{passive:!1})},this.startTouchPinch=e=>{const{_domElement:t}=this;let n=Xn(t,e.touches);const r=Xn(t,e.touches),o=this._spherical.radius,i=e=>{if(2!==e.touches.length)return;const i=Xn(t,e.touches),a=r.distance/i.distance;this._sphericalEnd.radius=Math.max(a*o,this.minDistance/5);const s=i.center.clone().sub(n.center);s.length()>this.pinchEpsilon&&(s.multiplyScalar(this.pinchPanSpeed),this.pan(s.x,s.y)),n=i},a=e=>{2!==e.touches.length&&d()},s=()=>{d()},d=()=>{document.removeEventListener("touchstart",a),document.removeEventListener("touchmove",i),document.removeEventListener("touchend",s)};document.addEventListener("touchstart",a),document.addEventListener("touchmove",i),document.addEventListener("touchend",s)},this.handleKeyboard=()=>{if(!this.enabled||!this.enableKeyboardNavigation||!this._isFocused)return;const{_keyboard:e,keyboardDollySpeed:t,keyboardPanSpeed:n,keyboardSpeedFactor:r}=this,o=this.keyboardRotationSpeedAzimuth*(Number(e.isPressed("left"))-Number(e.isPressed("right")));let i=this.keyboardRotationSpeedPolar*(Number(e.isPressed("up"))-Number(e.isPressed("down")));if(0!==o||0!==i){this._firstPersonMode=!0;const{_sphericalEnd:e}=this,t=e.phi;e.phi+=i,e.makeSafe(),i=e.phi-t,e.phi=t,this.rotateFirstPersonMode(o,i)}const a=e.isPressed("shift")?r:1,s=!!e.isPressed("w")||!e.isPressed("s")&&void 0;void 0!==s&&(this.dolly(0,0,this.getDollyDeltaDistance(s,t*a),!0),this._firstPersonMode=!0);const d=Number(e.isPressed("a"))-Number(e.isPressed("d")),l=Number(e.isPressed("e"))-Number(e.isPressed("q"));0===d&&0===l||(this._firstPersonMode=!0,this.pan(a*n*d,a*n*l))},this.rotateSpherical=(e,t)=>{const{_sphericalEnd:n}=this,r=l.MathUtils.clamp(n.theta+e,this.minAzimuthAngle,this.maxAzimuthAngle),o=l.MathUtils.clamp(n.phi+t,this.minPolarAngle,this.maxPolarAngle);n.theta=r,n.phi=o,n.makeSafe()},this.rotateFirstPersonMode=(e,t)=>{const{firstPersonRotationFactor:n,_reusableCamera:r,_reusableVector3:o,_sphericalEnd:i,_targetEnd:a}=this;r.position.setFromSpherical(i).add(a),r.lookAt(a),r.rotateX(n*t),r.rotateY(n*e);const s=a.distanceTo(r.position);r.getWorldDirection(o),a.addVectors(r.position,o.multiplyScalar(s)),i.setFromVector3(o.subVectors(r.position,a)),i.makeSafe()},this.pan=(e,t)=>{const{_domElement:n,_camera:r,_offsetVector:o,_target:i}=this;o.copy(r.position).sub(i);let a=Math.max(o.length(),this.panDollyMinDistanceFactor*this.minDistance);r.isPerspectiveCamera&&(a*=Math.tan(r.fov/2*Math.PI/180)),this.panLeft(2*e*a/n.clientHeight),this.panUp(2*t*a/n.clientHeight)},this.dollyOrthographicCamera=(e,t,n)=>{const r=this._camera;r.zoom*=1-n,r.zoom=l.MathUtils.clamp(r.zoom,this.minZoom,this.maxZoom),r.updateProjectionMatrix()},this.calculateNewRadiusAndTargetOffsetLerp=(e,t,n,r)=>{const{dynamicTarget:o,minZoomDistance:i,_raycaster:a,_targetEnd:s,_reusableCamera:d}=this,c=Math.tan(l.MathUtils.degToRad(90-.5*this._camera.fov)),u=Math.sqrt(c*c+e*e+t*t)/c,p=r.length(),m=n>0;a.setFromCamera({x:e,y:t},d);let h=p+n;h<i&&!m&&(h=p,o?(d.getWorldDirection(r),s.add(r.normalize().multiplyScalar(Math.abs(n)))):n=0);const f=-n*u;d.getWorldDirection(r),r.normalize().multiplyScalar(n);return{targetOffset:a.ray.direction.normalize().multiplyScalar(f).add(r),radius:h}},this.clampedMap=(e,t,n,r,o)=>e=e<t?r:e>n?o:l.MathUtils.mapLinear(e,t,n,r,o),this.calculateNewRadiusAndTargetOffsetScrollTarget=(e,t)=>{const{minZoomDistance:n,_reusableVector3:r,_target:o,_scrollTarget:i,_camera:a,minDeltaRatio:s,maxDeltaRatio:d,minDeltaDownscaleCoefficient:c,maxDeltaDownscaleCoefficient:u}=this,p=t.length(),m=e>0;m&&this.setScrollTarget(o);const h=r.subVectors(i,o),f=(new l.Vector3).subVectors(o,a.position),v=(new l.Vector3).subVectors(i,a.position),x=f.angleTo(v),g=h.clone().negate().angleTo(v.clone().negate());let b=e*(Math.sin(x)/Math.sin(g));const _=Math.abs(b/e),y=this.clampedMap(_,s,d,u,c);b*=y;let T=p+(e*=y);T<n&&(this._temporarilyDisableDamping=!0,(i.distanceTo(o)<n||T<=0)&&(b=0,T=p));return{targetOffset:h.negate().normalize().multiplyScalar(m?0:b),radius:T}},this.dollyWithWheelScroll=(e,t,n,r)=>{const{_targetEnd:o,_sphericalEnd:i,useScrollTarget:a,zoomToCursor:s}=this,d=n<0,c=new l.Vector3;let u=i.radius;if(s)if(a&&d){const{radius:e,targetOffset:t}=this.calculateNewRadiusAndTargetOffsetScrollTarget(n,r);u=e,c.copy(t)}else{const{radius:o,targetOffset:i}=this.calculateNewRadiusAndTargetOffsetLerp(e,t,n,r);u=o,c.copy(i)}else{const{radius:e,targetOffset:t}=this.calculateNewRadiusAndTargetOffsetLerp(0,0,n,r);u=e,c.copy(t)}o.add(c),i.radius=u},this.dollyPerspectiveCamera=(e,t,n,r=!1)=>{const{_reusableVector3:o,_targetEnd:i,_reusableCamera:a,_sphericalEnd:s,_camera:d}=this;a.copy(d),a.position.setFromSpherical(s).add(i),a.lookAt(i);const l=o.clone().setFromSpherical(s);r?(a.getWorldDirection(l),i.add(l.normalize().multiplyScalar(-n))):this.dollyWithWheelScroll(e,t,n,l)},this.dolly=(e,t,n,r)=>{const{_camera:o}=this;o.isOrthographicCamera?this.dollyOrthographicCamera(e,t,n):o.isPerspectiveCamera&&this.dollyPerspectiveCamera(e,t,n,r)},this.getDollyDeltaDistance=(e,t=1)=>{const{_sphericalEnd:n,dollyFactor:r}=this,o=r**t,i=e?o:1/o;return Math.max(n.radius,this.panDollyMinDistanceFactor*this.minDistance)*(i-1)},this.panLeft=e=>{const{_camera:t,_targetEnd:n,_panVector:r}=this;r.setFromMatrixColumn(t.matrix,0),r.multiplyScalar(-e),n.add(r)},this.panUp=e=>{const{_camera:t,_targetEnd:n,_panVector:r}=this;r.setFromMatrixColumn(t.matrix,1),r.multiplyScalar(e),n.add(r)},this._camera=e,this._reusableCamera=e.clone(),this._domElement=t,this._spherical.setFromVector3(e.position),this._sphericalEnd.copy(this._spherical),t.addEventListener("mousedown",this.onMouseDown),t.addEventListener("touchstart",this.onTouchStart),t.addEventListener("wheel",this.onMouseWheel),t.addEventListener("contextmenu",this.onContextMenu),t.addEventListener("focus",this.onFocusChanged),t.addEventListener("blur",this.onFocusChanged),window.addEventListener("mouseup",this.onMouseUp),window.addEventListener("mousedown",this.onFocusChanged),window.addEventListener("touchstart",this.onFocusChanged),this.dispose=()=>{t.removeEventListener("mousedown",this.onMouseDown),t.removeEventListener("wheel",this.onMouseWheel),t.removeEventListener("touchstart",this.onTouchStart),t.removeEventListener("contextmenu",this.onContextMenu),t.removeEventListener("focus",this.onFocusChanged),t.removeEventListener("blur",this.onFocusChanged),window.removeEventListener("mouseup",this.onMouseUp),window.removeEventListener("mousedown",this.onFocusChanged),window.removeEventListener("touchstart",this.onFocusChanged)}}calculateShortestDeltaTheta(e,t){const n=e%(2*Math.PI)-t%(2*Math.PI);let r=Math.min(Math.abs(n),2*Math.PI-Math.abs(n));return r*=(r===Math.abs(n)?1:-1)*Math.sign(n),r}}
|
|
490
|
+
*/const kr=-1!==navigator.userAgent.toLowerCase().indexOf("firefox");function Tr(e,t,r){return new o.Vector2(t-e.offsetLeft,r-e.offsetTop)}function wr(e,t){if(2!==t.length)throw new Error("getPinchInfo only works if touches.length === 2");const r=[t[0],t[1]].map(({clientX:t,clientY:r})=>Tr(e,t,r));return{center:r[0].clone().add(r[1]).multiplyScalar(.5),distance:r[0].distanceTo(r[1]),offsets:r}}const Cr=Math.PI/360,Mr=10*Cr;class Ir extends o.EventDispatcher{constructor(e,t){super(),this.enabled=!0,this.enableDamping=!0,this.dampingFactor=.25,this.dynamicTarget=!0,this.minDistance=.8,this.minZoomDistance=.4,this.dollyFactor=.99,this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.minAzimuthAngle=-1/0,this.maxAzimuthAngle=1/0,this.panDollyMinDistanceFactor=10,this.firstPersonRotationFactor=.4,this.pointerRotationSpeedAzimuth=Cr,this.pointerRotationSpeedPolar=Cr,this.enableKeyboardNavigation=!0,this.keyboardRotationSpeedAzimuth=Mr,this.keyboardRotationSpeedPolar=Mr,this.mouseFirstPersonRotationSpeed=2*Cr,this.keyboardDollySpeed=2,this.keyboardPanSpeed=10,this.keyboardSpeedFactor=3,this.pinchEpsilon=2,this.pinchPanSpeed=1,this.EPSILON=.001,this.minZoom=0,this.maxZoom=1/0,this.orthographicCameraDollyFactor=.3,this.lookAtViewTarget=!1,this.useScrollTarget=!1,this.zoomToCursor=!0,this.minDeltaRatio=1,this.maxDeltaRatio=8,this.minDeltaDownscaleCoefficient=.1,this.maxDeltaDownscaleCoefficient=1,this._temporarilyDisableDamping=!1,this._firstPersonMode=!1,this._reusableVector3=new o.Vector3,this._accumulatedMouseMove=new o.Vector2,this._target=new o.Vector3,this._viewTarget=new o.Vector3,this._scrollTarget=new o.Vector3,this._targetEnd=new o.Vector3,this._spherical=new o.Spherical,this._sphericalEnd=new o.Spherical,this._deltaTarget=new o.Vector3,this._rawCameraRotation=new o.Quaternion,this._keyboard=new yr,this._offsetVector=new o.Vector3,this._panVector=new o.Vector3,this._raycaster=new o.Raycaster,this._targetFPS=30,this._targetFPSOverActualFPS=1,this._isFocused=!1,this.update=e=>{const{_camera:t,_target:r,_targetEnd:n,_spherical:i,_sphericalEnd:o,_deltaTarget:a,handleKeyboard:s,enableDamping:c,dampingFactor:l,EPSILON:d,_targetFPS:f,enabled:u}=this;if(!u)return!1;const p=Math.min(1/e,f);this._targetFPSOverActualFPS=f/p,s(),this._accumulatedMouseMove.lengthSq()>0&&(this.rotate(this._accumulatedMouseMove.x,this._accumulatedMouseMove.y),this._accumulatedMouseMove.set(0,0));let m=0;this._firstPersonMode?m+=this.calculateShortestDeltaTheta(o.theta,i.theta):m=o.theta-i.theta;const h=o.phi-i.phi,b=o.radius-i.radius;a.subVectors(n,r);let v=!1;const g=c&&!this._temporarilyDisableDamping?Math.min(l*this._targetFPSOverActualFPS,1):1;return this._temporarilyDisableDamping=!1,Math.abs(m)>d||Math.abs(h)>d||Math.abs(b)>d||Math.abs(a.x)>d||Math.abs(a.y)>d||Math.abs(a.z)>d?(i.set(i.radius+b*g,i.phi+h*g,i.theta+m*g),r.add(a.multiplyScalar(g)),v=!0):(i.copy(o),r.copy(n)),i.makeSafe(),t.position.setFromSpherical(i).add(r),this.isIdentityQuaternion(this._rawCameraRotation)?t.lookAt(this.lookAtViewTarget?this._viewTarget:r):t.setRotationFromQuaternion(this._rawCameraRotation),v&&this.triggerCameraChangeEvent(),v},this.getState=()=>{const{_target:e,_camera:t}=this;return{target:e.clone(),position:t.position.clone()}},this.setState=(e,t)=>{const r=e.clone().sub(t);this._targetEnd.copy(t),this._sphericalEnd.setFromVector3(r),this._target.copy(this._targetEnd),this._scrollTarget.copy(t),this._spherical.copy(this._sphericalEnd),this.update(1e3/this._targetFPS),this.triggerCameraChangeEvent()},this.setViewTarget=e=>{this._viewTarget.copy(e)},this.setScrollTarget=e=>{this._scrollTarget.copy(e)},this.getScrollTarget=()=>this._scrollTarget.clone(),this.triggerCameraChangeEvent=()=>{const{_camera:e,_target:t}=this;this.dispatchEvent({type:"cameraChange",camera:{position:e.position,target:t}})},this.convertPixelCoordinatesToNormalized=(e,t)=>({x:e/this._domElement.clientWidth*2-1,y:t/this._domElement.clientHeight*-2+1}),this.onPointerDown=e=>{"mouse"===e.pointerType&&this.onMouseDown(e)},this.onMouseDown=e=>{if(this.enabled)switch(this._firstPersonMode=!1,this._sphericalEnd.copy(this._spherical),e.button){case o.MOUSE.LEFT:this.startMouseRotation(e);break;case o.MOUSE.RIGHT:e.preventDefault(),this.startMousePan(e)}},this.onMouseUp=e=>{this._accumulatedMouseMove.set(0,0)},this.onMouseWheel=e=>{if(!this.enabled)return;e.preventDefault();let t=0;if(e.wheelDelta)t=-e.wheelDelta/40;else if(e.detail)t=e.detail;else if(e.deltaY){const r=kr?1:40;t=e.deltaY/r}const{x:r,y:n}=this.convertPixelCoordinatesToNormalized(e.offsetX,e.offsetY),i=t<0,o=this._camera.isPerspectiveCamera?this.getDollyDeltaDistance(i,Math.abs(t)):Math.sign(t)*this.orthographicCameraDollyFactor;this.dolly(r,n,o,!1)},this.onTouchStart=e=>{if(this.enabled)switch(e.preventDefault(),this._firstPersonMode=!1,this._sphericalEnd.copy(this._spherical),e.touches.length){case 1:this.startTouchRotation(e);break;case 2:this.startTouchPinch(e)}},this.onFocusChanged=e=>{this._isFocused="blur"!==e.type&&(this.isDescendant(this._domElement.parentElement,e.target)||document.activeElement===this._domElement),this._keyboard.disabled=!this._isFocused},this.isDescendant=(e,t)=>{let r=t.parentNode;for(;null!==r;){if(r===e)return!0;r=r.parentNode}return!1},this.onContextMenu=e=>{this.enabled&&e.preventDefault()},this.rotate=(e,t)=>{if(0===e&&0===t)return;const r=(this._firstPersonMode?this.mouseFirstPersonRotationSpeed:this.pointerRotationSpeedAzimuth)*e,n=(this._firstPersonMode?this.mouseFirstPersonRotationSpeed:this.pointerRotationSpeedPolar)*t;this._firstPersonMode?(this._temporarilyDisableDamping=!0,this.rotateFirstPersonMode(r,n)):this.rotateSpherical(r,n)},this.startMouseRotation=e=>{let t=Tr(this._domElement,e.clientX,e.clientY);const r=e=>{const r=Tr(this._domElement,e.clientX,e.clientY),n=t.clone().sub(r);this._accumulatedMouseMove.add(n),t=r},n=()=>{window.removeEventListener("pointermove",r),window.removeEventListener("pointerup",n)};window.addEventListener("pointermove",r,{passive:!1}),window.addEventListener("pointerup",n,{passive:!1})},this.startMousePan=e=>{let t=Tr(this._domElement,e.clientX,e.clientY);const r=e=>{const r=Tr(this._domElement,e.clientX,e.clientY),n=r.x-t.x,i=r.y-t.y;t=r,this.pan(n,i)},n=()=>{window.removeEventListener("pointermove",r),window.removeEventListener("pointereup",n)};window.addEventListener("pointermove",r,{passive:!1}),window.addEventListener("pointerup",n,{passive:!1})},this.startTouchRotation=e=>{const{_domElement:t}=this;let r=Tr(t,e.touches[0].clientX,e.touches[0].clientY);const n=e=>{if(1!==e.touches.length)return;const n=Tr(t,e.touches[0].clientX,e.touches[0].clientY);this.rotate(r.x-n.x,r.y-n.y),r=n},i=e=>{1!==e.touches.length&&a()},o=()=>{a()},a=()=>{document.removeEventListener("touchstart",i),document.removeEventListener("touchmove",n),document.removeEventListener("touchend",o)};document.addEventListener("touchstart",i),document.addEventListener("touchmove",n,{passive:!1}),document.addEventListener("touchend",o,{passive:!1})},this.startTouchPinch=e=>{const{_domElement:t}=this;let r=wr(t,e.touches);const n=wr(t,e.touches),i=this._spherical.radius,o=e=>{if(2!==e.touches.length)return;const o=wr(t,e.touches),a=n.distance/o.distance;this._sphericalEnd.radius=Math.max(a*i,this.minDistance/5);const s=o.center.clone().sub(r.center);s.length()>this.pinchEpsilon&&(s.multiplyScalar(this.pinchPanSpeed),this.pan(s.x,s.y)),r=o},a=e=>{2!==e.touches.length&&c()},s=()=>{c()},c=()=>{document.removeEventListener("touchstart",a),document.removeEventListener("touchmove",o),document.removeEventListener("touchend",s)};document.addEventListener("touchstart",a),document.addEventListener("touchmove",o),document.addEventListener("touchend",s)},this.handleKeyboard=()=>{if(!this.enabled||!this.enableKeyboardNavigation||!this._isFocused)return;const{_keyboard:e,keyboardDollySpeed:t,keyboardPanSpeed:r,keyboardSpeedFactor:n}=this,i=this.keyboardRotationSpeedAzimuth*(Number(e.isPressed("left"))-Number(e.isPressed("right")));let o=this.keyboardRotationSpeedPolar*(Number(e.isPressed("up"))-Number(e.isPressed("down")));if(0!==i||0!==o){this._firstPersonMode=!0;const{_sphericalEnd:e}=this,t=e.phi;e.phi+=o,e.makeSafe(),o=e.phi-t,e.phi=t,this.rotateFirstPersonMode(i,o)}const a=e.isPressed("shift")?n:1,s=!!e.isPressed("w")||!e.isPressed("s")&&void 0;void 0!==s&&(this.dolly(0,0,this.getDollyDeltaDistance(s,t*a),!0),this._firstPersonMode=!0);const c=Number(e.isPressed("a"))-Number(e.isPressed("d")),l=Number(e.isPressed("e"))-Number(e.isPressed("q"));0===c&&0===l||(this._firstPersonMode=!0,this.pan(a*r*c,a*r*l))},this.rotateSpherical=(e,t)=>{const{_sphericalEnd:r}=this,n=o.MathUtils.clamp(r.theta+e,this.minAzimuthAngle,this.maxAzimuthAngle),i=o.MathUtils.clamp(r.phi+t,this.minPolarAngle,this.maxPolarAngle);r.theta=n,r.phi=i,r.makeSafe()},this.rotateFirstPersonMode=(e,t)=>{const{firstPersonRotationFactor:r,_reusableCamera:n,_reusableVector3:i,_sphericalEnd:o,_targetEnd:a}=this;n.position.setFromSpherical(o).add(a),n.lookAt(a),n.rotateX(r*t),n.rotateY(r*e);const s=a.distanceTo(n.position);n.getWorldDirection(i),a.addVectors(n.position,i.multiplyScalar(s)),o.setFromVector3(i.subVectors(n.position,a)),o.makeSafe()},this.pan=(e,t)=>{const{_domElement:r,_camera:n,_offsetVector:i,_target:o}=this;i.copy(n.position).sub(o);let a=Math.max(i.length(),this.panDollyMinDistanceFactor*this.minDistance);n.isPerspectiveCamera&&(a*=Math.tan(n.fov/2*Math.PI/180)),this.panLeft(2*e*a/r.clientHeight),this.panUp(2*t*a/r.clientHeight)},this.dollyOrthographicCamera=(e,t,r)=>{const n=this._camera;n.zoom*=1-r,n.zoom=o.MathUtils.clamp(n.zoom,this.minZoom,this.maxZoom),n.updateProjectionMatrix()},this.calculateNewRadiusAndTargetOffsetLerp=(e,t,r,n)=>{const{dynamicTarget:i,minZoomDistance:a,_raycaster:s,_targetEnd:c,_reusableCamera:l}=this,d=Math.tan(o.MathUtils.degToRad(90-.5*this._camera.fov)),f=Math.sqrt(d*d+e*e+t*t)/d,u=n.length(),p=r>0;s.setFromCamera({x:e,y:t},l);let m=u+r;m<a&&!p&&(m=u,i?(l.getWorldDirection(n),c.add(n.normalize().multiplyScalar(Math.abs(r)))):r=0);const h=-r*f;l.getWorldDirection(n),n.normalize().multiplyScalar(r);return{targetOffset:s.ray.direction.normalize().multiplyScalar(h).add(n),radius:m}},this.clampedMap=(e,t,r,n,i)=>e=e<t?n:e>r?i:o.MathUtils.mapLinear(e,t,r,n,i),this.calculateNewRadiusAndTargetOffsetScrollTarget=(e,t)=>{const{minZoomDistance:r,_reusableVector3:n,_target:i,_scrollTarget:a,_camera:s,minDeltaRatio:c,maxDeltaRatio:l,minDeltaDownscaleCoefficient:d,maxDeltaDownscaleCoefficient:f}=this,u=t.length(),p=e>0;p&&this.setScrollTarget(i);const m=n.subVectors(a,i),h=(new o.Vector3).subVectors(i,s.position),b=(new o.Vector3).subVectors(a,s.position),v=h.angleTo(b),g=m.clone().negate().angleTo(b.clone().negate());let A=e*(Math.sin(v)/Math.sin(g));const _=Math.abs(A/e),x=this.clampedMap(_,c,l,f,d);(Math.abs(e)>this.minDistance||Math.abs(A)>this.minDistance)&&(e*=x,A*=x);let y=u+e;y<r&&(this._temporarilyDisableDamping=!0,a.distanceTo(i)<r&&(A=0,y=u),y<=0&&(A=0,a.distanceTo(i)>r?(y=r,this._targetEnd.add(t.normalize().multiplyScalar(-(r-u)))):y=u));return{targetOffset:m.negate().normalize().multiplyScalar(p?0:A),radius:y}},this.dollyWithWheelScroll=(e,t,r,n)=>{const{_targetEnd:i,_sphericalEnd:a,useScrollTarget:s,zoomToCursor:c}=this,l=r<0,d=new o.Vector3;let f=a.radius;if(c)if(s&&l){const{radius:e,targetOffset:t}=this.calculateNewRadiusAndTargetOffsetScrollTarget(r,n);f=e,d.copy(t)}else{const{radius:i,targetOffset:o}=this.calculateNewRadiusAndTargetOffsetLerp(e,t,r,n);f=i,d.copy(o)}else{const{radius:e,targetOffset:t}=this.calculateNewRadiusAndTargetOffsetLerp(0,0,r,n);f=e,d.copy(t)}i.add(d),a.radius=f},this.dollyPerspectiveCamera=(e,t,r,n=!1)=>{const{_reusableVector3:i,_targetEnd:o,_reusableCamera:a,_sphericalEnd:s,_camera:c}=this;a.copy(c),a.position.setFromSpherical(s).add(o),a.lookAt(o);const l=i.clone().setFromSpherical(s);n?(a.getWorldDirection(l),o.add(l.normalize().multiplyScalar(-r))):this.dollyWithWheelScroll(e,t,r,l)},this.dolly=(e,t,r,n)=>{const{_camera:i}=this;i.isOrthographicCamera?this.dollyOrthographicCamera(e,t,r):i.isPerspectiveCamera&&this.dollyPerspectiveCamera(e,t,r,n)},this.getDollyDeltaDistance=(e,t=1)=>{const{_sphericalEnd:r,dollyFactor:n}=this,i=n**t,o=e?i:1/i;return Math.max(r.radius,this.panDollyMinDistanceFactor*this.minDistance)*(o-1)},this.panLeft=e=>{const{_camera:t,_targetEnd:r,_panVector:n}=this;n.setFromMatrixColumn(t.matrix,0),n.multiplyScalar(-e),r.add(n)},this.panUp=e=>{const{_camera:t,_targetEnd:r,_panVector:n}=this;n.setFromMatrixColumn(t.matrix,1),n.multiplyScalar(e),r.add(n)},this._camera=e,this._reusableCamera=e.clone(),this._domElement=t,this._spherical.setFromVector3(e.position),this._sphericalEnd.copy(this._spherical),t.addEventListener("pointerdown",this.onPointerDown),t.addEventListener("touchstart",this.onTouchStart),t.addEventListener("wheel",this.onMouseWheel),t.addEventListener("contextmenu",this.onContextMenu),t.addEventListener("focus",this.onFocusChanged),t.addEventListener("blur",this.onFocusChanged),window.addEventListener("pointerup",this.onMouseUp),window.addEventListener("pointerdown",this.onFocusChanged),this.dispose=()=>{t.removeEventListener("pointerdown",this.onPointerDown),t.removeEventListener("wheel",this.onMouseWheel),t.removeEventListener("touchstart",this.onTouchStart),t.removeEventListener("contextmenu",this.onContextMenu),t.removeEventListener("focus",this.onFocusChanged),t.removeEventListener("blur",this.onFocusChanged),window.removeEventListener("pointerup",this.onMouseUp),window.removeEventListener("pointerdown",this.onFocusChanged)}}get cameraRawRotation(){return this._rawCameraRotation}calculateShortestDeltaTheta(e,t){const r=e%(2*Math.PI)-t%(2*Math.PI);let n=Math.min(Math.abs(r),2*Math.PI-Math.abs(r));return n*=(n===Math.abs(r)?1:-1)*Math.sign(r),n}isIdentityQuaternion(e){return 0===e.x&&0===e.y&&0===e.z&&1===e.w}}
|
|
465
491
|
/*!
|
|
466
|
-
* Copyright
|
|
467
|
-
*/class
|
|
492
|
+
* Copyright 2022 Cognite AS
|
|
493
|
+
*/class Sr{static calculateNewTargetFromRotation(e,t,r){const n=r.clone().sub(e.position),i=e.clone();i.setRotationFromQuaternion(t),i.updateMatrix();return i.getWorldDirection(new o.Vector3).normalize().multiplyScalar(n.length()).add(i.position)}static updateCameraNearAndFar(e,t){const{cameraPosition:r,cameraDirection:n,corners:i}=this._updateNearAndFarPlaneBuffers;this.getBoundingBoxCorners(t,i),e.getWorldPosition(r),e.getWorldDirection(n);let o=this.calculateCameraNear(e,t,r);const a=this.calculateCameraFar(o,r,n,i);t.containsPoint(r)&&(o=Math.min(.1,a/1e3)),e.near=o,e.far=a,e.updateProjectionMatrix()}static calculateCameraStateToFitBoundingBox(e,t,r=2){const n=t.getBoundingSphere(new o.Sphere),i=n.center,a=n.radius*r,s=new o.Vector3(0,0,-1);s.applyQuaternion(e.quaternion);return{position:s.clone().multiplyScalar(-a).add(i),target:i}}static calculateCameraFar(e,t,r,n){const{nearPlane:i,nearPlaneCoplanarPoint:o}=this._calculateCameraFarBuffers;o.copy(t).addScaledVector(r,e),i.setFromNormalAndCoplanarPoint(r,o);let a=-1/0;for(let e=0;e<n.length;++e)if(i.distanceToPoint(n[e])>=0){const r=n[e].distanceTo(t);a=Math.max(a,r)}return a=Math.max(2*e,a),a}static calculateCameraNear(e,t,r){let n=t.distanceToPoint(r);return n/=Math.sqrt(1+Math.tan(e.fov/180*Math.PI/2)**2*(e.aspect**2+1)),n=Math.max(.1,n),n}static getBoundingBoxCorners(e,t){if(8!==(t=t||Dt()(0,8).map(e=>new o.Vector3)).length)throw new Error(`outBuffer must hold exactly 8 elements, but holds ${t.length} elemnents`);const r=e.min,n=e.max;return t[0].set(r.x,r.y,r.z),t[1].set(n.x,r.y,r.z),t[2].set(r.x,n.y,r.z),t[3].set(r.x,r.y,n.z),t[4].set(n.x,n.y,r.z),t[5].set(n.x,n.y,n.z),t[6].set(n.x,r.y,n.z),t[7].set(r.x,n.y,n.z),t}}Sr._updateNearAndFarPlaneBuffers={cameraPosition:new o.Vector3,cameraDirection:new o.Vector3,corners:new Array(new o.Vector3,new o.Vector3,new o.Vector3,new o.Vector3,new o.Vector3,new o.Vector3,new o.Vector3,new o.Vector3)},Sr._calculateCameraFarBuffers={nearPlaneCoplanarPoint:new o.Vector3,nearPlane:new o.Plane};
|
|
468
494
|
/*!
|
|
469
495
|
* Copyright 2021 Cognite AS
|
|
470
496
|
*/
|
|
497
|
+
class Nr{constructor(e,t,r,n){this._events={cameraChange:new u.e},this._raycaster=new o.Raycaster,this.isDisposed=!1,this._nearAndFarNeedsUpdate=!1,this._onClick=void 0,this._onWheel=void 0,this._cameraControlsOptions={...Nr.DefaultCameraControlsOptions},this._currentBoundingBox=new o.Box3,this.automaticNearFarPlane=!0,this.automaticControlsSensitivity=!0,this._camera=null!=n?n:new o.PerspectiveCamera(60,void 0,.1,1e4),this._domElement=e,this._inputHandler=t,this._modelRaycastCallback=r,this.setCameraControlsOptions(this._cameraControlsOptions),this._controls=new Ir(this._camera,e),this._controls.minZoomDistance=Nr.DefaultMinZoomDistance,this._controls.addEventListener("cameraChange",e=>{const{position:t,target:r}=e.camera;this._events.cameraChange.fire(t.clone(),r.clone()),this._nearAndFarNeedsUpdate=!0})}on(e,t){switch(e){case"cameraChange":this._events.cameraChange.subscribe(t);break;default:Object(u.m)(e)}}off(e,t){switch(e){case"cameraChange":this._events.cameraChange.subscribe(t);break;default:Object(u.m)(e)}}fitCameraToBoundingBox(e,t,r=2){const{position:n,target:i}=Sr.calculateCameraStateToFitBoundingBox(this._camera,e,r);this.moveCameraTo(n,i,t)}get cameraControls(){return this._controls}set cameraControlsEnabled(e){this._controls.enabled=e}get cameraControlsEnabled(){return this._controls.enabled}set keyboardNavigationEnabled(e){this._controls.enableKeyboardNavigation=e}get keyboardNavigationEnabled(){return this._controls.enableKeyboardNavigation}getCamera(){return this._camera}setCameraState(e){var t,r,n;if(e.rotation&&e.target)throw new Error("Rotation and target can't be set at the same time");const i=null!==(t=e.position)&&void 0!==t?t:this._camera.position,a=null!==(r=e.target?new o.Quaternion:e.rotation)&&void 0!==r?r:new o.Quaternion,s=null!==(n=e.target)&&void 0!==n?n:e.rotation?Sr.calculateNewTargetFromRotation(this._camera,e.rotation,this._controls.getState().target):this._controls.getState().target;this._controls.cameraRawRotation.copy(a),this._controls.setState(i,s)}getCameraState(){return{position:this._camera.position.clone(),rotation:this._camera.quaternion.clone(),target:this._controls.getState().target.clone()}}getCameraControlsOptions(){return this._cameraControlsOptions}setCameraControlsOptions(e){this._cameraControlsOptions={...Nr.DefaultCameraControlsOptions,...e},this.teardownControls(!1),this.setupControls()}update(e,t){!this._nearAndFarNeedsUpdate&&t.equals(this._currentBoundingBox)||(this.updateCameraNearAndFar(this._camera,t),this._nearAndFarNeedsUpdate=!1,this._currentBoundingBox.copy(t)),this._controls.update(e)}dispose(){this.isDisposed=!0,this._controls.dispose(),this.teardownControls(),Object(u.q)(this._events),this._inputHandler.dispose()}moveCameraTo(e,t,r){if(this.isDisposed)return;const{_camera:n}=this;r=null!=r?r:this.calculateDefaultDuration(t.distanceTo(n.position));const i=this.calculateAnimationStartTarget(t),a={x:n.position.x,y:n.position.y,z:n.position.z,targetX:i.x,targetY:i.y,targetZ:i.z},c={x:e.x,y:e.y,z:e.z,targetX:t.x,targetY:t.y,targetZ:t.z},l=new o.Vector3,d=new o.Vector3,{tween:f,stopTween:u}=this.createTweenAnimation(a,c,r);f.onUpdate(()=>{this.isDisposed||(d.set(a.x,a.y,a.z),l.set(a.targetX,a.targetY,a.targetZ),this._camera&&this._controls.setState(d,l))}).onStop(()=>{this._controls.setState(d,l)}).onComplete(()=>{this.isDisposed||this._domElement.removeEventListener("pointerdown",u)}).start(s.a.now()),f.update(s.a.now())}moveCameraTargetTo(e,t){if(this.isDisposed)return;if(0===t)return void this._controls.setState(this._controls.getState().position,e);const{_camera:r,_controls:n}=this;t=null!=t?t:this.calculateDefaultDuration(e.distanceTo(r.position));const i=this.calculateAnimationStartTarget(e),a={targetX:i.x,targetY:i.y,targetZ:i.z},c={targetX:e.x,targetY:e.y,targetZ:e.z},l=new o.Vector3,{tween:d,stopTween:f}=this.createTweenAnimation(a,c,t);d.onStart(()=>{n.lookAtViewTarget=!0,n.setState(this._camera.position,e)}).onUpdate(()=>{this.isDisposed||(l.set(a.targetX,a.targetY,a.targetZ),this._camera&&("zoomToCursor"===this._cameraControlsOptions.mouseWheelAction&&n.setScrollTarget(l),n.setViewTarget(l)))}).onStop(()=>{n.lookAtViewTarget=!1,n.setState(this._camera.position,l)}).onComplete(()=>{this.isDisposed||(n.lookAtViewTarget=!1,n.enableKeyboardNavigation=!0,n.setState(this._camera.position,l),this._domElement.removeEventListener("pointerdown",f))}).start(s.a.now()),d.update(s.a.now())}updateCameraNearAndFar(e,t){if(!this.isDisposed&&(this.automaticControlsSensitivity||this.automaticNearFarPlane)&&(this.automaticNearFarPlane&&Sr.updateCameraNearAndFar(e,t),this.automaticControlsSensitivity)){const r=t.min.distanceTo(t.max);this._controls.minDistance=Math.min(Math.max(.02*r,.1*e.near),Nr.DefaultMinDistance)}}calculateAnimationStartTarget(e){const{_raycaster:t,_camera:r}=this;t.setFromCamera(new o.Vector2,r);const n=e.distanceTo(r.position),i=t.ray.direction.clone().multiplyScalar(n);return t.ray.origin.clone().add(i)}createTweenAnimation(e,t,r){const n=new s.a.Tween(e),i=e=>{if(this.isDisposed)return document.removeEventListener("keydown",i),void n.stop();("keydown"!==e.type||this._controls.enableKeyboardNavigation)&&(n.stop(),this._domElement.removeEventListener("pointerdown",i),this._domElement.removeEventListener("wheel",i),document.removeEventListener("keydown",i))};this._domElement.addEventListener("pointerdown",i),this._domElement.addEventListener("wheel",i),document.addEventListener("keydown",i);return{tween:n.to(t,r).easing(e=>s.a.Easing.Circular.Out(e)),stopTween:i}}calculateNewTargetWithoutModel(e,t){const r=t.min.distanceTo(t.max),n=this._controls.getScrollTarget().distanceTo(this._camera.position),i=n<=this._controls.minDistance?Math.min(this._camera.position.distanceTo(t.getCenter(new o.Vector3)),r)/2:n;this._raycaster.setFromCamera(e,this._camera);return this._raycaster.ray.direction.clone().normalize().multiplyScalar(i).add(this._camera.position)}async calculateNewTarget(e){var t,r;const{offsetX:n,offsetY:i}=e,{x:o,y:a}=this.convertPixelCoordinatesToNormalized(n,i),s=await this._modelRaycastCallback(n,i);return null!==(r=null===(t=s.intersection)||void 0===t?void 0:t.point)&&void 0!==r?r:this.calculateNewTargetWithoutModel({x:o,y:a},s.modelsBoundingBox)}teardownControls(e=!0){void 0!==this._onClick&&(this._inputHandler.off("click",this._onClick),this._onClick=void 0),void 0!==this._onWheel&&e&&(this._domElement.removeEventListener("wheel",this._onWheel),this._onWheel=void 0)}handleMouseWheelActionChange(e){const{_controls:t}=this;switch(null==e?void 0:e.mouseWheelAction){case"zoomToTarget":t.zoomToCursor=!1;break;case"zoomPastCursor":t.useScrollTarget=!1,t.zoomToCursor=!0;break;case"zoomToCursor":t.setScrollTarget(t.getState().target),t.useScrollTarget=!0,t.zoomToCursor=!0;break;case void 0:break;default:Object(u.m)(e.mouseWheelAction)}}setupControls(){let e=!1;const t=new o.Clock,r=async e=>{this._controls.enableKeyboardNavigation=!1;const t=await this.calculateNewTarget(e);this.moveCameraTargetTo(t,Nr.DefaultAnimationDuration)},n=async r=>{t.getDelta()>Nr.DefaultMinimalTimeBetweenRaycasts&&(e=!1);const n=!e&&r.deltaY<0,i="zoomToCursor"===this._cameraControlsOptions.mouseWheelAction;if(n&&i){e=!0;const t=await this.calculateNewTarget(r);this._controls.setScrollTarget(t)}};this._controls&&this.handleMouseWheelActionChange(this._cameraControlsOptions),this._cameraControlsOptions.changeCameraTargetOnClick&&void 0===this._onClick&&(this._inputHandler.on("click",r),this._onClick=r),void 0===this._onWheel&&(this._domElement.addEventListener("wheel",n),this._onWheel=n)}convertPixelCoordinatesToNormalized(e,t){return{x:e/this._domElement.clientWidth*2-1,y:t/this._domElement.clientHeight*-2+1}}calculateDefaultDuration(e){let t=125*e;return t=Math.min(Math.max(t,Nr.DefaultMinAnimationDuration),Nr.DefaultMaxAnimationDuration),t}}Nr.DefaultAnimationDuration=300,Nr.DefaultMinAnimationDuration=300,Nr.DefaultMaxAnimationDuration=1250,Nr.DefaultMinDistance=.8,Nr.DefaultMinZoomDistance=.4,Nr.DefaultMinimalTimeBetweenRaycasts=.08,Nr.DefaultCameraControlsOptions={mouseWheelAction:"zoomPastCursor",changeCameraTargetOnClick:!1};
|
|
471
498
|
/*!
|
|
472
499
|
* Copyright 2021 Cognite AS
|
|
473
|
-
*/
|
|
500
|
+
*/
|
|
474
501
|
/*!
|
|
475
502
|
* Copyright 2021 Cognite AS
|
|
476
|
-
*/
|
|
503
|
+
*/
|
|
504
|
+
var Rr=r(37);
|
|
477
505
|
/*!
|
|
478
506
|
* Copyright 2021 Cognite AS
|
|
479
|
-
*/
|
|
507
|
+
*/class Er{constructor(e){this._client=e}async mapTreeIndicesToNodeIds(e,t,r){const n=[...Pr(r,Er.MaxItemsPerRequest)].map(async r=>this.postByTreeIndicesRequest(e,t,r));return(await Promise.all(n)).flat()}async mapNodeIdsToTreeIndices(e,t,r){const n=[...Pr(r,Er.MaxItemsPerRequest)].map(async r=>this.postByNodeIdsRequest(e,t,r));return(await Promise.all(n)).flat()}async determineTreeIndexAndSubtreeSizesByNodeIds(e,t,r){const n=r.map(e=>({id:e}));return(await this._client.revisions3D.retrieve3DNodes(e,t,n)).map(e=>({treeIndex:e.treeIndex,subtreeSize:e.subtreeSize}))}async determineNodeAncestorsByNodeId(e,t,r,n){const i=await this._client.revisions3D.list3DNodeAncestors(e,t,r,{limit:1e3}),o=i.items.find(e=>e.id===r);E()(void 0!==o,"Could not find ancestor for node with nodeId "+r),n=Math.min(o.depth,n);const a=i.items.find(e=>e.depth===o.depth-n);return E()(void 0!==o,`Could not find ancestor for node with nodeId ${r} at 'generation' ${n}`),{treeIndex:a.treeIndex,subtreeSize:a.subtreeSize}}async getBoundingBoxesByNodeIds(e,t,r){const n=[...Pr(r,Er.MaxItemsPerRequest)].map(async r=>this._client.revisions3D.retrieve3DNodes(e,t,r.map(e=>({id:e}))));return(await Promise.all(n)).flat().filter(e=>e.boundingBox).map(e=>Object(u.w)(e.boundingBox))}async postByTreeIndicesRequest(e,t,r){console.assert(r.length<=Er.MaxItemsPerRequest);const n=`${this._client.getBaseUrl()}/api/v1/projects/${this._client.project}/3d/models/${e}/revisions/${t}/nodes/internalids/bytreeindices`,i=await this._client.post(n,{data:{items:r}});if(200===i.status)return i.data.items;throw new Rr.HttpError(i.status,i.data,i.headers)}async postByNodeIdsRequest(e,t,r){console.assert(r.length<=Er.MaxItemsPerRequest);const n=`${this._client.getBaseUrl()}/api/v1/projects/${this._client.project}/3d/models/${e}/revisions/${t}/nodes/treeindices/byinternalids`,i=await this._client.post(n,{data:{items:r}});if(200===i.status)return i.data.items;throw new Rr.HttpError(i.status,i.data,i.headers)}}function*Pr(e,t){let r=0;for(;r<e.length;){const n=Math.min(e.length-r,t);yield e.slice(r,r+n),r+=n}}
|
|
480
508
|
/*!
|
|
481
509
|
* Copyright 2021 Cognite AS
|
|
482
|
-
*/class
|
|
510
|
+
*/Er.MaxItemsPerRequest=1e3;class Br{constructor(){}mapTreeIndicesToNodeIds(e,t,r){return Promise.resolve(r)}mapNodeIdsToTreeIndices(e,t,r){return Promise.resolve(r)}determineTreeIndexAndSubtreeSizesByNodeIds(e,t,r){throw new Error("Not supported for local models")}determineNodeAncestorsByNodeId(e,t,r,n){throw new Error("Not supported for local models")}getBoundingBoxesByNodeIds(e,t,r){throw new Error("Not supported for local models")}}class Dr{constructor(e){this._metadataProvider=new L.c(e),this._nodesApiClient=new Er(e),this._modelDataClient=new L.a(e)}getNodesApiClient(){return this._nodesApiClient}getModelDataProvider(){return this._modelDataClient}getModelMetadataProvider(){return this._metadataProvider}}
|
|
483
511
|
/*!
|
|
484
512
|
* Copyright 2021 Cognite AS
|
|
485
|
-
*/class
|
|
513
|
+
*/class Or{getNodesApiClient(){return new Br}getModelDataProvider(){return new L.e}getModelMetadataProvider(){throw new L.g}}
|
|
486
514
|
/*!
|
|
487
515
|
* Copyright 2021 Cognite AS
|
|
488
|
-
*/
|
|
516
|
+
*/class zr{constructor(e){var t,r,a,s,c,m,h,b,v;this._subscription=new d.Subscription,this._boundAnimate=this.animate.bind(this),this._events={cameraChange:new u.e,click:new u.e,hover:new u.e,sceneRendered:new u.e,disposed:new u.e},this._models=[],this._extraObjects=[],this.isDisposed=!1,this.latestRequestId=-1,this.clock=new o.Clock,this._clippingNeedsUpdate=!1,this._updateNearAndFarPlaneBuffers={combinedBbox:new o.Box3,bbox:new o.Box3},this.startPointerEventListeners=()=>{this._mouseHandler.on("click",e=>{this._events.click.fire(e)}),this._mouseHandler.on("hover",e=>{this._events.hover.fire(e)})},this._renderer=null!==(t=e.renderer)&&void 0!==t?t:new o.WebGLRenderer,this._renderer.localClippingEnabled=!0,this.canvas.style.width="640px",this.canvas.style.height="480px",this.canvas.style.minWidth="100%",this.canvas.style.minHeight="100%",this.canvas.style.maxWidth="100%",this.canvas.style.maxHeight="100%",this._domElement=null!==(r=e.domElement)&&void 0!==r?r:function(){const e=document.createElementNS("http://www.w3.org/1999/xhtml","div");return e.style.width="100%",e.style.height="100%",e}(),this._domElement.appendChild(this.canvas),this.spinner=new kt(this.domElement),this.spinner.placement=null!==(s=null===(a=e.loadingIndicatorStyle)||void 0===a?void 0:a.placement)&&void 0!==s?s:"topLeft",this.spinner.opacity=Math.max(.2,null!==(m=null===(c=e.loadingIndicatorStyle)||void 0===c?void 0:c.opacity)&&void 0!==m?m:1),this.scene=new o.Scene,this.scene.autoUpdate=!1,this._mouseHandler=new u.g(this.canvas),this._cameraManager=null!==(h=e.cameraManager)&&void 0!==h?h:new Nr(this.canvas,this._mouseHandler,this.modelIntersectionCallback.bind(this)),this.camera=this._cameraManager.getCamera(),this._cameraManager.on("cameraChange",(e,t)=>{this._events.cameraChange.fire(e.clone(),t.clone())});const g=function(e){var t;const r={continuousModelStreaming:e.continuousModelStreaming,internal:{}};r.internal.cad={sectorCuller:e._sectorCuller};const{antiAliasing:o,multiSampleCount:a}=function(e){switch(e=e||"fxaa"){case"disabled":return{antiAliasing:n.NoAA,multiSampleCount:1};case"fxaa":return{antiAliasing:n.FXAA,multiSampleCount:1};case"msaa2":return{antiAliasing:n.NoAA,multiSampleCount:2};case"msaa4":return{antiAliasing:n.NoAA,multiSampleCount:4};case"msaa8":return{antiAliasing:n.NoAA,multiSampleCount:8};case"msaa16":return{antiAliasing:n.NoAA,multiSampleCount:16};case"msaa2+fxaa":return{antiAliasing:n.FXAA,multiSampleCount:2};case"msaa4+fxaa":return{antiAliasing:n.FXAA,multiSampleCount:4};case"msaa8+fxaa":return{antiAliasing:n.FXAA,multiSampleCount:8};case"msaa16+fxaa":return{antiAliasing:n.FXAA,multiSampleCount:16};default:Object(u.m)(e,"Unsupported anti-aliasing mode: "+e)}}(e.antiAliasingHint),s=function(e){const t={...f.ssaoRenderParameters};switch(e){case void 0:break;case"medium":t.sampleSize=i.Medium;break;case"high":t.sampleSize=i.High;break;case"veryhigh":t.sampleSize=i.VeryHigh;break;case"disabled":t.sampleSize=i.None;break;default:Object(u.m)(e,`Unexpected SSAO quality mode: '${e}'`)}return t}
|
|
489
517
|
/*!
|
|
490
518
|
* Copyright 2021 Cognite AS
|
|
491
519
|
*/
|
|
@@ -494,8 +522,8 @@ class Fn{constructor(e,t,n,r){var o,i;this._lastFrameSceneState={hasBackElements
|
|
|
494
522
|
*/
|
|
495
523
|
/*!
|
|
496
524
|
* Copyright 2021 Cognite AS
|
|
497
|
-
*/
|
|
525
|
+
*/(e.ssaoQualityHint),c={enabled:null!==(t=e.enableEdges)&&void 0!==t?t:f.edgeDetectionParameters.enabled};return r.logMetrics=e.logMetrics,r.renderOptions={antiAliasing:o,multiSampleCountHint:a,ssaoRenderParameters:s,edgeDetectionParameters:c},r}(e);!0===e._localModels?(this._dataSource=new Or,this._cdfSdkClient=void 0,this._revealManagerHelper=_r.createLocalHelper(this._renderer,this.scene,g)):void 0!==e.customDataSource?(this._dataSource=e.customDataSource,this._revealManagerHelper=_r.createCustomDataSourceHelper(this._renderer,this.scene,g,e.customDataSource)):(this._dataSource=new Dr(e.sdk),this._cdfSdkClient=e.sdk,this._revealManagerHelper=_r.createCdfHelper(this._renderer,this.scene,g,e.sdk)),this.renderController=new yt(this.camera),this.startPointerEventListeners(),this.revealManager.setRenderTarget((null===(b=e.renderTargetOptions)||void 0===b?void 0:b.target)||null,null===(v=e.renderTargetOptions)||void 0===v?void 0:v.autoSetSize),this._subscription.add(Object(d.fromEventPattern)(e=>this.revealManager.on("loadingStateChanged",e),e=>this.revealManager.off("loadingStateChanged",e)).subscribe(t=>{this.spinner.loading=t.itemsLoaded!=t.itemsRequested,e.onLoading&&e.onLoading(t.itemsLoaded,t.itemsRequested,t.itemsCulled)},e=>p.a.trackError(e,{moduleName:"Cognite3DViewer",methodName:"constructor"}))),this.animate(0),p.a.trackEvent("construct3dViewer",{constructorOptions:l()(e,["sdk","domElement","renderer","renderTargetOptions","onLoading","_sectorCuller"])})}get canvas(){return this.renderer.domElement}static isBrowserSupported(){return!0}get domElement(){return this._domElement}get renderer(){return this._renderer}get revealManager(){return this._revealManagerHelper.revealManager}get cadBudget(){return this.revealManager.cadBudget}set cadBudget(e){this.revealManager.cadBudget=e}get pointCloudBudget(){return this.revealManager.pointCloudBudget}set pointCloudBudget(e){this.revealManager.pointCloudBudget=e}get models(){return this._models.slice()}get cadLoadedStatistics(){return this.revealManager.cadLoadedStatistics}getVersion(){return"3.0.0"}setLogLevel(e){switch(e){case"none":this.setLogLevel("silent");break;default:D.a.setLevel(e)}}dispose(){if(!this.isDisposed){this.isDisposed=!0,void 0!==this.latestRequestId&&cancelAnimationFrame(this.latestRequestId),this.renderController.dispose(),this._subscription.unsubscribe(),this._cameraManager.dispose(),this.revealManager.dispose(),this.domElement.removeChild(this.canvas),this.renderer.dispose();for(const e of this._models.values())e.dispose();this._models.splice(0),this.spinner.dispose(),this._events.disposed.fire(),Object(u.q)(this._events),this._mouseHandler.dispose()}}on(e,t){switch(e){case"click":this._events.click.subscribe(t);break;case"hover":this._events.hover.subscribe(t);break;case"cameraChange":this._events.cameraChange.subscribe(t);break;case"sceneRendered":this._events.sceneRendered.subscribe(t);break;case"disposed":this._events.disposed.subscribe(t);break;default:Object(u.m)(e)}}off(e,t){switch(e){case"click":this._events.click.unsubscribe(t);break;case"hover":this._events.hover.unsubscribe(t);break;case"cameraChange":this._events.cameraChange.unsubscribe(t);break;case"sceneRendered":this._events.sceneRendered.unsubscribe(t);break;case"disposed":this._events.disposed.unsubscribe(t);break;default:Object(u.m)(e)}}get cameraManager(){return this._cameraManager}getViewState(){return this.createViewStateHelper().getCurrentState()}setViewState(e){const t=this.createViewStateHelper();return this.models.filter(e=>e instanceof et).map(e=>e).forEach(e=>e.removeAllStyledNodeCollections()),t.setState(e)}async addModel(e){if(void 0!==e.localPath)throw new Error("addModel() only supports CDF hosted models. Use addCadModel() and addPointCloudModel() to use self-hosted models");switch(await this.determineModelType(e.modelId,e.revisionId)){case"cad":return this.addCadModel(e);case"pointcloud":return this.addPointCloudModel(e);default:throw new Error("Model is not supported")}}async addCadModel(e){const t=this._dataSource.getNodesApiClient(),{modelId:r,revisionId:n}=e,i=await this._revealManagerHelper.addCadModel(e),o=new et(r,n,i,t);return this._models.push(o),this.scene.add(o),o}async addPointCloudModel(e){if(e.geometryFilter)throw new xt("geometryFilter is not supported for point clouds");const{modelId:t,revisionId:r}=e,n=await this._revealManagerHelper.addPointCloudModel(e),i=new _t(t,r,n);return this._models.push(i),this.scene.add(i),i}removeModel(e){const t=this._models.indexOf(e);if(-1===t)throw new Error("Model is not added to viewer");switch(this._models.splice(t,1),e.type){case"cad":const t=e;this.scene.remove(t),e.dispose(),this.revealManager.removeModel(e.type,t.cadNode),this._renderer.renderLists.dispose();break;case"pointcloud":const r=e;this.scene.remove(r),this.revealManager.removeModel(e.type,r.pointCloudNode);break;default:Object(u.m)(e.type,`Model type ${e.type} cannot be removed`)}this.renderController.redraw()}async determineModelType(e,t){if(void 0===this._cdfSdkClient)throw new Error(this.determineModelType.name+"() is only supported when connecting to Cognite Data Fusion");const r=new L.b(e,t),n=(await this._dataSource.getModelMetadataProvider().getModelOutputs(r)).map(e=>e.format);return i(L.d.GltfCadModel)||i(L.d.RevealCadModel)?"cad":i(L.d.EptPointCloud)?"pointcloud":"";function i(e){return n.includes(e)}}addObject3D(e){this.isDisposed||(this.scene.add(e),e.updateMatrixWorld(!0),this._extraObjects.push(e),this.renderController.redraw(),this.recalculateBoundingBox())}removeObject3D(e){if(this.isDisposed)return;this.scene.remove(e);const t=this._extraObjects.indexOf(e);t>=0&&this._extraObjects.splice(t,1),this.renderController.redraw(),this.recalculateBoundingBox()}addUiObject(e,t,r){this.isDisposed||this.revealManager.addUiObject(e,t,r)}removeUiObject(e){this.isDisposed||this.revealManager.removeUiObject(e)}setBackgroundColor(e){this.isDisposed||(this.renderer.setClearColor(e),this.spinner.updateBackgroundColor(e),this.requestRedraw())}setClippingPlanes(e){this.revealManager.clippingPlanes=e,this._clippingNeedsUpdate=!0}getClippingPlanes(){return this.revealManager.clippingPlanes.map(e=>e.clone())}getCamera(){return this.camera}getScene(){return this.scene}loadCameraFromModel(e){const t=e.getCameraConfiguration();t?this._cameraManager.setCameraState({position:t.position,target:t.target}):this.fitCameraToModel(e,0)}fitCameraToModel(e,t){const r=e.getModelBoundingBox(new o.Box3,!0);this._cameraManager.fitCameraToBoundingBox(r,t)}fitCameraToBoundingBox(e,t,r=2){this._cameraManager.fitCameraToBoundingBox(e,t,r)}requestRedraw(){this.revealManager.requestRedraw()}worldToScreen(e,t){this.camera.updateMatrixWorld();const r=new o.Vector3;return t?Object(u.A)(this.camera,e,r):Object(u.B)(this.renderer,this.camera,e,r),r.x<0||r.x>1||r.y<0||r.y>1||r.z<0||r.z>1?null:new o.Vector2(r.x,r.y)}async getScreenshot(e=this.canvas.width,t=this.canvas.height){if(this.isDisposed)throw new Error("Viewer is disposed");const{width:r,height:n}=this.canvas,i=this.camera.clone();Fr(i,e,t),this.renderer.setSize(e,t),this.renderer.render(this.scene,i),this.revealManager.render(i);const o=this.renderer.domElement.toDataURL();return this.renderer.setSize(r,n),this.renderer.render(this.scene,this.camera),this.requestRedraw(),o}async getIntersectionFromPixel(e,t,r){const n=this.getModels("cad"),i=this.getModels("pointcloud"),o=n.map(e=>e.cadNode),a=i.map(e=>e.pointCloudNode),s={normalizedCoords:{x:e/this.renderer.domElement.clientWidth*2-1,y:t/this.renderer.domElement.clientHeight*-2+1},camera:this.camera,renderer:this.renderer,clippingPlanes:this.getClippingPlanes(),domElement:this.renderer.domElement},c=function(e,t){const r=[];for(const n of e){const e=ge(n,t);e&&r.push(e)}return r.sort((e,t)=>e.distance-t.distance)}(o,s),l=it(a,s,null==r?void 0:r.pointIntersectionThreshold),d=[];if(l.length>0){const e=l[0];for(const t of i)if(t.pointCloudNode===e.pointCloudNode){const r={type:"pointcloud",model:t,point:e.point,pointIndex:e.pointIndex,distanceToCamera:e.distance};d.push(r);break}}if(c.length>0){const e=c[0];for(const t of n)if(t.cadNode===e.cadNode){const r={type:"cad",model:t,treeIndex:e.treeIndex,point:e.point,distanceToCamera:e.distance};d.push(r)}}return d.sort((e,t)=>e.distanceToCamera-t.distanceToCamera),d.length>0?d[0]:null}getModels(e){return this._models.filter(t=>t.type===e)}createViewStateHelper(){if(void 0===this._cdfSdkClient)throw new Error(this.setViewState.name+"() is only supported when connecting to Cognite Data Fusion");return new Kt(this,this._cdfSdkClient)}async animate(e){if(this.isDisposed)return;this.latestRequestId=requestAnimationFrame(this._boundAnimate);const{display:t,visibility:r}=window.getComputedStyle(this.canvas);if("visible"===r&&"none"!==t){const{renderController:t}=this;s.a.update(e);if(this.resizeIfNecessary()&&this.requestRedraw(),this.recalculateBoundingBox(),this._cameraManager.update(this.clock.getDelta(),this._updateNearAndFarPlaneBuffers.combinedBbox),t.update(),this.revealManager.update(this.camera),t.needsRedraw||this.revealManager.needsRedraw||this._clippingNeedsUpdate){const e=this.renderer.info.render.frame,r=Date.now();this.revealManager.render(this.camera),t.clearNeedsRedraw(),this.revealManager.resetRedraw(),this._clippingNeedsUpdate=!1;const n=Date.now()-r;this._events.sceneRendered.fire({frameNumber:e,renderTime:n,renderer:this.renderer,camera:this.camera})}}}async modelIntersectionCallback(e,t){return{intersection:await this.getIntersectionFromPixel(e,t),modelsBoundingBox:this._updateNearAndFarPlaneBuffers.combinedBbox}}recalculateBoundingBox(){if(this.isDisposed)return;const{combinedBbox:e,bbox:t}=this._updateNearAndFarPlaneBuffers;e.makeEmpty(),this._models.forEach(r=>{r.getModelBoundingBox(t),t.isEmpty()||e.union(t)}),this._extraObjects.forEach(r=>{t.setFromObject(r),t.isEmpty()||e.union(t)})}resizeIfNecessary(){if(this.isDisposed)return!1;const e=this.renderer.getSize(new o.Vector2),t=e.width,r=e.height,n=0!==this.domElement.clientWidth?this.domElement.clientWidth:this.canvas.clientWidth,i=0!==this.domElement.clientHeight?this.domElement.clientHeight:this.canvas.clientHeight,a=n*i,s=a>14e5?Math.sqrt(14e5/a):1,c=n*s,l=i*s;return!(Math.abs(t-c)<.1&&Math.abs(r-l)<.1)&&(Fr(this.camera,c,l),this.renderer.setSize(c,l),!0)}}function Fr(e,t,r){e.aspect=t/r,e.updateProjectionMatrix()}const Gr="3.0.0";
|
|
498
526
|
/*!
|
|
499
527
|
* Copyright 2021 Cognite AS
|
|
500
|
-
*/(e.ssaoQualityHint),s={enabled:null!==(t=e.enableEdges)&&void 0!==t?t:N.edgeDetectionParameters.enabled};return n.logMetrics=e.logMetrics,n.renderOptions={antiAliasing:r,multiSampleCountHint:o,ssaoRenderParameters:a,edgeDetectionParameters:s},n}(e);!0===e._localModels?(this._dataSource=new or,this._cdfSdkClient=void 0,this._revealManagerHelper=jn.createLocalHelper(this._renderer,this.scene,u)):void 0!==e.customDataSource?(this._dataSource=e.customDataSource,this._revealManagerHelper=jn.createCustomDataSourceHelper(this._renderer,this.scene,u,e.customDataSource)):(this._dataSource=new rr(e.sdk),this._cdfSdkClient=e.sdk,this._revealManagerHelper=jn.createCdfHelper(this._renderer,this.scene,u,e.sdk)),this.renderController=new G(this.camera),this.startPointerEventListeners(),this.revealManager.setRenderTarget((null===(d=e.renderTargetOptions)||void 0===d?void 0:d.target)||null,null===(c=e.renderTargetOptions)||void 0===c?void 0:c.autoSetSize),this._subscription.add(Object(P.fromEventPattern)(e=>this.revealManager.on("loadingStateChanged",e),e=>this.revealManager.off("loadingStateChanged",e)).subscribe(t=>{this.spinner.loading=t.itemsLoaded!=t.itemsRequested,e.onLoading&&e.onLoading(t.itemsLoaded,t.itemsRequested,t.itemsCulled)},e=>R.a.trackError(e,{moduleName:"Cognite3DViewer",methodName:"constructor"}))),this.animate(0),R.a.trackEvent("construct3dViewer",{constructorOptions:S()(e,["sdk","domElement","renderer","renderTargetOptions","onLoading","_sectorCuller"])})}get canvas(){return this.renderer.domElement}static isBrowserSupported(){return!0}get domElement(){return this._domElement}get renderer(){return this._renderer}get revealManager(){return this._revealManagerHelper.revealManager}get cadBudget(){return this.revealManager.cadBudget}set cadBudget(e){this.revealManager.cadBudget=e}get pointCloudBudget(){return this.revealManager.pointCloudBudget}set pointCloudBudget(e){this.revealManager.pointCloudBudget=e}get models(){return this._models.slice()}get cadLoadedStatistics(){return this.revealManager.cadLoadedStatistics}getVersion(){return"3.0.0-alpha.2"}setLogLevel(e){switch(e){case"none":this.setLogLevel("silent");break;default:wt.a.setLevel(e)}}dispose(){if(!this.isDisposed){this.isDisposed=!0,void 0!==this.latestRequestId&&cancelAnimationFrame(this.latestRequestId),this._subscription.unsubscribe(),this._cameraManager.dispose(),this.revealManager.dispose(),this.domElement.removeChild(this.canvas),this.renderer.dispose();for(const e of this._models.values())e.dispose();this._models.splice(0),this.spinner.dispose(),this._events.disposed.fire()}}on(e,t){switch(e){case"click":this._events.click.subscribe(t);break;case"hover":this._events.hover.subscribe(t);break;case"cameraChange":this._events.cameraChange.subscribe(t);break;case"sceneRendered":this._events.sceneRendered.subscribe(t);break;case"disposed":this._events.disposed.subscribe(t);break;default:Object(i.l)(e)}}off(e,t){switch(e){case"click":this._events.click.unsubscribe(t);break;case"hover":this._events.hover.unsubscribe(t);break;case"cameraChange":this._events.cameraChange.unsubscribe(t);break;case"sceneRendered":this._events.sceneRendered.unsubscribe(t);break;case"disposed":this._events.disposed.unsubscribe(t);break;default:Object(i.l)(e)}}setCameraControlsOptions(e){this._cameraManager.setCameraControlsOptions(e)}getCameraControlsOptions(){return this._cameraManager.getCameraControlsOptions()}getViewState(){return this.createViewStateHelper().getCurrentState()}setViewState(e){const t=this.createViewStateHelper();return this.models.filter(e=>e instanceof q).map(e=>e).forEach(e=>e.removeAllStyledNodeCollections()),t.setState(e)}async addModel(e){if(void 0!==e.localPath)throw new Error("addModel() only supports CDF hosted models. Use addCadModel() and addPointCloudModel() to use self-hosted models");switch(await this.determineModelType(e.modelId,e.revisionId)){case"cad":return this.addCadModel(e);case"pointcloud":return this.addPointCloudModel(e);default:throw new Error("Model is not supported")}}async addCadModel(e){const t=this._dataSource.getNodesApiClient(),{modelId:n,revisionId:r}=e,o=await this._revealManagerHelper.addCadModel(e),i=new q(n,r,o,t);return this._models.push(i),this.scene.add(i),i}async addPointCloudModel(e){if(e.localPath)throw new k("localPath is not supported");if(e.geometryFilter)throw new k("geometryFilter is not supported for point clouds");const{modelId:t,revisionId:n}=e,r=await this._revealManagerHelper.addPointCloudModel(e),o=new H(t,n,r);return this._models.push(o),this.scene.add(o),o}removeModel(e){const t=this._models.indexOf(e);if(-1===t)throw new Error("Model is not added to viewer");switch(this._models.splice(t,1),this.scene.remove(e),this.renderController.redraw(),e.type){case"cad":const t=e;return void this.revealManager.removeModel(e.type,t.cadNode);case"pointcloud":const n=e;return void this.revealManager.removeModel(e.type,n.pointCloudNode);default:Object(i.l)(e.type,`Model type ${e.type} cannot be removed`)}}async determineModelType(e,t){if(void 0===this._cdfSdkClient)throw new Error(this.determineModelType.name+"() is only supported when connecting to Cognite Data Fusion");const n=new st.b(e,t),r=(await this._dataSource.getModelMetadataProvider().getModelOutputs(n)).map(e=>e.format);return o(st.d.GltfCadModel)||o(st.d.RevealCadModel)?"cad":o(st.d.EptPointCloud)?"pointcloud":"";function o(e){return r.includes(e)}}addObject3D(e){this.isDisposed||(this.scene.add(e),e.updateMatrixWorld(!0),this._extraObjects.push(e),this.renderController.redraw(),this.updateCameraNearAndFar(this.camera))}removeObject3D(e){if(this.isDisposed)return;this.scene.remove(e);const t=this._extraObjects.indexOf(e);t>=0&&this._extraObjects.splice(t,1),this.renderController.redraw(),this.updateCameraNearAndFar(this.camera)}addUiObject(e,t,n){this.isDisposed||this.revealManager.addUiObject(e,t,n)}removeUiObject(e){this.isDisposed||this.revealManager.removeUiObject(e)}setBackgroundColor(e){this.isDisposed||(this.renderer.setClearColor(e),this.spinner.updateBackgroundColor(e),this.requestRedraw())}setClippingPlanes(e){this.revealManager.clippingPlanes=e,this._clippingNeedsUpdate=!0}getClippingPlanes(){return this.revealManager.clippingPlanes}getCamera(){return this.camera}getScene(){return this.scene}getCameraPosition(){return this.isDisposed?new l.Vector3(-1/0,-1/0,-1/0):this.camera.position.clone()}getCameraTarget(){return this.isDisposed?new l.Vector3(-1/0,-1/0,-1/0):this._cameraManager.getCameraControlsState().target.clone()}setCameraPosition(e){this.isDisposed||this._cameraManager.setCameraControlsState({position:e,target:this.getCameraTarget()})}setCameraTarget(e,t=!1){this.isDisposed||this._cameraManager.setCameraTarget(e,t)}get cameraControls(){return this._cameraManager.cameraControls}get cameraControlsEnabled(){return this._cameraManager.cameraControlsEnabled}set cameraControlsEnabled(e){this._cameraManager.cameraControlsEnabled=e}loadCameraFromModel(e){const t=e.getCameraConfiguration();t?this._cameraManager.setCameraControlsState({position:t.position,target:t.target}):this.fitCameraToModel(e,0)}fitCameraToModel(e,t){const n=e.getModelBoundingBox(new l.Box3,!0);this._cameraManager.fitCameraToBoundingBox(n,t)}fitCameraToBoundingBox(e,t,n=2){this._cameraManager.fitCameraToBoundingBox(e,t,n)}requestRedraw(){this.revealManager.requestRedraw()}enableKeyboardNavigation(){this._cameraManager.keyboardNavigationEnabled=!0}disableKeyboardNavigation(){this._cameraManager.keyboardNavigationEnabled=!1}worldToScreen(e,t){this.camera.updateMatrixWorld();const n=new l.Vector3;return t?Object(D.a)(this.camera,e,n):Object(D.b)(this.renderer,this.camera,e,n),n.x<0||n.x>1||n.y<0||n.y>1||n.z<0||n.z>1?null:new l.Vector2(n.x,n.y)}async getScreenshot(e=this.canvas.width,t=this.canvas.height){if(this.isDisposed)throw new Error("Viewer is disposed");const{width:n,height:r}=this.canvas,o=this.camera.clone();ar(o,e,t),this.renderer.setSize(e,t),this.renderer.render(this.scene,o),this.revealManager.render(o);const i=this.renderer.domElement.toDataURL();return this.renderer.setSize(n,r),this.renderer.render(this.scene,this.camera),this.requestRedraw(),i}async getIntersectionFromPixel(e,t,n){const r=this.getModels("cad"),o=this.getModels("pointcloud"),i=r.map(e=>e.cadNode),a=o.map(e=>e.pointCloudNode),s={normalizedCoords:{x:e/this.renderer.domElement.clientWidth*2-1,y:t/this.renderer.domElement.clientHeight*-2+1},camera:this.camera,renderer:this.renderer,clippingPlanes:this.getClippingPlanes(),domElement:this.renderer.domElement},d=function(e,t){const n=[];for(const r of e){const e=B(r,t);e&&n.push(e)}return n.sort((e,t)=>e.distance-t.distance)}(i,s),l=Q(a,s,null==n?void 0:n.pointIntersectionThreshold),c=[];if(l.length>0){const e=l[0];for(const t of o)if(t.pointCloudNode===e.pointCloudNode){const n={type:"pointcloud",model:t,point:e.point,pointIndex:e.pointIndex,distanceToCamera:e.distance};c.push(n);break}}if(d.length>0){const e=d[0];for(const t of r)if(t.cadNode===e.cadNode){const n={type:"cad",model:t,treeIndex:e.treeIndex,point:e.point,distanceToCamera:e.distance};c.push(n)}}return c.sort((e,t)=>e.distanceToCamera-t.distanceToCamera),c.length>0?c[0]:null}getModels(e){return this._models.filter(t=>t.type===e)}createViewStateHelper(){if(void 0===this._cdfSdkClient)throw new Error(this.setViewState.name+"() is only supported when connecting to Cognite Data Fusion");return new ue(this,this._cdfSdkClient)}async animate(e){if(this.isDisposed)return;this.latestRequestId=requestAnimationFrame(this._boundAnimate);const{display:t,visibility:n}=window.getComputedStyle(this.canvas);if("visible"===n&&"none"!==t){const{renderController:t}=this;M.a.update(e);if(this.resizeIfNecessary()&&this.requestRedraw(),this._cameraManager.updateCameraControlsState(this.clock.getDelta()),t.update(),this.revealManager.update(this.camera),t.needsRedraw||this.revealManager.needsRedraw||this._clippingNeedsUpdate){const e=this.renderer.info.render.frame,n=Date.now();this.updateCameraNearAndFar(this.camera),this.revealManager.render(this.camera),t.clearNeedsRedraw(),this.revealManager.resetRedraw(),this._clippingNeedsUpdate=!1;const r=Date.now()-n;this._events.sceneRendered.fire({frameNumber:e,renderTime:r,renderer:this.renderer,camera:this.camera})}}}async modelIntersectionCallback(e,t){return{intersection:await this.getIntersectionFromPixel(e,t),modelsBoundingBox:this._updateNearAndFarPlaneBuffers.combinedBbox}}updateCameraNearAndFar(e){if(this.isDisposed)return;if(!this._automaticControlsSensitivity&&!this._automaticNearFarPlane)return;const{combinedBbox:t,bbox:n}=this._updateNearAndFarPlaneBuffers;t.makeEmpty(),this._models.forEach(e=>{e.getModelBoundingBox(n),n.isEmpty()||t.union(n)}),this._extraObjects.forEach(e=>{n.setFromObject(e),n.isEmpty()||t.union(n)}),this._cameraManager.updateCameraNearAndFar(e,t)}resizeIfNecessary(){if(this.isDisposed)return!1;const e=this.renderer.getSize(new l.Vector2),t=e.width,n=e.height,r=0!==this.domElement.clientWidth?this.domElement.clientWidth:this.canvas.clientWidth,o=0!==this.domElement.clientHeight?this.domElement.clientHeight:this.canvas.clientHeight,i=this.renderer.getPixelRatio()*r,a=this.renderer.getPixelRatio()*o,s=i*a,d=s>14e5?Math.sqrt(14e5/s):1,c=i*d,u=a*d;return!(Math.abs(t-c)<.1&&Math.abs(n-u)<.1)&&(this.renderer.setSize(c,u),ar(this.camera,c,u),!0)}}function ar(e,t,n){e instanceof l.PerspectiveCamera?(e.aspect=t/n,e.updateProjectionMatrix()):e instanceof l.OrthographicCamera&&(e.left=-t,e.right=t,e.top=n,e.bottom=-n)}}])}));
|
|
528
|
+
*/}])}));
|
|
501
529
|
//# sourceMappingURL=index.map
|