All user data for FoundryVTT. Includes worlds, systems, modules, and any asset in the "foundryuserdata" directory. Does NOT include the FoundryVTT installation itself.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

1 lines
3.5 MiB

{"version":3,"file":"main.js","sources":["../module/ShaderUtils.js","../module/DicePreset.js","../module/DiceDefaultPresets.js","../module/DiceColors.js","../module/DiceModels.js","../node_modules/three/build/three.module.js","../node_modules/three/examples/jsm/utils/BufferGeometryUtils.js","../node_modules/three/examples/jsm/loaders/GLTFLoader.js","../module/DiceFactory.js","../module/DiceSFX.js","../module/sfx/PlaySoundEpicFail.js","../module/sfx/PlaySoundEpicWin.js","../module/libs/three.proton.js","../module/sfx/PlayAnimationParticleSpiral.js","../module/sfx/PlayAnimationParticleSparkles.js","../module/sfx/PlayAnimationParticleVortex.js","../module/sfx/PlayAnimationBright.js","../module/sfx/PlayAnimationDark.js","../module/sfx/PlayAnimationThormund.js","../module/sfx/PlayAnimationImpact.js","../module/DiceSFXManager.js","../module/sfx/PlayAnimationOutline.js","../module/sfx/PlayConfettiStrength1.js","../module/sfx/PlayConfettiStrength2.js","../module/sfx/PlayConfettiStrength3.js","../module/sfx/PlaySoundCustom.js","../module/sfx/PlayMacro.js","../node_modules/three/examples/jsm/loaders/RGBELoader.js","../node_modules/three/examples/jsm/shaders/CopyShader.js","../node_modules/three/examples/jsm/postprocessing/Pass.js","../node_modules/three/examples/jsm/postprocessing/ShaderPass.js","../node_modules/three/examples/jsm/postprocessing/MaskPass.js","../node_modules/three/examples/jsm/postprocessing/EffectComposer.js","../node_modules/three/examples/jsm/postprocessing/RenderPass.js","../node_modules/three/examples/jsm/postprocessing/OutlinePass.js","../node_modules/three/examples/jsm/shaders/SMAAShader.js","../module/libs/SMAAPass.js","../node_modules/three/examples/jsm/shaders/GammaCorrectionShader.js","../node_modules/three/examples/jsm/shaders/LuminosityHighPassShader.js","../module/libs/TransparentUnrealBloomPass.js","../module/DiceBox.js","../module/DiceNotation.js","../module/Accumulator.js","../module/Utils.js","../module/libs/ThinFilmFresnelMap.js","../module/tours/DiceTour.js","../module/tours/DiceTourMain.js","../module/Dice3D.js","../module/DiceConfig.js","../module/RollableAreaConfig.js","../module/main.js"],"sourcesContent":["/**\n * This class contains utility functions for working with shaders.\n * These functions are called during the onBeforeCompile event.\n * @class ShaderUtils\n */\nexport class ShaderUtils {\n\n\tstatic applyDiceSoNiceShader(shader) {\n\n\t\tif(this.emissive !== undefined && game.dice3d.DiceFactory.realisticLighting) {\n\t\t\tShaderUtils.selectiveBloomShaderFragment(shader);\n\t\t}\n\n\t\t// This is the old iridescent shader, which is now deprecated.\n\t\tif (this.userData.iridescent) {\n\t\t\tShaderUtils.iridescentShaderFragment(shader);\n\t\t}\n\n\t\tif (shader.shaderName == \"MeshPhysicalMaterial\" && shader.transmission) {\n\t\t\tShaderUtils.transmissionAlphaShaderFragment(shader);\n\t\t}\n\n\t\tif (shader.shaderName == \"MeshPhysicalMaterial\" && shader.iridescence) {\n\t\t\tShaderUtils.iridescenceShaderFragment(shader);\n\t\t}\n\t}\n\n\tstatic transmissionAlphaShaderFragment(shader) {\n\t\tshader.fragmentShader = shader.fragmentShader.replace(`#include <transmission_fragment>`,\n\t\t\t`#include <transmission_fragment>\n\t\t\ttotalDiffuse = mix( totalDiffuse, transmission.rgb, transmissionFactor);\n\t\t\tfloat grey = (material.diffuseColor.r + material.diffuseColor.g + material.diffuseColor.b) / 3.0;\n\t\t\ttransmissionAlpha = mix( transmissionAlpha, 1.0-grey, transmissionFactor );`);\n\t}\n\n\tstatic selectiveBloomShaderFragment(shader) {\n\t\tshader.uniforms.globalBloom = game.dice3d.uniforms.globalBloom;\n\t\tshader.fragmentShader = `\n\t\t\tuniform float globalBloom;\n\t\t\t${shader.fragmentShader}\n\t\t`.replace(\n\t\t\t`#include <dithering_fragment>`,\n\t\t\t`#include <dithering_fragment>\n\t\t\tif (globalBloom > 0.5) {\n\t\t\t\t#ifdef USE_EMISSIVEMAP\n\t\t\t\t\tgl_FragColor.rgb = texture2D( emissiveMap, vUv ).rgb * emissive;\n\t\t\t\t#else\n\t\t\t\t\tgl_FragColor.rgb = vec3(0.0);\n\t\t\t\t#endif\n\t\t\t}\n\t\t`\n\t\t);\n\t}\n\n\tstatic iridescenceShaderFragment(shader) {\n\t\t// We only need to change the color channel used by the ThreeJS shader for the iridescenceMap from red to blue.\n\t\t// This is because we want to use the metallic channel for the iridescenceMap.\n\t\tshader.fragmentShader = shader.fragmentShader.replace(`#include <lights_physical_fragment>`,\n\t\t\t`#include <lights_physical_fragment>\n\t\t\t\t#ifdef USE_IRIDESCENCE\n\t\t\t\t\tmaterial.iridescence = iridescence;\n\t\t\t\t\t#ifdef USE_IRIDESCENCEMAP\n\t\t\t\t\t\tmaterial.iridescence *= texture2D( iridescenceMap, vUv ).b;\n\t\t\t\t\t#endif\n\t\t\t\t#endif`);\n\t}\n\t// This is the old iridescent shader, which is now deprecated.\n\tstatic iridescentShaderFragment(shader) {\n\t\tshader.uniforms.iridescenceLookUp = game.dice3d.uniforms.iridescenceLookUp;\n\t\tshader.uniforms.iridescenceNoise = game.dice3d.uniforms.iridescenceNoise;\n\t\tshader.uniforms.boost = game.dice3d.uniforms.boost;\n\n\t\tshader.vertexShader = `\n\t\t\tvarying vec3 viWorldPosition;\n\t\t\tvarying vec3 viWorldNormal;\n\t\t\t${shader.vertexShader}\n\t\t`.replace(\n\t\t\t`#include <fog_vertex>`,\n\t\t\t`#include <fog_vertex>\n\t\t\tviWorldPosition = worldPosition.xyz;\n\t\t\tviWorldNormal = mat3(modelMatrix) * normalize(normal);\n\t\t\t`\n\t\t);\n\n\t\tshader.fragmentShader = `\n\t\t\tvarying vec3 viWorldPosition;\n\t\t\tvarying vec3 viWorldNormal;\n\t\t\t\n\t\t\tuniform sampler2D iridescenceLookUp;\n\t\t\tuniform sampler2D iridescenceNoise;\n\t\t\tuniform float boost;\n\t\t\t${shader.fragmentShader}\n\t\t`.replace(\n\t\t\t`#include <transmission_fragment>`,\n\t\t\t`vec3 viewWorldDir = normalize(viWorldPosition - cameraPosition);\n\t\t\tvec3 iNormal = normalize(viWorldNormal); \n\t\t\tfloat NdotV = max(-dot(viewWorldDir, iNormal), 0.0);\n\t\t\tfloat fresnelFactor = pow(1.0 - NdotV, 5.0);\n\t\t\tfloat noise = texture2D(iridescenceNoise, vUv/2.0).r;\n\t\t\tvec3 airy = texture2D(iridescenceLookUp, vec2(NdotV * .99, noise)).xyz;\n\t\t\t\n\t\t\tif(metalnessFactor >= 1.0) {\n\t\t\t\ttotalSpecular = totalSpecular * airy * boost;\n\t\t\t}\n\n\t\t\t#include <transmission_fragment>`\n\t\t);\n\t}\n}","import { ShaderUtils } from './ShaderUtils';\nexport class DicePreset {\n\n\tconstructor(type, shape = '') {\n\n\t\tshape = shape || type;\n\n\t\tthis.type = type;\n\t\tthis.term = 'Die';\n\t\tthis.shape = shape || type;\n\t\tthis.scale = 1;\n\t\tthis.labels = [];\n\t\tthis.valueMap = null;\n\t\tthis.values = [];\n\t\tthis.bumps = [];\n\t\tthis.emissiveMaps = [];\n\t\tthis.emissive = 0x000000;\n\t\tthis.mass = 300;\n\t\tthis.inertia = 13;\n\t\tthis.geometry = null;\n\t\tthis.model = null;\n\t\tthis.system = 'standard';\n\t\tthis.modelLoaded = false;\n\t\tthis.modelLoading = false;\n\t\tthis.modelFile = null;\n\t\tthis.internalAdd = false;\n\n\t\t//todo : check if this is useful\n\t\tthis.appearance = {\n\t\t\tlabelColor: \"#FFFFFF\",\n\t\t\tdiceColor: \"#000000\",\n\t\t\toutlineColor: \"#000000\",\n\t\t\tedgeColor: \"#000000\",\n\t\t\ttexture: \"none\",\n\t\t\tmaterial: \"auto\",\n\t\t\tfont: \"auto\",\n\t\t\tcolorset: \"custom\"\n\t\t};\n\t}\n\n\tsetValues(min = 1, max = 20, step = 1) {\n\t\tthis.values = this.range(min, max, step);\n\t\tif(min < 1)\n\t\t\tthis.setValueMap(min, max, step);\n\t}\n\n\tsetValueMap(min, max, step) {\n\t\tlet map = {};\n\t\tlet count=1;\n\t\tfor(let i = min; i<= max; i+=step){\n\t\t\tmap[i] = count;\n\t\t\tcount++;\n\t\t}\n\t\tthis.valueMap = map;\n\t}\n\n\tregisterFaces(faces, type = \"labels\") {\n\t\tlet tab = [];\n\t\t\n\t\ttab.push('');\n\t\tif (![\"d2\", \"d10\"].includes(this.shape)) tab.push('');\n\n\t\tif (this.shape == 'd4') {\n\n\t\t\tlet a = faces[0];\n\t\t\tlet b = faces[1];\n\t\t\tlet c = faces[2];\n\t\t\tlet d = faces[3];\n\n\t\t\ttab = [\n\t\t\t\t[[], [0, 0, 0], [b, d, c], [a, c, d], [b, a, d], [a, b, c]],\n\t\t\t\t[[], [0, 0, 0], [b, c, d], [c, a, d], [b, d, a], [c, b, a]],\n\t\t\t\t[[], [0, 0, 0], [d, c, b], [c, d, a], [d, b, a], [c, a, b]],\n\t\t\t\t[[], [0, 0, 0], [d, b, c], [a, d, c], [d, a, b], [a, c, b]]\n\t\t\t];\n\t\t} else {\n\t\t\tArray.prototype.push.apply(tab, faces)\n\t\t}\n\n\t\tswitch(type){\n\t\t\tcase \"labels\":\n\t\t\t\tthis.labels = tab;\n\t\t\t\tbreak;\n\t\t\tcase \"bumps\":\n\t\t\t\tthis.bumps = tab;\n\t\t\t\tbreak;\n\t\t\tcase \"emissive\":\n\t\t\t\tthis.emissiveMaps = tab;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tsetLabels(labels) {\n\t\tthis.labels = labels;\n\t\tthis.modelLoaded=false;\n\t\tthis.modelLoading=false;\n\t}\n\n\tsetBumpMaps(bumps) {\n\t\tthis.bumps = bumps;\n\t\tthis.modelLoaded=false;\n\t\tthis.modelLoading=false;\n\t}\n\n\tsetEmissiveMaps(emissiveMaps) {\n\t\tthis.emissiveMaps = emissiveMaps;\n\t\tthis.modelLoaded=false;\n\t\tthis.modelLoading=false;\n\t}\n\n\tloadTextures() {\n\t\tif(!this.modelLoaded && this.modelLoading === false){\n\t\t\tthis.modelLoading = new Promise((resolve,reject)=> {\n\t\t\t\tlet textures;\n\t\t\t\tlet type;\n\t\t\t\tlet textureTypeLoaded = 0;\n\t\t\t\tfor(let i = 0; i < 3;i++){\n\t\t\t\t\tswitch(i){\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\ttextures = this.labels;\n\t\t\t\t\t\t\ttype = \"labels\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\ttextures = this.bumps;\n\t\t\t\t\t\t\ttype = \"bumps\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\ttextures = this.emissiveMaps;\n\t\t\t\t\t\t\ttype = \"emissive\";\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tlet loadedImages = 0;\n\t\t\t\t\tlet numImages = textures.length;\n\t\t\t\t\tlet regexTexture = /\\.(PNG|JPG|GIF|WEBP)$/i;\n\t\t\t\t\tlet imgElements = Array(textures.length);\n\t\t\t\t\tlet hasTextures = false;\n\t\t\t\t\tfor (let i = 0; i < numImages; i++) {\n\t\t\t\t\t\tif (textures[i] == null || textures[i] == '' || !textures[i].match(regexTexture)) {\n\t\t\t\t\t\t\timgElements[i] = textures[i];\n\t\t\t\t\t\t\t++loadedImages\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\t\t\t\t\t\thasTextures = true;\n\t\t\t\t\t\timgElements[i] = new Image();\n\t\t\t\t\t\timgElements[i].crossOrigin = \"Anonymous\";\n\t\t\t\t\t\timgElements.textureType = type;\n\t\t\t\t\t\timgElements[i].onload = function(){\n\t\t\t\t\t\t\tif (++loadedImages >= numImages) {\n\t\t\t\t\t\t\t\tthis.registerFaces(imgElements, imgElements.textureType);\n\t\t\t\t\t\t\t\tif(textureTypeLoaded < 2)\n\t\t\t\t\t\t\t\t\ttextureTypeLoaded++;\n\t\t\t\t\t\t\t\telse{\n\t\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t\t\tthis.modelLoaded = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}.bind(this);\n\n\t\t\t\t\t\t//We still consider the image as loaded even if it fails to load\n\t\t\t\t\t\t//so that we can still initialize the module\n\t\t\t\t\t\timgElements[i].onerror = function(texture){\n\t\t\t\t\t\t\tconsole.error(\"[Dice So Nice] Error loading texture:\" + texture);\n\t\t\t\t\t\t\tif (++loadedImages >= numImages) {\n\t\t\t\t\t\t\t\tif(textureTypeLoaded < 2)\n\t\t\t\t\t\t\t\t\ttextureTypeLoaded++;\n\t\t\t\t\t\t\t\telse{\n\t\t\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\t\t\tthis.modelLoaded = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}.bind(this, textures[i]);\n\n\t\t\t\t\t\timgElements[i].src = textures[i];\n\t\t\t\t\t}\n\t\t\t\t\tif (!hasTextures){\n\t\t\t\t\t\tthis.registerFaces(imgElements, type);\n\t\t\t\t\t\tif(textureTypeLoaded < 2)\n\t\t\t\t\t\t\ttextureTypeLoaded++;\n\t\t\t\t\t\telse{\n\t\t\t\t\t\t\tresolve();\n\t\t\t\t\t\t\tthis.modelLoaded = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\treturn this.modelLoading;\n\t}\n\n\trange(start, stop, step = 1) {\n\t\tvar a = [start], b = start;\n\t\twhile (b < stop) {\n\t\t\ta.push(b += step || 1);\n\t\t}\n\t\treturn a;\n\t}\n\n\tsetModel(file) {\n\t\tthis.modelFile = file;\n\t\tthis.modelLoaded = false;\n\t}\n\n\tloadModel(loader = null) {\n\t\t// Load a glTF resource\n\t\tif(!this.modelLoaded && this.modelLoading === false){\n\t\t\tthis.modelLoading = new Promise((resolve,reject)=> {\n\t\t\t\tloader.load(this.modelFile, gltf => {\n\t\t\t\t\tgltf.scene.traverse(function (node) {\n\t\t\t\t\t\tif (node.isMesh) {\n\t\t\t\t\t\t\tnode.castShadow = true; \n\t\t\t\t\t\t\tnode.material.onBeforeCompile = ShaderUtils.applyDiceSoNiceShader;\n\t\t\t\t\t\t\tconst anisotropy = game.dice3d.box.anisotropy;\n\t\t\t\t\t\t\tif(node.material.map !== null)\n\t\t\t\t\t\t\t\tnode.material.map.anisotropy = anisotropy;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif(node.material.normalMap !== null)\n\t\t\t\t\t\t\t\tnode.material.normalMap.anisotropy = anisotropy;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif(node.material.emissiveMap !== null)\n\t\t\t\t\t\t\t\tnode.material.emissiveMap.anisotropy = anisotropy;\n\n\t\t\t\t\t\t\tif(node.material.roughnessMap !== null)\n\t\t\t\t\t\t\t\tnode.material.roughnessMap.anisotropy = anisotropy;\n\n\t\t\t\t\t\t\tif(node.material.metalnessMap !== null)\n\t\t\t\t\t\t\t\tnode.material.metalnessMap.anisotropy = anisotropy;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\tthis.model = gltf;\n\t\t\t\t\tthis.modelLoaded = true;\n\t\t\t\t\tHooks.callAll(\"diceSoNiceModelLoaded\", this);\n\t\t\t\t\tresolve(gltf);\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t\treturn this.modelLoading;\n\t}\n}","\nimport { DicePreset } from './DicePreset.js';\n\nexport const BASE_PRESETS_LIST = [];\nexport const EXTRA_PRESETS_LIST = [];\n\n\n//////////////////////////////////////////////////\n// BASE SYSTEM //\n//////////////////////////////////////////////////\nlet diceobj;\n\ndiceobj = new DicePreset('d2');\ndiceobj.setLabels(['1', '2']);\ndiceobj.setValues(1, 2);\ndiceobj.inertia = 8;\ndiceobj.mass = 400;\ndiceobj.scale = 0.9;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('dc', 'd2');\ndiceobj.term = 'Coin';\ndiceobj.setLabels([\n 'modules/dice-so-nice/textures/coin/tail.webp',\n 'modules/dice-so-nice/textures/coin/heads.webp'\n]);\ndiceobj.setBumpMaps([\n 'modules/dice-so-nice/textures/coin/tail_bump.webp',\n 'modules/dice-so-nice/textures/coin/heads_bump.webp'\n]);\ndiceobj.setValues(0, 1);\ndiceobj.inertia = 8;\ndiceobj.scale = 0.9;\ndiceobj.colorset = \"coin_default\"\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d4');\ndiceobj.setLabels(['1', '2', '3', '4']);\ndiceobj.setValues(1, 4);\ndiceobj.inertia = 5;\ndiceobj.scale = 1.2;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d6');\ndiceobj.setLabels(['1', '2', '3', '4', '5', '6']);\ndiceobj.setValues(1, 6);\ndiceobj.scale = 0.9;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d3', 'd6');\ndiceobj.setLabels(['1', '2', '3']);\ndiceobj.setValues(1, 3);\ndiceobj.scale = 0.9;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('df', 'd6');\ndiceobj.term = 'FateDie';\ndiceobj.setLabels(['−', ' ', '+']);\ndiceobj.setValues(-1, 1);\ndiceobj.scale = 0.9;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d8');\ndiceobj.setLabels(['1', '2', '3', '4', '5', '6', '7', '8']);\ndiceobj.setValues(1, 8);\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d10');\ndiceobj.setLabels(['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']);\ndiceobj.setValues(1, 10);\ndiceobj.mass = 450;\ndiceobj.inertia = 9;\ndiceobj.scale = 0.9;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d5', 'd10');\ndiceobj.setLabels(['1', '2', '3', '4', '5']);\ndiceobj.setValues(1, 5);\ndiceobj.mass = 450;\ndiceobj.inertia = 9;\ndiceobj.scale = 0.9;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d100', 'd10');\ndiceobj.setLabels(['10', '20', '30', '40', '50', '60', '70', '80', '90', '00']);\ndiceobj.setValues(10, 100, 10);\ndiceobj.mass = 450;\ndiceobj.inertia = 9;\ndiceobj.scale = 0.9;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d12');\ndiceobj.setLabels(['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12']);\ndiceobj.setValues(1, 12);\ndiceobj.mass = 450;\ndiceobj.inertia = 8;\ndiceobj.scale = 0.9;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d14');\ndiceobj.setLabels(['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14']);\ndiceobj.setValues(1, 14);\ndiceobj.mass = 450;\ndiceobj.inertia = 8;\ndiceobj.scale = 1;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d7', 'd14');\ndiceobj.setLabels(['1', '2', '3', '4', '5', '6', '7']);\ndiceobj.setValues(1, 7);\ndiceobj.mass = 450;\ndiceobj.inertia = 8;\ndiceobj.scale = 1;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d16');\ndiceobj.setLabels(['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16']);\ndiceobj.setValues(1, 16);\ndiceobj.mass = 450;\ndiceobj.inertia = 8;\ndiceobj.scale = 1;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d20');\ndiceobj.setLabels(['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20']);\ndiceobj.setValues(1, 20);\ndiceobj.mass = 500;\ndiceobj.scale = 1;\ndiceobj.inertia = 6;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d24');\ndiceobj.setLabels(['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24']);\ndiceobj.setValues(1, 24);\ndiceobj.mass = 500;\ndiceobj.scale = 1;\ndiceobj.inertia = 10;\nBASE_PRESETS_LIST.push(diceobj);\n\ndiceobj = new DicePreset('d30');\ndiceobj.setLabels(['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30']);\ndiceobj.setValues(1, 30);\ndiceobj.mass = 500;\ndiceobj.scale = 1;\ndiceobj.inertia = 10;\nBASE_PRESETS_LIST.push(diceobj);\n\n//////////////////////////////////////////////////\n// EXTRA SYSTEM //\n//////////////////////////////////////////////////\n\n/**\n * Dot System\n */\nEXTRA_PRESETS_LIST.push({\n type: \"d6\",\n labels: [\n 'modules/dice-so-nice/textures/dot/d6-1.webp',\n 'modules/dice-so-nice/textures/dot/d6-2.webp',\n 'modules/dice-so-nice/textures/dot/d6-3.webp',\n 'modules/dice-so-nice/textures/dot/d6-4.webp',\n 'modules/dice-so-nice/textures/dot/d6-5.webp',\n 'modules/dice-so-nice/textures/dot/d6-6.webp'\n ],\n bumpMaps: [\n 'modules/dice-so-nice/textures/dot/d6-1-b.webp',\n 'modules/dice-so-nice/textures/dot/d6-2-b.webp',\n 'modules/dice-so-nice/textures/dot/d6-3-b.webp',\n 'modules/dice-so-nice/textures/dot/d6-4-b.webp',\n 'modules/dice-so-nice/textures/dot/d6-5-b.webp',\n 'modules/dice-so-nice/textures/dot/d6-6-b.webp'\n ],\n system: \"dot\"\n});\n\nEXTRA_PRESETS_LIST.push({\n type: \"d6\",\n labels: [\n 'modules/dice-so-nice/textures/dot/d6-1-black.webp',\n 'modules/dice-so-nice/textures/dot/d6-2-black.webp',\n 'modules/dice-so-nice/textures/dot/d6-3-black.webp',\n 'modules/dice-so-nice/textures/dot/d6-4-black.webp',\n 'modules/dice-so-nice/textures/dot/d6-5-black.webp',\n 'modules/dice-so-nice/textures/dot/d6-6-black.webp',\n ],\n bumpMaps: [\n 'modules/dice-so-nice/textures/dot/d6-1-b.webp',\n 'modules/dice-so-nice/textures/dot/d6-2-b.webp',\n 'modules/dice-so-nice/textures/dot/d6-3-b.webp',\n 'modules/dice-so-nice/textures/dot/d6-4-b.webp',\n 'modules/dice-so-nice/textures/dot/d6-5-b.webp',\n 'modules/dice-so-nice/textures/dot/d6-6-b.webp',\n ],\n system: \"dot_b\"\n});\n\n/**\n * foundry_vtt System\n */\nEXTRA_PRESETS_LIST.push({\n type: \"d2\",\n labels: ['1', 'F'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\",\n fontScale: 1.2\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d4\",\n labels: ['1', '2', '3', 'E'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\",\n fontScale: 0.8\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d6\",\n labels: ['1', '2', '3', '4', '5', 'E'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\"\n});\nEXTRA_PRESETS_LIST.push({\n type: \"df\",\n labels: ['−', ' ', '+'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\"\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d3\",\n labels: ['1', '2', 'E'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\"\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d8\",\n labels: ['1', '2', '3', '4', '5', '6', '7', 'F'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\"\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d10\",\n labels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', 'E'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\",\n fontScale: 0.9\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d5\",\n labels: ['1', '2', '3', '4', 'E'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\",\n fontScale: 0.9\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d100\",\n labels: ['10', '20', '30', '40', '50', '60', '70', '80', '90', 'E'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\"\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d12\",\n labels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', 'E'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\"\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d14\",\n labels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', 'E'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\"\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d7\",\n labels: ['1', '2', '3', '4', '5', '6', 'E'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\"\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d16\",\n labels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', 'E'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\"\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d20\",\n labels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', 'F'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\"\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d24\",\n labels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', 'F'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\"\n});\nEXTRA_PRESETS_LIST.push({\n type: \"d30\",\n labels: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', 'E'],\n font: \"FoundryVTT\",\n system: \"foundry_vtt\"\n});\n\n\n/**\n * Spectrum System\n */\n\nEXTRA_PRESETS_LIST.push({\n type: \"df\",\n labels: [\n 'modules/dice-so-nice/textures/spectrumdice/df-m.webp',\n 'modules/dice-so-nice/textures/spectrumdice/df-0.webp',\n 'modules/dice-so-nice/textures/spectrumdice/df-p.webp'\n ],\n emissiveMaps: [\n 'modules/dice-so-nice/textures/spectrumdice/df-m.webp',\n 'modules/dice-so-nice/textures/spectrumdice/df-0.webp',\n 'modules/dice-so-nice/textures/spectrumdice/df-p.webp'\n ],\n emissive: 0xffffff,\n colorset: \"spectrum_default\",\n system: \"spectrum\"\n});\n\nEXTRA_PRESETS_LIST.push({\n type: \"d2\",\n labels: [\n 'modules/dice-so-nice/textures/spectrumdice/d2-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d2-2.webp'\n ],\n emissiveMaps: [\n 'modules/dice-so-nice/textures/spectrumdice/d2-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d2-2.webp'\n ],\n emissive: 0xffffff,\n colorset: \"spectrum_default\",\n system: \"spectrum\"\n});\n\nEXTRA_PRESETS_LIST.push({\n type: \"dc\",\n labels: [\n 'modules/dice-so-nice/textures/spectrumdice/dc-h.webp',\n 'modules/dice-so-nice/textures/spectrumdice/dc-t.webp'\n ],\n emissiveMaps: [\n 'modules/dice-so-nice/textures/spectrumdice/dc-h.webp',\n 'modules/dice-so-nice/textures/spectrumdice/dc-t.webp'\n ],\n emissive: 0xffffff,\n colorset: \"spectrum_default\",\n system: \"spectrum\"\n});\n\nEXTRA_PRESETS_LIST.push({\n type: \"d4\",\n labels: [\n 'modules/dice-so-nice/textures/spectrumdice/d4-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d4-2.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d4-3.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d4-4.webp'\n ],\n emissiveMaps: [\n 'modules/dice-so-nice/textures/spectrumdice/d4-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d4-2.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d4-3.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d4-4.webp'\n ],\n emissive: 0xffffff,\n colorset: \"spectrum_default\",\n system: \"spectrum\"\n});\n\nEXTRA_PRESETS_LIST.push({\n type: \"d6\",\n labels: [\n 'modules/dice-so-nice/textures/spectrumdice/d6-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d6-2.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d6-3.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d6-4.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d6-5.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d6-6.webp'\n ],\n emissiveMaps: [\n 'modules/dice-so-nice/textures/spectrumdice/d6-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d6-2.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d6-3.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d6-4.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d6-5.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d6-6.webp'\n ],\n emissive: 0xffffff,\n colorset: \"spectrum_default\",\n system: \"spectrum\"\n});\n\nEXTRA_PRESETS_LIST.push({\n type: \"d8\",\n labels: [\n 'modules/dice-so-nice/textures/spectrumdice/d8-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-2.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-3.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-4.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-5.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-6.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-7.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-8.webp'\n ],\n emissiveMaps: [\n 'modules/dice-so-nice/textures/spectrumdice/d8-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-2.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-3.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-4.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-5.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-6.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-7.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d8-8.webp'\n ],\n emissive: 0xffffff,\n colorset: \"spectrum_default\",\n system: \"spectrum\"\n});\n\nEXTRA_PRESETS_LIST.push({\n type: \"d10\",\n labels: [\n 'modules/dice-so-nice/textures/spectrumdice/d10-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-2.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-3.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-4.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-5.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-6.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-7.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-8.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-9.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-0.webp'\n ],\n emissiveMaps: [\n 'modules/dice-so-nice/textures/spectrumdice/d10-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-2.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-3.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-4.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-5.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-6.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-7.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-8.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-9.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d10-0.webp'\n ],\n emissive: 0xffffff,\n colorset: \"spectrum_default\",\n system: \"spectrum\"\n});\n\nEXTRA_PRESETS_LIST.push({\n type: \"d12\",\n labels: [\n 'modules/dice-so-nice/textures/spectrumdice/d12-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-2.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-3.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-4.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-5.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-6.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-7.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-8.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-9.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-10.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-11.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-12.webp'\n ],\n emissiveMaps: [\n 'modules/dice-so-nice/textures/spectrumdice/d12-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-2.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-3.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-4.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-5.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-6.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-7.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-8.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-9.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-10.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-11.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d12-12.webp'\n ],\n emissive: 0xffffff,\n colorset: \"spectrum_default\",\n system: \"spectrum\"\n});\n\nEXTRA_PRESETS_LIST.push({\n type: \"d100\",\n labels: [\n 'modules/dice-so-nice/textures/spectrumdice/d100-10.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-20.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-30.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-40.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-50.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-60.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-70.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-80.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-90.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-00.webp'\n ],\n emissiveMaps: [\n 'modules/dice-so-nice/textures/spectrumdice/d100-10.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-20.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-30.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-40.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-50.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-60.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-70.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-80.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-90.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d100-00.webp'\n ],\n emissive: 0xffffff,\n colorset: \"spectrum_default\",\n system: \"spectrum\"\n});\n\nEXTRA_PRESETS_LIST.push({\n type: \"d20\",\n labels: [\n 'modules/dice-so-nice/textures/spectrumdice/d20-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-2.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-3.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-4.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-5.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-6.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-7.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-8.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-9.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-10.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-11.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-12.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-13.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-14.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-15.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-16.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-17.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-18.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-19.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-20.webp'\n ],\n emissiveMaps: [\n 'modules/dice-so-nice/textures/spectrumdice/d20-1.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-2.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-3.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-4.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-5.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-6.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-7.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-8.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-9.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-10.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-11.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-12.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-13.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-14.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-15.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-16.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-17.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-18.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-19.webp',\n 'modules/dice-so-nice/textures/spectrumdice/d20-20.webp'\n ],\n emissive: 0xffffff,\n colorset: \"spectrum_default\",\n system: \"spectrum\"\n});\n","export const TEXTURELIST = {\n\t'none': {\n\t\tname: 'DICESONICE.TextureNone',\n\t\tcomposite: 'source-over',\n\t\tsource: '',\n\t\tbump: ''\n\t},\n\t'cloudy': {\n\t\tname: 'DICESONICE.TextureCloudsTransparent',\n\t\tcomposite: 'destination-in',\n\t\tsource: 'modules/dice-so-nice/textures/cloudy.webp',\n\t\tbump: 'modules/dice-so-nice/textures/cloudy.alt.webp'\n\t},\n\t'cloudy_2': {\n\t\tname: 'DICESONICE.TextureClouds',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/cloudy.alt.webp',\n\t\tbump: 'modules/dice-so-nice/textures/cloudy.alt.webp'\n\t},\n\t'fire': {\n\t\tname: 'DICESONICE.TextureFire',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/fire.webp',\n\t\tbump: 'modules/dice-so-nice/textures/fire.webp'\n\t},\n\t'marble': {\n\t\tname: 'DICESONICE.TextureMarble',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/marble.webp',\n\t\tbump: '',\n\t\tmaterial: \"glass\"\n\t},\n\t'water': {\n\t\tname: 'DICESONICE.TextureWaterTransparent',\n\t\tcomposite: 'destination-in',\n\t\tsource: 'modules/dice-so-nice/textures/water.webp',\n\t\tbump: 'modules/dice-so-nice/textures/water.webp',\n\t\tmaterial: 'glass',\n\t},\n\t'water_2': {\n\t\tname: 'DICESONICE.TextureWater',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/water.webp',\n\t\tbump: 'modules/dice-so-nice/textures/water.webp',\n\t\tmaterial: 'glass',\n\t},\n\t'ice': {\n\t\tname: 'DICESONICE.TextureIceTransparent',\n\t\tcomposite: 'destination-in',\n\t\tsource: 'modules/dice-so-nice/textures/ice.webp',\n\t\tbump: 'modules/dice-so-nice/textures/ice.webp',\n\t\tmaterial: 'glass'\n\t},\n\t'ice_2': {\n\t\tname: 'DICESONICE.TextureIce',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/ice.webp',\n\t\tbump: 'modules/dice-so-nice/textures/ice.webp',\n\t\tmaterial: 'glass'\n\t},\n\t'paper': {\n\t\tname: 'DICESONICE.TexturePaper',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/paper.webp',\n\t\tbump: 'modules/dice-so-nice/textures/paper-bump.webp',\n\t\tmaterial: 'wood'\n\t},\n\t'speckles': {\n\t\tname: 'DICESONICE.TextureSpeckles',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/speckles.webp',\n\t\tbump: 'modules/dice-so-nice/textures/speckles.webp'\n\t},\n\t'glitter': {\n\t\tname: 'DICESONICE.TextureGlitter',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/glitter.webp',\n\t\tbump: 'modules/dice-so-nice/textures/glitter-bump.webp'\n\t},\n\t'glitter_2': {\n\t\tname: 'DICESONICE.TextureGlitterTransparent',\n\t\tcomposite: 'destination-in',\n\t\tsource: 'modules/dice-so-nice/textures/glitter-alpha.webp',\n\t\tbump: ''\n\t},\n\t'stars': {\n\t\tname: 'DICESONICE.TextureStars',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/stars.webp',\n\t\tbump: 'modules/dice-so-nice/textures/stars.webp'\n\t},\n\t'stainedglass': {\n\t\tname: 'DICESONICE.TextureStainedGlass',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/stainedglass.webp',\n\t\tbump: 'modules/dice-so-nice/textures/stainedglass-bump.webp',\n\t\tmaterial: 'iridescent'\n\t},\n\t'skulls': {\n\t\tname: 'DICESONICE.TextureSkulls',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/skulls.webp',\n\t\tbump: 'modules/dice-so-nice/textures/skulls.webp'\n\t},\n\t'leopard': {\n\t\tname: 'DICESONICE.TextureLeopard',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/leopard.webp',\n\t\tbump: 'modules/dice-so-nice/textures/leopard.webp',\n\t\tmaterial: 'wood'\n\t},\n\t'tiger': {\n\t\tname: 'DICESONICE.TextureTiger',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/tiger.webp',\n\t\tbump: 'modules/dice-so-nice/textures/tiger.webp',\n\t\tmaterial: 'wood'\n\t},\n\t'cheetah': {\n\t\tname: 'DICESONICE.TextureCheetah',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/cheetah.webp',\n\t\tbump: 'modules/dice-so-nice/textures/cheetah.webp',\n\t\tmaterial: 'wood'\n\t},\n\t'dragon': {\n\t\tname: 'Dragon',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/dragon.webp',\n\t\tbump: 'modules/dice-so-nice/textures/dragon-bump.webp'\n\t},\n\t'lizard': {\n\t\tname: 'Lizard',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/lizard.webp',\n\t\tbump: 'modules/dice-so-nice/textures/lizard-bump.webp'\n\t},\n\t'bird': {\n\t\tname: 'Bird',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/feather.webp',\n\t\tbump: 'modules/dice-so-nice/textures/feather-bump.webp'\n\t},\n\t'astral': {\n\t\tname: 'DICESONICE.TextureAstralSea',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/astral.webp',\n\t\tbump: 'modules/dice-so-nice/textures/stars.webp'\n\t},\n\t'wood': {\n\t\tname: 'DICESONICE.TextureWood',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/wood.webp',\n\t\tbump: 'modules/dice-so-nice/textures/wood.webp',\n\t\tmaterial: 'wood'\n\t},\n\t'metal': {\n\t\tname: 'DICESONICE.TextureMetal',\n\t\tcomposite: 'multiply',\n\t\tsource: 'modules/dice-so-nice/textures/metal.webp',\n\t\tbump: '',\n\t\tmaterial: 'metal'\n\t},\n\t'stone': {\n\t\tname: 'DICESONICE.TextureStone',\n\t\tcomposite: 'soft-light',\n\t\tsource: 'modules/dice-so-nice/textures/stone.webp',\n\t\tbump: 'modules/dice-so-nice/textures/stone.webp',\n\t\tmaterial: 'stone'\n\t},\n\t'radial': {\n\t\tname: 'DICESONICE.TextureRadial',\n\t\tcomposite: 'source-over',\n\t\tsource: 'modules/dice-so-nice/textures/radial.webp',\n\t\tbump: '',\n\t},\n\t'bronze01': {\n\t\tname: 'DICESONICE.TextureBronze1',\n\t\tcomposite: 'difference',\n\t\tsource: 'modules/dice-so-nice/textures/bronze01.webp',\n\t\tmaterial: 'metal',\n\t\tbump: ''\n\t},\n\t'bronze02': {\n\t\tname: 'DICESONICE.TextureBronze2',\n\t\tcomposite: 'difference',\n\t\tsource: 'modules/dice-so-nice/textures/bronze02.webp',\n\t\tmaterial: 'metal',\n\t\tbump: ''\n\t},\n\t'bronze03': {\n\t\tname: 'DICESONICE.TextureBronze3',\n\t\tcomposite: 'difference',\n\t\tsource: 'modules/dice-so-nice/textures/bronze03.webp',\n\t\tmaterial: 'metal',\n\t\tbump: ''\n\t},\n\t'bronze03a': {\n\t\tname: 'DICESONICE.TextureBronze3a',\n\t\tcomposite: 'difference',\n\t\tsource: 'modules/dice-so-nice/textures/bronze03a.webp',\n\t\tmaterial: 'metal',\n\t\tbump: ''\n\t},\n\t'bronze03b': {\n\t\tname: 'DICESONICE.TextureBronze3b',\n\t\tcomposite: 'difference',\n\t\tsource: 'modules/dice-so-nice/textures/bronze03b.webp',\n\t\tmaterial: 'metal',\n\t\tbump: ''\n\t},\n\t'bronze04': {\n\t\tname: 'DICESONICE.TextureBronze4',\n\t\tcomposite: 'difference',\n\t\tsource: 'modules/dice-so-nice/textures/bronze04.webp',\n\t\tmaterial: 'metal',\n\t\tbump: ''\n\t}\n};\n\nexport const COLORSETS = {\n\t'coin_default': {\n\t\tname: 'coin_default',\n\t\tdescription: 'DICESONICE.ColorCoinDefault',\n\t\tcategory: 'DICESONICE.AcquiredTaste',\n\t\tforeground: '#f6c928',\n\t\tbackground: '#f6c928',\n\t\toutline: 'none',\n\t\tedge: '#f6c928',\n\t\ttexture: 'metal',\n\t\tvisibility: 'hidden'\n\t},\n\t'spectrum_default': {\n\t\tname: 'spectrum_default',\n\t\tdescription: 'DICESONICE.ColorSpectrumDefault',\n\t\tcategory: 'DICESONICE.AcquiredTaste',\n\t\tforeground: '#ffffff',\n\t\tbackground: '#000000',\n\t\toutline: '#ffffff',\n\t\tedge: '#000000',\n\t\ttexture: 'none',\n\t\tvisibility: 'hidden',\n\t\tmaterial: 'pristine'\n\t},\n\t'radiant': {\n\t\tname: 'radiant',\n\t\tdescription: 'DICESONICE.ColorRadiant',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#F9B333',\n\t\tbackground: '#FFFFFF',\n\t\toutline: 'gray',\n\t\ttexture: 'paper'\n\t},\n\t'fire': {\n\t\tname: 'fire',\n\t\tdescription: 'DICESONICE.ColorFire',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#f8d84f',\n\t\tbackground: ['#f8d84f','#f9b02d','#f43c04','#910200','#4c1009'],\n\t\toutline: 'black',\n\t\ttexture: 'fire'\n\t},\n\t'ice': {\n\t\tname: 'ice',\n\t\tdescription: 'DICESONICE.ColorIce',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#60E9FF',\n\t\tbackground: ['#214fa3','#3c6ac1','#253f70','#0b56e2','#09317a'],\n\t\toutline: 'black',\n\t\ttexture: 'ice'\n\t},\n\t'cold': {\n\t\tname: 'cold',\n\t\tdescription: 'DICESONICE.ColorCold',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#60E9FF',\n\t\tbackground: ['#214fa3','#3c6ac1','#253f70','#0b56e2','#09317a'],\n\t\toutline: 'black',\n\t\ttexture: 'ice_2'\n\t},\n\t'poison': {\n\t\tname: 'poison',\n\t\tdescription: 'DICESONICE.ColorPoison',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#D6A8FF',\n\t\tbackground: ['#313866','#504099','#66409e','#934fc3','#c949fc'],\n\t\toutline: 'black',\n\t\ttexture: 'cloudy'\n\t},\n\t'acid': {\n\t\tname: 'acid',\n\t\tdescription: 'DICESONICE.ColorAcid',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#A9FF70',\n\t\tbackground: ['#a6ff00', '#83b625','#5ace04','#69f006','#b0f006','#93bc25'],\n\t\toutline: 'black',\n\t\ttexture: 'marble',\n\t\tmaterial: 'plastic'\n\t},\n\t'thunder': {\n\t\tname: 'thunder',\n\t\tdescription: 'DICESONICE.ColorThunder',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#FFC500',\n\t\tbackground: '#7D7D7D',\n\t\toutline: 'black',\n\t\ttexture: 'cloudy'\n\t},\n\t'lightning': {\n\t\tname: 'lightning',\n\t\tdescription: 'DICESONICE.ColorLightning',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#FFC500',\n\t\tbackground: ['#f17105', '#f3ca40','#eddea4','#df9a57','#dea54b'],\n\t\toutline: '#7D7D7D',\n\t\ttexture: 'ice'\n\t},\n\t'air': {\n\t\tname: 'air',\n\t\tdescription: 'DICESONICE.ColorAir',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#ffffff',\n\t\tbackground: ['#d0e5ea', '#c3dee5','#a4ccd6','#8dafb7','#80a4ad'],\n\t\toutline: 'black',\n\t\ttexture: 'cloudy'\n\t},\n\t'water': {\n\t\tname: 'water',\n\t\tdescription: 'DICESONICE.ColorWater',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#60E9FF',\n\t\tbackground: ['#87b8c4', '#77a6b2','#6b98a3','#5b8691','#4b757f'],\n\t\toutline: 'black',\n\t\ttexture: 'water'\n\t},\n\t'earth': {\n\t\tname: 'earth',\n\t\tdescription: 'DICESONICE.ColorEarth',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#6C9943',\n\t\tbackground: ['#346804', '#184200','#527f22', '#3a1d04', '#56341a','#331c17','#5a352a','#302210'],\n\t\toutline: 'black',\n\t\ttexture: 'speckles'\n\t},\n\t'force': {\n\t\tname: 'force',\n\t\tdescription: 'DICESONICE.ColorForce',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: 'white',\n\t\tbackground: ['#FF97FF', '#FF68FF','#C651C6'],\n\t\toutline: '#570000',\n\t\ttexture: 'stars'\n\t},\n\t'psychic': {\n\t\tname: 'psychic',\n\t\tdescription: 'DICESONICE.ColorPsychic',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#D6A8FF',\n\t\tbackground: ['#313866','#504099','#66409E','#934FC3','#C949FC','#313866'],\n\t\toutline: 'black',\n\t\ttexture: 'speckles'\n\t},\n\t'necrotic': {\n\t\tname: 'necrotic',\n\t\tdescription: 'DICESONICE.ColorNecrotic',\n\t\tcategory: 'DICESONICE.DamageTypes',\n\t\tforeground: '#ffffff',\n\t\tbackground: '#6F0000',\n\t\toutline: 'black',\n\t\ttexture: 'skulls'\n\t},\n\t'breebaby': {\n\t\tname: 'breebaby',\n\t\tdescription: 'DICESONICE.ColorPastelSunset',\n\t\tcategory: 'DICESONICE.ThemesSoNice',\n\t\tforeground: ['#5E175E', '#564A5E','#45455E','#3D5A5E','#1E595E','#5E3F3D','#5E1E29','#283C5E','#25295E'],\n\t\tbackground: ['#FE89CF', '#DFD4F2','#C2C2E8','#CCE7FA','#A1D9FC','#F3C3C2','#EB8993','#8EA1D2','#7477AD'],\n\t\toutline: 'white',\n\t\ttexture: 'marble',\n\t\tmaterial: 'plastic'\n\t},\n\t'pinkdreams': {\n\t\tname: 'pinkdreams',\n\t\tdescription: 'DICESONICE.ColorPinkDreams',\n\t\tcategory: 'DICESONICE.ThemesSoNice',\n\t\tforeground: 'white',\n\t\tbackground: ['#ff007c', '#df73ff','#f400a1','#df00ff','#ff33cc'],\n\t\toutline: '#570000',\n\t\ttexture: 'skulls'\n\t},\n\t'inspired': {\n\t\tname: 'inspired',\n\t\tdescription: 'DICESONICE.ColorInspired',\n\t\tcategory: 'DICESONICE.ThemesSoNice',\n\t\tforeground: '#FFD800',\n\t\tbackground: '#C4C4B6',\n\t\toutline: '#000000',\n\t\ttexture: 'stone'\n\t},\n\t'bloodmoon': {\n\t\tname: 'bloodmoon',\n\t\tdescription: 'DICESONICE.ColorBloodMoon',\n\t\tcategory: 'DICESONICE.ThemesSoNice',\n\t\tforeground: '#CDB800',\n\t\tbackground: '#6F0000',\n\t\toutline: 'black',\n\t\ttexture: 'marble',\n\t\tmaterial: 'plastic'\n\t},\n\t'starynight': {\n\t\tname: 'starynight',\n\t\tdescription: 'DICESONICE.ColorStaryNight',\n\t\tcategory: 'DICESONICE.ThemesSoNice',\n\t\tforeground: '#4F708F',\n\t\tbackground: ['#091636','#233660','#4F708F','#8597AD','#E2E2E2'],\n\t\toutline: 'white',\n\t\ttexture: 'speckles'\n\t},\n\t'glitterparty': {\n\t\tname: 'glitterparty',\n\t\tdescription: 'DICESONICE.ColorGlitterParty',\n\t\tcategory: 'DICESONICE.ThemesSoNice',\n\t\tforeground: 'white',\n\t\tbackground: ['#FFB5F5','#7FC9FF','#A17FFF'],\n\t\toutline: 'none',\n\t\ttexture: 'glitter'\n\t},\n\t'astralsea': {\n\t\tname: 'astralsea',\n\t\tdescription: 'DICESONICE.ColorAstralSea',\n\t\tcategory: 'DICESONICE.ThemesSoNice',\n\t\tforeground: '#565656',\n\t\tbackground: 'white',\n\t\toutline: 'none',\n\t\ttexture: 'astral'\n\t},\n\t'foundry': {\n\t\tname: 'foundry',\n\t\tdescription: 'DICESONICE.ColorFoundry',\n\t\tcategory: 'DICESONICE.ThemesSoNice',\n\t\tforeground: '#000000',\n\t\tbackground: '#ffffff',\n\t\toutline: 'none',\n\t\tedge: '#000000',\n\t\ttexture: 'radial'\n\t},\n\t'dragons': {\n\t\tname: 'dragons',\n\t\tdescription: 'DICESONICE.ColorDragons',\n\t\tcategory: 'DICESONICE.AcquiredTaste',\n\t\tforeground: '#FFFFFF',\n\t\t// \t\t\t[ red, black, blue, green white gold, silver, bronze, copper brass\n\t\tbackground: ['#B80000', '#4D5A5A', '#5BB8FF', '#7E934E', '#FFFFFF', '#F6ED7C', '#7797A3', '#A78437', '#862C1A', '#FFDF8A'],\n\t\toutline: 'black',\n\t\ttexture: ['dragon', 'lizard'],\n\t\tdescription: 'Here be Dragons'\n\t},\n\t'birdup': {\n\t\tname: 'birdup',\n\t\tdescription: 'DICESONICE.ColorBirdUp',\n\t\tcategory: 'DICESONICE.AcquiredTaste',\n\t\tforeground: '#FFFFFF',\n\t\tbackground: ['#F11602', '#FFC000', '#6EC832', '#0094BC', '#05608D', '#FEABB3', '#F75680', '#F3F0DF', '#C7A57F'],\n\t\toutline: 'black',\n\t\ttexture: 'bird',\n\t\tdescription: 'Bird Up!'\n\t},\n\t'tigerking': {\n\t\tname: 'tigerking',\n\t\tdescription: 'DICESONICE.ColorTigerKing',\n\t\tcategory: 'DICESONICE.AcquiredTaste',\n\t\tforeground: '#ffffff',\n\t\tbackground: '#FFCC40',\n\t\toutline: 'black',\n\t\ttexture: ['leopard', 'tiger', 'cheetah']\n\t},\n\t'toxic': {\n\t\tname: 'toxic',\n\t\tdescription: 'DICESONICE.ColorToxic',\n\t\tcategory: 'DICESONICE.AcquiredTaste',\n\t\tforeground: '#A9FF70',\n\t\tbackground: ['#a6ff00', '#83b625','#5ace04','#69f006','#b0f006','#93bc25'],\n\t\toutline: 'black',\n\t\ttexture: 'fire'\n\t},\n\t'rainbow': {\n\t\tname: 'rainbow',\n\t\tdescription: 'DICESONICE.ColorRainblow',\n\t\tcategory: 'DICESONICE.Colors',\n\t\tforeground: ['#FF5959','#FFA74F','#FFFF56','#59FF59','#2374FF','#00FFFF','#FF59FF'],\n\t\tbackground: ['#900000','#CE3900','#BCBC00','#00B500','#00008E','#008282','#A500A5'],\n\t\toutline: 'black',\n\t\ttexture: 'none'\n\t},\n\t'random': {\n\t\tname: 'random',\n\t\tdescription: 'DICESONICE.ColorRaNdOm',\n\t\tcategory: 'DICESONICE.Colors',\n\t\tforeground: [],\n\t\toutline: [],\n\t\tbackground: [],\n\t\ttexture: []\n\t},\n\t'black': {\n\t\tname: 'black',\n\t\tdescription: 'DICESONICE.ColorBlack',\n\t\tcategory: 'DICESONICE.Colors',\n\t\tforeground: '#ffffff',\n\t\tbackground: '#000000',\n\t\toutline: 'black',\n\t\ttexture: 'none'\n\t},\n\t'white': {\n\t\tname: 'white',\n\t\tdescription: 'DICESONICE.ColorWhite',\n\t\tcategory: 'DICESONICE.Colors',\n\t\tforeground: '#000000',\n\t\tbackground: '#FFFFFF',\n\t\toutline: '#FFFFFF',\n\t\ttexture: 'none'\n\t},\n\t'grey': {\n\t\tname: 'grey',\n\t\tdescription: 'DICESONICE.ColorGrey',\n\t\tcategory: 'DICESONICE.Colors',\n\t\tforeground: '#FFFFFF',\n\t\tbackground: '#888888',\n\t\toutline: '#000000',\n\t\ttexture: 'none'\n\t},\n\t'red': {\n\t\tname: 'red',\n\t\tdescription: 'DICESONICE.ColorRed',\n\t\tcategory: 'DICESONICE.Colors',\n\t\tforeground: '#FFFFFF',\n\t\tbackground: '#FF0000',\n\t\toutline: 'none',\n\t\ttexture: 'none'\n\t},\n\t'blue': {\n\t\tname: 'blue',\n\t\tdescription: 'DICESONICE.ColorBlue',\n\t\tcategory: 'DICESONICE.Colors',\n\t\tforeground: '#FFFFFF',\n\t\tbackground: '#0000FF',\n\t\toutline: 'none',\n\t\ttexture: 'none'\n\t},\n\t'green': {\n\t\tname: 'green',\n\t\tdescription: 'DICESONICE.ColorGreen',\n\t\tcategory: 'DICESONICE.Colors',\n\t\tforeground: '#FFFFFF',\n\t\tbackground: '#00FF00',\n\t\toutline: 'none',\n\t\ttexture: 'none'\n\t},\n\t'yellow': {\n\t\tname: 'yellow',\n\t\tdescription: 'DICESONICE.ColorYellow',\n\t\tcategory: 'DICESONICE.Colors',\n\t\tforeground: '#000000',\n\t\tbackground: '#FFFF00',\n\t\toutline: 'none',\n\t\ttexture: 'none'\n\t},\n\t'pink': {\n\t\tname: 'pink',\n\t\tdescription: 'DICESONICE.ColorPink',\n\t\tcategory: 'DICESONICE.Colors',\n\t\tforeground: '#FFFFFF',\n\t\tbackground: '#FF00FF',\n\t\toutline: 'none',\n\t\ttexture: 'none'\n\t},\n\t'cyan': {\n\t\tname: 'cyan',\n\t\tdescription: 'DICESONICE.ColorCyan',\n\t\tcategory: 'DICESONICE.Colors',\n\t\tforeground: '#000000',\n\t\tbackground: '#00FFFF',\n\t\toutline: 'none',\n\t\ttexture: 'none'\n\t},\n\t'prism': {\n\t\tname: 'prism',\n\t\tdescription: 'DICESONICE.ColorPrism',\n\t\tcategory: 'DICESONICE.AcquiredTaste',\n\t\tforeground: '#FFFFFF',\n\t\tbackground: '#FFFFFF',\n\t\toutline: 'black',\n\t\ttexture: 'stainedglass'\n\t},\n\t'bronze': {\n\t\tname: 'bronze',\n\t\tdescription: 'DICESONICE.ColorBronze',\n\t\tcategory: 'DICESONICE.ThemesSoNice',\n\t\tforeground: ['#FF9159','#FFB066','#FFBF59','#FFD059'],\n\t\tbackground: ['#705206','#7A4E06','#643100','#7A2D06'],\n\t\toutline: ['#3D2D03','#472D04','#301700','#471A04'],\n\t\tedge: ['#FF5D0D','#FF7B00','#FFA20D','#FFBA0D'],\n\t\ttexture: [['bronze01','bronze02','bronze03','bronze03b','bronze03b','bronze04']]\n\t},\n\t'custom': {\n\t\tname: 'custom',\n\t\tdescription: 'DICESONICE.ColorCustom',\n\t\tcategory: 'DICESONICE.Colors',\n\t\tforeground: '',\n\t\tbackground: '',\n\t\toutline: '',\n\t\tedge: '',\n\t\ttexture: 'none'\n\t}\n};\n\nexport const DICE_SCALE = {\n\t\"d2\":1,\n\t\"d4\":1,\n\t\"d6\":1.3,\n\t\"d8\":1.1,\n\t\"d10\":1,\n\t\"d12\":1.1,\n\t\"d14\":0.5,\n\t\"d16\":0.5,\n\t\"d20\":1,\n\t\"d24\":1,\n\t\"d30\":0.75,\n\t\"d3\":1.3,\n\t\"d5\":1,\n\t\"d7\":0.5,\n\t\"df\":2,\n\t\"d100\":0.75\n};\n\nexport class DiceColors {\n\n\tstatic loadTextures(sources, callback) {\n\n\t\tlet images = {};\n\t\tlet bumps = {};\n\t\tlet loadedImages = 0;\n\t\n\t\tlet itemprops = Object.entries(sources);\n\t\tlet numImages = itemprops.length*2; //One for texture, one for bump texture\n\t\tfor (const [key, value] of itemprops) {\n\n\t\t\tif(value.source === '') {\n\t\t\t\tloadedImages+=2;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\n\t\t\timages[key] = new Image();\n\t\t\timages[key].crossOrigin = \"Anonymous\";\n\t\t\timages[key].onload = function() {\n\t\n\t\t\t\tif (++loadedImages >= numImages) {\n\t\t\t\t\tDiceColors.diceTextures = mergeObject(images, DiceColors.diceTextures || {},{performDeletions:true});\n\t\t\t\t\tDiceColors.diceBumps = mergeObject(bumps, DiceColors.diceBumps || {},{performDeletions:true});\n\t\t\t\t\tcallback(images);\n\t\t\t\t}\n\t\t\t};\n\t\t\timages[key].src = value.source;\n\n\t\t\tif(value.bump === '') {\n\t\t\t\t++loadedImages;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tbumps[key] = new Image();\n\t\t\tbumps[key].crossOrigin = \"Anonymous\";\n\t\t\tbumps[key].onload = function() {\n\t\n\t\t\t\tif (++loadedImages >= numImages) {\n\t\t\t\t\tDiceColors.diceTextures = mergeObject(images, DiceColors.diceTextures || {},{performDeletions:true});\n\t\t\t\t\tDiceColors.diceBumps = mergeObject(bumps, DiceColors.diceBumps || {},{performDeletions:true});\n\t\t\t\t\tcallback(images);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tbumps[key].src = value.bump;\n\t\t}\n\t}\n\t\n\tstatic getTexture(texturename) {\n\t\n\t\tif (Array.isArray(texturename)) {\n\t\n\t\t\tlet textures = [];\n\t\t\tfor(let i = 0, l = texturename.length; i < l; i++){\n\t\t\t\tif (typeof texturename[i] == 'string' || Array.isArray(texturename[i])) {\n\t\t\t\t\ttextures.push(this.getTexture(texturename[i]));\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn textures;\n\t\t}\n\t\n\t\tif (!texturename || texturename == '') {\n\t\t\treturn {name:'',texture:'',material:\"plastic\"};\n\t\t}\n\t\n\t\tif (texturename == 'none') {\n\t\t\treturn {name:'none',texture:'',material:\"plastic\"};\n\t\t}\n\t\n\t\tif(texturename == 'random') {\n\t\t\tlet names = Object.keys(DiceColors.diceTextures);\n\t\t\t// add 'none' for possibility of no texture\n\t\t\tnames.pop(); //remove 'random' from this list\n\t\n\t\t\treturn this.getTexture(names[Math.floor(Math.random() * names.length)]);\n\t\t}\n\t\t//Init not done yet, let the init load the texture\n\t\tif(!DiceColors.diceTextures)\n\t\t\treturn texturename;\n\t\tif (DiceColors.diceTextures[texturename] != null) {\n\t\t\tif(!TEXTURELIST[texturename].material)\n\t\t\t\tTEXTURELIST[texturename].material = \"plastic\";\n\t\t\tif(!DiceColors.diceBumps[texturename])\n\t\t\t\tDiceColors.diceBumps[texturename] = '';\n\t\t\treturn { name: texturename, bump: DiceColors.diceBumps[texturename], material: TEXTURELIST[texturename].material, texture: DiceColors.diceTextures[texturename], composite: TEXTURELIST[texturename].composite };\n\t\t}\n\t\treturn {name:'',texture:''};\n\t}\n\t\n\tstatic randomColor() {\n\t\t// random colors\n\t\tlet rgb=[];\n\t\trgb[0] = Math.floor(Math.random() * 254);\n\t\trgb[1] = Math.floor(Math.random() * 254);\n\t\trgb[2] = Math.floor(Math.random() * 254);\n\t\n\t\t// this is an attempt to make the foregroudn color stand out from the background color\n\t\t// it sometimes produces ok results\n\t\tlet brightness = ((parseInt(rgb[0]) * 299) + (parseInt(rgb[1]) * 587) + (parseInt(rgb[2]) * 114)) / 1000;\n\t\tlet foreground = (brightness > 126) ? 'rgb(30,30,30)' : 'rgb(230,230,230)'; // high brightness = dark text, else bright text\n\t\tlet background = 'rgb(' + rgb[0] + ',' + rgb[1] + ',' + rgb[2] + ')';\n\t\n\t\treturn {background: background, foreground: foreground };\n\t}\n\t\n\tstatic initColorSets(entries = null) {\n\t\tlet sets;\n\t\tif(entries)\n\t\t{\n\t\t\tlet uniqueSet = {};\n\t\t\tuniqueSet[entries.name] = entries;\n\t\t\tsets = Object.entries(uniqueSet);\n\t\t}\n\t\telse\n\t\t\tsets = Object.entries(COLORSETS);\n\t\tfor (const [name, data] of sets) {\n\t\t\tCOLORSETS[name].id = name;\n\t\t\tif(data.texture != \"custom\")\n\t\t\t\tCOLORSETS[name].texture = this.getTexture(data.texture);\n\t\t\tif(typeof COLORSETS[name].texture == \"object\")\n\t\t\t\tCOLORSETS[name].texture.id = data.texture;\n\t\t\tif(!COLORSETS[name].material)\n\t\t\t\tCOLORSETS[name].material = '';\n\t\t\tif(!COLORSETS[name].font)\n\t\t\t\tCOLORSETS[name].font = 'Arial';\n\t\t\tif(!COLORSETS[name].fontScale)\n\t\t\t\tCOLORSETS[name].fontScale = DICE_SCALE;\n\t\t\telse\n\t\t\t\tCOLORSETS[name].fontScale = mergeObject(DICE_SCALE,COLORSETS[name].fontScale,{inplace:false,performDeletions:true});\n\t\t\tif(!COLORSETS[name].visibility)\n\t\t\t\tCOLORSETS[name].visibility = \"visible\";\n\t\t}\n\t\t\n\t\t// generate the colors and textures for the random set\n\t\tif(!entries)\n\t\t{\n\t\t\tfor (let i = 0; i < 10; i++) {\n\t\t\t\tlet randcolor = this.randomColor();\n\t\t\t\tlet randtex = this.getTexture('random');\n\t\t\n\t\t\t\tif (randtex.name != '') {\n\t\t\t\t\tCOLORSETS['random'].foreground.push(randcolor.foreground); \n\t\t\t\t\tCOLORSETS['random'].background.push(randcolor.background);\n\t\t\t\t\tCOLORSETS['random'].outline.push(randcolor.background);\n\t\t\t\t\tCOLORSETS['random'].texture.push(randtex);\n\t\t\t\t} else {\n\t\t\t\t\tCOLORSETS['random'].foreground.push(randcolor.foreground); \n\t\t\t\t\tCOLORSETS['random'].background.push(randcolor.background);\n\t\t\t\t\tCOLORSETS['random'].outline.push('black');\n\t\t\t\t\tCOLORSETS['random'].texture.push('');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tstatic getColorSet(colorsetname) {\n\t\tlet colorset = COLORSETS[colorsetname] || COLORSETS['custom'];\n\t\treturn {...colorset};\n\t}\n\n\tstatic setColorCustom(foreground = '#FFFFFF', background = '#000000', outline = '#FFFFFF', edge = '#FFFFFF'){\n\t\tCOLORSETS['custom'].foreground = foreground;\n\t\tCOLORSETS['custom'].background = background;\n\t\tCOLORSETS['custom'].outline = outline;\n\t\tCOLORSETS['custom'].edge = edge;\n\t}\n}\n","export const DICE_MODELS = {\n \"d2\": {\n \"metadata\": {\n \"version\": 4.5,\n \"type\": \"BufferGeometry\",\n \"generator\": \"BufferGeometry.toJSON\"\n },\n \"uuid\": \"29D8FA3F-1F04-4F5A-985B-16353BAB0B2C\",\n \"type\": \"BufferGeometry\",\n \"data\": {\n \"attributes\": {\n \"position\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [88.93379974365234,0.0001336209534201771,-4.532903671264648,88.93379974365234,0.0001336209534201771,-4.532903671264648,88.93379974365234,0.0001336209534201771,-4.532903671264648,90.8361587524414,-0.00006830116763012484,-2.6535863876342773,90.8361587524414,-0.00006830116763012484,-2.6535863876342773,84.580078125,-27.482694625854492,4.547501087188721,84.580078125,-27.482694625854492,4.547501087188721,86.38970947265625,-28.07042121887207,2.668496608734131,27.482057571411133,-84.58028411865234,-4.547504901885986,27.482057571411133,-84.58028411865234,-4.547504901885986,28.06978416442871,-86.38990783691406,-2.6685009002685547,27.481149673461914,-84.58119201660156,4.536083698272705,27.481149673461914,-84.58119201660156,4.536083698272705,28.069250106811523,-86.39043426513672,2.6568350791931152,-0.0007737207342870533,-88.93378448486328,4.532901287078857,-0.0007737207342870533,-88.93378448486328,4.532901287078857,-0.0007737207342870533,-88.93378448486328,4.532901287078857,-0.0005998046253807843,-90.83614349365234,2.6535849571228027,-0.0005998046253807843,-90.83614349365234,2.6535849571228027,-27.482694625854492,-84.58097839355469,4.5305891036987305,-27.482694625854492,-84.58097839355469,4.5305891036987305,-28.07042121887207,-86.39022827148438,2.6512229442596436,-84.58029174804688,-27.481143951416016,-4.552997589111328,-84.58029174804688,-27.481143951416016,-4.552997589111328,-86.3899154663086,-28.06924819946289,-2.6741106510162354,-88.93379974365234,-0.0001336209534201771,4.532903671264648,-88.93379974365234,-0.0001336209534201771,4.532903671264648,-88.93379974365234,-0.0001336209534201771,4.532903671264648,-90.8361587524414,0.00006830116763012484,2.6535863876342773,-90.8361587524414,0.00006830116763012484,2.6535863876342773,-71.94794464111328,52.27442169189453,-4.543759822845459,-71.94794464111328,52.27442169189453,-4.543759822845459,-73.4873275756836,53.39253234863281,-2.664675235748291,-71.9488525390625,52.27351379394531,4.539828777313232,-71.9488525390625,52.27351379394531,4.539828777313232,-73.48785400390625,53.391998291015625,2.6606605052948,-52.27299499511719,71.94922637939453,-4.539824962615967,-52.27299499511719,71.94922637939453,-4.539824962615967,-53.39146423339844,73.48823547363281,-2.660656213760376,-27.482057571411133,84.58028411865234,4.547504901885986,-27.482057571411133,84.58028411865234,4.547504901885986,-28.06978416442871,86.38990783691406,2.6685009002685547,0.0007736866245977581,88.93378448486328,-4.532901287078857,0.0007736866245977581,88.93378448486328,-4.532901287078857,0.0007736866245977581,88.93378448486328,-4.532901287078857,0.0005998046253807843,90.83614349365234,-2.6535849571228027,0.0005998046253807843,90.83614349365234,-2.6535849571228027,-0.00013426830992102623,88.93287658691406,4.550687789916992,-0.00013426830992102623,88.93287658691406,4.550687789916992,-0.00013426830992102623,88.93287658691406,4.550687789916992,0.00006751317414455116,90.83562469482422,2.6717519760131836,0.00006751317414455116,90.83562469482422,2.6717519760131836,27.482694625854492,84.58097839355469,-4.5305891036987305,27.482694625854492,84.58097839355469,-4.5305891036987305,28.07042121887207,86.39022827148438,-2.6512229442596436,84.5811996459961,27.482053756713867,-4.530590534210205,84.5811996459961,27.482053756713867,-4.530590534210205,86.39044189453125,28.069782257080078,-2.651224374771118,84.58098602294922,-27.48178482055664,-4.5360870361328125,84.58098602294922,-27.48178482055664,-4.5360870361328125,86.3902359008789,-28.069887161254883,-2.6568384170532227,73.48785400390625,-53.391998291015625,-2.6606605052948,71.9488525390625,-52.27351379394531,-4.539828777313232,71.9488525390625,-52.27351379394531,-4.539828777313232,52.273902893066406,-71.94831848144531,-4.543763637542725,52.273902893066406,-71.94831848144531,-4.543763637542725,53.39199447631836,-73.48770904541016,-2.6646788120269775,0.00013430237595457584,-88.93287658691406,-4.550687789916992,0.00013430237595457584,-88.93287658691406,-4.550687789916992,0.00013430237595457584,-88.93287658691406,-4.550687789916992,-0.00006751317414455116,-90.83562469482422,-2.6717519760131836,-0.00006751317414455116,-90.83562469482422,-2.6717519760131836,-28.069887161254883,-86.38970184326172,-2.6741127967834473,-27.48178482055664,-84.58007049560547,-4.552999496459961,-27.48178482055664,-84.58007049560547,-4.552999496459961,-52.27351760864258,-71.94794464111328,-4.5542144775390625,-52.27351760864258,-71.94794464111328,-4.5542144775390625,-53.39200210571289,-73.4873275756836,-2.67535400390625,-71.94832611083984,-52.27299118041992,-4.554214000701904,-71.94832611083984,-52.27299118041992,-4.554214000701904,-73.48771667480469,-53.391456604003906,-2.675353527069092,-88.93289947509766,0.0007747426279820502,-4.550684928894043,-88.93289947509766,0.0007747426279820502,-4.550684928894043,-88.93289947509766,0.0007747426279820502,-4.550684928894043,-90.83563995361328,0.000600832630880177,-2.671748399734497,-90.83563995361328,0.000600832630880177,-2.671748399734497,-84.580078125,27.482694625854492,-4.547501087188721,-84.580078125,27.482694625854492,-4.547501087188721,-86.38970947265625,28.07042121887207,-2.668496608734131,-27.481149673461914,84.58119201660156,-4.536083698272705,-27.481149673461914,84.58119201660156,-4.536083698272705,-28.069250106811523,86.39043426513672,-2.6568350791931152,52.2744255065918,71.94884490966797,-4.529373645782471,52.2744255065918,71.94884490966797,-4.529373645782471,53.39253616333008,73.48784637451172,-2.649981737136841,71.94922637939453,52.273895263671875,-4.529374599456787,71.94922637939453,52.273895263671875,-4.529374599456787,73.48823547363281,53.391990661621094,-2.649982452392578,88.93289947509766,-0.0007747426279820502,4.550684928894043,88.93289947509766,-0.0007747426279820502,4.550684928894043,88.93289947509766,-0.0007747426279820502,4.550684928894043,90.83563995361328,-0.000600832630880177,2.671748399734497,90.83563995361328,-0.000600832630880177,2.671748399734497,71.94794464111328,-52.27442169189453,4.543759346008301,71.94794464111328,-52.27442169189453,4.543759346008301,73.4873275756836,-53.39253234863281,2.664675235748291,52.27299499511719,-71.94922637939453,4.539824962615967,52.27299499511719,-71.94922637939453,4.539824962615967,53.39146423339844,-73.48823547363281,2.660656213760376,-52.2744255065918,-71.94884490966797,4.529373645782471,-52.2744255065918,-71.94884490966797,4.529373645782471,-53.39253616333008,-73.48784637451172,2.649981737136841,-73.48823547363281,-53.391990661621094,2.649982452392578,-71.94922637939453,-52.273895263671875,4.529374599456787,-71.94922637939453,-52.273895263671875,4.529374599456787,-84.5811996459961,-27.482053756713867,4.530590534210205,-84.5811996459961,-27.482053756713867,4.530590534210205,-86.39044189453125,-28.069782257080078,2.651224374771118,-84.58098602294922,27.48178482055664,4.5360870361328125,-84.58098602294922,27.48178482055664,4.5360870361328125,-86.3902359008789,28.069887161254883,2.6568384170532227,-52.273902893066406,71.94831848144531,4.543763637542725,-52.273902893066406,71.94831848144531,4.543763637542725,-53.39199447631836,73.48770904541016,2.6646788120269775,27.48178482055664,84.58007049560547,4.552999496459961,27.48178482055664,84.58007049560547,4.552999496459961,28.069887161254883,86.38970184326172,2.6741127967834473,52.27351760864258,71.94794464111328,4.5542144775390625,52.27351760864258,71.94794464111328,4.5542144775390625,53.39200210571289,73.4873275756836,2.67535400390625,73.48771667480469,53.391456604003906,2.675353527069092,71.94832611083984,52.27299118041992,4.554214000701904,71.94832611083984,52.27299118041992,4.554214000701904,84.58029174804688,27.481143951416016,4.552997589111328,84.58029174804688,27.481143951416016,4.552997589111328,86.3899154663086,28.06924819946289,2.6741106510162354],\n \"normalized\": false\n },\n \"normal\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [0.004305333364754915,0.00014043168630450964,-0.9999908208847046,0.004305333364754915,0.00014043168630450964,-0.9999908208847046,0.004305333364754915,0.00014043168630450964,-0.9999908208847046,0.967370867729187,0.000023871660232543945,-0.2533644437789917,0.967370867729187,0.000023871660232543945,-0.2533644437789917,0.003924518823623657,-0.0014061331748962402,0.9999912977218628,0.003924518823623657,-0.0014061331748962402,0.9999912977218628,0.919967532157898,-0.2989548146724701,0.25354647636413574,0.0014187097549438477,-0.003943443298339844,-0.9999911785125732,0.0014187097549438477,-0.003943443298339844,-0.9999911785125732,0.2989460825920105,-0.9199705719947815,-0.2535456418991089,0.001207306981086731,-0.004139244556427002,0.999990701675415,0.001207306981086731,-0.004139244556427002,0.999990701675415,0.29889336228370667,-0.9200217723846436,0.25342196226119995,-0.00010144524276256561,-0.004305422306060791,0.9999908208847046,-0.00010144524276256561,-0.004305422306060791,0.9999908208847046,-0.00010144524276256561,-0.004305422306060791,0.9999908208847046,-0.00002811197191476822,-0.9673709869384766,0.25336405634880066,-0.00002811197191476822,-0.9673709869384766,0.25336405634880066,-0.0013865083456039429,-0.0041558146476745605,0.9999904036521912,-0.0013865083456039429,-0.0041558146476745605,0.9999904036521912,-0.29895341396331787,-0.9200186133384705,0.25336307287216187,-0.003935068845748901,-0.0012163519859313965,-0.9999915361404419,-0.003935068845748901,-0.0012163519859313965,-0.9999915361404419,-0.9199703335762024,-0.2988958954811096,-0.25360578298568726,-0.00432974100112915,-0.00013017654418945312,0.9999905824661255,-0.00432974100112915,-0.00013017654418945312,0.9999905824661255,-0.00432974100112915,-0.00013017654418945312,0.9999905824661255,-0.967370867729187,-0.000022581778466701508,0.2533644139766693,-0.967370867729187,-0.000022581778466701508,0.2533644139766693,-0.003362357383593917,0.002567464951425791,-0.9999910593032837,-0.003362357383593917,0.002567464951425791,-0.9999910593032837,-0.7825664281845093,0.5686163306236267,-0.253506064414978,-0.0035184919834136963,0.0023897886276245117,0.9999909996986389,-0.0035184919834136963,0.0023897886276245117,0.9999909996986389,-0.7826218605041504,0.5685698390007019,0.25343894958496094,-0.002216615015640855,0.0036201775074005127,-0.9999910593032837,-0.002216615015640855,0.0036201775074005127,-0.9999910593032837,-0.5685653686523438,0.782625675201416,-0.25343722105026245,-0.0013963840901851654,0.0039055049419403076,0.9999913573265076,-0.0013963840901851654,0.0039055049419403076,0.9999913573265076,-0.2989453971385956,0.9199708104133606,0.2535455524921417,0.00011461973190307617,0.004342749714851379,-0.9999904632568359,0.00011461973190307617,0.004342749714851379,-0.9999904632568359,0.00011461973190307617,0.004342749714851379,-0.9999904632568359,0.000028920238037244417,0.9673709273338318,-0.25336408615112305,0.000028920238037244417,0.9673709273338318,-0.25336408615112305,-0.00009849853813648224,0.0041036903858184814,0.9999915957450867,-0.00009849853813648224,0.0041036903858184814,0.9999915957450867,-0.00009849853813648224,0.0041036903858184814,0.9999915957450867,-0.00001982133835554123,0.967315137386322,0.2535773515701294,-0.00001982133835554123,0.967315137386322,0.2535773515701294,0.001379296649247408,0.004155764821916819,-0.9999904632568359,0.001379296649247408,0.004155764821916819,-0.9999904632568359,0.2989526391029358,0.9200189113616943,-0.25336307287216187,0.004105646628886461,0.0014420022489503026,-0.9999905824661255,0.004105646628886461,0.0014420022489503026,-0.9999905824661255,0.9200265407562256,0.29895055294036865,-0.25333744287490845,0.0041483743116259575,-0.001177109545096755,-0.999990701675415,0.0041483743116259575,-0.001177109545096755,-0.999990701675415,0.92001873254776,-0.29890236258506775,-0.2534225881099701,0.7826225161552429,-0.5685691237449646,-0.2534385919570923,0.0034059027675539255,-0.002543120877817273,-0.9999909400939941,0.0034059027675539255,-0.002543120877817273,-0.9999909400939941,0.0025934576988220215,-0.0033233165740966797,-0.9999910593032837,0.0025934576988220215,-0.0033233165740966797,-0.9999910593032837,0.5686105489730835,-0.7825710773468018,-0.2535049617290497,0.00014024082338437438,-0.004108965862542391,-0.9999915361404419,0.00014024082338437438,-0.004108965862542391,-0.9999915361404419,0.00014024082338437438,-0.004108965862542391,-0.9999915361404419,0.000021778512746095657,-0.9673150777816772,-0.253577321767807,0.000021778512746095657,-0.9673150777816772,-0.253577321767807,-0.29890191555023193,-0.9199681878089905,-0.2536064684391022,-0.001328025944530964,-0.003906830679625273,-0.9999914765357971,-0.001328025944530964,-0.003906830679625273,-0.9999914765357971,-0.0024206042289733887,-0.0033184662461280823,-0.9999915361404419,-0.0024206042289733887,-0.0033184662461280823,-0.9999915361404419,-0.56856769323349,-0.7825732231140137,-0.25359416007995605,-0.0033223330974578857,-0.002392679452896118,-0.9999916553497314,-0.0033223330974578857,-0.002392679452896118,-0.9999916553497314,-0.7825719118118286,-0.5685604810714722,-0.25361454486846924,-0.004138410557061434,0.00005978979606879875,-0.9999914169311523,-0.004138410557061434,0.00005978979606879875,-0.9999914169311523,-0.004138410557061434,0.00005978979606879875,-0.9999914169311523,-0.9673154950141907,0.00002910134026024025,-0.25357601046562195,-0.9673154950141907,0.00002910134026024025,-0.25357601046562195,-0.003914192318916321,0.0014359354972839355,-0.9999912977218628,-0.003914192318916321,0.0014359354972839355,-0.9999912977218628,-0.9199680089950562,0.29895293712615967,-0.2535468339920044,-0.001218944787979126,0.004143953323364258,-0.9999906420707703,-0.001218944787979126,0.004143953323364258,-0.9999906420707703,-0.2988971769809723,0.920020580291748,-0.25342193245887756,0.002553605241701007,0.003544599749147892,-0.9999905228614807,0.002553605241701007,0.003544599749147892,-0.9999905228614807,0.5686197876930237,0.7826223373413086,-0.25332552194595337,0.0034990310668945312,0.0025759339332580566,-0.9999905824661255,0.0034990310668945312,0.0025759339332580566,-0.9999905824661255,0.7826220393180847,0.5686109662055969,-0.25334614515304565,0.004121424164623022,0.00009648066043155268,0.9999914169311523,0.004121424164623022,0.00009648066043155268,0.9999914169311523,0.004121424164623022,0.00009648066043155268,0.9999914169311523,0.9673154950141907,-0.00002708425745368004,0.2535760700702667,0.9673154950141907,-0.00002708425745368004,0.2535760700702667,0.0033468306064605713,-0.002586185932159424,0.9999910593032837,0.0033468306064605713,-0.002586185932159424,0.9999910593032837,0.7825667858123779,-0.5686154365539551,0.25350672006607056,0.002382144331932068,-0.003524601459503174,0.9999909996986389,0.002382144331932068,-0.003524601459503174,0.9999909996986389,0.5685621500015259,-0.7826279401779175,0.2534373998641968,-0.0025890469551086426,-0.003517657518386841,0.9999905228614807,-0.0025890469551086426,-0.003517657518386841,0.9999905228614807,-0.5686206817626953,-0.7826217412948608,0.253325492143631,-0.7826230525970459,-0.5686094760894775,0.25334617495536804,-0.003505319356918335,-0.002576306462287903,0.9999906420707703,-0.003505319356918335,-0.002576306462287903,0.9999906420707703,-0.0041239261627197266,-0.001402430236339569,0.9999905228614807,-0.0041239261627197266,-0.001402430236339569,0.9999905228614807,-0.9200277328491211,-0.29894667863845825,0.2533373534679413,-0.0041457414627075195,0.0012131333351135254,0.999990701675415,-0.0041457414627075195,0.0012131333351135254,0.999990701675415,-0.9200185537338257,0.29890307784080505,0.2534220814704895,-0.0025840699672698975,0.003327280282974243,0.9999911785125732,-0.0025840699672698975,0.003327280282974243,0.9999911785125732,-0.5686099529266357,0.7825716137886047,0.2535049021244049,0.0012101978063583374,0.003936886787414551,0.9999915361404419,0.0012101978063583374,0.003936886787414551,0.9999915361404419,0.2989037334918976,0.9199675917625427,0.2536064088344574,0.0023893117904663086,0.003317922353744507,0.9999916553497314,0.0023893117904663086,0.003317922353744507,0.9999916553497314,0.5685685873031616,0.7825725674629211,0.2535940706729889,0.782572329044342,0.5685595870018005,0.25361499190330505,0.0033287405967712402,0.002385169267654419,0.9999915361404419,0.0033287405967712402,0.002385169267654419,0.9999915361404419,0.003944873809814453,0.0012125223875045776,0.9999915957450867,0.003944873809814453,0.0012125223875045776,0.9999915957450867,0.9199705719947815,0.298895001411438,0.25360581278800964],\n \"normalized\": false\n },\n \"uv\": {\n \"itemSize\": 2,\n \"type\": \"Float32Array\",\n \"array\": [0.23704378306865692,0.023000359535217285,0.2962978482246399,0.4792518615722656,0.5050051212310791,0.2502303123474121,0.22790862619876862,0.021942079067230225,0.2874794006347656,0.4803285002708435,0.017633967101573944,0.6739451289176941,0.20161525905132294,0.1155695915222168,0.21026334166526794,0.11554199457168579,0.23612302541732788,0.3868170976638794,0.6741329431533813,0.48301517963409424,0.22747491300106049,0.3868447542190552,0.17478206753730774,0.5167970061302185,0.2012992650270462,0.3867114782333374,0.2101074755191803,0.38673484325408936,0.17778971791267395,0.4792518615722656,0.20069445669651031,0.47938668727874756,0.2504180371761322,0.5048181414604187,0.16897115111351013,0.4803285002708435,0.20982962846755981,0.4804449677467346,0.17686891555786133,0.38681697845458984,0.3260548710823059,0.5167969465255737,0.16822080314159393,0.3868447542190552,0.1423611342906952,0.11557012796401978,0.9825537800788879,0.32586705684661865,0.1510092318058014,0.11554241180419922,0.17778971791267395,0.02300053834915161,0.3555530905723572,0.4792248010635376,0.4951818287372589,0.7495819330215454,0.16865456104278564,0.021942198276519775,0.34673523902893066,0.480310320854187,0.3197054862976074,0.29629039764404297,0.9477878212928772,0.1063617467880249,0.32840070128440857,0.2962949275970459,0.35455501079559326,0.2964339256286621,0.4484367072582245,0.8934502601623535,0.34586313366889954,0.29642730951309204,0.31974896788597107,0.20592015981674194,0.8936383128166199,0.0522121787071228,0.32843995094299316,0.20592659711837769,0.32605481147766113,0.9823660254478455,0.3545942008495331,0.11562323570251465,0.34578996896743774,0.1155862808227539,0.2962978482246399,0.023000359535217285,0.3192167282104492,0.023042798042297363,0.7497690320014954,0.0054662227630615234,0.287162721157074,0.021942138671875,0.32804927229881287,0.022000432014465332,0.2504180371761322,0.9943457245826721,0.25994858145713806,0.02313518524169922,0.3555530905723572,0.023087799549102783,0.2687670588493347,0.022058546543121338,0.3464353084564209,0.021996140480041504,0.295693039894104,0.11567586660385132,0.6741330623626709,0.017446041107177734,0.2868848443031311,0.11565232276916504,0.2953770160675049,0.3868170976638794,0.5169848203659058,0.17459428310394287,0.28672900795936584,0.3868447542190552,0.2364388257265091,0.11567533016204834,0.5169847011566162,0.32586705684661865,0.22763070464134216,0.11565178632736206,0.2276650071144104,0.20608502626419067,0.23635976016521454,0.20609813928604126,0.5517510175704956,0.39409929513931274,0.23622643947601318,0.2964661121368408,0.6059006452560425,0.44824880361557007,0.22753484547138214,0.2964508533477783,0.1414402574300766,0.47938668727874756,0.23704378306865692,0.4792518615722656,0.7497687339782715,0.49499499797821045,0.15057551860809326,0.4804449677467346,0.2282252460718155,0.4803285002708435,0.15085339546203613,0.38673484325408936,0.14204517006874084,0.38671135902404785,0.8254057765007019,0.48301517963409424,0.14212429523468018,0.29628849029541016,0.893638014793396,0.4482489228248596,0.15081912279129028,0.2963016629219055,0.1422577202320099,0.20592069625854492,0.9477876424789429,0.39409929513931274,0.15094926953315735,0.20593607425689697,0.14144045114517212,0.02313530445098877,0.31920260190963745,0.4793957471847534,0.9945327043533325,0.2502301335334778,0.15025892853736877,0.02205866575241089,0.3283390998840332,0.4804449677467346,0.31971582770347595,0.38671642541885376,0.9825538992881775,0.17459410429000854,0.32852432131767273,0.38673120737075806,0.31976577639579773,0.11558306217193604,0.8254058957099915,0.017445921897888184,0.3284158408641815,0.11556941270828247,0.29561394453048706,0.2060987949371338,0.6059007048606873,0.05221235752105713,0.28691911697387695,0.2060856819152832,0.29548054933547974,0.2964667081832886,0.5517511963844299,0.1063617467880249,0.2867889404296875,0.29645150899887085,0.005654247011989355,0.749582052230835,0.20069456100463867,0.02313518524169922,0.25994864106178284,0.47938668727874756,0.20951306819915771,0.022058427333831787,0.26908373832702637,0.4804449677467346,0.05240018665790558,0.605712890625,0.20151172578334808,0.2059200406074524,0.21020328998565674,0.2059352993965149,0.10654976963996887,0.5515632033348083,0.2013782411813736,0.2962881922721863,0.2100730687379837,0.29630136489868164,0.17697232961654663,0.29646652936935425,0.39428722858428955,0.5515631437301636,0.16828079521656036,0.2964513301849365,0.1684110462665558,0.20608550310134888,0.17710581421852112,0.206098735332489,0.44843676686286926,0.6057127714157104,0.1771848499774933,0.11567568778991699,0.4832030236721039,0.6739450693130493,0.168376624584198,0.11565232276916504,0.3545408844947815,0.38678765296936035,0.4832029938697815,0.8252179622650146,0.3458925485610962,0.3868238925933838,0.35459887981414795,0.20606255531311035,0.3942871689796448,0.9475997686386108,0.34590303897857666,0.2060578465461731,0.17478202283382416,0.9823660254478455,0.2608692944049835,0.11557012796401978,0.2695173919200897,0.11554241180419922,0.10654974728822708,0.9475998282432556,0.26076579093933105,0.20592081546783447,0.2694574296474457,0.20593613386154175,0.2693272829055786,0.29630184173583984,0.05240019038319588,0.8934502601623535,0.2606324851512909,0.2962886691093445,0.0176339503377676,0.8252179622650146,0.26055341958999634,0.3867114782333374,0.2693616449832916,0.38673484325408936],\n \"normalized\": false\n },\n \"color\": {\n \"itemSize\": 4,\n \"type\": \"Uint16Array\",\n \"array\": [65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535],\n \"normalized\": true\n }\n },\n \"index\": {\n \"type\": \"Uint16Array\",\n \"array\": [35,38,32,129,54,126,123,91,38,130,57,97,18,10,13,21,77,72,120,32,88,17,72,70,27,20,103,105,60,7,130,94,129,126,45,50,28,24,117,13,66,108,117,80,112,29,88,85,111,80,77,41,46,91,108,61,105,135,4,57,76,87,44,38,30,32,54,42,45,72,67,70,77,78,75,94,95,92,104,108,105,113,117,112,125,129,126,134,130,132,113,111,109,15,13,12,14,21,17,49,41,40,61,58,60,61,64,62,77,73,72,88,82,85,135,100,102,132,129,128,60,0,3,66,8,64,10,68,8,80,22,78,24,81,22,32,86,88,38,89,36,91,43,89,94,52,54,57,95,97,57,1,55,6,105,7,19,111,21,26,120,29,12,108,107,48,126,50,25,117,115,118,35,120,40,123,121,99,7,101,121,35,33,7,3,101,35,123,38,129,94,54,123,41,91,130,135,57,18,71,10,21,111,77,120,35,32,17,21,72,103,5,131,5,98,131,98,133,131,131,127,124,124,47,131,47,39,131,39,122,27,122,34,27,34,119,27,27,116,114,114,110,20,20,16,103,16,11,103,11,106,103,27,114,20,103,131,39,39,27,103,105,61,60,130,97,94,126,54,45,28,84,24,13,10,66,117,24,80,29,120,88,111,112,80,41,51,46,108,66,61,135,102,4,56,2,65,2,59,65,59,63,65,65,9,69,69,74,76,76,79,87,79,23,87,23,83,87,87,31,37,37,90,44,44,53,93,93,96,44,96,56,44,65,69,76,87,37,44,56,65,44,65,76,44,38,36,30,54,52,42,72,73,67,77,80,78,94,97,95,104,107,108,113,115,117,125,128,129,134,135,130,113,112,111,15,18,13,14,19,21,49,51,41,61,62,58,61,66,64,77,75,73,88,86,82,135,134,100,132,130,129,60,58,0,66,10,8,10,71,68,80,24,22,24,84,81,32,30,86,38,91,89,91,46,43,94,92,52,57,55,95,57,4,1,6,104,105,19,109,111,26,118,120,12,13,108,48,125,126,25,28,117,118,33,35,40,41,123,99,6,7,121,123,35,7,60,3]\n },\n \"boundingSphere\": {\n \"center\": [0,0,0],\n \"radius\": 128.54241934554352\n }\n },\n faceValues: [0, 0, 0, 0, 0, 0, 0, 0, 2, 1],\n rotationCombinations: {\n \"1,2\": [180, 0, 0]\n }\n },\n \"d4\": {\n \"metadata\": {\n \"version\": 4.5,\n \"type\": \"BufferGeometry\",\n \"generator\": \"BufferGeometry.toJSON\"\n },\n \"uuid\": \"C5380F7D-1CC8-4744-8B30-2399F5490F2A\",\n \"type\": \"BufferGeometry\",\n \"data\": {\n \"attributes\": {\n \"position\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-67.64075469970703, -67.64099884033203, 65.7880630493164, -67.64075469970703, -67.64099884033203, 65.7880630493164, -67.64075469970703, -67.64099884033203, 65.7880630493164, 67.64124298095703, 65.7878189086914, 67.6407470703125, 67.64124298095703, 65.7878189086914, 67.6407470703125, 67.64124298095703, 65.7878189086914, 67.6407470703125, 65.7880630493164, 67.64099884033203, 67.64075469970703, 65.7880630493164, 67.64099884033203, 67.64075469970703, -67.6412353515625, 67.64099884033203, -65.78756713867188, -67.6412353515625, 67.64099884033203, -65.78756713867188, -67.6407470703125, -65.7878189086914, 67.64124298095703, -67.6407470703125, -65.7878189086914, 67.64124298095703, 67.6412353515625, 67.64099884033203, 65.78756713867188, 67.6412353515625, 67.64099884033203, 65.78756713867188, 67.6412353515625, 67.64099884033203, 65.78756713867188, 67.64075469970703, -67.64099884033203, -65.7880630493164, 67.64075469970703, -67.64099884033203, -65.7880630493164, 67.6407470703125, -65.7878189086914, -67.64124298095703, 67.6407470703125, -65.7878189086914, -67.64124298095703, 65.78756713867188, -67.64099884033203, -67.6412353515625, 65.78756713867188, -67.64099884033203, -67.6412353515625, -65.78756713867188, -67.64099884033203, 67.6412353515625, -65.78756713867188, -67.64099884033203, 67.6412353515625, -65.78756713867188, -67.64099884033203, 67.6412353515625, -65.7880630493164, 67.64099884033203, -67.64075469970703, -65.7880630493164, 67.64099884033203, -67.64075469970703, -65.7880630493164, 67.64099884033203, -67.64075469970703, -67.64124298095703, 65.7878189086914, -67.6407470703125, -67.64124298095703, 65.7878189086914, -67.6407470703125, -67.64124298095703, 65.7878189086914, -67.6407470703125],\n \"normalized\": false\n },\n \"normal\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-0.5875354409217834, -0.5875733494758606, -0.5563808679580688, -0.5875354409217834, -0.5875733494758606, -0.5563808679580688, -0.5875354409217834, -0.5875733494758606, -0.5563808679580688, 0.58754962682724, -0.5564354062080383, 0.5875076055526733, 0.58754962682724, -0.5564354062080383, 0.5875076055526733, 0.58754962682724, -0.5564354062080383, 0.5875076055526733, -0.5564345121383667, 0.5875091552734375, 0.5875489711761475, -0.5564345121383667, 0.5875091552734375, 0.5875489711761475, -0.5875074863433838, 0.5875474810600281, 0.5564377903938293, -0.5875074863433838, 0.5875474810600281, 0.5564377903938293, -0.5875458717346191, 0.5564350485801697, 0.5875116586685181, -0.5875458717346191, 0.5564350485801697, 0.5875116586685181, 0.5875073075294495, 0.5875475406646729, -0.5564377903938293, 0.5875073075294495, 0.5875475406646729, -0.5564377903938293, 0.5875073075294495, 0.5875475406646729, -0.5564377903938293, 0.5875356793403625, -0.5875731706619263, 0.5563808679580688, 0.5875356793403625, -0.5875731706619263, 0.5563808679580688, 0.5875458717346191, 0.5564350485801697, -0.5875116586685181, 0.5875458717346191, 0.5564350485801697, -0.5875116586685181, -0.5564398169517517, -0.5875092148780823, -0.5875437259674072, -0.5564398169517517, -0.5875092148780823, -0.5875437259674072, 0.5564400553703308, -0.5875090956687927, 0.5875436663627625, 0.5564400553703308, -0.5875090956687927, 0.5875436663627625, 0.5564400553703308, -0.5875090956687927, 0.5875436663627625, 0.5564344525337219, 0.587509036064148, -0.587549090385437, 0.5564344525337219, 0.587509036064148, -0.587549090385437, 0.5564344525337219, 0.587509036064148, -0.587549090385437, -0.5875496864318848, -0.5564355850219727, -0.5875071883201599, -0.5875496864318848, -0.5564355850219727, -0.5875071883201599, -0.5875496864318848, -0.5564355850219727, -0.5875071883201599],\n \"normalized\": false\n },\n \"uv\": {\n \"itemSize\": 2,\n \"type\": \"Float32Array\",\n \"array\": [0.20333926379680634, 0.01598501205444336, 0.20718662440776825, 0.23812401294708252, 0.5022410154342651, 0.21281301975250244, 0.20517542958259583, 0.22700607776641846, 0.21218715608119965, 0.009441137313842773, 0.6251919865608215, 0.25002896785736084, 0.12502600252628326, 0.24997997283935547, 0.2080860435962677, 0.01124197244644165, 0.0021929999347776175, 0.4627319574356079, 0.015251883305609226, 0.12210333347320557, 0.2076776623725891, 0.23367196321487427, 0.24785800278186798, 0.4627319574356079, 0.20334681868553162, 0.22807049751281738, 0.20728397369384766, 0.00649791955947876, 0.49776899814605713, 0.46269500255584717, 0.14456242322921753, 0.12202131748199463, 0.7480239868164062, 0.46278202533721924, 0.14273378252983093, 0.12308567762374878, 0.3749360144138336, 0.24994301795959473, 0.14272625744342804, 0.12096989154815674, 0.625074028968811, 0.00006097555160522461, 0.20517542958259583, 0.0170363187789917, 0.21218715608119965, 0.23534929752349854, 0.5023589730262756, 0.46278202533721924, 0.011641831137239933, 0.11945211887359619, 0.021507836878299713, 0.12308526039123535, 0.2521030008792877, 0.46269500255584717, 0.011544500477612019, 0.12516993284225464, 0.021500281989574432, 0.12096947431564331, 0.7479060292243958, 0.21281301975250244],\n \"normalized\": false\n },\n \"color\": {\n \"itemSize\": 4,\n \"type\": \"Uint16Array\",\n \"array\": [65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535],\n \"normalized\": true\n }\n },\n \"index\": {\n \"type\": \"Uint16Array\",\n \"array\": [6, 8, 11, 26, 14, 18, 29, 20, 2, 5, 23, 16, 17, 3, 15, 25, 19, 28, 10, 27, 1, 0, 15, 21, 9, 13, 24, 9, 24, 27, 7, 4, 13, 10, 1, 22, 17, 15, 19, 7, 22, 4, 17, 12, 3, 25, 17, 19, 10, 9, 27, 0, 19, 15, 9, 7, 13, 7, 10, 22]\n },\n \"boundingSphere\": {\n \"center\": [0, 0, 0],\n \"radius\": 117.1579285756433\n }\n },\n faceValues: [2, 4, 3, 1],\n rotationCombinations: {\n \"1,2\": [90, 0, 90],\n \"1,3\": [120, 90, 150],\n \"1,4\": [-180, 0, -180],\n \"2,3\": [90, 0, 90],\n \"2,4\": [-90, 0, -90],\n \"3,4\": [-90, 0, 90]\n }\n },\n \"d6\": {\n \"metadata\": {\n \"version\": 4.5,\n \"type\": \"BufferGeometry\",\n \"generator\": \"BufferGeometry.toJSON\"\n },\n \"uuid\": \"E18C9F5C-7D15-4FF3-AC5E-A4A56A405499\",\n \"type\": \"BufferGeometry\",\n \"data\": {\n \"attributes\": {\n \"position\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [52.081398010253906, -49.99797058105469, 49.997779846191406, 52.081398010253906, -49.99797058105469, 49.997779846191406, 52.081398010253906, -49.99797058105469, 49.997779846191406, 52.081398010253906, -49.99797058105469, 49.997779846191406, 52.081031799316406, 49.99797058105469, -49.99816131591797, 52.081031799316406, 49.99797058105469, -49.99816131591797, 52.081031799316406, 49.99797058105469, -49.99816131591797, 52.081031799316406, 49.99797058105469, -49.99816131591797, 52.081398010253906, 49.99797058105469, 49.997779846191406, 52.081398010253906, 49.99797058105469, 49.997779846191406, 52.081398010253906, 49.99797058105469, 49.997779846191406, 52.081398010253906, 49.99797058105469, 49.997779846191406, -52.081031799316406, 49.99797058105469, 49.99816131591797, -52.081031799316406, 49.99797058105469, 49.99816131591797, -52.081031799316406, 49.99797058105469, 49.99816131591797, -52.081031799316406, 49.99797058105469, 49.99816131591797, 49.99778747558594, 52.081214904785156, -49.99814987182617, 49.99778747558594, 52.081214904785156, -49.99814987182617, 49.99778747558594, 52.081214904785156, -49.99814987182617, 49.99778747558594, 52.081214904785156, -49.99814987182617, -49.99814987182617, -52.081214904785156, -49.99778747558594, -49.99814987182617, -52.081214904785156, -49.99778747558594, -49.99814987182617, -52.081214904785156, -49.99778747558594, -49.99814987182617, -52.081214904785156, -49.99778747558594, -49.99816131591797, -49.99797058105469, -52.081031799316406, -49.99816131591797, -49.99797058105469, -52.081031799316406, -49.99816131591797, -49.99797058105469, -52.081031799316406, -49.99816131591797, -49.99797058105469, -52.081031799316406, 49.99778747558594, -52.081214904785156, -49.99814987182617, 49.99778747558594, -52.081214904785156, -49.99814987182617, 49.99778747558594, -52.081214904785156, -49.99814987182617, 49.99778747558594, -52.081214904785156, -49.99814987182617, -49.99778747558594, -52.081214904785156, 49.99814987182617, -49.99778747558594, -52.081214904785156, 49.99814987182617, -49.99778747558594, -52.081214904785156, 49.99814987182617, -49.99778747558594, -52.081214904785156, 49.99814987182617, 52.081031799316406, -49.99797058105469, -49.99816131591797, 52.081031799316406, -49.99797058105469, -49.99816131591797, 52.081031799316406, -49.99797058105469, -49.99816131591797, 52.081031799316406, -49.99797058105469, -49.99816131591797, 49.997779846191406, -49.99797058105469, -52.081398010253906, 49.997779846191406, -49.99797058105469, -52.081398010253906, 49.997779846191406, -49.99797058105469, -52.081398010253906, 49.997779846191406, -49.99797058105469, -52.081398010253906, -52.081398010253906, -49.99797058105469, -49.997779846191406, -52.081398010253906, -49.99797058105469, -49.997779846191406, -52.081398010253906, -49.99797058105469, -49.997779846191406, -52.081398010253906, -49.99797058105469, -49.997779846191406, -49.99814987182617, 52.081214904785156, -49.99778747558594, -49.99814987182617, 52.081214904785156, -49.99778747558594, -49.99814987182617, 52.081214904785156, -49.99778747558594, -49.99814987182617, 52.081214904785156, -49.99778747558594, 49.99814987182617, 52.081214904785156, 49.99778747558594, 49.99814987182617, 52.081214904785156, 49.99778747558594, 49.99814987182617, 52.081214904785156, 49.99778747558594, 49.99814987182617, 52.081214904785156, 49.99778747558594, -49.997779846191406, -49.99797058105469, 52.081398010253906, -49.997779846191406, -49.99797058105469, 52.081398010253906, -49.997779846191406, -49.99797058105469, 52.081398010253906, -49.997779846191406, -49.99797058105469, 52.081398010253906, -49.99778747558594, 52.081214904785156, 49.99814987182617, -49.99778747558594, 52.081214904785156, 49.99814987182617, -49.99778747558594, 52.081214904785156, 49.99814987182617, -49.99778747558594, 52.081214904785156, 49.99814987182617, 49.99816131591797, 49.99797058105469, 52.081031799316406, 49.99816131591797, 49.99797058105469, 52.081031799316406, 49.99816131591797, 49.99797058105469, 52.081031799316406, 49.99816131591797, 49.99797058105469, 52.081031799316406, 49.99814987182617, -52.081214904785156, 49.99778747558594, 49.99814987182617, -52.081214904785156, 49.99778747558594, 49.99814987182617, -52.081214904785156, 49.99778747558594, 49.99814987182617, -52.081214904785156, 49.99778747558594, 49.99816131591797, -49.99797058105469, 52.081031799316406, 49.99816131591797, -49.99797058105469, 52.081031799316406, 49.99816131591797, -49.99797058105469, 52.081031799316406, 49.99816131591797, -49.99797058105469, 52.081031799316406, -52.081031799316406, -49.99797058105469, 49.99816131591797, -52.081031799316406, -49.99797058105469, 49.99816131591797, -52.081031799316406, -49.99797058105469, 49.99816131591797, -52.081031799316406, -49.99797058105469, 49.99816131591797, 49.997779846191406, 49.99797058105469, -52.081398010253906, 49.997779846191406, 49.99797058105469, -52.081398010253906, 49.997779846191406, 49.99797058105469, -52.081398010253906, 49.997779846191406, 49.99797058105469, -52.081398010253906, -49.99816131591797, 49.99797058105469, -52.081031799316406, -49.99816131591797, 49.99797058105469, -52.081031799316406, -49.99816131591797, 49.99797058105469, -52.081031799316406, -49.99816131591797, 49.99797058105469, -52.081031799316406, -52.081398010253906, 49.99797058105469, -49.997779846191406, -52.081398010253906, 49.99797058105469, -49.997779846191406, -52.081398010253906, 49.99797058105469, -49.997779846191406, -52.081398010253906, 49.99797058105469, -49.997779846191406, -49.997779846191406, 49.99797058105469, 52.081398010253906, -49.997779846191406, 49.99797058105469, 52.081398010253906, -49.997779846191406, 49.99797058105469, 52.081398010253906, -49.997779846191406, 49.99797058105469, 52.081398010253906],\n \"normalized\": false\n },\n \"normal\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [0.9995923042297363, -0.020230919122695923, 0.020147494971752167, 0.9995923042297363, -0.020230919122695923, 0.020147494971752167, 0.9995923042297363, -0.020230919122695923, 0.020147494971752167, 0.9995923042297363, -0.020230919122695923, 0.020147494971752167, 0.9995908737182617, 0.02024438977241516, -0.020207354798913002, 0.9995908737182617, 0.02024438977241516, -0.020207354798913002, 0.9995908737182617, 0.02024438977241516, -0.020207354798913002, 0.9995908737182617, 0.02024438977241516, -0.020207354798913002, 0.9995913505554199, 0.020214110612869263, 0.020209431648254395, 0.9995913505554199, 0.020214110612869263, 0.020209431648254395, 0.9995913505554199, 0.020214110612869263, 0.020209431648254395, 0.9995913505554199, 0.020214110612869263, 0.020209431648254395, -0.9995912313461304, 0.020234376192092896, 0.020197225734591484, -0.9995912313461304, 0.020234376192092896, 0.020197225734591484, -0.9995912313461304, 0.020234376192092896, 0.020197225734591484, -0.9995912313461304, 0.020234376192092896, 0.020197225734591484, 0.02019399404525757, 0.9995913505554199, -0.02023378014564514, 0.02019399404525757, 0.9995913505554199, -0.02023378014564514, 0.02019399404525757, 0.9995913505554199, -0.02023378014564514, 0.02019399404525757, 0.9995913505554199, -0.02023378014564514, -0.02023431658744812, -0.9995909333229065, -0.020213313400745392, -0.02023431658744812, -0.9995909333229065, -0.020213313400745392, -0.02023431658744812, -0.9995909333229065, -0.020213313400745392, -0.02023431658744812, -0.9995909333229065, -0.020213313400745392, -0.02021673321723938, -0.02017366886138916, -0.9995919466018677, -0.02021673321723938, -0.02017366886138916, -0.9995919466018677, -0.02021673321723938, -0.02017366886138916, -0.9995919466018677, -0.02021673321723938, -0.02017366886138916, -0.9995919466018677, 0.020203232765197754, -0.9995912909507751, -0.020224466919898987, 0.020203232765197754, -0.9995912909507751, -0.020224466919898987, 0.020203232765197754, -0.9995912909507751, -0.020224466919898987, 0.020203232765197754, -0.9995912909507751, -0.020224466919898987, -0.020203210413455963, -0.9995913505554199, 0.02022451162338257, -0.020203210413455963, -0.9995913505554199, 0.02022451162338257, -0.020203210413455963, -0.9995913505554199, 0.02022451162338257, -0.020203210413455963, -0.9995913505554199, 0.02022451162338257, 0.9995921850204468, -0.020173730328679085, -0.020216643810272217, 0.9995921850204468, -0.020173730328679085, -0.020216643810272217, 0.9995921850204468, -0.020173730328679085, -0.020216643810272217, 0.9995921850204468, -0.020173730328679085, -0.020216643810272217, 0.020147576928138733, -0.020230591297149658, -0.9995923042297363, 0.020147576928138733, -0.020230591297149658, -0.9995923042297363, 0.020147576928138733, -0.020230591297149658, -0.9995923042297363, 0.020147576928138733, -0.020230591297149658, -0.9995923042297363, -0.9995916485786438, -0.020208656787872314, -0.020204007625579834, -0.9995916485786438, -0.020208656787872314, -0.020204007625579834, -0.9995916485786438, -0.020208656787872314, -0.020204007625579834, -0.9995916485786438, -0.020208656787872314, -0.020204007625579834, -0.02024361491203308, 0.9995908737182617, -0.02020406536757946, -0.02024361491203308, 0.9995908737182617, -0.02020406536757946, -0.02024361491203308, 0.9995908737182617, -0.02020406536757946, -0.02024361491203308, 0.9995908737182617, -0.02020406536757946, 0.02026575803756714, 0.9995908141136169, 0.020181983709335327, 0.02026575803756714, 0.9995908141136169, 0.020181983709335327, 0.02026575803756714, 0.9995908141136169, 0.020181983709335327, 0.02026575803756714, 0.9995908141136169, 0.020181983709335327, -0.020204126834869385, -0.020208358764648438, 0.9995917081832886, -0.020204126834869385, -0.020208358764648438, 0.9995917081832886, -0.020204126834869385, -0.020208358764648438, 0.9995917081832886, -0.020204126834869385, -0.020208358764648438, 0.9995917081832886, -0.02021375298500061, 0.9995914101600647, 0.020213931798934937, -0.02021375298500061, 0.9995914101600647, 0.020213931798934937, -0.02021375298500061, 0.9995914101600647, 0.020213931798934937, -0.02021375298500061, 0.9995914101600647, 0.020213931798934937, 0.020197970792651176, 0.020234346389770508, 0.9995912313461304, 0.020197970792651176, 0.020234346389770508, 0.9995912313461304, 0.020197970792651176, 0.020234346389770508, 0.9995912313461304, 0.020197970792651176, 0.020234346389770508, 0.9995912313461304, 0.02023431658744812, -0.9995909333229065, 0.020213313400745392, 0.02023431658744812, -0.9995909333229065, 0.020213313400745392, 0.02023431658744812, -0.9995909333229065, 0.020213313400745392, 0.02023431658744812, -0.9995909333229065, 0.020213313400745392, 0.020256830379366875, -0.020169764757156372, 0.9995912909507751, 0.020256830379366875, -0.020169764757156372, 0.9995912909507751, 0.020256830379366875, -0.020169764757156372, 0.9995912909507751, 0.020256830379366875, -0.020169764757156372, 0.9995912909507751, -0.9995914101600647, -0.02016991376876831, 0.020256860181689262, -0.9995914101600647, -0.02016991376876831, 0.020256860181689262, -0.9995914101600647, -0.02016991376876831, 0.020256860181689262, -0.9995914101600647, -0.02016991376876831, 0.020256860181689262, 0.02021026611328125, 0.020213961601257324, -0.9995913505554199, 0.02021026611328125, 0.020213961601257324, -0.9995913505554199, 0.02021026611328125, 0.020213961601257324, -0.9995913505554199, 0.02021026611328125, 0.020213961601257324, -0.9995913505554199, -0.02020804025232792, 0.020244628190994263, -0.9995906949043274, -0.02020804025232792, 0.020244628190994263, -0.9995906949043274, -0.02020804025232792, 0.020244628190994263, -0.9995906949043274, -0.02020804025232792, 0.020244628190994263, -0.9995906949043274, -0.9995908737182617, 0.020204482600092888, -0.020239561796188354, -0.9995908737182617, 0.020204482600092888, -0.020239561796188354, -0.9995908737182617, 0.020204482600092888, -0.020239561796188354, -0.9995908737182617, 0.020204482600092888, -0.020239561796188354, -0.020240217447280884, 0.020204216241836548, 0.9995909929275513, -0.020240217447280884, 0.020204216241836548, 0.9995909929275513, -0.020240217447280884, 0.020204216241836548, 0.9995909929275513, -0.020240217447280884, 0.020204216241836548, 0.9995909929275513],\n \"normalized\": false\n },\n \"uv\": {\n \"itemSize\": 2,\n \"type\": \"Float32Array\",\n \"array\": [0.002862999914214015, 0.7471370100975037, 0.07257817685604095, 0.00783926248550415, 0.20479217171669006, 0.24324274063110352, 0.23563209176063538, 0.18311190605163574, 0.16701677441596985, 0.007843196392059326, 0.21674437820911407, 0.007843255996704102, 0.23563209176063538, 0.23977500200271606, 0.24713699519634247, 0.5028629899024963, 0.002862999914214015, 0.5028629899024963, 0.16701683402061462, 0.24324274063110352, 0.20479217171669006, 0.007843196392059326, 0.2416384220123291, 0.12991642951965332, 0.12230584025382996, 0.24324274063110352, 0.14119352400302887, 0.007843255996704102, 0.24163848161697388, 0.2243550419807434, 0.2481130063533783, 0.4981130361557007, 0.11035363376140594, 0.007843255996704102, 0.16008129715919495, 0.007843196392059326, 0.2416384220123291, 0.23630714416503906, 0.4975059926509857, 0.7470999956130981, 0.008979067206382751, 0.00783926248550415, 0.02786727249622345, 0.24324274063110352, 0.2416384220123291, 0.20546722412109375, 0.7475240230560303, 0.002879023551940918, 0.034802429378032684, 0.24324274063110352, 0.08453041315078735, 0.24324274063110352, 0.23563209176063538, 0.20199954509735107, 0.4974119961261749, 0.49670398235321045, 0.027866892516613007, 0.00783926248550415, 0.06564302742481232, 0.24324274063110352, 0.2416384220123291, 0.1607564091682434, 0.5032510161399841, 0.002879023551940918, 0.008979566395282745, 0.24324274063110352, 0.046754732728004456, 0.00783926248550415, 0.2416384220123291, 0.11102879047393799, 0.7475240230560303, 0.24715197086334229, 0.07257817685604095, 0.24324274063110352, 0.21674437820911407, 0.24324274063110352, 0.2416384220123291, 0.1676918864250183, 0.24713699519634247, 0.7471370100975037, 0.03480251133441925, 0.00783926248550415, 0.22367990016937256, 0.24324274063110352, 0.23563209176063538, 0.16422414779663086, 0.2531389892101288, 0.49670398235321045, 0.0038399999029934406, 0.25383996963500977, 0.015914686024188995, 0.00783926248550415, 0.09146587550640106, 0.24324274063110352, 0.2416384220123291, 0.19853174686431885, 0.11035363376140594, 0.24324274063110352, 0.12924134731292725, 0.007843255996704102, 0.2416384220123291, 0.1488041877746582, 0.4975059926509857, 0.5028259754180908, 0.16008129715919495, 0.24324274063110352, 0.17896901071071625, 0.007843196392059326, 0.2416384220123291, 0.12298095226287842, 0.2532320022583008, 0.7470999956130981, 0.0536903440952301, 0.00783926248550415, 0.14812909066677094, 0.24324274063110352, 0.2416384220123291, 0.10409331321716309, 0.5033630132675171, 0.252979040145874, 0.12924134731292725, 0.24324274063110352, 0.17896901071071625, 0.24324274063110352, 0.23563209176063538, 0.22088712453842163, 0.2532320022583008, 0.5028259754180908, 0.18590447306632996, 0.007843196392059326, 0.19785669445991516, 0.007843196392059326, 0.23563209176063538, 0.12644875049591064, 0.7476369738578796, 0.4972519874572754, 0.046755194664001465, 0.24324274063110352, 0.06564256548881531, 0.00783926248550415, 0.2416384220123291, 0.17964410781860352, 0.5032510161399841, 0.24715197086334229, 0.0536903440952301, 0.24324274063110352, 0.19785669445991516, 0.24324274063110352, 0.2416384220123291, 0.18657952547073364, 0.5033630132675171, 0.4972519874572754, 0.0038399999029934406, 0.4981130361557007, 0.015914715826511383, 0.24324274063110352, 0.14119356870651245, 0.24324274063110352, 0.23563209176063538, 0.10756111145019531, 0.10341811925172806, 0.007843255996704102, 0.22367990016937256, 0.007843255996704102, 0.2416384220123291, 0.24324274063110352, 0.2531389892101288, 0.2524310350418091, 0.08453038334846497, 0.007843196392059326, 0.10341812670230865, 0.24324274063110352, 0.2416384220123291, 0.14186859130859375, 0.4974119961261749, 0.2524310350418091, 0.09146586060523987, 0.007843196392059326, 0.12230582535266876, 0.007843255996704102, 0.23563209176063538, 0.14533644914627075, 0.2481130063533783, 0.25383996963500977, 0.14812903106212616, 0.007843255996704102, 0.18590447306632996, 0.24324274063110352, 0.24163848161697388, 0.21741944551467896, 0.7476369738578796, 0.252979040145874],\n \"normalized\": false\n },\n \"color\": {\n \"itemSize\": 4,\n \"type\": \"Uint16Array\",\n \"array\": [65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535],\n \"normalized\": true\n }\n },\n \"index\": {\n \"type\": \"Uint16Array\",\n \"array\": [83, 27, 87, 8, 39, 7, 44, 15, 91, 59, 67, 95, 63, 19, 51, 13, 57, 92, 1, 29, 36, 56, 68, 72, 40, 21, 24, 80, 48, 16, 45, 32, 77, 41, 5, 37, 89, 60, 49, 84, 46, 88, 2, 65, 73, 93, 53, 61, 9, 17, 52, 70, 3, 74, 30, 42, 38, 22, 47, 26, 34, 58, 79, 11, 54, 66, 82, 18, 6, 86, 90, 50, 14, 94, 62, 31, 35, 23, 83, 43, 27, 8, 0, 39, 44, 76, 15, 59, 75, 67, 63, 55, 19, 13, 78, 57, 1, 69, 29, 56, 33, 68, 40, 28, 21, 80, 85, 48, 45, 20, 32, 41, 81, 5, 89, 12, 60, 84, 25, 46, 2, 10, 65, 93, 64, 53, 9, 4, 17, 31, 71, 35]\n },\n \"boundingSphere\": {\n \"center\": [0, 0, 0],\n \"radius\": 90.20752176710862\n }\n },\n faceValues: [3, 5, 1, 6, 2, 4],\n rotationCombinations: {\n \"1,2\": [0, 0, 90],\n \"1,3\": [-90, 0, 0],\n \"1,4\": [90, 0, 0],\n \"1,5\": [0, 0, -90],\n \"1,6\": [180, 0, 0],\n \"2,3\": [0, 90, 0],\n \"2,4\": [0, -90, 0],\n \"2,5\": [0, 0, 180],\n \"2,6\": [0, 0, 90],\n \"3,4\": [-180, 0, -180],\n \"3,5\": [0, 90, 0],\n \"3,6\": [-90, 0, 0],\n \"4,5\": [180, -90, 180],\n \"4,6\": [90, 0, 0],\n \"5,6\": [0, 0, -90]\n }\n },\n \"d8\": {\n \"metadata\": {\n \"version\": 4.5,\n \"type\": \"BufferGeometry\",\n \"generator\": \"BufferGeometry.toJSON\"\n },\n \"uuid\": \"F0A476BC-C144-4BC6-A327-5E00064C485A\",\n \"type\": \"BufferGeometry\",\n \"data\": {\n \"attributes\": {\n \"position\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-1.1684173345565796, 1.168058156967163, -97.7831802368164, -1.1684173345565796, 1.168058156967163, -97.7831802368164, -1.1684173345565796, 1.168058156967163, -97.7831802368164, -1.1684173345565796, 1.168058156967163, -97.7831802368164, -97.7831802368164, 1.168058156967163, 1.1684173345565796, -97.7831802368164, 1.168058156967163, 1.1684173345565796, -97.7831802368164, 1.168058156967163, 1.1684173345565796, -97.7831802368164, 1.168058156967163, 1.1684173345565796, -1.167698860168457, -1.168058156967163, 97.7831802368164, -1.167698860168457, -1.168058156967163, 97.7831802368164, -1.167698860168457, -1.168058156967163, 97.7831802368164, -1.167698860168457, -1.168058156967163, 97.7831802368164, -97.7831802368164, -1.168058156967163, 1.1684173345565796, -97.7831802368164, -1.168058156967163, 1.1684173345565796, -97.7831802368164, -1.168058156967163, 1.1684173345565796, -97.7831802368164, -1.168058156967163, 1.1684173345565796, -1.1680537462234497, 97.7831802368164, 1.168062448501587, -1.1680537462234497, 97.7831802368164, 1.168062448501587, -1.1680537462234497, 97.7831802368164, 1.168062448501587, -1.1680537462234497, 97.7831802368164, 1.168062448501587, -97.7831802368164, 1.168058156967163, -1.167698860168457, -97.7831802368164, 1.168058156967163, -1.167698860168457, -97.7831802368164, 1.168058156967163, -1.167698860168457, -97.7831802368164, 1.168058156967163, -1.167698860168457, -1.168062448501587, 97.7831802368164, -1.1680537462234497, -1.168062448501587, 97.7831802368164, -1.1680537462234497, -1.168062448501587, 97.7831802368164, -1.1680537462234497, -1.168062448501587, 97.7831802368164, -1.1680537462234497, 97.7831802368164, -1.168058156967163, -1.1684173345565796, 97.7831802368164, -1.168058156967163, -1.1684173345565796, 97.7831802368164, -1.168058156967163, -1.1684173345565796, 97.7831802368164, -1.168058156967163, -1.1684173345565796, 1.167698860168457, -1.168058156967163, -97.7831802368164, 1.167698860168457, -1.168058156967163, -97.7831802368164, 1.167698860168457, -1.168058156967163, -97.7831802368164, 1.167698860168457, -1.168058156967163, -97.7831802368164, 1.167698860168457, 1.168058156967163, -97.7831802368164, 1.167698860168457, 1.168058156967163, -97.7831802368164, 1.167698860168457, 1.168058156967163, -97.7831802368164, 1.167698860168457, 1.168058156967163, -97.7831802368164, 1.1680537462234497, 97.7831802368164, -1.168062448501587, 1.1680537462234497, 97.7831802368164, -1.168062448501587, 1.1680537462234497, 97.7831802368164, -1.168062448501587, 1.1680537462234497, 97.7831802368164, -1.168062448501587, 97.7831802368164, 1.168058156967163, 1.167698860168457, 97.7831802368164, 1.168058156967163, 1.167698860168457, 97.7831802368164, 1.168058156967163, 1.167698860168457, 97.7831802368164, 1.168058156967163, 1.167698860168457, -1.168062448501587, -97.7831802368164, -1.1680537462234497, -1.168062448501587, -97.7831802368164, -1.1680537462234497, -1.168062448501587, -97.7831802368164, -1.1680537462234497, -1.168062448501587, -97.7831802368164, -1.1680537462234497, -97.7831802368164, -1.168058156967163, -1.167698860168457, -97.7831802368164, -1.168058156967163, -1.167698860168457, -97.7831802368164, -1.168058156967163, -1.167698860168457, -97.7831802368164, -1.168058156967163, -1.167698860168457, 97.7831802368164, -1.168058156967163, 1.167698860168457, 97.7831802368164, -1.168058156967163, 1.167698860168457, 97.7831802368164, -1.168058156967163, 1.167698860168457, 97.7831802368164, -1.168058156967163, 1.167698860168457, -1.167698860168457, 1.168058156967163, 97.7831802368164, -1.167698860168457, 1.168058156967163, 97.7831802368164, -1.167698860168457, 1.168058156967163, 97.7831802368164, -1.167698860168457, 1.168058156967163, 97.7831802368164, 1.168062448501587, -97.7831802368164, 1.1680537462234497, 1.168062448501587, -97.7831802368164, 1.1680537462234497, 1.168062448501587, -97.7831802368164, 1.1680537462234497, 1.168062448501587, -97.7831802368164, 1.1680537462234497, 1.1684173345565796, -1.168058156967163, 97.7831802368164, 1.1684173345565796, -1.168058156967163, 97.7831802368164, 1.1684173345565796, -1.168058156967163, 97.7831802368164, 1.1684173345565796, -1.168058156967163, 97.7831802368164, -1.1684173345565796, -1.168058156967163, -97.7831802368164, -1.1684173345565796, -1.168058156967163, -97.7831802368164, -1.1684173345565796, -1.168058156967163, -97.7831802368164, -1.1684173345565796, -1.168058156967163, -97.7831802368164, 1.1684173345565796, 1.168058156967163, 97.7831802368164, 1.1684173345565796, 1.168058156967163, 97.7831802368164, 1.1684173345565796, 1.168058156967163, 97.7831802368164, 1.1684173345565796, 1.168058156967163, 97.7831802368164, 97.7831802368164, 1.168058156967163, -1.1684173345565796, 97.7831802368164, 1.168058156967163, -1.1684173345565796, 97.7831802368164, 1.168058156967163, -1.1684173345565796, 97.7831802368164, 1.168058156967163, -1.1684173345565796, 1.168062448501587, 97.7831802368164, 1.1680537462234497, 1.168062448501587, 97.7831802368164, 1.1680537462234497, 1.168062448501587, 97.7831802368164, 1.1680537462234497, 1.168062448501587, 97.7831802368164, 1.1680537462234497, -1.1680537462234497, -97.7831802368164, 1.168062448501587, -1.1680537462234497, -97.7831802368164, 1.168062448501587, -1.1680537462234497, -97.7831802368164, 1.168062448501587, -1.1680537462234497, -97.7831802368164, 1.168062448501587, 1.1680537462234497, -97.7831802368164, -1.168062448501587, 1.1680537462234497, -97.7831802368164, -1.168062448501587, 1.1680537462234497, -97.7831802368164, -1.168062448501587, 1.1680537462234497, -97.7831802368164, -1.168062448501587],\n \"normalized\": false\n },\n \"normal\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-0.5682533383369446, 0.5682891607284546, -0.5950928330421448, -0.5682533383369446, 0.5682891607284546, -0.5950928330421448, -0.5682533383369446, 0.5682891607284546, -0.5950928330421448, -0.5682533383369446, 0.5682891607284546, -0.5950928330421448, -0.5951133966445923, 0.568278431892395, 0.5682425498962402, -0.5951133966445923, 0.568278431892395, 0.5682425498962402, -0.5951133966445923, 0.568278431892395, 0.5682425498962402, -0.5951133966445923, 0.568278431892395, 0.5682425498962402, -0.5682530999183655, -0.5682904720306396, 0.5950918197631836, -0.5682530999183655, -0.5682904720306396, 0.5950918197631836, -0.5682530999183655, -0.5682904720306396, 0.5950918197631836, -0.5682530999183655, -0.5682904720306396, 0.5950918197631836, -0.5950893759727478, -0.5682545304298401, 0.5682916045188904, -0.5950893759727478, -0.5682545304298401, 0.5682916045188904, -0.5950893759727478, -0.5682545304298401, 0.5682916045188904, -0.5950893759727478, -0.5682545304298401, 0.5682916045188904, -0.5682390332221985, 0.5951166152954102, 0.5682786107063293, -0.5682390332221985, 0.5951166152954102, 0.5682786107063293, -0.5682390332221985, 0.5951166152954102, 0.5682786107063293, -0.5682390332221985, 0.5951166152954102, 0.5682786107063293, -0.5951080918312073, 0.5682451725006104, -0.5682812929153442, -0.5951080918312073, 0.5682451725006104, -0.5682812929153442, -0.5951080918312073, 0.5682451725006104, -0.5682812929153442, -0.5951080918312073, 0.5682451725006104, -0.5682812929153442, -0.5682910680770874, 0.5950912833213806, -0.5682533383369446, -0.5682910680770874, 0.5950912833213806, -0.5682533383369446, -0.5682910680770874, 0.5950912833213806, -0.5682533383369446, -0.5682910680770874, 0.5950912833213806, -0.5682533383369446, 0.595115065574646, -0.5682411789894104, -0.5682781934738159, 0.595115065574646, -0.5682411789894104, -0.5682781934738159, 0.595115065574646, -0.5682411789894104, -0.5682781934738159, 0.595115065574646, -0.5682411789894104, -0.5682781934738159, 0.5682530999183655, -0.5682904720306396, -0.5950918197631836, 0.5682530999183655, -0.5682904720306396, -0.5950918197631836, 0.5682530999183655, -0.5682904720306396, -0.5950918197631836, 0.5682530999183655, -0.5682904720306396, -0.5950918197631836, 0.5682830810546875, 0.5682469010353088, -0.5951048731803894, 0.5682830810546875, 0.5682469010353088, -0.5951048731803894, 0.5682830810546875, 0.5682469010353088, -0.5951048731803894, 0.5682830810546875, 0.5682469010353088, -0.5951048731803894, 0.5682392716407776, 0.5951164960861206, -0.5682784914970398, 0.5682392716407776, 0.5951164960861206, -0.5682784914970398, 0.5682392716407776, 0.5951164960861206, -0.5682784914970398, 0.5682392716407776, 0.5951164960861206, -0.5682784914970398, 0.5951049327850342, 0.5682469010353088, 0.5682830214500427, 0.5951049327850342, 0.5682469010353088, 0.5682830214500427, 0.5951049327850342, 0.5682469010353088, 0.5682830214500427, 0.5951049327850342, 0.5682469010353088, 0.5682830214500427, -0.5682423114776611, -0.5951160788536072, -0.5682759881019592, -0.5682423114776611, -0.5951160788536072, -0.5682759881019592, -0.5682423114776611, -0.5951160788536072, -0.5682759881019592, -0.5682423114776611, -0.5951160788536072, -0.5682759881019592, -0.595117449760437, -0.5682770609855652, -0.568239688873291, -0.595117449760437, -0.5682770609855652, -0.568239688873291, -0.595117449760437, -0.5682770609855652, -0.568239688873291, -0.595117449760437, -0.5682770609855652, -0.568239688873291, 0.5950918197631836, -0.5682904720306396, 0.5682530999183655, 0.5950918197631836, -0.5682904720306396, 0.5682530999183655, 0.5950918197631836, -0.5682904720306396, 0.5682530999183655, 0.5950918197631836, -0.5682904720306396, 0.5682530999183655, -0.5682830810546875, 0.5682469010353088, 0.5951048731803894, -0.5682830810546875, 0.5682469010353088, 0.5951048731803894, -0.5682830810546875, 0.5682469010353088, 0.5951048731803894, -0.5682830810546875, 0.5682469010353088, 0.5951048731803894, 0.5682426691055298, -0.5951159000396729, 0.5682759284973145, 0.5682426691055298, -0.5951159000396729, 0.5682759284973145, 0.5682426691055298, -0.5951159000396729, 0.5682759284973145, 0.5682426691055298, -0.5951159000396729, 0.5682759284973145, 0.5682781934738159, -0.5682411193847656, 0.595115065574646, 0.5682781934738159, -0.5682411193847656, 0.595115065574646, 0.5682781934738159, -0.5682411193847656, 0.595115065574646, 0.5682781934738159, -0.5682411193847656, 0.595115065574646, -0.5682781934738159, -0.5682411193847656, -0.595115065574646, -0.5682781934738159, -0.5682411193847656, -0.595115065574646, -0.5682781934738159, -0.5682411193847656, -0.595115065574646, -0.5682781934738159, -0.5682411193847656, -0.595115065574646, 0.5682533383369446, 0.5682891607284546, 0.5950928330421448, 0.5682533383369446, 0.5682891607284546, 0.5950928330421448, 0.5682533383369446, 0.5682891607284546, 0.5950928330421448, 0.5682533383369446, 0.5682891607284546, 0.5950928330421448, 0.5950928330421448, 0.5682891607284546, -0.5682533383369446, 0.5950928330421448, 0.5682891607284546, -0.5682533383369446, 0.5950928330421448, 0.5682891607284546, -0.5682533383369446, 0.5950928330421448, 0.5682891607284546, -0.5682533383369446, 0.5682913064956665, 0.595090925693512, 0.5682531595230103, 0.5682913064956665, 0.595090925693512, 0.5682531595230103, 0.5682913064956665, 0.595090925693512, 0.5682531595230103, 0.5682913064956665, 0.595090925693512, 0.5682531595230103, -0.5682886838912964, -0.5950911641120911, 0.5682557225227356, -0.5682886838912964, -0.5950911641120911, 0.5682557225227356, -0.5682886838912964, -0.5950911641120911, 0.5682557225227356, -0.5682886838912964, -0.5950911641120911, 0.5682557225227356, 0.5682889819145203, -0.5950908660888672, -0.5682554841041565, 0.5682889819145203, -0.5950908660888672, -0.5682554841041565, 0.5682889819145203, -0.5950908660888672, -0.5682554841041565, 0.5682889819145203, -0.5950908660888672, -0.5682554841041565],\n \"normalized\": false\n },\n \"uv\": {\n \"itemSize\": 2,\n \"type\": \"Float32Array\",\n \"array\": [0.07201391458511353, 0.011956751346588135, 0.1601339429616928, 0.228448748588562, 0.2343699038028717, 0.15436840057373047, 0.9927999973297119, 0.452796995639801, 0.14628882706165314, 0.22844743728637695, 0.213005930185318, 0.228448748588562, 0.23062995076179504, 0.19327861070632935, 0.3759610056877136, 0.5007950067520142, 0.036765892058610916, 0.011956632137298584, 0.2167847901582718, 0.011955499649047852, 0.2343699038028717, 0.13678330183029175, 0.9929670095443726, 0.2016180157661438, 0.1286647915840149, 0.011955201625823975, 0.2167847901582718, 0.22844743728637695, 0.23062995076179504, 0.1895385980606079, 0.8765519857406616, -0.00001895427703857422, 0.14628879725933075, 0.011955201625823975, 0.19916081428527832, 0.22844743728637695, 0.23062995076179504, 0.20712369680404663, 0.49237701296806335, 0.7024319767951965, 0.14250995218753815, 0.228448748588562, 0.1601339429616928, 0.011956632137298584, 0.2343699038028717, 0.19327861070632935, 0.876384973526001, 0.25116002559661865, 0.07201394438743591, 0.228448748588562, 0.14250992238521576, 0.011956632137298584, 0.2343699038028717, 0.20712369680404663, 0.7599689960479736, 0.452796995639801, 0.022920722141861916, 0.011955201625823975, 0.18153679370880127, 0.22844743728637695, 0.23062995076179504, 0.22470879554748535, 0.6253160238265991, 0.0010759830474853516, 0.08963792026042938, 0.011956632137298584, 0.18153676390647888, 0.011955499649047852, 0.23062995076179504, 0.15810835361480713, 0.7397840023040771, 0.19933903217315674, 0.00919399969279766, 0.7025139927864075, 0.07579275965690613, 0.011955320835113525, 0.17775794863700867, 0.011956751346588135, 0.23062995076179504, 0.15436840057373047, 0.07579278945922852, 0.22844737768173218, 0.10726193338632584, 0.228448748588562, 0.2343699038028717, 0.21086370944976807, 0.2420250028371811, 0.7025139927864075, 0.05816878750920296, 0.22844743728637695, 0.11104078590869904, 0.011955320835113525, 0.2343699038028717, 0.228448748588562, 0.6256870031356812, 0.2503969669342041, 0.09341679513454437, 0.22844743728637695, 0.1248859316110611, 0.228448748588562, 0.2343699038028717, 0.17195343971252441, 0.49275800585746765, 0.4534569978713989, 0.12488594651222229, 0.011956632137298584, 0.1639128178358078, 0.011955201625823975, 0.2343699038028717, 0.1895385980606079, 0.37544700503349304, 0.25026899576187134, 0.019141869619488716, 0.011956572532653809, 0.05438993498682976, 0.228448748588562, 0.12524299323558807, 0.2504919767379761, 0.2343699038028717, 0.22470879554748535, 0.19916081428527832, 0.011955499649047852, 0.2130059003829956, 0.011956751346588135, 0.2343699038028717, 0.1405232548713684, 0.2595460116863251, 0.7024319767951965, 0.019141899421811104, 0.228448748588562, 0.0405447743833065, 0.22844743728637695, 0.23062995076179504, 0.17569351196289062, 0.2416590005159378, 0.4521290063858032, 0.008828000165522099, 0.4521290063858032, 0.040544744580984116, 0.011955201625823975, 0.05438990518450737, 0.011956632137298584, 0.23062992095947266, 0.13678330183029175, 0.09341679513454437, 0.011955201625823975, 0.1639127880334854, 0.22844743728637695, 0.2343699038028717, 0.15810835361480713, 0.2581369876861572, 0.4534569978713989, 0.05816878750920296, 0.01195526123046875, 0.19538196921348572, 0.011956751346588135, 0.23062992095947266, 0.14052319526672363, 0.7421020269393921, 0.45203500986099243, 0.10726191848516464, 0.011956751346588135, 0.12560999393463135, 0.5008770227432251, 0.17775794863700867, 0.228448748588562, 0.23062995076179504, 0.228448748588562, 0.11104080080986023, 0.22844737768173218, 0.19538193941116333, 0.228448748588562, 0.23062995076179504, 0.21086370944976807, 0.5092710256576538, 0.45203500986099243, 0.036765921860933304, 0.228448748588562, 0.1286647915840149, 0.22844737768173218, 0.2343699038028717, 0.17569351196289062, 0.7601360082626343, 0.2016180157661438, 0.022920751944184303, 0.22844743728637695, 0.08963793516159058, 0.228448748588562, 0.23062995076179504, 0.17195343971252441, 0.5108489990234375, 0.19933903217315674],\n \"normalized\": false\n },\n \"color\": {\n \"itemSize\": 4,\n \"type\": \"Uint16Array\",\n \"array\": [65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535],\n \"normalized\": true\n }\n },\n \"index\": {\n \"type\": \"Uint16Array\",\n \"array\": [3, 23, 27, 36, 43, 81, 35, 31, 95, 75, 51, 55, 79, 47, 87, 63, 19, 7, 11, 15, 91, 68, 67, 58, 60, 85, 17, 30, 46, 59, 92, 56, 64, 6, 54, 14, 37, 24, 40, 45, 41, 84, 32, 48, 72, 16, 20, 4, 42, 18, 86, 50, 66, 90, 52, 89, 12, 61, 13, 9, 74, 39, 34, 71, 62, 10, 38, 29, 33, 21, 73, 53, 8, 65, 69, 44, 70, 57, 60, 77, 85, 30, 83, 46, 92, 28, 56, 6, 22, 54, 37, 0, 24, 45, 80, 41, 32, 93, 48, 16, 25, 20, 42, 26, 18, 50, 94, 66, 52, 49, 89, 61, 5, 13, 74, 2, 39, 71, 78, 62, 38, 82, 29, 21, 1, 73, 8, 88, 65, 44, 76, 70]\n },\n \"boundingSphere\": {\n \"center\": [0, 0, 0],\n \"radius\": 169.36543629583093\n }\n },\n faceValues: [5, 3, 1, 7, 2, 8, 6, 4],\n rotationCombinations: {\n \"1,2\": [180, 0, 180],\n \"1,3\": [90, 0, 0],\n \"1,4\": [0, 0, 90],\n \"1,5\": [-180, 0, 0],\n \"1,6\": [0, 0, 180],\n \"1,7\": [-90, 0, 0],\n \"1,8\": [90, 0, 180],\n \"2,3\": [90, 0, 180],\n \"2,4\": [-90, 0, 0],\n \"2,5\": [0, 0, 180],\n \"2,6\": [-180, 0, 0],\n \"2,7\": [-90, 0, -180],\n \"2,8\": [90, 0, 0],\n \"3,4\": [-180, 0, 180],\n \"3,5\": [90, 0, 0],\n \"3,6\": [-90, 0, -180],\n \"3,7\": [-180, 0, 0],\n \"3,8\": [0, 0, 180],\n \"4,5\": [90, 0, 180],\n \"4,6\": [-90, 0, 0],\n \"4,7\": [0, 0, -180],\n \"4,8\": [180, 0, 0],\n \"5,6\": [-180, 0, -180],\n \"5,7\": [90, 0, 0],\n \"5,8\": [-90, 0, 180],\n \"6,7\": [90, 0, -180],\n \"6,8\": [-90, 0, 0],\n \"7,8\": [-180, 0, -180]\n }\n },\n \"d10\": {\n \"metadata\": {\n \"version\": 4.5,\n \"type\": \"BufferGeometry\",\n \"generator\": \"BufferGeometry.toJSON\"\n },\n \"uuid\": \"1B9B60ED-6BEC-48CC-8EB9-EEFFC2DD3ED8\",\n \"type\": \"BufferGeometry\",\n \"data\": {\n \"attributes\": {\n \"position\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-2.5946993827819824,1.8790435791015625,86.0141830444336,-2.5946993827819824,1.8790435791015625,86.0141830444336,-2.5946993827819824,1.8790435791015625,86.0141830444336,-2.5946993827819824,1.8790435791015625,86.0141830444336,71.31939697265625,-49.49197769165039,10.200661659240723,71.31939697265625,-49.49197769165039,10.200661659240723,71.31939697265625,-49.49197769165039,10.200661659240723,71.31939697265625,-49.49197769165039,10.200661659240723,87.39810180664062,-0.005702871363610029,-7.479601860046387,87.39810180664062,-0.005702871363610029,-7.479601860046387,87.39810180664062,-0.005702871363610029,-7.479601860046387,87.39810180664062,-0.005702871363610029,-7.479601860046387,3.2070045471191406,-0.005997277796268463,86.01419830322266,3.2070045471191406,-0.005997277796268463,86.01419830322266,3.2070045471191406,-0.005997277796268463,86.01419830322266,3.2070045471191406,-0.005997277796268463,86.01419830322266,-28.610445022583008,-81.96196746826172,10.200666427612305,-28.610445022583008,-81.96196746826172,10.200666427612305,-28.610445022583008,-81.96196746826172,10.200666427612305,-28.610445022583008,-81.96196746826172,10.200666427612305,69.1033706665039,-52.5421257019043,10.200669288635254,69.1033706665039,-52.5421257019043,10.200669288635254,69.1033706665039,-52.5421257019043,10.200669288635254,69.1033706665039,-52.5421257019043,10.200669288635254,0.9909778237342834,-3.0561423301696777,86.01419830322266,0.9909778237342834,-3.0561423301696777,86.01419830322266,0.9909778237342834,-3.0561423301696777,86.01419830322266,0.9909778237342834,-3.0561423301696777,86.01419830322266,70.70691680908203,-51.37708282470703,7.479945659637451,70.70691680908203,-51.37708282470703,7.479945659637451,70.70691680908203,-51.37708282470703,7.479945659637451,70.70691680908203,-51.37708282470703,7.479945659637451,-25.02603530883789,83.11405944824219,10.200100898742676,-25.02603530883789,83.11405944824219,10.200100898742676,-25.02603530883789,83.11405944824219,10.200100898742676,-25.02603530883789,83.11405944824219,10.200100898742676,-69.10337829589844,52.52949142456055,-10.200671195983887,-69.10337829589844,52.52949142456055,-10.200671195983887,-69.10337829589844,52.52949142456055,-10.200671195983887,-69.10337829589844,52.52949142456055,-10.200671195983887,-86.7856216430664,1.8781644105911255,10.200315475463867,-86.7856216430664,1.8781644105911255,10.200315475463867,-86.7856216430664,1.8781644105911255,10.200315475463867,-86.7856216430664,1.8781644105911255,10.200315475463867,-28.611663818359375,81.948974609375,10.200101852416992,-28.611663818359375,81.948974609375,10.200101852416992,-28.611663818359375,81.948974609375,10.200101852416992,-28.611663818359375,81.948974609375,10.200101852416992,-27.008115768432617,83.1140365600586,7.479378700256348,-27.008115768432617,83.1140365600586,7.479378700256348,-27.008115768432617,83.1140365600586,7.479378700256348,-27.008115768432617,83.1140365600586,7.479378700256348,-70.70691680908203,51.364444732666016,-7.479947566986084,-70.70691680908203,51.364444732666016,-7.479947566986084,-70.70691680908203,51.364444732666016,-7.479947566986084,-70.70691680908203,51.364444732666016,-7.479947566986084,71.31866455078125,49.48046112060547,10.200318336486816,71.31866455078125,49.48046112060547,10.200318336486816,71.31866455078125,49.48046112060547,10.200318336486816,71.31866455078125,49.48046112060547,10.200318336486816,86.78557586669922,1.8793641328811646,-10.20033073425293,86.78557586669922,1.8793641328811646,-10.20033073425293,86.78557586669922,1.8793641328811646,-10.20033073425293,86.78557586669922,1.8793641328811646,-10.20033073425293,69.10259246826172,52.53056716918945,10.20030689239502,69.10259246826172,52.53056716918945,10.20030689239502,69.10259246826172,52.53056716918945,10.20030689239502,69.10259246826172,52.53056716918945,10.20030689239502,70.7061538696289,51.36553192138672,7.479590892791748,70.7061538696289,51.36553192138672,7.479590892791748,70.7061538696289,51.36553192138672,7.479590892791748,70.7061538696289,51.36553192138672,7.479590892791748,2.5946712493896484,1.8784899711608887,-86.01419830322266,2.5946712493896484,1.8784899711608887,-86.01419830322266,2.5946712493896484,1.8784899711608887,-86.01419830322266,2.5946712493896484,1.8784899711608887,-86.01419830322266,28.610443115234375,81.9493408203125,-10.200669288635254,28.610443115234375,81.9493408203125,-10.200669288635254,28.610443115234375,81.9493408203125,-10.200669288635254,28.610443115234375,81.9493408203125,-10.200669288635254,86.78562927246094,-1.8908008337020874,-10.2003173828125,86.78562927246094,-1.8908008337020874,-10.2003173828125,86.78562927246094,-1.8908008337020874,-10.2003173828125,86.78562927246094,-1.8908008337020874,-10.2003173828125,0.9909327626228333,3.0441155433654785,86.0141830444336,0.9909327626228333,3.0441155433654785,86.0141830444336,0.9909327626228333,3.0441155433654785,86.0141830444336,0.9909327626228333,3.0441155433654785,86.0141830444336,-27.00689125061035,-83.12700653076172,7.479950428009033,-27.00689125061035,-83.12700653076172,7.479950428009033,-27.00689125061035,-83.12700653076172,7.479950428009033,-27.00689125061035,-83.12700653076172,7.479950428009033,-69.10259246826172,-52.54320526123047,-10.200308799743652,-69.10259246826172,-52.54320526123047,-10.200308799743652,-69.10259246826172,-52.54320526123047,-10.200308799743652,-69.10259246826172,-52.54320526123047,-10.200308799743652,2.594700574874878,-1.8916770219802856,-86.0141830444336,2.594700574874878,-1.8916770219802856,-86.0141830444336,2.594700574874878,-1.8916770219802856,-86.0141830444336,2.594700574874878,-1.8916770219802856,-86.0141830444336,25.026033401489258,-83.1266860961914,-10.200102806091309,25.026033401489258,-83.1266860961914,-10.200102806091309,25.026033401489258,-83.1266860961914,-10.200102806091309,25.026033401489258,-83.1266860961914,-10.200102806091309,-86.78559112548828,-1.892000436782837,10.200329780578613,-86.78559112548828,-1.892000436782837,10.200329780578613,-86.78559112548828,-1.892000436782837,10.200329780578613,-86.78559112548828,-1.892000436782837,10.200329780578613,-70.7061538696289,-51.37816619873047,-7.479592323303223,-70.7061538696289,-51.37816619873047,-7.479592323303223,-70.7061538696289,-51.37816619873047,-7.479592323303223,-70.7061538696289,-51.37816619873047,-7.479592323303223,-25.024797439575195,-83.12699127197266,10.200674057006836,-25.024797439575195,-83.12699127197266,10.200674057006836,-25.024797439575195,-83.12699127197266,10.200674057006836,-25.024797439575195,-83.12699127197266,10.200674057006836,-2.5946712493896484,-1.8911232948303223,86.01419830322266,-2.5946712493896484,-1.8911232948303223,86.01419830322266,-2.5946712493896484,-1.8911232948303223,86.01419830322266,-2.5946712493896484,-1.8911232948303223,86.01419830322266,-71.31940460205078,49.47935104370117,-10.200664520263672,-71.31940460205078,49.47935104370117,-10.200664520263672,-71.31940460205078,49.47935104370117,-10.200664520263672,-71.31940460205078,49.47935104370117,-10.200664520263672,28.611663818359375,-81.96160888671875,-10.200103759765625,28.611663818359375,-81.96160888671875,-10.200103759765625,28.611663818359375,-81.96160888671875,-10.200103759765625,28.611663818359375,-81.96160888671875,-10.200103759765625,27.00688934326172,83.1143798828125,-7.479951858520508,27.00688934326172,83.1143798828125,-7.479951858520508,27.00688934326172,83.1143798828125,-7.479951858520508,27.00688934326172,83.1143798828125,-7.479951858520508,25.024797439575195,83.11434936523438,-10.200675010681152,25.024797439575195,83.11434936523438,-10.200675010681152,25.024797439575195,83.11434936523438,-10.200675010681152,25.024797439575195,83.11434936523438,-10.200675010681152,27.008115768432617,-83.12667083740234,-7.4793806076049805,27.008115768432617,-83.12667083740234,-7.4793806076049805,27.008115768432617,-83.12667083740234,-7.4793806076049805,27.008115768432617,-83.12667083740234,-7.4793806076049805,-87.39810180664062,-0.006933570373803377,7.479599952697754,-87.39810180664062,-0.006933570373803377,7.479599952697754,-87.39810180664062,-0.006933570373803377,7.479599952697754,-87.39810180664062,-0.006933570373803377,7.479599952697754,-71.31866455078125,-49.493099212646484,-10.20032024383545,-71.31866455078125,-49.493099212646484,-10.20032024383545,-71.31866455078125,-49.493099212646484,-10.20032024383545,-71.31866455078125,-49.493099212646484,-10.20032024383545,-0.9909327626228333,-3.056749105453491,-86.0141830444336,-0.9909327626228333,-3.056749105453491,-86.0141830444336,-0.9909327626228333,-3.056749105453491,-86.0141830444336,-0.9909327626228333,-3.056749105453491,-86.0141830444336,-3.2070045471191406,-0.006636159960180521,-86.01419830322266,-3.2070045471191406,-0.006636159960180521,-86.01419830322266,-3.2070045471191406,-0.006636159960180521,-86.01419830322266,-3.2070045471191406,-0.006636159960180521,-86.01419830322266,-0.9909778237342834,3.0435099601745605,-86.01419830322266,-0.9909778237342834,3.0435099601745605,-86.01419830322266,-0.9909778237342834,3.0435099601745605,-86.01419830322266,-0.9909778237342834,3.0435099601745605,-86.01419830322266],\n \"normalized\": false\n },\n \"normal\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-0.5870956778526306,0.42651230096817017,0.6880449652671814,-0.5870956778526306,0.42651230096817017,0.6880449652671814,-0.5870956778526306,0.42651230096817017,0.6880449652671814,-0.5870956778526306,0.42651230096817017,0.6880449652671814,0.745985746383667,-0.033444374799728394,0.6651214957237244,0.745985746383667,-0.033444374799728394,0.6651214957237244,0.745985746383667,-0.033444374799728394,0.6651214957237244,0.745985746383667,-0.033444374799728394,0.6651214957237244,0.7662718892097473,0.00003863871097564697,0.6425164937973022,0.7662718892097473,0.00003863871097564697,0.6425164937973022,0.7662718892097473,0.00003863871097564697,0.6425164937973022,0.7662718892097473,0.00003863871097564697,0.6425164937973022,0.7256649732589722,0.000032261013984680176,0.6880481839179993,0.7256649732589722,0.000032261013984680176,0.6880481839179993,0.7256649732589722,0.000032261013984680176,0.6880481839179993,0.7256649732589722,0.000032261013984680176,0.6880481839179993,-0.5838431119918823,-0.4655483365058899,0.6651255488395691,-0.5838431119918823,-0.4655483365058899,0.6651255488395691,-0.5838431119918823,-0.4655483365058899,0.6651255488395691,-0.5838431119918823,-0.4655483365058899,0.6651255488395691,0.2623160779476166,-0.6991221904754639,0.6651454567909241,0.2623160779476166,-0.6991221904754639,0.6651454567909241,0.2623160779476166,-0.6991221904754639,0.6651454567909241,0.2623160779476166,-0.6991221904754639,0.6651454567909241,0.22423836588859558,-0.6901593208312988,0.6880385875701904,0.22423836588859558,-0.6901593208312988,0.6880385875701904,0.22423836588859558,-0.6901593208312988,0.6880385875701904,0.22423836588859558,-0.6901593208312988,0.6880385875701904,0.6199150085449219,-0.4504251182079315,-0.6425127983093262,0.6199150085449219,-0.4504251182079315,-0.6425127983093262,0.6199150085449219,-0.4504251182079315,-0.6425127983093262,0.6199150085449219,-0.4504251182079315,-0.6425127983093262,0.19871656596660614,0.7197921276092529,0.6651397347450256,0.19871656596660614,0.7197921276092529,0.6651397347450256,0.19871656596660614,0.7197921276092529,0.6651397347450256,0.19871656596660614,0.7197921276092529,0.6651397347450256,-0.26231205463409424,0.6991309523582458,-0.665137767791748,-0.26231205463409424,0.6991309523582458,-0.665137767791748,-0.26231205463409424,0.6991309523582458,-0.665137767791748,-0.26231205463409424,0.6991309523582458,-0.665137767791748,-0.6231518387794495,0.41137412190437317,0.6651715636253357,-0.6231518387794495,0.41137412190437317,0.6651715636253357,-0.6231518387794495,0.41137412190437317,0.6651715636253357,-0.6231518387794495,0.41137412190437317,0.6651715636253357,-0.583817720413208,0.46555060148239136,0.6651462912559509,-0.583817720413208,0.46555060148239136,0.6651462912559509,-0.583817720413208,0.46555060148239136,0.6651462912559509,-0.583817720413208,0.46555060148239136,0.6651462912559509,-0.23676739633083344,0.7287734746932983,-0.6425187587738037,-0.23676739633083344,0.7287734746932983,-0.6425187587738037,-0.23676739633083344,0.7287734746932983,-0.6425187587738037,-0.23676739633083344,0.7287734746932983,-0.6425187587738037,-0.6199446320533752,0.45038023591041565,0.6425155997276306,-0.6199446320533752,0.45038023591041565,0.6425155997276306,-0.6199446320533752,0.45038023591041565,0.6425155997276306,-0.6199446320533752,0.45038023591041565,0.6425155997276306,0.7459679841995239,0.03343930095434189,0.6651415824890137,0.7459679841995239,0.03343930095434189,0.6651415824890137,0.7459679841995239,0.03343930095434189,0.6651415824890137,0.7459679841995239,0.03343930095434189,0.6651415824890137,0.623174250125885,0.4114120602607727,-0.6651270389556885,0.623174250125885,0.4114120602607727,-0.6651270389556885,0.623174250125885,0.4114120602607727,-0.6651270389556885,0.623174250125885,0.4114120602607727,-0.6651270389556885,0.26233187317848206,0.6991434097290039,0.6651169061660767,0.26233187317848206,0.6991434097290039,0.6651169061660767,0.26233187317848206,0.6991434097290039,0.6651169061660767,0.26233187317848206,0.6991434097290039,0.6651169061660767,0.6199406385421753,0.45038270950317383,-0.6425178050994873,0.6199406385421753,0.45038270950317383,-0.6425178050994873,0.6199406385421753,0.45038270950317383,-0.6425178050994873,0.6199406385421753,0.45038270950317383,-0.6425178050994873,0.587073564529419,0.4265226125717163,-0.6880576610565186,0.587073564529419,0.4265226125717163,-0.6880576610565186,0.587073564529419,0.4265226125717163,-0.6880576610565186,0.587073564529419,0.4265226125717163,-0.6880576610565186,0.5838503241539001,0.4655469059944153,-0.6651202440261841,0.5838503241539001,0.4655469059944153,-0.6651202440261841,0.5838503241539001,0.4655469059944153,-0.6651202440261841,0.5838503241539001,0.4655469059944153,-0.6651202440261841,0.6231569647789001,-0.4114269018173218,-0.665134072303772,0.6231569647789001,-0.4114269018173218,-0.665134072303772,0.6231569647789001,-0.4114269018173218,-0.665134072303772,0.6231569647789001,-0.4114269018173218,-0.665134072303772,0.22424747049808502,0.6901424527168274,0.6880526542663574,0.22424747049808502,0.6901424527168274,0.6880526542663574,0.22424747049808502,0.6901424527168274,0.6880526542663574,0.22424747049808502,0.6901424527168274,0.6880526542663574,-0.2368125319480896,-0.7287622094154358,-0.6425150632858276,-0.2368125319480896,-0.7287622094154358,-0.6425150632858276,-0.2368125319480896,-0.7287622094154358,-0.6425150632858276,-0.2368125319480896,-0.7287622094154358,-0.6425150632858276,-0.2623360753059387,-0.6991369128227234,-0.6651220917701721,-0.2623360753059387,-0.6991369128227234,-0.6651220917701721,-0.2623360753059387,-0.6991369128227234,-0.6651220917701721,-0.2623360753059387,-0.6991369128227234,-0.6651220917701721,0.5870862603187561,-0.42650753259658813,-0.6880559921264648,0.5870862603187561,-0.42650753259658813,-0.6880559921264648,0.5870862603187561,-0.42650753259658813,-0.6880559921264648,0.5870862603187561,-0.42650753259658813,-0.6880559921264648,-0.19872358441352844,-0.7197949886322021,-0.6651346683502197,-0.19872358441352844,-0.7197949886322021,-0.6651346683502197,-0.19872358441352844,-0.7197949886322021,-0.6651346683502197,-0.19872358441352844,-0.7197949886322021,-0.6651346683502197,-0.623177170753479,-0.4114185571670532,0.6651203036308289,-0.623177170753479,-0.4114185571670532,0.6651203036308289,-0.623177170753479,-0.4114185571670532,0.6651203036308289,-0.623177170753479,-0.4114185571670532,0.6651203036308289,-0.6199068427085876,-0.45042937994003296,0.6425175666809082,-0.6199068427085876,-0.45042937994003296,0.6425175666809082,-0.6199068427085876,-0.45042937994003296,0.6425175666809082,-0.6199068427085876,-0.45042937994003296,0.6425175666809082,0.19873395562171936,-0.7197892069816589,0.6651378273963928,0.19873395562171936,-0.7197892069816589,0.6651378273963928,0.19873395562171936,-0.7197892069816589,0.6651378273963928,0.19873395562171936,-0.7197892069816589,0.6651378273963928,-0.5870490074157715,-0.42655661702156067,0.6880573630332947,-0.5870490074157715,-0.42655661702156067,0.6880573630332947,-0.5870490074157715,-0.42655661702156067,0.6880573630332947,-0.5870490074157715,-0.42655661702156067,0.6880573630332947,-0.7459824085235596,0.033452022820711136,-0.665124773979187,-0.7459824085235596,0.033452022820711136,-0.665124773979187,-0.7459824085235596,0.033452022820711136,-0.665124773979187,-0.7459824085235596,0.033452022820711136,-0.665124773979187,0.5838494300842285,-0.4655435383319855,-0.665123462677002,0.5838494300842285,-0.4655435383319855,-0.665123462677002,0.5838494300842285,-0.4655435383319855,-0.665123462677002,0.5838494300842285,-0.4655435383319855,-0.665123462677002,0.2367572784423828,0.7287806272506714,0.6425143480300903,0.2367572784423828,0.7287806272506714,0.6425143480300903,0.2367572784423828,0.7287806272506714,0.6425143480300903,0.2367572784423828,0.7287806272506714,0.6425143480300903,-0.1987278163433075,0.7197844982147217,-0.6651448011398315,-0.1987278163433075,0.7197844982147217,-0.6651448011398315,-0.1987278163433075,0.7197844982147217,-0.6651448011398315,-0.1987278163433075,0.7197844982147217,-0.6651448011398315,0.23682300746440887,-0.7287558913230896,0.6425182819366455,0.23682300746440887,-0.7287558913230896,0.6425182819366455,0.23682300746440887,-0.7287558913230896,0.6425182819366455,0.23682300746440887,-0.7287558913230896,0.6425182819366455,-0.7662706971168518,0.000020429491996765137,-0.6425180435180664,-0.7662706971168518,0.000020429491996765137,-0.6425180435180664,-0.7662706971168518,0.000020429491996765137,-0.6425180435180664,-0.7662706971168518,0.000020429491996765137,-0.6425180435180664,-0.7459728717803955,-0.03343328833580017,-0.6651365756988525,-0.7459728717803955,-0.03343328833580017,-0.6651365756988525,-0.7459728717803955,-0.03343328833580017,-0.6651365756988525,-0.7459728717803955,-0.03343328833580017,-0.6651365756988525,-0.22426503896713257,-0.6901455521583557,-0.6880438327789307,-0.22426503896713257,-0.6901455521583557,-0.6880438327789307,-0.22426503896713257,-0.6901455521583557,-0.6880438327789307,-0.22426503896713257,-0.6901455521583557,-0.6880438327789307,-0.7256579995155334,-0.00003316998481750488,-0.6880554556846619,-0.7256579995155334,-0.00003316998481750488,-0.6880554556846619,-0.7256579995155334,-0.00003316998481750488,-0.6880554556846619,-0.7256579995155334,-0.00003316998481750488,-0.6880554556846619,-0.22427412867546082,0.6901446580886841,-0.6880418658256531,-0.22427412867546082,0.6901446580886841,-0.6880418658256531,-0.22427412867546082,0.6901446580886841,-0.6880418658256531,-0.22427412867546082,0.6901446580886841,-0.6880418658256531],\n \"normalized\": false\n },\n \"uv\": {\n \"itemSize\": 2,\n \"type\": \"Float32Array\",\n \"array\": [0.1126541942358017,0.23340463638305664,0.15771642327308655,0.010170280933380127,0.1696747988462448,0.09594517946243286,0.37625399231910706,0.5020440220832825,0.09763339906930923,0.23340469598770142,0.17146287858486176,0.012006521224975586,0.24126237630844116,0.007275700569152832,0.7849239706993103,0.19342201948165894,0.18520936369895935,0.026231110095977783,0.19948936998844147,0.1231493353843689,0.24126237630844116,0.11555743217468262,0.8759239912033081,0.2386530041694641,0.05257079377770424,0.23340463638305664,0.09763336926698685,0.010167598724365234,0.1696747988462448,0.08392536640167236,0.8759239912033081,0.0006530284881591797,0.015100483782589436,0.23340469598770142,0.17080335319042206,0.06890475749969482,0.21341374516487122,0.23143154382705688,0.4681450128555298,0.19335603713989258,0.09020465612411499,0.23340463638305664,0.16530834138393402,0.016166627407073975,0.22733810544013977,0.11358428001403809,0.9650390148162842,0.44349002838134766,0.022529248148202896,0.010164380073547363,0.09020490944385529,0.010167598724365234,0.176739901304245,0.08622092008590698,0.8740389943122864,0.2507209777832031,0.17146287858486176,0.018639087677001953,0.22100581228733063,0.11555743217468262,0.23493003845214844,0.005302548408508301,0.6253309845924377,0.739175021648407,0.15028777718544006,0.23340463638305664,0.18520939350128174,0.018639087677001953,0.2412623167037964,0.23143154382705688,0.46857601404190063,0.4435969591140747,0.06016269698739052,0.010176539421081543,0.179232656955719,0.2314314842224121,0.18520936369895935,0.05468016862869263,0.5344629883766174,0.1933860182762146,0.11265438795089722,0.010173439979553223,0.16530834138393402,0.12512201070785522,0.18389028310775757,0.06890475749969482,0.46725401282310486,0.6948130130767822,0.15771642327308655,0.23340457677841187,0.1790548413991928,0.01447904109954834,0.1855650693178177,0.12512195110321045,0.28525400161743164,0.6948130130767822,0.17923292517662048,0.12314879894256592,0.18520939350128174,0.012006521224975586,0.2349299192428589,0.23340469598770142,0.6254630088806152,0.23861700296401978,0.1653086096048355,0.23340469598770142,0.18520936369895935,0.06131279468536377,0.1855650693178177,0.23340469598770142,0.37625399231910706,0.7400439977645874,0.05257079377770424,0.01016455888748169,0.17146287858486176,0.032863736152648926,0.19948936998844147,0.23143154382705688,0.9669240117073059,0.19342201948165894,0.14269573986530304,0.010170340538024902,0.18520936369895935,0.032863736152648926,0.19315698742866516,0.12512242794036865,0.21655499935150146,0.6933860182762146,0.04514260217547417,0.01016455888748169,0.16530832648277283,0.02870357036590576,0.21341368556022644,0.007275700569152832,0.2865760028362274,0.4435969591140747,0.12555499374866486,0.7386170029640198,0.17146287858486176,0.026231110095977783,0.1931571662425995,0.23340469598770142,0.2070813775062561,0.005302548408508301,0.12555499374866486,0.5006170272827148,0.12767508625984192,0.010170459747314453,0.14269573986530304,0.23340463638305664,0.16530832648277283,0.109546959400177,0.03455499932169914,0.6933860182762146,0.12767508625984192,0.23340463638305664,0.17146290838718414,0.040455639362335205,0.2070814073085785,0.11358422040939331,0.1352669894695282,0.010170340538024902,0.17905481159687042,0.028703629970550537,0.23493003845214844,0.11358428001403809,0.5343310236930847,0.693943977355957,0.04514192417263985,0.23340457677841187,0.1502876579761505,0.010170280933380127,0.16530834138393402,0.089935302734375,0.37757599353790283,0.2508280277252197,0.12430000305175781,0.48809099197387695,0.16530832648277283,0.07261902093887329,0.19948936998844147,0.11555695533752441,0.20708149671554565,0.23340469598770142,0.0301218219101429,0.23340463638305664,0.17146289348602295,0.06131279468536377,0.2070813775062561,0.1251225471496582,0.2153010070323944,0.4428600072860718,0.08261273801326752,0.23340463638305664,0.13526709377765656,0.23340463638305664,0.16967478394508362,0.11555695533752441,0.6253309845924377,0.5011749863624573,0.03330099955201149,0.4428600072860718,0.07518399506807327,0.010167300701141357,0.17905481159687042,0.042928099632263184,0.19948936998844147,0.007275700569152832,0.10522530972957611,0.010173439979553223,0.18389026820659637,0.07633346319198608,0.22100578248500824,0.23143154382705688,0.28614500164985657,0.19335603713989258,0.17146289348602295,0.05468016862869263,0.21341368556022644,0.12314939498901367,0.2210056483745575,0.1231493353843689,0.377144992351532,0.23858702182769775,0.02252865955233574,0.23340469598770142,0.17080335319042206,0.07633340358734131,0.19315703213214874,0.11358380317687988,0.7830389738082886,0.44349002838134766,0.015100372023880482,0.010164380073547363,0.10522563755512238,0.23340463638305664,0.1767398715019226,0.09364962577819824,0.377144992351532,0.0005869865417480469,0.0675920695066452,0.010176539421081543,0.17164073884487152,0.23143154382705688,0.17905481159687042,0.05884033441543579,0.7172229886054993,0.4428600072860718,0.08261273801326752,0.010167300701141357,0.18520936369895935,0.04708826541900635,0.2210056483745575,0.007276654243469238,0.7163310050964355,0.693943977355957,0.17146290838718414,0.04708826541900635,0.21341368556022644,0.11555737257003784,0.2412623167037964,0.12314939498901367,0.37757599353790283,0.48882800340652466,0.12024644762277603,0.23340463638305664,0.16530834138393402,0.044615745544433594,0.23493006825447083,0.1251225471496582,0.716463029384613,0.1933860182762146,0.18520936369895935,0.040455639362335205,0.19315698742866516,0.005302488803863525,0.22733810544013977,0.005303502082824707,0.8740389943122864,0.48872101306915283,0.17164073884487152,0.1231488585472107,0.17839525640010834,0.07261908054351807,0.2273380160331726,0.23340463638305664,0.6262230277061462,0.48809099197387695,0.037550006061792374,0.23340463638305664,0.16530834138393402,0.057152748107910156,0.2273380160331726,0.12512242794036865,0.5352230072021484,0.4428600072860718,0.030121158808469772,0.010164439678192139,0.07518427819013596,0.23340463638305664,0.12430000305175781,0.25009095668792725,0.176739901304245,0.11326134204864502,0.037550006061792374,0.010164439678192139,0.0675920695066452,0.23340457677841187,0.176739901304245,0.10583275556564331,0.6262230277061462,0.25009095668792725,0.06016361340880394,0.23340463638305664,0.12024631351232529,0.010170459747314453,0.16967478394508362,0.10353708267211914,0.6254630088806152,0.0006170272827148438],\n \"normalized\": false\n },\n \"color\": {\n \"itemSize\": 4,\n \"type\": \"Uint16Array\",\n \"array\": [65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535,65535],\n \"normalized\": true\n }\n },\n \"index\": {\n \"type\": \"Uint16Array\",\n \"array\": [23,115,139,123,147,143,19,107,111,35,67,131,59,7,11,95,100,88,63,76,68,135,39,51,127,83,31,4,25,20,82,6,30,97,60,80,62,58,9,22,126,29,94,18,109,37,46,48,0,104,117,44,85,32,66,79,129,124,149,96,114,103,137,156,120,36,146,106,142,24,16,112,34,134,50,152,92,144,77,157,132,41,121,140,102,125,136,5,21,28,61,8,81,69,65,57,78,133,128,45,33,49,53,38,122,42,141,105,93,108,145,89,113,17,98,151,154,43,47,55,12,64,84,86,118,26,23,27,115,123,155,147,19,119,107,35,87,67,59,15,7,95,150,100,63,72,76,135,159,39,127,99,83,4,13,25,82,10,6,97,74,60,62,70,58,22,138,126,94,91,18,37,54,46,0,40,104,44,1,85,66,71,79,124,101,149,114,90,103,156,153,120,146,110,106,24,116,16,34,130,134,152,148,92,77,73,157,41,52,121,158,75,154,75,98,154,43,3,47,12,56,64,26,14,86,86,2,118]\n },\n \"boundingSphere\": {\n \"center\": [0,-0.006313323974609375,0],\n \"radius\": 148.14155442794186\n }\n },\n faceValues: [1, 2, 5, 10, 7, 4, 3, 8, 9, 6],\n rotationCombinations: {\n \"1,2\": [180, 0, 36],\n \"1,3\": [0, 0, -144],\n \"1,4\": [-180, 0, -108],\n \"1,5\": [0, 0, 144],\n \"1,6\": [180, 0, -36],\n \"1,7\": [0, 0, -72],\n \"1,8\": [180, 0, 108],\n \"1,9\": [0, 0, 72],\n \"1,10\": [-180, 0, 180],\n \"2,3\": [180, 0, -108],\n \"2,4\": [0, 0, -144],\n \"2,5\": [-180, 0, -180],\n \"2,6\": [0, 0, -72],\n \"2,7\": [180, 0, -36],\n \"2,8\": [0, 0, 72],\n \"2,9\": [-180, 0, 108],\n \"2,10\": [0, 0, 144],\n \"3,4\": [-180, 0, 108],\n \"3,5\": [0, 0, -72],\n \"3,6\": [-180, 0, 180],\n \"3,7\": [0, 0, 72],\n \"3,8\": [180, 0, -36],\n \"3,9\": [0, 0, -144],\n \"3,10\": [180, 0, 36],\n \"4,5\": [180, 0, 36],\n \"4,6\": [0, 0, 72],\n \"4,7\": [-180, 0, -180],\n \"4,8\": [0, 0, -144],\n \"4,9\": [180, 0, -36],\n \"4,10\": [0, 0, -72],\n \"5,6\": [180, 0, 108],\n \"5,7\": [0, 0, 144],\n \"5,8\": [-180, 0, -108],\n \"5,9\": [0, 0, -72],\n \"5,10\": [180, 0, -36],\n \"6,7\": [180, 0, -108],\n \"6,8\": [0, 0, 144],\n \"6,9\": [-180, 0, 36],\n \"6,10\": [0, 0, -144],\n \"7,8\": [180, 0, 36],\n \"7,9\": [0, 0, 144],\n \"7,10\": [-180, 0, 108],\n \"8,9\": [-180, 0, 180],\n \"8,10\": [0, 0, 72],\n \"9,10\": [180, 0, -108]\n\n }\n },\n \"d12\": {\n \"metadata\": {\n \"version\": 4.5,\n \"type\": \"BufferGeometry\",\n \"generator\": \"BufferGeometry.toJSON\"\n },\n \"uuid\": \"04389FAB-5CCD-4FEC-B604-C19AD1000B1C\",\n \"type\": \"BufferGeometry\",\n \"data\": {\n \"attributes\": {\n \"position\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-31.141719818115234, 83.4803466796875, -1.2052193880081177, -31.141719818115234, 83.4803466796875, -1.2052193880081177, -31.141719818115234, 83.4803466796875, -1.2052193880081177, -31.141719818115234, 83.4803466796875, -1.2052193880081177, 83.48023223876953, -1.2053337097167969, -31.14202308654785, 83.48023223876953, -1.2053337097167969, -31.14202308654785, 83.48023223876953, -1.2053337097167969, -31.14202308654785, 83.48023223876953, -1.2053337097167969, -31.14202308654785, 83.48045349121094, -1.2053337097167969, 31.141408920288086, 83.48045349121094, -1.2053337097167969, 31.141408920288086, 83.48045349121094, -1.2053337097167969, 31.141408920288086, 83.48045349121094, -1.2053337097167969, 31.141408920288086, -82.73528289794922, 0, 33.09229278564453, -82.73528289794922, 0, 33.09229278564453, -82.73528289794922, 0, 33.09229278564453, -82.73528289794922, 0, 33.09229278564453, 51.59387969970703, 50.38835906982422, 52.338436126708984, 51.59387969970703, 50.38835906982422, 52.338436126708984, 51.59387969970703, 50.38835906982422, 52.338436126708984, 51.59387969970703, 50.38835906982422, 52.338436126708984, 50.3885498046875, 52.338626861572266, 51.593505859375, 50.3885498046875, 52.338626861572266, 51.593505859375, 50.3885498046875, 52.338626861572266, 51.593505859375, 50.3885498046875, 52.338626861572266, 51.593505859375, -31.141712188720703, 83.4803466796875, 1.2054481506347656, -31.141712188720703, 83.4803466796875, 1.2054481506347656, -31.141712188720703, 83.4803466796875, 1.2054481506347656, -31.141712188720703, 83.4803466796875, 1.2054481506347656, 83.48023223876953, 1.2053337097167969, -31.14202308654785, 83.48023223876953, 1.2053337097167969, -31.14202308654785, 83.48023223876953, 1.2053337097167969, -31.14202308654785, 83.48023223876953, 1.2053337097167969, -31.14202308654785, -83.48045349121094, -1.2053337097167969, -31.141408920288086, -83.48045349121094, -1.2053337097167969, -31.141408920288086, -83.48045349121094, -1.2053337097167969, -31.141408920288086, -83.48045349121094, -1.2053337097167969, -31.141408920288086, -51.59387969970703, -50.38835906982422, -52.338436126708984, -51.59387969970703, -50.38835906982422, -52.338436126708984, -51.59387969970703, -50.38835906982422, -52.338436126708984, -51.59387969970703, -50.38835906982422, -52.338436126708984, -1.205640435218811, 31.14171600341797, -83.48033142089844, -1.205640435218811, 31.14171600341797, -83.48033142089844, -1.205640435218811, 31.14171600341797, -83.48033142089844, -1.205640435218811, 31.14171600341797, -83.48033142089844, -1.205640435218811, -31.14171600341797, -83.48033142089844, -1.205640435218811, -31.14171600341797, -83.48033142089844, -1.205640435218811, -31.14171600341797, -83.48033142089844, -1.205640435218811, -31.14171600341797, -83.48033142089844, 1.2050271034240723, 31.14171600341797, -83.48035430908203, 1.2050271034240723, 31.14171600341797, -83.48035430908203, 1.2050271034240723, 31.14171600341797, -83.48035430908203, 1.2050271034240723, 31.14171600341797, -83.48035430908203, -83.48045349121094, 1.2053337097167969, -31.141408920288086, -83.48045349121094, 1.2053337097167969, -31.141408920288086, -83.48045349121094, 1.2053337097167969, -31.141408920288086, -83.48045349121094, 1.2053337097167969, -31.141408920288086, -83.48023223876953, 1.2053337097167969, 31.14202308654785, -83.48023223876953, 1.2053337097167969, 31.14202308654785, -83.48023223876953, 1.2053337097167969, 31.14202308654785, -83.48023223876953, 1.2053337097167969, 31.14202308654785, -50.38816833496094, -52.338626861572266, 51.593875885009766, -50.38816833496094, -52.338626861572266, 51.593875885009766, -50.38816833496094, -52.338626861572266, 51.593875885009766, -50.38816833496094, -52.338626861572266, 51.593875885009766, 31.141712188720703, 83.4803466796875, -1.2054481506347656, 31.141712188720703, 83.4803466796875, -1.2054481506347656, 31.141712188720703, 83.4803466796875, -1.2054481506347656, 31.141712188720703, 83.4803466796875, -1.2054481506347656, -50.3885498046875, 52.338626861572266, -51.593505859375, -50.3885498046875, 52.338626861572266, -51.593505859375, -50.3885498046875, 52.338626861572266, -51.593505859375, -50.3885498046875, 52.338626861572266, -51.593505859375, 50.38816833496094, 52.338626861572266, -51.593875885009766, 50.38816833496094, 52.338626861572266, -51.593875885009766, 50.38816833496094, 52.338626861572266, -51.593875885009766, 50.38816833496094, 52.338626861572266, -51.593875885009766, -0.000303904089378193, 33.09198760986328, -82.73540496826172, -0.000303904089378193, 33.09198760986328, -82.73540496826172, -0.000303904089378193, 33.09198760986328, -82.73540496826172, -0.000303904089378193, 33.09198760986328, -82.73540496826172, 82.73552703857422, 0, 33.0916862487793, 82.73552703857422, 0, 33.0916862487793, 82.73552703857422, 0, 33.0916862487793, 82.73552703857422, 0, 33.0916862487793, 52.338809967041016, -51.59368896484375, 50.38816833496094, 52.338809967041016, -51.59368896484375, 50.38816833496094, 52.338809967041016, -51.59368896484375, 50.38816833496094, 52.338809967041016, -51.59368896484375, 50.38816833496094, 83.48045349121094, 1.2053337097167969, 31.141408920288086, 83.48045349121094, 1.2053337097167969, 31.141408920288086, 83.48045349121094, 1.2053337097167969, 31.141408920288086, 83.48045349121094, 1.2053337097167969, 31.141408920288086, 52.33843994140625, -51.59368896484375, -50.3885498046875, 52.33843994140625, -51.59368896484375, -50.3885498046875, 52.33843994140625, -51.59368896484375, -50.3885498046875, 52.33843994140625, -51.59368896484375, -50.3885498046875, 51.593502044677734, -50.38835906982422, -52.33881759643555, 51.593502044677734, -50.38835906982422, -52.33881759643555, 51.593502044677734, -50.38835906982422, -52.33881759643555, 51.593502044677734, -50.38835906982422, -52.33881759643555, 82.73528289794922, 0, -33.09229278564453, 82.73528289794922, 0, -33.09229278564453, 82.73528289794922, 0, -33.09229278564453, 82.73528289794922, 0, -33.09229278564453, 33.09198760986328, -82.73540496826172, -0.00012155366130173206, 33.09198760986328, -82.73540496826172, -0.00012155366130173206, 33.09198760986328, -82.73540496826172, -0.00012155366130173206, 33.09198760986328, -82.73540496826172, -0.00012155366130173206, -1.2050271034240723, -31.14171600341797, 83.48035430908203, -1.2050271034240723, -31.14171600341797, 83.48035430908203, -1.2050271034240723, -31.14171600341797, 83.48035430908203, -1.2050271034240723, -31.14171600341797, 83.48035430908203, -1.2050271034240723, 31.14171600341797, 83.48035430908203, -1.2050271034240723, 31.14171600341797, 83.48035430908203, -1.2050271034240723, 31.14171600341797, 83.48035430908203, -1.2050271034240723, 31.14171600341797, 83.48035430908203, -52.33843994140625, -51.59368896484375, 50.3885498046875, -52.33843994140625, -51.59368896484375, 50.3885498046875, -52.33843994140625, -51.59368896484375, 50.3885498046875, -52.33843994140625, -51.59368896484375, 50.3885498046875, -51.593502044677734, -50.38835906982422, 52.33881759643555, -51.593502044677734, -50.38835906982422, 52.33881759643555, -51.593502044677734, -50.38835906982422, 52.33881759643555, -51.593502044677734, -50.38835906982422, 52.33881759643555, -51.593502044677734, 50.38835906982422, 52.33881759643555, -51.593502044677734, 50.38835906982422, 52.33881759643555, -51.593502044677734, 50.38835906982422, 52.33881759643555, -51.593502044677734, 50.38835906982422, 52.33881759643555, -52.33843994140625, 51.59368896484375, 50.3885498046875, -52.33843994140625, 51.59368896484375, 50.3885498046875, -52.33843994140625, 51.59368896484375, 50.3885498046875, -52.33843994140625, 51.59368896484375, 50.3885498046875, 0.000303904089378193, 33.09198760986328, 82.73540496826172, 0.000303904089378193, 33.09198760986328, 82.73540496826172, 0.000303904089378193, 33.09198760986328, 82.73540496826172, 0.000303904089378193, 33.09198760986328, 82.73540496826172, 52.338809967041016, 51.59368896484375, 50.38816833496094, 52.338809967041016, 51.59368896484375, 50.38816833496094, 52.338809967041016, 51.59368896484375, 50.38816833496094, 52.338809967041016, 51.59368896484375, 50.38816833496094, 1.205640435218811, -31.14171600341797, 83.48033142089844, 1.205640435218811, -31.14171600341797, 83.48033142089844, 1.205640435218811, -31.14171600341797, 83.48033142089844, 1.205640435218811, -31.14171600341797, 83.48033142089844, -33.09198760986328, 82.73540496826172, 0.00012155366130173206, -33.09198760986328, 82.73540496826172, 0.00012155366130173206, -33.09198760986328, 82.73540496826172, 0.00012155366130173206, -33.09198760986328, 82.73540496826172, 0.00012155366130173206, -50.38816833496094, 52.338626861572266, 51.593875885009766, -50.38816833496094, 52.338626861572266, 51.593875885009766, -50.38816833496094, 52.338626861572266, 51.593875885009766, -50.38816833496094, 52.338626861572266, 51.593875885009766, 51.593502044677734, 50.38835906982422, -52.33881759643555, 51.593502044677734, 50.38835906982422, -52.33881759643555, 51.593502044677734, 50.38835906982422, -52.33881759643555, 51.593502044677734, 50.38835906982422, -52.33881759643555, -52.338809967041016, -51.59368896484375, -50.38816833496094, -52.338809967041016, -51.59368896484375, -50.38816833496094, -52.338809967041016, -51.59368896484375, -50.38816833496094, -52.338809967041016, -51.59368896484375, -50.38816833496094, -33.09198760986328, -82.73540496826172, 0.00012155366130173206, -33.09198760986328, -82.73540496826172, 0.00012155366130173206, -33.09198760986328, -82.73540496826172, 0.00012155366130173206, -33.09198760986328, -82.73540496826172, 0.00012155366130173206, -83.48023223876953, -1.2053337097167969, 31.14202308654785, -83.48023223876953, -1.2053337097167969, 31.14202308654785, -83.48023223876953, -1.2053337097167969, 31.14202308654785, -83.48023223876953, -1.2053337097167969, 31.14202308654785, -50.3885498046875, -52.338626861572266, -51.593505859375, -50.3885498046875, -52.338626861572266, -51.593505859375, -50.3885498046875, -52.338626861572266, -51.593505859375, -50.3885498046875, -52.338626861572266, -51.593505859375, -0.000303904089378193, -33.09198760986328, -82.73540496826172, -0.000303904089378193, -33.09198760986328, -82.73540496826172, -0.000303904089378193, -33.09198760986328, -82.73540496826172, -0.000303904089378193, -33.09198760986328, -82.73540496826172, 50.38816833496094, -52.338626861572266, -51.593875885009766, 50.38816833496094, -52.338626861572266, -51.593875885009766, 50.38816833496094, -52.338626861572266, -51.593875885009766, 50.38816833496094, -52.338626861572266, -51.593875885009766, 31.141719818115234, -83.4803466796875, 1.2052193880081177, 31.141719818115234, -83.4803466796875, 1.2052193880081177, 31.141719818115234, -83.4803466796875, 1.2052193880081177, 31.141719818115234, -83.4803466796875, 1.2052193880081177, -31.141719818115234, -83.4803466796875, -1.2052193880081177, -31.141719818115234, -83.4803466796875, -1.2052193880081177, -31.141719818115234, -83.4803466796875, -1.2052193880081177, -31.141719818115234, -83.4803466796875, -1.2052193880081177, 1.2050271034240723, -31.14171600341797, -83.48035430908203, 1.2050271034240723, -31.14171600341797, -83.48035430908203, 1.2050271034240723, -31.14171600341797, -83.48035430908203, 1.2050271034240723, -31.14171600341797, -83.48035430908203, -52.338809967041016, 51.59368896484375, -50.38816833496094, -52.338809967041016, 51.59368896484375, -50.38816833496094, -52.338809967041016, 51.59368896484375, -50.38816833496094, -52.338809967041016, 51.59368896484375, -50.38816833496094, -31.141712188720703, -83.4803466796875, 1.2054481506347656, -31.141712188720703, -83.4803466796875, 1.2054481506347656, -31.141712188720703, -83.4803466796875, 1.2054481506347656, -31.141712188720703, -83.4803466796875, 1.2054481506347656, 31.141719818115234, 83.4803466796875, 1.2052193880081177, 31.141719818115234, 83.4803466796875, 1.2052193880081177, 31.141719818115234, 83.4803466796875, 1.2052193880081177, 31.141719818115234, 83.4803466796875, 1.2052193880081177, 33.09198760986328, 82.73540496826172, -0.00012155366130173206, 33.09198760986328, 82.73540496826172, -0.00012155366130173206, 33.09198760986328, 82.73540496826172, -0.00012155366130173206, 33.09198760986328, 82.73540496826172, -0.00012155366130173206, 31.141712188720703, -83.4803466796875, -1.2054481506347656, 31.141712188720703, -83.4803466796875, -1.2054481506347656, 31.141712188720703, -83.4803466796875, -1.2054481506347656, 31.141712188720703, -83.4803466796875, -1.2054481506347656, 1.205640435218811, 31.14171600341797, 83.48033142089844, 1.205640435218811, 31.14171600341797, 83.48033142089844, 1.205640435218811, 31.14171600341797, 83.48033142089844, 1.205640435218811, 31.14171600341797, 83.48033142089844, 0.000303904089378193, -33.09198760986328, 82.73540496826172, 0.000303904089378193, -33.09198760986328, 82.73540496826172, 0.000303904089378193, -33.09198760986328, 82.73540496826172, 0.000303904089378193, -33.09198760986328, 82.73540496826172, -82.73552703857422, 0, -33.0916862487793, -82.73552703857422, 0, -33.0916862487793, -82.73552703857422, 0, -33.0916862487793, -82.73552703857422, 0, -33.0916862487793, -51.59387969970703, 50.38835906982422, -52.338436126708984, -51.59387969970703, 50.38835906982422, -52.338436126708984, -51.59387969970703, 50.38835906982422, -52.338436126708984, -51.59387969970703, 50.38835906982422, -52.338436126708984, 52.33843994140625, 51.59368896484375, -50.3885498046875, 52.33843994140625, 51.59368896484375, -50.3885498046875, 52.33843994140625, 51.59368896484375, -50.3885498046875, 52.33843994140625, 51.59368896484375, -50.3885498046875, 51.59387969970703, -50.38835906982422, 52.338436126708984, 51.59387969970703, -50.38835906982422, 52.338436126708984, 51.59387969970703, -50.38835906982422, 52.338436126708984, 51.59387969970703, -50.38835906982422, 52.338436126708984, 50.3885498046875, -52.338626861572266, 51.593505859375, 50.3885498046875, -52.338626861572266, 51.593505859375, 50.3885498046875, -52.338626861572266, 51.593505859375, 50.3885498046875, -52.338626861572266, 51.593505859375],\n \"normalized\": false\n },\n \"normal\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-0.010959841310977936, 0.8584385514259338, -0.5127993226051331, -0.010959841310977936, 0.8584385514259338, -0.5127993226051331, -0.010959841310977936, 0.8584385514259338, -0.5127993226051331, -0.010959841310977936, 0.8584385514259338, -0.5127993226051331, 0.8584375977516174, -0.5128011703491211, -0.010949048213660717, 0.8584375977516174, -0.5128011703491211, -0.010949048213660717, 0.8584375977516174, -0.5128011703491211, -0.010949048213660717, 0.8584375977516174, -0.5128011703491211, -0.010949048213660717, 0.8584346175193787, -0.5128057599067688, 0.010964557528495789, 0.8584346175193787, -0.5128057599067688, 0.010964557528495789, 0.8584346175193787, -0.5128057599067688, 0.010964557528495789, 0.8584346175193787, -0.5128057599067688, 0.010964557528495789, -0.5414749979972839, -0.00002707540988922119, 0.8407168388366699, -0.5414749979972839, -0.00002707540988922119, 0.8407168388366699, -0.5414749979972839, -0.00002707540988922119, 0.8407168388366699, -0.5414749979972839, -0.00002707540988922119, 0.8407168388366699, 0.5305333137512207, 0.017743051052093506, 0.8474783301353455, 0.5305333137512207, 0.017743051052093506, 0.8474783301353455, 0.5305333137512207, 0.017743051052093506, 0.8474783301353455, 0.5305333137512207, 0.017743051052093506, 0.8474783301353455, 0.01774728298187256, 0.8474791646003723, 0.5305318236351013, 0.01774728298187256, 0.8474791646003723, 0.5305318236351013, 0.01774728298187256, 0.8474791646003723, 0.5305318236351013, 0.01774728298187256, 0.8474791646003723, 0.5305318236351013, -0.010942935943603516, 0.8584372997283936, 0.5128018856048584, -0.010942935943603516, 0.8584372997283936, 0.5128018856048584, -0.010942935943603516, 0.8584372997283936, 0.5128018856048584, -0.010942935943603516, 0.8584372997283936, 0.5128018856048584, 0.8584451079368591, 0.5127884149551392, -0.01095967274159193, 0.8584451079368591, 0.5127884149551392, -0.01095967274159193, 0.8584451079368591, 0.5127884149551392, -0.01095967274159193, 0.8584451079368591, 0.5127884149551392, -0.01095967274159193, -0.8584290742874146, -0.512814462184906, -0.010995045304298401, -0.8584290742874146, -0.512814462184906, -0.010995045304298401, -0.8584290742874146, -0.512814462184906, -0.010995045304298401, -0.8584290742874146, -0.512814462184906, -0.010995045304298401, -0.5305572152137756, -0.017733842134475708, -0.8474634885787964, -0.5305572152137756, -0.017733842134475708, -0.8474634885787964, -0.5305572152137756, -0.017733842134475708, -0.8474634885787964, -0.5305572152137756, -0.017733842134475708, -0.8474634885787964, -0.5128048658370972, 0.010960124433040619, -0.8584352135658264, -0.5128048658370972, 0.010960124433040619, -0.8584352135658264, -0.5128048658370972, 0.010960124433040619, -0.8584352135658264, -0.5128048658370972, 0.010960124433040619, -0.8584352135658264, -0.5128147006034851, -0.010991238057613373, -0.858428955078125, -0.5128147006034851, -0.010991238057613373, -0.858428955078125, -0.5128147006034851, -0.010991238057613373, -0.858428955078125, -0.5128147006034851, -0.010991238057613373, -0.858428955078125, 0.5127923488616943, 0.010975174605846405, -0.8584426045417786, 0.5127923488616943, 0.010975174605846405, -0.8584426045417786, 0.5127923488616943, 0.010975174605846405, -0.8584426045417786, 0.5127923488616943, 0.010975174605846405, -0.8584426045417786, -0.8584410548210144, 0.512795627117157, -0.010933354496955872, -0.8584410548210144, 0.512795627117157, -0.010933354496955872, -0.8584410548210144, 0.512795627117157, -0.010933354496955872, -0.8584410548210144, 0.512795627117157, -0.010933354496955872, -0.8584320545196533, 0.5128099322319031, 0.01097819209098816, -0.8584320545196533, 0.5128099322319031, 0.01097819209098816, -0.8584320545196533, 0.5128099322319031, 0.01097819209098816, -0.8584320545196533, 0.5128099322319031, 0.01097819209098816, -0.01773303747177124, -0.8474655151367188, 0.5305542349815369, -0.01773303747177124, -0.8474655151367188, 0.5305542349815369, -0.01773303747177124, -0.8474655151367188, 0.5305542349815369, -0.01773303747177124, -0.8474655151367188, 0.5305542349815369, 0.010984241962432861, 0.8584214448928833, -0.5128273963928223, 0.010984241962432861, 0.8584214448928833, -0.5128273963928223, 0.010984241962432861, 0.8584214448928833, -0.5128273963928223, 0.010984241962432861, 0.8584214448928833, -0.5128273963928223, -0.017747551202774048, 0.847478985786438, -0.5305322408676147, -0.017747551202774048, 0.847478985786438, -0.5305322408676147, -0.017747551202774048, 0.847478985786438, -0.5305322408676147, -0.017747551202774048, 0.847478985786438, -0.5305322408676147, 0.017701515927910805, 0.8474764823913574, -0.5305377244949341, 0.017701515927910805, 0.8474764823913574, -0.5305377244949341, 0.017701515927910805, 0.8474764823913574, -0.5305377244949341, 0.017701515927910805, 0.8474764823913574, -0.5305377244949341, -0.00002969801425933838, 0.840691328048706, -0.54151451587677, -0.00002969801425933838, 0.840691328048706, -0.54151451587677, -0.00002969801425933838, 0.840691328048706, -0.54151451587677, -0.00002969801425933838, 0.840691328048706, -0.54151451587677, 0.5415211915969849, 0.000026792287826538086, 0.840687096118927, 0.5415211915969849, 0.000026792287826538086, 0.840687096118927, 0.5415211915969849, 0.000026792287826538086, 0.840687096118927, 0.5415211915969849, 0.000026792287826538086, 0.840687096118927, 0.8474524617195129, -0.5305749177932739, 0.01773586869239807, 0.8474524617195129, -0.5305749177932739, 0.01773586869239807, 0.8474524617195129, -0.5305749177932739, 0.01773586869239807, 0.8474524617195129, -0.5305749177932739, 0.01773586869239807, 0.8584384322166443, 0.5127996206283569, 0.010955426841974258, 0.8584384322166443, 0.5127996206283569, 0.010955426841974258, 0.8584384322166443, 0.5127996206283569, 0.010955426841974258, 0.8584384322166443, 0.5127996206283569, 0.010955426841974258, 0.8474904298782349, -0.530514657497406, -0.01772182434797287, 0.8474904298782349, -0.530514657497406, -0.01772182434797287, 0.8474904298782349, -0.530514657497406, -0.01772182434797287, 0.8474904298782349, -0.530514657497406, -0.01772182434797287, 0.5305161476135254, -0.017740633338689804, -0.8474891185760498, 0.5305161476135254, -0.017740633338689804, -0.8474891185760498, 0.5305161476135254, -0.017740633338689804, -0.8474891185760498, 0.5305161476135254, -0.017740633338689804, -0.8474891185760498, 0.5414748787879944, -0.000005863606929779053, -0.8407169580459595, 0.5414748787879944, -0.000005863606929779053, -0.8407169580459595, 0.5414748787879944, -0.000005863606929779053, -0.8407169580459595, 0.5414748787879944, -0.000005863606929779053, -0.8407169580459595, 0.8406915068626404, -0.5415142774581909, -0.00000934302806854248, 0.8406915068626404, -0.5415142774581909, -0.00000934302806854248, 0.8406915068626404, -0.5415142774581909, -0.00000934302806854248, 0.8406915068626404, -0.5415142774581909, -0.00000934302806854248, -0.5128104090690613, -0.01098555326461792, 0.8584316372871399, -0.5128104090690613, -0.01098555326461792, 0.8584316372871399, -0.5128104090690613, -0.01098555326461792, 0.8584316372871399, -0.5128104090690613, -0.01098555326461792, 0.8584316372871399, -0.5128028988838196, 0.010992184281349182, 0.858436107635498, -0.5128028988838196, 0.010992184281349182, 0.858436107635498, -0.5128028988838196, 0.010992184281349182, 0.858436107635498, -0.5128028988838196, 0.010992184281349182, 0.858436107635498, -0.8474770188331604, -0.5305349826812744, 0.017758265137672424, -0.8474770188331604, -0.5305349826812744, 0.017758265137672424, -0.8474770188331604, -0.5305349826812744, 0.017758265137672424, -0.8474770188331604, -0.5305349826812744, 0.017758265137672424, -0.5305088758468628, -0.017743252217769623, 0.8474936485290527, -0.5305088758468628, -0.017743252217769623, 0.8474936485290527, -0.5305088758468628, -0.017743252217769623, 0.8474936485290527, -0.5305088758468628, -0.017743252217769623, 0.8474936485290527, -0.5305161476135254, 0.017740704119205475, 0.8474891781806946, -0.5305161476135254, 0.017740704119205475, 0.8474891781806946, -0.5305161476135254, 0.017740704119205475, 0.8474891781806946, -0.5305161476135254, 0.017740704119205475, 0.8474891781806946, -0.8474623560905457, 0.5305585861206055, 0.01774775981903076, -0.8474623560905457, 0.5305585861206055, 0.01774775981903076, -0.8474623560905457, 0.5305585861206055, 0.01774775981903076, -0.8474623560905457, 0.5305585861206055, 0.01774775981903076, 0.000029221177101135254, 0.8406913876533508, 0.5415146350860596, 0.000029221177101135254, 0.8406913876533508, 0.5415146350860596, 0.000029221177101135254, 0.8406913876533508, 0.5415146350860596, 0.000029221177101135254, 0.8406913876533508, 0.5415146350860596, 0.8474631309509277, 0.5305578112602234, 0.017742618918418884, 0.8474631309509277, 0.5305578112602234, 0.017742618918418884, 0.8474631309509277, 0.5305578112602234, 0.017742618918418884, 0.8474631309509277, 0.5305578112602234, 0.017742618918418884, 0.5128002166748047, -0.010964479297399521, 0.8584378957748413, 0.5128002166748047, -0.010964479297399521, 0.8584378957748413, 0.5128002166748047, -0.010964479297399521, 0.8584378957748413, 0.5128002166748047, -0.010964479297399521, 0.8584378957748413, -0.8407147526741028, 0.5414782166481018, 0.000009499490261077881, -0.8407147526741028, 0.5414782166481018, 0.000009499490261077881, -0.8407147526741028, 0.5414782166481018, 0.000009499490261077881, -0.8407147526741028, 0.5414782166481018, 0.000009499490261077881, -0.017701396718621254, 0.847476601600647, 0.530537486076355, -0.017701396718621254, 0.847476601600647, 0.530537486076355, -0.017701396718621254, 0.847476601600647, 0.530537486076355, -0.017701396718621254, 0.847476601600647, 0.530537486076355, 0.5305255055427551, 0.01773667335510254, -0.8474833369255066, 0.5305255055427551, 0.01773667335510254, -0.8474833369255066, 0.5305255055427551, 0.01773667335510254, -0.8474833369255066, 0.5305255055427551, 0.01773667335510254, -0.8474833369255066, -0.8474682569503784, -0.5305496454238892, -0.017742810770869255, -0.8474682569503784, -0.5305496454238892, -0.017742810770869255, -0.8474682569503784, -0.5305496454238892, -0.017742810770869255, -0.8474682569503784, -0.5305496454238892, -0.017742810770869255, -0.8406901359558105, -0.5415164232254028, 0.00003986060619354248, -0.8406901359558105, -0.5415164232254028, 0.00003986060619354248, -0.8406901359558105, -0.5415164232254028, 0.00003986060619354248, -0.8406901359558105, -0.5415164232254028, 0.00003986060619354248, -0.858434796333313, -0.5128055810928345, 0.010956216603517532, -0.858434796333313, -0.5128055810928345, 0.010956216603517532, -0.858434796333313, -0.5128055810928345, 0.010956216603517532, -0.858434796333313, -0.5128055810928345, 0.010956216603517532, -0.017747780308127403, -0.8474676012992859, -0.530550479888916, -0.017747780308127403, -0.8474676012992859, -0.530550479888916, -0.017747780308127403, -0.8474676012992859, -0.530550479888916, -0.017747780308127403, -0.8474676012992859, -0.530550479888916, 0.000033095479011535645, -0.8406911492347717, -0.5415149331092834, 0.000033095479011535645, -0.8406911492347717, -0.5415149331092834, 0.000033095479011535645, -0.8406911492347717, -0.5415149331092834, 0.000033095479011535645, -0.8406911492347717, -0.5415149331092834, 0.017742261290550232, -0.8474804759025574, -0.5305300354957581, 0.017742261290550232, -0.8474804759025574, -0.5305300354957581, 0.017742261290550232, -0.8474804759025574, -0.5305300354957581, 0.017742261290550232, -0.8474804759025574, -0.5305300354957581, 0.010982692241668701, -0.8584359288215637, 0.5128030776977539, 0.010982692241668701, -0.8584359288215637, 0.5128030776977539, 0.010982692241668701, -0.8584359288215637, 0.5128030776977539, 0.010982692241668701, -0.8584359288215637, 0.5128030776977539, -0.011000136844813824, -0.8584293127059937, -0.512813925743103, -0.011000136844813824, -0.8584293127059937, -0.512813925743103, -0.011000136844813824, -0.8584293127059937, -0.512813925743103, -0.011000136844813824, -0.8584293127059937, -0.512813925743103, 0.5127899050712585, -0.010951489210128784, -0.858444333076477, 0.5127899050712585, -0.010951489210128784, -0.858444333076477, 0.5127899050712585, -0.010951489210128784, -0.858444333076477, 0.5127899050712585, -0.010951489210128784, -0.858444333076477, -0.8474836945533752, 0.530524492263794, -0.017755359411239624, -0.8474836945533752, 0.530524492263794, -0.017755359411239624, -0.8474836945533752, 0.530524492263794, -0.017755359411239624, -0.8474836945533752, 0.530524492263794, -0.017755359411239624, -0.010949179530143738, -0.8584410548210144, 0.5127953290939331, -0.010949179530143738, -0.8584410548210144, 0.5127953290939331, -0.010949179530143738, -0.8584410548210144, 0.5127953290939331, -0.010949179530143738, -0.8584410548210144, 0.5127953290939331, 0.010959796607494354, 0.8584384918212891, 0.5127993226051331, 0.010959796607494354, 0.8584384918212891, 0.5127993226051331, 0.010959796607494354, 0.8584384918212891, 0.5127993226051331, 0.010959796607494354, 0.8584384918212891, 0.5127993226051331, 0.840688943862915, 0.5415182709693909, 0.0000023245811462402344, 0.840688943862915, 0.5415182709693909, 0.0000023245811462402344, 0.840688943862915, 0.5415182709693909, 0.0000023245811462402344, 0.840688943862915, 0.5415182709693909, 0.0000023245811462402344, 0.010956525802612305, -0.85843825340271, -0.512799859046936, 0.010956525802612305, -0.85843825340271, -0.512799859046936, 0.010956525802612305, -0.85843825340271, -0.512799859046936, 0.010956525802612305, -0.85843825340271, -0.512799859046936, 0.5128072500228882, 0.010947109200060368, 0.8584340214729309, 0.5128072500228882, 0.010947109200060368, 0.8584340214729309, 0.5128072500228882, 0.010947109200060368, 0.8584340214729309, 0.5128072500228882, 0.010947109200060368, 0.8584340214729309, -0.00002372264862060547, -0.8406915664672852, 0.5415141582489014, -0.00002372264862060547, -0.8406915664672852, 0.5415141582489014, -0.00002372264862060547, -0.8406915664672852, 0.5415141582489014, -0.00002372264862060547, -0.8406915664672852, 0.5415141582489014, -0.5415211319923401, 0.0000058785080909729, -0.8406871557235718, -0.5415211319923401, 0.0000058785080909729, -0.8406871557235718, -0.5415211319923401, 0.0000058785080909729, -0.8406871557235718, -0.5415211319923401, 0.0000058785080909729, -0.8406871557235718, -0.5305268168449402, 0.017754971981048584, -0.8474822044372559, -0.5305268168449402, 0.017754971981048584, -0.8474822044372559, -0.5305268168449402, 0.017754971981048584, -0.8474822044372559, -0.5305268168449402, 0.017754971981048584, -0.8474822044372559, 0.8474643230438232, 0.530555784702301, -0.017738506197929382, 0.8474643230438232, 0.530555784702301, -0.017738506197929382, 0.8474643230438232, 0.530555784702301, -0.017738506197929382, 0.8474643230438232, 0.530555784702301, -0.017738506197929382, 0.5305773615837097, -0.017735809087753296, 0.8474509716033936, 0.5305773615837097, -0.017735809087753296, 0.8474509716033936, 0.5305773615837097, -0.017735809087753296, 0.8474509716033936, 0.5305773615837097, -0.017735809087753296, 0.8474509716033936, 0.017751533538103104, -0.8474733233451843, 0.5305410623550415, 0.017751533538103104, -0.8474733233451843, 0.5305410623550415, 0.017751533538103104, -0.8474733233451843, 0.5305410623550415, 0.017751533538103104, -0.8474733233451843, 0.5305410623550415],\n \"normalized\": false\n },\n \"uv\": {\n \"itemSize\": 2,\n \"type\": \"Float32Array\",\n \"array\": [0.04446648806333542, 0.07376205921173096, 0.20145824551582336, 0.23582905530929565, 0.21539996564388275, 0.12743210792541504, 0.37534299492836, 0.25084298849105835, 0.04809992015361786, 0.08560597896575928, 0.057846054434776306, 0.11768478155136108, 0.1833210289478302, 0.12743109464645386, 0.7991840243339539, 0.7345119714736938, 0.04446648806333542, 0.10164541006088257, 0.05784609913825989, 0.009287774562835693, 0.1456916183233261, 0.009287774562835693, 0.9510290026664734, 0.7345119714736938, 0.029962755739688873, 0.009287834167480469, 0.08629150688648224, 0.11558711528778076, 0.16937947273254395, 0.23582905530929565, 0.29914700984954834, 0.9847790002822876, 0.09967105835676193, 0.11768478155136108, 0.12479200214147568, 0.5006319880485535, 0.13174988329410553, 0.06191825866699219, 0.14569158852100372, 0.23582911491394043, 0.10386674106121063, 0.11768478155136108, 0.1178082525730133, 0.12743109464645386, 0.12811647355556488, 0.059820473194122314, 0.2996180057525635, 0.7345709800720215, 0.04809992015361786, 0.07166439294815063, 0.1038665845990181, 0.12743091583251953, 0.2112043797969818, 0.12743210792541504, 0.4983850121498108, 0.5901579856872559, 0.04809992015361786, 0.08980154991149902, 0.04809992015361786, 0.1274309754371643, 0.06204163283109665, 0.11768478155136108, 0.9510089755058289, 0.23450398445129395, 0.04809992015361786, 0.11348932981491089, 0.07598327845335007, 0.11768478155136108, 0.11361270397901535, 0.11768472194671631, 0.24789699912071228, 0.8405579924583435, 0.1178082674741745, 0.009287655353546143, 0.15963312983512878, 0.23582905530929565, 0.2148379236459732, 0.11348950862884521, 0.7521880269050598, 0.34043699502944946, 0.04446648806333542, 0.04587888717651367, 0.22514608502388, 0.00928884744644165, 0.2390877902507782, 0.23582905530929565, 0.9978780150413513, 0.34043699502944946, 0.12811647355556488, 0.08770370483398438, 0.15963324904441833, 0.12743109464645386, 0.23908784985542297, 0.12743210792541504, 0.8750330209732056, 0.25118499994277954, 0.04809989035129547, 0.0437811017036438, 0.22934159636497498, 0.12743210792541504, 0.24328330159187317, 0.23582911491394043, 0.5490679740905762, 0.2342810034751892, 0.04446648806333542, 0.11558705568313599, 0.0717877745628357, 0.11768478155136108, 0.12755444645881653, 0.12743091583251953, 0.20090700685977936, 0.4844740033149719, 0.03415820747613907, 0.009287834167480469, 0.07178772985935211, 0.009287774562835693, 0.08992494642734528, 0.11768484115600586, 0.24783000349998474, 0.3400610089302063, 0.029962942004203796, 0.1274297833442688, 0.08629149198532104, 0.05982053279876709, 0.17357508838176727, 0.009289085865020752, 0.7481870055198669, 0.5902109742164612, 0.07598324865102768, 0.12743091583251953, 0.13174989819526672, 0.10374313592910767, 0.2153998762369156, 0.23582905530929565, 0.25249800086021423, 0.34009504318237305, 0.08629149198532104, 0.07376205921173096, 0.20145824551582336, 0.1274312138557434, 0.22934159636497498, 0.11768591403961182, 0.49818700551986694, 0.34009504318237305, 0.04446648806333542, 0.05982053279876709, 0.07598326355218887, 0.23582905530929565, 0.22514608502388, 0.23582905530929565, 0.29941999912261963, 0.48450803756713867, 0.04809989035129547, 0.04797661304473877, 0.2251461148262024, 0.12743210792541504, 0.22934159636497498, 0.009288787841796875, 0.45126500725746155, 0.48450803756713867, 0.04809992015361786, 0.0995476245880127, 0.14149606227874756, 0.009287774562835693, 0.14569158852100372, 0.12743109464645386, 0.24763700366020203, 0.5898839831352234, 0.08572941273450851, 0.23582905530929565, 0.12811647355556488, 0.04587888717651367, 0.1456916183233261, 0.11768472194671631, 0.9979509711265564, 0.5900989770889282, 0.04809992015361786, 0.10374313592910767, 0.062041595578193665, 0.009287774562835693, 0.14149613678455353, 0.12743109464645386, 0.7991650104522705, 0.23450398445129395, 0.08629149198532104, 0.04587888717651367, 0.18332113325595856, 0.23582911491394043, 0.2014583796262741, 0.11768490076065063, 0.7522619962692261, 0.5900989770889282, 0.08992491662502289, 0.0437811017036438, 0.18751657009124756, 0.23582905530929565, 0.23908784985542297, 0.11768591403961182, 0.6249899864196777, 0.0006160140037536621, 0.043904468417167664, 0.1274309754371643, 0.0444665253162384, 0.08770382404327393, 0.18751657009124756, 0.12743109464645386, 0.7478349804878235, 0.08986800909042358, 0.08572938293218613, 0.1274309754371643, 0.13174991309642792, 0.0758599042892456, 0.2014583796262741, 0.009289026260375977, 0.8751059770584106, 0.5008469820022583, 0.034158237278461456, 0.23582905530929565, 0.0899249017238617, 0.10374313592910767, 0.15543770790100098, 0.11768490076065063, 0.49791398644447327, 0.840366005897522, 0.020216554403305054, 0.1274297833442688, 0.13174991309642792, 0.11768472194671631, 0.15543778240680695, 0.009287893772125244, 0.3750689923763275, 0.751114010810852, 0.04913000017404556, 0.9849709868431091, 0.0899249017238617, 0.05772274732589722, 0.1693795919418335, 0.009289145469665527, 0.17357489466667175, 0.12743103504180908, 0.034158237278461456, 0.1274297833442688, 0.0899249017238617, 0.06191825866699219, 0.16937938332557678, 0.1274309754371643, 0.45099198818206787, 0.9847790002822876, 0.020216554403305054, 0.23582911491394043, 0.029962696135044098, 0.11768358945846558, 0.2148379534482956, 0.0995478630065918, 0.25222501158714294, 0.840366005897522, 0.034158363938331604, 0.11768358945846558, 0.09967107325792313, 0.23582905530929565, 0.12498500198125839, 0.2508090138435364, 0.2148379534482956, 0.10374337434768677, 0.016021236777305603, 0.1274297833442688, 0.10386674106121063, 0.009288907051086426, 0.12811647355556488, 0.11558699607849121, 0.2526949942111969, 0.5901579856872559, 0.1136128157377243, 0.12743109464645386, 0.13174988329410553, 0.05772268772125244, 0.14149603247642517, 0.23582905530929565, 0.7522420287132263, 0.09009099006652832, 0.020216554403305054, 0.009286701679229736, 0.04887000098824501, 0.734296977519989, 0.08629149198532104, 0.10164541006088257, 0.15963326394557953, 0.11768490076065063, 0.002139999996870756, 0.3400610089302063, 0.04809992015361786, 0.0758599042892456, 0.0996711403131485, 0.12743091583251953, 0.197262704372406, 0.23582911491394043, 0.016021013259887695, 0.23582905530929565, 0.1038665771484375, 0.23582905530929565, 0.21120451390743256, 0.1016455888748169, 0.37553998827934265, 0.5009059906005859, 0.043904371559619904, 0.23582905530929565, 0.04809992015361786, 0.05772274732589722, 0.22934159636497498, 0.23582905530929565, 0.7009119987487793, 0.2342810034751892, 0.057846151292324066, 0.23582905530929565, 0.11361275613307953, 0.009287714958190918, 0.12505200505256653, 0.7513059973716736, 0.2148379236459732, 0.11768490076065063, 0.0022070000413805246, 0.8405579924583435, 0.057846054434776306, 0.1274309754371643, 0.08629149198532104, 0.08770382404327393, 0.16937938332557678, 0.11768496036529541, 0.07598327845335007, 0.009287774562835693, 0.08992494642734528, 0.11348938941955566, 0.17357489466667175, 0.23582911491394043, 0.2009740024805069, 0.9849709868431091, 0.06204158067703247, 0.23582905530929565, 0.15543770790100098, 0.23582905530929565, 0.21120451390743256, 0.11558717489242554, 0.5491099953651428, 0.48442399501800537, 0.13174989819526672, 0.08560597896575928, 0.15543770790100098, 0.12743109464645386, 0.24328330159187317, 0.009288966655731201, 0.7009549736976624, 0.48442399501800537, 0.08992491662502289, 0.04797661304473877, 0.1972629427909851, 0.11768496036529541, 0.24328330159187317, 0.11768591403961182, 0.7478770017623901, 0.3400120139122009, 0.08992493152618408, 0.1274309754371643, 0.13174991309642792, 0.07166433334350586, 0.18751657009124756, 0.11768484115600586, 0.5024970173835754, 0.5902109742164612, 0.06204158067703247, 0.1274309754371643, 0.08992491662502289, 0.0898016095161438, 0.18332108855247498, 0.009287834167480469, 0.5021880269050598, 0.3400120139122009, 0.13174989819526672, 0.08980154991149902, 0.2390877902507782, 0.009288907051086426, 0.24328330159187317, 0.12743210792541504, 0.502144992351532, 0.08986800909042358, 0.049063000828027725, 0.4844740033149719, 0.0899249017238617, 0.07166439294815063, 0.12755438685417175, 0.23582905530929565, 0.19726276397705078, 0.1274312138557434, 0.08992491662502289, 0.08560603857040405, 0.17357507348060608, 0.11768496036529541, 0.18751657009124756, 0.009287834167480469, 0.6253420114517212, 0.5009589791297913, 0.1178082600235939, 0.23582905530929565, 0.13174989819526672, 0.0995476245880127, 0.2112043797969818, 0.23582905530929565, 0.4514620006084442, 0.7345709800720215, 0.07178780436515808, 0.1274309754371643, 0.11361271142959595, 0.23582905530929565, 0.12811647355556488, 0.10164541006088257, 0.8750870227813721, 0.0008389949798583984, 0.12811648845672607, 0.07376205921173096, 0.1833210289478302, 0.11768484115600586, 0.197262704372406, 0.009289026260375977, 0.6250330209732056, 0.25075995922088623, 0.0019470000406727195, 0.5898839831352234, 0.09967128932476044, 0.009288907051086426, 0.13174991309642792, 0.11348927021026611, 0.15963326394557953, 0.009287893772125244, 0.01602097600698471, 0.009286701679229736, 0.029962696135044098, 0.23582905530929565, 0.0899249017238617, 0.0995476245880127, 0.7012640237808228, 0.7346240282058716, 0.04809992015361786, 0.11768478155136108, 0.1178082674741745, 0.11768472194671631, 0.13174991309642792, 0.12743091583251953, 0.799111008644104, 0.4848499894142151, 0.0899249017238617, 0.0758599042892456, 0.13174991309642792, 0.23582911491394043, 0.22514614462852478, 0.11768591403961182, 0.9509549736976624, 0.4848499894142151, 0.04809992015361786, 0.06191825866699219, 0.04809992015361786, 0.23582905530929565, 0.07178771495819092, 0.23582905530929565, 0.9979320168495178, 0.09009099006652832, 0.020216554403305054, 0.11768358945846558, 0.13174989819526672, 0.047976553440093994, 0.14149612188339233, 0.11768472194671631, 0.20071400701999664, 0.734296977519989, 0.01602107286453247, 0.11768358945846558, 0.08992485702037811, 0.23582905530929565, 0.13174989819526672, 0.0437811017036438, 0.5494199991226196, 0.7346240282058716],\n \"normalized\": false\n },\n \"color\": {\n \"itemSize\": 4,\n \"type\": \"Uint16Array\",\n \"array\": [65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535],\n \"normalized\": true\n }\n },\n \"index\": {\n \"type\": \"Uint16Array\",\n \"array\": [17, 212, 141, 107, 7, 11, 43, 39, 223, 59, 130, 144, 158, 116, 167, 151, 23, 203, 91, 231, 207, 199, 183, 239, 75, 71, 3, 103, 191, 51, 171, 179, 211, 186, 182, 198, 149, 146, 129, 133, 16, 20, 108, 60, 217, 205, 21, 136, 157, 221, 36, 202, 2, 26, 119, 14, 166, 49, 74, 154, 161, 168, 184, 33, 57, 53, 178, 189, 98, 229, 100, 152, 102, 93, 97, 148, 112, 132, 232, 216, 236, 194, 222, 54, 173, 37, 45, 104, 237, 180, 138, 82, 90, 12, 128, 56, 86, 81, 234, 73, 204, 230, 46, 50, 190, 94, 210, 177, 147, 69, 195, 226, 78, 41, 9, 30, 89, 118, 197, 62, 0, 145, 24, 162, 185, 196, 65, 201, 206, 105, 181, 208, 76, 48, 40, 172, 44, 188, 113, 214, 134, 109, 218, 142, 32, 52, 220, 4, 101, 28, 13, 58, 165, 8, 88, 80, 68, 224, 193, 159, 38, 170, 72, 228, 153, 92, 176, 96, 126, 150, 131, 121, 117, 61, 18, 137, 22, 85, 233, 238, 114, 143, 215, 15, 111, 115, 235, 83, 141, 83, 17, 141, 11, 87, 107, 107, 95, 7, 223, 227, 43, 43, 47, 39, 192, 55, 144, 55, 59, 144, 167, 35, 158, 158, 160, 116, 203, 27, 151, 151, 135, 23, 207, 139, 91, 91, 31, 231, 219, 63, 239, 63, 199, 239, 3, 67, 75, 75, 79, 71, 51, 155, 103, 103, 99, 191, 211, 187, 171, 171, 175, 179, 186, 209, 182, 149, 25, 146, 133, 213, 16, 108, 120, 60, 205, 200, 21, 157, 34, 221, 202, 66, 2, 119, 122, 14, 49, 77, 74, 161, 156, 168, 33, 164, 57, 178, 174, 189, 229, 29, 100, 102, 6, 93, 148, 124, 112, 232, 140, 216, 194, 225, 222, 173, 169, 37, 104, 84, 237, 138, 19, 82, 12, 125, 128, 86, 10, 81, 73, 64, 204, 46, 42, 50, 94, 106, 210, 147, 1, 69, 226, 70, 78, 9, 5, 30, 118, 163, 197, 114, 110, 143, 115, 127, 15, 15, 123, 111]\n },\n \"boundingSphere\": {\n \"center\": [0, 0, 0],\n \"radius\": 144.59226795520192\n }\n },\n faceValues: [7, 5, 3, 11, 12, 9, 4, 1, 2, 10, 8, 6],\n rotationCombinations: {\n \"1,2\": [90, 0, -90],\n \"1,3\": [-90, 0, -90],\n \"1,4\": [-32, 18, -58],\n \"1,5\": [32, 18, 58],\n \"1,6\": [0, 0, 180],\n \"1,7\": [-180, 0, 0],\n \"1,8\": [-148, -18, -58],\n \"1,9\": [-148, -18, 122],\n \"1,10\": [-90, 0, 90],\n \"1,11\": [90, 0, 90],\n \"1,12\": [-180, 0, -180],\n \"2,3\": [-180, 0, -180],\n \"2,4\": [90, 0, -90],\n \"2,5\": [90, 0, 90],\n \"2,6\": [-122, -90, 148],\n \"2,7\": [-69, 30, 21],\n \"2,8\": [-90, 0, -90],\n \"2,9\": [-32, 18, 122],\n \"2,10\": [-180, 0, 0],\n \"2,11\": [0, 0, 180],\n \"2,12\": [-148, 54, 122],\n \"3,4\": [32, 18, 58],\n \"3,5\": [90, 0, -90],\n \"3,6\": [32, 54, -58],\n \"3,7\": [-32, -54, 122],\n \"3,8\": [-148, -18, 122],\n \"3,9\": [-90, 0, -90],\n \"3,10\": [-148, 18, -122],\n \"3,11\": [-180, 0, 0],\n \"3,12\": [-122, -90, 148],\n \"4,5\": [0, 0, 180],\n \"4,6\": [90, 0, 90],\n \"4,7\": [-90, 0, 90],\n \"4,8\": [-180, 0, -180],\n \"4,9\": [-180, 0, 0],\n \"4,10\": [148, -54, -58],\n \"4,11\": [-122, -90, 148],\n \"4,12\": [-90, 0, -90],\n \"5,6\": [-90, 0, -90],\n \"5,7\": [90, 0, -90],\n \"5,8\": [-180, 0, 0],\n \"5,9\": [-180, 0, -180],\n \"5,10\": [-148, -18, 122],\n \"5,11\": [32, 18, 58],\n \"5,12\": [90, 0, 90],\n \"6,7\": [-180, 0, -180],\n \"6,8\": [148, 18, 122],\n \"6,9\": [-122, -90, 148],\n \"6,10\": [90, 0, -90],\n \"6,11\": [-148, 54, -58],\n \"6,12\": [-148, -18, -58],\n \"7,8\": [32, -18, -58],\n \"7,9\": [-69, 30, 21],\n \"7,10\": [148, 54, 58],\n \"7,11\": [-90, 0, 90],\n \"7,12\": [-32, 54, 58],\n \"8,9\": [0, 0, 180],\n \"8,10\": [-148, -18, -58],\n \"8,11\": [-148, -54, 58],\n \"8,12\": [-90, 0, 90],\n \"9,10\": [-31, 18, -58],\n \"9,11\": [-148, -90, -58],\n \"9,12\": [90, 0, -90],\n \"10,11\": [-180, 0, -180],\n \"10,12\": [-90, 90, -180],\n \"11,12\": [148, -54, -58],\n }\n },\n \"d14\": {\n \"metadata\": {\n \"version\": 4.5,\n \"type\": \"BufferGeometry\",\n \"generator\": \"BufferGeometry.toJSON\"\n },\n \"uuid\": \"55E8EC8E-D9C5-4E75-86AC-BC4F49CF5FEA\",\n \"type\": \"BufferGeometry\",\n \"data\": {\n \"attributes\": {\n \"position\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-3.3639726638793945,6.319602012634277,-77.80762481689453,-3.3639726638793945,6.319602012634277,-77.80762481689453,-3.3639726638793945,6.319602012634277,-77.80762481689453,-3.3639726638793945,6.319602012634277,-77.80762481689453,2.563892364501953,84.39848327636719,-5.970834732055664,2.563892364501953,84.39848327636719,-5.970834732055664,2.563892364501953,84.39848327636719,-5.970834732055664,2.563892364501953,84.39848327636719,-5.970834732055664,2.563892364501953,84.39848327636719,-5.970834732055664,75.92582702636719,-2.281585454940796,-17.299819946289062,75.92582702636719,-2.281585454940796,-17.299819946289062,75.92582702636719,-2.281585454940796,-17.299819946289062,75.92582702636719,-2.281585454940796,-17.299819946289062,4.9952239990234375,84.37457275390625,4.497790336608887,4.9952239990234375,84.37457275390625,4.497790336608887,4.9952239990234375,84.37457275390625,4.497790336608887,4.9952239990234375,84.37457275390625,4.497790336608887,4.9952239990234375,84.37457275390625,4.497790336608887,-30.552932739257812,6.355025291442871,71.34111022949219,-30.552932739257812,6.355025291442871,71.34111022949219,-30.552932739257812,6.355025291442871,71.34111022949219,-30.552932739257812,6.355025291442871,71.34111022949219,31.1562557220459,6.31425142288208,71.49166870117188,31.1562557220459,6.31425142288208,71.49166870117188,31.1562557220459,6.31425142288208,71.49166870117188,31.1562557220459,6.31425142288208,71.49166870117188,-74.74581909179688,-6.299898624420166,-20.404645919799805,-74.74581909179688,-6.299898624420166,-20.404645919799805,-74.74581909179688,-6.299898624420166,-20.404645919799805,-74.74581909179688,-6.299898624420166,-20.404645919799805,30.55293846130371,-6.35502815246582,-71.34111022949219,30.55293846130371,-6.35502815246582,-71.34111022949219,30.55293846130371,-6.35502815246582,-71.34111022949219,30.55293846130371,-6.35502815246582,-71.34111022949219,-31.1562557220459,-6.31424617767334,-71.49166870117188,-31.1562557220459,-6.31424617767334,-71.49166870117188,-31.1562557220459,-6.31424617767334,-71.49166870117188,-31.1562557220459,-6.31424617767334,-71.49166870117188,5.657160758972168,-84.42521667480469,-4.448384761810303,5.657160758972168,-84.42521667480469,-4.448384761810303,5.657160758972168,-84.42521667480469,-4.448384761810303,5.657160758972168,-84.42521667480469,-4.448384761810303,5.657160758972168,-84.42521667480469,-4.448384761810303,62.504119873046875,-6.354261875152588,46.30989074707031,62.504119873046875,-6.354261875152588,46.30989074707031,62.504119873046875,-6.354261875152588,46.30989074707031,62.504119873046875,-6.354261875152588,46.30989074707031,7.009031295776367,-84.40763854980469,1.33268404006958,7.009031295776367,-84.40763854980469,1.33268404006958,7.009031295776367,-84.40763854980469,1.33268404006958,7.009031295776367,-84.40763854980469,1.33268404006958,7.009031295776367,-84.40763854980469,1.33268404006958,75.9446792602539,-6.379278182983398,-14.266926765441895,75.9446792602539,-6.379278182983398,-14.266926765441895,75.9446792602539,-6.379278182983398,-14.266926765441895,75.9446792602539,-6.379278182983398,-14.266926765441895,3.3639724254608154,-6.31959867477417,77.8076171875,3.3639724254608154,-6.31959867477417,77.8076171875,3.3639724254608154,-6.31959867477417,77.8076171875,3.3639724254608154,-6.31959867477417,77.8076171875,3.3671836853027344,-84.35977935791016,6.014355659484863,3.3671836853027344,-84.35977935791016,6.014355659484863,3.3671836853027344,-84.35977935791016,6.014355659484863,3.3671836853027344,-84.35977935791016,6.014355659484863,3.3671836853027344,-84.35977935791016,6.014355659484863,34.1295166015625,2.239828109741211,70.8094711303711,34.1295166015625,2.239828109741211,70.8094711303711,34.1295166015625,2.239828109741211,70.8094711303711,34.1295166015625,2.239828109741211,70.8094711303711,-75.9446792602539,6.379278182983398,14.26693058013916,-75.9446792602539,6.379278182983398,14.26693058013916,-75.9446792602539,6.379278182983398,14.26693058013916,-75.9446792602539,6.379278182983398,14.26693058013916,-76.03756713867188,-6.302979946136475,-14.609931945800781,-76.03756713867188,-6.302979946136475,-14.609931945800781,-76.03756713867188,-6.302979946136475,-14.609931945800781,-76.03756713867188,-6.302979946136475,-14.609931945800781,-76.0564956665039,-2.211188554763794,-17.664764404296875,-76.0564956665039,-2.211188554763794,-17.664764404296875,-76.0564956665039,-2.211188554763794,-17.664764404296875,-76.0564956665039,-2.211188554763794,-17.664764404296875,-62.504119873046875,6.354262351989746,-46.30989074707031,-62.504119873046875,6.354262351989746,-46.30989074707031,-62.504119873046875,6.354262351989746,-46.30989074707031,-62.504119873046875,6.354262351989746,-46.30989074707031,-61.1809196472168,2.2734644412994385,-49.07624435424805,-61.1809196472168,2.2734644412994385,-49.07624435424805,-61.1809196472168,2.2734644412994385,-49.07624435424805,-61.1809196472168,2.2734644412994385,-49.07624435424805,-58.829193115234375,6.3529181480407715,-50.964759826660156,-58.829193115234375,6.3529181480407715,-50.964759826660156,-58.829193115234375,6.3529181480407715,-50.964759826660156,-58.829193115234375,6.3529181480407715,-50.964759826660156,-36.493858337402344,-6.314887523651123,-68.91082763671875,-36.493858337402344,-6.314887523651123,-68.91082763671875,-36.493858337402344,-6.314887523651123,-68.91082763671875,-36.493858337402344,-6.314887523651123,-68.91082763671875,58.31211471557617,6.307106018066406,-50.69571304321289,58.31211471557617,6.307106018066406,-50.69571304321289,58.31211471557617,6.307106018066406,-50.69571304321289,58.31211471557617,6.307106018066406,-50.69571304321289,62.011024475097656,6.3075995445251465,-46.048179626464844,62.011024475097656,6.3075995445251465,-46.048179626464844,62.011024475097656,6.3075995445251465,-46.048179626464844,62.011024475097656,6.3075995445251465,-46.048179626464844,74.60848999023438,-6.379120826721191,-20.05154037475586,74.60848999023438,-6.379120826721191,-20.05154037475586,74.60848999023438,-6.379120826721191,-20.05154037475586,74.60848999023438,-6.379120826721191,-20.05154037475586,76.0564956665039,2.2111899852752686,17.664772033691406,76.0564956665039,2.2111899852752686,17.664772033691406,76.0564956665039,2.2111899852752686,17.664772033691406,76.0564956665039,2.2111899852752686,17.664772033691406,74.74581909179688,6.299901008605957,20.404653549194336,74.74581909179688,6.299901008605957,20.404653549194336,74.74581909179688,6.299901008605957,20.404653549194336,74.74581909179688,6.299901008605957,20.404653549194336,36.493858337402344,6.3148884773254395,68.91082763671875,36.493858337402344,6.3148884773254395,68.91082763671875,36.493858337402344,6.3148884773254395,68.91082763671875,36.493858337402344,6.3148884773254395,68.91082763671875,-2.5638914108276367,-84.39848327636719,5.9708333015441895,-2.5638914108276367,-84.39848327636719,5.9708333015441895,-2.5638914108276367,-84.39848327636719,5.9708333015441895,-2.5638914108276367,-84.39848327636719,5.9708333015441895,-2.5638914108276367,-84.39848327636719,5.9708333015441895,0.3401651680469513,-84.3684310913086,-7.083171844482422,0.3401651680469513,-84.3684310913086,-7.083171844482422,0.3401651680469513,-84.3684310913086,-7.083171844482422,0.3401651680469513,-84.3684310913086,-7.083171844482422,0.3401651680469513,-84.3684310913086,-7.083171844482422,-5.657160758972168,84.42522430419922,4.448385238647461,-5.657160758972168,84.42522430419922,4.448385238647461,-5.657160758972168,84.42522430419922,4.448385238647461,-5.657160758972168,84.42522430419922,4.448385238647461,-5.657160758972168,84.42522430419922,4.448385238647461,-0.4000111222267151,2.242583751678467,-78.4876937866211,-0.4000111222267151,2.242583751678467,-78.4876937866211,-0.4000111222267151,2.242583751678467,-78.4876937866211,-0.4000111222267151,2.242583751678467,-78.4876937866211,-34.1295166015625,-2.239827871322632,-70.8094711303711,-34.1295166015625,-2.239827871322632,-70.8094711303711,-34.1295166015625,-2.239827871322632,-70.8094711303711,-34.1295166015625,-2.239827871322632,-70.8094711303711,2.5671069622039795,6.321245193481445,-77.7981948852539,2.5671069622039795,6.321245193481445,-77.7981948852539,2.5671069622039795,6.321245193481445,-77.7981948852539,2.5671069622039795,6.321245193481445,-77.7981948852539,60.691749572753906,2.211258888244629,-48.80388641357422,60.691749572753906,2.211258888244629,-48.80388641357422,60.691749572753906,2.211258888244629,-48.80388641357422,60.691749572753906,2.211258888244629,-48.80388641357422,35.8908576965332,-6.357795238494873,-68.75081634521484,35.8908576965332,-6.357795238494873,-68.75081634521484,35.8908576965332,-6.357795238494873,-68.75081634521484,35.8908576965332,-6.357795238494873,-68.75081634521484,33.49201583862305,-2.268580436706543,-70.65808868408203,33.49201583862305,-2.268580436706543,-70.65808868408203,33.49201583862305,-2.268580436706543,-70.65808868408203,33.49201583862305,-2.268580436706543,-70.65808868408203,76.03756713867188,6.302982807159424,14.609939575195312,76.03756713867188,6.302982807159424,14.609939575195312,76.03756713867188,6.302982807159424,14.609939575195312,76.03756713867188,6.302982807159424,14.609939575195312,61.1809196472168,-2.2734615802764893,49.07624435424805,61.1809196472168,-2.2734615802764893,49.07624435424805,61.1809196472168,-2.2734615802764893,49.07624435424805,61.1809196472168,-2.2734615802764893,49.07624435424805,-58.31211471557617,-6.307102203369141,50.69571304321289,-58.31211471557617,-6.307102203369141,50.69571304321289,-58.31211471557617,-6.307102203369141,50.69571304321289,-58.31211471557617,-6.307102203369141,50.69571304321289,-33.49201202392578,2.268582582473755,70.65808868408203,-33.49201202392578,2.268582582473755,70.65808868408203,-33.49201202392578,2.268582582473755,70.65808868408203,-33.49201202392578,2.268582582473755,70.65808868408203,-35.8908576965332,6.357793807983398,68.75082397460938,-35.8908576965332,6.357793807983398,68.75082397460938,-35.8908576965332,6.357793807983398,68.75082397460938,-35.8908576965332,6.357793807983398,68.75082397460938,-2.567105293273926,-6.321239948272705,77.7981948852539,-2.567105293273926,-6.321239948272705,77.7981948852539,-2.567105293273926,-6.321239948272705,77.7981948852539,-2.567105293273926,-6.321239948272705,77.7981948852539,0.40001073479652405,-2.242581844329834,78.4876937866211,0.40001073479652405,-2.242581844329834,78.4876937866211,0.40001073479652405,-2.242581844329834,78.4876937866211,0.40001073479652405,-2.242581844329834,78.4876937866211,-60.69174575805664,-2.211254835128784,48.803897857666016,-60.69174575805664,-2.211254835128784,48.803897857666016,-60.69174575805664,-2.211254835128784,48.803897857666016,-60.69174575805664,-2.211254835128784,48.803897857666016,-74.60848999023438,6.379125595092773,20.051544189453125,-74.60848999023438,6.379125595092773,20.051544189453125,-74.60848999023438,6.379125595092773,20.051544189453125,-74.60848999023438,6.379125595092773,20.051544189453125,-75.92582702636719,2.2815887928009033,17.29982566833496,-75.92582702636719,2.2815887928009033,17.29982566833496,-75.92582702636719,2.2815887928009033,17.29982566833496,-75.92582702636719,2.2815887928009033,17.29982566833496,-62.011024475097656,-6.307600975036621,46.04818344116211,-62.011024475097656,-6.307600975036621,46.04818344116211,-62.011024475097656,-6.307600975036621,46.04818344116211,-62.011024475097656,-6.307600975036621,46.04818344116211,-6.242546081542969,-84.4273681640625,1.3070549964904785,-6.242546081542969,-84.4273681640625,1.3070549964904785,-6.242546081542969,-84.4273681640625,1.3070549964904785,-6.242546081542969,-84.4273681640625,1.3070549964904785,-6.242546081542969,-84.4273681640625,1.3070549964904785,-4.99522066116333,-84.37457275390625,-4.497788429260254,-4.99522066116333,-84.37457275390625,-4.497788429260254,-4.99522066116333,-84.37457275390625,-4.497788429260254,-4.99522066116333,-84.37457275390625,-4.497788429260254,-4.99522066116333,-84.37457275390625,-4.497788429260254,58.829200744628906,-6.3529205322265625,50.964759826660156,58.829200744628906,-6.3529205322265625,50.964759826660156,58.829200744628906,-6.3529205322265625,50.964759826660156,58.829200744628906,-6.3529205322265625,50.964759826660156,-0.34016573429107666,84.3684310913086,7.083171844482422,-0.34016573429107666,84.3684310913086,7.083171844482422,-0.34016573429107666,84.3684310913086,7.083171844482422,-0.34016573429107666,84.3684310913086,7.083171844482422,-0.34016573429107666,84.3684310913086,7.083171844482422,6.242546081542969,84.4273681640625,-1.307053804397583,6.242546081542969,84.4273681640625,-1.307053804397583,6.242546081542969,84.4273681640625,-1.307053804397583,6.242546081542969,84.4273681640625,-1.307053804397583,6.242546081542969,84.4273681640625,-1.307053804397583,-3.3671834468841553,84.35977935791016,-6.0143561363220215,-3.3671834468841553,84.35977935791016,-6.0143561363220215,-3.3671834468841553,84.35977935791016,-6.0143561363220215,-3.3671834468841553,84.35977935791016,-6.0143561363220215,-3.3671834468841553,84.35977935791016,-6.0143561363220215,-7.009029865264893,84.40763854980469,-1.3326834440231323,-7.009029865264893,84.40763854980469,-1.3326834440231323,-7.009029865264893,84.40763854980469,-1.3326834440231323,-7.009029865264893,84.40763854980469,-1.3326834440231323,-7.009029865264893,84.40763854980469,-1.3326834440231323,-0.36670994758605957,87.28189849853516,0.20025108754634857,-0.36670994758605957,87.28189849853516,0.20025108754634857,-0.36670994758605957,87.28189849853516,0.20025108754634857,-0.36670994758605957,87.28189849853516,0.20025108754634857,-0.36670994758605957,87.28189849853516,0.20025108754634857,-0.36670994758605957,87.28189849853516,0.20025108754634857,-0.36670994758605957,87.28189849853516,0.20025108754634857,0.366711288690567,-87.28191375732422,-0.2002510279417038,0.366711288690567,-87.28191375732422,-0.2002510279417038,0.366711288690567,-87.28191375732422,-0.2002510279417038,0.366711288690567,-87.28191375732422,-0.2002510279417038,0.366711288690567,-87.28191375732422,-0.2002510279417038,0.366711288690567,-87.28191375732422,-0.2002510279417038,0.366711288690567,-87.28191375732422,-0.2002510279417038],\n \"normalized\": false\n },\n \"normal\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-0.28516727685928345,0.6296403408050537,-0.7226566076278687,-0.28516727685928345,0.6296403408050537,-0.7226566076278687,-0.28516727685928345,0.6296403408050537,-0.7226566076278687,-0.28516727685928345,0.6296403408050537,-0.7226566076278687,0.3280982971191406,0.6602655649185181,-0.6755744218826294,0.3280982971191406,0.6602655649185181,-0.6755744218826294,0.3280982971191406,0.6602655649185181,-0.6755744218826294,0.3280982971191406,0.6602655649185181,-0.6755744218826294,0.3280982971191406,0.6602655649185181,-0.6755744218826294,0.7842698693275452,0.5933358073234558,-0.18131035566329956,0.7842698693275452,0.5933358073234558,-0.18131035566329956,0.7842698693275452,0.5933358073234558,-0.18131035566329956,0.7842698693275452,0.5933358073234558,-0.18131035566329956,0.589374303817749,0.6605231761932373,0.46513107419013977,0.589374303817749,0.6605231761932373,0.46513107419013977,0.589374303817749,0.6605231761932373,0.46513107419013977,0.589374303817749,0.6605231761932373,0.46513107419013977,0.589374303817749,0.6605231761932373,0.46513107419013977,-0.059090327471494675,0.6272545456886292,0.7765694260597229,-0.059090327471494675,0.6272545456886292,0.7765694260597229,-0.059090327471494675,0.6272545456886292,0.7765694260597229,-0.059090327471494675,0.6272545456886292,0.7765694260597229,0.05634559690952301,0.6280144453048706,0.7761592268943787,0.05634559690952301,0.6280144453048706,0.7761592268943787,0.05634559690952301,0.6280144453048706,0.7761592268943787,0.05634559690952301,0.6280144453048706,0.7761592268943787,-0.6443470120429993,-0.6290098428726196,-0.43492940068244934,-0.6443470120429993,-0.6290098428726196,-0.43492940068244934,-0.6443470120429993,-0.6290098428726196,-0.43492940068244934,-0.6443470120429993,-0.6290098428726196,-0.43492940068244934,0.05909096822142601,-0.6272543668746948,-0.7765696048736572,0.05909096822142601,-0.6272543668746948,-0.7765696048736572,0.05909096822142601,-0.6272543668746948,-0.7765696048736572,0.05909096822142601,-0.6272543668746948,-0.7765696048736572,-0.05632945895195007,-0.6280063986778259,-0.7761667966842651,-0.05632945895195007,-0.6280063986778259,-0.7761667966842651,-0.05632945895195007,-0.6280063986778259,-0.7761667966842651,-0.05632945895195007,-0.6280063986778259,-0.7761667966842651,0.5910056829452515,-0.6553013920783997,-0.4704173803329468,0.5910056829452515,-0.6553013920783997,-0.4704173803329468,0.5910056829452515,-0.6553013920783997,-0.4704173803329468,0.5910056829452515,-0.6553013920783997,-0.4704173803329468,0.5910056829452515,-0.6553013920783997,-0.4704173803329468,0.7470955848693848,-0.6255302429199219,0.22485576570034027,0.7470955848693848,-0.6255302429199219,0.22485576570034027,0.7470955848693848,-0.6255302429199219,0.22485576570034027,0.7470955848693848,-0.6255302429199219,0.22485576570034027,0.7361034154891968,-0.6567224264144897,0.16391272842884064,0.7361034154891968,-0.6567224264144897,0.16391272842884064,0.7361034154891968,-0.6567224264144897,0.16391272842884064,0.7361034154891968,-0.6567224264144897,0.16391272842884064,0.7361034154891968,-0.6567224264144897,0.16391272842884064,0.7726380228996277,-0.6246670484542847,0.11323241889476776,0.7726380228996277,-0.6246670484542847,0.11323241889476776,0.7726380228996277,-0.6246670484542847,0.11323241889476776,0.7726380228996277,-0.6246670484542847,0.11323241889476776,0.2852247953414917,-0.6296125650405884,0.7226580381393433,0.2852247953414917,-0.6296125650405884,0.7226580381393433,0.2852247953414917,-0.6296125650405884,0.7226580381393433,0.2852247953414917,-0.6296125650405884,0.7226580381393433,0.32667452096939087,-0.6607898473739624,0.6757517457008362,0.32667452096939087,-0.6607898473739624,0.6757517457008362,0.32667452096939087,-0.6607898473739624,0.6757517457008362,0.32667452096939087,-0.6607898473739624,0.6757517457008362,0.32667452096939087,-0.6607898473739624,0.6757517457008362,0.3497964143753052,-0.5950561165809631,0.7235679030418396,0.3497964143753052,-0.5950561165809631,0.7235679030418396,0.3497964143753052,-0.5950561165809631,0.7235679030418396,0.3497964143753052,-0.5950561165809631,0.7235679030418396,-0.7726274132728577,0.6246878504753113,-0.11318989098072052,-0.7726274132728577,0.6246878504753113,-0.11318989098072052,-0.7726274132728577,0.6246878504753113,-0.11318989098072052,-0.7726274132728577,0.6246878504753113,-0.11318989098072052,-0.7692402005195618,-0.6276887655258179,0.11948297917842865,-0.7692402005195618,-0.6276887655258179,0.11948297917842865,-0.7692402005195618,-0.6276887655258179,0.11948297917842865,-0.7692402005195618,-0.6276887655258179,0.11948297917842865,-0.7877770662307739,0.5905534625053406,-0.17508289217948914,-0.7877770662307739,0.5905534625053406,-0.17508289217948914,-0.7877770662307739,0.5905534625053406,-0.17508289217948914,-0.7877770662307739,0.5905534625053406,-0.17508289217948914,-0.7470952868461609,0.6255304217338562,-0.22485589981079102,-0.7470952868461609,0.6255304217338562,-0.22485589981079102,-0.7470952868461609,0.6255304217338562,-0.22485589981079102,-0.7470952868461609,0.6255304217338562,-0.22485589981079102,-0.631263256072998,-0.5948466658592224,-0.4976588785648346,-0.631263256072998,-0.5948466658592224,-0.4976588785648346,-0.631263256072998,-0.5948466658592224,-0.4976588785648346,-0.631263256072998,-0.5948466658592224,-0.4976588785648346,-0.38938289880752563,0.6292169094085693,-0.6726565957069397,-0.38938289880752563,0.6292169094085693,-0.6726565957069397,-0.38938289880752563,0.6292169094085693,-0.6726565957069397,-0.38938289880752563,0.6292169094085693,-0.6726565957069397,-0.5729118585586548,-0.6292456388473511,-0.5251874923706055,-0.5729118585586548,-0.6292456388473511,-0.5251874923706055,-0.5729118585586548,-0.6292456388473511,-0.5251874923706055,-0.5729118585586548,-0.6292456388473511,-0.5251874923706055,0.3904346227645874,0.628699541091919,-0.6725307703018188,0.3904346227645874,0.628699541091919,-0.6725307703018188,0.3904346227645874,0.628699541091919,-0.6725307703018188,0.3904346227645874,0.628699541091919,-0.6725307703018188,0.7437728643417358,0.6275497078895569,-0.2301807701587677,0.7437728643417358,0.6275497078895569,-0.2301807701587677,0.7437728643417358,0.6275497078895569,-0.2301807701587677,0.7437728643417358,0.6275497078895569,-0.2301807701587677,0.6457582712173462,-0.6233645677566528,-0.4409227967262268,0.6457582712173462,-0.6233645677566528,-0.4409227967262268,0.6457582712173462,-0.6233645677566528,-0.4409227967262268,0.6457582712173462,-0.6233645677566528,-0.4409227967262268,0.7877867221832275,-0.5905534029006958,0.17503942549228668,0.7877867221832275,-0.5905534029006958,0.17503942549228668,0.7877867221832275,-0.5905534029006958,0.17503942549228668,0.7877867221832275,-0.5905534029006958,0.17503942549228668,0.6443431377410889,0.6290005445480347,0.43494871258735657,0.6443431377410889,0.6290005445480347,0.43494871258735657,0.6443431377410889,0.6290005445480347,0.43494871258735657,0.6443431377410889,0.6290005445480347,0.43494871258735657,0.5729120969772339,0.6292457580566406,0.5251871347427368,0.5729120969772339,0.6292457580566406,0.5251871347427368,0.5729120969772339,0.6292457580566406,0.5251871347427368,0.5729120969772339,0.6292457580566406,0.5251871347427368,-0.3281112611293793,-0.6602649092674255,0.6755688190460205,-0.3281112611293793,-0.6602649092674255,0.6755688190460205,-0.3281112611293793,-0.6602649092674255,0.6755688190460205,-0.3281112611293793,-0.6602649092674255,0.6755688190460205,-0.3281112611293793,-0.6602649092674255,0.6755688190460205,0.0011704713106155396,-0.6591591238975525,-0.7520025968551636,0.0011704713106155396,-0.6591591238975525,-0.7520025968551636,0.0011704713106155396,-0.6591591238975525,-0.7520025968551636,0.0011704713106155396,-0.6591591238975525,-0.7520025968551636,0.0011704713106155396,-0.6591591238975525,-0.7520025968551636,-0.5910052061080933,0.6553022861480713,0.47041675448417664,-0.5910052061080933,0.6553022861480713,0.47041675448417664,-0.5910052061080933,0.6553022861480713,0.47041675448417664,-0.5910052061080933,0.6553022861480713,0.47041675448417664,-0.5910052061080933,0.6553022861480713,0.47041675448417664,0.0015861615538597107,-0.5931890606880188,-0.8050615787506104,0.0015861615538597107,-0.5931890606880188,-0.8050615787506104,0.0015861615538597107,-0.5931890606880188,-0.8050615787506104,0.0015861615538597107,-0.5931890606880188,-0.8050615787506104,-0.34979522228240967,0.5950555801391602,-0.7235690355300903,-0.34979522228240967,0.5950555801391602,-0.7235690355300903,-0.34979522228240967,0.5950555801391602,-0.7235690355300903,-0.34979522228240967,0.5950555801391602,-0.7235690355300903,0.2873671054840088,0.6291413903236389,-0.7222195863723755,0.2873671054840088,0.6291413903236389,-0.7222195863723755,0.2873671054840088,0.6291413903236389,-0.7222195863723755,0.2873671054840088,0.6291413903236389,-0.7222195863723755,0.6324546933174133,-0.5889533758163452,-0.5031253695487976,0.6324546933174133,-0.5889533758163452,-0.5031253695487976,0.6324546933174133,-0.5889533758163452,-0.5031253695487976,0.6324546933174133,-0.5889533758163452,-0.5031253695487976,0.574481725692749,-0.6237778663635254,-0.5299734473228455,0.574481725692749,-0.6237778663635254,-0.5299734473228455,0.574481725692749,-0.6237778663635254,-0.5299734473228455,0.574481725692749,-0.6237778663635254,-0.5299734473228455,0.35163187980651855,0.594671368598938,-0.7229945659637451,0.35163187980651855,0.594671368598938,-0.7229945659637451,0.35163187980651855,0.594671368598938,-0.7229945659637451,0.35163187980651855,0.594671368598938,-0.7229945659637451,0.7692419290542603,0.6276857852935791,-0.11948888003826141,0.7692419290542603,0.6276857852935791,-0.11948888003826141,0.7692419290542603,0.6276857852935791,-0.11948888003826141,0.7692419290542603,0.6276857852935791,-0.11948888003826141,0.6312867403030396,0.5948468446731567,0.49762865900993347,0.6312867403030396,0.5948468446731567,0.49762865900993347,0.6312867403030396,0.5948468446731567,0.49762865900993347,0.6312867403030396,0.5948468446731567,0.49762865900993347,-0.3904343545436859,-0.6286999583244324,0.6725306510925293,-0.3904343545436859,-0.6286999583244324,0.6725306510925293,-0.3904343545436859,-0.6286999583244324,0.6725306510925293,-0.3904343545436859,-0.6286999583244324,0.6725306510925293,-0.3516600430011749,-0.5946711301803589,0.7229809761047363,-0.3516600430011749,-0.5946711301803589,0.7229809761047363,-0.3516600430011749,-0.5946711301803589,0.7229809761047363,-0.3516600430011749,-0.5946711301803589,0.7229809761047363,-0.5744823813438416,0.6237770915031433,0.5299737453460693,-0.5744823813438416,0.6237770915031433,0.5299737453460693,-0.5744823813438416,0.6237770915031433,0.5299737453460693,-0.5744823813438416,0.6237770915031433,0.5299737453460693,-0.28738611936569214,-0.6291320323944092,0.722220242023468,-0.28738611936569214,-0.6291320323944092,0.722220242023468,-0.28738611936569214,-0.6291320323944092,0.722220242023468,-0.28738611936569214,-0.6291320323944092,0.722220242023468,-0.0015616416931152344,0.5931897759437561,0.8050611615180969,-0.0015616416931152344,0.5931897759437561,0.8050611615180969,-0.0015616416931152344,0.5931897759437561,0.8050611615180969,-0.0015616416931152344,0.5931897759437561,0.8050611615180969,-0.632463812828064,0.5889529585838318,0.5031142830848694,-0.632463812828064,0.5889529585838318,0.5031142830848694,-0.632463812828064,0.5889529585838318,0.5031142830848694,-0.632463812828064,0.5889529585838318,0.5031142830848694,-0.6457580924034119,0.6233644485473633,0.44092315435409546,-0.6457580924034119,0.6233644485473633,0.44092315435409546,-0.6457580924034119,0.6233644485473633,0.44092315435409546,-0.6457580924034119,0.6233644485473633,0.44092315435409546,-0.7842698097229004,-0.593335747718811,0.18131089210510254,-0.7842698097229004,-0.593335747718811,0.18131089210510254,-0.7842698097229004,-0.593335747718811,0.18131089210510254,-0.7842698097229004,-0.593335747718811,0.18131089210510254,-0.7437704205513,-0.6275736689567566,0.23012343049049377,-0.7437704205513,-0.6275736689567566,0.23012343049049377,-0.7437704205513,-0.6275736689567566,0.23012343049049377,-0.7437704205513,-0.6275736689567566,0.23012343049049377,-0.7328628301620483,-0.6589818596839905,0.16927775740623474,-0.7328628301620483,-0.6589818596839905,0.16927775740623474,-0.7328628301620483,-0.6589818596839905,0.16927775740623474,-0.7328628301620483,-0.6589818596839905,0.16927775740623474,-0.7328628301620483,-0.6589818596839905,0.16927775740623474,-0.5893685817718506,-0.6605226993560791,-0.4651390612125397,-0.5893685817718506,-0.6605226993560791,-0.4651390612125397,-0.5893685817718506,-0.6605226993560791,-0.4651390612125397,-0.5893685817718506,-0.6605226993560791,-0.4651390612125397,-0.5893685817718506,-0.6605226993560791,-0.4651390612125397,0.38937872648239136,-0.6292127966880798,0.6726629734039307,0.38937872648239136,-0.6292127966880798,0.6726629734039307,0.38937872648239136,-0.6292127966880798,0.6726629734039307,0.38937872648239136,-0.6292127966880798,0.6726629734039307,-0.0011698007583618164,0.6591596007347107,0.7520022988319397,-0.0011698007583618164,0.6591596007347107,0.7520022988319397,-0.0011698007583618164,0.6591596007347107,0.7520022988319397,-0.0011698007583618164,0.6591596007347107,0.7520022988319397,-0.0011698007583618164,0.6591596007347107,0.7520022988319397,0.7328664064407349,0.6589823961257935,-0.16926002502441406,0.7328664064407349,0.6589823961257935,-0.16926002502441406,0.7328664064407349,0.6589823961257935,-0.16926002502441406,0.7328664064407349,0.6589823961257935,-0.16926002502441406,0.7328664064407349,0.6589823961257935,-0.16926002502441406,-0.3266833424568176,0.6607902646064758,-0.6757471561431885,-0.3266833424568176,0.6607902646064758,-0.6757471561431885,-0.3266833424568176,0.6607902646064758,-0.6757471561431885,-0.3266833424568176,0.6607902646064758,-0.6757471561431885,-0.3266833424568176,0.6607902646064758,-0.6757471561431885,-0.7360942959785461,0.6567226648330688,-0.16395282745361328,-0.7360942959785461,0.6567226648330688,-0.16395282745361328,-0.7360942959785461,0.6567226648330688,-0.16395282745361328,-0.7360942959785461,0.6567226648330688,-0.16395282745361328,-0.7360942959785461,0.6567226648330688,-0.16395282745361328,0.0001270859647775069,1,0.00006240241782506928,0.0001270859647775069,1,0.00006240241782506928,0.0001270859647775069,1,0.00006240241782506928,0.0001270859647775069,1,0.00006240241782506928,0.0001270859647775069,1,0.00006240241782506928,0.0001270859647775069,1,0.00006240241782506928,0.0001270859647775069,1,0.00006240241782506928,-0.00012663456436712295,-1,-0.00006260263762669638,-0.00012663456436712295,-1,-0.00006260263762669638,-0.00012663456436712295,-1,-0.00006260263762669638,-0.00012663456436712295,-1,-0.00006260263762669638,-0.00012663456436712295,-1,-0.00006260263762669638,-0.00012663456436712295,-1,-0.00006260263762669638,-0.00012663456436712295,-1,-0.00006260263762669638],\n \"normalized\": false\n },\n \"uv\": {\n \"itemSize\": 2,\n \"type\": \"Float32Array\",\n \"array\": [0.012080706655979156,0.01143413782119751,0.02038293331861496,0.2402452826499939,0.07275813817977905,0.7014026641845703,0.23399420082569122,0.044198572635650635,0.012080706655979156,0.09173142910003662,0.09271499514579773,0.0920637845993042,0.22834762930870056,0.033225297927856445,0.24569767713546753,0.027156472206115723,0.8750260472297668,0.27947235107421875,0.15672194957733154,0.03217524290084839,0.15672194957733154,0.040720343589782715,0.21759822964668274,0.041023433208465576,0.624879777431488,0.4702685475349426,0.04823240637779236,0.03318381309509277,0.07462695240974426,0.2401202917098999,0.1386493444442749,0.24023151397705078,0.20049551129341125,0.03662097454071045,0.3756515383720398,0.27943485975265503,0.04823240637779236,0.08685857057571411,0.07282328605651855,0.45090705156326294,0.16252003610134125,0.018233835697174072,0.2011767327785492,0.2402452826499939,0.1273123025894165,0.01617354154586792,0.14694836735725403,0.09188961982727051,0.17717677354812622,0.4513193964958191,0.25039011240005493,0.08733206987380981,0.04823240637779236,0.09189057350158691,0.05499856173992157,0.009189963340759277,0.0725666880607605,0.9514256715774536,0.14694836735725403,0.043423593044281006,0.07372921705245972,0.016311585903167725,0.07462692260742188,0.08685952425003052,0.21925535798072815,0.09241074323654175,0.4275488257408142,0.9517285227775574,0.12057686597108841,0.09188848733901978,0.14611805975437164,0.009021878242492676,0.22737187147140503,0.08733206987380981,0.32245123386383057,0.9515766501426697,0.11080294847488403,0.026038765907287598,0.12057653814554214,0.029400944709777832,0.21095037460327148,0.2402452826499939,0.24711300432682037,0.0928187370300293,0.6267523169517517,0.7800135612487793,0.09018958359956741,0.008709728717803955,0.12057658284902573,0.04346507787704468,0.1830982267856598,0.09213989973068237,0.9277936816215515,0.951744794845581,0.10317572951316833,0.0293390154838562,0.1393822878599167,0.032990872859954834,0.1830982267856598,0.2402452826499939,0.255423367023468,0.09287703037261963,0.8746025562286377,0.7797321677207947,0.16253256797790527,0.03631782531738281,0.16336379945278168,0.04333001375198364,0.2554234266281128,0.2402452826499939,0.8222063779830933,0.9510524272918701,0.03845880925655365,0.09173208475112915,0.10992515832185745,0.01626521348953247,0.24376779794692993,0.04419851303100586,0.42733103036880493,0.701709508895874,0.03845880925655365,0.026774346828460693,0.03845880925655365,0.24016445875167847,0.14694836735725403,0.036410391330718994,0.174796923995018,0.24008393287658691,0.37455111742019653,0.5295032858848572,0.03845880925655365,0.08928269147872925,0.1273123025894165,0.009048819541931152,0.24376779794692993,0.08995997905731201,0.37507760524749756,0.7204967141151428,0.17645640671253204,0.043330609798431396,0.21771717071533203,0.016403138637542725,0.22902902960777283,0.2402452826499939,0.6778356432914734,0.20166105031967163,0.04823240637779236,0.014015018939971924,0.056542813777923584,0.09192115068435669,0.1830982267856598,0.08697599172592163,0.9278727769851685,0.7018176913261414,0.05499856173992157,0.0163193941116333,0.1403140127658844,0.040812790393829346,0.17645637691020966,0.08961743116378784,0.6247076988220215,0.22033452987670898,0.140313982963562,0.08676266670227051,0.15672211349010468,0.09213924407958984,0.18057595193386078,0.017045259475708008,0.5721643567085266,0.201244056224823,0.012080706655979156,0.08928197622299194,0.12499088048934937,0.9704728722572327,0.14694836735725403,0.08941596746444702,0.17478692531585693,0.012857019901275635,0.018697038292884827,0.08670186996459961,0.16502328217029572,0.09206610918045044,0.17724192142486572,0.7014986276626587,0.18057595193386078,0.008743643760681152,0.012080706655979156,0.04335254430770874,0.12887565791606903,0.09186422824859619,0.1393822878599167,0.013869822025299072,0.1774333119392395,0.9517008662223816,0.09104300290346146,0.04336506128311157,0.09271499514579773,0.2402452826499939,0.19964106380939484,0.009263157844543457,0.8223589658737183,0.45139479637145996,0.08440056443214417,0.24022287130355835,0.1928718537092209,0.014091014862060547,0.21759822964668274,0.08731919527053833,0.6777778267860413,0.45166242122650146,0.16253256797790527,0.02800750732421875,0.21095037460327148,0.04365772008895874,0.24711309373378754,0.24022060632705688,0.6778541803359985,0.951484739780426,0.12057655304670334,0.08941489458084106,0.16336379945278168,0.08961677551269531,0.2351137399673462,0.009227573871612549,0.8750938177108765,0.9702678322792053,0.07462695240974426,0.0918915867805481,0.12721094489097595,0.0868040919303894,0.2351137399673462,0.0163571834564209,0.4274844527244568,0.45174920558929443,0.031842514872550964,0.08667910099029541,0.12057653814554214,0.011325597763061523,0.13864925503730774,0.09186530113220215,0.3225155472755432,0.45152556896209717,0.012080706655979156,0.03307300806045532,0.030156202614307404,0.026774346828460693,0.030156515538692474,0.2402452826499939,0.10248857736587524,0.092063307762146,0.6261616945266724,0.5296865701675415,0.12057653814554214,0.2402452826499939,0.1281311959028244,0.025947153568267822,0.21095037460327148,0.029455959796905518,0.21925535798072815,0.2400715947151184,0.3766971230506897,0.7794159054756165,0.07462692260742188,0.02608513832092285,0.1928718537092209,0.09240931272506714,0.23733942210674286,0.0928187370300293,0.24569767713546753,0.007925331592559814,0.875484049320221,0.02962595224380493,0.01882428675889969,0.009150922298431396,0.07462692260742188,0.04079252481460571,0.22737182676792145,0.04158461093902588,0.37476611137390137,0.9705840945243835,0.018697038292884827,0.0407489538192749,0.12485933303833008,0.7203324437141418,0.14611805975437164,0.016146481037139893,0.23399420082569122,0.08995997905731201,0.012080781161785126,0.24023497104644775,0.01882428675889969,0.01627671718597412,0.06800204515457153,0.04341691732406616,0.9276410341262817,0.4518194794654846,0.08440056443214417,0.04074656963348389,0.19964106380939484,0.01640307903289795,0.21095037460327148,0.08995997905731201,0.6247829794883728,0.9699863791465759,0.06695697456598282,0.011504054069519043,0.08440056443214417,0.08688396215438843,0.21095052361488342,0.09248226881027222,0.5721458196640015,0.9508618116378784,0.06800201535224915,0.0894421935081482,0.07372921705245972,0.009201109409332275,0.09104300290346146,0.08953815698623657,0.8750190138816833,0.47052764892578125,0.06631660461425781,0.09192222356796265,0.15672194957733154,0.08697539567947388,0.22834759950637817,0.011532008647918701,0.5722221732139587,0.4511365294456482,0.03184248507022858,0.04074972867965698,0.08440056443214417,0.012897908687591553,0.12721094489097595,0.04081183671951294,0.374919056892395,0.47056519985198975,0.030156202614307404,0.014692902565002441,0.10248860716819763,0.2402452826499939,0.10416048020124435,0.043364644050598145,0.6775245070457458,0.7015867233276367,0.054857321083545685,0.08944112062454224,0.10416045039892197,0.08953768014907837,0.15672194957733154,0.014117896556854248,0.6248504519462585,0.7203134894371033,0.11080294847488403,0.086883544921875,0.16252003610134125,0.009928703308105469,0.19287201762199402,0.24017375707626343,0.9280667304992676,0.20186400413513184,0.030156604945659637,0.09174239635467529,0.054857321083545685,0.043415963649749756,0.10317572951316833,0.011430740356445312,0.5724754929542542,0.7012842297554016,0.04823240637779236,0.04079157114028931,0.10992515832185745,0.009145617485046387,0.12513083219528198,0.4699118137359619,0.25039011240005493,0.04158461093902588,0.03691284358501434,0.017000675201416016,0.11080294847488403,0.04074627161026001,0.1928718537092209,0.041023433208465576,0.8749712705612183,0.22037410736083984,0.1928718537092209,0.0873255729675293,0.21095037460327148,0.011578857898712158,0.23733942210674286,0.2402205467224121,0.8219332098960876,0.20110386610031128,0.1830982267856598,0.040720999240875244,0.19951972365379333,0.08995997905731201,0.21771717071533203,0.009267032146453857,0.8749260902404785,0.7204409241676331,0.03691284358501434,0.009847462177276611,0.11080294847488403,0.24022287130355835,0.19951972365379333,0.04366427659988403,0.8221272826194763,0.7012577056884766,0.01972394436597824,0.03634655475616455,0.056542813777923584,0.2402452826499939,0.11080294847488403,0.09198707342147827,0.18309825658798218,0.026818931102752686,0.8757262825965881,0.5295590758323669,0.04823248088359833,0.2401202917098999,0.1251671314239502,0.7795271873474121,0.12887565791606903,0.24023151397705078,0.17478697001934052,0.026818931102752686,0.21857404708862305,0.026176750659942627,0.03845880925655365,0.04332977533340454,0.09018958359956741,0.01701122522354126,0.1747969537973404,0.09206688404083252,0.32266902923583984,0.7014552354812622,0.06695697456598282,0.02927464246749878,0.1242377758026123,0.2800881862640381,0.14694832265377045,0.2402452826499939,0.1928718090057373,0.03334176540374756,0.2011767327785492,0.09258311986923218,0.05590075999498367,0.036389052867889404,0.06631642580032349,0.2402452826499939,0.08440063893795013,0.09198743104934692,0.25401246547698975,0.027156472206115723,0.6260393857955933,0.2797313928604126,0.02038293331861496,0.09181225299835205,0.09270339459180832,0.026784837245941162,0.12602335214614868,0.5296675562858582,0.16502328217029572,0.24008393287658691,0.2359241247177124,0.03662097454071045,0.08440056443214417,0.026784837245941162,0.15672194957733154,0.2402452826499939,0.22902897000312805,0.09287703037261963,0.25400829315185547,0.007925331592559814,0.6272023916244507,0.02966541051864624,0.05590075999498367,0.026093125343322754,0.07462692260742188,0.03639000654220581,0.08838308602571487,0.03634411096572876,0.20049551129341125,0.026176750659942627,0.2359241247177124,0.026130735874176025,0.24978983402252197,0.01738286018371582,0.2499590814113617,0.03662097454071045,0.01972394436597824,0.0260503888130188,0.034168489277362823,0.036347150802612305,0.11080294847488403,0.03634369373321533,0.1281311959028244,0.03640943765640259,0.14694836735725403,0.02592015266418457,0.1791275292634964,0.03631848096847534,0.21857404708862305,0.03662097454071045],\n \"normalized\": false\n }\n },\n \"index\": {\n \"type\": \"Uint16Array\",\n \"array\": [96,28,86,33,37,139,108,155,151,195,179,135,120,116,17,171,183,175,84,72,237,2,91,230,100,147,8,163,104,227,46,55,112,170,176,189,19,24,219,101,5,225,106,103,11,83,92,88,45,63,49,192,202,190,209,74,26,182,57,185,165,215,43,93,89,140,194,235,71,3,36,143,168,188,200,142,35,95,75,69,79,228,144,1,31,146,156,107,50,41,44,114,166,136,0,145,97,153,158,162,115,111,124,201,206,14,160,224,82,231,90,30,157,152,70,198,193,102,149,99,214,117,65,34,211,94,53,161,110,9,52,105,73,77,27,58,25,187,66,118,22,154,129,32,81,29,78,222,178,21,15,23,119,18,181,184,76,203,199,180,61,56,59,217,68,20,177,174,6,232,242,229,233,240,236,134,243,131,218,239,221,16,241,13,223,238,226,7,244,60,122,246,121,204,245,207,212,250,213,128,251,127,39,248,38,47,247,48,62,249,96,210,28,33,130,37,108,42,155,195,191,179,120,167,116,171,125,183,84,80,72,2,141,91,100,159,147,163,12,104,46,51,55,170,173,176,19,186,24,101,98,5,106,150,103,45,216,63,192,197,202,209,205,74,93,85,89,194,133,235,3,138,36,75,196,69,228,4,144,31,137,146,107,54,50,44,109,114,97,148,153,124,169,201,14,113,160,82,234,231,214,164,117,34,126,211,53,10,161,58,67,25,154,40,129,81,87,29,222,132,178,15,220,23,18,172,181,76,208,203,180,123,61,59,64,217]\n },\n \"boundingSphere\": {\n \"center\": [0,-0.00000762939453125,0],\n \"radius\": 139.86793680588863\n }\n },\n faceValues: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14],\n rotationCombinations: {\n \"1,2\": [1, -51, 0],\n \"1,3\": [-1, -103, -1],\n \"1,4\": [0, -155, 0],\n \"1,5\": [0, 154, 0],\n \"1,6\": [2, 103, -2],\n \"1,7\": [0, 52, 1],\n \"1,8\": [2, -77, -178],\n \"1,9\": [180, -51, -1],\n \"1,10\": [-180, 0, 0],\n \"1,11\": [-179, 51, -1],\n \"1,12\": [-1, 77, -179],\n \"1,13\": [0, 26, 180],\n \"1,14\": [1, -26, -180],\n \"2,3\": [0, -52, 0],\n \"2,4\": [-2, -103, -2],\n \"2,5\": [0, -154, 0],\n \"2,6\": [0, 154, 0],\n \"2,7\": [2, 103, -2],\n \"2,8\": [0, -26, -180],\n \"2,9\": [2, -77, -178],\n \"2,10\": [180, -52, -1],\n \"2,11\": [-180, 0, 0],\n \"2,12\": [-180, 51, -1],\n \"2,13\": [-1, 77, -179],\n \"2,14\": [0, 26, 180],\n \"3,4\": [1, -52, 1],\n \"3,5\": [-2, -103, -2],\n \"3,6\": [0, -154, 0],\n \"3,7\": [0, 155, -1],\n \"3,8\": [0, 26, -180],\n \"3,9\": [0, -26, -179],\n \"3,10\": [1, -77, -179],\n \"3,11\": [180, -52, 0],\n \"3,12\": [180, 0, -1],\n \"3,13\": [-180, 51, -1],\n \"3,14\": [0, 77, 180],\n \"4,5\": [0, -51, 0],\n \"4,6\": [0, -103, 1],\n \"4,7\": [0, -154, 0],\n \"4,8\": [1, 77, 179],\n \"4,9\": [0, 26, -180],\n \"4,10\": [0, -25, -180],\n \"4,11\": [-1, -77, 180],\n \"4,12\": [180, -52, 0],\n \"4,13\": [180, 0, 0],\n \"4,14\": [179, 51, 0],\n \"5,6\": [0, -51, 0],\n \"5,7\": [1, -103, 1],\n \"5,8\": [180, 51, 0],\n \"5,9\": [1, 77, 179],\n \"5,10\": [0, 26, -180],\n \"5,11\": [0, -25, 180],\n \"5,12\": [0, -77, 180],\n \"5,13\": [180, -52, 0],\n \"5,14\": [180, 0, 0],\n \"6,7\": [0, -51, -1],\n \"6,8\": [180, 0, 0],\n \"6,9\": [180, 52, 1],\n \"6,10\": [1, 77, 180],\n \"6,11\": [0, 26, 180],\n \"6,12\": [0, -26, 180],\n \"6,13\": [0, -77, 179],\n \"6,14\": [180, -51, 0],\n \"7,8\": [180, -51, -1],\n \"7,9\": [-180, 0, 0],\n \"7,10\": [-180, 51, 0],\n \"7,11\": [-1, 77, -179],\n \"7,12\": [0, 26, 180],\n \"7,13\": [0, -26, 180],\n \"7,14\": [2, -77, -178],\n \"8,9\": [0, 51, 1],\n \"8,10\": [1, 103, 0],\n \"8,11\": [0, 154, 0],\n \"8,12\": [0, -155, 0],\n \"8,13\": [0, -103, -1],\n \"8,14\": [0, -52, 0],\n \"9,10\": [0, 51, 0],\n \"9,11\": [-1, 103, 1],\n \"9,12\": [0, 154, 0],\n \"9,13\": [0, -154, 0],\n \"9,14\": [2, -103, 2],\n \"10,11\": [0, 51, 0],\n \"10,12\": [0, 103, 0],\n \"10,13\": [0, 154, 0],\n \"10,14\": [0, -154, 0],\n \"11,12\": [0, 52, 0],\n \"11,13\": [0, 103, -1],\n \"11,14\": [0, 155, 0],\n \"12,13\": [0, 52, 0],\n \"12,14\": [3, 103, -3],\n \"13,14\": [-1, 51, 1]\n }\n },\n \"d16\": {\n \"metadata\": {\n \"version\": 4.5,\n \"type\": \"BufferGeometry\",\n \"generator\": \"BufferGeometry.toJSON\"\n },\n \"uuid\": \"C14C9443-AE98-4545-B8F9-EEF68D99E5CB\",\n \"type\": \"BufferGeometry\",\n \"data\": {\n \"attributes\": {\n \"position\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [1.9203956127166748,-75.6114730834961,4.636213302612305,1.9203956127166748,-75.6114730834961,4.636213302612305,1.9203956127166748,-75.6114730834961,4.636213302612305,1.9203956127166748,-75.6114730834961,4.636213302612305,1.9203956127166748,-75.6114730834961,4.636213302612305,1.9203956127166748,-75.6114730834961,4.636213302612305,-1.9200903177261353,1.4698024988174438,78.77789306640625,-1.9200903177261353,1.4698024988174438,78.77789306640625,-1.9200903177261353,1.4698024988174438,78.77789306640625,-1.9200903177261353,1.4698024988174438,78.77789306640625,-1.9200903177261353,1.4698024988174438,78.77789306640625,57.06234359741211,-1.4698084592819214,54.34610366821289,57.06234359741211,-1.4698084592819214,54.34610366821289,57.06234359741211,-1.4698084592819214,54.34610366821289,57.06234359741211,-1.4698084592819214,54.34610366821289,57.06234359741211,-1.4698084592819214,54.34610366821289,-1.9204055070877075,-75.6114730834961,-4.63621187210083,-1.9204055070877075,-75.6114730834961,-4.63621187210083,-1.9204055070877075,-75.6114730834961,-4.63621187210083,-1.9204055070877075,-75.6114730834961,-4.63621187210083,-1.9204055070877075,-75.6114730834961,-4.63621187210083,54.34610366821289,1.4697924852371216,-57.06234359741211,54.34610366821289,1.4697924852371216,-57.06234359741211,54.34610366821289,1.4697924852371216,-57.06234359741211,54.34610366821289,1.4697924852371216,-57.06234359741211,54.34610366821289,1.4697924852371216,-57.06234359741211,1.9206753969192505,1.4697996377944946,78.77787780761719,1.9206753969192505,1.4697996377944946,78.77787780761719,1.9206753969192505,1.4697996377944946,78.77787780761719,1.9206753969192505,1.4697996377944946,78.77787780761719,1.9206753969192505,1.4697996377944946,78.77787780761719,1.9206753969192505,1.4697996377944946,78.77787780761719,-4.6361985206604,75.6114730834961,1.9204007387161255,-4.6361985206604,75.6114730834961,1.9204007387161255,-4.6361985206604,75.6114730834961,1.9204007387161255,-4.6361985206604,75.6114730834961,1.9204007387161255,-4.6361985206604,75.6114730834961,1.9204007387161255,-57.06234359741211,1.469807744026184,-54.34610366821289,-57.06234359741211,1.469807744026184,-54.34610366821289,-57.06234359741211,1.469807744026184,-54.34610366821289,-57.06234359741211,1.469807744026184,-54.34610366821289,-57.06234359741211,1.469807744026184,-54.34610366821289,-57.06234359741211,1.469807744026184,-54.34610366821289,-57.06234359741211,1.469807744026184,-54.34610366821289,78.77787780761719,-1.4698125123977661,-1.9206798076629639,78.77787780761719,-1.4698125123977661,-1.9206798076629639,78.77787780761719,-1.4698125123977661,-1.9206798076629639,78.77787780761719,-1.4698125123977661,-1.9206798076629639,78.77787780761719,-1.4698125123977661,-1.9206798076629639,78.77787780761719,-1.4698125123977661,-1.9206798076629639,4.6362080574035645,-75.6114730834961,-1.9204015731811523,4.6362080574035645,-75.6114730834961,-1.9204015731811523,4.6362080574035645,-75.6114730834961,-1.9204015731811523,4.6362080574035645,-75.6114730834961,-1.9204015731811523,4.6362080574035645,-75.6114730834961,-1.9204015731811523,4.6362080574035645,-75.6114730834961,-1.9204015731811523,57.06194305419922,-1.4698078632354736,-54.346519470214844,57.06194305419922,-1.4698078632354736,-54.346519470214844,57.06194305419922,-1.4698078632354736,-54.346519470214844,57.06194305419922,-1.4698078632354736,-54.346519470214844,1.9201017618179321,-1.4698004722595215,-78.77789306640625,1.9201017618179321,-1.4698004722595215,-78.77789306640625,1.9201017618179321,-1.4698004722595215,-78.77789306640625,1.9201017618179321,-1.4698004722595215,-78.77789306640625,1.9201017618179321,-1.4698004722595215,-78.77789306640625,54.34610366821289,-1.4698083400726318,-57.06234359741211,54.34610366821289,-1.4698083400726318,-57.06234359741211,54.34610366821289,-1.4698083400726318,-57.06234359741211,54.34610366821289,-1.4698083400726318,-57.06234359741211,54.34610366821289,-1.4698083400726318,-57.06234359741211,54.34610366821289,-1.4698083400726318,-57.06234359741211,57.06194305419922,1.469793438911438,-54.346519470214844,57.06194305419922,1.469793438911438,-54.346519470214844,57.06194305419922,1.469793438911438,-54.346519470214844,57.06194305419922,1.469793438911438,-54.346519470214844,57.06194305419922,1.469793438911438,-54.346519470214844,78.77787780761719,1.4697893857955933,-1.920678734779358,78.77787780761719,1.4697893857955933,-1.920678734779358,78.77787780761719,1.4697893857955933,-1.920678734779358,78.77787780761719,1.4697893857955933,-1.920678734779358,78.77787780761719,1.4697893857955933,-1.920678734779358,-54.34610366821289,1.469807505607605,57.06234359741211,-54.34610366821289,1.469807505607605,57.06234359741211,-54.34610366821289,1.469807505607605,57.06234359741211,-54.34610366821289,1.469807505607605,57.06234359741211,-57.06194305419922,-1.469792366027832,54.346519470214844,-57.06194305419922,-1.469792366027832,54.346519470214844,-57.06194305419922,-1.469792366027832,54.346519470214844,-57.06194305419922,-1.469792366027832,54.346519470214844,-78.77787780761719,1.4698104858398438,1.920676589012146,-78.77787780761719,1.4698104858398438,1.920676589012146,-78.77787780761719,1.4698104858398438,1.920676589012146,-78.77787780761719,1.4698104858398438,1.920676589012146,-78.77787780761719,1.4698104858398438,1.920676589012146,-78.77787780761719,1.4698104858398438,1.920676589012146,-57.06234359741211,-1.469793438911438,-54.34610366821289,-57.06234359741211,-1.469793438911438,-54.34610366821289,-57.06234359741211,-1.469793438911438,-54.34610366821289,-57.06234359741211,-1.469793438911438,-54.34610366821289,4.6362409591674805,75.6114730834961,1.920365810394287,4.6362409591674805,75.6114730834961,1.920365810394287,4.6362409591674805,75.6114730834961,1.920365810394287,4.6362409591674805,75.6114730834961,1.920365810394287,4.6362409591674805,75.6114730834961,1.920365810394287,-1.9203522205352783,75.6114730834961,4.636227607727051,-1.9203522205352783,75.6114730834961,4.636227607727051,-1.9203522205352783,75.6114730834961,4.636227607727051,-1.9203522205352783,75.6114730834961,4.636227607727051,-1.9203522205352783,75.6114730834961,4.636227607727051,-1.9203522205352783,75.6114730834961,4.636227607727051,-1.9203522205352783,75.6114730834961,4.636227607727051,1.9204154014587402,75.61146545410156,4.636213302612305,1.9204154014587402,75.61146545410156,4.636213302612305,1.9204154014587402,75.61146545410156,4.636213302612305,1.9204154014587402,75.61146545410156,4.636213302612305,1.9204154014587402,75.61146545410156,4.636213302612305,1.9204154014587402,75.61146545410156,4.636213302612305,-1.9203720092773438,-75.6114730834961,4.636226177215576,-1.9203720092773438,-75.6114730834961,4.636226177215576,-1.9203720092773438,-75.6114730834961,4.636226177215576,-1.9203720092773438,-75.6114730834961,4.636226177215576,-1.9203720092773438,-75.6114730834961,4.636226177215576,-4.636218547821045,-75.61146545410156,1.920400619506836,-4.636218547821045,-75.61146545410156,1.920400619506836,-4.636218547821045,-75.61146545410156,1.920400619506836,-4.636218547821045,-75.61146545410156,1.920400619506836,-4.636218547821045,-75.61146545410156,1.920400619506836,-4.636218547821045,-75.61146545410156,1.920400619506836,-4.636231899261475,-75.61146545410156,-1.9203662872314453,-4.636231899261475,-75.61146545410156,-1.9203662872314453,-4.636231899261475,-75.61146545410156,-1.9203662872314453,-4.636231899261475,-75.61146545410156,-1.9203662872314453,-4.636231899261475,-75.61146545410156,-1.9203662872314453,-4.636231899261475,-75.61146545410156,-1.9203662872314453,-4.636231899261475,-75.61146545410156,-1.9203662872314453,-54.34610366821289,-1.4697926044464111,57.06234359741211,-54.34610366821289,-1.4697926044464111,57.06234359741211,-54.34610366821289,-1.4697926044464111,57.06234359741211,-54.34610366821289,-1.4697926044464111,57.06234359741211,-54.34610366821289,-1.4697926044464111,57.06234359741211,-54.34610366821289,-1.4697926044464111,57.06234359741211,-57.06194305419922,1.4698082208633423,54.346519470214844,-57.06194305419922,1.4698082208633423,54.346519470214844,-57.06194305419922,1.4698082208633423,54.346519470214844,-57.06194305419922,1.4698082208633423,54.346519470214844,-57.06194305419922,1.4698082208633423,54.346519470214844,-57.06194305419922,1.4698082208633423,54.346519470214844,-1.9206644296646118,-1.469801664352417,-78.77787780761719,-1.9206644296646118,-1.469801664352417,-78.77787780761719,-1.9206644296646118,-1.469801664352417,-78.77787780761719,-1.9206644296646118,-1.469801664352417,-78.77787780761719,-1.9206644296646118,-1.469801664352417,-78.77787780761719,-1.9206644296646118,-1.469801664352417,-78.77787780761719,78.77789306640625,1.469791293144226,1.9200873374938965,78.77789306640625,1.469791293144226,1.9200873374938965,78.77789306640625,1.469791293144226,1.9200873374938965,78.77789306640625,1.469791293144226,1.9200873374938965,78.77789306640625,1.469791293144226,1.9200873374938965,78.77789306640625,1.469791293144226,1.9200873374938965,57.06234359741211,1.4697922468185425,54.34610366821289,57.06234359741211,1.4697922468185425,54.34610366821289,57.06234359741211,1.4697922468185425,54.34610366821289,57.06234359741211,1.4697922468185425,54.34610366821289,57.06234359741211,1.4697922468185425,54.34610366821289,78.77789306640625,-1.4698106050491333,1.9200865030288696,78.77789306640625,-1.4698106050491333,1.9200865030288696,78.77789306640625,-1.4698106050491333,1.9200865030288696,78.77789306640625,-1.4698106050491333,1.9200865030288696,78.77789306640625,-1.4698106050491333,1.9200865030288696,54.346519470214844,-1.4698073863983154,57.06194305419922,54.346519470214844,-1.4698073863983154,57.06194305419922,54.346519470214844,-1.4698073863983154,57.06194305419922,54.346519470214844,-1.4698073863983154,57.06194305419922,54.346519470214844,-1.4698073863983154,57.06194305419922,54.346519470214844,1.4697927236557007,57.06194305419922,54.346519470214844,1.4697927236557007,57.06194305419922,54.346519470214844,1.4697927236557007,57.06194305419922,54.346519470214844,1.4697927236557007,57.06194305419922,54.346519470214844,1.4697927236557007,57.06194305419922,-78.77789306640625,1.469812273979187,-1.920089602470398,-78.77789306640625,1.469812273979187,-1.920089602470398,-78.77789306640625,1.469812273979187,-1.920089602470398,-78.77789306640625,1.469812273979187,-1.920089602470398,-4.636211395263672,75.6114730834961,-1.920365810394287,-4.636211395263672,75.6114730834961,-1.920365810394287,-4.636211395263672,75.6114730834961,-1.920365810394287,-4.636211395263672,75.6114730834961,-1.920365810394287,-4.636211395263672,75.6114730834961,-1.920365810394287,-4.636211395263672,75.6114730834961,-1.920365810394287,-54.346519470214844,1.4698083400726318,-57.06194305419922,-54.346519470214844,1.4698083400726318,-57.06194305419922,-54.346519470214844,1.4698083400726318,-57.06194305419922,-54.346519470214844,1.4698083400726318,-57.06194305419922,-54.346519470214844,1.4698083400726318,-57.06194305419922,-1.9206633567810059,1.4698004722595215,-78.77787780761719,-1.9206633567810059,1.4698004722595215,-78.77787780761719,-1.9206633567810059,1.4698004722595215,-78.77787780761719,-1.9206633567810059,1.4698004722595215,-78.77787780761719,-1.9206633567810059,1.4698004722595215,-78.77787780761719,-1.9206633567810059,1.4698004722595215,-78.77787780761719,-1.920385479927063,75.6114730834961,-4.636212348937988,-1.920385479927063,75.6114730834961,-4.636212348937988,-1.920385479927063,75.6114730834961,-4.636212348937988,-1.920385479927063,75.6114730834961,-4.636212348937988,-1.920385479927063,75.6114730834961,-4.636212348937988,-1.920385479927063,75.6114730834961,-4.636212348937988,1.9201031923294067,1.469801664352417,-78.77789306640625,1.9201031923294067,1.469801664352417,-78.77789306640625,1.9201031923294067,1.469801664352417,-78.77789306640625,1.9201031923294067,1.469801664352417,-78.77789306640625,1.9201031923294067,1.469801664352417,-78.77789306640625,1.9203814268112183,75.61146545410156,-4.636227130889893,1.9203814268112183,75.61146545410156,-4.636227130889893,1.9203814268112183,75.61146545410156,-4.636227130889893,1.9203814268112183,75.61146545410156,-4.636227130889893,1.9203814268112183,75.61146545410156,-4.636227130889893,1.9203814268112183,75.61146545410156,-4.636227130889893,4.636227607727051,75.61146545410156,-1.9204010963439941,4.636227607727051,75.61146545410156,-1.9204010963439941,4.636227607727051,75.61146545410156,-1.9204010963439941,4.636227607727051,75.61146545410156,-1.9204010963439941,4.636227607727051,75.61146545410156,-1.9204010963439941,4.636227607727051,75.61146545410156,-1.9204010963439941,4.636227607727051,75.61146545410156,-1.9204010963439941,1.9203611612319946,-75.6114730834961,-4.636227130889893,1.9203611612319946,-75.6114730834961,-4.636227130889893,1.9203611612319946,-75.6114730834961,-4.636227130889893,1.9203611612319946,-75.6114730834961,-4.636227130889893,1.9203611612319946,-75.6114730834961,-4.636227130889893,1.9203611612319946,-75.6114730834961,-4.636227130889893,4.636220455169678,-75.6114730834961,1.9203660488128662,4.636220455169678,-75.6114730834961,1.9203660488128662,4.636220455169678,-75.6114730834961,1.9203660488128662,4.636220455169678,-75.6114730834961,1.9203660488128662,4.636220455169678,-75.6114730834961,1.9203660488128662,4.636220455169678,-75.6114730834961,1.9203660488128662,4.636220455169678,-75.6114730834961,1.9203660488128662,-1.9200901985168457,-1.4697996377944946,78.77789306640625,-1.9200901985168457,-1.4697996377944946,78.77789306640625,-1.9200901985168457,-1.4697996377944946,78.77789306640625,-1.9200901985168457,-1.4697996377944946,78.77789306640625,-1.9200901985168457,-1.4697996377944946,78.77789306640625,-1.9200901985168457,-1.4697996377944946,78.77789306640625,1.9206759929656982,-1.4698023796081543,78.77787780761719,1.9206759929656982,-1.4698023796081543,78.77787780761719,1.9206759929656982,-1.4698023796081543,78.77787780761719,1.9206759929656982,-1.4698023796081543,78.77787780761719,1.9206759929656982,-1.4698023796081543,78.77787780761719,-78.77789306640625,-1.4697893857955933,-1.9200888872146606,-78.77789306640625,-1.4697893857955933,-1.9200888872146606,-78.77789306640625,-1.4697893857955933,-1.9200888872146606,-78.77789306640625,-1.4697893857955933,-1.9200888872146606,-78.77789306640625,-1.4697893857955933,-1.9200888872146606,-78.77789306640625,-1.4697893857955933,-1.9200888872146606,-78.77787780761719,-1.4697915315628052,1.9206773042678833,-78.77787780761719,-1.4697915315628052,1.9206773042678833,-78.77787780761719,-1.4697915315628052,1.9206773042678833,-78.77787780761719,-1.4697915315628052,1.9206773042678833,-78.77787780761719,-1.4697915315628052,1.9206773042678833,-78.77787780761719,-1.4697915315628052,1.9206773042678833,-54.346519470214844,-1.4697924852371216,-57.06194305419922,-54.346519470214844,-1.4697924852371216,-57.06194305419922,-54.346519470214844,-1.4697924852371216,-57.06194305419922,-54.346519470214844,-1.4697924852371216,-57.06194305419922,-54.346519470214844,-1.4697924852371216,-57.06194305419922,-54.346519470214844,-1.4697924852371216,-57.06194305419922,0.00001482796960772248,77.15787506103516,4.608693302543543e-7,0.00001482796960772248,77.15787506103516,4.608693302543543e-7,0.00001482796960772248,77.15787506103516,4.608693302543543e-7,0.00001482796960772248,77.15787506103516,4.608693302543543e-7,0.00001482796960772248,77.15787506103516,4.608693302543543e-7,0.00001482796960772248,77.15787506103516,4.608693302543543e-7,0.00001482796960772248,77.15787506103516,4.608693302543543e-7,0.00001482796960772248,77.15787506103516,4.608693302543543e-7,-0.000005149714979779674,-77.15787506103516,8.015119590254471e-8,-0.000005149714979779674,-77.15787506103516,8.015119590254471e-8,-0.000005149714979779674,-77.15787506103516,8.015119590254471e-8,-0.000005149714979779674,-77.15787506103516,8.015119590254471e-8,-0.000005149714979779674,-77.15787506103516,8.015119590254471e-8,-0.000005149714979779674,-77.15787506103516,8.015119590254471e-8,-0.000005149714979779674,-77.15787506103516,8.015119590254471e-8,-0.000005149714979779674,-77.15787506103516,8.015119590254471e-8],\n \"normalized\": false\n },\n \"normal\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [0.276015043258667,-0.6926735639572144,0.6663474440574646,0.27601727843284607,-0.6926627159118652,0.6663578748703003,0.2760189175605774,-0.692660391330719,0.6663596630096436,0.2760222256183624,-0.6926570534706116,0.6663616299629211,0.276040256023407,-0.6926739811897278,0.6663366556167603,0.276040256023407,-0.6926739811897278,0.6663366556167603,-0.25681689381599426,0.6585057377815247,0.707400381565094,-0.25677764415740967,0.6585237979888916,0.7073978781700134,-0.25676974654197693,0.6585195064544678,0.7074047327041626,-0.25676843523979187,0.658514142036438,0.7074101567268372,-0.25676360726356506,0.6585231423377991,0.7074034810066223,0.6817693710327148,-0.6585230231285095,0.3186502456665039,0.6817746758460999,-0.6585193276405334,0.31864672899246216,0.6817750930786133,-0.6585239171981812,0.3186362087726593,0.6817806363105774,-0.6585127711296082,0.3186471462249756,0.6818035244941711,-0.6585102081298828,0.3186035752296448,-0.27603888511657715,-0.6926746368408203,-0.6663365960121155,-0.27603888511657715,-0.6926746368408203,-0.6663365960121155,-0.2760240435600281,-0.6926567554473877,-0.6663613319396973,-0.27601906657218933,-0.6926603317260742,-0.6663596034049988,-0.276016503572464,-0.6926576495170593,-0.6663634777069092,0.31860223412513733,0.6585102677345276,-0.6818041205406189,0.31864118576049805,0.6585193872451782,-0.6817771792411804,0.31864672899246216,0.6585192680358887,-0.6817746162414551,0.31865164637565613,0.6585074067115784,-0.6817838549613953,0.3186781108379364,0.6585215926170349,-0.6817577481269836,0.2567409873008728,0.6585215926170349,0.7074131965637207,0.2567734122276306,0.6585090756416321,0.7074129581451416,0.2567753195762634,0.6585192680358887,0.7074028849601746,0.2567766308784485,0.6585201025009155,0.7074016332626343,0.25684815645217896,0.6585031747817993,0.7073915004730225,0.2568749189376831,0.6584857106208801,0.707397997379303,-0.6663634181022644,0.6926576495170593,0.2760165333747864,-0.6663627028465271,0.6926561594009399,0.27602237462997437,-0.6663594245910645,0.6926605105400085,0.27601903676986694,-0.666336178779602,0.6926746368408203,0.2760397791862488,-0.666336178779602,0.6926746368408203,0.2760397791862488,-0.6818409562110901,0.6584908962249756,-0.3185632526874542,-0.6818210482597351,0.6585003733634949,-0.3185865879058838,-0.6817838549613953,0.6585077047348022,-0.3186509609222412,-0.6817764043807983,0.6585201025009155,-0.3186413049697876,-0.6817750930786133,0.6585239171981812,-0.31863611936569214,-0.6817746162414551,0.6585193872451782,-0.3186466097831726,-0.6817693710327148,0.6585230827331543,-0.3186500072479248,0.7073933482170105,-0.6585105061531067,-0.256823867559433,0.7073962092399597,-0.6585232615470886,-0.2567831575870514,0.7074015736579895,-0.6585202813148499,-0.2567760646343231,0.7074017524719238,-0.6585232019424438,-0.25676846504211426,0.707402765750885,-0.658519446849823,-0.25677525997161865,0.7074130177497864,-0.6585090756416321,-0.2567734122276306,0.6663360595703125,-0.6926746964454651,-0.27603980898857117,0.6663360595703125,-0.6926746964454651,-0.27603980898857117,0.6663508415222168,-0.6926715970039368,-0.276012122631073,0.6663575768470764,-0.6926620602607727,-0.27601906657218933,0.6663594841957092,-0.6926604509353638,-0.2760190963745117,0.6663633584976196,-0.6926577091217041,-0.27601656317710876,0.6817554831504822,-0.6585215926170349,-0.31868305802345276,0.6817722320556641,-0.6585193276405334,-0.3186517655849457,0.6817790865898132,-0.6585125923156738,-0.3186511695384979,0.6818022131919861,-0.6585102677345276,-0.3186061382293701,0.2567366063594818,-0.65851891040802,-0.7074173092842102,0.2567683160305023,-0.6585140228271484,-0.7074102163314819,0.2567698359489441,-0.6585193872451782,-0.7074047923088074,0.25684165954589844,-0.6584954261779785,-0.7074009776115417,0.25686919689178467,-0.6584891676902771,-0.7073968052864075,0.3186025023460388,-0.6585103273391724,-0.6818039417266846,0.3186361789703369,-0.6585239768028259,-0.6817750930786133,0.3186422288417816,-0.6585192084312439,-0.6817768216133118,0.31864655017852783,-0.6585193276405334,-0.6817747354507446,0.3186500072479248,-0.6585085988044739,-0.6817831993103027,0.3186507225036621,-0.6585209369659424,-0.6817711591720581,0.6817664504051208,0.6585237383842468,-0.31865495443344116,0.6817724108695984,0.6585192084312439,-0.3186517655849457,0.6817728281021118,0.6585238575935364,-0.31864115595817566,0.6817781925201416,0.6585131287574768,-0.31865185499191284,0.681801974773407,0.6585103869438171,-0.31860649585723877,0.7073934674263,0.6585009098052979,-0.25684863328933716,0.707394540309906,0.6584897637367249,-0.2568739354610443,0.7074029445648193,0.6585192680358887,-0.25677525997161865,0.70740807056427,0.6585136651992798,-0.2567750811576843,0.707412600517273,0.6585222482681274,-0.2567406892776489,-0.318678081035614,0.6585216522216797,0.6817576885223389,-0.3186471462249756,0.6585129499435425,0.6817804574966431,-0.3186464309692383,0.658519446849823,0.6817746758460999,-0.31860098242759705,0.6585105657577515,0.681804358959198,-0.6818021535873413,-0.6585102677345276,0.3186064064502716,-0.6817792654037476,-0.6585121750831604,0.3186511993408203,-0.6817723512649536,-0.6585192680358887,0.31865155696868896,-0.6817554831504822,-0.6585215926170349,0.31868308782577515,-0.7074131965637207,0.6585215926170349,0.2567409873008728,-0.7074130773544312,0.6585090756416321,0.2567734122276306,-0.7074027061462402,0.6585195064544678,0.2567752003669739,-0.7074015140533447,0.6585204005241394,0.25677624344825745,-0.7073948979377747,0.6584895253181458,0.25687336921691895,-0.7073922157287598,0.6585012078285217,0.25685107707977295,-0.681803286075592,-0.6585100293159485,-0.3186042904853821,-0.681780993938446,-0.6585121750831604,-0.3186477720737457,-0.6817747354507446,-0.6585192084312439,-0.31864655017852783,-0.6817577481269836,-0.6585215926170349,-0.3186781406402588,0.6663422584533691,0.6926707029342651,0.27603498101234436,0.6663422584533691,0.6926707029342651,0.27603498101234436,0.6663618087768555,0.6926602721214294,0.27601414918899536,0.6663632988929749,0.6926569938659668,0.27601855993270874,0.6663657426834106,0.6926578283309937,0.27601078152656555,-0.276034414768219,0.6926738619804382,0.666339099407196,-0.276034414768219,0.6926738619804382,0.666339099407196,-0.27601510286331177,0.6926615834236145,0.6663600206375122,-0.27601391077041626,0.6926605701446533,0.6663616299629211,-0.2760116159915924,0.6926630735397339,0.6663599014282227,-0.2760094106197357,0.6926736831665039,0.6663497686386108,-0.2760079801082611,0.6926721930503845,0.666351854801178,0.2760111689567566,0.6926732659339905,0.6663495302200317,0.27601638436317444,0.6926575303077698,0.666363537311554,0.276017963886261,0.692661464214325,0.6663587093353271,0.2760191559791565,0.6926603317260742,0.6663596034049988,0.2760407030582428,0.6926730871200562,0.6663374900817871,0.2760407030582428,0.6926730871200562,0.6663374900817871,-0.27603691816329956,-0.6926735043525696,0.6663385629653931,-0.27603691816329956,-0.6926735043525696,0.6663385629653931,-0.27601784467697144,-0.6926572918891907,0.6663633584976196,-0.2760142683982849,-0.692660391330719,0.6663615703582764,-0.2760106921195984,-0.6926577687263489,0.6663656830787659,-0.6663632392883301,-0.6926574110984802,0.27601781487464905,-0.6663596034049988,-0.692660391330719,0.276018887758255,-0.666358232498169,-0.6926620006561279,0.2760181128978729,-0.6663506031036377,-0.6926716566085815,0.27601203322410583,-0.6663397550582886,-0.6926713585853577,0.2760394513607025,-0.6663397550582886,-0.6926713585853577,0.2760394513607025,-0.6663616299629211,-0.6926603317260742,-0.2760140001773834,-0.6663612723350525,-0.6926611661911011,-0.2760130763053894,-0.6663604378700256,-0.6926630735397339,-0.2760102152824402,-0.6663517951965332,-0.6926720142364502,-0.27600860595703125,-0.6663496494293213,-0.6926732659339905,-0.2760104537010193,-0.6663398742675781,-0.6926730871200562,-0.27603474259376526,-0.6663398742675781,-0.6926730871200562,-0.27603474259376526,-0.318651407957077,-0.6585085988044739,0.6817827820777893,-0.31865057349205017,-0.6585232019424438,0.6817690134048462,-0.3186468183994293,-0.6585192680358887,0.6817746758460999,-0.31864237785339355,-0.6585188508033752,0.6817769408226013,-0.3186362087726593,-0.6585239768028259,0.6817749738693237,-0.3185986876487732,-0.6585110425949097,0.6818050146102905,-0.6818026900291443,0.6585108637809753,0.3186039626598358,-0.6817818284034729,0.6585076451301575,0.31865543127059937,-0.681774914264679,0.6585193276405334,0.3186458647251129,-0.6817728281021118,0.6585239171981812,0.31864118576049805,-0.6817721724510193,0.6585193872451782,0.3186517059803009,-0.6817666888237,0.6585231423377991,0.3186558485031128,-0.25682297348976135,-0.6585092544555664,-0.7073948383331299,-0.25678229331970215,-0.6585257649421692,-0.7073943018913269,-0.25677669048309326,-0.6585200428962708,-0.7074015140533447,-0.2567752003669739,-0.6585193276405334,-0.7074028849601746,-0.25677335262298584,-0.6585087776184082,-0.7074132561683655,-0.25676870346069336,-0.6585231423377991,-0.7074016332626343,0.7073953151702881,0.6585105657577515,0.25681835412979126,0.7073976993560791,0.6585239768028259,0.2567773759365082,0.7074037194252014,0.6585230827331543,0.25676336884498596,0.7074037790298462,0.6585202813148499,0.25676998496055603,0.7074049115180969,0.6585192680358887,0.2567700147628784,0.707414984703064,0.658509373664856,0.2567674517631531,0.6817577481269836,0.6585216522216797,0.3186781108379364,0.6817748546600342,0.6585191488265991,0.3186466693878174,0.6817762851715088,0.6585201025009155,0.31864142417907715,0.6817829012870789,0.6585080027580261,0.31865206360816956,0.6818039417266846,0.6585102081298828,0.3186025619506836,0.7073953747749329,-0.6585008502006531,0.25684332847595215,0.7073964476585388,-0.6584898233413696,0.25686851143836975,0.7074047327041626,-0.6585193872451782,0.2567700147628784,0.7074100375175476,-0.6585139036178589,0.25676897168159485,0.7074150443077087,-0.6585217118263245,0.2567354738712311,0.31860607862472534,-0.6585102677345276,0.6818023324012756,0.31864601373672485,-0.6585190892219543,0.6817750334739685,0.31865158677101135,-0.6585192680358887,0.6817724108695984,0.3186558485031128,-0.6585085988044739,0.6817806363105774,0.31868311762809753,-0.6585216522216797,0.6817553639411926,0.31860703229904175,0.658510148525238,0.6818019151687622,0.3186412453651428,0.6585239768028259,0.6817727088928223,0.31865087151527405,0.6585137248039246,0.6817781329154968,0.31865182518959045,0.6585192084312439,0.6817723512649536,0.3186556100845337,0.6585230827331543,0.6817667484283447,-0.707414984703064,0.6585217118263245,-0.25673556327819824,-0.7074099779129028,0.6585142612457275,-0.2567688226699829,-0.7074046730995178,0.6585195064544678,-0.25676992535591125,-0.7073950171470642,0.658510684967041,-0.25681883096694946,-0.666364312171936,0.6926564574241638,-0.2760176658630371,-0.6663615703582764,0.6926605105400085,-0.2760140895843506,-0.6663599610328674,0.6926629543304443,-0.2760114371776581,-0.6663492918014526,0.6926740407943726,-0.27600976824760437,-0.6663401126861572,0.692672848701477,-0.276034951210022,-0.6663401126861572,0.692672848701477,-0.276034951210022,-0.3186555504798889,0.6585217118263245,-0.6817682385444641,-0.3186514973640442,0.6585192680358887,-0.6817724108695984,-0.31865087151527405,0.6585137248039246,-0.6817781329154968,-0.3186410963535309,0.6585239768028259,-0.6817727088928223,-0.31860843300819397,0.6585099697113037,-0.6818014979362488,-0.25687503814697266,0.6584945321083069,-0.7073897123336792,-0.25684797763824463,0.6585018634796143,-0.7073926329612732,-0.25677669048309326,0.6585201025009155,-0.7074015736579895,-0.25677499175071716,0.6585193276405334,-0.7074029445648193,-0.2567721903324127,0.6585090160369873,-0.7074134349822998,-0.256741464138031,0.6585198640823364,-0.7074146270751953,-0.2760404050350189,0.6926735043525696,-0.6663371324539185,-0.2760404050350189,0.6926735043525696,-0.6663371324539185,-0.27601927518844604,0.6926617622375488,-0.6663580536842346,-0.27601882815361023,0.692660391330719,-0.6663596630096436,-0.27601534128189087,0.6926579475402832,-0.6663636565208435,-0.2760111093521118,0.6926732659339905,-0.666349470615387,0.25676339864730835,0.6585231423377991,-0.7074035406112671,0.2567683756351471,0.658514142036438,-0.7074102163314819,0.2567700743675232,0.6585193872451782,-0.7074046730995178,0.2567768692970276,0.6585267186164856,-0.7073954343795776,0.25681787729263306,0.6585150361061096,-0.7073912620544434,0.27600938081741333,0.6926736831665039,-0.6663497090339661,0.27601268887519836,0.6926624774932861,-0.6663600206375122,0.27601420879364014,0.692660391330719,-0.6663615703582764,0.2760183811187744,0.6926562786102295,-0.6663641929626465,0.27603667974472046,0.692672848701477,-0.6663392782211304,0.27603667974472046,0.692672848701477,-0.6663392782211304,0.6663398146629333,0.6926707625389099,-0.2760407030582428,0.6663398146629333,0.6926707625389099,-0.2760407030582428,0.666347861289978,0.6926729083061218,-0.2760158181190491,0.6663495898246765,0.6926727294921875,-0.27601224184036255,0.666358232498169,0.6926625370979309,-0.2760171592235565,0.6663585901260376,0.6926613450050354,-0.27601903676986694,0.6663596630096436,0.6926603317260742,-0.2760190963745117,0.27600938081741333,-0.6926738023757935,-0.6663495302200317,0.27601149678230286,-0.6926628947257996,-0.6663601398468018,0.2760140001773834,-0.6926604509353638,-0.6663616299629211,0.2760170102119446,-0.6926567554473877,-0.6663640737533569,0.27603477239608765,-0.6926739811897278,-0.6663388609886169,0.27603477239608765,-0.6926739811897278,-0.6663388609886169,0.6663395166397095,-0.6926735043525696,0.2760348320007324,0.6663395166397095,-0.6926735043525696,0.2760348320007324,0.6663496494293213,-0.69267338514328,0.2760099768638611,0.6663513779640198,-0.6926727294921875,0.2760077118873596,0.6663597822189331,-0.6926623582839966,0.27601343393325806,0.6663600206375122,-0.6926628947257996,0.2760114371776581,0.6663615703582764,-0.6926604509353638,0.27601417899131775,-0.2568694055080414,-0.6584880352020264,0.7073978185653687,-0.25684303045272827,-0.658505916595459,0.7073907852172852,-0.25677070021629333,-0.6585201025009155,0.7074036002159119,-0.2567701041698456,-0.6585193276405334,0.7074047327041626,-0.2567673623561859,-0.6585090160369873,0.7074152231216431,-0.25673583149909973,-0.6585217118263245,0.7074149250984192,0.25676846504211426,-0.6585231423377991,0.7074017524719238,0.2567743957042694,-0.6585140228271484,0.7074080109596252,0.2567751109600067,-0.6585193276405334,0.7074029445648193,0.25678279995918274,-0.6585239768028259,0.7073957920074463,0.256822794675827,-0.6585081815719604,0.7073959708213806,-0.7074099779129028,-0.6585137248039246,-0.25676944851875305,-0.7074047923088074,-0.6585192680358887,-0.2567698359489441,-0.7074031233787537,-0.6585232019424438,-0.25676456093788147,-0.7073982357978821,-0.658488929271698,-0.2568660080432892,-0.7073976397514343,-0.6585239171981812,-0.2567775249481201,-0.707395076751709,-0.6585009098052979,-0.25684383511543274,-0.7074130177497864,-0.6585085988044739,0.25677454471588135,-0.7074028849601746,-0.6585193872451782,0.2567750811576843,-0.7074017524719238,-0.6585231423377991,0.2567686140537262,-0.7074016332626343,-0.6585202813148499,0.2567755877971649,-0.7073957920074463,-0.6585239171981812,0.2567828893661499,-0.7073920369148254,-0.6585111021995544,0.2568261921405792,-0.31868305802345276,-0.6585215926170349,-0.6817554235458374,-0.3186575174331665,-0.658507764339447,-0.6817806363105774,-0.3186517059803009,-0.6585192084312439,-0.6817723512649536,-0.3186461925506592,-0.658518373966217,-0.6817757487297058,-0.3185906708240509,-0.6585003137588501,-0.6818190813064575,-0.3185673952102661,-0.6584908366203308,-0.6818392276763916,0.000001342588575425907,1,-7.968073134634324e-8,0.000001342588575425907,1,-7.968073134634324e-8,0.000001342588575425907,1,-7.968073134634324e-8,0.000001342588575425907,1,-7.968073134634324e-8,0.000001342588575425907,1,-7.968073134634324e-8,0.000001342588575425907,1,-7.968073134634324e-8,0.000001342588575425907,1,-7.968073134634324e-8,0.000001342588575425907,1,-7.968073134634324e-8,-7.788058837832068e-7,-1,-7.342277541511066e-8,-7.788058837832068e-7,-1,-7.342277541511066e-8,-7.788058837832068e-7,-1,-7.342277541511066e-8,-7.788058837832068e-7,-1,-7.342277541511066e-8,-7.788058837832068e-7,-1,-7.342277541511066e-8,-7.788058837832068e-7,-1,-7.342277541511066e-8,-7.788058837832068e-7,-1,-7.342277541511066e-8,-7.788058837832068e-7,-1,-7.342277541511066e-8],\n \"normalized\": false\n },\n \"uv\": {\n \"itemSize\": 2,\n \"type\": \"Float32Array\",\n \"array\": [0.03048560582101345,0.01567864418029785,0.03048560582101345,0.01567864418029785,0.4374997317790985,0.2620980143547058,0.03719213604927063,0.12196230888366699,0.034566912800073624,0.013053596019744873,0.04797939583659172,0.007471561431884766,0.023779170587658882,0.004848778247833252,0.11408431828022003,0.12196230888366699,0.09070630371570587,0.23767399787902832,0.07480431348085403,0.01567620038986206,0.11408431828022003,0.12196230888366699,0.11983299255371094,0.12196230888366699,0.3407820463180542,0.3628087639808655,0.11983299255371094,0.12196230888366699,0.041273150593042374,0.015676438808441162,0.004617570899426937,0.005231618881225586,0.08821681886911392,0.00785917043685913,0.104537233710289,0.00896519422531128,0.017072739079594612,0.12196230888366699,0.3124997019767761,0.3871912360191345,0.04389829561114311,0.015676259994506836,0.034566912800073624,0.004848778247833252,0.014447606168687344,0.12196230888366699,0.5343227386474609,0.23762238025665283,0.014447606168687344,0.12196230888366699,0.12820686399936676,0.06416767835617065,0.11096081137657166,0.06416738033294678,0.0707232654094696,0.01567620038986206,0.15942715108394623,0.23743665218353271,0.0707232654094696,0.01567620038986206,0.023779170587658882,0.0007677078247070312,0.023779170587658882,0.0007677078247070312,0.07742954790592194,0.12196230888366699,0.007741174660623074,0.12196230888366699,0.5624786019325256,0.012261509895324707,0.061391860246658325,0.013051092624664307,0.07480429112911224,0.007857918739318848,0.01348982285708189,0.004848778247833252,0.01348982285708189,0.004848778247833252,0.027860479429364204,0.12196230888366699,0.027860479429364204,0.12196230888366699,0.12245811522006989,0.06416767835617065,0.4092179536819458,0.11280876398086548,0.12245811522006989,0.06416767835617065,0.07072323560714722,0.005232870578765869,0.12245811522006989,0.06679385900497437,0.06401706486940384,0.12196230888366699,0.12245811522006989,0.06679385900497437,0.21575646102428436,0.36276328563690186,0.06401706486940384,0.12196230888366699,0.05060452222824097,0.007858037948608398,0.06809809058904648,0.007857978343963623,0.09084202349185944,0.12196230888366699,0.09084202349185944,0.12196230888366699,0.18749970197677612,0.26223671436309814,0.06401699781417847,0.015676140785217285,0.12245821952819824,0.12196230888366699,0.15924353897571564,0.36276328563690186,0.09084194898605347,0.015676438808441162,0.03144339099526405,0.000767827033996582,0.13133037090301514,0.003871619701385498,0.04797939583659172,0.12196230888366699,0.03418757766485214,0.362862765789032,0.08725927770137787,0.005232870578765869,0.08725927770137787,0.005232870578765869,0.03144339099526405,0.004848778247833252,0.13133037090301514,0.06416767835617065,0.09492307156324387,0.015676438808441162,0.09081242233514786,0.362862765789032,0.09492307156324387,0.015676438808441162,0.13133037090301514,0.06416767835617065,0.1255817413330078,0.12196230888366699,0.4657820463180542,0.23780876398086548,0.1255817413330078,0.12196230888366699,0.01036630105227232,0.12196230888366699,0.034566912800073624,0.000767827033996582,0.07384677231311798,0.005232870578765869,0.07384677231311798,0.005232870578765869,0.4092180132865906,0.23780876398086548,0.057310834527015686,0.015676259994506836,0.1255817413330078,0.06679385900497437,0.11408431828022003,0.0667925477027893,0.0036600297316908836,0.015675067901611328,0.03429369255900383,0.23767399787902832,0.06497455388307571,0.0011516809463500977,0.06809809058904648,0.005232870578765869,0.09754816442728043,0.015677452087402344,0.15919587016105652,0.48784810304641724,0.12820686399936676,0.12196230888366699,0.13133040070533752,0.06679350137710571,0.07742944359779358,0.01567739248275757,0.5342592000961304,0.11273849010467529,0.07742944359779358,0.01567739248275757,0.05060454457998276,0.0011516809463500977,0.05060454457998276,0.0011516809463500977,0.01036630105227232,0.004848778247833252,0.021154051646590233,0.01567864418029785,0.09083183109760284,0.4878973960876465,0.12558168172836304,0.06416767835617065,0.017355674877762794,0.008966445922851562,0.07771223783493042,0.011559724807739258,0.3124997019767761,0.1371912956237793,0.10425447672605515,0.12196230888366699,0.06139186769723892,0.12196230888366699,0.07072321325540543,0.007857918739318848,0.09112466126680374,0.011558711528778076,0.003660283051431179,0.12196230888366699,0.06249973922967911,0.13732600212097168,0.07480431348085403,0.12196230888366699,0.07480431348085403,0.12196230888366699,0.003660283051431179,0.12196230888366699,0.10833562910556793,0.12196230888366699,0.07072321325540543,0.12196230888366699,0.10833562910556793,0.12196230888366699,0.1875002682209015,0.13756322860717773,0.021154051646590233,0.007474005222320557,0.09492305666208267,0.013051152229309082,0.04418101906776428,0.008964121341705322,0.09783096611499786,0.011559903621673584,0.10162932425737381,0.12196230888366699,0.5625002384185791,0.26224493980407715,0.034566912800073624,0.01567864418029785,0.08821682631969452,0.12196230888366699,0.1874997317790985,0.387151837348938,0.09754827618598938,0.12196230888366699,0.09754827618598938,0.12196230888366699,0.007741096429526806,0.00785684585571289,0.1016293466091156,0.013052403926849365,0.06250026077032089,0.3871026635169983,0.021154044196009636,0.12196230888366699,0.08413578569889069,0.12196230888366699,0.021154044196009636,0.12196230888366699,0.08413578569889069,0.12196230888366699,0.0036600297316908836,0.00785684585571289,0.10833562910556793,0.0074727535247802734,0.10162932425737381,0.015677452087402344,0.11096075177192688,0.0667925477027893,0.5907518267631531,0.3627550005912781,0.10162932425737381,0.015677452087402344,0.11096075177192688,0.0667925477027893,0.06809809058904648,0.0011516809463500977,0.06497455388307571,0.005232870578765869,0.007741174660623074,0.015675067901611328,0.007741174660623074,0.015675067901611328,0.13133040070533752,0.12196230888366699,0.5907407999038696,0.11272633075714111,0.13133040070533752,0.12196230888366699,0.08725927770137787,0.0011516809463500977,0.11670946329832077,0.003871321678161621,0.04389836639165878,0.12196230888366699,0.3407820463180542,0.4878087639808655,0.04389836639165878,0.12196230888366699,0.11670946329832077,0.003871321678161621,0.07384677231311798,0.0011516809463500977,0.11670953035354614,0.06679290533065796,0.11670953035354614,0.06679290533065796,0.06139186769723892,0.015676259994506836,0.34078195691108704,0.2378087043762207,0.06139186769723892,0.015676259994506836,0.11670944094657898,0.12196230888366699,0.2842180132865906,0.2378087043762207,0.1042545735836029,0.01567751169204712,0.1042545735836029,0.01567751169204712,0.007741096429526806,0.005231618881225586,0.07072323560714722,0.0011516809463500977,0.07072323560714722,0.0011516809463500977,0.2842179536819458,0.3628087639808655,0.06809809058904648,0.12196230888366699,0.11983299255371094,0.06679290533065796,0.004617570899426937,0.0011506080627441406,0.03719203174114227,0.015676438808441162,0.40916556119918823,0.3629019856452942,0.03719203174114227,0.015676438808441162,0.11408430337905884,0.003871619701385498,0.007741096429526806,0.0011506080627441406,0.11096075177192688,0.003871619701385498,0.10833562910556793,0.01567751169204712,0.21557284891605377,0.23743665218353271,0.11096075177192688,0.003871619701385498,0.12245815992355347,0.003871917724609375,0.08151060342788696,0.01567739248275757,0.4657820463180542,0.11280876398086548,0.05060454457998276,0.005232870578765869,0.02786046452820301,0.01567864418029785,0.4374997317790985,0.012191295623779297,0.08151060342788696,0.12196230888366699,0.08151060342788696,0.12196230888366699,0.01036630105227232,0.008966505527496338,0.05759349465370178,0.011558592319488525,0.11983299255371094,0.06416738033294678,0.3407820463180542,0.1128087043762207,0.02377944253385067,0.12196230888366699,0.11983299255371094,0.06416738033294678,0.01348982285708189,0.000767827033996582,0.0841357409954071,0.0011516809463500977,0.0841357409954071,0.0011516809463500977,0.05060460418462753,0.015676259994506836,0.2842179536819458,0.11280876398086548,0.05060460418462753,0.015676259994506836,0.11983299255371094,0.003871321678161621,0.014164685271680355,0.007474005222320557,0.03719203174114227,0.008964121341705322,0.023779170587658882,0.01567864418029785,0.31250008940696716,0.012191236019134521,0.05060452222824097,0.12196230888366699,0.023779170587658882,0.01567864418029785,0.12820683419704437,0.0038716793060302734,0.05468563735485077,0.01567620038986206,0.5906772613525391,0.23762238025665283,0.12820683419704437,0.0038716793060302734,0.0841357409954071,0.005232870578765869,0.05468563735485077,0.12196230888366699,0.05468563735485077,0.12196230888366699,0.5624997615814209,0.1373775601387024,0.014447621069848537,0.015678703784942627,0.02377917803823948,0.008966445922851562,0.040990397334098816,0.007471561431884766,0.027577554807066917,0.007474005222320557,0.08151061087846756,0.01305234432220459,0.05731076002120972,0.12196230888366699,0.010366610251367092,0.015678703784942627,0.05731076002120972,0.12196230888366699,0.010366610251367092,0.015678703784942627,0.4375002980232239,0.13719123601913452,0.04797941446304321,0.015676259994506836,0.04797941446304321,0.015676259994506836,0.06250029802322388,0.262137234210968,0.09492305666208267,0.12196230888366699,0.05468561500310898,0.007858037948608398,0.08413572609424591,0.00785917043685913,0.03076852671802044,0.011561095714569092,0.06401699781417847,0.007857978343963623,0.06809809058904648,0.015676140785217285,0.04127315804362297,0.12196230888366699,0.04127315804362297,0.12196230888366699,0.06809809058904648,0.015676140785217285,0.3125002682209015,0.26219117641448975,0.026902692392468452,0.004848778247833252,0.026902692392468452,0.004848778247833252,0.034566912800073624,0.12196230888366699,0.5342481732368469,0.3627550005912781,0.034566912800073624,0.12196230888366699,0.11096090078353882,0.12196230888366699,0.11408430337905884,0.06416738033294678,0.03048589639365673,0.12196230888366699,0.46583443880081177,0.3629019856452942,0.11408430337905884,0.06416738033294678,0.026902692392468452,0.0007677078247070312,0.08413572609424591,0.015676140785217285,0.034168168902397156,0.4878973960876465,0.12558168172836304,0.003871917724609375,0.05372808128595352,0.005232870578765869,0.12558168172836304,0.003871917724609375,0.05372808128595352,0.005232870578765869,0.08821682631969452,0.015676140785217285,0.21580412983894348,0.48784810304641724,0.12820687890052795,0.06679350137710571,0.08821682631969452,0.015676140785217285,0.12820687890052795,0.06679350137710571,0.05372808128595352,0.0011516809463500977,0.11670944094657898,0.06416738033294678,0.01707303337752819,0.01567864418029785,0.2842179536819458,0.4878087639808655,0.01707303337752819,0.01567864418029785,0.01036630105227232,0.000767827033996582,0.01036630105227232,0.000767827033996582,0.014164685271680355,0.013053655624389648,0.021154051646590233,0.013053596019744873,0.027577554807066917,0.013053596019744873,0.040990397334098816,0.013051152229309082,0.061391860246658325,0.00747150182723999,0.07276374846696854,0.013051033020019531,0.08151061087846756,0.007472634315490723,0.09492305666208267,0.007471621036529541,0.005700557492673397,0.013049840927124023,0.034566912800073624,0.007474005222320557,0.04797939583659172,0.013051152229309082,0.052645064890384674,0.013051152229309082,0.06605753302574158,0.013051152229309082,0.08617626875638962,0.01305234432220459,0.1016293466091156,0.0074727535247802734,0.10833562910556793,0.013052403926849365],\n \"normalized\": false\n }\n },\n \"index\": {\n \"type\": \"Uint16Array\",\n \"array\": [97,128,249,171,245,2,83,8,107,137,120,240,12,236,166,262,150,19,23,208,213,190,203,197,78,72,223,101,160,157,255,123,87,114,28,177,91,145,34,42,181,184,48,54,57,238,31,6,76,165,44,254,130,122,108,27,112,126,133,274,192,152,260,142,106,33,38,265,95,253,93,182,185,90,32,239,0,244,69,53,227,212,198,204,161,111,176,129,261,18,85,84,141,258,146,89,13,155,159,219,156,79,139,10,81,169,163,174,170,233,14,21,59,65,125,138,86,73,47,56,40,205,191,224,149,61,246,178,26,222,24,214,250,41,98,232,46,167,209,70,60,63,194,210,68,226,62,36,104,271,105,116,273,115,99,267,100,218,272,217,215,268,216,201,269,200,187,266,188,35,270,134,17,281,16,229,279,228,50,277,51,231,278,230,4,275,5,117,276,118,127,280,237,247,30,77,153,164,257,248,132,109,9,29,189,199,148,143,82,110,37,193,264,251,259,94,186,180,92,241,121,1,67,58,52,211,207,196,162,102,113,131,96,263,85,140,84,256,88,144,11,168,154,221,103,158,136,242,7,169,15,163,172,3,234,21,75,59,124,119,135,71,80,45,39,183,202,225,20,151,243,173,175,220,74,22,252,179,43,235,55,49,206,25,66,64,147,195]\n },\n \"boundingSphere\": {\n \"center\": [0,0,0],\n \"radius\": 135.51845097955697\n }\n },\n faceValues: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],\n rotationCombinations: {\n \"1,2\": [-1, -46, -1],\n \"1,3\": [44, -91, 44],\n \"1,4\": [0, -135, 0],\n \"1,5\": [-1, 179, 1],\n \"1,6\": [-1, 134, 1],\n \"1,7\": [44, 89, -44],\n \"1,8\": [1, 44, -2],\n \"1,9\": [-1, 0, 180],\n \"1,10\": [-2, -45, 179],\n \"1,11\": [-103, -89, 78],\n \"1,12\": [-180, -45, 0],\n \"1,13\": [179, 2, 1],\n \"1,14\": [179, 46, 1],\n \"1,15\": [13, 89, 166],\n \"1,16\": [0, 44, 179],\n \"2,3\": [0, -45, 0],\n \"2,4\": [43, -90, 43],\n \"2,5\": [0, -135, 0],\n \"2,6\": [0, 180, 0],\n \"2,7\": [0, 135, 0],\n \"2,8\": [38, 89, -39],\n \"2,9\": [0, 45, -180],\n \"2,10\": [0, 0, 180],\n \"2,11\": [-1, -45, 179],\n \"2,12\": [-3, -89, 177],\n \"2,13\": [-180, -44, 1],\n \"2,14\": [-179, 0, 0],\n \"2,15\": [-179, 45, 0],\n \"2,16\": [-6, 90, -174],\n \"3,4\": [0, -45, 0],\n \"3,5\": [-54, -90, -54],\n \"3,6\": [0, -135, 0],\n \"3,7\": [0, -180, 0],\n \"3,8\": [-1, 134, 0],\n \"3,9\": [-177, 90, -3],\n \"3,10\": [-1, 45, -180],\n \"3,11\": [-1, 0, 180],\n \"3,12\": [0, -44, 179],\n \"3,13\": [-179, -89, 2],\n \"3,14\": [-179, -45, 1],\n \"3,15\": [-180, 0, 0],\n \"3,16\": [-180, 45, 0],\n \"4,5\": [0, -45, 1],\n \"4,6\": [-47, -90, -47],\n \"4,7\": [-1, -135, 0],\n \"4,8\": [-1, 179, -1],\n \"4,9\": [-180, 45, 0],\n \"4,10\": [-98, 89, -83],\n \"4,11\": [-1, 45, -179],\n \"4,12\": [0, 1, 180],\n \"4,13\": [0, -46, -179],\n \"4,14\": [-161, -89, 20],\n \"4,15\": [180, -44, 0],\n \"4,16\": [180, 1, 0],\n \"5,6\": [-1, -45, 0],\n \"5,7\": [-60, -90, -59],\n \"5,8\": [-1, -136, -1],\n \"5,9\": [180, -1, 1],\n \"5,10\": [180, 44, 0],\n \"5,11\": [-159, 89, -21],\n \"5,12\": [0, 46, 179],\n \"5,13\": [0, -1, -180],\n \"5,14\": [-1, -45, 179],\n \"5,15\": [-109, -89, 72],\n \"5,16\": [-180, -45, 0],\n \"6,7\": [0, -45, 0],\n \"6,8\": [-38, -91, -39],\n \"6,9\": [-180, -45, 0],\n \"6,10\": [-180, 0, 0],\n \"6,11\": [-179, 45, -1],\n \"6,12\": [-177, 89, -3],\n \"6,13\": [0, 44, -179],\n \"6,14\": [-1, 0, -180],\n \"6,15\": [-1, -45, 180],\n \"6,16\": [-174, -90, 6],\n \"7,8\": [1, -46, 0],\n \"7,9\": [-3, -90, 177],\n \"7,10\": [-179, -45, 0],\n \"7,11\": [-179, 0, 0],\n \"7,12\": [-180, 44, -1],\n \"7,13\": [-1, 89, -178],\n \"7,14\": [-1, 45, -179],\n \"7,15\": [0, 0, -180],\n \"7,16\": [0, -45, 180],\n \"8,9\": [0, -44, -179],\n \"8,10\": [12, -89, -167],\n \"8,11\": [179, -46, -1],\n \"8,12\": [179, -2, -1],\n \"8,13\": [-180, 45, 0],\n \"8,14\": [-109, 89, -71],\n \"8,15\": [-2, 45, -178],\n \"8,16\": [-1, 0, -180],\n \"9,10\": [1, 45, -1],\n \"9,11\": [89, 89, -89],\n \"9,12\": [0, 135, 0],\n \"9,13\": [0, -179, 1],\n \"9,14\": [0, -134, 0],\n \"9,15\": [7, -89, 7],\n \"9,16\": [0, -44, -1],\n \"10,11\": [0, 45, 0],\n \"10,12\": [-9, 89, 8],\n \"10,13\": [0, 136, 1],\n \"10,14\": [-1, -179, 0],\n \"10,15\": [-1, -134, 0],\n \"10,16\": [11, -89, 12],\n \"11,12\": [-1, 45, -1],\n \"11,13\": [4, 91, -4],\n \"11,14\": [-1, 136, 1],\n \"11,15\": [-1, -179, 0],\n \"11,16\": [-1, -134, 0],\n \"12,13\": [-1, 47, 2],\n \"12,14\": [6, 91, -6],\n \"12,15\": [0, 136, 0],\n \"12,16\": [0, -179, -1],\n \"13,14\": [1, 44, -1],\n \"13,15\": [68, 89, -68],\n \"13,16\": [-1, 135, 1],\n \"14,15\": [0, 45, 0],\n \"14,16\": [-86, 90, 85],\n \"15,16\": [0, 45, -1]\n }\n },\n \"d20\": {\n \"metadata\": {\n \"version\": 4.5,\n \"type\": \"BufferGeometry\",\n \"generator\": \"BufferGeometry.toJSON\"\n },\n \"uuid\": \"4947963B-5ABA-4507-A373-1DA7805EB4DE\",\n \"type\": \"BufferGeometry\",\n \"data\": {\n \"attributes\": {\n \"position\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-83.39456939697266, 2.066877841949463, 52.33057403564453, -83.39456939697266, 2.066877841949463, 52.33057403564453, -83.39456939697266, 2.066877841949463, 52.33057403564453, -83.39456939697266, 2.066877841949463, 52.33057403564453, -53.607669830322266, 82.60527038574219, 0.00019691196212079376, -53.607669830322266, 82.60527038574219, 0.00019691196212079376, -53.607669830322266, 82.60527038574219, 0.00019691196212079376, -53.607669830322266, 82.60527038574219, 0.00019691196212079376, -84.67233276367188, 1.2774014472961426, -50.26307678222656, -84.67233276367188, 1.2774014472961426, -50.26307678222656, -84.67233276367188, 1.2774014472961426, -50.26307678222656, -84.67233276367188, 1.2774014472961426, -50.26307678222656, -84.67233276367188, -1.2774014472961426, -50.26307678222656, -84.67233276367188, -1.2774014472961426, -50.26307678222656, -84.67233276367188, -1.2774014472961426, -50.26307678222656, -84.67233276367188, -1.2774014472961426, -50.26307678222656, -52.330257415771484, -83.39476013183594, 2.0670700073242188, -52.330257415771484, -83.39476013183594, 2.0670700073242188, -52.330257415771484, -83.39476013183594, 2.0670700073242188, -52.330257415771484, -83.39476013183594, 2.0670700073242188, -1.2770904302597046, -50.263389587402344, 84.67215728759766, -1.2770904302597046, -50.263389587402344, 84.67215728759766, -1.2770904302597046, -50.263389587402344, 84.67215728759766, -1.2770904302597046, -50.263389587402344, 84.67215728759766, -52.33027648925781, 83.39476013183594, -2.066685438156128, -52.33027648925781, 83.39476013183594, -2.066685438156128, -52.33027648925781, 83.39476013183594, -2.066685438156128, -52.33027648925781, 83.39476013183594, -2.066685438156128, -50.26338577270508, 84.67214965820312, 1.2775861024856567, -50.26338577270508, 84.67214965820312, 1.2775861024856567, -50.26338577270508, 84.67214965820312, 1.2775861024856567, -50.26338577270508, 84.67214965820312, 1.2775861024856567, 1.2777124643325806, -50.263389587402344, 84.6721420288086, 1.2777124643325806, -50.263389587402344, 84.6721420288086, 1.2777124643325806, -50.263389587402344, 84.6721420288086, 1.2777124643325806, -50.263389587402344, 84.6721420288086, -2.0671839714050293, -52.330265045166016, -83.39474487304688, -2.0671839714050293, -52.330265045166016, -83.39474487304688, -2.0671839714050293, -52.330265045166016, -83.39474487304688, -2.0671839714050293, -52.330265045166016, -83.39474487304688, 83.39456939697266, 2.066877841949463, -52.33057403564453, 83.39456939697266, 2.066877841949463, -52.33057403564453, 83.39456939697266, 2.066877841949463, -52.33057403564453, 83.39456939697266, 2.066877841949463, -52.33057403564453, 84.67233276367188, 1.2774014472961426, 50.26307678222656, 84.67233276367188, 1.2774014472961426, 50.26307678222656, 84.67233276367188, 1.2774014472961426, 50.26307678222656, 84.67233276367188, 1.2774014472961426, 50.26307678222656, 53.607669830322266, -82.60527038574219, -0.00019691196212079376, 53.607669830322266, -82.60527038574219, -0.00019691196212079376, 53.607669830322266, -82.60527038574219, -0.00019691196212079376, 53.607669830322266, -82.60527038574219, -0.00019691196212079376, 83.39456939697266, -2.066877841949463, -52.33057403564453, 83.39456939697266, -2.066877841949463, -52.33057403564453, 83.39456939697266, -2.066877841949463, -52.33057403564453, 83.39456939697266, -2.066877841949463, -52.33057403564453, 1.2770904302597046, 50.263389587402344, -84.67215728759766, 1.2770904302597046, 50.263389587402344, -84.67215728759766, 1.2770904302597046, 50.263389587402344, -84.67215728759766, 1.2770904302597046, 50.263389587402344, -84.67215728759766, 50.26338577270508, 84.67214965820312, -1.2775861024856567, 50.26338577270508, 84.67214965820312, -1.2775861024856567, 50.26338577270508, 84.67214965820312, -1.2775861024856567, 50.26338577270508, 84.67214965820312, -1.2775861024856567, 83.39495086669922, -2.066877841949463, 52.329959869384766, 83.39495086669922, -2.066877841949463, 52.329959869384766, 83.39495086669922, -2.066877841949463, 52.329959869384766, 83.39495086669922, -2.066877841949463, 52.329959869384766, -50.26339340209961, -84.67214965820312, -1.2772167921066284, -50.26339340209961, -84.67214965820312, -1.2772167921066284, -50.26339340209961, -84.67214965820312, -1.2772167921066284, -50.26339340209961, -84.67214965820312, -1.2772167921066284, -1.2777124643325806, -50.263389587402344, -84.6721420288086, -1.2777124643325806, -50.263389587402344, -84.6721420288086, -1.2777124643325806, -50.263389587402344, -84.6721420288086, -1.2777124643325806, -50.263389587402344, -84.6721420288086, -52.330257415771484, 83.39476013183594, 2.0670700073242188, -52.330257415771484, 83.39476013183594, 2.0670700073242188, -52.330257415771484, 83.39476013183594, 2.0670700073242188, -52.330257415771484, 83.39476013183594, 2.0670700073242188, -82.60507202148438, 0, 53.60797119140625, -82.60507202148438, 0, 53.60797119140625, -82.60507202148438, 0, 53.60797119140625, -82.60507202148438, 0, 53.60797119140625, -2.0665714740753174, 52.330265045166016, 83.39476776123047, -2.0665714740753174, 52.330265045166016, 83.39476776123047, -2.0665714740753174, 52.330265045166016, 83.39476776123047, -2.0665714740753174, 52.330265045166016, 83.39476776123047, -84.67196655273438, -1.2774014472961426, 50.26369857788086, -84.67196655273438, -1.2774014472961426, 50.26369857788086, -84.67196655273438, -1.2774014472961426, 50.26369857788086, -84.67196655273438, -1.2774014472961426, 50.26369857788086, -84.67196655273438, 1.2774014472961426, 50.26369857788086, -84.67196655273438, 1.2774014472961426, 50.26369857788086, -84.67196655273438, 1.2774014472961426, 50.26369857788086, -84.67196655273438, 1.2774014472961426, 50.26369857788086, -53.607669830322266, -82.60527038574219, 0.00019691196212079376, -53.607669830322266, -82.60527038574219, 0.00019691196212079376, -53.607669830322266, -82.60527038574219, 0.00019691196212079376, -53.607669830322266, -82.60527038574219, 0.00019691196212079376, -83.39456939697266, -2.066877841949463, 52.33057403564453, -83.39456939697266, -2.066877841949463, 52.33057403564453, -83.39456939697266, -2.066877841949463, 52.33057403564453, -83.39456939697266, -2.066877841949463, 52.33057403564453, -52.33027648925781, -83.39476013183594, -2.066685438156128, -52.33027648925781, -83.39476013183594, -2.066685438156128, -52.33027648925781, -83.39476013183594, -2.066685438156128, -52.33027648925781, -83.39476013183594, -2.066685438156128, -2.0665714740753174, -52.330265045166016, 83.39476776123047, -2.0665714740753174, -52.330265045166016, 83.39476776123047, -2.0665714740753174, -52.330265045166016, 83.39476776123047, -2.0665714740753174, -52.330265045166016, 83.39476776123047, -1.2770904302597046, 50.263389587402344, 84.67215728759766, -1.2770904302597046, 50.263389587402344, 84.67215728759766, -1.2770904302597046, 50.263389587402344, 84.67215728759766, -1.2770904302597046, 50.263389587402344, 84.67215728759766, -0.0003034261171706021, 53.607669830322266, -82.60527038574219, -0.0003034261171706021, 53.607669830322266, -82.60527038574219, -0.0003034261171706021, 53.607669830322266, -82.60527038574219, -0.0003034261171706021, 53.607669830322266, -82.60527038574219, -2.0671839714050293, 52.330265045166016, -83.39474487304688, -2.0671839714050293, 52.330265045166016, -83.39474487304688, -2.0671839714050293, 52.330265045166016, -83.39474487304688, -2.0671839714050293, 52.330265045166016, -83.39474487304688, -83.39495086669922, 2.066877841949463, -52.329959869384766, -83.39495086669922, 2.066877841949463, -52.329959869384766, -83.39495086669922, 2.066877841949463, -52.329959869384766, -83.39495086669922, 2.066877841949463, -52.329959869384766, 50.26339340209961, 84.67214965820312, 1.2772167921066284, 50.26339340209961, 84.67214965820312, 1.2772167921066284, 50.26339340209961, 84.67214965820312, 1.2772167921066284, 50.26339340209961, 84.67214965820312, 1.2772167921066284, -50.26339340209961, 84.67214965820312, -1.2772167921066284, -50.26339340209961, 84.67214965820312, -1.2772167921066284, -50.26339340209961, 84.67214965820312, -1.2772167921066284, -50.26339340209961, 84.67214965820312, -1.2772167921066284, 2.0671839714050293, 52.330265045166016, 83.39474487304688, 2.0671839714050293, 52.330265045166016, 83.39474487304688, 2.0671839714050293, 52.330265045166016, 83.39474487304688, 2.0671839714050293, 52.330265045166016, 83.39474487304688, 82.60547637939453, 0, 53.607364654541016, 82.60547637939453, 0, 53.607364654541016, 82.60547637939453, 0, 53.607364654541016, 82.60547637939453, 0, 53.607364654541016, 83.39495086669922, 2.066877841949463, 52.329959869384766, 83.39495086669922, 2.066877841949463, 52.329959869384766, 83.39495086669922, 2.066877841949463, 52.329959869384766, 83.39495086669922, 2.066877841949463, 52.329959869384766, 50.26339340209961, -84.67214965820312, 1.2772167921066284, 50.26339340209961, -84.67214965820312, 1.2772167921066284, 50.26339340209961, -84.67214965820312, 1.2772167921066284, 50.26339340209961, -84.67214965820312, 1.2772167921066284, 2.0671839714050293, -52.330265045166016, 83.39474487304688, 2.0671839714050293, -52.330265045166016, 83.39474487304688, 2.0671839714050293, -52.330265045166016, 83.39474487304688, 2.0671839714050293, -52.330265045166016, 83.39474487304688, 50.26338577270508, -84.67214965820312, -1.2775861024856567, 50.26338577270508, -84.67214965820312, -1.2775861024856567, 50.26338577270508, -84.67214965820312, -1.2775861024856567, 50.26338577270508, -84.67214965820312, -1.2775861024856567, -83.39495086669922, -2.066877841949463, -52.329959869384766, -83.39495086669922, -2.066877841949463, -52.329959869384766, -83.39495086669922, -2.066877841949463, -52.329959869384766, -83.39495086669922, -2.066877841949463, -52.329959869384766, -82.60547637939453, 0, -53.607364654541016, -82.60547637939453, 0, -53.607364654541016, -82.60547637939453, 0, -53.607364654541016, -82.60547637939453, 0, -53.607364654541016, 52.330257415771484, 83.39476013183594, -2.0670700073242188, 52.330257415771484, 83.39476013183594, -2.0670700073242188, 52.330257415771484, 83.39476013183594, -2.0670700073242188, 52.330257415771484, 83.39476013183594, -2.0670700073242188, 53.607669830322266, 82.60527038574219, -0.00019691196212079376, 53.607669830322266, 82.60527038574219, -0.00019691196212079376, 53.607669830322266, 82.60527038574219, -0.00019691196212079376, 53.607669830322266, 82.60527038574219, -0.00019691196212079376, 2.0665714740753174, 52.330265045166016, -83.39476776123047, 2.0665714740753174, 52.330265045166016, -83.39476776123047, 2.0665714740753174, 52.330265045166016, -83.39476776123047, 2.0665714740753174, 52.330265045166016, -83.39476776123047, 84.67233276367188, -1.2774014472961426, 50.26307678222656, 84.67233276367188, -1.2774014472961426, 50.26307678222656, 84.67233276367188, -1.2774014472961426, 50.26307678222656, 84.67233276367188, -1.2774014472961426, 50.26307678222656, 84.67196655273438, -1.2774014472961426, -50.26369857788086, 84.67196655273438, -1.2774014472961426, -50.26369857788086, 84.67196655273438, -1.2774014472961426, -50.26369857788086, 84.67196655273438, -1.2774014472961426, -50.26369857788086, 84.67196655273438, 1.2774014472961426, -50.26369857788086, 84.67196655273438, 1.2774014472961426, -50.26369857788086, 84.67196655273438, 1.2774014472961426, -50.26369857788086, 84.67196655273438, 1.2774014472961426, -50.26369857788086, 52.33027648925781, 83.39476013183594, 2.066685438156128, 52.33027648925781, 83.39476013183594, 2.066685438156128, 52.33027648925781, 83.39476013183594, 2.066685438156128, 52.33027648925781, 83.39476013183594, 2.066685438156128, 52.330257415771484, -83.39476013183594, -2.0670700073242188, 52.330257415771484, -83.39476013183594, -2.0670700073242188, 52.330257415771484, -83.39476013183594, -2.0670700073242188, 52.330257415771484, -83.39476013183594, -2.0670700073242188, 82.60507202148438, 0, -53.60797119140625, 82.60507202148438, 0, -53.60797119140625, 82.60507202148438, 0, -53.60797119140625, 82.60507202148438, 0, -53.60797119140625, 52.33027648925781, -83.39476013183594, 2.066685438156128, 52.33027648925781, -83.39476013183594, 2.066685438156128, 52.33027648925781, -83.39476013183594, 2.066685438156128, 52.33027648925781, -83.39476013183594, 2.066685438156128, -50.26338577270508, -84.67214965820312, 1.2775861024856567, -50.26338577270508, -84.67214965820312, 1.2775861024856567, -50.26338577270508, -84.67214965820312, 1.2775861024856567, -50.26338577270508, -84.67214965820312, 1.2775861024856567, 1.2770904302597046, -50.263389587402344, -84.67215728759766, 1.2770904302597046, -50.263389587402344, -84.67215728759766, 1.2770904302597046, -50.263389587402344, -84.67215728759766, 1.2770904302597046, -50.263389587402344, -84.67215728759766, 2.0665714740753174, -52.330265045166016, -83.39476776123047, 2.0665714740753174, -52.330265045166016, -83.39476776123047, 2.0665714740753174, -52.330265045166016, -83.39476776123047, 2.0665714740753174, -52.330265045166016, -83.39476776123047, -0.0003034261171706021, -53.607669830322266, -82.60527038574219, -0.0003034261171706021, -53.607669830322266, -82.60527038574219, -0.0003034261171706021, -53.607669830322266, -82.60527038574219, -0.0003034261171706021, -53.607669830322266, -82.60527038574219, -1.2777124643325806, 50.263389587402344, -84.6721420288086, -1.2777124643325806, 50.263389587402344, -84.6721420288086, -1.2777124643325806, 50.263389587402344, -84.6721420288086, -1.2777124643325806, 50.263389587402344, -84.6721420288086, 0.0003034261171706021, -53.607669830322266, 82.60527038574219, 0.0003034261171706021, -53.607669830322266, 82.60527038574219, 0.0003034261171706021, -53.607669830322266, 82.60527038574219, 0.0003034261171706021, -53.607669830322266, 82.60527038574219, 1.2777124643325806, 50.263389587402344, 84.6721420288086, 1.2777124643325806, 50.263389587402344, 84.6721420288086, 1.2777124643325806, 50.263389587402344, 84.6721420288086, 1.2777124643325806, 50.263389587402344, 84.6721420288086, 0.0003034261171706021, 53.607669830322266, 82.60527038574219, 0.0003034261171706021, 53.607669830322266, 82.60527038574219, 0.0003034261171706021, 53.607669830322266, 82.60527038574219, 0.0003034261171706021, 53.607669830322266, 82.60527038574219],\n \"normalized\": false\n },\n \"normal\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-0.5902835130691528, 0.5619468092918396, 0.5794662833213806, -0.5902835130691528, 0.5619468092918396, 0.5794662833213806, -0.5902835130691528, 0.5619468092918396, 0.5794662833213806, -0.5902835130691528, 0.5619468092918396, 0.5794662833213806, -0.9267594814300537, 0.3756551742553711, -3.650784492492676e-7, -0.9267594814300537, 0.3756551742553711, -3.650784492492676e-7, -0.9267594814300537, 0.3756551742553711, -3.650784492492676e-7, -0.9267594814300537, 0.3756551742553711, -3.650784492492676e-7, -0.9375927448272705, 0.3472937345504761, -0.01751660369336605, -0.9375927448272705, 0.3472937345504761, -0.01751660369336605, -0.9375927448272705, 0.3472937345504761, -0.01751660369336605, -0.9375927448272705, 0.3472937345504761, -0.01751660369336605, -0.9375886917114258, -0.34730517864227295, -0.01751125603914261, -0.9375886917114258, -0.34730517864227295, -0.01751125603914261, -0.9375886917114258, -0.34730517864227295, -0.01751125603914261, -0.9375886917114258, -0.34730517864227295, -0.01751125603914261, -0.5794563889503479, -0.5902886986732483, 0.5619516968727112, -0.5794563889503479, -0.5902886986732483, 0.5619516968727112, -0.5794563889503479, -0.5902886986732483, 0.5619516968727112, -0.5794563889503479, -0.5902886986732483, 0.5619516968727112, -0.34728965163230896, -0.01751914620399475, 0.9375942349433899, -0.34728965163230896, -0.01751914620399475, 0.9375942349433899, -0.34728965163230896, -0.01751914620399475, 0.9375942349433899, -0.34728965163230896, -0.01751914620399475, 0.9375942349433899, -0.579460859298706, 0.5902918577194214, -0.5619436502456665, -0.579460859298706, 0.5902918577194214, -0.5619436502456665, -0.579460859298706, 0.5902918577194214, -0.5619436502456665, -0.579460859298706, 0.5902918577194214, -0.5619436502456665, -0.017521724104881287, 0.9375901818275452, 0.34730058908462524, -0.017521724104881287, 0.9375901818275452, 0.34730058908462524, -0.017521724104881287, 0.9375901818275452, 0.34730058908462524, -0.017521724104881287, 0.9375901818275452, 0.34730058908462524, 0.3473122715950012, -0.017512619495391846, 0.9375860095024109, 0.3473122715950012, -0.017512619495391846, 0.9375860095024109, 0.3473122715950012, -0.017512619495391846, 0.9375860095024109, 0.3473122715950012, -0.017512619495391846, 0.9375860095024109, -0.5619495511054993, -0.579465389251709, -0.5902817845344543, -0.5619495511054993, -0.579465389251709, -0.5902817845344543, -0.5619495511054993, -0.579465389251709, -0.5902817845344543, -0.5619495511054993, -0.579465389251709, -0.5902817845344543, 0.5902835130691528, 0.5619468092918396, -0.5794662833213806, 0.5902835130691528, 0.5619468092918396, -0.5794662833213806, 0.5902835130691528, 0.5619468092918396, -0.5794662833213806, 0.5902835130691528, 0.5619468092918396, -0.5794662833213806, 0.9375926852226257, 0.3472939133644104, 0.017516572028398514, 0.9375926852226257, 0.3472939133644104, 0.017516572028398514, 0.9375926852226257, 0.3472939133644104, 0.017516572028398514, 0.9375926852226257, 0.3472939133644104, 0.017516572028398514, 0.9267594814300537, -0.3756551742553711, -0.000007398426532745361, 0.9267594814300537, -0.3756551742553711, -0.000007398426532745361, 0.9267594814300537, -0.3756551742553711, -0.000007398426532745361, 0.9267594814300537, -0.3756551742553711, -0.000007398426532745361, 0.590289294719696, -0.5619460344314575, -0.5794610977172852, 0.590289294719696, -0.5619460344314575, -0.5794610977172852, 0.590289294719696, -0.5619460344314575, -0.5794610977172852, 0.590289294719696, -0.5619460344314575, -0.5794610977172852, 0.3473011553287506, 0.017513729631900787, -0.9375900626182556, 0.3473011553287506, 0.017513729631900787, -0.9375900626182556, 0.3473011553287506, 0.017513729631900787, -0.9375900626182556, 0.3473011553287506, 0.017513729631900787, -0.9375900626182556, 0.01752115786075592, 0.9375901818275452, -0.3473004698753357, 0.01752115786075592, 0.9375901818275452, -0.3473004698753357, 0.01752115786075592, 0.9375901818275452, -0.3473004698753357, 0.01752115786075592, 0.9375901818275452, -0.3473004698753357, 0.5902906656265259, -0.5619435906410217, 0.5794621706008911, 0.5902906656265259, -0.5619435906410217, 0.5794621706008911, 0.5902906656265259, -0.5619435906410217, 0.5794621706008911, 0.5902906656265259, -0.5619435906410217, 0.5794621706008911, -0.01751122623682022, -0.9375880360603333, -0.34730690717697144, -0.01751122623682022, -0.9375880360603333, -0.34730690717697144, -0.01751122623682022, -0.9375880360603333, -0.34730690717697144, -0.01751122623682022, -0.9375880360603333, -0.34730690717697144, -0.34731000661849976, -0.01751551777124405, -0.9375866651535034, -0.34731000661849976, -0.01751551777124405, -0.9375866651535034, -0.34731000661849976, -0.01751551777124405, -0.9375866651535034, -0.34731000661849976, -0.01751551777124405, -0.9375866651535034, -0.5794625282287598, 0.5902847647666931, 0.5619492530822754, -0.5794625282287598, 0.5902847647666931, 0.5619492530822754, -0.5794625282287598, 0.5902847647666931, 0.5619492530822754, -0.5794625282287598, 0.5902847647666931, 0.5619492530822754, -0.3756488859653473, -0.000004090368747711182, 0.9267621040344238, -0.3756488859653473, -0.000004090368747711182, 0.9267621040344238, -0.3756488859653473, -0.000004090368747711182, 0.9267621040344238, -0.3756488859653473, -0.000004090368747711182, 0.9267621040344238, -0.5619439482688904, 0.5794651508331299, 0.5902872681617737, -0.5619439482688904, 0.5794651508331299, 0.5902872681617737, -0.5619439482688904, 0.5794651508331299, 0.5902872681617737, -0.5619439482688904, 0.5794651508331299, 0.5902872681617737, -0.9375901818275452, -0.34730082750320435, 0.017511630430817604, -0.9375901818275452, -0.34730082750320435, 0.017511630430817604, -0.9375901818275452, -0.34730082750320435, 0.017511630430817604, -0.9375901818275452, -0.34730082750320435, 0.017511630430817604, -0.9375885128974915, 0.3473053276538849, 0.017515607178211212, -0.9375885128974915, 0.3473053276538849, 0.017515607178211212, -0.9375885128974915, 0.3473053276538849, 0.017515607178211212, -0.9375885128974915, 0.3473053276538849, 0.017515607178211212, -0.9267594814300537, -0.3756551742553711, 0.000007398426532745361, -0.9267594814300537, -0.3756551742553711, 0.000007398426532745361, -0.9267594814300537, -0.3756551742553711, 0.000007398426532745361, -0.9267594814300537, -0.3756551742553711, 0.000007398426532745361, -0.590289294719696, -0.5619460344314575, 0.5794610977172852, -0.590289294719696, -0.5619460344314575, 0.5794610977172852, -0.590289294719696, -0.5619460344314575, 0.5794610977172852, -0.590289294719696, -0.5619460344314575, 0.5794610977172852, -0.5794673562049866, -0.5902878642082214, -0.5619411468505859, -0.5794673562049866, -0.5902878642082214, -0.5619411468505859, -0.5794673562049866, -0.5902878642082214, -0.5619411468505859, -0.5794673562049866, -0.5902878642082214, -0.5619411468505859, -0.56194669008255, -0.5794578194618225, 0.5902919173240662, -0.56194669008255, -0.5794578194618225, 0.5902919173240662, -0.56194669008255, -0.5794578194618225, 0.5902919173240662, -0.56194669008255, -0.5794578194618225, 0.5902919173240662, -0.3473033905029297, 0.01751108467578888, 0.9375893473625183, -0.3473033905029297, 0.01751108467578888, 0.9375893473625183, -0.3473033905029297, 0.01751108467578888, 0.9375893473625183, -0.3473033905029297, 0.01751108467578888, 0.9375893473625183, -0.000006303191184997559, 0.9267597794532776, -0.3756546974182129, -0.000006303191184997559, 0.9267597794532776, -0.3756546974182129, -0.000006303191184997559, 0.9267597794532776, -0.3756546974182129, -0.000006303191184997559, 0.9267597794532776, -0.3756546974182129, -0.5619495511054993, 0.5794599056243896, -0.5902870297431946, -0.5619495511054993, 0.5794599056243896, -0.5902870297431946, -0.5619495511054993, 0.5794599056243896, -0.5902870297431946, -0.5619495511054993, 0.5794599056243896, -0.5902870297431946, -0.590303897857666, 0.5619341731071472, -0.5794578194618225, -0.590303897857666, 0.5619341731071472, -0.5794578194618225, -0.590303897857666, 0.5619341731071472, -0.5794578194618225, -0.590303897857666, 0.5619341731071472, -0.5794578194618225, 0.017507383599877357, 0.9375904202461243, 0.34730064868927, 0.017507383599877357, 0.9375904202461243, 0.34730064868927, 0.017507383599877357, 0.9375904202461243, 0.34730064868927, 0.017507383599877357, 0.9375904202461243, 0.34730064868927, -0.017507383599877357, 0.9375904202461243, -0.3473004698753357, -0.017507383599877357, 0.9375904202461243, -0.3473004698753357, -0.017507383599877357, 0.9375904202461243, -0.3473004698753357, -0.017507383599877357, 0.9375904202461243, -0.3473004698753357, 0.5619532465934753, 0.5794590711593628, 0.5902844667434692, 0.5619532465934753, 0.5794590711593628, 0.5902844667434692, 0.5619532465934753, 0.5794590711593628, 0.5902844667434692, 0.5619532465934753, 0.5794590711593628, 0.5902844667434692, 0.3756416141986847, 0.0000029206275939941406, 0.926764965057373, 0.3756416141986847, 0.0000029206275939941406, 0.926764965057373, 0.3756416141986847, 0.0000029206275939941406, 0.926764965057373, 0.3756416141986847, 0.0000029206275939941406, 0.926764965057373, 0.5902771949768066, 0.5619665384292603, 0.5794534683227539, 0.5902771949768066, 0.5619665384292603, 0.5794534683227539, 0.5902771949768066, 0.5619665384292603, 0.5794534683227539, 0.5902771949768066, 0.5619665384292603, 0.5794534683227539, 0.017511233687400818, -0.937588095664978, 0.3473067581653595, 0.017511233687400818, -0.937588095664978, 0.3473067581653595, 0.017511233687400818, -0.937588095664978, 0.3473067581653595, 0.017511233687400818, -0.937588095664978, 0.3473067581653595, 0.5619463324546814, -0.579465389251709, 0.5902849435806274, 0.5619463324546814, -0.579465389251709, 0.5902849435806274, 0.5619463324546814, -0.579465389251709, 0.5902849435806274, 0.5619463324546814, -0.579465389251709, 0.5902849435806274, 0.017518242821097374, -0.9375925660133362, -0.34729424118995667, 0.017518242821097374, -0.9375925660133362, -0.34729424118995667, 0.017518242821097374, -0.9375925660133362, -0.34729424118995667, 0.017518242821097374, -0.9375925660133362, -0.34729424118995667, -0.5902858376502991, -0.5619493722915649, -0.5794615745544434, -0.5902858376502991, -0.5619493722915649, -0.5794615745544434, -0.5902858376502991, -0.5619493722915649, -0.5794615745544434, -0.5902858376502991, -0.5619493722915649, -0.5794615745544434, -0.37564951181411743, 0.0000028908252716064453, -0.9267617464065552, -0.37564951181411743, 0.0000028908252716064453, -0.9267617464065552, -0.37564951181411743, 0.0000028908252716064453, -0.9267617464065552, -0.37564951181411743, 0.0000028908252716064453, -0.9267617464065552, 0.5794623494148254, 0.5902848839759827, -0.5619493126869202, 0.5794623494148254, 0.5902848839759827, -0.5619493126869202, 0.5794623494148254, 0.5902848839759827, -0.5619493126869202, 0.5794623494148254, 0.5902848839759827, -0.5619493126869202, 0.9267598390579224, 0.3756541609764099, 2.980232238769531e-7, 0.9267598390579224, 0.3756541609764099, 2.980232238769531e-7, 0.9267598390579224, 0.3756541609764099, 2.980232238769531e-7, 0.9267598390579224, 0.3756541609764099, 2.980232238769531e-7, 0.5619441866874695, 0.5794647932052612, -0.5902873873710632, 0.5619441866874695, 0.5794647932052612, -0.5902873873710632, 0.5619441866874695, 0.5794647932052612, -0.5902873873710632, 0.5619441866874695, 0.5794647932052612, -0.5902873873710632, 0.9375880360603333, -0.347307026386261, 0.017507091164588928, 0.9375880360603333, -0.347307026386261, 0.017507091164588928, 0.9375880360603333, -0.347307026386261, 0.017507091164588928, 0.9375880360603333, -0.347307026386261, 0.017507091164588928, 0.9375901818275452, -0.34730082750320435, -0.017511630430817604, 0.9375901818275452, -0.34730082750320435, -0.017511630430817604, 0.9375901818275452, -0.34730082750320435, -0.017511630430817604, 0.9375901818275452, -0.34730082750320435, -0.017511630430817604, 0.9375885128974915, 0.3473053276538849, -0.017515607178211212, 0.9375885128974915, 0.3473053276538849, -0.017515607178211212, 0.9375885128974915, 0.3473053276538849, -0.017515607178211212, 0.9375885128974915, 0.3473053276538849, -0.017515607178211212, 0.5794609785079956, 0.5902916789054871, 0.5619437098503113, 0.5794609785079956, 0.5902916789054871, 0.5619437098503113, 0.5794609785079956, 0.5902916789054871, 0.5619437098503113, 0.5794609785079956, 0.5902916789054871, 0.5619437098503113, 0.5794563889503479, -0.5902886986732483, -0.5619516968727112, 0.5794563889503479, -0.5902886986732483, -0.5619516968727112, 0.5794563889503479, -0.5902886986732483, -0.5619516968727112, 0.5794563889503479, -0.5902886986732483, -0.5619516968727112, 0.3756488859653473, -0.000004090368747711182, -0.9267621040344238, 0.3756488859653473, -0.000004090368747711182, -0.9267621040344238, 0.3756488859653473, -0.000004090368747711182, -0.9267621040344238, 0.3756488859653473, -0.000004090368747711182, -0.9267621040344238, 0.5794673562049866, -0.5902878642082214, 0.5619410276412964, 0.5794673562049866, -0.5902878642082214, 0.5619410276412964, 0.5794673562049866, -0.5902878642082214, 0.5619410276412964, 0.5794673562049866, -0.5902878642082214, 0.5619410276412964, -0.017518242821097374, -0.9375925660133362, 0.34729424118995667, -0.017518242821097374, -0.9375925660133362, 0.34729424118995667, -0.017518242821097374, -0.9375925660133362, 0.34729424118995667, -0.017518242821097374, -0.9375925660133362, 0.34729424118995667, 0.34729689359664917, -0.017507314682006836, -0.9375919103622437, 0.34729689359664917, -0.017507314682006836, -0.9375919103622437, 0.34729689359664917, -0.017507314682006836, -0.9375919103622437, 0.34729689359664917, -0.017507314682006836, -0.9375919103622437, 0.5619431734085083, -0.5794587135314941, -0.5902944207191467, 0.5619431734085083, -0.5794587135314941, -0.5902944207191467, 0.5619431734085083, -0.5794587135314941, -0.5902944207191467, 0.5619431734085083, -0.5794587135314941, -0.5902944207191467, 0.0000016316771507263184, -0.9267597794532776, -0.3756546974182129, 0.0000016316771507263184, -0.9267597794532776, -0.3756546974182129, 0.0000016316771507263184, -0.9267597794532776, -0.3756546974182129, 0.0000016316771507263184, -0.9267597794532776, -0.3756546974182129, -0.3473055958747864, 0.017509743571281433, -0.9375884532928467, -0.3473055958747864, 0.017509743571281433, -0.9375884532928467, -0.3473055958747864, 0.017509743571281433, -0.9375884532928467, -0.3473055958747864, 0.017509743571281433, -0.9375884532928467, -0.0000012889504432678223, -0.9267591834068298, 0.3756559193134308, -0.0000012889504432678223, -0.9267591834068298, 0.3756559193134308, -0.0000012889504432678223, -0.9267591834068298, 0.3756559193134308, -0.0000012889504432678223, -0.9267591834068298, 0.3756559193134308, 0.3473014235496521, 0.01751813292503357, 0.9375898241996765, 0.3473014235496521, 0.01751813292503357, 0.9375898241996765, 0.3473014235496521, 0.01751813292503357, 0.9375898241996765, 0.3473014235496521, 0.01751813292503357, 0.9375898241996765, 0.000006429851055145264, 0.9267741441726685, 0.37561920285224915, 0.000006429851055145264, 0.9267741441726685, 0.37561920285224915, 0.000006429851055145264, 0.9267741441726685, 0.37561920285224915, 0.000006429851055145264, 0.9267741441726685, 0.37561920285224915],\n \"normalized\": false\n },\n \"uv\": {\n \"itemSize\": 2,\n \"type\": \"Float32Array\",\n \"array\": [0.050937071442604065, 0.0637897253036499, 0.11147573590278625, 0.05759662389755249, 0.1211576759815216, 0.10764795541763306, 0.12535500526428223, 0.35762202739715576, 0.05231131985783577, 0.1178632378578186, 0.07363925129175186, 0.11786329746246338, 0.119850754737854, 0.015513718128204346, 0.6247040033340454, 0.2332320213317871, 0.02066764421761036, 0.05759531259536743, 0.07363908737897873, 0.06378960609436035, 0.1211576759815216, 0.005298316478729248, 0.5624589920043945, 0.1254199743270874, 0.0220418032258749, 0.05759531259536743, 0.08258064091205597, 0.0637897253036499, 0.1211576759815216, 0.0066724419593811035, 0.24976900219917297, 0.6079350113868713, 0.02066793106496334, 0.11786329746246338, 0.02823532558977604, 0.06378841400146484, 0.1211576759815216, 0.09218895435333252, 0.4997659921646118, 0.1081160306930542, 0.08120644837617874, 0.057596445083618164, 0.0977153331041336, 0.11786329746246338, 0.1190430074930191, 0.039651691913604736, 0.4997679889202118, 0.3578059673309326, 0.05987865850329399, 0.0035230517387390137, 0.07501331716775894, 0.11786329746246338, 0.1190430074930191, 0.014401912689208984, 0.3747130036354065, 0.48311901092529297, 0.037176623940467834, 0.06378841400146484, 0.08877374976873398, 0.0637897253036499, 0.1211576759815216, 0.013714849948883057, 0.3754439949989319, 0.48308396339416504, 0.01310031395405531, 0.057595252990722656, 0.08258060365915298, 0.05759638547897339, 0.119850754737854, 0.038539886474609375, 0.24988000094890594, 0.4829980134963989, 0.04336973652243614, 0.003524184226989746, 0.06254100054502487, 0.37501800060272217, 0.08877380937337875, 0.05759662389755249, 0.11985072493553162, 0.04695647954940796, 0.00035799999022856355, 0.6079339981079102, 0.02823505364358425, 0.05759531259536743, 0.096341073513031, 0.0035229921340942383, 0.1190430074930191, 0.02281850576400757, 0.06744597852230072, 0.05759650468826294, 0.07363912463188171, 0.05759662389755249, 0.121157705783844, 0.0557977557182312, 0.3125090003013611, 0.0000960230827331543, 0.0055332062765955925, 0.11786329746246338, 0.10390840470790863, 0.0637897253036499, 0.11985082179307938, 0.09880667924880981, 0.5625389814376831, 0.25025200843811035, 0.0069072050973773, 0.06378835439682007, 0.05093708261847496, 0.0035218000411987305, 0.1211576759815216, 0.02213144302368164, 0.2504560053348541, 0.3578009605407715, 0.0296091977506876, 0.0035229921340942383, 0.06246799975633621, 0.25025999546051025, 0.10390840470790863, 0.0035241246223449707, 0.1211576759815216, 0.0823981761932373, 0.044743988662958145, 0.06378841400146484, 0.09014798700809479, 0.11786329746246338, 0.1211576759815216, 0.11606442928314209, 0.5002009868621826, 0.10809803009033203, 0.014474472962319851, 0.003522932529449463, 0.10528266429901123, 0.1178632378578186, 0.119850754737854, 0.05759662389755249, 0.24995200335979462, 0.2328779697418213, 0.006907171569764614, 0.057595252990722656, 0.062495000660419464, 0.12494999170303345, 0.0901479572057724, 0.0035241246223449707, 0.11904306709766388, 0.09150189161300659, 0.04474392160773277, 0.003524184226989746, 0.10528260469436646, 0.05759662389755249, 0.1190430074930191, 0.048068225383758545, 0.37474000453948975, 0.23276197910308838, 0.03580237179994583, 0.06378841400146484, 0.05093725398182869, 0.11786329746246338, 0.1211576759815216, 0.015089035034179688, 0.1876010000705719, 0.24980902671813965, 0.09771531820297241, 0.0637897253036499, 0.1128498986363411, 0.05759662389755249, 0.1211576759815216, 0.10902208089828491, 0.37527701258659363, 0.3578059673309326, 0.03580237179994583, 0.11786329746246338, 0.11147570610046387, 0.003524184226989746, 0.119850754737854, 0.030123412609100342, 0.24984599649906158, 0.35762202739715576, 0.02204183302819729, 0.0035229921340942383, 0.029609275981783867, 0.11786329746246338, 0.11904306709766388, 0.10833495855331421, 0.12527799606323242, 0.6079350113868713, 0.02066764421761036, 0.0035229921340942383, 0.05231131985783577, 0.0637897253036499, 0.11985082179307938, 0.1072232723236084, 0.5002130270004272, 0.2332320213317871, 0.029609275981783867, 0.06378841400146484, 0.08258064091205597, 0.11786329746246338, 0.1211576759815216, 0.09081476926803589, 0.1875240057706833, 0.5001220107078552, 0.028234990313649178, 0.11786329746246338, 0.096341073513031, 0.0637897253036499, 0.11985072493553162, 0.1094467043876648, 0.37527498602867126, 0.1081160306930542, 0.00029600001289509237, 0.4828310012817383, 0.08120640367269516, 0.11786329746246338, 0.08877374976873398, 0.0035241246223449707, 0.11985082179307938, 0.09039008617401123, 0.02066764421761036, 0.06378841400146484, 0.09634126722812653, 0.11786329746246338, 0.119850754737854, 0.04076343774795532, 0.43751999735832214, 0.00030297040939331055, 0.08120640367269516, 0.0035240650177001953, 0.1128498986363411, 0.003524184226989746, 0.1190430074930191, 0.031235098838806152, 0.4375219941139221, 0.2499929666519165, 0.04474368318915367, 0.11786329746246338, 0.05850442126393318, 0.05759662389755249, 0.119850754737854, 0.0841970443725586, 0.6246920228004456, 0.10809803009033203, 0.059878647327423096, 0.05759662389755249, 0.06607192009687424, 0.11786329746246338, 0.11904306709766388, 0.08308535814285278, 0.3124679923057556, 0.37530601024627686, 0.06607174873352051, 0.0637897253036499, 0.07501332461833954, 0.06378960609436035, 0.119850754737854, 0.00487363338470459, 0.25022199749946594, 0.48311901092529297, 0.05987865850329399, 0.11786329746246338, 0.0887739360332489, 0.11786329746246338, 0.119850754737854, 0.11563986539840698, 0.43768998980522156, 0.3752709627151489, 0.05850460007786751, 0.0035230517387390137, 0.09014798700809479, 0.0637897253036499, 0.11985069513320923, 0.013290226459503174, 0.5624470114707947, 0.00028502941131591797, 0.05850442126393318, 0.06378966569900513, 0.11147573590278625, 0.11786329746246338, 0.1211576759815216, 0.031922221183776855, 0.43765100836753845, 0.12517499923706055, 0.013100284151732922, 0.003522932529449463, 0.11284996569156647, 0.0637897253036499, 0.1190430074930191, 0.056484758853912354, 0.18763400614261627, 0.3751859664916992, 0.06607174873352051, 0.05759650468826294, 0.11147589981555939, 0.0637897253036499, 0.119850754737854, 0.05537313222885132, 0.3754050135612488, 0.23298698663711548, 0.005532982759177685, 0.0035241246223449707, 0.037176575511693954, 0.0035229921340942383, 0.119850754737854, 0.10103017091751099, 0.5628489851951599, 0.37501800060272217, 0.014474472962319851, 0.057595252990722656, 0.03580237179994583, 0.05759531259536743, 0.1211576759815216, 0.03896456956863403, 0.18770700693130493, 0.12506598234176636, 0.006907171569764614, 0.0035241246223449707, 0.014474536292254925, 0.11786329746246338, 0.1211576759815216, 0.10060548782348633, 0.12473999708890915, 0.23276197910308838, 0.04336966946721077, 0.05759531259536743, 0.08120658993721008, 0.0637897253036499, 0.119850754737854, 0.007097125053405762, 0.12478700280189514, 0.4828310012817383, 0.04474392160773277, 0.05759531259536743, 0.06744600087404251, 0.0637897253036499, 0.1190430074930191, 0.005985379219055176, 0.31249499320983887, 0.12494999170303345, 0.04336971789598465, 0.06378841400146484, 0.06260299682617188, 0.500120997428894, 0.09634125232696533, 0.05759662389755249, 0.1211576759815216, 0.11743861436843872, 0.06744597852230072, 0.003522932529449463, 0.09771530330181122, 0.05759662389755249, 0.11985082179307938, 0.11786329746246338, 0.37475401163101196, 0.10790902376174927, 0.02823500521481037, 0.0035229921340942383, 0.04336973652243614, 0.11786329746246338, 0.1211576759815216, 0.08377236127853394, 0.12484899908304214, 0.6079339981079102, 0.07501329481601715, 0.05759662389755249, 0.10390856862068176, 0.11786329746246338, 0.121157705783844, 0.05717200040817261, 0.624783992767334, 0.35806500911712646, 0.005532919429242611, 0.06378835439682007, 0.07501330226659775, 0.0035242438316345215, 0.1211576759815216, 0.02350562810897827, 0.5002930164337158, 0.35806500911712646, 0.07363908737897873, 0.0035242438316345215, 0.09771530330181122, 0.0035229921340942383, 0.119850754737854, 0.02393031120300293, 0.2502630054950714, 0.10790902376174927, 0.05850442126393318, 0.11786329746246338, 0.06607190519571304, 0.003522932529449463, 0.11904306709766388, 0.11675161123275757, 0.49989598989486694, 0.23298698663711548, 0.0069072050973773, 0.11786329746246338, 0.01310060080140829, 0.11786329746246338, 0.1211576759815216, 0.09923136234283447, 0.3749470114707947, 0.3578009605407715, 0.00022200000239536166, 0.35807204246520996, 0.0296091977506876, 0.05759531259536743, 0.052311308681964874, 0.0035218000411987305, 0.119850754737854, 0.021706759929656982, 0.035802435129880905, 0.0035229921340942383, 0.10528266429901123, 0.06378966569900513, 0.11904306709766388, 0.0999184250831604, 0.12546099722385406, 0.2328779697418213, 0.005532919429242611, 0.057595252990722656, 0.02204192988574505, 0.11786329746246338, 0.11985082179307938, 0.09261363744735718, 0.625095009803772, 0.4828310012817383, 0.05231131985783577, 0.05759531259536743, 0.10390844196081161, 0.05759662389755249, 0.11985072493553162, 0.049180030822753906, 0.1247130036354065, 0.35807204246520996, 0.013100284151732922, 0.06378841400146484, 0.050937261432409286, 0.05759531259536743, 0.1211576759815216, 0.04875540733337402, 0.3127020001411438, 0.24998903274536133, 0.00024900000425986946, 0.23276197910308838, 0.014474536292254925, 0.06378841400146484, 0.0901479572057724, 0.05759662389755249, 0.1211576759815216, 0.04738116264343262, 0.06744600087404251, 0.11786329746246338, 0.10528260469436646, 0.0035241246223449707, 0.11985082179307938, 0.0819736123085022, 0.2502489984035492, 0.23276197910308838, 0.022041896358132362, 0.06378841400146484, 0.037176575511693954, 0.05759531259536743, 0.1211576759815216, 0.040338754653930664, 0.500603973865509, 0.4828310012817383, 0.08258060365915298, 0.00352400541305542, 0.11284996569156647, 0.11786329746246338, 0.119850754737854, 0.03234678506851196, 0.1253889948129654, 0.4829980134963989, 0.03717633709311485, 0.11786329746246338, 0.05987846478819847, 0.06378966569900513, 0.1211576759815216, 0.03054797649383545, 0.4999360144138336, 0.48308396339416504],\n \"normalized\": false\n },\n \"color\": {\n \"itemSize\": 4,\n \"type\": \"Uint16Array\",\n \"array\": [65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535],\n \"normalized\": true\n }\n },\n \"index\": {\n \"type\": \"Uint16Array\",\n \"array\": [3, 87, 79, 95, 7, 11, 91, 15, 99, 103, 19, 111, 83, 23, 115, 127, 27, 123, 31, 239, 131, 235, 35, 143, 231, 211, 151, 104, 163, 37, 40, 179, 169, 191, 175, 47, 187, 183, 51, 55, 199, 219, 200, 215, 57, 63, 119, 135, 147, 195, 139, 207, 67, 155, 220, 159, 69, 227, 75, 167, 42, 173, 189, 176, 201, 56, 168, 116, 60, 58, 73, 225, 144, 172, 193, 36, 164, 72, 49, 65, 205, 106, 222, 70, 221, 197, 157, 92, 12, 88, 233, 145, 137, 54, 43, 190, 148, 68, 156, 140, 152, 64, 52, 48, 196, 117, 24, 132, 228, 16, 209, 229, 204, 153, 125, 5, 25, 124, 224, 165, 202, 217, 212, 192, 237, 136, 0, 4, 93, 133, 129, 61, 85, 81, 113, 100, 96, 17, 76, 236, 28, 80, 109, 21, 97, 161, 105, 188, 180, 185, 26, 78, 30, 10, 126, 166, 206, 158, 198, 86, 114, 234, 110, 230, 154, 62, 130, 194, 59, 226, 122, 107, 210, 18, 74, 214, 218, 102, 2, 94, 112, 33, 232, 66, 46, 146, 42, 170, 173, 176, 41, 201, 168, 177, 116, 58, 213, 73, 144, 44, 172, 36, 160, 164, 49, 181, 65, 106, 38, 222, 221, 216, 197, 92, 8, 12, 233, 141, 145, 190, 186, 54, 54, 203, 43, 148, 208, 68, 140, 32, 152, 52, 184, 48, 117, 120, 24, 228, 108, 16, 229, 149, 204, 125, 9, 5, 124, 121, 224, 202, 53, 217, 192, 128, 237, 0, 77, 4, 133, 29, 129, 85, 1, 81, 100, 89, 96, 76, 84, 236, 80, 101, 109, 97, 13, 161, 188, 45, 180, 30, 134, 26, 26, 6, 78, 166, 162, 14, 14, 10, 166, 198, 50, 206, 206, 150, 158, 234, 138, 238, 238, 86, 234, 154, 34, 22, 22, 110, 154, 174, 171, 194, 171, 62, 194, 118, 178, 122, 178, 59, 122, 18, 98, 107, 107, 71, 210, 223, 39, 218, 39, 74, 218, 94, 90, 102, 102, 82, 2, 112, 20, 33, 146, 142, 66, 66, 182, 46]\n },\n \"boundingSphere\": {\n \"center\": [0, 0, 0],\n \"radius\": 146.65657531498138\n }\n },\n faceValues: [10, 17, 3, 16, 8, 7, 12, 20, 6, 19, 5, 18, 4, 11, 13, 15, 2, 14, 9, 1],\n rotationCombinations: {\n \"1,2\": [-58, 18, 148],\n \"1,3\": [-21, -30, -69],\n \"1,4\": [-159, -30, 69],\n \"1,5\": [-122, 18, 32],\n \"1,6\": [58, -54, -148],\n \"1,7\": [-58, 18, -31],\n \"1,8\": [180, 0, 180],\n \"1,9\": [58, -54, 30],\n \"1,10\": [122, 54, -148],\n \"1,11\": [-122, -54, 31],\n \"1,12\": [-58, 54, -148],\n \"1,13\": [58, 18, 31],\n \"1,14\": [58, -18, 148],\n \"1,15\": [148, 90, -58],\n \"1,16\": [122, -18, -148],\n \"1,17\": [159, 30, -110],\n \"1,18\": [21, 30, 110],\n \"1,19\": [158, -30, -69],\n \"1,20\": [0, 0, 180],\n \"2,3\": [-159, -30, 68],\n \"2,4\": [-159, -30, -110],\n \"2,5\": [122, -54, 148],\n \"2,6\": [-122, 54, 148],\n \"2,7\": [-32, -90, -122],\n \"2,8\": [-20, 30, 69],\n \"2,9\": [-122, 54, -32],\n \"2,10\": [58, 18, 30],\n \"2,11\": [-180, 90, 90],\n \"2,12\": [21, -30, 69],\n \"2,13\": [-21, 30, -110],\n \"2,14\": [158, 30, -110],\n \"2,15\": [21, -30, -110],\n \"2,16\": [0, 90, 90],\n \"2,17\": [-58, -54, 148],\n \"2,18\": [-58, -54, -32],\n \"2,19\": [158, 30, 69],\n \"2,20\": [58, 54, -30],\n \"3,4\": [0, 0, 180],\n \"3,5\": [-158, 30, -69],\n \"3,6\": [90, 0, 90],\n \"3,7\": [-159, -30, -110],\n \"3,8\": [158, -30, 110],\n \"3,9\": [90, 0, -90],\n \"3,10\": [-58, 18, -32],\n \"3,11\": [58, -54, -148],\n \"3,12\": [-90, 0, -90],\n \"3,13\": [-21, -30, 110],\n \"3,14\": [21, -30, -110],\n \"3,15\": [-90, 0, 90],\n \"3,16\": [58, -54, 30],\n \"3,17\": [-180, 0, 180],\n \"3,18\": [180, 0, 0],\n \"3,19\": [58, 54, -32],\n \"3,20\": [158, 30, 69],\n \"4,5\": [58, -18, -32],\n \"4,6\": [-58, 18, 148],\n \"4,7\": [158, 30, 69],\n \"4,8\": [-90, -90, 0],\n \"4,9\": [-58, 18, -32],\n \"4,10\": [58, -18, 148],\n \"4,11\": [-122, -18, 148],\n \"4,12\": [122, 18, -32],\n \"4,13\": [0, -90, -90],\n \"4,14\": [-122, 18, -148],\n \"4,15\": [122, 18, 148],\n \"4,16\": [-122, -18, -32],\n \"4,17\": [58, -54, -148],\n \"4,18\": [58, 54, -32],\n \"4,19\": [-58, -54, 148],\n \"4,20\": [-158, -30, -110],\n \"5,6\": [-122, -18, 148],\n \"5,7\": [122, 54, 30],\n \"5,8\": [58, -54, -148],\n \"5,9\": [-122, -54, -148],\n \"5,10\": [0, 0, 180],\n \"5,11\": [-58, -54, -32],\n \"5,12\": [58, 54, -32],\n \"5,13\": [-58, 18, -32],\n \"5,14\": [180, 0, -180],\n \"5,15\": [58, 54, 148],\n \"5,16\": [-58, -54, 148],\n \"5,17\": [122, 18, -32],\n \"5,18\": [-58, 54, 32],\n \"5,19\": [-180, 0, 0],\n \"5,20\": [-122, 54, 148],\n \"6,7\": [-159, 30, 110],\n \"6,8\": [-58, -54, -32],\n \"6,9\": [21, 30, -69],\n \"6,10\": [122, -54, 148],\n \"6,11\": [58, 54, -32],\n \"6,12\": [159, -30, 110],\n \"6,13\": [-122, 54, 148],\n \"6,14\": [-21, -30, -69],\n \"6,15\": [159, -30, -69],\n \"6,16\": [58, 54, 148],\n \"6,17\": [90, -90, -180],\n \"6,18\": [122, 18, -32],\n \"6,19\": [-21, -30, 110],\n \"6,20\": [122, 54, 32],\n \"7,8\": [21, -30, -110],\n \"7,9\": [159, -30, -69],\n \"7,10\": [21, 30, -69],\n \"7,11\": [90, 0, 90],\n \"7,12\": [-58, 54, 32],\n \"7,13\": [122, 54, 32],\n \"7,14\": [58, -54, -148],\n \"7,15\": [-21, 30, 69],\n \"7,16\": [90, 0, -90],\n \"7,17\": [58, 54, -32],\n \"7,18\": [-21, -30, 110],\n \"7,19\": [-159, -30, -110],\n \"7,20\": [-158, 30, 110],\n \"8,9\": [122, 54, -148],\n \"8,10\": [58, -54, 32],\n \"8,11\": [-58, 54, -148],\n \"8,12\": [-122, -54, 32],\n \"8,13\": [0, 0, 180],\n \"8,14\": [122, 18, -32],\n \"8,15\": [0, -90, 90],\n \"8,16\": [-58, 54, 32],\n \"8,17\": [-90, 0, 90],\n \"8,18\": [-90, 0, -90],\n \"8,19\": [-122, 54, 148],\n \"8,20\": [180, 0, 0],\n \"9,10\": [-159, -30, -110],\n \"9,11\": [58, -18, -32],\n \"9,12\": [180, 0, 180],\n \"9,13\": [58, 54, -32],\n \"9,14\": [21, 30, 110],\n \"9,15\": [-180, 0, 0],\n \"9,16\": [-58, -54, -32],\n \"9,17\": [-122, -18, -32],\n \"9,18\": [90, 90, 0],\n \"9,19\": [-58, -18, 32],\n \"9,20\": [-58, 54, -148],\n \"10,11\": [58, 54, 148],\n \"10,12\": [-58, -18, 32],\n \"10,13\": [58, -18, 148],\n \"10,14\": [90, 0, -90],\n \"10,15\": [-58, -54, -32],\n \"10,16\": [120, -18, 32],\n \"10,17\": [-122, -18, 148],\n \"10,18\": [58, -54, -148],\n \"10,19\": [-180, 0, -180],\n \"10,20\": [122, -54, -32],\n \"11,12\": [159, 30, -110],\n \"11,13\": [-159, -30, 69],\n \"11,14\": [21, -30, 69],\n \"11,15\": [122, 18, -32],\n \"11,16\": [0, 0, -180],\n \"11,17\": [159, -30, -69],\n \"11,18\": [58, 18, 32],\n \"11,19\": [-122, -54, 30],\n \"11,20\": [21, 30, 110],\n \"12,13\": [58, 54, 148],\n \"12,14\": [-122, 18, 32],\n \"12,15\": [0, 0, -180],\n \"12,16\": [-122, 54, 148],\n \"12,17\": [-110, -90, 159],\n \"12,18\": [58, 18, -148],\n \"12,19\": [159, -30, 110],\n \"12,20\": [90, 0, -90],\n \"13,14\": [122, -54, 148],\n \"13,15\": [58, 54, -32],\n \"13,16\": [-58, -18, -148],\n \"13,17\": [-21, 30, -110],\n \"13,18\": [-21, 30, 69],\n \"13,19\": [122, -54, -32],\n \"13,20\": [-180, 0, -180],\n \"14,15\": [122, -18, -148],\n \"14,16\": [21, 30, 110],\n \"14,17\": [58, -18, 148],\n \"14,18\": [58, -18, -32],\n \"14,19\": [0, 0, -180],\n \"14,20\": [58, 18, 32],\n \"15,16\": [159, 30, -110],\n \"15,17\": [58, -18, -32],\n \"15,18\": [-58, -18, 32],\n \"15,19\": [122, -18, 32],\n \"15,20\": [58, -54, -148],\n \"16,17\": [122, -54, 148],\n \"16,18\": [122, -54, -32],\n \"16,19\": [122, 54, -148],\n \"16,20\": [-122, 54, -32],\n \"17,18\": [0, 0, 180],\n \"17,19\": [122, -54, 148],\n \"17,20\": [21, -30, -110],\n \"18,19\": [-159, -30, 69],\n \"18,20\": [158, 30, -110],\n \"19,20\": [58, 54, 148]\n }\n },\n \"d24\": {\n \"metadata\": {\n \"version\": 4.5,\n \"type\": \"BufferGeometry\",\n \"generator\": \"BufferGeometry.toJSON\"\n },\n \"uuid\": \"D1B379DE-9640-4151-A394-D6DF1846E49C\",\n \"type\": \"BufferGeometry\",\n \"data\": {\n \"attributes\": {\n \"position\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-93.4049072265625,-3.781350612640381,3.7816989421844482,-93.4049072265625,-3.781350612640381,3.7816989421844482,-93.4049072265625,-3.781350612640381,3.7816989421844482,-93.4049072265625,-3.781350612640381,3.7816989421844482,-49.7835578918457,55.42812728881836,-49.783199310302734,-49.7835578918457,55.42812728881836,-49.783199310302734,-49.7835578918457,55.42812728881836,-49.783199310302734,-49.7835578918457,55.42812728881836,-49.783199310302734,-63.36488342285156,68.7131118774414,-3.781550168991089,-63.36488342285156,68.7131118774414,-3.781550168991089,-63.36488342285156,68.7131118774414,-3.781550168991089,-63.36488342285156,68.7131118774414,-3.781550168991089,-3.7813644409179688,93.4049301147461,-3.7813427448272705,-3.7813644409179688,93.4049301147461,-3.7813427448272705,-3.7813644409179688,93.4049301147461,-3.7813427448272705,-3.7813644409179688,93.4049301147461,-3.7813427448272705,3.7820396423339844,63.364871978759766,68.71309661865234,3.7820396423339844,63.364871978759766,68.71309661865234,3.7820396423339844,63.364871978759766,68.71309661865234,3.7820396423339844,63.364871978759766,68.71309661865234,49.78358840942383,49.783382415771484,55.427940368652344,49.78358840942383,49.783382415771484,55.427940368652344,49.78358840942383,49.783382415771484,55.427940368652344,49.78358840942383,49.783382415771484,55.427940368652344,-93.40494537353516,3.7813589572906494,-3.781012773513794,-93.40494537353516,3.7813589572906494,-3.781012773513794,-93.40494537353516,3.7813589572906494,-3.781012773513794,-93.40494537353516,3.7813589572906494,-3.781012773513794,-55.42829895019531,49.78338623046875,-49.78317642211914,-55.42829895019531,49.78338623046875,-49.78317642211914,-55.42829895019531,49.78338623046875,-49.78317642211914,-55.42829895019531,49.78338623046875,-49.78317642211914,-63.3648567199707,68.7131118774414,3.7820181846618652,-63.3648567199707,68.7131118774414,3.7820181846618652,-63.3648567199707,68.7131118774414,3.7820181846618652,-63.3648567199707,68.7131118774414,3.7820181846618652,49.7835693359375,55.42811965942383,49.783199310302734,49.7835693359375,55.42811965942383,49.783199310302734,49.7835693359375,55.42811965942383,49.783199310302734,49.7835693359375,55.42811965942383,49.783199310302734,63.364891052246094,68.7131118774414,3.781550168991089,63.364891052246094,68.7131118774414,3.781550168991089,63.364891052246094,68.7131118774414,3.781550168991089,63.364891052246094,68.7131118774414,3.781550168991089,63.3646240234375,3.781778573989868,-68.71334075927734,63.3646240234375,3.781778573989868,-68.71334075927734,63.3646240234375,3.781778573989868,-68.71334075927734,63.3646240234375,3.781778573989868,-68.71334075927734,68.71309661865234,63.3648681640625,-3.7820355892181396,68.71309661865234,63.3648681640625,-3.7820355892181396,68.71309661865234,63.3648681640625,-3.7820355892181396,68.71309661865234,63.3648681640625,-3.7820355892181396,93.4049072265625,3.781350612640381,-3.7816996574401855,93.4049072265625,3.781350612640381,-3.7816996574401855,93.4049072265625,3.781350612640381,-3.7816996574401855,93.4049072265625,3.781350612640381,-3.7816996574401855,68.71288299560547,3.781782865524292,-63.36511993408203,68.71288299560547,3.781782865524292,-63.36511993408203,68.71288299560547,3.781782865524292,-63.36511993408203,68.71288299560547,3.781782865524292,-63.36511993408203,55.42794418334961,49.783382415771484,-49.7835807800293,55.42794418334961,49.783382415771484,-49.7835807800293,55.42794418334961,49.783382415771484,-49.7835807800293,55.42794418334961,49.783382415771484,-49.7835807800293,49.783203125,55.42811965942383,-49.7835578918457,49.783203125,55.42811965942383,-49.7835578918457,49.783203125,55.42811965942383,-49.7835578918457,49.783203125,55.42811965942383,-49.7835578918457,3.7813453674316406,93.4049301147461,-3.781369686126709,3.7813453674316406,93.4049301147461,-3.781369686126709,3.7813453674316406,93.4049301147461,-3.781369686126709,3.7813453674316406,93.4049301147461,-3.781369686126709,93.40494537353516,-3.7813589572906494,3.7810134887695312,93.40494537353516,-3.7813589572906494,3.7810134887695312,93.40494537353516,-3.7813589572906494,3.7810134887695312,93.40494537353516,-3.7813589572906494,3.7810134887695312,-3.7816996574401855,3.7813563346862793,-93.40489196777344,-3.7816996574401855,3.7813563346862793,-93.40489196777344,-3.7816996574401855,3.7813563346862793,-93.40489196777344,-3.7816996574401855,3.7813563346862793,-93.40489196777344,-49.7835807800293,49.78338623046875,-55.427940368652344,-49.7835807800293,49.78338623046875,-55.427940368652344,-49.7835807800293,49.78338623046875,-55.427940368652344,-49.7835807800293,49.78338623046875,-55.427940368652344,55.428306579589844,49.783382415771484,49.78317642211914,55.428306579589844,49.783382415771484,49.78317642211914,55.428306579589844,49.783382415771484,49.78317642211914,55.428306579589844,49.783382415771484,49.78317642211914,-3.7813727855682373,-93.4049301147461,-3.781342029571533,-3.7813727855682373,-93.4049301147461,-3.781342029571533,-3.7813727855682373,-93.4049301147461,-3.781342029571533,-3.7813727855682373,-93.4049301147461,-3.781342029571533,-68.71334838867188,-3.781782865524292,-63.36461639404297,-68.71334838867188,-3.781782865524292,-63.36461639404297,-68.71334838867188,-3.781782865524292,-63.36461639404297,-68.71334838867188,-3.781782865524292,-63.36461639404297,-3.7820396423339844,-63.364871978759766,-68.71309661865234,-3.7820396423339844,-63.364871978759766,-68.71309661865234,-3.7820396423339844,-63.364871978759766,-68.71309661865234,-3.7820396423339844,-63.364871978759766,-68.71309661865234,-49.7835807800293,-49.783382415771484,-55.427940368652344,-49.7835807800293,-49.783382415771484,-55.427940368652344,-49.7835807800293,-49.783382415771484,-55.427940368652344,-49.7835807800293,-49.783382415771484,-55.427940368652344,63.3648567199707,-68.7131118774414,-3.7820160388946533,63.3648567199707,-68.7131118774414,-3.7820160388946533,63.3648567199707,-68.7131118774414,-3.7820160388946533,63.3648567199707,-68.7131118774414,-3.7820160388946533,3.781336784362793,-93.4049301147461,-3.7813704013824463,3.781336784362793,-93.4049301147461,-3.7813704013824463,3.781336784362793,-93.4049301147461,-3.7813704013824463,3.781336784362793,-93.4049301147461,-3.7813704013824463,3.7815499305725098,-68.7131118774414,-63.36488342285156,3.7815499305725098,-68.7131118774414,-63.36488342285156,3.7815499305725098,-68.7131118774414,-63.36488342285156,3.7815499305725098,-68.7131118774414,-63.36488342285156,-63.3646240234375,3.781787157058716,68.71334075927734,-63.3646240234375,3.781787157058716,68.71334075927734,-63.3646240234375,3.781787157058716,68.71334075927734,-63.3646240234375,3.781787157058716,68.71334075927734,3.7820351123809814,-63.364871978759766,68.71309661865234,3.7820351123809814,-63.364871978759766,68.71309661865234,3.7820351123809814,-63.364871978759766,68.71309661865234,3.7820351123809814,-63.364871978759766,68.71309661865234,63.3651237487793,-3.781787157058716,68.71287536621094,63.3651237487793,-3.781787157058716,68.71287536621094,63.3651237487793,-3.781787157058716,68.71287536621094,63.3651237487793,-3.781787157058716,68.71287536621094,55.42794418334961,-49.783382415771484,-49.7835807800293,55.42794418334961,-49.783382415771484,-49.7835807800293,55.42794418334961,-49.783382415771484,-49.7835807800293,55.42794418334961,-49.783382415771484,-49.7835807800293,-93.4049072265625,3.7813589572906494,3.7816996574401855,-93.4049072265625,3.7813589572906494,3.7816996574401855,-93.4049072265625,3.7813589572906494,3.7816996574401855,-93.4049072265625,3.7813589572906494,3.7816996574401855,-55.42794418334961,49.78338623046875,49.7835807800293,-55.42794418334961,49.78338623046875,49.7835807800293,-55.42794418334961,49.78338623046875,49.7835807800293,-55.42794418334961,49.78338623046875,49.7835807800293,68.71311950683594,-63.3648796081543,3.7815308570861816,68.71311950683594,-63.3648796081543,3.7815308570861816,68.71311950683594,-63.3648796081543,3.7815308570861816,68.71311950683594,-63.3648796081543,3.7815308570861816,3.781013250350952,3.7813565731048584,-93.4049301147461,3.781013250350952,3.7813565731048584,-93.4049301147461,3.781013250350952,3.7813565731048584,-93.4049301147461,3.781013250350952,3.7813565731048584,-93.4049301147461,-63.3651237487793,3.781787157058716,-68.71288299560547,-63.3651237487793,3.781787157058716,-68.71288299560547,-63.3651237487793,3.781787157058716,-68.71288299560547,-63.3651237487793,3.781787157058716,-68.71288299560547,-63.3651237487793,-3.781778573989868,-68.71287536621094,-63.3651237487793,-3.781778573989868,-68.71287536621094,-63.3651237487793,-3.781778573989868,-68.71287536621094,-63.3651237487793,-3.781778573989868,-68.71287536621094,3.7815260887145996,-63.364871978759766,-68.71311950683594,3.7815260887145996,-63.364871978759766,-68.71311950683594,3.7815260887145996,-63.364871978759766,-68.71311950683594,3.7815260887145996,-63.364871978759766,-68.71311950683594,-3.781545639038086,68.7131118774414,63.36488342285156,-3.781545639038086,68.7131118774414,63.36488342285156,-3.781545639038086,68.7131118774414,63.36488342285156,-3.781545639038086,68.7131118774414,63.36488342285156,-3.7815303802490234,63.364871978759766,68.71312713623047,-3.7815303802490234,63.364871978759766,68.71312713623047,-3.7815303802490234,63.364871978759766,68.71312713623047,-3.7815303802490234,63.364871978759766,68.71312713623047,3.7820241451263428,68.7131118774414,63.3648567199707,3.7820241451263428,68.7131118774414,63.3648567199707,3.7820241451263428,68.7131118774414,63.3648567199707,3.7820241451263428,68.7131118774414,63.3648567199707,3.7820115089416504,-68.7131118774414,63.3648567199707,3.7820115089416504,-68.7131118774414,63.3648567199707,3.7820115089416504,-68.7131118774414,63.3648567199707,3.7820115089416504,-68.7131118774414,63.3648567199707,93.4049072265625,-3.7813589572906494,-3.7816989421844482,93.4049072265625,-3.7813589572906494,-3.7816989421844482,93.4049072265625,-3.7813589572906494,-3.7816989421844482,93.4049072265625,-3.7813589572906494,-3.7816989421844482,63.36486053466797,68.7131118774414,-3.7820181846618652,63.36486053466797,68.7131118774414,-3.7820181846618652,63.36486053466797,68.7131118774414,-3.7820181846618652,63.36486053466797,68.7131118774414,-3.7820181846618652,68.71312713623047,63.3648681640625,3.7815330028533936,68.71312713623047,63.3648681640625,3.7815330028533936,68.71312713623047,63.3648681640625,3.7815330028533936,68.71312713623047,63.3648681640625,3.7815330028533936,3.7815349102020264,63.364871978759766,-68.71312713623047,3.7815349102020264,63.364871978759766,-68.71312713623047,3.7815349102020264,63.364871978759766,-68.71312713623047,3.7815349102020264,63.364871978759766,-68.71312713623047,-3.7820308208465576,63.364871978759766,-68.71309661865234,-3.7820308208465576,63.364871978759766,-68.71309661865234,-3.7820308208465576,63.364871978759766,-68.71309661865234,-3.7820308208465576,63.364871978759766,-68.71309661865234,-68.71309661865234,-63.3648681640625,3.7820377349853516,-68.71309661865234,-63.3648681640625,3.7820377349853516,-68.71309661865234,-63.3648681640625,3.7820377349853516,-68.71309661865234,-63.3648681640625,3.7820377349853516,-68.71312713623047,-63.3648681640625,-3.7815308570861816,-68.71312713623047,-63.3648681640625,-3.7815308570861816,-68.71312713623047,-63.3648681640625,-3.7815308570861816,-68.71312713623047,-63.3648681640625,-3.7815308570861816,-55.42830276489258,-49.783382415771484,-49.78317642211914,-55.42830276489258,-49.783382415771484,-49.78317642211914,-55.42830276489258,-49.783382415771484,-49.78317642211914,-55.42830276489258,-49.783382415771484,-49.78317642211914,3.7813644409179688,-93.4049301147461,3.781342029571533,3.7813644409179688,-93.4049301147461,3.781342029571533,3.7813644409179688,-93.4049301147461,3.781342029571533,3.7813644409179688,-93.4049301147461,3.781342029571533,63.36488342285156,-68.7131118774414,3.781552314758301,63.36488342285156,-68.7131118774414,3.781552314758301,63.36488342285156,-68.7131118774414,3.781552314758301,63.36488342285156,-68.7131118774414,3.781552314758301,93.40494537353516,3.781350612640381,3.781012773513794,93.40494537353516,3.781350612640381,3.781012773513794,93.40494537353516,3.781350612640381,3.781012773513794,93.40494537353516,3.781350612640381,3.781012773513794,-3.7810142040252686,-3.781355857849121,93.4049301147461,-3.7810142040252686,-3.781355857849121,93.4049301147461,-3.7810142040252686,-3.781355857849121,93.4049301147461,-3.7810142040252686,-3.781355857849121,93.4049301147461,-63.36488723754883,-68.7131118774414,-3.781552314758301,-63.36488723754883,-68.7131118774414,-3.781552314758301,-63.36488723754883,-68.7131118774414,-3.781552314758301,-63.36488723754883,-68.7131118774414,-3.781552314758301,-3.7813453674316406,-93.4049301147461,3.7813704013824463,-3.7813453674316406,-93.4049301147461,3.7813704013824463,-3.7813453674316406,-93.4049301147461,3.7813704013824463,-3.7813453674316406,-93.4049301147461,3.7813704013824463,-63.364864349365234,-68.7131118774414,3.7820160388946533,-63.364864349365234,-68.7131118774414,3.7820160388946533,-63.364864349365234,-68.7131118774414,3.7820160388946533,-63.364864349365234,-68.7131118774414,3.7820160388946533,-3.7816994190216064,-3.7813565731048584,-93.40489196777344,-3.7816994190216064,-3.7813565731048584,-93.40489196777344,-3.7816994190216064,-3.7813565731048584,-93.40489196777344,-3.7816994190216064,-3.7813565731048584,-93.40489196777344,63.3646240234375,-3.781787157058716,-68.71334838867188,63.3646240234375,-3.781787157058716,-68.71334838867188,63.3646240234375,-3.781787157058716,-68.71334838867188,63.3646240234375,-3.781787157058716,-68.71334838867188,3.7810134887695312,-3.7813563346862793,-93.4049301147461,3.7810134887695312,-3.7813563346862793,-93.4049301147461,3.7810134887695312,-3.7813563346862793,-93.4049301147461,3.7810134887695312,-3.7813563346862793,-93.4049301147461,68.71309661865234,-63.364871978759766,-3.7820377349853516,68.71309661865234,-63.364871978759766,-3.7820377349853516,68.71309661865234,-63.364871978759766,-3.7820377349853516,68.71309661865234,-63.364871978759766,-3.7820377349853516,68.71288299560547,-3.781787157058716,-63.36511993408203,68.71288299560547,-3.781787157058716,-63.36511993408203,68.71288299560547,-3.781787157058716,-63.36511993408203,68.71288299560547,-3.781787157058716,-63.36511993408203,-93.40494537353516,-3.781350612640381,-3.7810134887695312,-93.40494537353516,-3.781350612640381,-3.7810134887695312,-93.40494537353516,-3.781350612640381,-3.7810134887695312,-93.40494537353516,-3.781350612640381,-3.7810134887695312,-68.71312713623047,63.364871978759766,-3.7815330028533936,-68.71312713623047,63.364871978759766,-3.7815330028533936,-68.71312713623047,63.364871978759766,-3.7815330028533936,-68.71312713623047,63.364871978759766,-3.7815330028533936,68.71334838867188,-3.7817912101745605,63.36461639404297,68.71334838867188,-3.7817912101745605,63.36461639404297,68.71334838867188,-3.7817912101745605,63.36461639404297,68.71334838867188,-3.7817912101745605,63.36461639404297,-3.782020092010498,-68.7131118774414,-63.3648567199707,-3.782020092010498,-68.7131118774414,-63.3648567199707,-3.782020092010498,-68.7131118774414,-63.3648567199707,-3.782020092010498,-68.7131118774414,-63.3648567199707,-3.781336784362793,93.4049301147461,3.781369686126709,-3.781336784362793,93.4049301147461,3.781369686126709,-3.781336784362793,93.4049301147461,3.781369686126709,-3.781336784362793,93.4049301147461,3.781369686126709,3.7813727855682373,93.4049301147461,3.7813427448272705,3.7813727855682373,93.4049301147461,3.7813427448272705,3.7813727855682373,93.4049301147461,3.7813427448272705,3.7813727855682373,93.4049301147461,3.7813427448272705,3.781700372695923,3.781355857849121,93.40489196777344,3.781700372695923,3.781355857849121,93.40489196777344,3.781700372695923,3.781355857849121,93.40489196777344,3.781700372695923,3.781355857849121,93.40489196777344,3.7816989421844482,-3.7813572883605957,93.40489196777344,3.7816989421844482,-3.7813572883605957,93.40489196777344,3.7816989421844482,-3.7813572883605957,93.40489196777344,3.7816989421844482,-3.7813572883605957,93.40489196777344,-3.781012773513794,3.7813572883605957,93.4049301147461,-3.781012773513794,3.7813572883605957,93.4049301147461,-3.781012773513794,3.7813572883605957,93.4049301147461,-3.781012773513794,3.7813572883605957,93.4049301147461,3.7815542221069336,68.7131118774414,-63.36488342285156,3.7815542221069336,68.7131118774414,-63.36488342285156,3.7815542221069336,68.7131118774414,-63.36488342285156,3.7815542221069336,68.7131118774414,-63.36488342285156,-49.78318405151367,-49.783382415771484,55.42829895019531,-49.78318405151367,-49.783382415771484,55.42829895019531,-49.78318405151367,-49.783382415771484,55.42829895019531,-49.78318405151367,-49.783382415771484,55.42829895019531,49.7835807800293,-49.783382415771484,55.42793655395508,49.7835807800293,-49.783382415771484,55.42793655395508,49.7835807800293,-49.783382415771484,55.42793655395508,49.7835807800293,-49.783382415771484,55.42793655395508,49.783565521240234,-55.42811965942383,49.78319549560547,49.783565521240234,-55.42811965942383,49.78319549560547,49.783565521240234,-55.42811965942383,49.78319549560547,49.783565521240234,-55.42811965942383,49.78319549560547,55.42829895019531,-49.783382415771484,49.783172607421875,55.42829895019531,-49.783382415771484,49.783172607421875,55.42829895019531,-49.783382415771484,49.783172607421875,55.42829895019531,-49.783382415771484,49.783172607421875,-49.7835578918457,-55.42811965942383,-49.783199310302734,-49.7835578918457,-55.42811965942383,-49.783199310302734,-49.7835578918457,-55.42811965942383,-49.783199310302734,-49.7835578918457,-55.42811965942383,-49.783199310302734,-49.783199310302734,-55.42811965942383,49.7835578918457,-49.783199310302734,-55.42811965942383,49.7835578918457,-49.783199310302734,-55.42811965942383,49.7835578918457,-49.783199310302734,-55.42811965942383,49.7835578918457,49.78318405151367,-49.783382415771484,-55.42829895019531,49.78318405151367,-49.783382415771484,-55.42829895019531,49.78318405151367,-49.783382415771484,-55.42829895019531,49.78318405151367,-49.783382415771484,-55.42829895019531,-55.42794418334961,-49.783382415771484,49.7835807800293,-55.42794418334961,-49.783382415771484,49.7835807800293,-55.42794418334961,-49.783382415771484,49.7835807800293,-55.42794418334961,-49.783382415771484,49.7835807800293,49.78318405151367,49.783382415771484,-55.42829895019531,49.78318405151367,49.783382415771484,-55.42829895019531,49.78318405151367,49.783382415771484,-55.42829895019531,49.78318405151367,49.783382415771484,-55.42829895019531,-49.78318405151367,49.78338623046875,55.42829895019531,-49.78318405151367,49.78338623046875,55.42829895019531,-49.78318405151367,49.78338623046875,55.42829895019531,-49.78318405151367,49.78338623046875,55.42829895019531,-49.783199310302734,55.42812728881836,49.7835578918457,-49.783199310302734,55.42812728881836,49.7835578918457,-49.783199310302734,55.42812728881836,49.7835578918457,-49.783199310302734,55.42812728881836,49.7835578918457,-63.3646240234375,-3.781782865524292,68.71334838867188,-63.3646240234375,-3.781782865524292,68.71334838867188,-63.3646240234375,-3.781782865524292,68.71334838867188,-63.3646240234375,-3.781782865524292,68.71334838867188,-68.71288299560547,-3.781778573989868,63.36511993408203,-68.71288299560547,-3.781778573989868,63.36511993408203,-68.71288299560547,-3.781778573989868,63.36511993408203,-68.71288299560547,-3.781778573989868,63.36511993408203,-3.7815349102020264,-63.364871978759766,68.71311950683594,-3.7815349102020264,-63.364871978759766,68.71311950683594,-3.7815349102020264,-63.364871978759766,68.71311950683594,-3.7815349102020264,-63.364871978759766,68.71311950683594,-3.7815582752227783,-68.7131118774414,63.36488342285156,-3.7815582752227783,-68.7131118774414,63.36488342285156,-3.7815582752227783,-68.7131118774414,63.36488342285156,-3.7815582752227783,-68.7131118774414,63.36488342285156,-3.782015800476074,68.7131118774414,-63.3648567199707,-3.782015800476074,68.7131118774414,-63.3648567199707,-3.782015800476074,68.7131118774414,-63.3648567199707,-3.782015800476074,68.7131118774414,-63.3648567199707,-68.71334838867188,3.781787157058716,-63.36461639404297,-68.71334838867188,3.781787157058716,-63.36461639404297,-68.71334838867188,3.781787157058716,-63.36461639404297,-68.71334838867188,3.781787157058716,-63.36461639404297,63.3651237487793,3.781782865524292,68.71288299560547,63.3651237487793,3.781782865524292,68.71288299560547,63.3651237487793,3.781782865524292,68.71288299560547,63.3651237487793,3.781782865524292,68.71288299560547,68.71334838867188,3.781778573989868,63.36461639404297,68.71334838867188,3.781778573989868,63.36461639404297,68.71334838867188,3.781778573989868,63.36461639404297,68.71334838867188,3.781778573989868,63.36461639404297,-68.71309661865234,63.3648796081543,3.7820355892181396,-68.71309661865234,63.3648796081543,3.7820355892181396,-68.71309661865234,63.3648796081543,3.7820355892181396,-68.71309661865234,63.3648796081543,3.7820355892181396,-68.71288299560547,3.7817912101745605,63.36511993408203,-68.71288299560547,3.7817912101745605,63.36511993408203,-68.71288299560547,3.7817912101745605,63.36511993408203,-68.71288299560547,3.7817912101745605,63.36511993408203,49.783203125,-55.42811965942383,-49.7835578918457,49.783203125,-55.42811965942383,-49.7835578918457,49.783203125,-55.42811965942383,-49.7835578918457,49.783203125,-55.42811965942383,-49.7835578918457],\n \"normalized\": false\n },\n \"normal\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-0.8930176496505737,-0.31821155548095703,0.31821513175964355,-0.8930176496505737,-0.31821155548095703,0.31821513175964355,-0.8930176496505737,-0.31821155548095703,0.31821513175964355,-0.8930176496505737,-0.31821155548095703,0.31821513175964355,-0.3939540982246399,0.8304173350334167,-0.3939635753631592,-0.3939540982246399,0.8304173350334167,-0.3939635753631592,-0.3939540982246399,0.8304173350334167,-0.3939635753631592,-0.3939540982246399,0.8304173350334167,-0.3939635753631592,-0.39820414781570435,0.8611265420913696,-0.31606101989746094,-0.39820414781570435,0.8611265420913696,-0.31606101989746094,-0.39820414781570435,0.8611265420913696,-0.31606101989746094,-0.39820414781570435,0.8611265420913696,-0.31606101989746094,-0.3181779980659485,0.8930322527885437,-0.3182079792022705,-0.3181779980659485,0.8930322527885437,-0.3182079792022705,-0.3181779980659485,0.8930322527885437,-0.3182079792022705,-0.3181779980659485,0.8930322527885437,-0.3182079792022705,0.3160579800605774,0.3982042074203491,0.8611275553703308,0.3160579800605774,0.3982042074203491,0.8611275553703308,0.3160579800605774,0.3982042074203491,0.8611275553703308,0.3160579800605774,0.3982042074203491,0.8611275553703308,0.39394938945770264,0.39396142959594727,0.8304205536842346,0.39394938945770264,0.39396142959594727,0.8304205536842346,0.39394938945770264,0.39396142959594727,0.8304205536842346,0.39394938945770264,0.39396142959594727,0.8304205536842346,-0.8930201530456543,0.3182116746902466,-0.31820809841156006,-0.8930201530456543,0.3182116746902466,-0.31820809841156006,-0.8930201530456543,0.3182116746902466,-0.31820809841156006,-0.8930201530456543,0.3182116746902466,-0.31820809841156006,-0.8304393887519836,0.3939298987388611,-0.39394134283065796,-0.8304393887519836,0.3939298987388611,-0.39394134283065796,-0.8304393887519836,0.3939298987388611,-0.39394134283065796,-0.8304393887519836,0.3939298987388611,-0.39394134283065796,-0.39819657802581787,0.8611276745796204,0.31606724858283997,-0.39819657802581787,0.8611276745796204,0.31606724858283997,-0.39819657802581787,0.8611276745796204,0.31606724858283997,-0.39819657802581787,0.8611276745796204,0.31606724858283997,0.3939548134803772,0.8304223418235779,0.3939521610736847,0.3939548134803772,0.8304223418235779,0.3939521610736847,0.3939548134803772,0.8304223418235779,0.3939521610736847,0.3939548134803772,0.8304223418235779,0.3939521610736847,0.398190438747406,0.8611446022987366,0.31602901220321655,0.398190438747406,0.8611446022987366,0.31602901220321655,0.398190438747406,0.8611446022987366,0.31602901220321655,0.398190438747406,0.8611446022987366,0.31602901220321655,0.39820146560668945,0.3160552680492401,-0.8611298203468323,0.39820146560668945,0.3160552680492401,-0.8611298203468323,0.39820146560668945,0.3160552680492401,-0.8611298203468323,0.39820146560668945,0.3160552680492401,-0.8611298203468323,0.8611258268356323,0.39821386337280273,-0.31605064868927,0.8611258268356323,0.39821386337280273,-0.31605064868927,0.8611258268356323,0.39821386337280273,-0.31605064868927,0.8611258268356323,0.39821386337280273,-0.31605064868927,0.8930308818817139,0.3181929588317871,-0.318196564912796,0.8930308818817139,0.3181929588317871,-0.318196564912796,0.8930308818817139,0.3181929588317871,-0.318196564912796,0.8930308818817139,0.3181929588317871,-0.318196564912796,0.8611277937889099,0.3160572052001953,-0.39820432662963867,0.8611277937889099,0.3160572052001953,-0.39820432662963867,0.8611277937889099,0.3160572052001953,-0.39820432662963867,0.8611277937889099,0.3160572052001953,-0.39820432662963867,0.8304156064987183,0.3939667344093323,-0.3939545154571533,0.8304156064987183,0.3939667344093323,-0.3939545154571533,0.8304156064987183,0.3939667344093323,-0.3939545154571533,0.8304156064987183,0.3939667344093323,-0.3939545154571533,0.39395228028297424,0.8304221630096436,-0.3939549922943115,0.39395228028297424,0.8304221630096436,-0.3939549922943115,0.39395228028297424,0.8304221630096436,-0.3939549922943115,0.39395228028297424,0.8304221630096436,-0.3939549922943115,0.31819266080856323,0.893029510974884,-0.31820082664489746,0.31819266080856323,0.893029510974884,-0.31820082664489746,0.31819266080856323,0.893029510974884,-0.31820082664489746,0.31819266080856323,0.893029510974884,-0.31820082664489746,0.8930361866950989,-0.3181893527507782,0.3181857466697693,0.8930361866950989,-0.3181893527507782,0.3181857466697693,0.8930361866950989,-0.3181893527507782,0.3181857466697693,0.8930361866950989,-0.3181893527507782,0.3181857466697693,-0.3182153105735779,0.31821152567863464,-0.8930174708366394,-0.3182153105735779,0.31821152567863464,-0.8930174708366394,-0.3182153105735779,0.31821152567863464,-0.8930174708366394,-0.3182153105735779,0.31821152567863464,-0.8930174708366394,-0.3939494788646698,0.39396119117736816,-0.8304205536842346,-0.3939494788646698,0.39396119117736816,-0.8304205536842346,-0.3939494788646698,0.39396119117736816,-0.8304205536842346,-0.3939494788646698,0.39396119117736816,-0.8304205536842346,0.8304232358932495,0.3939468264579773,0.3939582109451294,0.8304232358932495,0.3939468264579773,0.3939582109451294,0.8304232358932495,0.3939468264579773,0.3939582109451294,0.8304232358932495,0.3939468264579773,0.3939582109451294,-0.3181976079940796,-0.8930297493934631,-0.3181954622268677,-0.3181976079940796,-0.8930297493934631,-0.3181954622268677,-0.3181976079940796,-0.8930297493934631,-0.3181954622268677,-0.3181976079940796,-0.8930297493934631,-0.3181954622268677,-0.8611258268356323,-0.3160642981529236,-0.3982030749320984,-0.8611258268356323,-0.3160642981529236,-0.3982030749320984,-0.8611258268356323,-0.3160642981529236,-0.3982030749320984,-0.8611258268356323,-0.3160642981529236,-0.3982030749320984,-0.31608039140701294,-0.3982047438621521,-0.8611190915107727,-0.31608039140701294,-0.3982047438621521,-0.8611190915107727,-0.31608039140701294,-0.3982047438621521,-0.8611190915107727,-0.31608039140701294,-0.3982047438621521,-0.8611190915107727,-0.3939639627933502,-0.3939467966556549,-0.8304204940795898,-0.3939639627933502,-0.3939467966556549,-0.8304204940795898,-0.3939639627933502,-0.3939467966556549,-0.8304204940795898,-0.3939639627933502,-0.3939467966556549,-0.8304204940795898,0.39820337295532227,-0.8611286282539368,-0.31605619192123413,0.39820337295532227,-0.8611286282539368,-0.31605619192123413,0.39820337295532227,-0.8611286282539368,-0.31605619192123413,0.39820337295532227,-0.8611286282539368,-0.31605619192123413,0.3181878924369812,-0.8930350542068481,-0.31819045543670654,0.3181878924369812,-0.8930350542068481,-0.31819045543670654,0.3181878924369812,-0.8930350542068481,-0.31819045543670654,0.3181878924369812,-0.8930350542068481,-0.31819045543670654,0.3160671591758728,-0.8611257672309875,-0.39820101857185364,0.3160671591758728,-0.8611257672309875,-0.39820101857185364,0.3160671591758728,-0.8611257672309875,-0.39820101857185364,0.3160671591758728,-0.8611257672309875,-0.39820101857185364,-0.3982013761997223,0.3160552680492401,0.861129879951477,-0.3982013761997223,0.3160552680492401,0.861129879951477,-0.3982013761997223,0.3160552680492401,0.861129879951477,-0.3982013761997223,0.3160552680492401,0.861129879951477,0.31605467200279236,-0.39822202920913696,0.8611205220222473,0.31605467200279236,-0.39822202920913696,0.8611205220222473,0.31605467200279236,-0.39822202920913696,0.8611205220222473,0.31605467200279236,-0.39822202920913696,0.8611205220222473,0.39822128415107727,-0.3160440921783447,0.8611248135566711,0.39822128415107727,-0.3160440921783447,0.8611248135566711,0.39822128415107727,-0.3160440921783447,0.8611248135566711,0.39822128415107727,-0.3160440921783447,0.8611248135566711,0.830415666103363,-0.3939518928527832,-0.39396917819976807,0.830415666103363,-0.3939518928527832,-0.39396917819976807,0.830415666103363,-0.3939518928527832,-0.39396917819976807,0.830415666103363,-0.3939518928527832,-0.39396917819976807,-0.8930335640907288,0.31818917393684387,0.3181927800178528,-0.8930335640907288,0.31818917393684387,0.3181927800178528,-0.8930335640907288,0.31818917393684387,0.3181927800178528,-0.8930335640907288,0.31818917393684387,0.3181927800178528,-0.8304204344749451,0.3939615488052368,0.39394932985305786,-0.8304204344749451,0.3939615488052368,0.39394932985305786,-0.8304204344749451,0.3939615488052368,0.39394932985305786,-0.8304204344749451,0.3939615488052368,0.39394932985305786,0.8611295819282532,-0.39820489287376404,0.3160513937473297,0.8611295819282532,-0.39820489287376404,0.3160513937473297,0.8611295819282532,-0.39820489287376404,0.3160513937473297,0.8611295819282532,-0.39820489287376404,0.3160513937473297,0.31818902492523193,0.3181936740875244,-0.8930333852767944,0.31818902492523193,0.3181936740875244,-0.8930333852767944,0.31818902492523193,0.3181936740875244,-0.8930333852767944,0.31818902492523193,0.3181936740875244,-0.8930333852767944,-0.3982042670249939,0.3160568177700043,-0.861128032207489,-0.3982042670249939,0.3160568177700043,-0.861128032207489,-0.3982042670249939,0.3160568177700043,-0.861128032207489,-0.3982042670249939,0.3160568177700043,-0.861128032207489,-0.3982074558734894,-0.31605467200279236,-0.8611272573471069,-0.3982074558734894,-0.31605467200279236,-0.8611272573471069,-0.3982074558734894,-0.31605467200279236,-0.8611272573471069,-0.3982074558734894,-0.31605467200279236,-0.8611272573471069,0.31604087352752686,-0.3982185125350952,-0.8611272573471069,0.31604087352752686,-0.3982185125350952,-0.8611272573471069,0.31604087352752686,-0.3982185125350952,-0.8611272573471069,0.31604087352752686,-0.3982185125350952,-0.8611272573471069,-0.31601834297180176,0.8611423373222351,0.39820387959480286,-0.31601834297180176,0.8611423373222351,0.39820387959480286,-0.31601834297180176,0.8611423373222351,0.39820387959480286,-0.31601834297180176,0.8611423373222351,0.39820387959480286,-0.31606096029281616,0.39820629358291626,0.8611255288124084,-0.31606096029281616,0.39820629358291626,0.8611255288124084,-0.31606096029281616,0.39820629358291626,0.8611255288124084,-0.31606096029281616,0.39820629358291626,0.8611255288124084,0.31606805324554443,0.8611271977424622,0.39819690585136414,0.31606805324554443,0.8611271977424622,0.39819690585136414,0.31606805324554443,0.8611271977424622,0.39819690585136414,0.31606805324554443,0.8611271977424622,0.39819690585136414,0.31605327129364014,-0.8611239194869995,0.3982159495353699,0.31605327129364014,-0.8611239194869995,0.3982159495353699,0.31605327129364014,-0.8611239194869995,0.3982159495353699,0.31605327129364014,-0.8611239194869995,0.3982159495353699,0.8930177092552185,-0.31821155548095703,-0.31821513175964355,0.8930177092552185,-0.31821155548095703,-0.31821513175964355,0.8930177092552185,-0.31821155548095703,-0.31821513175964355,0.8930177092552185,-0.31821155548095703,-0.31821513175964355,0.39822056889533997,0.8611229658126831,-0.3160500228404999,0.39822056889533997,0.8611229658126831,-0.3160500228404999,0.39822056889533997,0.8611229658126831,-0.3160500228404999,0.39822056889533997,0.8611229658126831,-0.3160500228404999,0.8611273765563965,0.3982042968273163,0.3160584568977356,0.8611273765563965,0.3982042968273163,0.3160584568977356,0.8611273765563965,0.3982042968273163,0.3160584568977356,0.8611273765563965,0.3982042968273163,0.3160584568977356,0.31604790687561035,0.3982231020927429,-0.8611226081848145,0.31604790687561035,0.3982231020927429,-0.8611226081848145,0.31604790687561035,0.3982231020927429,-0.8611226081848145,0.31604790687561035,0.3982231020927429,-0.8611226081848145,-0.3160579800605774,0.39820435643196106,-0.8611276149749756,-0.3160579800605774,0.39820435643196106,-0.8611276149749756,-0.3160579800605774,0.39820435643196106,-0.8611276149749756,-0.3160579800605774,0.39820435643196106,-0.8611276149749756,-0.8611293435096741,-0.3981947600841522,0.31606513261795044,-0.8611293435096741,-0.3981947600841522,0.31606513261795044,-0.8611293435096741,-0.3981947600841522,0.31606513261795044,-0.8611293435096741,-0.3981947600841522,0.31606513261795044,-0.8611273169517517,-0.3982181251049042,-0.31604093313217163,-0.8611273169517517,-0.3982181251049042,-0.31604093313217163,-0.8611273169517517,-0.3982181251049042,-0.31604093313217163,-0.8611273169517517,-0.3982181251049042,-0.31604093313217163,-0.8304233551025391,-0.3939613699913025,-0.39394333958625793,-0.8304233551025391,-0.3939613699913025,-0.39394333958625793,-0.8304233551025391,-0.3939613699913025,-0.39394333958625793,-0.8304233551025391,-0.3939613699913025,-0.39394333958625793,0.31822317838668823,-0.8930189609527588,0.31819969415664673,0.31822317838668823,-0.8930189609527588,0.31819969415664673,0.31822317838668823,-0.8930189609527588,0.31819969415664673,0.31822317838668823,-0.8930189609527588,0.31819969415664673,0.398205429315567,-0.861126184463501,0.3160603642463684,0.398205429315567,-0.861126184463501,0.3160603642463684,0.398205429315567,-0.861126184463501,0.3160603642463684,0.398205429315567,-0.861126184463501,0.3160603642463684,0.8930307030677795,0.31819677352905273,0.31819313764572144,0.8930307030677795,0.31819677352905273,0.31819313764572144,0.8930307030677795,0.31819677352905273,0.31819313764572144,0.8930307030677795,0.31819677352905273,0.31819313764572144,-0.31818729639053345,-0.31819117069244385,0.8930348753929138,-0.31818729639053345,-0.31819117069244385,0.8930348753929138,-0.31818729639053345,-0.31819117069244385,0.8930348753929138,-0.31818729639053345,-0.31819117069244385,0.8930348753929138,-0.39820730686187744,-0.8611242771148682,-0.31606295704841614,-0.39820730686187744,-0.8611242771148682,-0.31606295704841614,-0.39820730686187744,-0.8611242771148682,-0.31606295704841614,-0.39820730686187744,-0.8611242771148682,-0.31606295704841614,-0.3181917071342468,-0.8930321931838989,0.31819429993629456,-0.3181917071342468,-0.8930321931838989,0.31819429993629456,-0.3181917071342468,-0.8930321931838989,0.31819429993629456,-0.3181917071342468,-0.8930321931838989,0.31819429993629456,-0.39820390939712524,-0.8611285090446472,0.31605613231658936,-0.39820390939712524,-0.8611285090446472,0.31605613231658936,-0.39820390939712524,-0.8611285090446472,0.31605613231658936,-0.39820390939712524,-0.8611285090446472,0.31605613231658936,-0.3181929588317871,-0.3181893825531006,-0.8930334448814392,-0.3181929588317871,-0.3181893825531006,-0.8930334448814392,-0.3181929588317871,-0.3181893825531006,-0.8930334448814392,-0.3181929588317871,-0.3181893825531006,-0.8930334448814392,0.398214727640152,-0.3160427510738373,-0.8611282706260681,0.398214727640152,-0.3160427510738373,-0.8611282706260681,0.398214727640152,-0.3160427510738373,-0.8611282706260681,0.398214727640152,-0.3160427510738373,-0.8611282706260681,0.31819266080856323,-0.31819653511047363,-0.8930309414863586,0.31819266080856323,-0.31819653511047363,-0.8930309414863586,0.31819266080856323,-0.31819653511047363,-0.8930309414863586,0.31819266080856323,-0.31819653511047363,-0.8930309414863586,0.8611248731613159,-0.39820438623428345,-0.31606507301330566,0.8611248731613159,-0.39820438623428345,-0.31606507301330566,0.8611248731613159,-0.39820438623428345,-0.31606507301330566,0.8611248731613159,-0.39820438623428345,-0.31606507301330566,0.8611255884170532,-0.3160474896430969,-0.39821693301200867,0.8611255884170532,-0.3160474896430969,-0.39821693301200867,0.8611255884170532,-0.3160474896430969,-0.39821693301200867,0.8611255884170532,-0.3160474896430969,-0.39821693301200867,-0.8930345773696899,-0.3181912899017334,-0.31818774342536926,-0.8930345773696899,-0.3181912899017334,-0.31818774342536926,-0.8930345773696899,-0.3181912899017334,-0.31818774342536926,-0.8930345773696899,-0.3181912899017334,-0.31818774342536926,-0.8611279726028442,0.3982178866863251,-0.3160398602485657,-0.8611279726028442,0.3982178866863251,-0.3160398602485657,-0.8611279726028442,0.3982178866863251,-0.3160398602485657,-0.8611279726028442,0.3982178866863251,-0.3160398602485657,0.8611286878585815,-0.3160666823387146,0.39819496870040894,0.8611286878585815,-0.3160666823387146,0.39819496870040894,0.8611286878585815,-0.3160666823387146,0.39819496870040894,0.8611286878585815,-0.3160666823387146,0.39819496870040894,-0.31604599952697754,-0.8611259460449219,-0.3982173800468445,-0.31604599952697754,-0.8611259460449219,-0.3982173800468445,-0.31604599952697754,-0.8611259460449219,-0.3982173800468445,-0.31604599952697754,-0.8611259460449219,-0.3982173800468445,-0.3182077705860138,0.8930187225341797,0.31821584701538086,-0.3182077705860138,0.8930187225341797,0.31821584701538086,-0.3182077705860138,0.8930187225341797,0.31821584701538086,-0.3182077705860138,0.8930187225341797,0.31821584701538086,0.31819307804107666,0.8930350542068481,0.3181852102279663,0.31819307804107666,0.8930350542068481,0.3181852102279663,0.31819307804107666,0.8930350542068481,0.3181852102279663,0.31819307804107666,0.8930350542068481,0.3181852102279663,0.3181931972503662,0.3181889057159424,0.893033504486084,0.3181931972503662,0.3181889057159424,0.893033504486084,0.3181931972503662,0.3181889057159424,0.893033504486084,0.3181931972503662,0.3181889057159424,0.893033504486084,0.3182152509689331,-0.3182116150856018,0.893017590045929,0.3182152509689331,-0.3182116150856018,0.893017590045929,0.3182152509689331,-0.3182116150856018,0.893017590045929,0.3182152509689331,-0.3182116150856018,0.893017590045929,-0.3182075023651123,0.31821173429489136,0.8930203914642334,-0.3182075023651123,0.31821173429489136,0.8930203914642334,-0.3182075023651123,0.31821173429489136,0.8930203914642334,-0.3182075023651123,0.31821173429489136,0.8930203914642334,0.3160323202610016,0.8611453771591187,-0.39818620681762695,0.3160323202610016,0.8611453771591187,-0.39818620681762695,0.3160323202610016,0.8611453771591187,-0.39818620681762695,0.3160323202610016,0.8611453771591187,-0.39818620681762695,-0.39394327998161316,-0.39396142959594727,0.8304233551025391,-0.39394327998161316,-0.39396142959594727,0.8304233551025391,-0.39394327998161316,-0.39396142959594727,0.8304233551025391,-0.39394327998161316,-0.39396142959594727,0.8304233551025391,0.39394742250442505,-0.3939295709133148,0.8304365277290344,0.39394742250442505,-0.3939295709133148,0.8304365277290344,0.39394742250442505,-0.3939295709133148,0.8304365277290344,0.39394742250442505,-0.3939295709133148,0.8304365277290344,0.393976092338562,-0.8304168581962585,0.39394256472587585,0.393976092338562,-0.8304168581962585,0.39394256472587585,0.393976092338562,-0.8304168581962585,0.39394256472587585,0.393976092338562,-0.8304168581962585,0.39394256472587585,0.8304234743118286,-0.39396101236343384,0.3939433991909027,0.8304234743118286,-0.39396101236343384,0.3939433991909027,0.8304234743118286,-0.39396101236343384,0.3939433991909027,0.8304234743118286,-0.39396101236343384,0.3939433991909027,-0.3939476013183594,-0.8304222822189331,-0.3939594626426697,-0.3939476013183594,-0.8304222822189331,-0.3939594626426697,-0.3939476013183594,-0.8304222822189331,-0.3939594626426697,-0.3939476013183594,-0.8304222822189331,-0.3939594626426697,-0.3939593434333801,-0.8304222822189331,0.3939477205276489,-0.3939593434333801,-0.8304222822189331,0.3939477205276489,-0.3939593434333801,-0.8304222822189331,0.3939477205276489,-0.3939593434333801,-0.8304222822189331,0.3939477205276489,0.393926739692688,-0.3939448595046997,-0.8304391503334045,0.393926739692688,-0.3939448595046997,-0.8304391503334045,0.393926739692688,-0.3939448595046997,-0.8304391503334045,0.393926739692688,-0.3939448595046997,-0.8304391503334045,-0.8304203152656555,-0.39394691586494446,0.39396411180496216,-0.8304203152656555,-0.39394691586494446,0.39396411180496216,-0.8304203152656555,-0.39394691586494446,0.39396411180496216,-0.8304203152656555,-0.39394691586494446,0.39396411180496216,0.3939414918422699,0.393930047750473,-0.8304392099380493,0.3939414918422699,0.393930047750473,-0.8304392099380493,0.3939414918422699,0.393930047750473,-0.8304392099380493,0.3939414918422699,0.393930047750473,-0.8304392099380493,-0.3939580023288727,0.39394649863243103,0.8304234743118286,-0.3939580023288727,0.39394649863243103,0.8304234743118286,-0.3939580023288727,0.39394649863243103,0.8304234743118286,-0.3939580023288727,0.39394649863243103,0.8304234743118286,-0.39395201206207275,0.8304221630096436,0.39395517110824585,-0.39395201206207275,0.8304221630096436,0.39395517110824585,-0.39395201206207275,0.8304221630096436,0.39395517110824585,-0.39395201206207275,0.8304221630096436,0.39395517110824585,-0.39820295572280884,-0.3160640299320221,0.8611259460449219,-0.39820295572280884,-0.3160640299320221,0.8611259460449219,-0.39820295572280884,-0.3160640299320221,0.8611259460449219,-0.39820295572280884,-0.3160640299320221,0.8611259460449219,-0.8611248135566711,-0.3160442113876343,0.39822128415107727,-0.8611248135566711,-0.3160442113876343,0.39822128415107727,-0.8611248135566711,-0.3160442113876343,0.39822128415107727,-0.8611248135566711,-0.3160442113876343,0.39822128415107727,-0.31604111194610596,-0.3982183337211609,0.8611273169517517,-0.31604111194610596,-0.3982183337211609,0.8611273169517517,-0.31604111194610596,-0.3982183337211609,0.8611273169517517,-0.31604111194610596,-0.3982183337211609,0.8611273169517517,-0.3160600960254669,-0.8611261248588562,0.39820581674575806,-0.3160600960254669,-0.8611261248588562,0.39820581674575806,-0.3160600960254669,-0.8611261248588562,0.39820581674575806,-0.3160600960254669,-0.8611261248588562,0.39820581674575806,-0.31606826186180115,0.8611270189285278,-0.39819711446762085,-0.31606826186180115,0.8611270189285278,-0.39819711446762085,-0.31606826186180115,0.8611270189285278,-0.39819711446762085,-0.31606826186180115,0.8611270189285278,-0.39819711446762085,-0.8611301183700562,0.3160545825958252,-0.3982013463973999,-0.8611301183700562,0.3160545825958252,-0.3982013463973999,-0.8611301183700562,0.3160545825958252,-0.3982013463973999,-0.8611301183700562,0.3160545825958252,-0.3982013463973999,0.3982081413269043,0.31607723236083984,0.8611186742782593,0.3982081413269043,0.31607723236083984,0.8611186742782593,0.3982081413269043,0.31607723236083984,0.8611186742782593,0.3982081413269043,0.31607723236083984,0.8611186742782593,0.8611276745796204,0.3160439729690552,0.3982152044773102,0.8611276745796204,0.3160439729690552,0.3982152044773102,0.8611276745796204,0.3160439729690552,0.3982152044773102,0.8611276745796204,0.3160439729690552,0.3982152044773102,-0.8611273765563965,0.39820489287376404,0.3160577416419983,-0.8611273765563965,0.39820489287376404,0.3160577416419983,-0.8611273765563965,0.39820489287376404,0.3160577416419983,-0.8611273765563965,0.39820489287376404,0.3160577416419983,-0.8611289858818054,0.3160620927810669,0.3981979489326477,-0.8611289858818054,0.3160620927810669,0.3981979489326477,-0.8611289858818054,0.3160620927810669,0.3981979489326477,-0.8611289858818054,0.3160620927810669,0.3981979489326477,0.3939596116542816,-0.8304221630096436,-0.39394763112068176,0.3939596116542816,-0.8304221630096436,-0.39394763112068176,0.3939596116542816,-0.8304221630096436,-0.39394763112068176,0.3939596116542816,-0.8304221630096436,-0.39394763112068176],\n \"normalized\": false\n },\n \"uv\": {\n \"itemSize\": 2,\n \"type\": \"Float32Array\",\n \"array\": [0.04120219498872757,0.12086033821105957,0.05345028638839722,0.08731907606124878,0.11187556385993958,0.0670785903930664,0.6875278949737549,0.13345998525619507,0.04903397709131241,0.004412055015563965,0.0771341323852539,0.03593343496322632,0.11686006188392639,0.03130292892456055,0.31248292326927185,0.10850334167480469,0.0489392951130867,0.02688688039779663,0.06469712406396866,0.01563972234725952,0.0803603008389473,0.0917351245880127,0.3686402440071106,0.07315778732299805,0.08036012947559357,0.12086033821105957,0.09260810911655426,0.08731895685195923,0.10864977538585663,0.015640199184417725,0.31252771615982056,0.008440375328063965,0.07252871245145798,0.0917351245880127,0.08828651905059814,0.02688688039779663,0.10081818699836731,0.02688688039779663,0.4936917722225189,0.19815367460250854,0.08025602996349335,0.04575681686401367,0.08838120102882385,0.004412055015563965,0.1084604263305664,0.0983855128288269,0.4374849796295166,0.23353207111358643,0.037787072360515594,0.08731907606124878,0.049033790826797485,0.08731907606124878,0.1084604263305664,0.06366342306137085,0.18752798438072205,0.38353127241134644,0.04542912542819977,0.004412055015563965,0.08025602996349335,0.034130990505218506,0.1040443629026413,0.06484419107437134,0.18748320639133453,0.4834633469581604,0.006349444389343262,0.5731359720230103,0.006555216386914253,0.02688688039779663,0.06469712406396866,0.01905524730682373,0.07694480568170547,0.0917351245880127,0.030523335561156273,0.02688688039779663,0.0771341323852539,0.043954312801361084,0.08477634936571121,0.004412055015563965,0.4374811053276062,0.35838615894317627,0.014292115345597267,0.12086033821105957,0.03061802126467228,0.004412055015563965,0.0964021235704422,0.015639781951904297,0.4934193789958954,0.32318025827407837,0.053450047969818115,0.01905524730682373,0.06469716131687164,0.0917351245880127,0.09630745649337769,0.05377775430679321,0.49373188614845276,0.44814980030059814,0.009876048192381859,0.0917351245880127,0.09298662841320038,0.01905524730682373,0.11999154090881348,0.09396946430206299,0.6183853149414062,0.3231801986694336,0.00987587682902813,0.12086033821105957,0.029955485835671425,0.12086033821105957,0.06469673663377762,0.007808566093444824,0.562527596950531,0.2587568163871765,0.0299553032964468,0.0917351245880127,0.05686555057764053,0.01905524730682373,0.09289196133613586,0.05377775430679321,0.5065897703170776,0.32315701246261597,0.056571945548057556,0.0421520471572876,0.09279727190732956,0.03130292892456055,0.1200861781835556,0.07149463891983032,0.5624833106994629,0.35836511850357056,0.018086323514580727,0.004412055015563965,0.056571945548057556,0.04575687646865845,0.11648134887218475,0.07149463891983032,0.18748287856578827,0.3584839701652527,0.017707442864775658,0.09173506498336792,0.09602326154708862,0.08731895685195923,0.1120648980140686,0.015640199184417725,0.1875280737876892,0.2584848999977112,0.05345025658607483,0.12086033821105957,0.06128161400556564,0.011223673820495605,0.07252849638462067,0.08731907606124878,0.3125280439853668,0.13357031345367432,0.03337060660123825,0.08731913566589355,0.0769449844956398,0.087319016456604,0.10864977538585663,0.0078089237213134766,0.5625283718109131,0.133742094039917,0.08025602996349335,0.03773587942123413,0.10043948143720627,0.06484419107437134,0.12046489119529724,0.03130292892456055,0.5624833703041077,0.23337173461914062,0.03412818908691406,0.02688688039779663,0.08025602996349335,0.04215192794799805,0.11206528544425964,0.0983855128288269,0.18748319149017334,0.23347699642181396,0.006460724398493767,0.087319016456604,0.017707442864775658,0.087319016456604,0.06252795457839966,0.25844651460647583,0.1120649129152298,0.023471713066101074,0.014576157554984093,0.05377775430679321,0.04561847448348999,0.058193862438201904,0.1008182168006897,0.01563972234725952,0.25627732276916504,0.44812923669815063,0.006148636341094971,0.4481179118156433,0.05686555057764053,0.026886820793151855,0.08819183707237244,0.12086033821105957,0.10893382132053375,0.05377775430679321,0.018086323514580727,0.03130292892456055,0.056571945548057556,0.05017292499542236,0.06248307228088379,0.48360395431518555,0.10883913934230804,0.03130292892456055,0.025539224967360497,0.05819380283355713,0.07252870500087738,0.01563972234725952,0.1039496660232544,0.12086033821105957,0.49378809332847595,0.07314485311508179,0.014292331412434578,0.087319016456604,0.025539005175232887,0.087319016456604,0.10864977538585663,0.023471713066101074,0.4375278651714325,0.008257150650024414,0.009970692917704582,0.03130298852920532,0.014292115345597267,0.05819380283355713,0.053450047969818115,0.023471355438232422,0.3811866044998169,0.07312166690826416,0.0490339919924736,0.0917351245880127,0.0803602933883667,0.01563972234725952,0.10432836413383484,0.05377775430679321,0.6185856461524963,0.44816309213638306,0.02601257897913456,0.03130292892456055,0.061281636357307434,0.05819380283355713,0.06469713896512985,0.02688688039779663,0.6315924525260925,0.32315754890441895,0.03061799891293049,0.03130292892456055,0.06911320239305496,0.023471355438232422,0.09602341055870056,0.09173518419265747,0.7433825731277466,0.32318103313446045,0.08477634936571121,0.05377775430679321,0.10043948143720627,0.0983855128288269,0.11629162728786469,0.0652761459350586,0.687483012676239,0.4834805130958557,0.037787072360515594,0.12086033821105957,0.041202202439308167,0.08731907606124878,0.11187553405761719,0.06366342306137085,0.5625277757644653,0.00847846269607544,0.010065404698252678,0.004412055015563965,0.05345005542039871,0.035933494567871094,0.1008182168006897,0.03130298852920532,0.5624833703041077,0.10848653316497803,0.02601257897913456,0.02688688039779663,0.06911320239305496,0.01905524730682373,0.07252870500087738,0.05819380283355713,0.3685356378555298,0.19816696643829346,0.029955485835671425,0.08731913566589355,0.06469696015119553,0.12086033821105957,0.10864977538585663,0.011224091053009033,0.43752849102020264,0.38332629203796387,0.07694479078054428,0.05819380283355713,0.10053417086601257,0.08731895685195923,0.10423369705677032,0.01905524730682373,0.5065778493881226,0.19815611839294434,0.017991656437516212,0.05377775430679321,0.0803602933883667,0.05819380283355713,0.10423369705677032,0.01563972234725952,0.1188262403011322,0.4481416940689087,0.0065551940351724625,0.03130298852920532,0.05686555057764053,0.023471355438232422,0.084776371717453,0.12086033821105957,0.7436801791191101,0.07315462827682495,0.025539247319102287,0.09173518419265747,0.06460244953632355,0.05377769470214844,0.10423369705677032,0.023471355438232422,0.11862531304359436,0.5731591582298279,0.06118693947792053,0.05377769470214844,0.06911322474479675,0.0917351245880127,0.10081818699836731,0.023471355438232422,0.5063889026641846,0.4481391906738281,0.022123711183667183,0.09173518419265747,0.08487099409103394,0.02688688039779663,0.10423369705677032,0.02688688039779663,0.38155296444892883,0.3231542706489563,0.02259708009660244,0.03130292892456055,0.06128162145614624,0.02688688039779663,0.08819186687469482,0.05819392204284668,0.24363532662391663,0.5731584429740906,0.03337061405181885,0.12086033821105957,0.06469673663377762,0.011223673820495605,0.0691133663058281,0.08731907606124878,0.687528133392334,0.3834933042526245,0.017707636579871178,0.12086033821105957,0.0964021235704422,0.01905524730682373,0.11657601594924927,0.09396946430206299,0.1313704252243042,0.32313746213912964,0.006460549309849739,0.0917351245880127,0.03403352200984955,0.004412055015563965,0.09298662841320038,0.015639781951904297,0.13138353824615479,0.1981390118598938,0.014576157554984093,0.02688688039779663,0.0299553032964468,0.05819392204284668,0.0803602784872055,0.026886820793151855,0.38124242424964905,0.4481261968612671,0.033370792865753174,0.05819392204284668,0.0803602784872055,0.023471355438232422,0.12037022411823273,0.05377775430679321,0.6183971166610718,0.19817936420440674,0.05345005542039871,0.058193862438201904,0.0964021235704422,0.02688688039779663,0.11999151110649109,0.0983855128288269,0.6313499808311462,0.1981356143951416,0.056865572929382324,0.058193862438201904,0.06920789182186127,0.03130286931991577,0.0964021235704422,0.023471355438232422,0.3686973452568054,0.4481528401374817,0.014481494203209877,0.03130292892456055,0.056571945548057556,0.05377781391143799,0.06911319494247437,0.05377769470214844,0.3124830424785614,0.48353415727615356,0.022123875096440315,0.087319016456604,0.08819165080785751,0.08731907606124878,0.10864977538585663,0.02688688039779663,0.18752774596214294,0.5084468126296997,0.022123703733086586,0.05819380283355713,0.02259708009660244,0.02688688039779663,0.07252870500087738,0.01905524730682373,0.1313396394252777,0.5731350779533386,0.00646076537668705,0.12086033821105957,0.05686537176370621,0.12086033821105957,0.06128161400556564,0.007808566093444824,0.18752765655517578,0.1335013508796692,0.04561866074800491,0.12086033821105957,0.053450047969818115,0.007808566093444824,0.06252825260162354,0.1334705352783203,0.06469693779945374,0.08731907606124878,0.006339132785797119,0.3231348991394043,0.006460549309849739,0.05819380283355713,0.07262339442968369,0.03130286931991577,0.09298662841320038,0.023471355438232422,0.009875854477286339,0.087319016456604,0.08477649837732315,0.08731907606124878,0.1120649129152298,0.02688688039779663,0.31252795457839966,0.25839555263519287,0.009876048192381859,0.05819380283355713,0.09298662841320038,0.02688688039779663,0.11657601594924927,0.0983855128288269,0.36867624521255493,0.3231545090675354,0.06252825260162354,0.383209228515625,0.08036010712385178,0.087319016456604,0.0881916955113411,0.09173506498336792,0.1120649129152298,0.0078089237213134766,0.053450047969818115,0.01563972234725952,0.06128164380788803,0.0917351245880127,0.08828655630350113,0.03130298852920532,0.6312947273254395,0.073131263256073,0.061281830072402954,0.12086033821105957,0.08477656543254852,0.09173506498336792,0.1120649129152298,0.011224091053009033,0.6875279545783997,0.008391082286834717,0.06911320239305496,0.01563972234725952,0.06911322474479675,0.05819380283355713,0.10053417086601257,0.12086033821105957,0.631377100944519,0.44813835620880127,0.033370815217494965,0.0917351245880127,0.05686555057764053,0.01563972234725952,0.08487105369567871,0.03130298852920532,0.7435976266860962,0.44816213846206665,0.04561866074800491,0.08731907606124878,0.05686540901660919,0.08731907606124878,0.1084604263305664,0.0670785903930664,0.3125280737876892,0.3833693861961365,0.037786878645420074,0.05819380283355713,0.04552379250526428,0.02688688039779663,0.06128161400556564,0.01563972234725952,0.13140809535980225,0.4481407403945923,0.03403349965810776,0.03130292892456055,0.05345005542039871,0.0917351245880127,0.06911320239305496,0.026886820793151855,0.2564394772052765,0.19814354181289673,0.017707636579871178,0.05819380283355713,0.053450047969818115,0.026886820793151855,0.11234933137893677,0.05377775430679321,0.11863547563552856,0.32315850257873535,0.025539016351103783,0.12086033821105957,0.0625276267528534,0.5084590315818787,0.07694500684738159,0.12086033821105957,0.10864977538585663,0.01905524730682373,0.014292312785983086,0.09173506498336792,0.022123919799923897,0.12086033821105957,0.1120648980140686,0.01905524730682373,0.43752825260162354,0.2587151527404785,0.05686517059803009,0.011223673820495605,0.07252854108810425,0.12086033821105957,0.09260810166597366,0.12086033821105957,0.4375276267528534,0.13337987661361694,0.053450047969818115,0.011223673820495605,0.06128180772066116,0.08731907606124878,0.09602323174476624,0.12086033821105957,0.687527596950531,0.2587602138519287,0.049033790826797485,0.12086033821105957,0.05686517059803009,0.007808566093444824,0.06911341845989227,0.12086033821105957,0.5625280141830444,0.38350802659988403,0.017991656437516212,0.02688688039779663,0.07694479078054428,0.02688688039779663,0.09602341055870056,0.05819380283355713,0.24360424280166626,0.3231614828109741,0.045429132878780365,0.03130298852920532,0.06248307228088379,0.2334902286529541,0.11206528544425964,0.07149463891983032,0.11960287392139435,0.023281991481781006,0.026107268407940865,0.05377775430679321,0.030523335561156273,0.05377775430679321,0.08025602996349335,0.05377769470214844,0.6874831914901733,0.3583640456199646,0.022502413019537926,0.004412055015563965,0.022502413019537926,0.05377775430679321,0.08025602996349335,0.05017286539077759,0.18748320639133453,0.6085007190704346,0.026107246056199074,0.004412055015563965,0.03412819653749466,0.05377775430679321,0.0771341323852539,0.0519753098487854,0.3124833106994629,0.2334464192390442,0.05345005542039871,0.051975369453430176,0.062483012676239014,0.3585008978843689,0.0727180615067482,0.05377769470214844,0.11244398355484009,0.03130292892456055,0.1084604263305664,0.07149463891983032,0.11648134887218475,0.12086033821105957,0.11960287392139435,0.02688688039779663,0.31248316168785095,0.35852259397506714,0.006460549309849739,0.05377775430679321,0.08838121592998505,0.05377775430679321,0.11941350996494293,0.06347370147705078,0.6874832510948181,0.10852515697479248,0.0490339919924736,0.03130298852920532,0.11648097634315491,0.02508443593978882,0.1200861781835556,0.12086033821105957,0.6874829530715942,0.23349487781524658,0.014481494203209877,0.004412055015563965,0.05345005542039871,0.043954432010650635,0.0964021235704422,0.03130292892456055,0.43748292326927185,0.4835529923439026,0.05657196044921875,0.037735939025878906,0.061092279851436615,0.03130286931991577,0.10442306846380234,0.03130298852920532,0.5624828934669495,0.4834739565849304,0.006460549309849739,0.004412055015563965,0.056571945548057556,0.03413110971450806,0.06248317286372185,0.6084953546524048,0.06469713896512985,0.03130286931991577,0.006358683109283447,0.198136568069458,0.04552381485700607,0.05377781391143799,0.04561847448348999,0.0917351245880127,0.0803602933883667,0.01905524730682373,0.04120240360498428,0.0917351245880127,0.04893931746482849,0.05377781391143799,0.07694479078054428,0.01905524730682373,0.7436245679855347,0.1981593370437622,0.06469712406396866,0.023471355438232422,0.06469712406396866,0.05819380283355713,0.11197057366371155,0.09396946430206299,0.11861595511436462,0.1981601119041443,0.06128162145614624,0.023471355438232422,0.084776371717453,0.05819392204284668,0.10855509340763092,0.09396940469741821,0.25629860162734985,0.32313108444213867,0.07694478332996368,0.023471355438232422,0.09260791540145874,0.05819380283355713,0.1169547289609909,0.05377775430679321,0.256334125995636,0.07313430309295654,0.049033984541893005,0.058193862438201904,0.1008182168006897,0.01905524730682373,0.1039496511220932,0.08731895685195923,0.2435668408870697,0.448164165019989,0.07252871245145798,0.023471355438232422,0.09260791540145874,0.09173518419265747,0.10855511575937271,0.12086033821105957,0.38128527998924255,0.19813251495361328,0.056865572929382324,0.0917351245880127,0.07252871245145798,0.026886820793151855,0.11197061836719513,0.12086033821105957,0.2435913383960724,0.19816231727600098,0.009970737621188164,0.02688688039779663,0.04120238125324249,0.05819380283355713,0.06128162145614624,0.01905524730682373,0.6186096668243408,0.07316023111343384,0.037786878645420074,0.0917351245880127,0.07694479078054428,0.01563972234725952,0.10091288387775421,0.05377775430679321,0.5063652992248535,0.07313716411590576,0.010065404698252678,0.05377775430679321,0.10404433310031891,0.0983855128288269,0.11941350996494293,0.0670785903930664,0.4374832212924957,0.10858356952667236],\n \"normalized\": false\n }\n },\n \"index\": {\n \"type\": \"Uint16Array\",\n \"array\": [283,23,19,231,319,235,27,31,363,338,273,32,39,279,171,147,331,47,55,63,51,67,71,183,75,311,143,79,83,195,222,297,351,219,87,371,90,313,271,259,207,203,236,102,155,111,383,107,291,335,119,247,323,159,287,303,127,179,131,255,135,139,375,3,327,347,308,213,140,91,210,230,70,275,278,348,173,122,269,157,114,36,185,41,193,293,190,108,268,113,28,8,4,294,13,69,18,162,166,9,374,34,82,358,194,26,2,134,361,154,94,233,202,227,277,160,168,117,346,343,99,315,103,260,133,373,246,78,146,212,109,104,276,180,68,301,264,124,369,125,266,284,289,221,177,218,73,381,250,106,172,300,120,33,136,336,322,130,382,112,320,380,298,354,350,238,158,98,285,349,121,249,74,142,228,225,88,176,56,53,132,344,376,189,76,192,274,10,35,368,72,217,237,148,77,1,200,196,342,288,116,165,281,16,184,52,48,241,145,45,25,93,256,126,282,286,339,164,161,42,49,181,92,100,204,341,324,296,378,334,138,312,205,101,149,30,81,337,137,332,105,141,214,226,206,314,5,80,29,60,329,65,44,253,240,66,50,62,299,325,318,328,292,64,37,20,85,366,86,22,58,330,61,254,321,242,211,307,175,15,7,11,310,302,306,198,317,326,353,209,174,21,169,17,283,367,23,231,355,319,27,263,31,338,163,273,39,43,279,147,191,331,55,59,63,67,295,71,75,267,311,79,151,83,222,340,297,219,187,87,90,224,313,259,95,207,236,96,102,111,115,383,291,167,335,247,243,323,287,123,303,179,251,131,135,379,139,3,199,327,308,304,213,91,110,210,70,14,275,348,352,173,269,97,157,36,84,185,193,356,293,108,89,268,28,261,8,294,357,13,18,170,162,9,262,374,82,6,358,26,258,2,361,150,154,233,197,202,277,272,160,117,377,346,99,270,315,260,24,133,246,239,78,212,208,109,276,40,180,301,309,264,369,364,125,284,280,289,177,54,218,381,129,250,172,305,300,33,372,136,112,156,320,298,316,354,238,245,158,285,223,349,249,178,74,228,232,225,176,252,56,132,0,344,189,144,76,274,12,10,368,265,72,237,153,148,1,257,200,342,220,288,165,290,281,184,216,52,241,244,145,25,360,93,126,365,282,339,333,164,42,186,49,92,152,100,341,345,324,378,118,334,149,362,30,105,248,141,226,201,206,44,57,253,66,182,50,328,188,292,366,370,86,58,46,330,254,128,321,211,215,307,15,359,7,198,234,317,353,229,209,21,38,169]\n },\n \"boundingSphere\": {\n \"center\": [0,0,0],\n \"radius\": 161.78209344582697\n }\n },\n faceValues: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24],\n rotationCombinations: {\n \"1,2\": [0, 0, 180],\n \"1,3\": [-180, 0, 90],\n \"1,4\": [90, 0, -90],\n \"1,5\": [-90, 0, -90],\n \"1,6\": [-130, -90, -40],\n \"1,7\": [0, -180, 90],\n \"1,8\": [-90, 0, 90],\n \"1,9\": [90, 0, 90],\n \"1,10\": [50, -90, -40],\n \"1,11\": [0, 90, -180],\n \"1,12\": [0, 90, 0],\n \"1,13\": [180, 0, 0],\n \"1,14\": [0, 180, 0],\n \"1,15\": [0, 0, 90],\n \"1,16\": [90, 180, 0],\n \"1,17\": [90, 0, 0],\n \"1,18\": [-130, 90, 40],\n \"1,19\": [0, 0, -90],\n \"1,20\": [90, 0, -180],\n \"1,21\": [-90, 0, 0],\n \"1,22\": [50, 90, 40],\n \"1,23\": [0, -90, 0],\n \"1,24\": [0, -90, -180],\n \"2,3\": [0, 180, 90],\n \"2,4\": [-90, 0, 90],\n \"2,5\": [90, 0, 90],\n \"2,6\": [-50, 90, -40],\n \"2,7\": [180, 0, 90],\n \"2,8\": [90, 0, -90],\n \"2,9\": [-90, 0, -90],\n \"2,10\": [130, 90, -40],\n \"2,11\": [0, -90, 0],\n \"2,12\": [0, -90, 180],\n \"2,13\": [0, -180, 0],\n \"2,14\": [-180, 0, 0],\n \"2,15\": [0, 0, -90],\n \"2,16\": [90, 0, 0],\n \"2,17\": [-90, 0, -180],\n \"2,18\": [-50, -90, 40],\n \"2,19\": [0, 0, 90],\n \"2,20\": [-90, 0, 0],\n \"2,21\": [-90, -180, 0],\n \"2,22\": [130, -90, 40],\n \"2,23\": [0, 90, -180],\n \"2,24\": [0, 90, 0],\n \"3,4\": [0, 90, -180],\n \"3,5\": [0, -90, 180],\n \"3,6\": [-90, 0, -180],\n \"3,7\": [0, 0, 180],\n \"3,8\": [0, -90, 0],\n \"3,9\": [0, 90, 0],\n \"3,10\": [-90, 0, 0],\n \"3,11\": [90, 0, -90],\n \"3,12\": [90, 0, 90],\n \"3,13\": [0, 0, -90],\n \"3,14\": [0, 0, 90],\n \"3,15\": [0, 180, 0],\n \"3,16\": [45, -90, 135],\n \"3,17\": [-135, 90, 45],\n \"3,18\": [90, 0, 0],\n \"3,19\": [-180, 0, 0],\n \"3,20\": [45, 90, 45],\n \"3,21\": [45, -90, -45],\n \"3,22\": [-90, 180, 0],\n \"3,23\": [-90, 0, 90],\n \"3,24\": [-90, 0, -90],\n \"4,5\": [0, 180, 0],\n \"4,6\": [90, 0, -90],\n \"4,7\": [0, 90, 0],\n \"4,8\": [180, 0, 0],\n \"4,9\": [0, 0, -180],\n \"4,10\": [90, 0, 90],\n \"4,11\": [-90, 0, 180],\n \"4,12\": [-90, 0, 0],\n \"4,13\": [-40, 90, 130],\n \"4,14\": [-40, 90, -50],\n \"4,15\": [0, -90, -180],\n \"4,16\": [-180, 0, 90],\n \"4,17\": [0, 0, 90],\n \"4,18\": [-90, 0, -90],\n \"4,19\": [0, -90, 0],\n \"4,20\": [0, 0, -90],\n \"4,21\": [0, 180, 90],\n \"4,22\": [-90, 0, 90],\n \"4,23\": [-90, 180, 0],\n \"4,24\": [90, 0, 0],\n \"5,6\": [90, 0, 90],\n \"5,7\": [0, -90, 0],\n \"5,8\": [0, 0, 180],\n \"5,9\": [180, 0, 0],\n \"5,10\": [90, 0, -90],\n \"5,11\": [-90, 0, 0],\n \"5,12\": [90, 180, 0],\n \"5,13\": [40, -90, 130],\n \"5,14\": [40, -90, -50],\n \"5,15\": [0, 90, 180],\n \"5,16\": [0, 0, -90],\n \"5,17\": [180, 0, -90],\n \"5,18\": [-90, 0, 90],\n \"5,19\": [0, 90, 0],\n \"5,20\": [0, 180, -90],\n \"5,21\": [0, 0, 90],\n \"5,22\": [-90, 0, -90],\n \"5,23\": [90, 0, 0],\n \"5,24\": [90, 0, -180],\n \"6,7\": [-90, 0, 0],\n \"6,8\": [45, 90, 45],\n \"6,9\": [45, -90, -45],\n \"6,10\": [0, 0, -180],\n \"6,11\": [0, 180, -90],\n \"6,12\": [-180, 0, -90],\n \"6,13\": [-90, 0, 90],\n \"6,14\": [-90, 0, -90],\n \"6,15\": [90, 0, 0],\n \"6,16\": [0, 90, -180],\n \"6,17\": [0, -90, -180],\n \"6,18\": [0, -180, 0],\n \"6,19\": [-90, -180, 0],\n \"6,20\": [0, -90, 0],\n \"6,21\": [0, 90, 0],\n \"6,22\": [-180, 0, 0],\n \"6,23\": [0, 0, -90],\n \"6,24\": [0, 0, 90],\n \"7,8\": [0, 90, 180],\n \"7,9\": [0, -90, -180],\n \"7,10\": [90, 0, -180],\n \"7,11\": [-90, 0, 90],\n \"7,12\": [-90, 0, -90],\n \"7,13\": [0, 0, 90],\n \"7,14\": [0, 0, -90],\n \"7,15\": [180, 0, 0],\n \"7,16\": [-45, 90, -45],\n \"7,17\": [-45, -90, 45],\n \"7,18\": [90, -180, 0],\n \"7,19\": [0, 180, 0],\n \"7,20\": [135, -90, 45],\n \"7,21\": [135, 90, -45],\n \"7,22\": [-90, 0, 0],\n \"7,23\": [90, 0, -90],\n \"7,24\": [90, 0, 90],\n \"8,9\": [0, -180, 0],\n \"8,10\": [-90, 0, 90],\n \"8,11\": [-90, -180, 0],\n \"8,12\": [90, 0, 0],\n \"8,13\": [-40, 90, -50],\n \"8,14\": [-40, 90, 130],\n \"8,15\": [0, -90, 0],\n \"8,16\": [0, 0, 90],\n \"8,17\": [0, -180, -90],\n \"8,18\": [90, 0, -90],\n \"8,19\": [0, -90, -180],\n \"8,20\": [-180, 0, -90],\n \"8,21\": [0, 0, -90],\n \"8,22\": [90, 0, 90],\n \"8,23\": [-90, 0, -180],\n \"8,24\": [-90, 0, 0],\n \"9,10\": [-90, 0, -90],\n \"9,11\": [90, 0, 0],\n \"9,12\": [90, 0, 180],\n \"9,13\": [40, -90, -50],\n \"9,14\": [40, -90, 130],\n \"9,15\": [0, 90, 0],\n \"9,16\": [0, -180, 90],\n \"9,17\": [0, 0, -90],\n \"9,18\": [90, 0, 90],\n \"9,19\": [0, 90, -180],\n \"9,20\": [0, 0, 90],\n \"9,21\": [180, 0, 90],\n \"9,22\": [90, 0, -90],\n \"9,23\": [-90, 0, 0],\n \"9,24\": [90, -180, 0],\n \"10,11\": [180, 0, -90],\n \"10,12\": [0, -180, -90],\n \"10,13\": [90, 0, -90],\n \"10,14\": [90, 0, 90],\n \"10,15\": [90, 180, 0],\n \"10,16\": [0, -90, 0],\n \"10,17\": [0, 90, 0],\n \"10,18\": [180, 0, 0],\n \"10,19\": [-90, 0, 0],\n \"10,20\": [0, 90, 180],\n \"10,21\": [0, -90, -180],\n \"10,22\": [0, 180, 0],\n \"10,23\": [0, 0, 90],\n \"10,24\": [0, 0, -90],\n \"11,12\": [0, 0, 180],\n \"11,13\": [0, -90, 0],\n \"11,14\": [0, -90, 180],\n \"11,15\": [-50, 90, -40],\n \"11,16\": [90, 0, -90],\n \"11,17\": [-90, 0, -90],\n \"11,18\": [0, 0, 90],\n \"11,19\": [130, 90, -40],\n \"11,20\": [-90, 0, 90],\n \"11,21\": [90, 0, 90],\n \"11,22\": [0, 0, -90],\n \"11,23\": [-180, 0, 0],\n \"11,24\": [0, -180, 0],\n \"12,13\": [0, 90, -180],\n \"12,14\": [0, 90, 0],\n \"12,15\": [-130, -90, -40],\n \"12,16\": [-90, 0, 90],\n \"12,17\": [90, 0, 90],\n \"12,18\": [0, 0, -90],\n \"12,19\": [50, -90, -40],\n \"12,20\": [90, 0, -90],\n \"12,21\": [-90, 0, -90],\n \"12,22\": [0, 0, 90],\n \"12,23\": [0, -180, 0],\n \"12,24\": [-180, 0, 0],\n \"13,14\": [0, 0, 180],\n \"13,15\": [0, 180, -90],\n \"13,16\": [90, 0, 180],\n \"13,17\": [-90, 0, 0],\n \"13,18\": [50, 90, 40],\n \"13,19\": [-180, 0, -90],\n \"13,20\": [90, -180, 0],\n \"13,21\": [90, 0, 0],\n \"13,22\": [-130, 90, 40],\n \"13,23\": [0, -90, 180],\n \"13,24\": [0, -90, 0],\n \"14,15\": [180, 0, -90],\n \"14,16\": [-90, 0, 0],\n \"14,17\": [-90, 180, 0],\n \"14,18\": [130, -90, 40],\n \"14,19\": [0, -180, -90],\n \"14,20\": [90, 0, 0],\n \"14,21\": [-90, 0, 180],\n \"14,22\": [-50, -90, 40],\n \"14,23\": [0, 90, 0],\n \"14,24\": [0, 90, -180],\n \"15,16\": [-45, 90, 135],\n \"15,17\": [-45, -90, -135],\n \"15,18\": [90, 0, 180],\n \"15,19\": [0, 0, 180],\n \"15,20\": [-45, -90, 45],\n \"15,21\": [-45, 90, -45],\n \"15,22\": [90, 0, 0],\n \"15,23\": [-90, 0, -90],\n \"15,24\": [-90, 0, 90],\n \"16,17\": [0, 180, 0],\n \"16,18\": [0, -90, -180],\n \"16,19\": [-90, 0, 90],\n \"16,20\": [180, 0, 0],\n \"16,21\": [0, 0, 180],\n \"16,22\": [0, -90, 0],\n \"16,23\": [40, 90, 50],\n \"16,24\": [40, 90, -130],\n \"17,18\": [0, 90, -180],\n \"17,19\": [-90, 0, -90],\n \"17,20\": [0, 0, 180],\n \"17,21\": [180, 0, 0],\n \"17,22\": [0, 90, 0],\n \"17,23\": [-40, -90, 50],\n \"17,24\": [-40, -90, -130],\n \"18,19\": [90, 0, 0],\n \"18,20\": [0, 90, 0],\n \"18,21\": [0, -90, 0],\n \"18,22\": [0, 0, 180],\n \"18,23\": [180, 0, 90],\n \"18,24\": [0, 180, 90],\n \"19,20\": [-135, 90, 45],\n \"19,21\": [-135, -90, -45],\n \"19,22\": [-90, 0, 180],\n \"19,23\": [90, 0, 90],\n \"19,24\": [90, 0, -90],\n \"20,21\": [0, 180, 0],\n \"20,22\": [0, -90, 180],\n \"20,23\": [40, 90, -130],\n \"20,24\": [40, 90, 50],\n \"21,22\": [0, 90, 180],\n \"21,23\": [-40, -90, -130],\n \"21,24\": [-40, -90, 50],\n \"22,23\": [0, -180, 90],\n \"22,24\": [-180, 0, 90],\n \"23,24\": [0, 0, -180]\n }\n },\n \"d30\": {\n \"metadata\": {\n \"version\": 4.5,\n \"type\": \"BufferGeometry\",\n \"generator\": \"BufferGeometry.toJSON\"\n },\n \"uuid\": \"6D1EB50D-67F2-45C7-BF93-23245B31E912\",\n \"type\": \"BufferGeometry\",\n \"data\": {\n \"attributes\": {\n \"position\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-55.942420959472656,58.09579086303711,-56.76457214355469,-55.942420959472656,58.09579086303711,-56.76457214355469,-55.942420959472656,58.09579086303711,-56.76457214355469,-55.942420959472656,58.09579086303711,-56.76457214355469,-55.942420959472656,58.09579086303711,-56.76457214355469,-55.942420959472656,58.09579086303711,-56.76457214355469,-55.54539108276367,91.2035140991211,-2.153374433517456,-55.54539108276367,91.2035140991211,-2.153374433517456,-55.54539108276367,91.2035140991211,-2.153374433517456,-55.54539108276367,91.2035140991211,-2.153374433517456,-55.54539108276367,91.2035140991211,-2.153374433517456,58.09599685668945,56.76477813720703,55.94200897216797,58.09599685668945,56.76477813720703,55.94200897216797,58.09599685668945,56.76477813720703,55.94200897216797,58.09599685668945,56.76477813720703,55.94200897216797,58.09599685668945,56.76477813720703,55.94200897216797,-2.1539175510406494,-55.545379638671875,-91.20350646972656,-2.1539175510406494,-55.545379638671875,-91.20350646972656,-2.1539175510406494,-55.545379638671875,-91.20350646972656,-2.1539175510406494,-55.545379638671875,-91.20350646972656,-2.1539175510406494,-55.545379638671875,-91.20350646972656,-2.1539175510406494,-55.545379638671875,-91.20350646972656,35.903011322021484,1.3310145139694214,-91.8457260131836,35.903011322021484,1.3310145139694214,-91.8457260131836,35.903011322021484,1.3310145139694214,-91.8457260131836,35.903011322021484,1.3310145139694214,-91.8457260131836,35.903011322021484,1.3310145139694214,-91.8457260131836,35.903011322021484,1.3310145139694214,-91.8457260131836,33.74937438964844,-5.019184072807548e-7,-92.66828918457031,33.74937438964844,-5.019184072807548e-7,-92.66828918457031,33.74937438964844,-5.019184072807548e-7,-92.66828918457031,33.74937438964844,-5.019184072807548e-7,-92.66828918457031,35.903690338134766,1.331014633178711,91.84544372558594,35.903690338134766,1.331014633178711,91.84544372558594,35.903690338134766,1.331014633178711,91.84544372558594,35.903690338134766,1.331014633178711,91.84544372558594,35.903690338134766,1.331014633178711,91.84544372558594,56.76499557495117,55.94220733642578,58.0955924987793,56.76499557495117,55.94220733642578,58.0955924987793,56.76499557495117,55.94220733642578,58.0955924987793,56.76499557495117,55.94220733642578,58.0955924987793,56.76499557495117,55.94220733642578,58.0955924987793,-1.3306841850280762,-57.6989631652832,89.87248229980469,-1.3306841850280762,-57.6989631652832,89.87248229980469,-1.3306841850280762,-57.6989631652832,89.87248229980469,-1.3306841850280762,-57.6989631652832,89.87248229980469,-1.3306841850280762,-57.6989631652832,89.87248229980469,-1.3306841850280762,-57.6989631652832,89.87248229980469,92.66816711425781,33.749717712402344,-0.00033652668935246766,92.66816711425781,33.749717712402344,-0.00033652668935246766,92.66816711425781,33.749717712402344,-0.00033652668935246766,92.66816711425781,33.749717712402344,-0.00033652668935246766,0.0001248687185579911,92.66816711425781,33.74972152709961,0.0001248687185579911,92.66816711425781,33.74972152709961,0.0001248687185579911,92.66816711425781,33.74972152709961,0.0001248687185579911,92.66816711425781,33.74972152709961,-91.8455810546875,-35.903350830078125,1.3313559293746948,-91.8455810546875,-35.903350830078125,1.3313559293746948,-91.8455810546875,-35.903350830078125,1.3313559293746948,-91.8455810546875,-35.903350830078125,1.3313559293746948,-91.8455810546875,-35.903350830078125,1.3313559293746948,-91.8455810546875,-35.903350830078125,1.3313559293746948,-56.76499557495117,55.94220733642578,-58.095577239990234,-56.76499557495117,55.94220733642578,-58.095577239990234,-56.76499557495117,55.94220733642578,-58.095577239990234,-56.76499557495117,55.94220733642578,-58.095577239990234,-92.66815185546875,-33.749717712402344,0.000344159547239542,-92.66815185546875,-33.749717712402344,0.000344159547239542,-92.66815185546875,-33.749717712402344,0.000344159547239542,-92.66815185546875,-33.749717712402344,0.000344159547239542,-91.84559631347656,-35.903350830078125,-1.3306736946105957,-91.84559631347656,-35.903350830078125,-1.3306736946105957,-91.84559631347656,-35.903350830078125,-1.3306736946105957,-91.84559631347656,-35.903350830078125,-1.3306736946105957,-91.84559631347656,-35.903350830078125,-1.3306736946105957,-91.2037124633789,-2.1535837650299072,-55.54503631591797,-91.2037124633789,-2.1535837650299072,-55.54503631591797,-91.2037124633789,-2.1535837650299072,-55.54503631591797,-91.2037124633789,-2.1535837650299072,-55.54503631591797,-91.2037124633789,-2.1535837650299072,-55.54503631591797,1.3308831453323364,91.84559631347656,-35.90335464477539,1.3308831453323364,91.84559631347656,-35.90335464477539,1.3308831453323364,91.84559631347656,-35.90335464477539,1.3308831453323364,91.84559631347656,-35.90335464477539,1.3308831453323364,91.84559631347656,-35.90335464477539,55.545372009277344,91.2035140991211,-2.1537835597991943,55.545372009277344,91.2035140991211,-2.1537835597991943,55.545372009277344,91.2035140991211,-2.1537835597991943,55.545372009277344,91.2035140991211,-2.1537835597991943,55.545372009277344,91.2035140991211,-2.1537835597991943,55.545372009277344,91.2035140991211,-2.1537835597991943,-91.84558868408203,35.903350830078125,1.331355094909668,-91.84558868408203,35.903350830078125,1.331355094909668,-91.84558868408203,35.903350830078125,1.331355094909668,-91.84558868408203,35.903350830078125,1.331355094909668,-91.84558868408203,35.903350830078125,1.331355094909668,-91.84558868408203,35.903350830078125,1.331355094909668,-58.09558868408203,56.76477813720703,55.94243240356445,-58.09558868408203,56.76477813720703,55.94243240356445,-58.09558868408203,56.76477813720703,55.94243240356445,-58.09558868408203,56.76477813720703,55.94243240356445,-58.09558868408203,56.76477813720703,55.94243240356445,-57.698951721191406,89.87249755859375,1.3312309980392456,-57.698951721191406,89.87249755859375,1.3312309980392456,-57.698951721191406,89.87249755859375,1.3312309980392456,-57.698951721191406,89.87249755859375,1.3312309980392456,-55.54539108276367,-91.20350646972656,-2.1533758640289307,-55.54539108276367,-91.20350646972656,-2.1533758640289307,-55.54539108276367,-91.20350646972656,-2.1533758640289307,-55.54539108276367,-91.20350646972656,-2.1533758640289307,-55.54539108276367,-91.20350646972656,-2.1533758640289307,-55.545372009277344,91.2035140991211,2.1537914276123047,-55.545372009277344,91.2035140991211,2.1537914276123047,-55.545372009277344,91.2035140991211,2.1537914276123047,-55.545372009277344,91.2035140991211,2.1537914276123047,-55.545372009277344,91.2035140991211,2.1537914276123047,-55.545372009277344,91.2035140991211,2.1537914276123047,-55.545372009277344,91.2035140991211,2.1537914276123047,-55.9420051574707,58.09578323364258,56.764991760253906,-55.9420051574707,58.09578323364258,56.764991760253906,-55.9420051574707,58.09578323364258,56.764991760253906,-55.9420051574707,58.09578323364258,56.764991760253906,1.3308836221694946,-91.84559631347656,-35.90335464477539,1.3308836221694946,-91.84559631347656,-35.90335464477539,1.3308836221694946,-91.84559631347656,-35.90335464477539,1.3308836221694946,-91.84559631347656,-35.90335464477539,1.3308836221694946,-91.84559631347656,-35.90335464477539,-91.20330047607422,-2.153582811355591,55.54571533203125,-91.20330047607422,-2.153582811355591,55.54571533203125,-91.20330047607422,-2.153582811355591,55.54571533203125,-91.20330047607422,-2.153582811355591,55.54571533203125,-91.20330047607422,-2.153582811355591,55.54571533203125,-91.20330047607422,2.1535825729370117,55.54571533203125,-91.20330047607422,2.1535825729370117,55.54571533203125,-91.20330047607422,2.1535825729370117,55.54571533203125,-91.20330047607422,2.1535825729370117,55.54571533203125,-91.20330047607422,2.1535825729370117,55.54571533203125,-91.20330047607422,2.1535825729370117,55.54571533203125,-91.8456039428711,35.903350830078125,-1.3306739330291748,-91.8456039428711,35.903350830078125,-1.3306739330291748,-91.8456039428711,35.903350830078125,-1.3306739330291748,-91.8456039428711,35.903350830078125,-1.3306739330291748,-91.8456039428711,35.903350830078125,-1.3306739330291748,33.750057220458984,-3.255321701089997e-7,92.66802978515625,33.750057220458984,-3.255321701089997e-7,92.66802978515625,33.750057220458984,-3.255321701089997e-7,92.66802978515625,33.750057220458984,-3.255321701089997e-7,92.66802978515625,89.87269592285156,-1.3310151100158691,57.698638916015625,89.87269592285156,-1.3310151100158691,57.698638916015625,89.87269592285156,-1.3310151100158691,57.698638916015625,89.87269592285156,-1.3310151100158691,57.698638916015625,89.87269592285156,-1.3310151100158691,57.698638916015625,91.2037124633789,2.153581380844116,55.545047760009766,91.2037124633789,2.153581380844116,55.545047760009766,91.2037124633789,2.153581380844116,55.545047760009766,91.2037124633789,2.153581380844116,55.545047760009766,91.2037124633789,2.153581380844116,55.545047760009766,91.2037124633789,2.153581380844116,55.545047760009766,-35.903011322021484,1.3310145139694214,91.84571075439453,-35.903011322021484,1.3310145139694214,91.84571075439453,-35.903011322021484,1.3310145139694214,91.84571075439453,-35.903011322021484,1.3310145139694214,91.84571075439453,-35.903011322021484,1.3310145139694214,91.84571075439453,-35.903011322021484,-1.33101487159729,91.84571075439453,-35.903011322021484,-1.33101487159729,91.84571075439453,-35.903011322021484,-1.33101487159729,91.84571075439453,-35.903011322021484,-1.33101487159729,91.84571075439453,-35.903011322021484,-1.33101487159729,91.84571075439453,-33.74938201904297,-5.100424687043414e-7,92.66827392578125,-33.74938201904297,-5.100424687043414e-7,92.66827392578125,-33.74938201904297,-5.100424687043414e-7,92.66827392578125,-33.74938201904297,-5.100424687043414e-7,92.66827392578125,1.0764577388763428,55.84297561645508,-91.01956939697266,1.0764577388763428,55.84297561645508,-91.01956939697266,1.0764577388763428,55.84297561645508,-91.01956939697266,1.0764577388763428,55.84297561645508,-91.01956939697266,1.0764577388763428,55.84297561645508,-91.01956939697266,1.0764577388763428,55.84297561645508,-91.01956939697266,1.0764577388763428,55.84297561645508,-91.01956939697266,-0.00033518741838634014,55.17742919921875,-91.43085479736328,-0.00033518741838634014,55.17742919921875,-91.43085479736328,-0.00033518741838634014,55.17742919921875,-91.43085479736328,-0.00033518741838634014,55.17742919921875,-91.43085479736328,-0.00033518741838634014,55.17742919921875,-91.43085479736328,-0.00033518741838634014,55.17742919921875,-91.43085479736328,54.21428298950195,-92.02606964111328,-0.00019521401554811746,54.21428298950195,-92.02606964111328,-0.00019521401554811746,54.21428298950195,-92.02606964111328,-0.00019521401554811746,54.21428298950195,-92.02606964111328,-0.00019521401554811746,54.21428298950195,-92.02606964111328,-0.00019521401554811746,54.21428298950195,-92.02606964111328,-0.00019521401554811746,55.545372009277344,-91.20350646972656,-2.153782844543457,55.545372009277344,-91.20350646972656,-2.153782844543457,55.545372009277344,-91.20350646972656,-2.153782844543457,55.545372009277344,-91.20350646972656,-2.153782844543457,55.545372009277344,-91.20350646972656,-2.153782844543457,91.8455810546875,-35.903350830078125,-1.331348180770874,91.8455810546875,-35.903350830078125,-1.331348180770874,91.8455810546875,-35.903350830078125,-1.331348180770874,91.8455810546875,-35.903350830078125,-1.331348180770874,91.8455810546875,-35.903350830078125,-1.331348180770874,91.8455810546875,-35.903350830078125,-1.331348180770874,-54.21428298950195,92.02607727050781,0.00020320962357800454,-54.21428298950195,92.02607727050781,0.00020320962357800454,-54.21428298950195,92.02607727050781,0.00020320962357800454,-54.21428298950195,92.02607727050781,0.00020320962357800454,-54.21428298950195,92.02607727050781,0.00020320962357800454,-54.21428298950195,92.02607727050781,0.00020320962357800454,55.9420051574707,58.09579086303711,-56.76498031616211,55.9420051574707,58.09579086303711,-56.76498031616211,55.9420051574707,58.09579086303711,-56.76498031616211,55.9420051574707,58.09579086303711,-56.76498031616211,55.9420051574707,58.09579086303711,-56.76498031616211,57.69895935058594,89.87249755859375,1.3308056592941284,57.69895935058594,89.87249755859375,1.3308056592941284,57.69895935058594,89.87249755859375,1.3308056592941284,57.69895935058594,89.87249755859375,1.3308056592941284,57.69895935058594,89.87249755859375,1.3308056592941284,57.69895935058594,89.87249755859375,1.3308056592941284,57.69895935058594,89.87249755859375,1.3308056592941284,-1.330683946609497,57.698951721191406,89.87248229980469,-1.330683946609497,57.698951721191406,89.87248229980469,-1.330683946609497,57.698951721191406,89.87248229980469,-1.330683946609497,57.698951721191406,89.87248229980469,-1.330683946609497,57.698951721191406,89.87248229980469,1.3313459157943726,57.698951721191406,89.87246704101562,1.3313459157943726,57.698951721191406,89.87246704101562,1.3313459157943726,57.698951721191406,89.87246704101562,1.3313459157943726,57.698951721191406,89.87246704101562,1.3313459157943726,57.698951721191406,89.87246704101562,1.3313459157943726,57.698951721191406,89.87246704101562,-33.75006103515625,-3.2792155479910434e-7,-92.66804504394531,-33.75006103515625,-3.2792155479910434e-7,-92.66804504394531,-33.75006103515625,-3.2792155479910434e-7,-92.66804504394531,-33.75006103515625,-3.2792155479910434e-7,-92.66804504394531,1.3306846618652344,-57.69895935058594,-89.87250518798828,1.3306846618652344,-57.69895935058594,-89.87250518798828,1.3306846618652344,-57.69895935058594,-89.87250518798828,1.3306846618652344,-57.69895935058594,-89.87250518798828,1.3306846618652344,-57.69895935058594,-89.87250518798828,35.903011322021484,-1.33101487159729,-91.8457260131836,35.903011322021484,-1.33101487159729,-91.8457260131836,35.903011322021484,-1.33101487159729,-91.8457260131836,35.903011322021484,-1.33101487159729,-91.8457260131836,35.903011322021484,-1.33101487159729,-91.8457260131836,1.331345796585083,-57.6989631652832,89.87246704101562,1.331345796585083,-57.6989631652832,89.87246704101562,1.331345796585083,-57.6989631652832,89.87246704101562,1.331345796585083,-57.6989631652832,89.87246704101562,1.331345796585083,-57.6989631652832,89.87246704101562,1.331345796585083,-57.6989631652832,89.87246704101562,-58.09558868408203,-56.76478576660156,55.94243240356445,-58.09558868408203,-56.76478576660156,55.94243240356445,-58.09558868408203,-56.76478576660156,55.94243240356445,-58.09558868408203,-56.76478576660156,55.94243240356445,-55.9420051574707,-58.09579849243164,56.764991760253906,-55.9420051574707,-58.09579849243164,56.764991760253906,-55.9420051574707,-58.09579849243164,56.764991760253906,-55.9420051574707,-58.09579849243164,56.764991760253906,-55.9420051574707,-58.09579849243164,56.764991760253906,-89.87269592285156,1.3310145139694214,-57.69862365722656,-89.87269592285156,1.3310145139694214,-57.69862365722656,-89.87269592285156,1.3310145139694214,-57.69862365722656,-89.87269592285156,1.3310145139694214,-57.69862365722656,-89.87269592285156,1.3310145139694214,-57.69862365722656,-89.87269592285156,1.3310145139694214,-57.69862365722656,55.942420959472656,58.09578323364258,56.764583587646484,55.942420959472656,58.09578323364258,56.764583587646484,55.942420959472656,58.09578323364258,56.764583587646484,55.942420959472656,58.09578323364258,56.764583587646484,55.942420959472656,58.09578323364258,56.764583587646484,-0.00012307056749705225,-92.66816711425781,-33.749717712402344,-0.00012307056749705225,-92.66816711425781,-33.749717712402344,-0.00012307056749705225,-92.66816711425781,-33.749717712402344,-0.00012307056749705225,-92.66816711425781,-33.749717712402344,-1.3311455249786377,-91.84559631347656,-35.90334701538086,-1.3311455249786377,-91.84559631347656,-35.90334701538086,-1.3311455249786377,-91.84559631347656,-35.90334701538086,-1.3311455249786377,-91.84559631347656,-35.90334701538086,-1.3311455249786377,-91.84559631347656,-35.90334701538086,-1.3311455249786377,-91.84559631347656,-35.90334701538086,58.09599685668945,-56.76478576660156,55.94200897216797,58.09599685668945,-56.76478576660156,55.94200897216797,58.09599685668945,-56.76478576660156,55.94200897216797,58.09599685668945,-56.76478576660156,55.94200897216797,55.54539108276367,91.2035140991211,2.15338134765625,55.54539108276367,91.2035140991211,2.15338134765625,55.54539108276367,91.2035140991211,2.15338134765625,55.54539108276367,91.2035140991211,2.15338134765625,55.54539108276367,91.2035140991211,2.15338134765625,2.153247594833374,-55.545379638671875,-91.20352172851562,2.153247594833374,-55.545379638671875,-91.20352172851562,2.153247594833374,-55.545379638671875,-91.20352172851562,2.153247594833374,-55.545379638671875,-91.20352172851562,2.153247594833374,-55.545379638671875,-91.20352172851562,2.153247594833374,-55.545379638671875,-91.20352172851562,2.153247594833374,-55.545379638671875,-91.20352172851562,-0.0003373770450707525,-54.21428298950195,-92.02607727050781,-0.0003373770450707525,-54.21428298950195,-92.02607727050781,-0.0003373770450707525,-54.21428298950195,-92.02607727050781,-0.0003373770450707525,-54.21428298950195,-92.02607727050781,-0.0003373770450707525,-54.21428298950195,-92.02607727050781,-0.0003373770450707525,-54.21428298950195,-92.02607727050781,1.3311474323272705,91.84559631347656,35.90334701538086,1.3311474323272705,91.84559631347656,35.90334701538086,1.3311474323272705,91.84559631347656,35.90334701538086,1.3311474323272705,91.84559631347656,35.90334701538086,1.3311474323272705,91.84559631347656,35.90334701538086,54.21428298950195,92.02607727050781,-0.00019560271175578237,54.21428298950195,92.02607727050781,-0.00019560271175578237,54.21428298950195,92.02607727050781,-0.00019560271175578237,54.21428298950195,92.02607727050781,-0.00019560271175578237,54.21428298950195,92.02607727050781,-0.00019560271175578237,54.21428298950195,92.02607727050781,-0.00019560271175578237,-56.76456832885742,55.94220733642578,58.096012115478516,-56.76456832885742,55.94220733642578,58.096012115478516,-56.76456832885742,55.94220733642578,58.096012115478516,-56.76456832885742,55.94220733642578,58.096012115478516,-56.76456832885742,55.94220733642578,58.096012115478516,-56.76456832885742,55.94220733642578,58.096012115478516,-1.3308817148208618,91.84559631347656,35.90335464477539,-1.3308817148208618,91.84559631347656,35.90335464477539,-1.3308817148208618,91.84559631347656,35.90335464477539,-1.3308817148208618,91.84559631347656,35.90335464477539,-1.3308817148208618,91.84559631347656,35.90335464477539,-1.3308817148208618,91.84559631347656,35.90335464477539,-92.66816711425781,33.749717712402344,0.0003441836452111602,-92.66816711425781,33.749717712402344,0.0003441836452111602,-92.66816711425781,33.749717712402344,0.0003441836452111602,-92.66816711425781,33.749717712402344,0.0003441836452111602,-92.02587127685547,-3.414504305965238e-7,54.21462631225586,-92.02587127685547,-3.414504305965238e-7,54.21462631225586,-92.02587127685547,-3.414504305965238e-7,54.21462631225586,-92.02587127685547,-3.414504305965238e-7,54.21462631225586,-92.02587127685547,-3.414504305965238e-7,54.21462631225586,-92.02587127685547,-3.414504305965238e-7,54.21462631225586,-92.02587127685547,-3.414504305965238e-7,54.21462631225586,-89.87227630615234,-1.3310153484344482,57.69929885864258,-89.87227630615234,-1.3310153484344482,57.69929885864258,-89.87227630615234,-1.3310153484344482,57.69929885864258,-89.87227630615234,-1.3310153484344482,57.69929885864258,-89.87227630615234,-1.3310153484344482,57.69929885864258,-89.87227630615234,-1.3310153484344482,57.69929885864258,-56.76499557495117,-55.94221496582031,-58.095577239990234,-56.76499557495117,-55.94221496582031,-58.095577239990234,-56.76499557495117,-55.94221496582031,-58.095577239990234,-56.76499557495117,-55.94221496582031,-58.095577239990234,-89.87269592285156,-1.3310151100158691,-57.69862365722656,-89.87269592285156,-1.3310151100158691,-57.69862365722656,-89.87269592285156,-1.3310151100158691,-57.69862365722656,-89.87269592285156,-1.3310151100158691,-57.69862365722656,-89.87269592285156,-1.3310151100158691,-57.69862365722656,-91.2037124633789,2.1535816192626953,-55.54503631591797,-91.2037124633789,2.1535816192626953,-55.54503631591797,-91.2037124633789,2.1535816192626953,-55.54503631591797,-91.2037124633789,2.1535816192626953,-55.54503631591797,-91.2037124633789,2.1535816192626953,-55.54503631591797,-91.2037124633789,2.1535816192626953,-55.54503631591797,-57.6989631652832,-89.87248229980469,-1.3307993412017822,-57.6989631652832,-89.87248229980469,-1.3307993412017822,-57.6989631652832,-89.87248229980469,-1.3307993412017822,-57.6989631652832,-89.87248229980469,-1.3307993412017822,-57.6989631652832,-89.87248229980469,-1.3307993412017822,-57.6989631652832,-89.87248229980469,-1.3307993412017822,-57.69895553588867,-89.87248229980469,1.331230640411377,-57.69895553588867,-89.87248229980469,1.331230640411377,-57.69895553588867,-89.87248229980469,1.331230640411377,-57.69895553588867,-89.87248229980469,1.331230640411377,-57.69895553588867,-89.87248229980469,1.331230640411377,-57.69895553588867,-89.87248229980469,1.331230640411377,-57.69895553588867,-89.87248229980469,1.331230640411377,91.2037124633789,-2.1535840034484863,55.545047760009766,91.2037124633789,-2.1535840034484863,55.545047760009766,91.2037124633789,-2.1535840034484863,55.545047760009766,91.2037124633789,-2.1535840034484863,55.545047760009766,91.2037124633789,-2.1535840034484863,55.545047760009766,91.84559631347656,-35.903350830078125,1.3306814432144165,91.84559631347656,-35.903350830078125,1.3306814432144165,91.84559631347656,-35.903350830078125,1.3306814432144165,91.84559631347656,-35.903350830078125,1.3306814432144165,91.84559631347656,-35.903350830078125,1.3306814432144165,0.00033884088043123484,-54.21428298950195,92.02606964111328,0.00033884088043123484,-54.21428298950195,92.02606964111328,0.00033884088043123484,-54.21428298950195,92.02606964111328,0.00033884088043123484,-54.21428298950195,92.02606964111328,0.00033884088043123484,-54.21428298950195,92.02606964111328,0.00033884088043123484,-54.21428298950195,92.02606964111328,1.3311470746994019,-91.84559631347656,35.90334701538086,1.3311470746994019,-91.84559631347656,35.90334701538086,1.3311470746994019,-91.84559631347656,35.90334701538086,1.3311470746994019,-91.84559631347656,35.90334701538086,1.3311470746994019,-91.84559631347656,35.90334701538086,91.8456039428711,35.903350830078125,1.330681324005127,91.8456039428711,35.903350830078125,1.330681324005127,91.8456039428711,35.903350830078125,1.330681324005127,91.8456039428711,35.903350830078125,1.330681324005127,91.8456039428711,35.903350830078125,1.330681324005127,57.698951721191406,89.87249755859375,-1.3312232494354248,57.698951721191406,89.87249755859375,-1.3312232494354248,57.698951721191406,89.87249755859375,-1.3312232494354248,57.698951721191406,89.87249755859375,-1.3312232494354248,35.903690338134766,-1.331014633178711,91.84544372558594,35.903690338134766,-1.331014633178711,91.84544372558594,35.903690338134766,-1.331014633178711,91.84544372558594,35.903690338134766,-1.331014633178711,91.84544372558594,35.903690338134766,-1.331014633178711,91.84544372558594,35.903690338134766,-1.331014633178711,91.84544372558594,-56.76456832885742,-55.94221496582031,58.096012115478516,-56.76456832885742,-55.94221496582031,58.096012115478516,-56.76456832885742,-55.94221496582031,58.096012115478516,-56.76456832885742,-55.94221496582031,58.096012115478516,-56.76456832885742,-55.94221496582031,58.096012115478516,-56.76456832885742,-55.94221496582031,58.096012115478516,-2.1532464027404785,-55.545379638671875,91.20350646972656,-2.1532464027404785,-55.545379638671875,91.20350646972656,-2.1532464027404785,-55.545379638671875,91.20350646972656,-2.1532464027404785,-55.545379638671875,91.20350646972656,-2.1532464027404785,-55.545379638671875,91.20350646972656,0.00012470953515730798,-92.66816711425781,33.74972152709961,0.00012470953515730798,-92.66816711425781,33.74972152709961,0.00012470953515730798,-92.66816711425781,33.74972152709961,0.00012470953515730798,-92.66816711425781,33.74972152709961,-1.33088219165802,-91.84559631347656,35.90335464477539,-1.33088219165802,-91.84559631347656,35.90335464477539,-1.33088219165802,-91.84559631347656,35.90335464477539,-1.33088219165802,-91.84559631347656,35.90335464477539,-1.33088219165802,-91.84559631347656,35.90335464477539,-1.33088219165802,-91.84559631347656,35.90335464477539,-55.545372009277344,-91.20350646972656,2.153789758682251,-55.545372009277344,-91.20350646972656,2.153789758682251,-55.545372009277344,-91.20350646972656,2.153789758682251,-55.545372009277344,-91.20350646972656,2.153789758682251,56.76456832885742,-55.94221878051758,-58.09599304199219,56.76456832885742,-55.94221878051758,-58.09599304199219,56.76456832885742,-55.94221878051758,-58.09599304199219,56.76456832885742,-55.94221878051758,-58.09599304199219,92.66815185546875,-33.749717712402344,-0.0003363910655025393,92.66815185546875,-33.749717712402344,-0.0003363910655025393,92.66815185546875,-33.749717712402344,-0.0003363910655025393,92.66815185546875,-33.749717712402344,-0.0003363910655025393,91.20330047607422,-2.1535825729370117,-55.54570388793945,91.20330047607422,-2.1535825729370117,-55.54570388793945,91.20330047607422,-2.1535825729370117,-55.54570388793945,91.20330047607422,-2.1535825729370117,-55.54570388793945,91.20330047607422,-2.1535825729370117,-55.54570388793945,92.02587127685547,-3.892050415288395e-7,-54.2146110534668,92.02587127685547,-3.892050415288395e-7,-54.2146110534668,92.02587127685547,-3.892050415288395e-7,-54.2146110534668,92.02587127685547,-3.892050415288395e-7,-54.2146110534668,92.02587127685547,-3.892050415288395e-7,-54.2146110534668,92.02587127685547,-3.892050415288395e-7,-54.2146110534668,92.02587127685547,-3.892050415288395e-7,-54.2146110534668,0.0003386797325219959,54.21427536010742,92.02606964111328,0.0003386797325219959,54.21427536010742,92.02606964111328,0.0003386797325219959,54.21427536010742,92.02606964111328,0.0003386797325219959,54.21427536010742,92.02606964111328,0.0003386797325219959,54.21427536010742,92.02606964111328,0.0003386797325219959,54.21427536010742,92.02606964111328,2.1539180278778076,55.54536819458008,91.2034912109375,2.1539180278778076,55.54536819458008,91.2034912109375,2.1539180278778076,55.54536819458008,91.2034912109375,2.1539180278778076,55.54536819458008,91.2034912109375,91.20330047607422,2.153582811355591,-55.54570388793945,91.20330047607422,2.153582811355591,-55.54570388793945,91.20330047607422,2.153582811355591,-55.54570388793945,91.20330047607422,2.153582811355591,-55.54570388793945,91.20330047607422,2.153582811355591,-55.54570388793945,89.87227630615234,1.3310145139694214,-57.69927978515625,89.87227630615234,1.3310145139694214,-57.69927978515625,89.87227630615234,1.3310145139694214,-57.69927978515625,89.87227630615234,1.3310145139694214,-57.69927978515625,89.87227630615234,1.3310145139694214,-57.69927978515625,89.87227630615234,1.3310145139694214,-57.69927978515625,56.76456832885742,55.94220733642578,-58.09599304199219,56.76456832885742,55.94220733642578,-58.09599304199219,56.76456832885742,55.94220733642578,-58.09599304199219,56.76456832885742,55.94220733642578,-58.09599304199219,56.76456832885742,55.94220733642578,-58.09599304199219,58.09558868408203,56.76477813720703,-55.942420959472656,58.09558868408203,56.76477813720703,-55.942420959472656,58.09558868408203,56.76477813720703,-55.942420959472656,58.09558868408203,56.76477813720703,-55.942420959472656,55.54539108276367,-91.20350646972656,2.153383255004883,55.54539108276367,-91.20350646972656,2.153383255004883,55.54539108276367,-91.20350646972656,2.153383255004883,55.54539108276367,-91.20350646972656,2.153383255004883,55.54539108276367,-91.20350646972656,2.153383255004883,55.54539108276367,-91.20350646972656,2.153383255004883,91.84558868408203,35.903350830078125,-1.3313480615615845,91.84558868408203,35.903350830078125,-1.3313480615615845,91.84558868408203,35.903350830078125,-1.3313480615615845,91.84558868408203,35.903350830078125,-1.3313480615615845,91.84558868408203,35.903350830078125,-1.3313480615615845,91.84558868408203,35.903350830078125,-1.3313480615615845,-35.903690338134766,-1.331014633178711,-91.84546661376953,-35.903690338134766,-1.331014633178711,-91.84546661376953,-35.903690338134766,-1.331014633178711,-91.84546661376953,-35.903690338134766,-1.331014633178711,-91.84546661376953,-35.903690338134766,-1.331014633178711,-91.84546661376953,-35.903690338134766,-1.331014633178711,-91.84546661376953,-54.21428298950195,-92.02606964111328,0.00020284479251131415,-54.21428298950195,-92.02606964111328,0.00020284479251131415,-54.21428298950195,-92.02606964111328,0.00020284479251131415,-54.21428298950195,-92.02606964111328,0.00020284479251131415,-54.21428298950195,-92.02606964111328,0.00020284479251131415,-54.21428298950195,-92.02606964111328,0.00020284479251131415,-54.21428298950195,-92.02606964111328,0.00020284479251131415,-35.903690338134766,1.331014633178711,-91.84546661376953,-35.903690338134766,1.331014633178711,-91.84546661376953,-35.903690338134766,1.331014633178711,-91.84546661376953,-35.903690338134766,1.331014633178711,-91.84546661376953,-35.903690338134766,1.331014633178711,-91.84546661376953,89.87227630615234,-1.3310154676437378,-57.69927978515625,89.87227630615234,-1.3310154676437378,-57.69927978515625,89.87227630615234,-1.3310154676437378,-57.69927978515625,89.87227630615234,-1.3310154676437378,-57.69927978515625,89.87227630615234,-1.3310154676437378,-57.69927978515625,89.87227630615234,-1.3310154676437378,-57.69927978515625,55.942420959472656,-58.09579849243164,56.764583587646484,55.942420959472656,-58.09579849243164,56.764583587646484,55.942420959472656,-58.09579849243164,56.764583587646484,55.942420959472656,-58.09579849243164,56.764583587646484,55.942420959472656,-58.09579849243164,56.764583587646484,56.76499557495117,-55.94221496582031,58.0955924987793,56.76499557495117,-55.94221496582031,58.0955924987793,56.76499557495117,-55.94221496582031,58.0955924987793,56.76499557495117,-55.94221496582031,58.0955924987793,56.76499557495117,-55.94221496582031,58.0955924987793,2.1539194583892822,-55.545379638671875,91.2034912109375,2.1539194583892822,-55.545379638671875,91.2034912109375,2.1539194583892822,-55.545379638671875,91.2034912109375,2.1539194583892822,-55.545379638671875,91.2034912109375,2.1539194583892822,-55.545379638671875,91.2034912109375,2.1539194583892822,-55.545379638671875,91.2034912109375,-55.942420959472656,-58.09579849243164,-56.76457214355469,-55.942420959472656,-58.09579849243164,-56.76457214355469,-55.942420959472656,-58.09579849243164,-56.76457214355469,-55.942420959472656,-58.09579849243164,-56.76457214355469,-55.942420959472656,-58.09579849243164,-56.76457214355469,-55.942420959472656,-58.09579849243164,-56.76457214355469,-58.09599685668945,-56.76478576660156,-55.941993713378906,-58.09599685668945,-56.76478576660156,-55.941993713378906,-58.09599685668945,-56.76478576660156,-55.941993713378906,-58.09599685668945,-56.76478576660156,-55.941993713378906,92.0262680053711,-4.4363298457028577e-7,54.21394729614258,92.0262680053711,-4.4363298457028577e-7,54.21394729614258,92.0262680053711,-4.4363298457028577e-7,54.21394729614258,92.0262680053711,-4.4363298457028577e-7,54.21394729614258,92.0262680053711,-4.4363298457028577e-7,54.21394729614258,92.0262680053711,-4.4363298457028577e-7,54.21394729614258,55.9420051574707,-58.095802307128906,-56.76498031616211,55.9420051574707,-58.095802307128906,-56.76498031616211,55.9420051574707,-58.095802307128906,-56.76498031616211,55.9420051574707,-58.095802307128906,-56.76498031616211,55.9420051574707,-58.095802307128906,-56.76498031616211,55.9420051574707,-58.095802307128906,-56.76498031616211,58.09558868408203,-56.76478576660156,-55.942420959472656,58.09558868408203,-56.76478576660156,-55.942420959472656,58.09558868408203,-56.76478576660156,-55.942420959472656,58.09558868408203,-56.76478576660156,-55.942420959472656,58.09558868408203,-56.76478576660156,-55.942420959472656,89.87269592285156,1.3310145139694214,57.698638916015625,89.87269592285156,1.3310145139694214,57.698638916015625,89.87269592285156,1.3310145139694214,57.698638916015625,89.87269592285156,1.3310145139694214,57.698638916015625,89.87269592285156,1.3310145139694214,57.698638916015625,89.87269592285156,1.3310145139694214,57.698638916015625,57.6989631652832,-89.87248229980469,1.330806851387024,57.6989631652832,-89.87248229980469,1.330806851387024,57.6989631652832,-89.87248229980469,1.330806851387024,57.6989631652832,-89.87248229980469,1.330806851387024,57.6989631652832,-89.87248229980469,1.330806851387024,57.6989631652832,-89.87248229980469,1.330806851387024,57.69895553588867,-89.87248229980469,-1.3312231302261353,57.69895553588867,-89.87248229980469,-1.3312231302261353,57.69895553588867,-89.87248229980469,-1.3312231302261353,57.69895553588867,-89.87248229980469,-1.3312231302261353,57.69895553588867,-89.87248229980469,-1.3312231302261353,57.69895553588867,-89.87248229980469,-1.3312231302261353,-1.331344485282898,-57.69895935058594,-89.87249755859375,-1.331344485282898,-57.69895935058594,-89.87249755859375,-1.331344485282898,-57.69895935058594,-89.87249755859375,-1.331344485282898,-57.69895935058594,-89.87249755859375,-1.331344485282898,-57.69895935058594,-89.87249755859375,-92.0262680053711,-3.9587837363797007e-7,-54.21393585205078,-92.0262680053711,-3.9587837363797007e-7,-54.21393585205078,-92.0262680053711,-3.9587837363797007e-7,-54.21393585205078,-92.0262680053711,-3.9587837363797007e-7,-54.21393585205078,-92.0262680053711,-3.9587837363797007e-7,-54.21393585205078,-92.0262680053711,-3.9587837363797007e-7,-54.21393585205078,-58.09599685668945,56.76477813720703,-55.941993713378906,-58.09599685668945,56.76477813720703,-55.941993713378906,-58.09599685668945,56.76477813720703,-55.941993713378906,-58.09599685668945,56.76477813720703,-55.941993713378906,-58.09599685668945,56.76477813720703,-55.941993713378906,-57.69895935058594,89.87249755859375,-1.3307981491088867,-57.69895935058594,89.87249755859375,-1.3307981491088867,-57.69895935058594,89.87249755859375,-1.3307981491088867,-57.69895935058594,89.87249755859375,-1.3307981491088867,-57.69895935058594,89.87249755859375,-1.3307981491088867,-57.69895935058594,89.87249755859375,-1.3307981491088867,-57.69895935058594,89.87249755859375,-1.3307981491088867,-1.0771249532699585,55.84297561645508,-91.01956939697266,-1.0771249532699585,55.84297561645508,-91.01956939697266,-1.0771249532699585,55.84297561645508,-91.01956939697266,-1.0771249532699585,55.84297561645508,-91.01956939697266,-1.0771249532699585,55.84297561645508,-91.01956939697266,-1.0771249532699585,55.84297561645508,-91.01956939697266,0.6651760339736938,56.91976547241211,-90.35406494140625,0.6651760339736938,56.91976547241211,-90.35406494140625,0.6651760339736938,56.91976547241211,-90.35406494140625,0.6651760339736938,56.91976547241211,-90.35406494140625,0.6651760339736938,56.91976547241211,-90.35406494140625,-0.6658390760421753,56.91976547241211,-90.35406494140625,-0.6658390760421753,56.91976547241211,-90.35406494140625,-0.6658390760421753,56.91976547241211,-90.35406494140625,-0.6658390760421753,56.91976547241211,-90.35406494140625,-0.6658390760421753,56.91976547241211,-90.35406494140625,-1.3311461210250854,91.84559631347656,-35.90334701538086,-1.3311461210250854,91.84559631347656,-35.90334701538086,-1.3311461210250854,91.84559631347656,-35.90334701538086,-1.3311461210250854,91.84559631347656,-35.90334701538086,-1.3311461210250854,91.84559631347656,-35.90334701538086,-1.3311461210250854,91.84559631347656,-35.90334701538086,-0.00012322973634582013,92.66816711425781,-33.749717712402344,-0.00012322973634582013,92.66816711425781,-33.749717712402344,-0.00012322973634582013,92.66816711425781,-33.749717712402344,-0.00012322973634582013,92.66816711425781,-33.749717712402344,-89.87227630615234,1.3310145139694214,57.69929885864258,-89.87227630615234,1.3310145139694214,57.69929885864258,-89.87227630615234,1.3310145139694214,57.69929885864258,-89.87227630615234,1.3310145139694214,57.69929885864258,-2.153247833251953,55.54536819458008,91.20350646972656,-2.153247833251953,55.54536819458008,91.20350646972656,-2.153247833251953,55.54536819458008,91.20350646972656,-2.153247833251953,55.54536819458008,91.20350646972656],\n \"normalized\": false\n },\n \"normal\": {\n \"itemSize\": 3,\n \"type\": \"Float32Array\",\n \"array\": [-0.32300448417663574,0.7980563640594482,-0.5086984634399414,-0.3229999840259552,0.7980471849441528,-0.5087158679962158,-0.32299789786338806,0.7980540990829468,-0.5087060928344727,-0.3229975402355194,0.7980594038963318,-0.5086981654167175,-0.322995662689209,0.7980546951293945,-0.5087066292762756,-0.32297030091285706,0.7980630397796631,-0.5087097883224487,-0.3145313560962677,0.8124136924743652,-0.4909725487232208,-0.3145303428173065,0.8124191761016846,-0.4909641742706299,-0.31452667713165283,0.8123946189880371,-0.49100714921951294,-0.31452617049217224,0.8124018907546997,-0.49099525809288025,-0.31451353430747986,0.8124081492424011,-0.49099329113960266,0.7977177500724792,0.5067335963249207,0.3269055485725403,0.797724187374115,0.5067331790924072,0.3268907070159912,0.7977266907691956,0.5067335367202759,0.32688409090042114,0.797727644443512,0.5067120790481567,0.3269153833389282,0.7977277636528015,0.5067290663719177,0.3268887996673584,-0.48681509494781494,-0.3170761168003082,-0.8139249086380005,-0.486814022064209,-0.31705862283706665,-0.8139324188232422,-0.4868130683898926,-0.31705430150032043,-0.8139346241950989,-0.486799031496048,-0.3170582056045532,-0.8139415383338928,-0.48679620027542114,-0.31705963611602783,-0.8139426112174988,-0.4867938756942749,-0.3170706033706665,-0.8139398097991943,0.4910266399383545,0.2948715388774872,-0.8197216391563416,0.4910283386707306,0.29487162828445435,-0.8197205662727356,0.4910544753074646,0.29487064480781555,-0.8197053670883179,0.49105706810951233,0.2948714792728424,-0.8197034597396851,0.49106070399284363,0.2948935925960541,-0.8196933269500732,0.49107053875923157,0.29487308859825134,-0.8196947574615479,0.019486773759126663,0.0034609902650117874,-0.9998041391372681,0.01950395107269287,0.003431154415011406,-0.9998038411140442,0.01951080560684204,0.0034348517656326294,-0.9998037219047546,0.019518375396728516,0.003450945019721985,-0.9998035430908203,0.4929899275302887,0.2909228503704071,0.8199541568756104,0.4929942488670349,0.29094332456588745,0.8199442028999329,0.49299705028533936,0.29093438386917114,0.8199459314346313,0.49300453066825867,0.29094645380973816,0.8199370503425598,0.49301400780677795,0.29092937707901,0.8199374079704285,0.506730854511261,0.3268951177597046,0.7977238893508911,0.5067356824874878,0.32688724994659424,0.797724187374115,0.5067362189292908,0.3268929123878479,0.7977213859558105,0.5067363381385803,0.3269083499908447,0.7977150082588196,0.5067551732063293,0.32688796520233154,0.7977114319801331,-0.30085650086402893,-0.8039307594299316,0.5130113363265991,-0.3008539080619812,-0.8039156794548035,0.5130366683006287,-0.3008496165275574,-0.8039196729660034,0.5130329728126526,-0.30084699392318726,-0.8039218187332153,0.5130308866500854,-0.3008323013782501,-0.8039500713348389,0.5129954814910889,-0.3008321523666382,-0.8039198517799377,0.5130428671836853,0.999752938747406,0.022229939699172974,-0.000027254223823547363,0.9997531175613403,0.02221774309873581,0.000002555549144744873,0.9997531175613403,0.022219747304916382,-0.000011578202247619629,0.9997537136077881,0.022191841155290604,-0.000005044043064117432,-0.000006690621376037598,0.9997531771659851,0.022219300270080566,0.0000015208497643470764,0.9997526407241821,0.02224019356071949,0.000007711350917816162,0.9997531771659851,0.022218987345695496,0.000025779008865356445,0.9997528791427612,0.022229254245758057,-0.8199474215507507,-0.4929923415184021,0.29093796014785767,-0.8199467658996582,-0.49298861622810364,0.29094576835632324,-0.8199445605278015,-0.4929924011230469,0.2909456789493561,-0.8199410438537598,-0.4930053651332855,0.2909337878227234,-0.8199405670166016,-0.4929971694946289,0.29094862937927246,-0.8199316263198853,-0.4930025041103363,0.2909652292728424,-0.503142237663269,0.32643717527389526,-0.800179123878479,-0.503139078617096,0.3264300227165222,-0.8001841306686401,-0.5031341314315796,0.3264409899711609,-0.8001827001571655,-0.5031154155731201,0.32642847299575806,-0.800199568271637,-0.9997532367706299,-0.02221621572971344,-0.0000050961971282958984,-0.9997530579566956,-0.02221750095486641,0.000010980293154716492,-0.9997529983520508,-0.022224798798561096,-0.0000216066837310791,-0.9997526407241821,-0.022240420803427696,0.000005041249096393585,-0.8199519515037537,-0.4929916560649872,-0.29092633724212646,-0.8199494481086731,-0.4929870665073395,-0.29094117879867554,-0.8199440240859985,-0.4930054545402527,-0.29092511534690857,-0.8199396729469299,-0.4930015802383423,-0.29094383120536804,-0.8199336528778076,-0.4930025637149811,-0.29095908999443054,-0.8139479756355286,-0.48679518699645996,-0.3170475959777832,-0.8139445185661316,-0.4867909550666809,-0.31706294417381287,-0.8139359951019287,-0.4868128299713135,-0.3170514404773712,-0.8139359951019287,-0.4868128299713135,-0.3170514404773712,-0.8139272928237915,-0.4868120551109314,-0.3170749247074127,0.291377991437912,0.817572832107544,-0.4966624081134796,0.2913815379142761,0.817571222782135,-0.4966628849506378,0.29140985012054443,0.8175534605979919,-0.49667567014694214,0.29141905903816223,0.8175671696662903,-0.49664777517318726,0.2914317846298218,0.8175531625747681,-0.49666333198547363,0.3144916296005249,0.8124189376831055,-0.4909893870353699,0.314521849155426,0.812416136264801,-0.4909745156764984,0.31452593207359314,0.8124017119407654,-0.4909958243370056,0.31453219056129456,0.8123990893363953,-0.4909961223602295,0.31453219056129456,0.8123990893363953,-0.4909961223602295,0.31453603506088257,0.8124093413352966,-0.49097663164138794,-0.8199474215507507,0.4929920434951782,0.2909386157989502,-0.8199455142021179,0.4929906129837036,0.29094627499580383,-0.8199436664581299,0.492990642786026,0.29095107316970825,-0.8199414610862732,0.4929976165294647,0.2909456193447113,-0.8199408054351807,0.49300891160964966,0.290928453207016,-0.8199315071105957,0.4930025339126587,0.2909652292728424,-0.7977402210235596,0.5067192316055298,0.3268728256225586,-0.797728419303894,0.5067235827445984,0.3268952965736389,-0.7977269291877747,0.5067242383956909,0.32689791917800903,-0.7977257370948792,0.5067130923271179,0.3269180655479431,-0.7977219223976135,0.5067331790924072,0.32689642906188965,-0.8039276003837585,0.513014554977417,0.30085939168930054,-0.803920328617096,0.5130298733711243,0.30085256695747375,-0.8039193153381348,0.513033926486969,0.30084848403930664,-0.8039184808731079,0.5130314230918884,0.3008551299571991,-0.3170892596244812,-0.8139346837997437,-0.4867902398109436,-0.3170653283596039,-0.813935399055481,-0.48680463433265686,-0.3170589804649353,-0.8139439225196838,-0.4867946207523346,-0.3170560896396637,-0.8139365315437317,-0.486808717250824,-0.31703075766563416,-0.813947319984436,-0.4868071973323822,-0.3170735538005829,0.8139387965202332,0.4867936074733734,-0.31706538796424866,0.8139315843582153,0.48681098222732544,-0.3170650601387024,0.8139441609382629,0.4867902994155884,-0.31706249713897705,0.8139439225196838,0.4867921471595764,-0.3170546293258667,0.8139438629150391,0.4867975413799286,-0.31705403327941895,0.8139353394508362,0.4868120551109314,-0.31705284118652344,0.8139360547065735,0.4868115782737732,-0.32690656185150146,0.797716498374939,0.5067349672317505,-0.32688647508621216,0.7977249026298523,0.5067349076271057,-0.32688552141189575,0.7977311611175537,0.506725549697876,-0.3268853724002838,0.7977126240730286,0.5067547559738159,0.2909286618232727,-0.8199402689933777,-0.49300962686538696,0.290932297706604,-0.8199490904808044,-0.4929928183555603,0.290941059589386,-0.8199471831321716,-0.49299079179763794,0.2909466624259949,-0.8199383020401001,-0.49300238490104675,0.2909603714942932,-0.8199326395988464,-0.49300357699394226,-0.8139441013336182,-0.4867924749851227,0.31706178188323975,-0.8139419555664062,-0.4867969751358032,0.3170603811740875,-0.8139404058456421,-0.4868042469024658,0.31705325841903687,-0.8139353394508362,-0.48680993914604187,0.31705722212791443,-0.8139327764511108,-0.486809641122818,0.3170642554759979,-0.8139600157737732,0.48677366971969604,0.31704968214035034,-0.8139446973800659,0.4867933988571167,0.31705862283706665,-0.8139420747756958,0.48679694533348083,0.31706005334854126,-0.813937246799469,0.48679330945014954,0.3170780539512634,-0.8139326572418213,0.4868103265762329,0.3170636296272278,-0.8139210939407349,0.4868491590023041,0.31703364849090576,-0.8199512958526611,0.4929920434951782,-0.29092729091644287,-0.8199489712715149,0.4929892122745514,-0.2909389138221741,-0.8199403882026672,0.49300849437713623,-0.29093047976493835,-0.8199390172958374,0.4930011034011841,-0.2909468710422516,-0.8199335932731628,0.49300262331962585,-0.2909591794013977,0.022224154323339462,0.000008113682270050049,0.999752938747406,0.022224217653274536,-0.000007063150405883789,0.9997529983520508,0.02223508059978485,-0.00002683699131011963,0.9997528195381165,0.022243808954954147,0.0000014416873455047607,0.9997525811195374,0.5130226612091064,-0.30085763335227966,0.8039230704307556,0.5130249857902527,-0.30090412497520447,0.8039043545722961,0.5130347013473511,-0.3008493185043335,0.8039185404777527,0.5130426287651062,-0.30085936188697815,0.8039097785949707,0.5130426287651062,-0.30085936188697815,0.8039097785949707,0.8139259815216064,0.4868123233318329,0.31707778573036194,0.8139373064041138,0.4867918789386749,0.31708046793937683,0.8139375448226929,0.48680996894836426,0.3170512318611145,0.8139379024505615,0.4868050515651703,0.3170582354068756,0.8139469027519226,0.48679566383361816,0.3170495331287384,0.8139491677284241,0.48678889870643616,0.31705406308174133,-0.49300631880760193,0.29092955589294434,0.8199419379234314,-0.4929933547973633,0.29095086455345154,0.8199421167373657,-0.4929933547973633,0.29095086455345154,0.8199421167373657,-0.49299073219299316,0.2909349799156189,0.8199493885040283,-0.4929877817630768,0.290939062833786,0.8199498057365417,-0.49300646781921387,-0.29092955589294434,0.8199418783187866,-0.4929991066455841,-0.2909305989742279,0.8199458718299866,-0.4929991066455841,-0.2909305989742279,0.8199458718299866,-0.4929906129837036,-0.29093536734580994,0.8199493885040283,-0.49298787117004395,-0.2909401059150696,0.819949209690094,-0.022236576303839684,-0.0000014398247003555298,0.9997527003288269,-0.022226199507713318,0.000026732683181762695,0.9997529983520508,-0.022215761244297028,-0.000004159286618232727,0.9997531771659851,-0.022215470671653748,0.0000028014183044433594,0.9997532963752747,0.4860762059688568,0.31750911474227905,-0.8141976594924927,0.4860828220844269,0.3174929618835449,-0.8142000436782837,0.4860839545726776,0.31748220324516296,-0.8142036199569702,0.48609045147895813,0.31749191880226135,-0.8141958713531494,0.48609644174575806,0.31749197840690613,-0.8141922950744629,0.48610714077949524,0.3175130784511566,-0.8141777515411377,0.48611539602279663,0.31747305393218994,-0.8141883611679077,-0.0000346451997756958,0.016819089651107788,-0.9998586177825928,-0.00002047419548034668,0.016789883375167847,-0.999859094619751,-0.000013813376426696777,0.016806378960609436,-0.9998587369918823,-0.00000277138315141201,0.016810698434710503,-0.9998586773872375,0.0000065267086029052734,0.016805753111839294,-0.9998587965965271,0.000018220569472759962,0.016794271767139435,-0.9998589754104614,0.016185671091079712,-0.9998690485954285,-0.00003345310688018799,0.01620444655418396,-0.999868631362915,-0.0000010926742106676102,0.016207069158554077,-0.999868631362915,0.000011086463928222656,0.01620793342590332,-0.999868631362915,-0.000010415911674499512,0.016219258308410645,-0.9998684525489807,-2.980232238769531e-7,0.016219640150666237,-0.9998684525489807,-4.5890919864177704e-7,0.3170523941516876,-0.8139364719390869,-0.486811101436615,0.3170545697212219,-0.8139440417289734,-0.48679736256599426,0.31706172227859497,-0.8139370083808899,-0.48680418729782104,0.3170723617076874,-0.8139404058456421,-0.486791729927063,0.31707704067230225,-0.8139263391494751,-0.48681217432022095,0.8199406266212463,-0.4929971992969513,-0.29094862937927246,0.8199410438537598,-0.49300533533096313,-0.290933758020401,0.8199447989463806,-0.49299201369285583,-0.2909456193447113,0.8199467658996582,-0.4929884672164917,-0.290946364402771,0.819947361946106,-0.492992103099823,-0.2909383773803711,0.8199547529220581,-0.49298709630966187,-0.2909259796142578,-0.016219263896346092,0.9998684525489807,5.702022463083267e-7,-0.016217336058616638,0.9998685717582703,-4.023313522338867e-7,-0.016208097338676453,0.9998686909675598,-0.00001023709774017334,-0.016207024455070496,0.9998686909675598,0.000011369585990905762,-0.01620444655418396,0.9998686909675598,0.0000010926742106676102,-0.01616719365119934,0.9998693466186523,0.000033482909202575684,0.32295531034469604,0.7980619072914124,-0.5087209343910217,0.32295531034469604,0.7980619072914124,-0.5087209343910217,0.3229907155036926,0.798053503036499,-0.5087116956710815,0.3229965567588806,0.7980476021766663,-0.50871741771698,0.32300084829330444,0.7980570793151855,-0.5086997747421265,0.8039142489433289,0.5130448937416077,0.30084332823753357,0.8039181232452393,0.5130343437194824,0.3008510172367096,0.8039227724075317,0.5130297541618347,0.300846129655838,0.8039230108261108,0.5130389332771301,0.300830215215683,0.8039236664772034,0.5130265355110168,0.30084937810897827,0.8039326667785645,0.5130090117454529,0.3008555769920349,0.8039484024047852,0.512998104095459,0.3008320927619934,-0.30085283517837524,0.8039165735244751,0.5130358934402466,-0.300849586725235,0.8039194345474243,0.5130332708358765,-0.3008473813533783,0.803921639919281,0.5130310654640198,-0.3008348345756531,0.8039216995239258,0.5130383372306824,-0.3008311986923218,0.8039206862449646,0.5130419731140137,0.300837904214859,0.803917407989502,0.5130431056022644,0.30084890127182007,0.8039129972457886,0.5130437016487122,0.30085113644599915,0.803921639919281,0.5130288004875183,0.3008517622947693,0.8039230704307556,0.5130261182785034,0.3008546531200409,0.8039194941520691,0.5130301117897034,0.3008613586425781,0.8039342164993286,0.5130031108856201,-0.019525907933712006,0.0034512635320425034,-0.999803364276886,-0.019515730440616608,0.003434911370277405,-0.9998036623001099,-0.01951080560684204,0.0034344345331192017,-0.9998037815093994,-0.01949400082230568,0.003460988402366638,-0.9998040795326233,0.30084559321403503,-0.8039190173149109,-0.5130363702774048,0.3008456826210022,-0.8039130568504333,-0.5130454301834106,0.30084726214408875,-0.8039217591285706,-0.5130307674407959,0.30084937810897827,-0.8039229512214661,-0.5130279660224915,0.3008571267127991,-0.803926944732666,-0.5130170583724976,0.49298426508903503,-0.29092302918434143,-0.8199574947357178,0.4929867684841156,-0.290944904088974,-0.819948136806488,0.4929903745651245,-0.29092836380004883,-0.8199520111083984,0.4929988384246826,-0.29094645380973816,-0.819940447807312,0.4930066466331482,-0.29092955589294434,-0.8199417591094971,0.30083754658699036,-0.8039181232452393,0.5130423307418823,0.3008488714694977,-0.8039132356643677,0.5130434036254883,0.3008507788181305,-0.8039216995239258,0.5130287408828735,0.30085182189941406,-0.8039235472679138,0.5130254030227661,0.30085495114326477,-0.8039181232452393,0.5130321383476257,0.30085986852645874,-0.8039340376853943,0.5130043029785156,-0.797728419303894,-0.5067229270935059,0.3268962502479553,-0.7977258563041687,-0.506712794303894,0.3269183933734894,-0.797725260257721,-0.5067326426506042,0.3268887996673584,-0.7977154850959778,-0.5067335367202759,0.32691144943237305,-0.3269064426422119,-0.7977167367935181,0.5067347884178162,-0.3268938660621643,-0.7977226376533508,0.5067335367202759,-0.3268907070159912,-0.7977270483970642,0.5067287087440491,-0.3268868923187256,-0.7977240085601807,0.5067360997200012,-0.3268852233886719,-0.7977129817008972,0.5067545175552368,-0.5089601278305054,0.3034306466579437,-0.805536687374115,-0.5089573860168457,0.30343058705329895,-0.805538535118103,-0.5089519619941711,0.30339932441711426,-0.8055538535118103,-0.5089257955551147,0.30343857407569885,-0.8055554628372192,-0.5089184045791626,0.3034357726573944,-0.8055611252784729,-0.5088995695114136,0.30344462394714355,-0.8055697679519653,0.3268873393535614,0.7977280616760254,0.5067291259765625,0.32689282298088074,0.7977269887924194,0.5067273378372192,0.3269011378288269,0.7977209091186523,0.5067315101623535,0.3269102871417999,0.7977165579795837,0.5067325234413147,0.32691535353660583,0.7977278828620911,0.5067119002342224,-0.000026047229766845703,-0.999752938747406,-0.02222883701324463,-0.000008940696716308594,-0.9997531175613403,-0.022218912839889526,-0.0000015245750546455383,-0.9997526407241821,-0.02224019728600979,0.000007366761565208435,-0.9997531175613403,-0.02221873588860035,-0.290948748588562,-0.8199450969696045,-0.49298956990242004,-0.2909458875656128,-0.8199467658996582,-0.49298855662345886,-0.2909458577632904,-0.8199422955513,-0.4929962456226349,-0.29093700647354126,-0.8199491500854492,-0.4929898679256439,-0.29093021154403687,-0.8199409246444702,-0.4930077791213989,-0.2909247875213623,-0.8199558854103088,-0.4929860532283783,0.7977120280265808,-0.5067539215087891,0.32688847184181213,0.7977270483970642,-0.506733775138855,0.3268832564353943,0.7977273464202881,-0.5067236423492432,0.32689768075942993,0.7977273464202881,-0.5067236423492432,0.32689768075942993,0.3170563578605652,0.8139361143112183,0.48680925369262695,0.3170570433139801,0.8139445185661316,0.4867948889732361,0.3170689344406128,0.813934862613678,0.4868030846118927,0.3170716166496277,0.8139290809631348,0.4868110716342926,0.31707435846328735,0.8139417171478271,0.48678815364837646,0.4867840111255646,-0.3170663118362427,-0.8139473795890808,0.486789345741272,-0.3170621991157532,-0.8139458894729614,0.4867922365665436,-0.31707215309143066,-0.8139402270317078,0.48679348826408386,-0.317050039768219,-0.8139480948448181,0.4868071973323822,-0.3170592784881592,-0.8139362335205078,0.48680734634399414,-0.31705474853515625,-0.8139378428459167,0.4868084490299225,-0.3170764446258545,-0.8139288425445557,-0.000013574957847595215,-0.01111060380935669,-0.9999383091926575,-0.000004933535819873214,-0.011075659655034542,-0.9999386072158813,0.000007039896445348859,-0.011118302121758461,-0.9999381303787231,0.00000852346420288086,-0.01112416386604309,-0.9999381899833679,0.000014200806617736816,-0.011078417301177979,-0.9999385476112366,0.00003071129322052002,-0.011100709438323975,-0.9999383687973022,0.29092466831207275,0.8199556469917297,0.49298620223999023,0.2909298241138458,0.8199406862258911,0.4930081367492676,0.2909347116947174,0.8199495077133179,0.4929908514022827,0.2909448742866516,0.8199471235275269,0.49298879504203796,0.29094886779785156,0.8199383020401001,0.49300071597099304,0.016171813011169434,0.9998692274093628,-0.00003343820571899414,0.01620444655418396,0.999868631362915,-0.0000010915100574493408,0.01620711386203766,0.9998686909675598,-0.000010520219802856445,0.01620851457118988,0.9998686909675598,0.00001023709774017334,0.01621788740158081,0.9998685121536255,1.7881393432617188e-7,0.016219263896346092,0.9998685121536255,-3.4598633646965027e-7,-0.5067505836486816,0.3268905580043793,0.7977132201194763,-0.5067304372787476,0.3269084393978119,0.7977187037467957,-0.5067296028137207,0.3268975615501404,0.797723650932312,-0.5067266225814819,0.3268991708755493,0.7977248430252075,-0.5067264437675476,0.32688987255096436,0.7977288961410522,-0.5067263245582581,0.32689154148101807,0.7977282404899597,-0.2909603714942932,0.8199325203895569,0.49300387501716614,-0.2909455895423889,0.8199446797370911,0.4929923117160797,-0.2909436821937561,0.8199417591094971,0.4929981827735901,-0.2909405529499054,0.8199470639228821,0.4929913282394409,-0.2909325659275055,0.8199489712715149,0.4929928183555603,-0.2909291386604309,0.819939911365509,0.4930098354816437,-0.9997537136077881,0.022191839292645454,0.00000504031777381897,-0.9997531175613403,0.02221798151731491,-0.000002693384885787964,-0.9997531175613403,0.022219747304916382,0.000011652708053588867,-0.9997529983520508,0.022228829562664032,0.0000273287296295166,-0.9998690485954285,-0.00004357099533081055,0.01618865132331848,-0.999868631362915,8.069910109043121e-7,0.016208183020353317,-0.9998685717582703,-0.0000448375940322876,0.01621093973517418,-0.9998685717582703,-0.000008761882781982422,0.01621145009994507,-0.9998685717582703,0.000011309981346130371,0.01621215045452118,-0.9998684525489807,-0.0000010132789611816406,0.01622423529624939,-0.9998683929443359,0.0000010335352271795273,0.016223950311541557,-0.5130453705787659,-0.3008093237876892,0.8039266467094421,-0.5130453705787659,-0.3008093237876892,0.8039266467094421,-0.5130347013473511,-0.30084866285324097,0.8039188385009766,-0.5130272507667542,-0.3008646070957184,0.803917646408081,-0.5130270719528198,-0.3008405864238739,0.8039267659187317,-0.5130001902580261,-0.3008325397968292,0.8039469718933105,-0.5067576169967651,-0.3268996477127075,-0.7977050542831421,-0.5067576169967651,-0.3268996477127075,-0.7977050542831421,-0.5067268013954163,-0.3268904387950897,-0.7977283596992493,-0.5067136287689209,-0.32691413164138794,-0.7977270483970642,-0.5130422711372375,-0.30085960030555725,-0.8039097785949707,-0.5130422711372375,-0.30085960030555725,-0.8039097785949707,-0.5130351185798645,-0.3008493185043335,-0.8039183616638184,-0.5130186080932617,-0.30085819959640503,-0.8039255738258362,-0.5130038857460022,-0.3008323609828949,-0.8039445877075195,-0.8139479756355286,0.4867886006832123,-0.31705790758132935,-0.8139469027519226,0.4867956042289734,-0.3170493245124817,-0.8139386773109436,0.4867936074733734,-0.31707385182380676,-0.8139375448226929,0.48680996894836426,-0.3170512914657593,-0.8139374256134033,0.486805260181427,-0.3170590400695801,-0.8139272928237915,0.4868119955062866,-0.31707483530044556,-0.8039371967315674,-0.5130016803741455,-0.3008561134338379,-0.8039246797561646,-0.5130265951156616,-0.30084672570228577,-0.8039228916168213,-0.5130297541618347,-0.30084607005119324,-0.803920567035675,-0.5130411386489868,-0.3008330762386322,-0.803917407989502,-0.5130360126495361,-0.3008502721786499,-0.8039128184318542,-0.5130437016487122,-0.30084937810897827,-0.8039510250091553,-0.5129914879798889,0.30083632469177246,-0.803925633430481,-0.513030469417572,0.30083781480789185,-0.8039206862449646,-0.5130295753479004,0.3008521795272827,-0.8039200901985168,-0.5130325555801392,0.3008491098880768,-0.8039183616638184,-0.5130420923233032,0.30083730816841125,-0.8039169311523438,-0.513033390045166,0.3008556663990021,-0.8039165735244751,-0.5130240321159363,0.3008728623390198,0.8139259219169617,-0.4868123531341553,0.3170778751373291,0.8139362335205078,-0.48681262135505676,0.31705108284950256,0.8139362335205078,-0.48681262135505676,0.31705108284950256,0.8139456510543823,-0.4867914915084839,0.31705909967422485,0.8139479756355286,-0.4867952764034271,0.3170475363731384,0.8199337124824524,-0.4930025637149811,0.29095906019210815,0.8199397325515747,-0.4930015802383423,0.29094383120536804,0.8199440240859985,-0.4930053949356079,0.29092511534690857,0.8199495673179626,-0.49298688769340515,0.290941059589386,0.8199518918991089,-0.4929915964603424,0.29092657566070557,-0.000030502676963806152,-0.01617613434791565,0.9998691082000732,-0.000008180737495422363,-0.016205251216888428,0.999868631362915,0.0000011175870895385742,-0.01622094213962555,0.9998685121536255,0.0000046496279537677765,-0.01620444841682911,0.9998686909675598,0.000006626127287745476,-0.016218557953834534,0.9998685121536255,0.000016480684280395508,-0.016207247972488403,0.999868631362915,0.2909298837184906,-0.8199405670166016,0.493008553981781,0.2909371554851532,-0.819949209690094,0.49298959970474243,0.290944904088974,-0.8199470043182373,0.4929887652397156,0.29094886779785156,-0.8199384212493896,0.4930006265640259,0.29096388816833496,-0.8199325799942017,0.49300146102905273,0.8199388980865479,0.4930010437965393,0.2909468710422516,0.8199397325515747,0.4930093288421631,0.2909305691719055,0.8199490904808044,0.49298906326293945,0.2909387946128845,0.8199512362480164,0.4929920732975006,0.2909274697303772,0.8199567198753357,0.4929872155189514,0.29091987013816833,0.8039079904556274,0.5130425095558167,-0.30086418986320496,0.8039079904556274,0.5130425095558167,-0.30086418986320496,0.8039183616638184,0.513031542301178,-0.3008551597595215,0.8039308786392212,0.5130091905593872,-0.30085980892181396,0.4929937720298767,-0.29094550013542175,0.8199437856674194,0.4929945468902588,-0.2909424602985382,0.819944441318512,0.4929971694946289,-0.2909335792064667,0.8199460506439209,0.49299973249435425,-0.29094603657722473,0.8199400305747986,0.4930054247379303,-0.2909621000289917,0.819930911064148,0.4930139482021332,-0.2909294068813324,0.8199374079704285,-0.5067506432533264,-0.326890766620636,0.7977131605148315,-0.5067328214645386,-0.32690688967704773,0.797717809677124,-0.5067287087440491,-0.326896071434021,0.7977248430252075,-0.5067263841629028,-0.3268885314464569,0.7977295517921448,-0.5067260265350342,-0.3268907368183136,0.7977287173271179,-0.5067246556282043,-0.3268979489803314,0.7977266907691956,-0.4868078827857971,-0.31707385182380676,0.8139301538467407,-0.48680680990219116,-0.31705403327941895,0.8139384388923645,-0.4868009090423584,-0.3170638084411621,0.8139382600784302,-0.4867950677871704,-0.3170577883720398,0.8139441013336182,-0.486785888671875,-0.31707119941711426,0.8139443397521973,-0.0000063907355070114136,-0.9997531175613403,0.02221914753317833,0.0000015255063772201538,-0.9997526407241821,0.022240199148654938,0.000007659196853637695,-0.9997530579566956,0.022218987345695496,0.000025704503059387207,-0.9997528791427612,0.022229783236980438,-0.2909602224826813,-0.8199326992034912,0.49300363659858704,-0.2909456193447113,-0.8199447989463806,0.4929920732975006,-0.2909436523914337,-0.8199417591094971,0.4929981827735901,-0.2909403145313263,-0.8199471235275269,0.4929913580417633,-0.2909320592880249,-0.8199489116668701,0.4929931163787842,-0.2909291386604309,-0.8199397325515747,0.4930102229118347,-0.3170614242553711,-0.8139365911483765,0.4868052303791046,-0.3170546591281891,-0.8139438629150391,0.4867975413799286,-0.31705236434936523,-0.8139365911483765,0.4868110716342926,-0.31705206632614136,-0.8139435052871704,0.4867997169494629,0.5067088007926941,-0.32691431045532227,-0.7977301478385925,0.5067205429077148,-0.32689112424850464,-0.7977320551872253,0.506729781627655,-0.32688722014427185,-0.7977279424667358,0.5067307949066162,-0.32690852880477905,-0.797718346118927,0.9997526407241821,-0.022240418940782547,-0.000005042180418968201,0.9997529983520508,-0.02222476899623871,0.0000216066837310791,0.9997532367706299,-0.022217553108930588,-0.000011643394827842712,0.9997532963752747,-0.022216007113456726,0.0000049620866775512695,0.8139346837997437,-0.48679178953170776,-0.31708675622940063,0.8139352798461914,-0.48680993914604187,-0.31705716252326965,0.8139358758926392,-0.48680379986763,-0.31706541776657104,0.8139419555664062,-0.4867968261241913,-0.3170607388019562,0.8139616847038269,-0.4867711067199707,-0.3170492947101593,0.9998683333396912,9.019859135150909e-7,-0.016223222017288208,0.9998684525489807,-9.5367431640625e-7,-0.016224414110183716,0.999868631362915,-0.00000858306884765625,-0.01621215045452118,0.999868631362915,8.074566721916199e-7,-0.016208184882998466,0.999868631362915,0.000011593103408813477,-0.016211628913879395,0.9998686909675598,-0.000031620264053344727,-0.016208022832870483,0.9998689293861389,-0.00004826486110687256,-0.0161912702023983,-0.00000838935375213623,0.016203731298446655,0.9998688101768494,9.622890502214432e-7,0.01622016541659832,0.9998683929443359,0.000004648929461836815,0.01620445027947426,0.9998686909675598,0.0000064373016357421875,0.01621994376182556,0.9998685717582703,0.00001582503318786621,0.016208693385124207,0.9998685121536255,0.00003847479820251465,0.016177505254745483,0.999869167804718,0.48680007457733154,0.31705743074417114,0.813941240310669,0.48680129647254944,0.3170565962791443,0.8139409422874451,0.4868077337741852,0.3170599937438965,0.8139355778694153,0.48685207962989807,0.3170304000377655,0.8139206767082214,0.8139327168464661,0.48680904507637024,-0.31706565618515015,0.8139352798461914,0.48680996894836426,-0.3170573115348816,0.813941240310669,0.48680001497268677,-0.31705746054649353,0.8139423727989197,0.4867967665195465,-0.31705957651138306,0.8139436841011047,0.48679426312446594,-0.3170599341392517,0.5088772773742676,0.30341875553131104,-0.8055935502052307,0.5089110136032104,0.3034226894378662,-0.8055708408355713,0.5089132785797119,0.30345800518989563,-0.8055559992790222,0.5089139342308044,0.30345267057418823,-0.8055576086044312,0.508934497833252,0.30343055725097656,-0.8055529594421387,0.5089894533157349,0.303387314081192,-0.8055344820022583,0.5031076073646545,0.3264298439025879,-0.8002038598060608,0.5031241178512573,0.3264410197734833,-0.8001890182495117,0.5031249523162842,0.32645124197006226,-0.8001842498779297,0.5031318664550781,0.3264358937740326,-0.8001861572265625,0.5031365752220154,0.3264387249946594,-0.8001821041107178,0.797707200050354,0.506753146648407,-0.3269011378288269,0.797707200050354,0.506753146648407,-0.3269011378288269,0.7977266907691956,0.5067112445831299,-0.32691892981529236,0.7977287769317627,0.5067213773727417,-0.3268980383872986,0.3170560896396637,-0.8139365315437317,0.486808717250824,0.31705886125564575,-0.8139439821243286,0.48679447174072266,0.3170628845691681,-0.813936173915863,0.4868050217628479,0.3170718252658844,-0.8139439821243286,0.48678603768348694,0.31708014011383057,-0.8139369487762451,0.48679235577583313,0.31708040833473206,-0.8139251470565796,0.48681211471557617,0.8199315071105957,0.4930025637149811,-0.2909652590751648,0.8199403285980225,0.49300968647003174,-0.2909284830093384,0.8199413418769836,0.49299755692481995,-0.2909456491470337,0.8199435472488403,0.49299076199531555,-0.29095104336738586,0.8199455142021179,0.4929905831813812,-0.2909463047981262,0.8199475407600403,0.4929920434951782,-0.2909378409385681,-0.49301081895828247,-0.2909294068813324,-0.8199392557144165,-0.4930001497268677,-0.29094603657722473,-0.8199397325515747,-0.4929942190647125,-0.29094552993774414,-0.8199436664581299,-0.49299415946006775,-0.2909356355667114,-0.8199470043182373,-0.4929927885532379,-0.2909421920776367,-0.8199455738067627,-0.49299028515815735,-0.29092299938201904,-0.8199537992477417,-0.016219697892665863,-0.9998685121536255,1.8882565200328827e-7,-0.016219332814216614,-0.9998683929443359,4.917383193969727e-7,-0.016213014721870422,-0.9998685121536255,0.00004868209362030029,-0.016209125518798828,-0.999868631362915,-0.000010088086128234863,-0.016207367181777954,-0.999868631362915,0.000010952353477478027,-0.01620444655418396,-0.9998686909675598,-9.727664291858673e-7,-0.01618608832359314,-0.9998689889907837,0.00003844499588012695,-0.49107488989830017,0.2948729395866394,-0.8196921944618225,-0.49106675386428833,0.29489362239837646,-0.8196896314620972,-0.49106061458587646,0.2948709726333618,-0.8197014927864075,-0.49105924367904663,0.2948675751686096,-0.8197035193443298,-0.4910484552383423,0.2948729693889618,-0.8197080492973328,0.5130017399787903,-0.30085939168930054,-0.8039357662200928,0.5130244493484497,-0.30084937810897827,-0.803925096988678,0.513026773929596,-0.3008493483066559,-0.8039234280586243,0.513030469417572,-0.30085432529449463,-0.8039193749427795,0.5130401253700256,-0.30083391070365906,-0.8039209842681885,0.5130414366722107,-0.30084913969039917,-0.8039143681526184,0.32688838243484497,-0.7977268695831299,0.5067307949066162,0.3268934488296509,-0.797727644443512,0.5067262649536133,0.3268952965736389,-0.7977220416069031,0.5067338347434998,0.3269088566303253,-0.7977157235145569,0.5067347288131714,0.32691681385040283,-0.7977270483970642,0.5067120790481567,0.506731390953064,-0.3268928527832031,0.7977245450019836,0.5067368745803833,-0.3268938362598419,0.7977205514907837,0.5067563056945801,-0.3268866240978241,0.7977113723754883,0.5067574977874756,-0.3268994987010956,0.7977052927017212,0.5067574977874756,-0.3268994987010956,0.7977052927017212,0.48679232597351074,-0.31706538796424866,0.8139427304267883,0.4867943525314331,-0.3170838952064514,0.8139344453811646,0.48680126667022705,-0.317055344581604,0.8139413595199585,0.48680776357650757,-0.31706103682518005,0.8139351010322571,0.4868128001689911,-0.3170541524887085,0.813934862613678,0.4868144989013672,-0.3170735836029053,0.8139262199401855,-0.3269168436527252,-0.7977273464202881,-0.5067114233970642,-0.3269089162349701,-0.7977157235145569,-0.5067346096038818,-0.32690006494522095,-0.7977253198623657,-0.5067254304885864,-0.3268975615501404,-0.7977211475372314,-0.5067336559295654,-0.326894074678421,-0.7977250218391418,-0.5067296624183655,-0.32689133286476135,-0.7977280020713806,-0.5067267417907715,-0.7977375388145447,-0.5067383050918579,-0.3268502950668335,-0.7977375388145447,-0.5067383050918579,-0.3268502950668335,-0.7977255582809448,-0.5067352652549744,-0.326884001493454,-0.7977122068405151,-0.5067542791366577,-0.32688724994659424,0.9998685717582703,-1.9371509552001953e-7,0.016211718320846558,0.9998686909675598,-0.000007063150405883789,0.01620452105998993,0.9998686909675598,5.688052624464035e-7,0.01620963215827942,0.9998687505722046,8.088536560535431e-7,0.01620098017156124,0.9998687505722046,0.000009447336196899414,0.016203224658966064,0.9998690485954285,-0.000034227967262268066,0.01618596911430359,0.3268680274486542,-0.7977415323257446,-0.5067204236984253,0.3268900513648987,-0.7977254986763,-0.5067315697669983,0.32689306139945984,-0.7977262735366821,-0.5067285299301147,0.3268945813179016,-0.7977228164672852,-0.5067329406738281,0.32689517736434937,-0.7977268099784851,-0.5067262649536133,0.32691502571105957,-0.7977272272109985,-0.5067128539085388,0.7977112531661987,-0.5067529678344727,-0.32689201831817627,0.7977154850959778,-0.5067335963249207,-0.32691144943237305,0.7977215647697449,-0.506732702255249,-0.32689809799194336,0.7977254390716553,-0.5067287087440491,-0.32689452171325684,0.7977267503738403,-0.5067309141159058,-0.32688814401626587,0.5130077004432678,0.30085963010787964,0.8039320707321167,0.5130297541618347,0.30084937810897827,0.8039216995239258,0.5130323171615601,0.3008490204811096,0.8039200901985168,0.5130364894866943,0.30085432529449463,0.8039156794548035,0.5130462050437927,0.3008359372615814,0.8039162158966064,0.51304692029953,0.30084913969039917,0.8039107918739319,0.8039127588272095,-0.5130437612533569,0.30084940791130066,0.8039186596870422,-0.5130347609519958,0.3008493483066559,0.8039190769195557,-0.5130429863929749,0.30083420872688293,0.8039229512214661,-0.5130298137664795,0.30084604024887085,0.8039247393608093,-0.5130265951156616,0.3008466958999634,0.8039315938949585,-0.5130106210708618,0.3008553087711334,0.8039183616638184,-0.5130316615104675,-0.30085524916648865,0.803918719291687,-0.5130422711372375,-0.3008360266685486,0.8039200305938721,-0.5130326151847839,-0.30084913969039917,0.8039206862449646,-0.5130296349525452,-0.3008522093296051,0.8039317727088928,-0.513005793094635,-0.30086347460746765,0.8039458394050598,-0.5129998922348022,-0.3008357584476471,-0.30086222290992737,-0.8039306402206421,-0.5130082964897156,-0.30085277557373047,-0.8039199113845825,-0.513030469417572,-0.300851047039032,-0.8039217591285706,-0.513028621673584,-0.3008507788181305,-0.8039173483848572,-0.5130357146263123,-0.3008337914943695,-0.8039432168006897,-0.5130053162574768,-0.9998691082000732,-0.000034242868423461914,-0.01618131995201111,-0.9998687505722046,8.067581802606583e-7,-0.01620098017156124,-0.9998687505722046,0.000009641051292419434,-0.016203448176383972,-0.9998686909675598,-0.000007212162017822266,-0.016204625368118286,-0.9998686909675598,6.223563104867935e-7,-0.016209648922085762,-0.9998685121536255,-1.9371509552001953e-7,-0.01621153950691223,-0.7977283596992493,0.5067322254180908,-0.326882004737854,-0.7977277636528015,0.5067290663719177,-0.3268887996673584,-0.7977234125137329,0.5067338943481445,-0.32689157128334045,-0.7977177500724792,0.5067336559295654,-0.32690560817718506,-0.7977122068405151,0.5067541599273682,-0.326887309551239,-0.8039452433586121,0.5130032300949097,-0.3008318245410919,-0.8039326071739197,0.5130090713500977,-0.3008555769920349,-0.8039237856864929,0.5130265951156616,-0.30084937810897827,-0.8039227724075317,0.5130298137664795,-0.3008461892604828,-0.8039199709892273,0.5130324363708496,-0.30084940791130066,-0.8039199709892273,0.5130419135093689,-0.30083346366882324,-0.8039143681526184,0.5130447745323181,-0.30084335803985596,-0.4861213266849518,0.3174731433391571,-0.8141847252845764,-0.4861072897911072,0.3175134062767029,-0.8141775131225586,-0.4861047863960266,0.31748297810554504,-0.8141908049583435,-0.4861007332801819,0.3174685537815094,-0.8141988515853882,-0.4860859811306,0.31749480962753296,-0.8141974210739136,-0.48608478903770447,0.3174983561038971,-0.814196765422821,0.30044397711753845,0.8036642670631409,-0.5136703848838806,0.30044645071029663,0.8036598563194275,-0.5136758685112,0.3004480004310608,0.8036625981330872,-0.5136705636978149,0.3004538118839264,0.8036926984786987,-0.5136200785636902,0.30045652389526367,0.8036901950836182,-0.5136222839355469,-0.3004720211029053,0.8036836981773376,-0.5136234760284424,-0.30045682191848755,0.8036627769470215,-0.513664960861206,-0.3004477024078369,0.8036642670631409,-0.5136681795120239,-0.30044496059417725,0.8036916851997375,-0.5136268734931946,-0.3004448711872101,0.8036707043647766,-0.5136595964431763,-0.29143548011779785,0.8175532221794128,-0.4966612160205841,-0.2914249300956726,0.8175643086433411,-0.4966491460800171,-0.2914220690727234,0.8175652623176575,-0.49664899706840515,-0.2914113402366638,0.8175539374351501,-0.4966740012168884,-0.2913860082626343,0.8175709843635559,-0.49666067957878113,-0.2913796901702881,0.8175732493400574,-0.49666085839271545,-0.00002612173557281494,0.9997528791427612,-0.022229932248592377,-0.000007601454854011536,0.9997532367706299,-0.02221878245472908,0.0000013606622815132141,0.9997526407241821,-0.02224019542336464,0.000006318092346191406,0.9997531771659851,-0.022218704223632812,-0.5130420923233032,0.3008320927619934,0.8039203882217407,-0.5130420923233032,0.3008320927619934,0.8039203882217407,-0.513036847114563,0.30085039138793945,0.8039168119430542,-0.5130102634429932,0.3008587956428528,0.8039306998252869,-0.48680686950683594,0.31705421209335327,0.8139384388923645,-0.48680058121681213,0.31706511974334717,0.8139378428459167,-0.4867952764034271,0.3170567750930786,0.8139443397521973,-0.48679250478744507,0.3170604407787323,0.8139445781707764],\n \"normalized\": false\n },\n \"uv\": {\n \"itemSize\": 2,\n \"type\": \"Float32Array\",\n \"array\": [0.01962309330701828,0.012889564037322998,0.02023136429488659,0.10979831218719482,0.07965327799320221,0.07732349634170532,0.07965327799320221,0.07732349634170532,0.02023136429488659,0.10979831218719482,0.5619750022888184,0.14709901809692383,0.02450018748641014,0.02645343542098999,0.06788178533315659,0.04795658588409424,0.0796533077955246,0.04795646667480469,0.02450018748641014,0.02645343542098999,0.503350019454956,0.1835920214653015,0.3125010132789612,0.3969320058822632,0.10002404451370239,0.04638880491256714,0.0839850902557373,0.04795658588409424,0.01962309330701828,0.008929312229156494,0.10002404451370239,0.04638880491256714,0.018139563500881195,0.03942161798477173,0.05488619580864906,0.04795628786087036,0.503491997718811,0.058592021465301514,0.09820473194122314,0.10979831218719482,0.05488619580864906,0.04795628786087036,0.018139563500881195,0.03942161798477173,0.04933025687932968,0.08043122291564941,0.04933025687932968,0.08043122291564941,0.03322688490152359,0.0800524353981018,0.03322688490152359,0.0800524353981018,0.0619719997048378,0.7201650142669678,0.012844499200582504,0.020931720733642578,0.5630499720573425,0.345100998878479,0.09606381505727768,0.008966565132141113,0.011493649333715439,0.020151853561401367,0.03200281038880348,0.0800524353981018,0.6875010132789612,0.5218279957771301,0.05055434629321098,0.07732337713241577,0.05055434629321098,0.07732337713241577,0.11814413964748383,0.008967041969299316,0.0850236713886261,0.029828131198883057,0.057423245161771774,0.008966565132141113,0.10158386081457138,0.04638880491256714,0.057423245161771774,0.008966565132141113,0.6874989867210388,0.5953599810600281,0.01827225834131241,0.008149445056915283,0.019623126834630966,0.045423686504364014,0.03755871579051018,0.047578275203704834,0.09387288242578506,0.07732349634170532,0.24622400104999542,0.4335950016975403,0.019623126834630966,0.045423686504364014,0.03755871579051018,0.047578275203704834,0.0850236713886261,0.040868282318115234,0.07398355007171631,0.008967041969299316,0.07532140612602234,0.08043128252029419,0.18750199675559998,0.5220270156860352,0.04066653922200203,0.04795628786087036,0.3125,0.021938025951385498,0.10997618734836578,0.10979831218719482,0.02358332648873329,0.01918947696685791,0.05190323293209076,0.046388089656829834,0.05190323293209076,0.046388089656829834,0.05488622561097145,0.08043128252029419,0.08367279171943665,0.023528218269348145,0.05488622561097145,0.08043128252029419,0.3124989867210388,0.5957159996032715,0.018272243440151215,0.013669490814208984,0.10554412007331848,0.008966803550720215,0.019007263705134392,0.10979831218719482,0.4383139908313751,0.39722001552581787,0.10253656655550003,0.10979831218719482,0.0503433421254158,0.04638814926147461,0.0850236713886261,0.024307966232299805,0.3124980032444,0.22047501802444458,0.10131248831748962,0.10979825258255005,0.10131248831748962,0.10979825258255005,0.0850236713886261,0.022748231887817383,0.05366211757063866,0.08043128252029419,0.1875,0.27190500497817993,0.10131251811981201,0.08043169975280762,0.02450021728873253,0.04338186979293823,0.06294332444667816,0.008966565132141113,0.1285640001296997,0.3085939884185791,0.02450021728873253,0.04338186979293823,0.09387288242578506,0.08043169975280762,0.09387288242578506,0.08043169975280762,0.006182555109262466,0.02567189931869507,0.027670973911881447,0.08005237579345703,0.312734991312027,0.34500598907470703,0.09387288242578506,0.10979831218719482,0.007099363952875137,0.04590404033660889,0.007099363952875137,0.04590404033660889,0.059218067675828934,0.08043104410171509,0.37151700258255005,0.3090599775314331,0.007099363952875137,0.04590404033660889,0.10997628420591354,0.07732337713241577,0.10997628420591354,0.07732337713241577,0.10253656655550003,0.07732349634170532,0.10253656655550003,0.07732349634170532,0.006182555109262466,0.020151853561401367,0.0625,0.14693999290466309,0.0625,0.2202470302581787,0.03322688490152359,0.07694470882415771,0.03378301486372948,0.04638814926147461,0.08502364158630371,0.013267934322357178,0.03378301486372948,0.04638814926147461,0.02598363533616066,0.024411678314208984,0.12137900292873383,0.1835939884185791,0.03378315269947052,0.008967041969299316,0.10253656655550003,0.04795682430267334,0.02450018748641014,0.030413687229156494,0.028895026072859764,0.047577083110809326,0.04622248187661171,0.07732313871383667,0.6290850043296814,0.1835920214653015,0.02450018748641014,0.030413687229156494,0.02450018748641014,0.0239296555519104,0.02450018748641014,0.0239296555519104,0.02450018748641014,0.0239296555519104,0.035342950373888016,0.008967041969299316,0.041890617460012436,0.07732313871383667,0.035342950373888016,0.008967041969299316,0.4962030053138733,0.3085950016975403,0.4375010132789612,0.27205002307891846,0.02333913929760456,0.07694411277770996,0.035342950373888016,0.04638814926147461,0.08367279171943665,0.012488067150115967,0.012844499200582504,0.024891972541809082,0.06232589855790138,0.047956228256225586,0.06232589855790138,0.047956228256225586,0.0883169174194336,0.07732337713241577,0.06249900162220001,0.47056400775909424,0.08087734878063202,0.10979831218719482,0.05190323293209076,0.00896763801574707,0.024500157684087753,0.03689777851104736,0.25286900997161865,0.5585929751396179,0.08087734878063202,0.10979831218719482,0.02598368003964424,0.038939595222473145,0.03322688490152359,0.047577738761901855,0.10997621715068817,0.04795706272125244,0.02598368003964424,0.038939595222473145,0.03322688490152359,0.047577738761901855,0.003621000098064542,0.1835939884185791,0.07794374972581863,0.008966684341430664,0.07794374972581863,0.008966684341430664,0.007533404976129532,0.020931720733642578,0.10131248831748962,0.07732349634170532,0.5625010132789612,0.5218250155448914,0.04933026805520058,0.07732349634170532,0.07532145082950592,0.04795658588409424,0.0850236713886261,0.028268277645111084,0.6875020265579224,0.2718750238418579,0.008582886308431625,0.03737819194793701,0.008582886308431625,0.03737819194793701,0.11658430099487305,0.04638892412185669,0.11106422543525696,0.00896674394607544,0.12150800228118896,0.3085930347442627,0.007099427282810211,0.03942000865936279,0.007099427282810211,0.03942000865936279,0.25360798835754395,0.4335930347442627,0.10002404451370239,0.00896674394607544,0.07242370396852493,0.046388447284698486,0.007099427282810211,0.03942000865936279,0.01857360079884529,0.019969403743743896,0.0462225005030632,0.10979831218719482,0.06249900162220001,0.5952410101890564,0.059218067675828934,0.04795658588409424,0.059218067675828934,0.04795658588409424,0.01857360079884529,0.018409550189971924,0.044998399913311005,0.10979831218719482,0.4374989867210388,0.09534800052642822,0.06690356880426407,0.008966684341430664,0.06690356880426407,0.008966684341430664,0.6874979734420776,0.34531301259994507,0.017222747206687927,0.01918947696685791,0.06846341490745544,0.008966624736785889,0.057993993163108826,0.04795658588409424,0.032921500504016876,0.10979831218719482,0.029636148363351822,0.019969403743743896,0.02364526502788067,0.10979831218719482,0.029636148363351822,0.019969403743743896,0.02364526502788067,0.10979831218719482,0.01326248049736023,0.04464298486709595,0.12177500128746033,0.6835950016975403,0.012804049998521805,0.04527390003204346,0.0372520349919796,0.10979831218719482,0.0372520349919796,0.10979831218719482,0.5033249855041504,0.3086329698562622,0.03230946138501167,0.10979831218719482,0.03230946138501167,0.10979831218719482,0.019623063504695892,0.032455623149871826,0.12873399257659912,0.6835910081863403,0.06665770709514618,0.10979819297790527,0.06354992836713791,0.07732325792312622,0.06354992836713791,0.07732325792312622,0.06665770709514618,0.10979819297790527,0.0031109999399632215,0.4335930347442627,0.06232583895325661,0.077323317527771,0.04066653922200203,0.08043086528778076,0.019623063504695892,0.030895769596099854,0.019623063504695892,0.030895769596099854,0.0635499358177185,0.08043128252029419,0.08367279171943665,0.018008112907409668,0.0635499358177185,0.08043128252029419,0.07098956406116486,0.04795658588409424,0.07098956406116486,0.04795658588409424,0.4375010132789612,0.5215610265731812,0.04066656902432442,0.0773230791091919,0.06665772199630737,0.047956645488739014,0.06665772199630737,0.047956645488739014,0.04066656902432442,0.0773230791091919,0.37138599157333374,0.0585939884185791,0.0235833041369915,0.02519160509109497,0.05921806022524834,0.10979831218719482,0.3133150041103363,0.27218103408813477,0.024563191458582878,0.08005183935165405,0.024563191458582878,0.08005183935165405,0.006182555109262466,0.014631807804107666,0.1068684309720993,0.10979831218719482,0.08398514240980148,0.07732337713241577,0.37139201164245605,0.4335950016975403,0.08398514240980148,0.07732337713241577,0.1068684309720993,0.10979831218719482,0.007099427282810211,0.04338020086288452,0.007099427282810211,0.04338020086288452,0.02333918772637844,0.047576963901519775,0.1056443378329277,0.07732349634170532,0.3787969946861267,0.3085930347442627,0.018139638006687164,0.02645343542098999,0.02333918772637844,0.047576963901519775,0.0558633916079998,0.046388328075408936,0.1068684458732605,0.07732337713241577,0.6207290291786194,0.4335950016975403,0.1068684458732605,0.07732337713241577,0.0558633916079998,0.046388328075408936,0.017222747206687927,0.02519160509109497,0.037558771669864655,0.08005297183990479,0.08367282897233963,0.04560840129852295,0.09698063135147095,0.08043169975280762,0.5630019903182983,0.2720860242843628,0.09054373949766159,0.008966386318206787,0.08831693977117538,0.047956764698028564,0.12188900262117386,0.4335950016975403,0.08831693977117538,0.047956764698028564,0.018139630556106567,0.03689777851104736,0.4375010132789612,0.14693796634674072,0.09450394660234451,0.008966565132141113,0.09450394660234451,0.008966565132141113,0.05055436119437218,0.08043122291564941,0.012844499200582504,0.01937192678451538,0.039303116500377655,0.008966505527496338,0.09264880418777466,0.07732337713241577,0.7453330159187317,0.4335939884185791,0.09264880418777466,0.07732337713241577,0.039303116500377655,0.008966505527496338,0.019623126834630966,0.043863773345947266,0.08087734878063202,0.08043140172958374,0.012844476848840714,0.01385188102722168,0.08831700682640076,0.08043140172958374,0.3125010132789612,0.5214719772338867,0.1875009983778,0.3970370292663574,0.08954101800918579,0.08043140172958374,0.08954101800918579,0.08043140172958374,0.03755873069167137,0.0769452452659607,0.011493649333715439,0.014631807804107666,0.07098963111639023,0.08043122291564941,0.07098963111639023,0.08043122291564941,0.10554413497447968,0.046388864517211914,0.10554413497447968,0.046388864517211914,0.49645400047302246,0.4340590238571167,0.025983694940805435,0.045423686504364014,0.05586344376206398,0.008966565132141113,0.08520916849374771,0.04795658588409424,0.08520916849374771,0.04795658588409424,0.5625010132789612,0.39734500646591187,0.01962309330701828,0.007369518280029297,0.011493649333715439,0.02567189931869507,0.04499842971563339,0.04795628786087036,0.18750199675559998,0.6470130085945129,0.06354992836713791,0.04795616865158081,0.08954101800918579,0.07732349634170532,0.04622248187661171,0.04795628786087036,0.08954101800918579,0.07732349634170532,0.04622248187661171,0.04795628786087036,0.012844499200582504,0.026451826095581055,0.6875010132789612,0.14722901582717896,0.024934161454439163,0.01444941759109497,0.04638303443789482,0.008966565132141113,0.11262404918670654,0.046388864517211914,0.6874989867210388,0.09525102376937866,0.5042709708213806,0.4335930347442627,0.1112002432346344,0.08043169975280762,0.08520916849374771,0.07732337713241577,0.008582878857851028,0.043862223625183105,0.008582878857851028,0.043862223625183105,0.01962309330701828,0.03737986087799072,0.08898389339447021,0.008966386318206787,0.01962309330701828,0.03737986087799072,0.09450394660234451,0.04638838768005371,0.08898389339447021,0.008966386318206787,0.4963819980621338,0.18359601497650146,0.01962309330701828,0.03737986087799072,0.09606381505727768,0.046388328075408936,0.6216750144958496,0.308555006980896,0.09698067605495453,0.10979819297790527,0.09698067605495453,0.10979819297790527,0.09606381505727768,0.046388328075408936,0.01962309330701828,0.038939714431762695,0.5624989867210388,0.46984195709228516,0.02493416890501976,0.0184096097946167,0.1112002432346344,0.10979825258255005,0.1112002432346344,0.10979825258255005,0.1068684458732605,0.04795706272125244,0.008582878857851028,0.04542207717895508,0.25361400842666626,0.0585939884185791,0.09264880418777466,0.10979819297790527,0.10997617989778519,0.08043175935745239,0.10997617989778519,0.08043175935745239,0.09264880418777466,0.10979819297790527,0.08502364158630371,0.01170814037322998,0.06250099837779999,0.5219460129737854,0.024563191458582878,0.07694411277770996,0.03200285881757736,0.07694464921951294,0.024563191458582878,0.07694411277770996,0.03200285881757736,0.07694464921951294,0.4374989867210388,0.3451380133628845,0.10564440488815308,0.04795706272125244,0.10564440488815308,0.04795706272125244,0.041890617460012436,0.04795628786087036,0.041890617460012436,0.04795628786087036,0.02493416890501976,0.019969403743743896,0.3125019967556,0.14671200513839722,0.0795036107301712,0.008966624736785889,0.11120033264160156,0.07732337713241577,0.007533404976129532,0.01937192678451538,0.02598368003964424,0.03737974166870117,0.37174901366233826,0.18359798192977905,0.02598368003964424,0.03737974166870117,0.05034333094954491,0.00896763801574707,0.11120033264160156,0.04795718193054199,0.05034333094954491,0.00896763801574707,0.11120033264160156,0.04795718193054199,0.04499838873744011,0.08043122291564941,0.49654099345207214,0.058596014976501465,0.07965327799320221,0.10979831218719482,0.023583341389894485,0.038159728050231934,0.023583341389894485,0.038159728050231934,0.023583341389894485,0.038159728050231934,0.06138351559638977,0.04638826847076416,0.5624989867210388,0.09532797336578369,0.05488619580864906,0.07732349634170532,0.007533375173807144,0.009891688823699951,0.061383482068777084,0.008966565132141113,0.621508002281189,0.058596014976501465,0.07221363484859467,0.08043122291564941,0.025983694940805435,0.043863773345947266,0.025983694940805435,0.043863773345947266,0.02450021728873253,0.04590564966201782,0.07794374972581863,0.04638850688934326,0.02450021728873253,0.04590564966201782,0.6215639710426331,0.5585950016975403,0.10710396617650986,0.046388864517211914,0.02450021728873253,0.04590564966201782,0.025983672589063644,0.030895769596099854,0.05366221442818642,0.10979831218719482,0.2464359998703003,0.3085939884185791,0.02767101861536503,0.047577083110809326,0.02767101861536503,0.047577083110809326,0.05366221442818642,0.10979831218719482,0.025983672589063644,0.032455503940582275,0.025983672589063644,0.032455503940582275,0.37213099002838135,0.5585950016975403,0.05488622561097145,0.10979831218719482,0.08831696212291718,0.10979831218719482,0.08831696212291718,0.10979831218719482,0.025983672589063644,0.032455503940582275,0.007099442183971405,0.03689616918563843,0.11262404918670654,0.00896674394607544,0.6286150217056274,0.058592021465301514,0.007099442183971405,0.03689616918563843,0.12366431206464767,0.046389102935791016,0.6875010132789612,0.021937012672424316,0.06232582405209541,0.08043128252029419,0.0850236713886261,0.017228126525878906,0.12366431206464767,0.00896763801574707,0.12366431206464767,0.00896763801574707,0.017222747206687927,0.04464375972747803,0.06846341490745544,0.04638838768005371,0.06846341490745544,0.04638838768005371,0.7464879751205444,0.30859601497650146,0.07532142847776413,0.077323317527771,0.07532142847776413,0.077323317527771,0.0850236713886261,0.033788442611694336,0.06788180023431778,0.08043128252029419,0.06788180023431778,0.08043128252029419,0.09264878183603287,0.04795682430267334,0.6875,0.3975909948348999,0.1068684309720993,0.08043169975280762,0.08367282897233963,0.04008835554122925,0.07242365181446075,0.008967041969299316,0.07242365181446075,0.008967041969299316,0.3124989867210388,0.4702550172805786,0.057993993163108826,0.08043110370635986,0.2463259994983673,0.18359601497650146,0.1056443527340889,0.10979831218719482,0.006182555109262466,0.044642090797424316,0.11658430099487305,0.008967041969299316,0.07654549926519394,0.04795658588409424,0.07654549926519394,0.04795658588409424,0.11658430099487305,0.008967041969299316,0.0625,0.2718600034713745,0.08367279171943665,0.029048264026641846,0.012844476848840714,0.015411734580993652,0.4375010132789612,0.02183997631072998,0.03633471950888634,0.0769452452659607,0.03633471950888634,0.0769452452659607,0.07965333014726639,0.08043140172958374,0.07965333014726639,0.08043140172958374,0.018139638006687164,0.04590564966201782,0.37845900654792786,0.058592021465301514,0.036334652453660965,0.047578275203704834,0.06690356880426407,0.04638850688934326,0.018139638006687164,0.04590564966201782,0.09698062390089035,0.07732349634170532,0.18749800324440002,0.7201740145683289,0.06665777415037155,0.08043122291564941,0.0850236713886261,0.03534823656082153,0.1874990016222,0.47015100717544556,0.09387288242578506,0.04795682430267334,0.09387288242578506,0.04795682430267334,0.09820473194122314,0.07732337713241577,0.09820473194122314,0.07732337713241577,0.08367279171943665,0.03456830978393555,0.08954101800918579,0.10979831218719482,0.09820473194122314,0.04795682430267334,0.12877599895000458,0.4335930347442627,0.02450018748641014,0.032937586307525635,0.012844454497098923,0.008331894874572754,0.08898389339447021,0.04638838768005371,0.08398512005805969,0.08043140172958374,0.4374989867210388,0.2202489972114563,0.18749800324440002,0.5951610207557678,0.0850236713886261,0.018788039684295654,0.07221363484859467,0.04795658588409424,0.12210442870855331,0.00896763801574707,0.007099363952875137,0.03041207790374756,0.4969879984855652,0.5585939884185791,0.0852091833949089,0.10979831218719482,0.07098958641290665,0.07732349634170532,0.007099363952875137,0.03041207790374756,0.0753214880824089,0.10979819297790527,0.07221363484859467,0.07732337713241577,0.07221363484859467,0.07732337713241577,0.24624399840831757,0.5585960149765015,0.0753214880824089,0.10979819297790527,0.008582886308431625,0.030893981456756592,0.008582886308431625,0.030893981456756592,0.05799401178956032,0.07732337713241577,0.05799401178956032,0.07732337713241577,0.6285120248794556,0.30859100818634033,0.04933030903339386,0.047956645488739014,0.04933030903339386,0.047956645488739014,0.01962307095527649,0.024411559104919434,0.018139563500881195,0.0239296555519104,0.05055434629321098,0.04795658588409424,0.057423245161771774,0.046388328075408936,0.7465599775314331,0.5585950016975403,0.02023131214082241,0.0475764274597168,0.1286740005016327,0.1835920214653015,0.008582886308431625,0.032453835010528564,0.07654549926519394,0.10979831218719482,0.02023131214082241,0.0475764274597168,0.007099427282810211,0.03293585777282715,0.007099427282810211,0.03293585777282715,0.019007263705134392,0.0475764274597168,0.007099427282810211,0.03293585777282715,0.04933033511042595,0.10979831218719482,0.0032250001095235348,0.6835929751396179,0.061973001807928085,0.647022008895874,0.01900731585919857,0.07694333791732788,0.02333913929760456,0.08005183935165405,0.01900731585919857,0.07694333791732788,0.007533375173807144,0.01385188102722168,0.05799407511949539,0.10979831218719482,0.1874990016222,0.22021400928497314,0.007533375173807144,0.015411734580993652,0.02023131214082241,0.07694333791732788,0.6296669840812683,0.4335930347442627,0.06788180023431778,0.10979831218719482,0.04482320323586464,0.04638856649398804,0.018139563500881195,0.032937586307525635,0.018139563500881195,0.032937586307525635,0.018139563500881195,0.032937586307525635,0.1875009983778,0.14697301387786865,0.0850236713886261,0.03930848836898804,0.1056443378329277,0.08043169975280762,0.1056443378329277,0.08043169975280762,0.07654549926519394,0.08043128252029419,0.07654549926519394,0.08043128252029419,0.0850236713886261,0.04638838768005371,0.07221363484859467,0.10979831218719482,0.07221363484859467,0.10979831218719482,0.09820473194122314,0.08043169975280762,0.09820473194122314,0.08043169975280762,0.5625010132789612,0.02186000347137451,0.044998399913311005,0.0773230791091919,0.09698063135147095,0.04795682430267334,0.023583319038152695,0.031675636768341064,0.044998399913311005,0.0773230791091919,0.09698063135147095,0.04795682430267334,0.24626600742340088,0.6835960149765015,0.023583319038152695,0.031675636768341064,0.0850236713886261,0.044828593730926514,0.437734991312027,0.46996796131134033,0.036334652453660965,0.08005297183990479,0.036334652453660965,0.08005297183990479,0.07098956406116486,0.10979831218719482,0.006182555109262466,0.031673967838287354,0.05055436119437218,0.10979831218719482,0.3786180019378662,0.1835920214653015,0.08398512005805969,0.10979831218719482,0.08398512005805969,0.10979831218719482,0.05055436119437218,0.10979831218719482,0.03930313140153885,0.04638850688934326,0.04482320323586464,0.008966565132141113,0.04482320323586464,0.008966565132141113,0.6875,0.4695960283279419,0.02358332648873329,0.013669490814208984,0.04086293280124664,0.04638850688934326,0.04086293280124664,0.04638850688934326,0.024934161454439163,0.012889564037322998,0.0625,0.3453270196914673,0.11106422543525696,0.04638880491256714,0.018139638006687164,0.04338186979293823,0.018139638006687164,0.04338186979293823,0.07654549926519394,0.07732349634170532,0.04086294770240784,0.008966505527496338,0.0034920000471174717,0.3085939884185791,0.018139638006687164,0.04338186979293823,0.007533375173807144,0.008331894874572754,0.6874989867210388,0.21995800733566284,0.05366221442818642,0.07732349634170532,0.028895026072859764,0.07694411277770996,0.05366221442818642,0.07732349634170532,0.028895026072859764,0.07694411277770996,0.06294332444667816,0.04638826847076416,0.1875,0.34528303146362305,0.027670973911881447,0.07694411277770996,0.006182555109262466,0.009111762046813965,0.07398355007171631,0.04638838768005371,0.12210451066493988,0.046389102935791016,0.12210451066493988,0.046389102935791016,0.12875600159168243,0.5585910081863403,0.07398355007171631,0.04638838768005371,0.006182555109262466,0.03815799951553345,0.06250099837779999,0.39662301540374756,0.0905437171459198,0.04638838768005371,0.040666673332452774,0.10979831218719482,0.040666673332452774,0.10979831218719482,0.0905437171459198,0.04638838768005371,0.012844454497098923,0.009891688823699951,0.011493615806102753,0.009111762046813965,0.4374989867210388,0.5956270098686218,0.08520913124084473,0.08043140172958374,0.08520913124084473,0.08043140172958374,0.04189063608646393,0.10979831218719482,0.008582908660173416,0.03893798589706421,0.11814413964748383,0.04638892412185669,0.6284400224685669,0.5585929751396179,0.10158386081457138,0.00896674394607544,0.10158386081457138,0.00896674394607544,0.11814413964748383,0.04638892412185669,0.06232590600848198,0.10979831218719482,0.04638301953673363,0.04638856649398804,0.04638301953673363,0.04638856649398804,0.7463849782943726,0.058596014976501465,0.06232590600848198,0.10979831218719482,0.01722273975610733,0.031675636768341064,0.04189063608646393,0.08043086528778076,0.04189063608646393,0.08043086528778076,0.0635499358177185,0.10979831218719482,0.3780120015144348,0.5585929751396179,0.018139611929655075,0.030413687229156494,0.018139611929655075,0.030413687229156494,0.017222747206687927,0.038159728050231934,0.08954101800918579,0.047956764698028564,0.7459149956703186,0.18359500169754028,0.05366213247179985,0.04795628786087036,0.017222747206687927,0.038159728050231934,0.023583341389894485,0.04464375972747803,0.25325098633766174,0.18358999490737915,0.0795036107301712,0.04638838768005371,0.10253656655550003,0.08043175935745239,0.10253656655550003,0.08043175935745239,0.0795036107301712,0.04638838768005371,0.08087733387947083,0.07732349634170532,0.10710396617650986,0.008966803550720215,0.10710396617650986,0.008966803550720215,0.5624989867210388,0.5953620076179504,0.01962309330701828,0.014449357986450195,0.025983653962612152,0.02597147226333618,0.025983653962612152,0.02597147226333618,0.10131251811981201,0.04795682430267334,0.5034360289573669,0.5585929751396179,0.08087733387947083,0.04795646667480469,0.08087733387947083,0.04795646667480469,0.10131251811981201,0.04795682430267334,0.37854599952697754,0.4331200122833252,0.01326248049736023,0.04590487480163574,0.019313467666506767,0.08005118370056152,0.03664000332355499,0.10979831218719482,0.019313467666506767,0.08005118370056152,0.029636148363351822,0.018707633018493652,0.25348299741744995,0.3081200122833252,0.02889440953731537,0.019728541374206543,0.024257240816950798,0.10979831218719482,0.02797701396048069,0.10979831218719482,0.02797701396048069,0.10979831218719482,0.02889440953731537,0.01894855499267578,0.028589049354195595,0.10979831218719482,0.621649980545044,0.18359601497650146,0.02889440953731537,0.01894855499267578,0.019925372675061226,0.08005118370056152,0.561972975730896,0.22008800506591797,0.02889503724873066,0.08005237579345703,0.02889503724873066,0.08005237579345703,0.007533404976129532,0.02645176649093628,0.06788178533315659,0.07732349634170532,0.06788178533315659,0.07732349634170532,0.007533404976129532,0.024891972541809082,0.06665770709514618,0.07732349634170532,0.3125,0.0952489972114563,0.09264882653951645,0.08043169975280762,0.0036299999337643385,0.5585929751396179,0.04622241482138634,0.08043122291564941,0.03200281038880348,0.047577738761901855,0.024500224739313126,0.03942161798477173,0.12137000262737274,0.5585950016975403,0.024563191458582878,0.047576963901519775,0.059218067675828934,0.07732349634170532,0.01962307095527649,0.025971412658691406],\n \"normalized\": false\n }\n },\n \"index\": {\n \"type\": \"Uint16Array\",\n \"array\": [28,234,182,303,269,285,521,391,482,142,593,355,209,84,89,440,512,467,168,146,454,320,118,222,535,280,109,40,32,563,488,479,398,419,273,186,541,74,78,326,69,331,240,435,295,473,26,178,626,53,309,51,436,448,96,97,103,255,422,45,5,618,615,65,508,264,284,376,373,315,160,632,550,126,237,254,61,366,499,344,348,165,408,414,557,201,576,506,431,365,329,95,140,145,406,36,578,572,486,16,302,296,72,59,68,158,163,169,177,179,603,62,594,0,393,48,489,352,350,76,543,346,534,378,197,437,528,417,42,480,477,212,613,173,607,230,223,635,595,102,111,555,432,556,494,507,232,86,289,218,314,121,100,244,30,27,407,252,259,304,55,325,157,147,374,396,11,154,14,270,41,271,279,122,330,129,341,522,281,525,624,82,621,427,421,387,199,447,438,495,260,511,80,313,85,573,552,560,501,426,429,43,410,258,187,389,420,248,424,390,493,445,465,347,540,77,411,131,251,462,474,481,12,565,155,150,283,372,490,217,392,587,71,66,386,402,144,161,453,634,58,363,367,94,597,141,277,238,125,3,600,8,136,319,98,300,498,233,17,538,345,324,202,115,394,548,49,318,220,119,33,456,143,335,56,128,39,225,460,91,336,134,198,567,575,361,537,107,383,166,416,404,562,35,189,123,192,211,174,610,116,101,120,208,397,478,515,559,434,226,321,221,306,311,54,620,612,614,369,257,253,291,554,235,139,586,327,245,524,531,268,216,287,569,520,484,23,513,243,622,204,625,1,604,64,545,379,439,592,263,356,509,181,231,25,184,172,297,242,293,503,276,272,405,526,151,159,337,164,28,298,234,303,227,269,521,247,391,142,598,593,209,608,84,468,464,451,450,444,470,168,384,146,320,117,118,535,581,280,40,461,32,488,463,479,419,505,273,541,360,74,326,585,69,240,514,435,473,472,26,626,206,53,51,547,436,96,137,97,255,430,422,5,10,618,65,602,508,284,570,376,315,628,160,550,191,126,254,130,61,499,18,344,165,338,408,557,441,201,358,106,364,110,502,370,185,195,487,194,577,485,239,583,292,579,21,290,79,584,357,354,265,351,46,250,529,533,381,413,616,609,175,457,458,635,458,230,635,112,207,9,6,596,113,219,400,90,87,308,288,371,549,152,153,561,148,396,215,11,631,135,342,132,332,340,200,443,446,496,349,261,81,627,310,574,193,553,504,418,425,47,415,409,190,483,388,246,44,423,492,50,449,347,343,540,412,339,127,466,469,476,15,38,564,150,527,283,491,399,213,588,75,70,385,530,403,162,171,452,60,73,359,93,105,601,275,580,236,2,590,599,133,630,317,299,19,497,20,582,536,323,52,205,395,156,544,316,633,224,34,459,455,333,67,57,37,266,229,92,328,334,196,377,571,362,542,539,382,170,167,401,149,566,188,274,124,210,475,176,114,104,99,208,88,397,516,442,558,228,307,322,305,286,312,619,83,611,368,428,256,294,433,551,138,353,589,249,518,523,267,13,214,568,282,519,22,471,517,623,7,203,4,617,606,546,375,380,591,63,262,510,605,180,24,31,183,301,29,241,500,108,278,405,532,526,159,629,337]\n },\n \"boundingSphere\": {\n \"center\": [0,0,-0.00000762939453125],\n \"radius\": 160.50603975869993\n }\n },\n faceValues: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30],\n rotationCombinations: {\n \"1,2\": [-58, -18, -148],\n \"1,3\": [122, -18, 32],\n \"1,4\": [-159, 30, -69],\n \"1,5\": [21, 150, -69],\n \"1,6\": [21, -30, 69],\n \"1,7\": [0, 90, -90],\n \"1,8\": [122, 18, -32],\n \"1,9\": [-58, 126, 32],\n \"1,10\": [58, 54, 148],\n \"1,11\": [-122, -18, -32],\n \"1,12\": [159, 30, 69],\n \"1,13\": [58, 54, -32],\n \"1,14\": [-58, 54, 32],\n \"1,15\": [90, 0, 90],\n \"1,16\": [-90, 0, -90],\n \"1,17\": [122, 54, 32],\n \"1,18\": [-122, 54, -32],\n \"1,19\": [-21, 30, 69],\n \"1,20\": [58, -18, -32],\n \"1,21\": [58, 126, -32],\n \"1,22\": [-58, 54, -148],\n \"1,23\": [-58, 18, -32],\n \"1,24\": [0, 90, 90],\n \"1,25\": [-21, 30, -111],\n \"1,26\": [21, 30, 111],\n \"1,27\": [-21, -150, -69],\n \"1,28\": [-58, -18, 32],\n \"1,29\": [58, 18, 32],\n \"1,30\": [-180, 0, 0],\n \"2,3\": [-21, 150, 69],\n \"2,4\": [-58, -126, -32],\n \"2,5\": [122, -54, -32],\n \"2,6\": [-58, 54, -148],\n \"2,7\": [-122, -54, 32],\n \"2,8\": [0, -180, 0],\n \"2,9\": [-159, -30, 69],\n \"2,10\": [-122, -18, -32],\n \"2,11\": [58, -18, 148],\n \"2,12\": [159, -30, -69],\n \"2,13\": [58, -162, -32],\n \"2,14\": [-58, -54, 148],\n \"2,15\": [-159, 30, -69],\n \"2,16\": [21, -30, 69],\n \"2,17\": [21, -150, 69],\n \"2,18\": [0, -90, 90],\n \"2,19\": [-58, -18, -148],\n \"2,20\": [58, 126, -32],\n \"2,21\": [0, -90, -90],\n \"2,22\": [-58, -54, -32],\n \"2,23\": [-21, -30, 111],\n \"2,24\": [58, -126, 32],\n \"2,25\": [-58, -18, 32],\n \"2,26\": [-90, 0, -90],\n \"2,27\": [122, 18, -32],\n \"2,28\": [0, 0, -180],\n \"2,29\": [58, 162, 32],\n \"2,30\": [-58, -162, 32],\n \"3,4\": [90, 0, -90],\n \"3,5\": [90, 0, 90],\n \"3,6\": [-90, 0, 90],\n \"3,7\": [122, 54, 32],\n \"3,8\": [21, 30, -69],\n \"3,9\": [58, 54, 148],\n \"3,10\": [0, 90, 90],\n \"3,11\": [122, -54, -32],\n \"3,12\": [58, 18, 32],\n \"3,13\": [0, 90, -90],\n \"3,14\": [159, 30, 69],\n \"3,15\": [-21, 30, 69],\n \"3,16\": [159, -30, -69],\n \"3,17\": [58, 54, -32],\n \"3,18\": [122, 18, -32],\n \"3,19\": [21, 150, -69],\n \"3,20\": [-58, 18, -32],\n \"3,21\": [-58, 162, -32],\n \"3,22\": [-21, 150, 69],\n \"3,23\": [180, 0, 0],\n \"3,24\": [-58, 126, 32],\n \"3,25\": [-159, 30, -69],\n \"3,26\": [58, 126, -32],\n \"3,27\": [21, -30, 69],\n \"3,28\": [-159, -30, 69],\n \"3,29\": [-58, 54, 32],\n \"3,30\": [58, -18, -32],\n \"4,5\": [0, 0, 180],\n \"4,6\": [180, 0, 0],\n \"4,7\": [-58, 18, 148],\n \"4,8\": [-58, -54, -32],\n \"4,9\": [-58, -18, -148],\n \"4,10\": [-90, 0, 90],\n \"4,11\": [58, 18, 32],\n \"4,12\": [-21, -30, 111],\n \"4,13\": [-90, 0, -90],\n \"4,14\": [-58, 54, -148],\n \"4,15\": [-122, -54, 32],\n \"4,16\": [58, 54, -32],\n \"4,17\": [-58, -18, 32],\n \"4,18\": [-21, 30, 69],\n \"4,19\": [-122, 54, -32],\n \"4,20\": [21, -150, 69],\n \"4,21\": [-21, 30, -111],\n \"4,22\": [-58, 54, 32],\n \"4,23\": [0, 90, 90],\n \"4,24\": [-58, 18, -32],\n \"4,25\": [58, 126, -32],\n \"4,26\": [-122, 18, 32],\n \"4,27\": [58, -54, -148],\n \"4,28\": [122, 54, 32],\n \"4,29\": [-122, -18, -32],\n \"4,30\": [21, -30, 69],\n \"5,6\": [0, 180, 0],\n \"5,7\": [58, -18, -32],\n \"5,8\": [58, 54, 148],\n \"5,9\": [58, 18, 32],\n \"5,10\": [90, 0, -90],\n \"5,11\": [-58, -18, -148],\n \"5,12\": [21, 30, -69],\n \"5,13\": [90, 0, 90],\n \"5,14\": [58, -54, 32],\n \"5,15\": [-58, 126, 32],\n \"5,16\": [-58, -54, 148],\n \"5,17\": [58, 18, -148],\n \"5,18\": [21, -30, -111],\n \"5,19\": [-58, -126, -32],\n \"5,20\": [159, 30, 69],\n \"5,21\": [21, -30, 69],\n \"5,22\": [58, -54, -148],\n \"5,23\": [0, -90, -90],\n \"5,24\": [58, -18, 148],\n \"5,25\": [122, -54, -32],\n \"5,26\": [-58, -162, 32],\n \"5,27\": [-58, 54, 32],\n \"5,28\": [58, -126, 32],\n \"5,29\": [-58, 162, -32],\n \"5,30\": [-21, 30, -111],\n \"6,7\": [-58, 162, -32],\n \"6,8\": [122, -54, -32],\n \"6,9\": [-58, -162, 32],\n \"6,10\": [90, 0, 90],\n \"6,11\": [-122, 18, 32],\n \"6,12\": [-21, -150, -69],\n \"6,13\": [90, 0, -90],\n \"6,14\": [-58, 126, 32],\n \"6,15\": [58, -54, 32],\n \"6,16\": [-122, 54, -32],\n \"6,17\": [122, -18, 32],\n \"6,18\": [159, 30, 69],\n \"6,19\": [58, 54, -32],\n \"6,20\": [21, -30, -111],\n \"6,21\": [-21, 150, 69],\n \"6,22\": [122, 54, 32],\n \"6,23\": [0, 90, -90],\n \"6,24\": [122, 18, -32],\n \"6,25\": [58, 54, 148],\n \"6,26\": [58, 18, 32],\n \"6,27\": [58, -126, 32],\n \"6,28\": [-58, 54, 32],\n \"6,29\": [58, -18, -32],\n \"6,30\": [-159, -30, 69],\n \"7,8\": [-58, 54, -148],\n \"7,9\": [-21, 30, 69],\n \"7,10\": [21, 30, -69],\n \"7,11\": [58, -126, 32],\n \"7,12\": [-58, 18, -32],\n \"7,13\": [21, 30, 111],\n \"7,14\": [21, -30, 69],\n \"7,15\": [0, 90, -90],\n \"7,16\": [0, -90, -90],\n \"7,17\": [-21, 30, -111],\n \"7,18\": [-21, -30, -69],\n \"7,19\": [58, -18, 148],\n \"7,20\": [122, 54, 32],\n \"7,21\": [-21, -30, 111],\n \"7,22\": [21, -30, -111],\n \"7,23\": [58, -54, 32],\n \"7,24\": [0, 0, 180],\n \"7,25\": [58, -18, -32],\n \"7,26\": [58, 18, -148],\n \"7,27\": [-122, 18, 32],\n \"7,28\": [-58, -126, -32],\n \"7,29\": [58, 54, 148],\n \"7,30\": [-90, 0, -90],\n \"8,9\": [-21, 30, -111],\n \"8,10\": [-58, 18, 148],\n \"8,11\": [122, 18, -32],\n \"8,12\": [21, 30, 111],\n \"8,13\": [-58, 18, -32],\n \"8,14\": [-122, 54, -32],\n \"8,15\": [-21, -30, 111],\n \"8,16\": [-21, 150, 69],\n \"8,17\": [-21, 30, 69],\n \"8,18\": [0, 90, 90],\n \"8,19\": [-122, 18, 32],\n \"8,20\": [-58, -54, -32],\n \"8,21\": [0, 90, -90],\n \"8,22\": [58, 126, -32],\n \"8,23\": [-159, 30, -69],\n \"8,24\": [-58, 54, 32],\n \"8,25\": [58, 162, 32],\n \"8,26\": [-90, 0, 90],\n \"8,27\": [58, -18, 148],\n \"8,28\": [180, 0, 0],\n \"8,29\": [-58, -18, 32],\n \"8,30\": [58, 18, 32],\n \"9,10\": [21, -30, -111],\n \"9,11\": [58, 162, 32],\n \"9,12\": [-21, 30, -111],\n \"9,13\": [21, -30, 69],\n \"9,14\": [-58, -54, -32],\n \"9,15\": [58, 18, -148],\n \"9,16\": [58, -162, -32],\n \"9,17\": [0, 0, -180],\n \"9,18\": [-58, -18, -148],\n \"9,19\": [0, -90, 90],\n \"9,20\": [90, 0, 90],\n \"9,21\": [-58, -18, 32],\n \"9,22\": [-58, -54, 148],\n \"9,23\": [58, -126, 32],\n \"9,24\": [-21, -30, 111],\n \"9,25\": [0, -90, -90],\n \"9,26\": [58, -54, -148],\n \"9,27\": [0, 90, -90],\n \"9,28\": [21, -150, 69],\n \"9,29\": [58, -18, 148],\n \"9,30\": [-58, 54, -148],\n \"10,11\": [-21, -150, -69],\n \"10,12\": [-58, -54, -32],\n \"10,13\": [0, 0, 180],\n \"10,14\": [58, -18, 148],\n \"10,15\": [-58, 18, -32],\n \"10,16\": [122, -18, 32],\n \"10,17\": [-21, -30, -69],\n \"10,18\": [58, -54, 32],\n \"10,19\": [58, 18, -148],\n \"10,20\": [-58, 54, -148],\n \"10,21\": [58, -54, -148],\n \"10,22\": [58, -18, -32],\n \"10,23\": [90, 0, 90],\n \"10,24\": [21, -30, -111],\n \"10,25\": [58, 18, 32],\n \"10,26\": [21, 30, -69],\n \"10,27\": [-122, -18, -32],\n \"10,28\": [-58, 162, -32],\n \"10,29\": [-21, 30, -111],\n \"10,30\": [58, -126, 32],\n \"11,12\": [-90, 0, 90],\n \"11,13\": [-159, 30, -69],\n \"11,14\": [0, 90, 90],\n \"11,15\": [-159, -30, 69],\n \"11,16\": [21, 30, -69],\n \"11,17\": [-122, 18, 32],\n \"11,18\": [-58, 54, 32],\n \"11,19\": [122, 54, 32],\n \"11,20\": [159, -30, -69],\n \"11,21\": [-58, 54, -148],\n \"11,22\": [0, 90, -90],\n \"11,23\": [58, 54, -32],\n \"11,24\": [-122, 54, -32],\n \"11,25\": [-58, 126, 32],\n \"11,26\": [159, 30, 69],\n \"11,27\": [-58, -54, 148],\n \"11,28\": [58, 18, 32],\n \"11,29\": [-180, 0, 0],\n \"11,30\": [-58, -18, 32],\n \"12,13\": [58, 54, 148],\n \"12,14\": [90, 0, 90],\n \"12,15\": [-58, 54, 32],\n \"12,16\": [122, -54, -32],\n \"12,17\": [21, 30, -69],\n \"12,18\": [58, -18, -32],\n \"12,19\": [-58, 162, -32],\n \"12,20\": [-122, 54, -32],\n \"12,21\": [58, -18, 148],\n \"12,22\": [90, 0, -90],\n \"12,23\": [122, -18, 32],\n \"12,24\": [58, 18, -148],\n \"12,25\": [122, 18, -32],\n \"12,26\": [-58, 126, 32],\n \"12,27\": [-58, -18, 32],\n \"12,28\": [-21, -150, -69],\n \"12,29\": [0, 90, -90],\n \"12,30\": [-21, -30, -69],\n \"13,14\": [-58, 18, -32],\n \"13,15\": [58, -18, 148],\n \"13,16\": [58, 162, 32],\n \"13,17\": [21, 30, 111],\n \"13,18\": [-58, 54, -148],\n \"13,19\": [-58, -18, 32],\n \"13,20\": [58, -54, 32],\n \"13,21\": [-58, 54, 32],\n \"13,22\": [-58, 18, 148],\n \"13,23\": [-90, 0, -90],\n \"13,24\": [-21, 30, 69],\n \"13,25\": [-58, -18, -148],\n \"13,26\": [-21, -30, 111],\n \"13,27\": [-58, 162, -32],\n \"13,28\": [-122, -18, -32],\n \"13,29\": [21, -30, 69],\n \"13,30\": [122, 54, 32],\n \"14,15\": [-58, 162, -32],\n \"14,16\": [-58, -18, -148],\n \"14,17\": [58, 54, 148],\n \"14,18\": [-21, 30, -111],\n \"14,19\": [21, -30, 69],\n \"14,20\": [122, -18, 32],\n \"14,21\": [-21, 30, 69],\n \"14,22\": [0, 0, 180],\n \"14,23\": [-21, -30, -69],\n \"14,24\": [21, 30, 111],\n \"14,25\": [21, -30, -111],\n \"14,26\": [58, -18, 148],\n \"14,27\": [21, 150, -69],\n \"14,28\": [-58, -54, -32],\n \"14,29\": [90, 0, 90],\n \"14,30\": [-122, 54, -32],\n \"15,16\": [180, 0, 0],\n \"15,17\": [58, -18, -32],\n \"15,18\": [122, -18, 32],\n \"15,19\": [-58, 126, 32],\n \"15,20\": [-21, 30, -111],\n \"15,21\": [-58, -162, 32],\n \"15,22\": [122, 18, -32],\n \"15,23\": [159, 30, 69],\n \"15,24\": [90, 0, -90],\n \"15,25\": [122, 54, 32],\n \"15,26\": [58, 54, -32],\n \"15,27\": [-58, -54, -32],\n \"15,28\": [21, 150, -69],\n \"15,29\": [21, 30, -69],\n \"15,30\": [0, -90, -90],\n \"16,17\": [-122, -18, -32],\n \"16,18\": [-58, -18, 32],\n \"16,19\": [-58, 54, -148],\n \"16,20\": [-21, 150, 69],\n \"16,21\": [-58, -18, -148],\n \"16,22\": [-58, 18, -32],\n \"16,23\": [-21, 30, 69],\n \"16,24\": [-90, 0, -90],\n \"16,25\": [-58, 54, 32],\n \"16,26\": [-122, 54, -32],\n \"16,27\": [122, -54, -32],\n \"16,28\": [21, 30, 111],\n \"16,29\": [-159, 30, -69],\n \"16,30\": [0, -90, 90],\n \"17,18\": [58, 18, 32],\n \"17,19\": [0, 90, -90],\n \"17,20\": [-90, 0, -90],\n \"17,21\": [58, 18, -148],\n \"17,22\": [58, 54, -32],\n \"17,23\": [122, 54, 32],\n \"17,24\": [21, 30, -69],\n \"17,25\": [0, 90, 90],\n \"17,26\": [-58, 54, 32],\n \"17,27\": [0, -90, 90],\n \"17,28\": [159, 30, 69],\n \"17,29\": [-58, 18, -32],\n \"17,30\": [58, -54, 32],\n \"18,19\": [58, 54, 148],\n \"18,20\": [-159, 30, -69],\n \"18,21\": [0, 0, -180],\n \"18,22\": [21, 30, -69],\n \"18,23\": [58, 18, 32],\n \"18,24\": [-21, 30, -111],\n \"18,25\": [58, 54, -32],\n \"18,26\": [0, 90, -90],\n \"18,27\": [-122, -54, 32],\n \"18,28\": [90, 0, 90],\n \"18,29\": [-122, 54, -32],\n \"18,30\": [-58, -54, -32],\n \"19,20\": [0, -90, -90],\n \"19,21\": [58, 54, -32],\n \"19,22\": [21, 30, 111],\n \"19,23\": [-21, 30, -111],\n \"19,24\": [58, 18, 32],\n \"19,25\": [0, 0, 180],\n \"19,26\": [21, -30, 69],\n \"19,27\": [0, 180, 0],\n \"19,28\": [-58, 18, -32],\n \"19,29\": [58, -54, 32],\n \"19,30\": [159, 30, 69],\n \"20,21\": [21, 150, -69],\n \"20,22\": [58, 162, 32],\n \"20,23\": [-122, -18, -32],\n \"20,24\": [58, 126, -32],\n \"20,25\": [-90, 0, -90],\n \"20,26\": [-58, 18, 148],\n \"20,27\": [90, 0, 90],\n \"20,28\": [-122, -54, 32],\n \"20,29\": [-21, 30, 69],\n \"20,30\": [122, 18, -32],\n \"21,22\": [-21, -30, 111],\n \"21,23\": [-58, -18, -148],\n \"21,24\": [21, -30, 69],\n \"21,25\": [-58, -54, 148],\n \"21,26\": [0, -90, 90],\n \"21,27\": [-58, 126, 32],\n \"21,28\": [-90, 0, -90],\n \"21,29\": [-58, -126, -32],\n \"21,30\": [58, 54, 148],\n \"22,23\": [21, 30, 111],\n \"22,24\": [-21, -30, -69],\n \"22,25\": [-21, 30, 69],\n \"22,26\": [-58, 18, -32],\n \"22,27\": [159, -30, -69],\n \"22,28\": [58, 54, 148],\n \"22,29\": [-90, 0, -90],\n \"22,30\": [-58, -126, -32],\n \"23,24\": [-58, 54, -148],\n \"23,25\": [21, 30, -69],\n \"23,26\": [58, 54, 148],\n \"23,27\": [-159, -30, 69],\n \"23,28\": [21, -30, 69],\n \"23,29\": [122, 54, 32],\n \"23,30\": [-122, -18, -32],\n \"24,25\": [-58, 18, 148],\n \"24,26\": [-58, -18, 32],\n \"24,27\": [-58, -162, 32],\n \"24,28\": [-122, 54, -32],\n \"24,29\": [-58, -54, -32],\n \"24,30\": [90, 0, 90],\n \"25,26\": [-21, 30, -111],\n \"25,27\": [-180, 0, 0],\n \"25,28\": [58, -18, 148],\n \"25,29\": [-58, 54, -148],\n \"25,30\": [21, -150, 69],\n \"26,27\": [21, -150, 69],\n \"26,28\": [0, 90, -90],\n \"26,29\": [-21, -30, -69],\n \"26,30\": [-21, -150, -69],\n \"27,28\": [58, -162, -32],\n \"27,29\": [-58, 126, 32],\n \"27,30\": [21, -30, -111],\n \"28,29\": [122, -18, 32],\n \"28,30\": [-122, 18, 32],\n \"29,30\": [122, -18, 32]\n }\n }\n};\n","/**\n * @license\n * Copyright 2010-2023 Three.js Authors\n * SPDX-License-Identifier: MIT\n */\nconst REVISION = '149';\nconst MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 };\nconst TOUCH = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 };\nconst CullFaceNone = 0;\nconst CullFaceBack = 1;\nconst CullFaceFront = 2;\nconst CullFaceFrontBack = 3;\nconst BasicShadowMap = 0;\nconst PCFShadowMap = 1;\nconst PCFSoftShadowMap = 2;\nconst VSMShadowMap = 3;\nconst FrontSide = 0;\nconst BackSide = 1;\nconst DoubleSide = 2;\nconst TwoPassDoubleSide = 2; // r149\nconst NoBlending = 0;\nconst NormalBlending = 1;\nconst AdditiveBlending = 2;\nconst SubtractiveBlending = 3;\nconst MultiplyBlending = 4;\nconst CustomBlending = 5;\nconst AddEquation = 100;\nconst SubtractEquation = 101;\nconst ReverseSubtractEquation = 102;\nconst MinEquation = 103;\nconst MaxEquation = 104;\nconst ZeroFactor = 200;\nconst OneFactor = 201;\nconst SrcColorFactor = 202;\nconst OneMinusSrcColorFactor = 203;\nconst SrcAlphaFactor = 204;\nconst OneMinusSrcAlphaFactor = 205;\nconst DstAlphaFactor = 206;\nconst OneMinusDstAlphaFactor = 207;\nconst DstColorFactor = 208;\nconst OneMinusDstColorFactor = 209;\nconst SrcAlphaSaturateFactor = 210;\nconst NeverDepth = 0;\nconst AlwaysDepth = 1;\nconst LessDepth = 2;\nconst LessEqualDepth = 3;\nconst EqualDepth = 4;\nconst GreaterEqualDepth = 5;\nconst GreaterDepth = 6;\nconst NotEqualDepth = 7;\nconst MultiplyOperation = 0;\nconst MixOperation = 1;\nconst AddOperation = 2;\nconst NoToneMapping = 0;\nconst LinearToneMapping = 1;\nconst ReinhardToneMapping = 2;\nconst CineonToneMapping = 3;\nconst ACESFilmicToneMapping = 4;\nconst CustomToneMapping = 5;\n\nconst UVMapping = 300;\nconst CubeReflectionMapping = 301;\nconst CubeRefractionMapping = 302;\nconst EquirectangularReflectionMapping = 303;\nconst EquirectangularRefractionMapping = 304;\nconst CubeUVReflectionMapping = 306;\nconst RepeatWrapping = 1000;\nconst ClampToEdgeWrapping = 1001;\nconst MirroredRepeatWrapping = 1002;\nconst NearestFilter = 1003;\nconst NearestMipmapNearestFilter = 1004;\nconst NearestMipMapNearestFilter = 1004;\nconst NearestMipmapLinearFilter = 1005;\nconst NearestMipMapLinearFilter = 1005;\nconst LinearFilter = 1006;\nconst LinearMipmapNearestFilter = 1007;\nconst LinearMipMapNearestFilter = 1007;\nconst LinearMipmapLinearFilter = 1008;\nconst LinearMipMapLinearFilter = 1008;\nconst UnsignedByteType = 1009;\nconst ByteType = 1010;\nconst ShortType = 1011;\nconst UnsignedShortType = 1012;\nconst IntType = 1013;\nconst UnsignedIntType = 1014;\nconst FloatType = 1015;\nconst HalfFloatType = 1016;\nconst UnsignedShort4444Type = 1017;\nconst UnsignedShort5551Type = 1018;\nconst UnsignedInt248Type = 1020;\nconst AlphaFormat = 1021;\nconst RGBAFormat = 1023;\nconst LuminanceFormat = 1024;\nconst LuminanceAlphaFormat = 1025;\nconst DepthFormat = 1026;\nconst DepthStencilFormat = 1027;\nconst RedFormat = 1028;\nconst RedIntegerFormat = 1029;\nconst RGFormat = 1030;\nconst RGIntegerFormat = 1031;\nconst RGBAIntegerFormat = 1033;\n\nconst RGB_S3TC_DXT1_Format = 33776;\nconst RGBA_S3TC_DXT1_Format = 33777;\nconst RGBA_S3TC_DXT3_Format = 33778;\nconst RGBA_S3TC_DXT5_Format = 33779;\nconst RGB_PVRTC_4BPPV1_Format = 35840;\nconst RGB_PVRTC_2BPPV1_Format = 35841;\nconst RGBA_PVRTC_4BPPV1_Format = 35842;\nconst RGBA_PVRTC_2BPPV1_Format = 35843;\nconst RGB_ETC1_Format = 36196;\nconst RGB_ETC2_Format = 37492;\nconst RGBA_ETC2_EAC_Format = 37496;\nconst RGBA_ASTC_4x4_Format = 37808;\nconst RGBA_ASTC_5x4_Format = 37809;\nconst RGBA_ASTC_5x5_Format = 37810;\nconst RGBA_ASTC_6x5_Format = 37811;\nconst RGBA_ASTC_6x6_Format = 37812;\nconst RGBA_ASTC_8x5_Format = 37813;\nconst RGBA_ASTC_8x6_Format = 37814;\nconst RGBA_ASTC_8x8_Format = 37815;\nconst RGBA_ASTC_10x5_Format = 37816;\nconst RGBA_ASTC_10x6_Format = 37817;\nconst RGBA_ASTC_10x8_Format = 37818;\nconst RGBA_ASTC_10x10_Format = 37819;\nconst RGBA_ASTC_12x10_Format = 37820;\nconst RGBA_ASTC_12x12_Format = 37821;\nconst RGBA_BPTC_Format = 36492;\nconst RED_RGTC1_Format = 36283;\nconst SIGNED_RED_RGTC1_Format = 36284;\nconst RED_GREEN_RGTC2_Format = 36285;\nconst SIGNED_RED_GREEN_RGTC2_Format = 36286;\nconst LoopOnce = 2200;\nconst LoopRepeat = 2201;\nconst LoopPingPong = 2202;\nconst InterpolateDiscrete = 2300;\nconst InterpolateLinear = 2301;\nconst InterpolateSmooth = 2302;\nconst ZeroCurvatureEnding = 2400;\nconst ZeroSlopeEnding = 2401;\nconst WrapAroundEnding = 2402;\nconst NormalAnimationBlendMode = 2500;\nconst AdditiveAnimationBlendMode = 2501;\nconst TrianglesDrawMode = 0;\nconst TriangleStripDrawMode = 1;\nconst TriangleFanDrawMode = 2;\nconst LinearEncoding = 3000;\nconst sRGBEncoding = 3001;\nconst BasicDepthPacking = 3200;\nconst RGBADepthPacking = 3201;\nconst TangentSpaceNormalMap = 0;\nconst ObjectSpaceNormalMap = 1;\n\n// Color space string identifiers, matching CSS Color Module Level 4 and WebGPU names where available.\nconst NoColorSpace = '';\nconst SRGBColorSpace = 'srgb';\nconst LinearSRGBColorSpace = 'srgb-linear';\n\nconst ZeroStencilOp = 0;\nconst KeepStencilOp = 7680;\nconst ReplaceStencilOp = 7681;\nconst IncrementStencilOp = 7682;\nconst DecrementStencilOp = 7683;\nconst IncrementWrapStencilOp = 34055;\nconst DecrementWrapStencilOp = 34056;\nconst InvertStencilOp = 5386;\n\nconst NeverStencilFunc = 512;\nconst LessStencilFunc = 513;\nconst EqualStencilFunc = 514;\nconst LessEqualStencilFunc = 515;\nconst GreaterStencilFunc = 516;\nconst NotEqualStencilFunc = 517;\nconst GreaterEqualStencilFunc = 518;\nconst AlwaysStencilFunc = 519;\n\nconst StaticDrawUsage = 35044;\nconst DynamicDrawUsage = 35048;\nconst StreamDrawUsage = 35040;\nconst StaticReadUsage = 35045;\nconst DynamicReadUsage = 35049;\nconst StreamReadUsage = 35041;\nconst StaticCopyUsage = 35046;\nconst DynamicCopyUsage = 35050;\nconst StreamCopyUsage = 35042;\n\nconst GLSL1 = '100';\nconst GLSL3 = '300 es';\n\nconst _SRGBAFormat = 1035; // fallback for WebGL 1\n\n/**\n * https://github.com/mrdoob/eventdispatcher.js/\n */\n\nclass EventDispatcher {\n\n\taddEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\tlisteners[ type ] = [];\n\n\t\t}\n\n\t\tif ( listeners[ type ].indexOf( listener ) === - 1 ) {\n\n\t\t\tlisteners[ type ].push( listener );\n\n\t\t}\n\n\t}\n\n\thasEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) return false;\n\n\t\tconst listeners = this._listeners;\n\n\t\treturn listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== - 1;\n\n\t}\n\n\tremoveEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) return;\n\n\t\tconst listeners = this._listeners;\n\t\tconst listenerArray = listeners[ type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tconst index = listenerArray.indexOf( listener );\n\n\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tdispatchEvent( event ) {\n\n\t\tif ( this._listeners === undefined ) return;\n\n\t\tconst listeners = this._listeners;\n\t\tconst listenerArray = listeners[ event.type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tevent.target = this;\n\n\t\t\t// Make a copy, in case listeners are removed while iterating.\n\t\t\tconst array = listenerArray.slice( 0 );\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t}\n\n\t\t\tevent.target = null;\n\n\t\t}\n\n\t}\n\n}\n\nconst _lut = [ '00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '0a', '0b', '0c', '0d', '0e', '0f', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '1a', '1b', '1c', '1d', '1e', '1f', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '2a', '2b', '2c', '2d', '2e', '2f', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '3a', '3b', '3c', '3d', '3e', '3f', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '4a', '4b', '4c', '4d', '4e', '4f', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '5a', '5b', '5c', '5d', '5e', '5f', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '6a', '6b', '6c', '6d', '6e', '6f', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '7a', '7b', '7c', '7d', '7e', '7f', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '8a', '8b', '8c', '8d', '8e', '8f', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '9a', '9b', '9c', '9d', '9e', '9f', 'a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'b0', 'b1', 'b2', 'b3', 'b4', 'b5', 'b6', 'b7', 'b8', 'b9', 'ba', 'bb', 'bc', 'bd', 'be', 'bf', 'c0', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'ca', 'cb', 'cc', 'cd', 'ce', 'cf', 'd0', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9', 'da', 'db', 'dc', 'dd', 'de', 'df', 'e0', 'e1', 'e2', 'e3', 'e4', 'e5', 'e6', 'e7', 'e8', 'e9', 'ea', 'eb', 'ec', 'ed', 'ee', 'ef', 'f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'fa', 'fb', 'fc', 'fd', 'fe', 'ff' ];\n\nlet _seed = 1234567;\n\n\nconst DEG2RAD = Math.PI / 180;\nconst RAD2DEG = 180 / Math.PI;\n\n// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\nfunction generateUUID() {\n\n\tconst d0 = Math.random() * 0xffffffff | 0;\n\tconst d1 = Math.random() * 0xffffffff | 0;\n\tconst d2 = Math.random() * 0xffffffff | 0;\n\tconst d3 = Math.random() * 0xffffffff | 0;\n\tconst uuid = _lut[ d0 & 0xff ] + _lut[ d0 >> 8 & 0xff ] + _lut[ d0 >> 16 & 0xff ] + _lut[ d0 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d1 & 0xff ] + _lut[ d1 >> 8 & 0xff ] + '-' + _lut[ d1 >> 16 & 0x0f | 0x40 ] + _lut[ d1 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d2 & 0x3f | 0x80 ] + _lut[ d2 >> 8 & 0xff ] + '-' + _lut[ d2 >> 16 & 0xff ] + _lut[ d2 >> 24 & 0xff ] +\n\t\t\t_lut[ d3 & 0xff ] + _lut[ d3 >> 8 & 0xff ] + _lut[ d3 >> 16 & 0xff ] + _lut[ d3 >> 24 & 0xff ];\n\n\t// .toLowerCase() here flattens concatenated strings to save heap memory space.\n\treturn uuid.toLowerCase();\n\n}\n\nfunction clamp( value, min, max ) {\n\n\treturn Math.max( min, Math.min( max, value ) );\n\n}\n\n// compute euclidean modulo of m % n\n// https://en.wikipedia.org/wiki/Modulo_operation\nfunction euclideanModulo( n, m ) {\n\n\treturn ( ( n % m ) + m ) % m;\n\n}\n\n// Linear mapping from range <a1, a2> to range <b1, b2>\nfunction mapLinear( x, a1, a2, b1, b2 ) {\n\n\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n}\n\n// https://www.gamedev.net/tutorials/programming/general-and-gameplay-programming/inverse-lerp-a-super-useful-yet-often-overlooked-function-r5230/\nfunction inverseLerp( x, y, value ) {\n\n\tif ( x !== y ) {\n\n\t\treturn ( value - x ) / ( y - x );\n\n\t} else {\n\n\t\treturn 0;\n\n\t}\n\n}\n\n// https://en.wikipedia.org/wiki/Linear_interpolation\nfunction lerp( x, y, t ) {\n\n\treturn ( 1 - t ) * x + t * y;\n\n}\n\n// http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/\nfunction damp( x, y, lambda, dt ) {\n\n\treturn lerp( x, y, 1 - Math.exp( - lambda * dt ) );\n\n}\n\n// https://www.desmos.com/calculator/vcsjnyz7x4\nfunction pingpong( x, length = 1 ) {\n\n\treturn length - Math.abs( euclideanModulo( x, length * 2 ) - length );\n\n}\n\n// http://en.wikipedia.org/wiki/Smoothstep\nfunction smoothstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * ( 3 - 2 * x );\n\n}\n\nfunction smootherstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n}\n\n// Random integer from <low, high> interval\nfunction randInt( low, high ) {\n\n\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n}\n\n// Random float from <low, high> interval\nfunction randFloat( low, high ) {\n\n\treturn low + Math.random() * ( high - low );\n\n}\n\n// Random float from <-range/2, range/2> interval\nfunction randFloatSpread( range ) {\n\n\treturn range * ( 0.5 - Math.random() );\n\n}\n\n// Deterministic pseudo-random float in the interval [ 0, 1 ]\nfunction seededRandom( s ) {\n\n\tif ( s !== undefined ) _seed = s;\n\n\t// Mulberry32 generator\n\n\tlet t = _seed += 0x6D2B79F5;\n\n\tt = Math.imul( t ^ t >>> 15, t | 1 );\n\n\tt ^= t + Math.imul( t ^ t >>> 7, t | 61 );\n\n\treturn ( ( t ^ t >>> 14 ) >>> 0 ) / 4294967296;\n\n}\n\nfunction degToRad( degrees ) {\n\n\treturn degrees * DEG2RAD;\n\n}\n\nfunction radToDeg( radians ) {\n\n\treturn radians * RAD2DEG;\n\n}\n\nfunction isPowerOfTwo( value ) {\n\n\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n}\n\nfunction ceilPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) );\n\n}\n\nfunction floorPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) );\n\n}\n\nfunction setQuaternionFromProperEuler( q, a, b, c, order ) {\n\n\t// Intrinsic Proper Euler Angles - see https://en.wikipedia.org/wiki/Euler_angles\n\n\t// rotations are applied to the axes in the order specified by 'order'\n\t// rotation by angle 'a' is applied first, then by angle 'b', then by angle 'c'\n\t// angles are in radians\n\n\tconst cos = Math.cos;\n\tconst sin = Math.sin;\n\n\tconst c2 = cos( b / 2 );\n\tconst s2 = sin( b / 2 );\n\n\tconst c13 = cos( ( a + c ) / 2 );\n\tconst s13 = sin( ( a + c ) / 2 );\n\n\tconst c1_3 = cos( ( a - c ) / 2 );\n\tconst s1_3 = sin( ( a - c ) / 2 );\n\n\tconst c3_1 = cos( ( c - a ) / 2 );\n\tconst s3_1 = sin( ( c - a ) / 2 );\n\n\tswitch ( order ) {\n\n\t\tcase 'XYX':\n\t\t\tq.set( c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YZY':\n\t\t\tq.set( s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZXZ':\n\t\t\tq.set( s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'XZX':\n\t\t\tq.set( c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YXY':\n\t\t\tq.set( s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZYZ':\n\t\t\tq.set( s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order );\n\n\t}\n\n}\n\nfunction denormalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint16Array:\n\n\t\t\treturn value / 65535.0;\n\n\t\tcase Uint8Array:\n\n\t\t\treturn value / 255.0;\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.max( value / 32767.0, - 1.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.max( value / 127.0, - 1.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\nfunction normalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint16Array:\n\n\t\t\treturn Math.round( value * 65535.0 );\n\n\t\tcase Uint8Array:\n\n\t\t\treturn Math.round( value * 255.0 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.round( value * 32767.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.round( value * 127.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\nvar MathUtils = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tDEG2RAD: DEG2RAD,\n\tRAD2DEG: RAD2DEG,\n\tceilPowerOfTwo: ceilPowerOfTwo,\n\tclamp: clamp,\n\tdamp: damp,\n\tdegToRad: degToRad,\n\tdenormalize: denormalize,\n\teuclideanModulo: euclideanModulo,\n\tfloorPowerOfTwo: floorPowerOfTwo,\n\tgenerateUUID: generateUUID,\n\tinverseLerp: inverseLerp,\n\tisPowerOfTwo: isPowerOfTwo,\n\tlerp: lerp,\n\tmapLinear: mapLinear,\n\tnormalize: normalize,\n\tpingpong: pingpong,\n\tradToDeg: radToDeg,\n\trandFloat: randFloat,\n\trandFloatSpread: randFloatSpread,\n\trandInt: randInt,\n\tseededRandom: seededRandom,\n\tsetQuaternionFromProperEuler: setQuaternionFromProperEuler,\n\tsmootherstep: smootherstep,\n\tsmoothstep: smoothstep\n});\n\nclass Vector2 {\n\n\tconstructor( x = 0, y = 0 ) {\n\n\t\tVector2.prototype.isVector2 = true;\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t}\n\n\tget width() {\n\n\t\treturn this.x;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.x = value;\n\n\t}\n\n\tget height() {\n\n\t\treturn this.y;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.y = value;\n\n\t}\n\n\tset( x, y ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y );\n\n\t}\n\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\n\t\treturn this;\n\n\t}\n\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\n\t\treturn this;\n\n\t}\n\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\n\t\treturn this;\n\n\t}\n\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\n\t\treturn this;\n\n\t}\n\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\n\t\treturn this;\n\n\t}\n\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\n\t\treturn this;\n\n\t}\n\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ];\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ];\n\n\t\treturn this;\n\n\t}\n\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t}\n\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\n\t\treturn this;\n\n\t}\n\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\n\t\treturn this;\n\n\t}\n\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\n\t\treturn this;\n\n\t}\n\n\troundToZero() {\n\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y;\n\n\t}\n\n\tcross( v ) {\n\n\t\treturn this.x * v.y - this.y * v.x;\n\n\t}\n\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t}\n\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t}\n\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tangle() {\n\n\t\t// computes the angle in radians with respect to the positive x-axis\n\n\t\tconst angle = Math.atan2( - this.y, - this.x ) + Math.PI;\n\n\t\treturn angle;\n\n\t}\n\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y;\n\t\treturn dx * dx + dy * dy;\n\n\t}\n\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\n\t\treturn this;\n\n\t}\n\n\trotateAround( center, angle ) {\n\n\t\tconst c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\tconst x = this.x - center.x;\n\t\tconst y = this.y - center.y;\n\n\t\tthis.x = x * c - y * s + center.x;\n\t\tthis.y = x * s + y * c + center.y;\n\n\t\treturn this;\n\n\t}\n\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\n\t}\n\n}\n\nclass Matrix3 {\n\n\tconstructor() {\n\n\t\tMatrix3.prototype.isMatrix3 = true;\n\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t];\n\n\t}\n\n\tset( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\treturn this;\n\n\t}\n\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ];\n\t\tte[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ];\n\t\tte[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrix3Column( this, 0 );\n\t\tyAxis.setFromMatrix3Column( this, 1 );\n\t\tzAxis.setFromMatrix3Column( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrix4( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31;\n\t\tte[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32;\n\t\tte[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31;\n\t\tte[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32;\n\t\tte[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31;\n\t\tte[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32;\n\t\tte[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t}\n\n\tinvert() {\n\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ],\n\t\t\tn12 = te[ 3 ], n22 = te[ 4 ], n32 = te[ 5 ],\n\t\t\tn13 = te[ 6 ], n23 = te[ 7 ], n33 = te[ 8 ],\n\n\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\tte[ 3 ] = t12 * detInv;\n\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\tte[ 6 ] = t13 * detInv;\n\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\ttranspose() {\n\n\t\tlet tmp;\n\t\tconst m = this.elements;\n\n\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\tgetNormalMatrix( matrix4 ) {\n\n\t\treturn this.setFromMatrix4( matrix4 ).invert().transpose();\n\n\t}\n\n\ttransposeIntoArray( r ) {\n\n\t\tconst m = this.elements;\n\n\t\tr[ 0 ] = m[ 0 ];\n\t\tr[ 1 ] = m[ 3 ];\n\t\tr[ 2 ] = m[ 6 ];\n\t\tr[ 3 ] = m[ 1 ];\n\t\tr[ 4 ] = m[ 4 ];\n\t\tr[ 5 ] = m[ 7 ];\n\t\tr[ 6 ] = m[ 2 ];\n\t\tr[ 7 ] = m[ 5 ];\n\t\tr[ 8 ] = m[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\tsetUvTransform( tx, ty, sx, sy, rotation, cx, cy ) {\n\n\t\tconst c = Math.cos( rotation );\n\t\tconst s = Math.sin( rotation );\n\n\t\tthis.set(\n\t\t\tsx * c, sx * s, - sx * ( c * cx + s * cy ) + cx + tx,\n\t\t\t- sy * s, sy * c, - sy * ( - s * cx + c * cy ) + cy + ty,\n\t\t\t0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t//\n\n\tscale( sx, sy ) {\n\n\t\tthis.premultiply( _m3.makeScale( sx, sy ) );\n\n\t\treturn this;\n\n\t}\n\n\trotate( theta ) {\n\n\t\tthis.premultiply( _m3.makeRotation( - theta ) );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( tx, ty ) {\n\n\t\tthis.premultiply( _m3.makeTranslation( tx, ty ) );\n\n\t\treturn this;\n\n\t}\n\n\t// for 2D Transforms\n\n\tmakeTranslation( x, y ) {\n\n\t\tthis.set(\n\n\t\t\t1, 0, x,\n\t\t\t0, 1, y,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotation( theta ) {\n\n\t\t// counterclockwise\n\n\t\tconst c = Math.cos( theta );\n\t\tconst s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0,\n\t\t\ts, c, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeScale( x, y ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0,\n\t\t\t0, y, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t//\n\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\treturn array;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().fromArray( this.elements );\n\n\t}\n\n}\n\nconst _m3 = /*@__PURE__*/ new Matrix3();\n\nfunction arrayNeedsUint32( array ) {\n\n\t// assumes larger values usually on last\n\n\tfor ( let i = array.length - 1; i >= 0; -- i ) {\n\n\t\tif ( array[ i ] >= 65535 ) return true; // account for PRIMITIVE_RESTART_FIXED_INDEX, #24565\n\n\t}\n\n\treturn false;\n\n}\n\nconst TYPED_ARRAYS = {\n\tInt8Array: Int8Array,\n\tUint8Array: Uint8Array,\n\tUint8ClampedArray: Uint8ClampedArray,\n\tInt16Array: Int16Array,\n\tUint16Array: Uint16Array,\n\tInt32Array: Int32Array,\n\tUint32Array: Uint32Array,\n\tFloat32Array: Float32Array,\n\tFloat64Array: Float64Array\n};\n\nfunction getTypedArray( type, buffer ) {\n\n\treturn new TYPED_ARRAYS[ type ]( buffer );\n\n}\n\nfunction createElementNS( name ) {\n\n\treturn document.createElementNS( 'http://www.w3.org/1999/xhtml', name );\n\n}\n\nfunction SRGBToLinear( c ) {\n\n\treturn ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 );\n\n}\n\nfunction LinearToSRGB( c ) {\n\n\treturn ( c < 0.0031308 ) ? c * 12.92 : 1.055 * ( Math.pow( c, 0.41666 ) ) - 0.055;\n\n}\n\n// JavaScript RGB-to-RGB transforms, defined as\n// FN[InputColorSpace][OutputColorSpace] callback functions.\nconst FN = {\n\t[ SRGBColorSpace ]: { [ LinearSRGBColorSpace ]: SRGBToLinear },\n\t[ LinearSRGBColorSpace ]: { [ SRGBColorSpace ]: LinearToSRGB },\n};\n\nconst ColorManagement = {\n\n\tlegacyMode: true,\n\n\tget workingColorSpace() {\n\n\t\treturn LinearSRGBColorSpace;\n\n\t},\n\n\tset workingColorSpace( colorSpace ) {\n\n\t\tconsole.warn( 'THREE.ColorManagement: .workingColorSpace is readonly.' );\n\n\t},\n\n\tconvert: function ( color, sourceColorSpace, targetColorSpace ) {\n\n\t\tif ( this.legacyMode || sourceColorSpace === targetColorSpace || ! sourceColorSpace || ! targetColorSpace ) {\n\n\t\t\treturn color;\n\n\t\t}\n\n\t\tif ( FN[ sourceColorSpace ] && FN[ sourceColorSpace ][ targetColorSpace ] !== undefined ) {\n\n\t\t\tconst fn = FN[ sourceColorSpace ][ targetColorSpace ];\n\n\t\t\tcolor.r = fn( color.r );\n\t\t\tcolor.g = fn( color.g );\n\t\t\tcolor.b = fn( color.b );\n\n\t\t\treturn color;\n\n\t\t}\n\n\t\tthrow new Error( 'Unsupported color space conversion.' );\n\n\t},\n\n\tfromWorkingColorSpace: function ( color, targetColorSpace ) {\n\n\t\treturn this.convert( color, this.workingColorSpace, targetColorSpace );\n\n\t},\n\n\ttoWorkingColorSpace: function ( color, sourceColorSpace ) {\n\n\t\treturn this.convert( color, sourceColorSpace, this.workingColorSpace );\n\n\t},\n\n};\n\nconst _colorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,\n\t'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,\n\t'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,\n\t'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,\n\t'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,\n\t'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,\n\t'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,\n\t'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,\n\t'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,\n\t'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,\n\t'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,\n\t'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,\n\t'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,\n\t'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,\n\t'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,\n\t'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,\n\t'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,\n\t'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,\n\t'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,\n\t'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,\n\t'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,\n\t'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,\n\t'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,\n\t'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };\n\nconst _rgb$1 = { r: 0, g: 0, b: 0 };\nconst _hslA = { h: 0, s: 0, l: 0 };\nconst _hslB = { h: 0, s: 0, l: 0 };\n\nfunction hue2rgb( p, q, t ) {\n\n\tif ( t < 0 ) t += 1;\n\tif ( t > 1 ) t -= 1;\n\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\tif ( t < 1 / 2 ) return q;\n\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\treturn p;\n\n}\n\nfunction toComponents( source, target ) {\n\n\ttarget.r = source.r;\n\ttarget.g = source.g;\n\ttarget.b = source.b;\n\n\treturn target;\n\n}\n\nclass Color {\n\n\tconstructor( r, g, b ) {\n\n\t\tthis.isColor = true;\n\n\t\tthis.r = 1;\n\t\tthis.g = 1;\n\t\tthis.b = 1;\n\n\t\tif ( g === undefined && b === undefined ) {\n\n\t\t\t// r is THREE.Color, hex or string\n\t\t\treturn this.set( r );\n\n\t\t}\n\n\t\treturn this.setRGB( r, g, b );\n\n\t}\n\n\tset( value ) {\n\n\t\tif ( value && value.isColor ) {\n\n\t\t\tthis.copy( value );\n\n\t\t} else if ( typeof value === 'number' ) {\n\n\t\t\tthis.setHex( value );\n\n\t\t} else if ( typeof value === 'string' ) {\n\n\t\t\tthis.setStyle( value );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.r = scalar;\n\t\tthis.g = scalar;\n\t\tthis.b = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetHex( hex, colorSpace = SRGBColorSpace ) {\n\n\t\thex = Math.floor( hex );\n\n\t\tthis.r = ( hex >> 16 & 255 ) / 255;\n\t\tthis.g = ( hex >> 8 & 255 ) / 255;\n\t\tthis.b = ( hex & 255 ) / 255;\n\n\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\tsetRGB( r, g, b, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\tthis.r = r;\n\t\tthis.g = g;\n\t\tthis.b = b;\n\n\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\tsetHSL( h, s, l, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\th = euclideanModulo( h, 1 );\n\t\ts = clamp( s, 0, 1 );\n\t\tl = clamp( l, 0, 1 );\n\n\t\tif ( s === 0 ) {\n\n\t\t\tthis.r = this.g = this.b = l;\n\n\t\t} else {\n\n\t\t\tconst p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\tconst q = ( 2 * l ) - p;\n\n\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t}\n\n\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\tsetStyle( style, colorSpace = SRGBColorSpace ) {\n\n\t\tfunction handleAlpha( string ) {\n\n\t\t\tif ( string === undefined ) return;\n\n\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\tconsole.warn( 'THREE.Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tlet m;\n\n\t\tif ( m = /^((?:rgb|hsl)a?)\\(([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t// rgb / hsl\n\n\t\t\tlet color;\n\t\t\tconst name = m[ 1 ];\n\t\t\tconst components = m[ 2 ];\n\n\t\t\tswitch ( name ) {\n\n\t\t\t\tcase 'rgb':\n\t\t\t\tcase 'rgba':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\t\t\t\t\t\tthis.r = Math.min( 255, parseInt( color[ 1 ], 10 ) ) / 255;\n\t\t\t\t\t\tthis.g = Math.min( 255, parseInt( color[ 2 ], 10 ) ) / 255;\n\t\t\t\t\t\tthis.b = Math.min( 255, parseInt( color[ 3 ], 10 ) ) / 255;\n\n\t\t\t\t\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\t\t\t\t\t\tthis.r = Math.min( 100, parseInt( color[ 1 ], 10 ) ) / 100;\n\t\t\t\t\t\tthis.g = Math.min( 100, parseInt( color[ 2 ], 10 ) ) / 100;\n\t\t\t\t\t\tthis.b = Math.min( 100, parseInt( color[ 3 ], 10 ) ) / 100;\n\n\t\t\t\t\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'hsl':\n\t\t\t\tcase 'hsla':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d*\\.?\\d+)\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\t\t\t\t\t\tconst h = parseFloat( color[ 1 ] ) / 360;\n\t\t\t\t\t\tconst s = parseFloat( color[ 2 ] ) / 100;\n\t\t\t\t\t\tconst l = parseFloat( color[ 3 ] ) / 100;\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setHSL( h, s, l, colorSpace );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t} else if ( m = /^\\#([A-Fa-f\\d]+)$/.exec( style ) ) {\n\n\t\t\t// hex color\n\n\t\t\tconst hex = m[ 1 ];\n\t\t\tconst size = hex.length;\n\n\t\t\tif ( size === 3 ) {\n\n\t\t\t\t// #ff0\n\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 0 ), 16 ) / 255;\n\t\t\t\tthis.g = parseInt( hex.charAt( 1 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\tthis.b = parseInt( hex.charAt( 2 ) + hex.charAt( 2 ), 16 ) / 255;\n\n\t\t\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\t\t\treturn this;\n\n\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t// #ff0000\n\t\t\t\tthis.r = parseInt( hex.charAt( 0 ) + hex.charAt( 1 ), 16 ) / 255;\n\t\t\t\tthis.g = parseInt( hex.charAt( 2 ) + hex.charAt( 3 ), 16 ) / 255;\n\t\t\t\tthis.b = parseInt( hex.charAt( 4 ) + hex.charAt( 5 ), 16 ) / 255;\n\n\t\t\t\tColorManagement.toWorkingColorSpace( this, colorSpace );\n\n\t\t\t\treturn this;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( style && style.length > 0 ) {\n\n\t\t\treturn this.setColorName( style, colorSpace );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetColorName( style, colorSpace = SRGBColorSpace ) {\n\n\t\t// color keywords\n\t\tconst hex = _colorKeywords[ style.toLowerCase() ];\n\n\t\tif ( hex !== undefined ) {\n\n\t\t\t// red\n\t\t\tthis.setHex( hex, colorSpace );\n\n\t\t} else {\n\n\t\t\t// unknown color\n\t\t\tconsole.warn( 'THREE.Color: Unknown color ' + style );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t}\n\n\tcopy( color ) {\n\n\t\tthis.r = color.r;\n\t\tthis.g = color.g;\n\t\tthis.b = color.b;\n\n\t\treturn this;\n\n\t}\n\n\tcopySRGBToLinear( color ) {\n\n\t\tthis.r = SRGBToLinear( color.r );\n\t\tthis.g = SRGBToLinear( color.g );\n\t\tthis.b = SRGBToLinear( color.b );\n\n\t\treturn this;\n\n\t}\n\n\tcopyLinearToSRGB( color ) {\n\n\t\tthis.r = LinearToSRGB( color.r );\n\t\tthis.g = LinearToSRGB( color.g );\n\t\tthis.b = LinearToSRGB( color.b );\n\n\t\treturn this;\n\n\t}\n\n\tconvertSRGBToLinear() {\n\n\t\tthis.copySRGBToLinear( this );\n\n\t\treturn this;\n\n\t}\n\n\tconvertLinearToSRGB() {\n\n\t\tthis.copyLinearToSRGB( this );\n\n\t\treturn this;\n\n\t}\n\n\tgetHex( colorSpace = SRGBColorSpace ) {\n\n\t\tColorManagement.fromWorkingColorSpace( toComponents( this, _rgb$1 ), colorSpace );\n\n\t\treturn clamp( _rgb$1.r * 255, 0, 255 ) << 16 ^ clamp( _rgb$1.g * 255, 0, 255 ) << 8 ^ clamp( _rgb$1.b * 255, 0, 255 ) << 0;\n\n\t}\n\n\tgetHexString( colorSpace = SRGBColorSpace ) {\n\n\t\treturn ( '000000' + this.getHex( colorSpace ).toString( 16 ) ).slice( - 6 );\n\n\t}\n\n\tgetHSL( target, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\tColorManagement.fromWorkingColorSpace( toComponents( this, _rgb$1 ), colorSpace );\n\n\t\tconst r = _rgb$1.r, g = _rgb$1.g, b = _rgb$1.b;\n\n\t\tconst max = Math.max( r, g, b );\n\t\tconst min = Math.min( r, g, b );\n\n\t\tlet hue, saturation;\n\t\tconst lightness = ( min + max ) / 2.0;\n\n\t\tif ( min === max ) {\n\n\t\t\thue = 0;\n\t\t\tsaturation = 0;\n\n\t\t} else {\n\n\t\t\tconst delta = max - min;\n\n\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\tswitch ( max ) {\n\n\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t}\n\n\t\t\thue /= 6;\n\n\t\t}\n\n\t\ttarget.h = hue;\n\t\ttarget.s = saturation;\n\t\ttarget.l = lightness;\n\n\t\treturn target;\n\n\t}\n\n\tgetRGB( target, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\tColorManagement.fromWorkingColorSpace( toComponents( this, _rgb$1 ), colorSpace );\n\n\t\ttarget.r = _rgb$1.r;\n\t\ttarget.g = _rgb$1.g;\n\t\ttarget.b = _rgb$1.b;\n\n\t\treturn target;\n\n\t}\n\n\tgetStyle( colorSpace = SRGBColorSpace ) {\n\n\t\tColorManagement.fromWorkingColorSpace( toComponents( this, _rgb$1 ), colorSpace );\n\n\t\tif ( colorSpace !== SRGBColorSpace ) {\n\n\t\t\t// Requires CSS Color Module Level 4 (https://www.w3.org/TR/css-color-4/).\n\t\t\treturn `color(${ colorSpace } ${ _rgb$1.r } ${ _rgb$1.g } ${ _rgb$1.b })`;\n\n\t\t}\n\n\t\treturn `rgb(${( _rgb$1.r * 255 ) | 0},${( _rgb$1.g * 255 ) | 0},${( _rgb$1.b * 255 ) | 0})`;\n\n\t}\n\n\toffsetHSL( h, s, l ) {\n\n\t\tthis.getHSL( _hslA );\n\n\t\t_hslA.h += h; _hslA.s += s; _hslA.l += l;\n\n\t\tthis.setHSL( _hslA.h, _hslA.s, _hslA.l );\n\n\t\treturn this;\n\n\t}\n\n\tadd( color ) {\n\n\t\tthis.r += color.r;\n\t\tthis.g += color.g;\n\t\tthis.b += color.b;\n\n\t\treturn this;\n\n\t}\n\n\taddColors( color1, color2 ) {\n\n\t\tthis.r = color1.r + color2.r;\n\t\tthis.g = color1.g + color2.g;\n\t\tthis.b = color1.b + color2.b;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.r += s;\n\t\tthis.g += s;\n\t\tthis.b += s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( color ) {\n\n\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( color ) {\n\n\t\tthis.r *= color.r;\n\t\tthis.g *= color.g;\n\t\tthis.b *= color.b;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( s ) {\n\n\t\tthis.r *= s;\n\t\tthis.g *= s;\n\t\tthis.b *= s;\n\n\t\treturn this;\n\n\t}\n\n\tlerp( color, alpha ) {\n\n\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpColors( color1, color2, alpha ) {\n\n\t\tthis.r = color1.r + ( color2.r - color1.r ) * alpha;\n\t\tthis.g = color1.g + ( color2.g - color1.g ) * alpha;\n\t\tthis.b = color1.b + ( color2.b - color1.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpHSL( color, alpha ) {\n\n\t\tthis.getHSL( _hslA );\n\t\tcolor.getHSL( _hslB );\n\n\t\tconst h = lerp( _hslA.h, _hslB.h, alpha );\n\t\tconst s = lerp( _hslA.s, _hslB.s, alpha );\n\t\tconst l = lerp( _hslA.l, _hslB.l, alpha );\n\n\t\tthis.setHSL( h, s, l );\n\n\t\treturn this;\n\n\t}\n\n\tequals( c ) {\n\n\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.r = array[ offset ];\n\t\tthis.g = array[ offset + 1 ];\n\t\tthis.b = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.r;\n\t\tarray[ offset + 1 ] = this.g;\n\t\tarray[ offset + 2 ] = this.b;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.r = attribute.getX( index );\n\t\tthis.g = attribute.getY( index );\n\t\tthis.b = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\treturn this.getHex();\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.r;\n\t\tyield this.g;\n\t\tyield this.b;\n\n\t}\n\n}\n\nColor.NAMES = _colorKeywords;\n\nlet _canvas;\n\nclass ImageUtils {\n\n\tstatic getDataURL( image ) {\n\n\t\tif ( /^data:/i.test( image.src ) ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tif ( typeof HTMLCanvasElement == 'undefined' ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tlet canvas;\n\n\t\tif ( image instanceof HTMLCanvasElement ) {\n\n\t\t\tcanvas = image;\n\n\t\t} else {\n\n\t\t\tif ( _canvas === undefined ) _canvas = createElementNS( 'canvas' );\n\n\t\t\t_canvas.width = image.width;\n\t\t\t_canvas.height = image.height;\n\n\t\t\tconst context = _canvas.getContext( '2d' );\n\n\t\t\tif ( image instanceof ImageData ) {\n\n\t\t\t\tcontext.putImageData( image, 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t}\n\n\t\t\tcanvas = _canvas;\n\n\t\t}\n\n\t\tif ( canvas.width > 2048 || canvas.height > 2048 ) {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.getDataURL: Image converted to jpg for performance reasons', image );\n\n\t\t\treturn canvas.toDataURL( 'image/jpeg', 0.6 );\n\n\t\t} else {\n\n\t\t\treturn canvas.toDataURL( 'image/png' );\n\n\t\t}\n\n\t}\n\n\tstatic sRGBToLinear( image ) {\n\n\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t\tconst canvas = createElementNS( 'canvas' );\n\n\t\t\tcanvas.width = image.width;\n\t\t\tcanvas.height = image.height;\n\n\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\tconst imageData = context.getImageData( 0, 0, image.width, image.height );\n\t\t\tconst data = imageData.data;\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] / 255 ) * 255;\n\n\t\t\t}\n\n\t\t\tcontext.putImageData( imageData, 0, 0 );\n\n\t\t\treturn canvas;\n\n\t\t} else if ( image.data ) {\n\n\t\t\tconst data = image.data.slice( 0 );\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tif ( data instanceof Uint8Array || data instanceof Uint8ClampedArray ) {\n\n\t\t\t\t\tdata[ i ] = Math.floor( SRGBToLinear( data[ i ] / 255 ) * 255 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// assuming float\n\n\t\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tdata: data,\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied.' );\n\t\t\treturn image;\n\n\t\t}\n\n\t}\n\n}\n\nclass Source {\n\n\tconstructor( data = null ) {\n\n\t\tthis.isSource = true;\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.data = data;\n\n\t\tthis.version = 0;\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.images[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.images[ this.uuid ];\n\n\t\t}\n\n\t\tconst output = {\n\t\t\tuuid: this.uuid,\n\t\t\turl: ''\n\t\t};\n\n\t\tconst data = this.data;\n\n\t\tif ( data !== null ) {\n\n\t\t\tlet url;\n\n\t\t\tif ( Array.isArray( data ) ) {\n\n\t\t\t\t// cube texture\n\n\t\t\t\turl = [];\n\n\t\t\t\tfor ( let i = 0, l = data.length; i < l; i ++ ) {\n\n\t\t\t\t\tif ( data[ i ].isDataTexture ) {\n\n\t\t\t\t\t\turl.push( serializeImage( data[ i ].image ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\turl.push( serializeImage( data[ i ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// texture\n\n\t\t\t\turl = serializeImage( data );\n\n\t\t\t}\n\n\t\t\toutput.url = url;\n\n\t\t}\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.images[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n}\n\nfunction serializeImage( image ) {\n\n\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t// default images\n\n\t\treturn ImageUtils.getDataURL( image );\n\n\t} else {\n\n\t\tif ( image.data ) {\n\n\t\t\t// images of DataTexture\n\n\t\t\treturn {\n\t\t\t\tdata: Array.from( image.data ),\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height,\n\t\t\t\ttype: image.data.constructor.name\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.Texture: Unable to serialize Texture.' );\n\t\t\treturn {};\n\n\t\t}\n\n\t}\n\n}\n\nlet textureId = 0;\n\nclass Texture extends EventDispatcher {\n\n\tconstructor( image = Texture.DEFAULT_IMAGE, mapping = Texture.DEFAULT_MAPPING, wrapS = ClampToEdgeWrapping, wrapT = ClampToEdgeWrapping, magFilter = LinearFilter, minFilter = LinearMipmapLinearFilter, format = RGBAFormat, type = UnsignedByteType, anisotropy = Texture.DEFAULT_ANISOTROPY, encoding = LinearEncoding ) {\n\n\t\tsuper();\n\n\t\tthis.isTexture = true;\n\n\t\tObject.defineProperty( this, 'id', { value: textureId ++ } );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.name = '';\n\n\t\tthis.source = new Source( image );\n\t\tthis.mipmaps = [];\n\n\t\tthis.mapping = mapping;\n\n\t\tthis.wrapS = wrapS;\n\t\tthis.wrapT = wrapT;\n\n\t\tthis.magFilter = magFilter;\n\t\tthis.minFilter = minFilter;\n\n\t\tthis.anisotropy = anisotropy;\n\n\t\tthis.format = format;\n\t\tthis.internalFormat = null;\n\t\tthis.type = type;\n\n\t\tthis.offset = new Vector2( 0, 0 );\n\t\tthis.repeat = new Vector2( 1, 1 );\n\t\tthis.center = new Vector2( 0, 0 );\n\t\tthis.rotation = 0;\n\n\t\tthis.matrixAutoUpdate = true;\n\t\tthis.matrix = new Matrix3();\n\n\t\tthis.generateMipmaps = true;\n\t\tthis.premultiplyAlpha = false;\n\t\tthis.flipY = true;\n\t\tthis.unpackAlignment = 4;\t// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)\n\n\t\t// Values of encoding !== THREE.LinearEncoding only supported on map, envMap and emissiveMap.\n\t\t//\n\t\t// Also changing the encoding after already used by a Material will not automatically make the Material\n\t\t// update. You need to explicitly call Material.needsUpdate to trigger it to recompile.\n\t\tthis.encoding = encoding;\n\n\t\tthis.userData = {};\n\n\t\tthis.version = 0;\n\t\tthis.onUpdate = null;\n\n\t\tthis.isRenderTargetTexture = false; // indicates whether a texture belongs to a render target or not\n\t\tthis.needsPMREMUpdate = false; // indicates whether this texture should be processed by PMREMGenerator or not (only relevant for render target textures)\n\n\t}\n\n\tget image() {\n\n\t\treturn this.source.data;\n\n\t}\n\n\tset image( value ) {\n\n\t\tthis.source.data = value;\n\n\t}\n\n\tupdateMatrix() {\n\n\t\tthis.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.source = source.source;\n\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\tthis.mapping = source.mapping;\n\n\t\tthis.wrapS = source.wrapS;\n\t\tthis.wrapT = source.wrapT;\n\n\t\tthis.magFilter = source.magFilter;\n\t\tthis.minFilter = source.minFilter;\n\n\t\tthis.anisotropy = source.anisotropy;\n\n\t\tthis.format = source.format;\n\t\tthis.internalFormat = source.internalFormat;\n\t\tthis.type = source.type;\n\n\t\tthis.offset.copy( source.offset );\n\t\tthis.repeat.copy( source.repeat );\n\t\tthis.center.copy( source.center );\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\tthis.matrix.copy( source.matrix );\n\n\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\tthis.flipY = source.flipY;\n\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\tthis.encoding = source.encoding;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tthis.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t}\n\n\t\tconst output = {\n\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Texture',\n\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t},\n\n\t\t\tuuid: this.uuid,\n\t\t\tname: this.name,\n\n\t\t\timage: this.source.toJSON( meta ).uuid,\n\n\t\t\tmapping: this.mapping,\n\n\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\tcenter: [ this.center.x, this.center.y ],\n\t\t\trotation: this.rotation,\n\n\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\tformat: this.format,\n\t\t\ttype: this.type,\n\t\t\tencoding: this.encoding,\n\n\t\t\tminFilter: this.minFilter,\n\t\t\tmagFilter: this.magFilter,\n\t\t\tanisotropy: this.anisotropy,\n\n\t\t\tflipY: this.flipY,\n\n\t\t\tgenerateMipmaps: this.generateMipmaps,\n\t\t\tpremultiplyAlpha: this.premultiplyAlpha,\n\t\t\tunpackAlignment: this.unpackAlignment\n\n\t\t};\n\n\t\tif ( Object.keys( this.userData ).length > 0 ) output.userData = this.userData;\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\ttransformUv( uv ) {\n\n\t\tif ( this.mapping !== UVMapping ) return uv;\n\n\t\tuv.applyMatrix3( this.matrix );\n\n\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.flipY ) {\n\n\t\t\tuv.y = 1 - uv.y;\n\n\t\t}\n\n\t\treturn uv;\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.version ++;\n\t\t\tthis.source.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n}\n\nTexture.DEFAULT_IMAGE = null;\nTexture.DEFAULT_MAPPING = UVMapping;\nTexture.DEFAULT_ANISOTROPY = 1;\n\nclass Vector4 {\n\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\tVector4.prototype.isVector4 = true;\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t}\n\n\tget width() {\n\n\t\treturn this.z;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.z = value;\n\n\t}\n\n\tget height() {\n\n\t\treturn this.w;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.w = value;\n\n\t}\n\n\tset( x, y, z, w ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\t\tthis.w = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetW( w ) {\n\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tcase 3: this.w = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tcase 3: return this.w;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t}\n\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\treturn this;\n\n\t}\n\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\t\tthis.w += v.w;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\t\tthis.w += s;\n\n\t\treturn this;\n\n\t}\n\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\t\tthis.w = a.w + b.w;\n\n\t\treturn this;\n\n\t}\n\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\t\tthis.w += v.w * s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\t\tthis.w -= v.w;\n\n\t\treturn this;\n\n\t}\n\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\t\tthis.w -= s;\n\n\t\treturn this;\n\n\t}\n\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\t\tthis.w = a.w - b.w;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\t\tthis.w *= v.w;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\t\tthis.w *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z, w = this.w;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\treturn this;\n\n\t}\n\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tsetAxisAngleFromQuaternion( q ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t// q is assumed to be normalized\n\n\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\tconst s = Math.sqrt( 1 - q.w * q.w );\n\n\t\tif ( s < 0.0001 ) {\n\n\t\t\tthis.x = 1;\n\t\t\tthis.y = 0;\n\t\t\tthis.z = 0;\n\n\t\t} else {\n\n\t\t\tthis.x = q.x / s;\n\t\t\tthis.y = q.y / s;\n\t\t\tthis.z = q.z / s;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetAxisAngleFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tlet angle, x, y, z; // variables for result\n\t\tconst epsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\tte = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t// singularity found\n\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t}\n\n\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\tangle = Math.PI;\n\n\t\t\tconst xx = ( m11 + 1 ) / 2;\n\t\t\tconst yy = ( m22 + 1 ) / 2;\n\t\t\tconst zz = ( m33 + 1 ) / 2;\n\t\t\tconst xy = ( m12 + m21 ) / 4;\n\t\t\tconst xz = ( m13 + m31 ) / 4;\n\t\t\tconst yz = ( m23 + m32 ) / 4;\n\n\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\tx = 0;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\ty = xy / x;\n\t\t\t\t\tz = xz / x;\n\n\t\t\t\t}\n\n\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\tx = xy / y;\n\t\t\t\t\tz = yz / y;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\tx = xz / z;\n\t\t\t\t\ty = yz / z;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.set( x, y, z, angle );\n\n\t\t\treturn this; // return 180 deg rotation\n\n\t\t}\n\n\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\tlet s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +\n\t\t\t( m13 - m31 ) * ( m13 - m31 ) +\n\t\t\t( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize\n\n\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t// caught by singularity test above, but I've left it in just in case\n\n\t\tthis.x = ( m32 - m23 ) / s;\n\t\tthis.y = ( m13 - m31 ) / s;\n\t\tthis.z = ( m21 - m12 ) / s;\n\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\treturn this;\n\n\t}\n\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\t\tthis.w = Math.min( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\t\tthis.w = Math.max( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\t\tthis.w = Math.max( min.w, Math.min( max.w, this.w ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\t\tthis.z = Math.max( minVal, Math.min( maxVal, this.z ) );\n\t\tthis.w = Math.max( minVal, Math.min( maxVal, this.w ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t}\n\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\t\tthis.w = Math.floor( this.w );\n\n\t\treturn this;\n\n\t}\n\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\t\tthis.w = Math.ceil( this.w );\n\n\t\treturn this;\n\n\t}\n\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\t\tthis.w = Math.round( this.w );\n\n\t\treturn this;\n\n\t}\n\n\troundToZero() {\n\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\t\tthis.w = ( this.w < 0 ) ? Math.ceil( this.w ) : Math.floor( this.w );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\t\tthis.w = - this.w;\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t}\n\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t}\n\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t}\n\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\t\tthis.w = v1.w + ( v2.w - v1.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\t\tthis.w = array[ offset + 3 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\t\tarray[ offset + 3 ] = this.w;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\t\tthis.w = attribute.getW( index );\n\n\t\treturn this;\n\n\t}\n\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\t\tthis.w = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\t\tyield this.w;\n\n\t}\n\n}\n\n/*\n In options, we can specify:\n * Texture parameters for an auto-generated target texture\n * depthBuffer/stencilBuffer: Booleans to indicate if we should generate these buffers\n*/\nclass WebGLRenderTarget extends EventDispatcher {\n\n\tconstructor( width = 1, height = 1, options = {} ) {\n\n\t\tsuper();\n\n\t\tthis.isWebGLRenderTarget = true;\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\t\tthis.depth = 1;\n\n\t\tthis.scissor = new Vector4( 0, 0, width, height );\n\t\tthis.scissorTest = false;\n\n\t\tthis.viewport = new Vector4( 0, 0, width, height );\n\n\t\tconst image = { width: width, height: height, depth: 1 };\n\n\t\tthis.texture = new Texture( image, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t\tthis.texture.flipY = false;\n\t\tthis.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : false;\n\t\tthis.texture.internalFormat = options.internalFormat !== undefined ? options.internalFormat : null;\n\t\tthis.texture.minFilter = options.minFilter !== undefined ? options.minFilter : LinearFilter;\n\n\t\tthis.depthBuffer = options.depthBuffer !== undefined ? options.depthBuffer : true;\n\t\tthis.stencilBuffer = options.stencilBuffer !== undefined ? options.stencilBuffer : false;\n\n\t\tthis.depthTexture = options.depthTexture !== undefined ? options.depthTexture : null;\n\n\t\tthis.samples = options.samples !== undefined ? options.samples : 0;\n\n\t}\n\n\tsetSize( width, height, depth = 1 ) {\n\n\t\tif ( this.width !== width || this.height !== height || this.depth !== depth ) {\n\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\t\t\tthis.depth = depth;\n\n\t\t\tthis.texture.image.width = width;\n\t\t\tthis.texture.image.height = height;\n\t\t\tthis.texture.image.depth = depth;\n\n\t\t\tthis.dispose();\n\n\t\t}\n\n\t\tthis.viewport.set( 0, 0, width, height );\n\t\tthis.scissor.set( 0, 0, width, height );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\t\tthis.depth = source.depth;\n\n\t\tthis.viewport.copy( source.viewport );\n\n\t\tthis.texture = source.texture.clone();\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t\t// ensure image object is not shared, see #20328\n\n\t\tconst image = Object.assign( {}, source.texture.image );\n\t\tthis.texture.source = new Source( image );\n\n\t\tthis.depthBuffer = source.depthBuffer;\n\t\tthis.stencilBuffer = source.stencilBuffer;\n\n\t\tif ( source.depthTexture !== null ) this.depthTexture = source.depthTexture.clone();\n\n\t\tthis.samples = source.samples;\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nclass DataArrayTexture extends Texture {\n\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\tsuper( null );\n\n\t\tthis.isDataArrayTexture = true;\n\n\t\tthis.image = { data, width, height, depth };\n\n\t\tthis.magFilter = NearestFilter;\n\t\tthis.minFilter = NearestFilter;\n\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\nclass WebGLArrayRenderTarget extends WebGLRenderTarget {\n\n\tconstructor( width = 1, height = 1, depth = 1 ) {\n\n\t\tsuper( width, height );\n\n\t\tthis.isWebGLArrayRenderTarget = true;\n\n\t\tthis.depth = depth;\n\n\t\tthis.texture = new DataArrayTexture( null, width, height, depth );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\nclass Data3DTexture extends Texture {\n\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\t// We're going to add .setXXX() methods for setting properties later.\n\t\t// Users can still set in DataTexture3D directly.\n\t\t//\n\t\t//\tconst texture = new THREE.DataTexture3D( data, width, height, depth );\n\t\t// \ttexture.anisotropy = 16;\n\t\t//\n\t\t// See #14839\n\n\t\tsuper( null );\n\n\t\tthis.isData3DTexture = true;\n\n\t\tthis.image = { data, width, height, depth };\n\n\t\tthis.magFilter = NearestFilter;\n\t\tthis.minFilter = NearestFilter;\n\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\nclass WebGL3DRenderTarget extends WebGLRenderTarget {\n\n\tconstructor( width = 1, height = 1, depth = 1 ) {\n\n\t\tsuper( width, height );\n\n\t\tthis.isWebGL3DRenderTarget = true;\n\n\t\tthis.depth = depth;\n\n\t\tthis.texture = new Data3DTexture( null, width, height, depth );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\nclass WebGLMultipleRenderTargets extends WebGLRenderTarget {\n\n\tconstructor( width = 1, height = 1, count = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\tthis.isWebGLMultipleRenderTargets = true;\n\n\t\tconst texture = this.texture;\n\n\t\tthis.texture = [];\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.texture[ i ] = texture.clone();\n\t\t\tthis.texture[ i ].isRenderTargetTexture = true;\n\n\t\t}\n\n\t}\n\n\tsetSize( width, height, depth = 1 ) {\n\n\t\tif ( this.width !== width || this.height !== height || this.depth !== depth ) {\n\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\t\t\tthis.depth = depth;\n\n\t\t\tfor ( let i = 0, il = this.texture.length; i < il; i ++ ) {\n\n\t\t\t\tthis.texture[ i ].image.width = width;\n\t\t\t\tthis.texture[ i ].image.height = height;\n\t\t\t\tthis.texture[ i ].image.depth = depth;\n\n\t\t\t}\n\n\t\t\tthis.dispose();\n\n\t\t}\n\n\t\tthis.viewport.set( 0, 0, width, height );\n\t\tthis.scissor.set( 0, 0, width, height );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.dispose();\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\t\tthis.depth = source.depth;\n\n\t\tthis.viewport.set( 0, 0, this.width, this.height );\n\t\tthis.scissor.set( 0, 0, this.width, this.height );\n\n\t\tthis.depthBuffer = source.depthBuffer;\n\t\tthis.stencilBuffer = source.stencilBuffer;\n\n\t\tif ( source.depthTexture !== null ) this.depthTexture = source.depthTexture.clone();\n\n\t\tthis.texture.length = 0;\n\n\t\tfor ( let i = 0, il = source.texture.length; i < il; i ++ ) {\n\n\t\t\tthis.texture[ i ] = source.texture[ i ].clone();\n\t\t\tthis.texture[ i ].isRenderTargetTexture = true;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass Quaternion {\n\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\tthis.isQuaternion = true;\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t}\n\n\tstatic slerpFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\t// fuzz-free, array-based Quaternion SLERP operation\n\n\t\tlet x0 = src0[ srcOffset0 + 0 ],\n\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\tw0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 + 0 ],\n\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\tif ( t === 0 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x0;\n\t\t\tdst[ dstOffset + 1 ] = y0;\n\t\t\tdst[ dstOffset + 2 ] = z0;\n\t\t\tdst[ dstOffset + 3 ] = w0;\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( t === 1 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x1;\n\t\t\tdst[ dstOffset + 1 ] = y1;\n\t\t\tdst[ dstOffset + 2 ] = z1;\n\t\t\tdst[ dstOffset + 3 ] = w1;\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\tlet s = 1 - t;\n\t\t\tconst cos = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1,\n\t\t\t\tdir = ( cos >= 0 ? 1 : - 1 ),\n\t\t\t\tsqrSin = 1 - cos * cos;\n\n\t\t\t// Skip the Slerp for tiny steps to avoid numeric problems:\n\t\t\tif ( sqrSin > Number.EPSILON ) {\n\n\t\t\t\tconst sin = Math.sqrt( sqrSin ),\n\t\t\t\t\tlen = Math.atan2( sin, cos * dir );\n\n\t\t\t\ts = Math.sin( s * len ) / sin;\n\t\t\t\tt = Math.sin( t * len ) / sin;\n\n\t\t\t}\n\n\t\t\tconst tDir = t * dir;\n\n\t\t\tx0 = x0 * s + x1 * tDir;\n\t\t\ty0 = y0 * s + y1 * tDir;\n\t\t\tz0 = z0 * s + z1 * tDir;\n\t\t\tw0 = w0 * s + w1 * tDir;\n\n\t\t\t// Normalize in case we just did a lerp:\n\t\t\tif ( s === 1 - t ) {\n\n\t\t\t\tconst f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\tx0 *= f;\n\t\t\t\ty0 *= f;\n\t\t\t\tz0 *= f;\n\t\t\t\tw0 *= f;\n\n\t\t\t}\n\n\t\t}\n\n\t\tdst[ dstOffset ] = x0;\n\t\tdst[ dstOffset + 1 ] = y0;\n\t\tdst[ dstOffset + 2 ] = z0;\n\t\tdst[ dstOffset + 3 ] = w0;\n\n\t}\n\n\tstatic multiplyQuaternionsFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1 ) {\n\n\t\tconst x0 = src0[ srcOffset0 ];\n\t\tconst y0 = src0[ srcOffset0 + 1 ];\n\t\tconst z0 = src0[ srcOffset0 + 2 ];\n\t\tconst w0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 ];\n\t\tconst y1 = src1[ srcOffset1 + 1 ];\n\t\tconst z1 = src1[ srcOffset1 + 2 ];\n\t\tconst w1 = src1[ srcOffset1 + 3 ];\n\n\t\tdst[ dstOffset ] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1;\n\t\tdst[ dstOffset + 1 ] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1;\n\t\tdst[ dstOffset + 2 ] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1;\n\t\tdst[ dstOffset + 3 ] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1;\n\n\t\treturn dst;\n\n\t}\n\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget w() {\n\n\t\treturn this._w;\n\n\t}\n\n\tset w( value ) {\n\n\t\tthis._w = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tset( x, y, z, w ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t}\n\n\tcopy( quaternion ) {\n\n\t\tthis._x = quaternion.x;\n\t\tthis._y = quaternion.y;\n\t\tthis._z = quaternion.z;\n\t\tthis._w = quaternion.w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromEuler( euler, update ) {\n\n\t\tconst x = euler._x, y = euler._y, z = euler._z, order = euler._order;\n\n\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t//\tcontent/SpinCalc.m\n\n\t\tconst cos = Math.cos;\n\t\tconst sin = Math.sin;\n\n\t\tconst c1 = cos( x / 2 );\n\t\tconst c2 = cos( y / 2 );\n\t\tconst c3 = cos( z / 2 );\n\n\t\tconst s1 = sin( x / 2 );\n\t\tconst s2 = sin( y / 2 );\n\t\tconst s3 = sin( z / 2 );\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.warn( 'THREE.Quaternion: .setFromEuler() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tif ( update !== false ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromAxisAngle( axis, angle ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\t// assumes axis is normalized\n\n\t\tconst halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\tthis._x = axis.x * s;\n\t\tthis._y = axis.y * s;\n\t\tthis._z = axis.z * s;\n\t\tthis._w = Math.cos( halfAngle );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\ttrace = m11 + m22 + m33;\n\n\t\tif ( trace > 0 ) {\n\n\t\t\tconst s = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\tthis._w = 0.25 / s;\n\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\tthis._x = 0.25 * s;\n\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t} else if ( m22 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\tthis._y = 0.25 * s;\n\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t} else {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\tthis._z = 0.25 * s;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromUnitVectors( vFrom, vTo ) {\n\n\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\tlet r = vFrom.dot( vTo ) + 1;\n\n\t\tif ( r < Number.EPSILON ) {\n\n\t\t\t// vFrom and vTo point in opposite directions\n\n\t\t\tr = 0;\n\n\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\tthis._x = - vFrom.y;\n\t\t\t\tthis._y = vFrom.x;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = r;\n\n\t\t\t} else {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = - vFrom.z;\n\t\t\t\tthis._z = vFrom.y;\n\t\t\t\tthis._w = r;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3\n\n\t\t\tthis._x = vFrom.y * vTo.z - vFrom.z * vTo.y;\n\t\t\tthis._y = vFrom.z * vTo.x - vFrom.x * vTo.z;\n\t\t\tthis._z = vFrom.x * vTo.y - vFrom.y * vTo.x;\n\t\t\tthis._w = r;\n\n\t\t}\n\n\t\treturn this.normalize();\n\n\t}\n\n\tangleTo( q ) {\n\n\t\treturn 2 * Math.acos( Math.abs( clamp( this.dot( q ), - 1, 1 ) ) );\n\n\t}\n\n\trotateTowards( q, step ) {\n\n\t\tconst angle = this.angleTo( q );\n\n\t\tif ( angle === 0 ) return this;\n\n\t\tconst t = Math.min( 1, step / angle );\n\n\t\tthis.slerp( q, t );\n\n\t\treturn this;\n\n\t}\n\n\tidentity() {\n\n\t\treturn this.set( 0, 0, 0, 1 );\n\n\t}\n\n\tinvert() {\n\n\t\t// quaternion is assumed to have unit length\n\n\t\treturn this.conjugate();\n\n\t}\n\n\tconjugate() {\n\n\t\tthis._x *= - 1;\n\t\tthis._y *= - 1;\n\t\tthis._z *= - 1;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t}\n\n\tlengthSq() {\n\n\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t}\n\n\tnormalize() {\n\n\t\tlet l = this.length();\n\n\t\tif ( l === 0 ) {\n\n\t\t\tthis._x = 0;\n\t\t\tthis._y = 0;\n\t\t\tthis._z = 0;\n\t\t\tthis._w = 1;\n\n\t\t} else {\n\n\t\t\tl = 1 / l;\n\n\t\t\tthis._x = this._x * l;\n\t\t\tthis._y = this._y * l;\n\t\t\tthis._z = this._z * l;\n\t\t\tthis._w = this._w * l;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( this, q );\n\n\t}\n\n\tpremultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( q, this );\n\n\t}\n\n\tmultiplyQuaternions( a, b ) {\n\n\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\tconst qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\tconst qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tslerp( qb, t ) {\n\n\t\tif ( t === 0 ) return this;\n\t\tif ( t === 1 ) return this.copy( qb );\n\n\t\tconst x = this._x, y = this._y, z = this._z, w = this._w;\n\n\t\t// http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/slerp/\n\n\t\tlet cosHalfTheta = w * qb._w + x * qb._x + y * qb._y + z * qb._z;\n\n\t\tif ( cosHalfTheta < 0 ) {\n\n\t\t\tthis._w = - qb._w;\n\t\t\tthis._x = - qb._x;\n\t\t\tthis._y = - qb._y;\n\t\t\tthis._z = - qb._z;\n\n\t\t\tcosHalfTheta = - cosHalfTheta;\n\n\t\t} else {\n\n\t\t\tthis.copy( qb );\n\n\t\t}\n\n\t\tif ( cosHalfTheta >= 1.0 ) {\n\n\t\t\tthis._w = w;\n\t\t\tthis._x = x;\n\t\t\tthis._y = y;\n\t\t\tthis._z = z;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst sqrSinHalfTheta = 1.0 - cosHalfTheta * cosHalfTheta;\n\n\t\tif ( sqrSinHalfTheta <= Number.EPSILON ) {\n\n\t\t\tconst s = 1 - t;\n\t\t\tthis._w = s * w + t * this._w;\n\t\t\tthis._x = s * x + t * this._x;\n\t\t\tthis._y = s * y + t * this._y;\n\t\t\tthis._z = s * z + t * this._z;\n\n\t\t\tthis.normalize();\n\t\t\tthis._onChangeCallback();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst sinHalfTheta = Math.sqrt( sqrSinHalfTheta );\n\t\tconst halfTheta = Math.atan2( sinHalfTheta, cosHalfTheta );\n\t\tconst ratioA = Math.sin( ( 1 - t ) * halfTheta ) / sinHalfTheta,\n\t\t\tratioB = Math.sin( t * halfTheta ) / sinHalfTheta;\n\n\t\tthis._w = ( w * ratioA + this._w * ratioB );\n\t\tthis._x = ( x * ratioA + this._x * ratioB );\n\t\tthis._y = ( y * ratioA + this._y * ratioB );\n\t\tthis._z = ( z * ratioA + this._z * ratioB );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tslerpQuaternions( qa, qb, t ) {\n\n\t\treturn this.copy( qa ).slerp( qb, t );\n\n\t}\n\n\trandom() {\n\n\t\t// Derived from http://planning.cs.uiuc.edu/node198.html\n\t\t// Note, this source uses w, x, y, z ordering,\n\t\t// so we swap the order below.\n\n\t\tconst u1 = Math.random();\n\t\tconst sqrt1u1 = Math.sqrt( 1 - u1 );\n\t\tconst sqrtu1 = Math.sqrt( u1 );\n\n\t\tconst u2 = 2 * Math.PI * Math.random();\n\n\t\tconst u3 = 2 * Math.PI * Math.random();\n\n\t\treturn this.set(\n\t\t\tsqrt1u1 * Math.cos( u2 ),\n\t\t\tsqrtu1 * Math.sin( u3 ),\n\t\t\tsqrtu1 * Math.cos( u3 ),\n\t\t\tsqrt1u1 * Math.sin( u2 ),\n\t\t);\n\n\t}\n\n\tequals( quaternion ) {\n\n\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis._x = array[ offset ];\n\t\tthis._y = array[ offset + 1 ];\n\t\tthis._z = array[ offset + 2 ];\n\t\tthis._w = array[ offset + 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._w;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis._x = attribute.getX( index );\n\t\tthis._y = attribute.getY( index );\n\t\tthis._z = attribute.getZ( index );\n\t\tthis._w = attribute.getW( index );\n\n\t\treturn this;\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._w;\n\n\t}\n\n}\n\nclass Vector3 {\n\n\tconstructor( x = 0, y = 0, z = 0 ) {\n\n\t\tVector3.prototype.isVector3 = true;\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t}\n\n\tset( x, y, z ) {\n\n\t\tif ( z === undefined ) z = this.z; // sprite.scale.set(x,y)\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t}\n\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\n\t\treturn this;\n\n\t}\n\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\n\t\treturn this;\n\n\t}\n\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\n\t\treturn this;\n\n\t}\n\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\n\t\treturn this;\n\n\t}\n\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\n\t\treturn this;\n\n\t}\n\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyVectors( a, b ) {\n\n\t\tthis.x = a.x * b.x;\n\t\tthis.y = a.y * b.y;\n\t\tthis.z = a.z * b.z;\n\n\t\treturn this;\n\n\t}\n\n\tapplyEuler( euler ) {\n\n\t\treturn this.applyQuaternion( _quaternion$4.setFromEuler( euler ) );\n\n\t}\n\n\tapplyAxisAngle( axis, angle ) {\n\n\t\treturn this.applyQuaternion( _quaternion$4.setFromAxisAngle( axis, angle ) );\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\treturn this;\n\n\t}\n\n\tapplyNormalMatrix( m ) {\n\n\t\treturn this.applyMatrix3( m ).normalize();\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tconst w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] );\n\n\t\tthis.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w;\n\t\tthis.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w;\n\t\tthis.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w;\n\n\t\treturn this;\n\n\t}\n\n\tapplyQuaternion( q ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t// calculate quat * vector\n\n\t\tconst ix = qw * x + qy * z - qz * y;\n\t\tconst iy = qw * y + qz * x - qx * z;\n\t\tconst iz = qw * z + qx * y - qy * x;\n\t\tconst iw = - qx * x - qy * y - qz * z;\n\n\t\t// calculate result * inverse quat\n\n\t\tthis.x = ix * qw + iw * - qx + iy * - qz - iz * - qy;\n\t\tthis.y = iy * qw + iw * - qy + iz * - qx - ix * - qz;\n\t\tthis.z = iz * qw + iw * - qz + ix * - qy - iy * - qx;\n\n\t\treturn this;\n\n\t}\n\n\tproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix );\n\n\t}\n\n\tunproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.projectionMatrixInverse ).applyMatrix4( camera.matrixWorld );\n\n\t}\n\n\ttransformDirection( m ) {\n\n\t\t// input: THREE.Matrix4 affine matrix\n\t\t// vector interpreted as a direction\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\treturn this.normalize();\n\n\t}\n\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\t\tthis.z /= v.z;\n\n\t\treturn this;\n\n\t}\n\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = Math.max( min.x, Math.min( max.x, this.x ) );\n\t\tthis.y = Math.max( min.y, Math.min( max.y, this.y ) );\n\t\tthis.z = Math.max( min.z, Math.min( max.z, this.z ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = Math.max( minVal, Math.min( maxVal, this.x ) );\n\t\tthis.y = Math.max( minVal, Math.min( maxVal, this.y ) );\n\t\tthis.z = Math.max( minVal, Math.min( maxVal, this.z ) );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( Math.max( min, Math.min( max, length ) ) );\n\n\t}\n\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\n\t\treturn this;\n\n\t}\n\n\troundToZero() {\n\n\t\tthis.x = ( this.x < 0 ) ? Math.ceil( this.x ) : Math.floor( this.x );\n\t\tthis.y = ( this.y < 0 ) ? Math.ceil( this.y ) : Math.floor( this.y );\n\t\tthis.z = ( this.z < 0 ) ? Math.ceil( this.z ) : Math.floor( this.z );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t}\n\n\t// TODO lengthSquared?\n\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t}\n\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t}\n\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tcross( v ) {\n\n\t\treturn this.crossVectors( this, v );\n\n\t}\n\n\tcrossVectors( a, b ) {\n\n\t\tconst ax = a.x, ay = a.y, az = a.z;\n\t\tconst bx = b.x, by = b.y, bz = b.z;\n\n\t\tthis.x = ay * bz - az * by;\n\t\tthis.y = az * bx - ax * bz;\n\t\tthis.z = ax * by - ay * bx;\n\n\t\treturn this;\n\n\t}\n\n\tprojectOnVector( v ) {\n\n\t\tconst denominator = v.lengthSq();\n\n\t\tif ( denominator === 0 ) return this.set( 0, 0, 0 );\n\n\t\tconst scalar = v.dot( this ) / denominator;\n\n\t\treturn this.copy( v ).multiplyScalar( scalar );\n\n\t}\n\n\tprojectOnPlane( planeNormal ) {\n\n\t\t_vector$c.copy( this ).projectOnVector( planeNormal );\n\n\t\treturn this.sub( _vector$c );\n\n\t}\n\n\treflect( normal ) {\n\n\t\t// reflect incident vector off plane orthogonal to normal\n\t\t// normal is assumed to have unit length\n\n\t\treturn this.sub( _vector$c.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t}\n\n\tangleTo( v ) {\n\n\t\tconst denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );\n\n\t\tif ( denominator === 0 ) return Math.PI / 2;\n\n\t\tconst theta = this.dot( v ) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( clamp( theta, - 1, 1 ) );\n\n\t}\n\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t}\n\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t}\n\n\tsetFromSpherical( s ) {\n\n\t\treturn this.setFromSphericalCoords( s.radius, s.phi, s.theta );\n\n\t}\n\n\tsetFromSphericalCoords( radius, phi, theta ) {\n\n\t\tconst sinPhiRadius = Math.sin( phi ) * radius;\n\n\t\tthis.x = sinPhiRadius * Math.sin( theta );\n\t\tthis.y = Math.cos( phi ) * radius;\n\t\tthis.z = sinPhiRadius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCylindrical( c ) {\n\n\t\treturn this.setFromCylindricalCoords( c.radius, c.theta, c.y );\n\n\t}\n\n\tsetFromCylindricalCoords( radius, theta, y ) {\n\n\t\tthis.x = radius * Math.sin( theta );\n\t\tthis.y = y;\n\t\tthis.z = radius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixPosition( m ) {\n\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 12 ];\n\t\tthis.y = e[ 13 ];\n\t\tthis.z = e[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixScale( m ) {\n\n\t\tconst sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\tconst sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\tconst sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\tthis.x = sx;\n\t\tthis.y = sy;\n\t\tthis.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixColumn( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t}\n\n\tsetFromMatrix3Column( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 3 );\n\n\t}\n\n\tsetFromEuler( e ) {\n\n\t\tthis.x = e._x;\n\t\tthis.y = e._y;\n\t\tthis.z = e._z;\n\n\t\treturn this;\n\n\t}\n\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\trandomDirection() {\n\n\t\t// Derived from https://mathworld.wolfram.com/SpherePointPicking.html\n\n\t\tconst u = ( Math.random() - 0.5 ) * 2;\n\t\tconst t = Math.random() * Math.PI * 2;\n\t\tconst f = Math.sqrt( 1 - u ** 2 );\n\n\t\tthis.x = f * Math.cos( t );\n\t\tthis.y = f * Math.sin( t );\n\t\tthis.z = u;\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\n\t}\n\n}\n\nconst _vector$c = /*@__PURE__*/ new Vector3();\nconst _quaternion$4 = /*@__PURE__*/ new Quaternion();\n\nclass Box3 {\n\n\tconstructor( min = new Vector3( + Infinity, + Infinity, + Infinity ), max = new Vector3( - Infinity, - Infinity, - Infinity ) ) {\n\n\t\tthis.isBox3 = true;\n\n\t\tthis.min = min;\n\t\tthis.max = max;\n\n\t}\n\n\tset( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromArray( array ) {\n\n\t\tlet minX = + Infinity;\n\t\tlet minY = + Infinity;\n\t\tlet minZ = + Infinity;\n\n\t\tlet maxX = - Infinity;\n\t\tlet maxY = - Infinity;\n\t\tlet maxZ = - Infinity;\n\n\t\tfor ( let i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\tconst x = array[ i ];\n\t\t\tconst y = array[ i + 1 ];\n\t\t\tconst z = array[ i + 2 ];\n\n\t\t\tif ( x < minX ) minX = x;\n\t\t\tif ( y < minY ) minY = y;\n\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\tif ( x > maxX ) maxX = x;\n\t\t\tif ( y > maxY ) maxY = y;\n\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t}\n\n\t\tthis.min.set( minX, minY, minZ );\n\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromBufferAttribute( attribute ) {\n\n\t\tlet minX = + Infinity;\n\t\tlet minY = + Infinity;\n\t\tlet minZ = + Infinity;\n\n\t\tlet maxX = - Infinity;\n\t\tlet maxY = - Infinity;\n\t\tlet maxZ = - Infinity;\n\n\t\tfor ( let i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\tconst x = attribute.getX( i );\n\t\t\tconst y = attribute.getY( i );\n\t\t\tconst z = attribute.getZ( i );\n\n\t\t\tif ( x < minX ) minX = x;\n\t\t\tif ( y < minY ) minY = y;\n\t\t\tif ( z < minZ ) minZ = z;\n\n\t\t\tif ( x > maxX ) maxX = x;\n\t\t\tif ( y > maxY ) maxY = y;\n\t\t\tif ( z > maxZ ) maxZ = z;\n\n\t\t}\n\n\t\tthis.min.set( minX, minY, minZ );\n\t\tthis.max.set( maxX, maxY, maxZ );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCenterAndSize( center, size ) {\n\n\t\tconst halfSize = _vector$b.copy( size ).multiplyScalar( 0.5 );\n\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromObject( object, precise = false ) {\n\n\t\tthis.makeEmpty();\n\n\t\treturn this.expandByObject( object, precise );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t}\n\n\tmakeEmpty() {\n\n\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\treturn this;\n\n\t}\n\n\tisEmpty() {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t}\n\n\tgetCenter( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t}\n\n\tgetSize( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\texpandByPoint( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t}\n\n\texpandByVector( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t}\n\n\texpandByScalar( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t}\n\n\texpandByObject( object, precise = false ) {\n\n\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t// accounting for both the object's, and children's, world transforms\n\n\t\tobject.updateWorldMatrix( false, false );\n\n\t\tconst geometry = object.geometry;\n\n\t\tif ( geometry !== undefined ) {\n\n\t\t\tif ( precise && geometry.attributes != undefined && geometry.attributes.position !== undefined ) {\n\n\t\t\t\tconst position = geometry.attributes.position;\n\t\t\t\tfor ( let i = 0, l = position.count; i < l; i ++ ) {\n\n\t\t\t\t\t_vector$b.fromBufferAttribute( position, i ).applyMatrix4( object.matrixWorld );\n\t\t\t\t\tthis.expandByPoint( _vector$b );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\t\t\tgeometry.computeBoundingBox();\n\n\t\t\t\t}\n\n\t\t\t\t_box$3.copy( geometry.boundingBox );\n\t\t\t\t_box$3.applyMatrix4( object.matrixWorld );\n\n\t\t\t\tthis.union( _box$3 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tthis.expandByObject( children[ i ], precise );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\tpoint.y < this.min.y || point.y > this.max.y ||\n\t\t\tpoint.z < this.min.z || point.z > this.max.z ? false : true;\n\n\t}\n\n\tcontainsBox( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y &&\n\t\t\tthis.min.z <= box.min.z && box.max.z <= this.max.z;\n\n\t}\n\n\tgetParameter( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t);\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\t// using 6 splitting planes to rule out intersections.\n\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ||\n\t\t\tbox.max.z < this.min.z || box.min.z > this.max.z ? false : true;\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\t// Find the point on the AABB closest to the sphere center.\n\t\tthis.clampPoint( sphere.center, _vector$b );\n\n\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\treturn _vector$b.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\tintersectsPlane( plane ) {\n\n\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\tlet min, max;\n\n\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t} else {\n\n\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t}\n\n\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t}\n\n\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t}\n\n\t\treturn ( min <= - plane.constant && max >= - plane.constant );\n\n\t}\n\n\tintersectsTriangle( triangle ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// compute box center and extents\n\t\tthis.getCenter( _center );\n\t\t_extents.subVectors( this.max, _center );\n\n\t\t// translate triangle to aabb origin\n\t\t_v0$2.subVectors( triangle.a, _center );\n\t\t_v1$7.subVectors( triangle.b, _center );\n\t\t_v2$4.subVectors( triangle.c, _center );\n\n\t\t// compute edge vectors for triangle\n\t\t_f0.subVectors( _v1$7, _v0$2 );\n\t\t_f1.subVectors( _v2$4, _v1$7 );\n\t\t_f2.subVectors( _v0$2, _v2$4 );\n\n\t\t// test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb\n\t\t// make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation\n\t\t// axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned)\n\t\tlet axes = [\n\t\t\t0, - _f0.z, _f0.y, 0, - _f1.z, _f1.y, 0, - _f2.z, _f2.y,\n\t\t\t_f0.z, 0, - _f0.x, _f1.z, 0, - _f1.x, _f2.z, 0, - _f2.x,\n\t\t\t- _f0.y, _f0.x, 0, - _f1.y, _f1.x, 0, - _f2.y, _f2.x, 0\n\t\t];\n\t\tif ( ! satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// test 3 face normals from the aabb\n\t\taxes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ];\n\t\tif ( ! satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// finally testing the face normal of the triangle\n\t\t// use already existing triangle edge vectors here\n\t\t_triangleNormal.crossVectors( _f0, _f1 );\n\t\taxes = [ _triangleNormal.x, _triangleNormal.y, _triangleNormal.z ];\n\n\t\treturn satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents );\n\n\t}\n\n\tclampPoint( point, target ) {\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\tconst clampedPoint = _vector$b.copy( point ).clamp( this.min, this.max );\n\n\t\treturn clampedPoint.sub( point ).length();\n\n\t}\n\n\tgetBoundingSphere( target ) {\n\n\t\tthis.getCenter( target.center );\n\n\t\ttarget.radius = this.getSize( _vector$b ).length() * 0.5;\n\n\t\treturn target;\n\n\t}\n\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\t// ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values.\n\t\tif ( this.isEmpty() ) this.makeEmpty();\n\n\t\treturn this;\n\n\t}\n\n\tunion( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\t// transform of empty box is an empty box.\n\t\tif ( this.isEmpty() ) return this;\n\n\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t_points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t_points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t_points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t_points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t_points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t_points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t_points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t_points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111\n\n\t\tthis.setFromPoints( _points );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\tequals( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n}\n\nconst _points = [\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3()\n];\n\nconst _vector$b = /*@__PURE__*/ new Vector3();\n\nconst _box$3 = /*@__PURE__*/ new Box3();\n\n// triangle centered vertices\n\nconst _v0$2 = /*@__PURE__*/ new Vector3();\nconst _v1$7 = /*@__PURE__*/ new Vector3();\nconst _v2$4 = /*@__PURE__*/ new Vector3();\n\n// triangle edge vectors\n\nconst _f0 = /*@__PURE__*/ new Vector3();\nconst _f1 = /*@__PURE__*/ new Vector3();\nconst _f2 = /*@__PURE__*/ new Vector3();\n\nconst _center = /*@__PURE__*/ new Vector3();\nconst _extents = /*@__PURE__*/ new Vector3();\nconst _triangleNormal = /*@__PURE__*/ new Vector3();\nconst _testAxis = /*@__PURE__*/ new Vector3();\n\nfunction satForAxes( axes, v0, v1, v2, extents ) {\n\n\tfor ( let i = 0, j = axes.length - 3; i <= j; i += 3 ) {\n\n\t\t_testAxis.fromArray( axes, i );\n\t\t// project the aabb onto the separating axis\n\t\tconst r = extents.x * Math.abs( _testAxis.x ) + extents.y * Math.abs( _testAxis.y ) + extents.z * Math.abs( _testAxis.z );\n\t\t// project all 3 vertices of the triangle onto the separating axis\n\t\tconst p0 = v0.dot( _testAxis );\n\t\tconst p1 = v1.dot( _testAxis );\n\t\tconst p2 = v2.dot( _testAxis );\n\t\t// actual test, basically see if either of the most extreme of the triangle points intersects r\n\t\tif ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) {\n\n\t\t\t// points of the projected triangle are outside the projected half-length of the aabb\n\t\t\t// the axis is separating and we can exit\n\t\t\treturn false;\n\n\t\t}\n\n\t}\n\n\treturn true;\n\n}\n\nconst _box$2 = /*@__PURE__*/ new Box3();\nconst _v1$6 = /*@__PURE__*/ new Vector3();\nconst _v2$3 = /*@__PURE__*/ new Vector3();\n\nclass Sphere {\n\n\tconstructor( center = new Vector3(), radius = - 1 ) {\n\n\t\tthis.center = center;\n\t\tthis.radius = radius;\n\n\t}\n\n\tset( center, radius ) {\n\n\t\tthis.center.copy( center );\n\t\tthis.radius = radius;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points, optionalCenter ) {\n\n\t\tconst center = this.center;\n\n\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\tcenter.copy( optionalCenter );\n\n\t\t} else {\n\n\t\t\t_box$2.setFromPoints( points ).getCenter( center );\n\n\t\t}\n\n\t\tlet maxRadiusSq = 0;\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t}\n\n\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( sphere ) {\n\n\t\tthis.center.copy( sphere.center );\n\t\tthis.radius = sphere.radius;\n\n\t\treturn this;\n\n\t}\n\n\tisEmpty() {\n\n\t\treturn ( this.radius < 0 );\n\n\t}\n\n\tmakeEmpty() {\n\n\t\tthis.center.set( 0, 0, 0 );\n\t\tthis.radius = - 1;\n\n\t\treturn this;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\tconst radiusSum = this.radius + sphere.radius;\n\n\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsSphere( this );\n\n\t}\n\n\tintersectsPlane( plane ) {\n\n\t\treturn Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius;\n\n\t}\n\n\tclampPoint( point, target ) {\n\n\t\tconst deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\ttarget.copy( point );\n\n\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\ttarget.sub( this.center ).normalize();\n\t\t\ttarget.multiplyScalar( this.radius ).add( this.center );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\tgetBoundingBox( target ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\t// Empty sphere produces empty bounding box\n\t\t\ttarget.makeEmpty();\n\t\t\treturn target;\n\n\t\t}\n\n\t\ttarget.set( this.center, this.center );\n\t\ttarget.expandByScalar( this.radius );\n\n\t\treturn target;\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tthis.center.applyMatrix4( matrix );\n\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.center.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\texpandByPoint( point ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\tthis.center.copy( point );\n\n\t\t\tthis.radius = 0;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\t_v1$6.subVectors( point, this.center );\n\n\t\tconst lengthSq = _v1$6.lengthSq();\n\n\t\tif ( lengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\t// calculate the minimal sphere\n\n\t\t\tconst length = Math.sqrt( lengthSq );\n\n\t\t\tconst delta = ( length - this.radius ) * 0.5;\n\n\t\t\tthis.center.addScaledVector( _v1$6, delta / length );\n\n\t\t\tthis.radius += delta;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tunion( sphere ) {\n\n\t\tif ( sphere.isEmpty() ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\tthis.copy( sphere );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( this.center.equals( sphere.center ) === true ) {\n\n\t\t\t this.radius = Math.max( this.radius, sphere.radius );\n\n\t\t} else {\n\n\t\t\t_v2$3.subVectors( sphere.center, this.center ).setLength( sphere.radius );\n\n\t\t\tthis.expandByPoint( _v1$6.copy( sphere.center ).add( _v2$3 ) );\n\n\t\t\tthis.expandByPoint( _v1$6.copy( sphere.center ).sub( _v2$3 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tequals( sphere ) {\n\n\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _vector$a = /*@__PURE__*/ new Vector3();\nconst _segCenter = /*@__PURE__*/ new Vector3();\nconst _segDir = /*@__PURE__*/ new Vector3();\nconst _diff = /*@__PURE__*/ new Vector3();\n\nconst _edge1 = /*@__PURE__*/ new Vector3();\nconst _edge2 = /*@__PURE__*/ new Vector3();\nconst _normal$1 = /*@__PURE__*/ new Vector3();\n\nclass Ray {\n\n\tconstructor( origin = new Vector3(), direction = new Vector3( 0, 0, - 1 ) ) {\n\n\t\tthis.origin = origin;\n\t\tthis.direction = direction;\n\n\t}\n\n\tset( origin, direction ) {\n\n\t\tthis.origin.copy( origin );\n\t\tthis.direction.copy( direction );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( ray ) {\n\n\t\tthis.origin.copy( ray.origin );\n\t\tthis.direction.copy( ray.direction );\n\n\t\treturn this;\n\n\t}\n\n\tat( t, target ) {\n\n\t\treturn target.copy( this.direction ).multiplyScalar( t ).add( this.origin );\n\n\t}\n\n\tlookAt( v ) {\n\n\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\treturn this;\n\n\t}\n\n\trecast( t ) {\n\n\t\tthis.origin.copy( this.at( t, _vector$a ) );\n\n\t\treturn this;\n\n\t}\n\n\tclosestPointToPoint( point, target ) {\n\n\t\ttarget.subVectors( point, this.origin );\n\n\t\tconst directionDistance = target.dot( this.direction );\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn target.copy( this.origin );\n\n\t\t}\n\n\t\treturn target.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t}\n\n\tdistanceSqToPoint( point ) {\n\n\t\tconst directionDistance = _vector$a.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t// point behind the ray\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t}\n\n\t\t_vector$a.copy( this.direction ).multiplyScalar( directionDistance ).add( this.origin );\n\n\t\treturn _vector$a.distanceToSquared( point );\n\n\t}\n\n\tdistanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t// It returns the min distance between the ray and the segment\n\t\t// defined by v0 and v1\n\t\t// It can also set two optional targets :\n\t\t// - The closest point on the ray\n\t\t// - The closest point on the segment\n\n\t\t_segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t_segDir.copy( v1 ).sub( v0 ).normalize();\n\t\t_diff.copy( this.origin ).sub( _segCenter );\n\n\t\tconst segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\tconst a01 = - this.direction.dot( _segDir );\n\t\tconst b0 = _diff.dot( this.direction );\n\t\tconst b1 = - _diff.dot( _segDir );\n\t\tconst c = _diff.lengthSq();\n\t\tconst det = Math.abs( 1 - a01 * a01 );\n\t\tlet s0, s1, sqrDist, extDet;\n\n\t\tif ( det > 0 ) {\n\n\t\t\t// The ray and segment are not parallel.\n\n\t\t\ts0 = a01 * b1 - b0;\n\t\t\ts1 = a01 * b0 - b1;\n\t\t\textDet = segExtent * det;\n\n\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\tconst invDet = 1 / det;\n\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\ts1 *= invDet;\n\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 5\n\n\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t// region 4\n\n\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t// region 3\n\n\t\t\t\t\ts0 = 0;\n\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 2\n\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// Ray and segment are parallel.\n\n\t\t\ts1 = ( a01 > 0 ) ? - segExtent : segExtent;\n\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t}\n\n\t\tif ( optionalPointOnRay ) {\n\n\t\t\toptionalPointOnRay.copy( this.direction ).multiplyScalar( s0 ).add( this.origin );\n\n\t\t}\n\n\t\tif ( optionalPointOnSegment ) {\n\n\t\t\toptionalPointOnSegment.copy( _segDir ).multiplyScalar( s1 ).add( _segCenter );\n\n\t\t}\n\n\t\treturn sqrDist;\n\n\t}\n\n\tintersectSphere( sphere, target ) {\n\n\t\t_vector$a.subVectors( sphere.center, this.origin );\n\t\tconst tca = _vector$a.dot( this.direction );\n\t\tconst d2 = _vector$a.dot( _vector$a ) - tca * tca;\n\t\tconst radius2 = sphere.radius * sphere.radius;\n\n\t\tif ( d2 > radius2 ) return null;\n\n\t\tconst thc = Math.sqrt( radius2 - d2 );\n\n\t\t// t0 = first intersect point - entrance on front of sphere\n\t\tconst t0 = tca - thc;\n\n\t\t// t1 = second intersect point - exit point on back of sphere\n\t\tconst t1 = tca + thc;\n\n\t\t// test to see if both t0 and t1 are behind the ray - if so, return null\n\t\tif ( t0 < 0 && t1 < 0 ) return null;\n\n\t\t// test to see if t0 is behind the ray:\n\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t// in order to always return an intersect point that is in front of the ray.\n\t\tif ( t0 < 0 ) return this.at( t1, target );\n\n\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\treturn this.at( t0, target );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\treturn this.distanceSqToPoint( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\tdistanceToPlane( plane ) {\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t// Return if the ray never intersects the plane\n\n\t\treturn t >= 0 ? t : null;\n\n\t}\n\n\tintersectPlane( plane, target ) {\n\n\t\tconst t = this.distanceToPlane( plane );\n\n\t\tif ( t === null ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn this.at( t, target );\n\n\t}\n\n\tintersectsPlane( plane ) {\n\n\t\t// check if the ray lies on the plane first\n\n\t\tconst distToPoint = plane.distanceToPoint( this.origin );\n\n\t\tif ( distToPoint === 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\treturn false;\n\n\t}\n\n\tintersectBox( box, target ) {\n\n\t\tlet tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\tconst invdirx = 1 / this.direction.x,\n\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\tconst origin = this.origin;\n\n\t\tif ( invdirx >= 0 ) {\n\n\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t} else {\n\n\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t}\n\n\t\tif ( invdiry >= 0 ) {\n\n\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t} else {\n\n\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t}\n\n\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\n\n\t\tif ( tymin > tmin || isNaN( tmin ) ) tmin = tymin;\n\n\t\tif ( tymax < tmax || isNaN( tmax ) ) tmax = tymax;\n\n\t\tif ( invdirz >= 0 ) {\n\n\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t} else {\n\n\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t}\n\n\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t\t//return point closest to the ray (positive side)\n\n\t\tif ( tmax < 0 ) return null;\n\n\t\treturn this.at( tmin >= 0 ? tmin : tmax, target );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn this.intersectBox( box, _vector$a ) !== null;\n\n\t}\n\n\tintersectTriangle( a, b, c, backfaceCulling, target ) {\n\n\t\t// Compute the offset origin, edges, and normal.\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t_edge1.subVectors( b, a );\n\t\t_edge2.subVectors( c, a );\n\t\t_normal$1.crossVectors( _edge1, _edge2 );\n\n\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t// |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t// |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t// |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\tlet DdN = this.direction.dot( _normal$1 );\n\t\tlet sign;\n\n\t\tif ( DdN > 0 ) {\n\n\t\t\tif ( backfaceCulling ) return null;\n\t\t\tsign = 1;\n\n\t\t} else if ( DdN < 0 ) {\n\n\t\t\tsign = - 1;\n\t\t\tDdN = - DdN;\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t_diff.subVectors( this.origin, a );\n\t\tconst DdQxE2 = sign * this.direction.dot( _edge2.crossVectors( _diff, _edge2 ) );\n\n\t\t// b1 < 0, no intersection\n\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst DdE1xQ = sign * this.direction.dot( _edge1.cross( _diff ) );\n\n\t\t// b2 < 0, no intersection\n\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// b1+b2 > 1, no intersection\n\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Line intersects triangle, check if ray does.\n\t\tconst QdN = - sign * _diff.dot( _normal$1 );\n\n\t\t// t < 0, no intersection\n\t\tif ( QdN < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Ray intersects triangle.\n\t\treturn this.at( QdN / DdN, target );\n\n\t}\n\n\tapplyMatrix4( matrix4 ) {\n\n\t\tthis.origin.applyMatrix4( matrix4 );\n\t\tthis.direction.transformDirection( matrix4 );\n\n\t\treturn this;\n\n\t}\n\n\tequals( ray ) {\n\n\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nclass Matrix4 {\n\n\tconstructor() {\n\n\t\tMatrix4.prototype.isMatrix4 = true;\n\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t];\n\n\t}\n\n\tset( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\treturn this;\n\n\t}\n\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new Matrix4().fromArray( this.elements );\n\n\t}\n\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ];\n\t\tte[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ];\n\t\tte[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ];\n\t\tte[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ];\n\n\t\treturn this;\n\n\t}\n\n\tcopyPosition( m ) {\n\n\t\tconst te = this.elements, me = m.elements;\n\n\t\tte[ 12 ] = me[ 12 ];\n\t\tte[ 13 ] = me[ 13 ];\n\t\tte[ 14 ] = me[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrix3( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 3 ], me[ 6 ], 0,\n\t\t\tme[ 1 ], me[ 4 ], me[ 7 ], 0,\n\t\t\tme[ 2 ], me[ 5 ], me[ 8 ], 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\tmakeBasis( xAxis, yAxis, zAxis ) {\n\n\t\tthis.set(\n\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\textractRotation( m ) {\n\n\t\t// this method does not support reflection matrices\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tconst scaleX = 1 / _v1$5.setFromMatrixColumn( m, 0 ).length();\n\t\tconst scaleY = 1 / _v1$5.setFromMatrixColumn( m, 1 ).length();\n\t\tconst scaleZ = 1 / _v1$5.setFromMatrixColumn( m, 2 ).length();\n\n\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationFromEuler( euler ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = euler.x, y = euler.y, z = euler.z;\n\t\tconst a = Math.cos( x ), b = Math.sin( x );\n\t\tconst c = Math.cos( y ), d = Math.sin( y );\n\t\tconst e = Math.cos( z ), f = Math.sin( z );\n\n\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - c * f;\n\t\t\tte[ 8 ] = d;\n\n\t\t\tte[ 1 ] = af + be * d;\n\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\tte[ 9 ] = - b * c;\n\n\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\tte[ 6 ] = be + af * d;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce + df * b;\n\t\t\tte[ 4 ] = de * b - cf;\n\t\t\tte[ 8 ] = a * d;\n\n\t\t\tte[ 1 ] = a * f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b;\n\n\t\t\tte[ 2 ] = cf * b - de;\n\t\t\tte[ 6 ] = df + ce * b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce - df * b;\n\t\t\tte[ 4 ] = - a * f;\n\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\tte[ 1 ] = cf + de * b;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\tte[ 2 ] = - a * d;\n\t\t\tte[ 6 ] = b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = be * d - af;\n\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\tte[ 1 ] = c * f;\n\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\tte[ 2 ] = - d;\n\t\t\tte[ 6 ] = b * c;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\tte[ 1 ] = f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b * e;\n\n\t\t\tte[ 2 ] = - d * e;\n\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - f;\n\t\t\tte[ 8 ] = d * e;\n\n\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\tte[ 6 ] = b * e;\n\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t}\n\n\t\t// bottom row\n\t\tte[ 3 ] = 0;\n\t\tte[ 7 ] = 0;\n\t\tte[ 11 ] = 0;\n\n\t\t// last column\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationFromQuaternion( q ) {\n\n\t\treturn this.compose( _zero, q, _one );\n\n\t}\n\n\tlookAt( eye, target, up ) {\n\n\t\tconst te = this.elements;\n\n\t\t_z.subVectors( eye, target );\n\n\t\tif ( _z.lengthSq() === 0 ) {\n\n\t\t\t// eye and target are in the same position\n\n\t\t\t_z.z = 1;\n\n\t\t}\n\n\t\t_z.normalize();\n\t\t_x.crossVectors( up, _z );\n\n\t\tif ( _x.lengthSq() === 0 ) {\n\n\t\t\t// up and z are parallel\n\n\t\t\tif ( Math.abs( up.z ) === 1 ) {\n\n\t\t\t\t_z.x += 0.0001;\n\n\t\t\t} else {\n\n\t\t\t\t_z.z += 0.0001;\n\n\t\t\t}\n\n\t\t\t_z.normalize();\n\t\t\t_x.crossVectors( up, _z );\n\n\t\t}\n\n\t\t_x.normalize();\n\t\t_y.crossVectors( _z, _x );\n\n\t\tte[ 0 ] = _x.x; te[ 4 ] = _y.x; te[ 8 ] = _z.x;\n\t\tte[ 1 ] = _x.y; te[ 5 ] = _y.y; te[ 9 ] = _z.y;\n\t\tte[ 2 ] = _x.z; te[ 6 ] = _y.z; te[ 10 ] = _z.z;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\tconst a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\tconst b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\tconst n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\tconst n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\tconst n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\t//TODO: make this more efficient\n\t\t//( based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm )\n\n\t\treturn (\n\t\t\tn41 * (\n\t\t\t\t+ n14 * n23 * n32\n\t\t\t\t - n13 * n24 * n32\n\t\t\t\t - n14 * n22 * n33\n\t\t\t\t + n12 * n24 * n33\n\t\t\t\t + n13 * n22 * n34\n\t\t\t\t - n12 * n23 * n34\n\t\t\t) +\n\t\t\tn42 * (\n\t\t\t\t+ n11 * n23 * n34\n\t\t\t\t - n11 * n24 * n33\n\t\t\t\t + n14 * n21 * n33\n\t\t\t\t - n13 * n21 * n34\n\t\t\t\t + n13 * n24 * n31\n\t\t\t\t - n14 * n23 * n31\n\t\t\t) +\n\t\t\tn43 * (\n\t\t\t\t+ n11 * n24 * n32\n\t\t\t\t - n11 * n22 * n34\n\t\t\t\t - n14 * n21 * n32\n\t\t\t\t + n12 * n21 * n34\n\t\t\t\t + n14 * n22 * n31\n\t\t\t\t - n12 * n24 * n31\n\t\t\t) +\n\t\t\tn44 * (\n\t\t\t\t- n13 * n22 * n31\n\t\t\t\t - n11 * n23 * n32\n\t\t\t\t + n11 * n22 * n33\n\t\t\t\t + n13 * n21 * n32\n\t\t\t\t - n12 * n21 * n33\n\t\t\t\t + n12 * n23 * n31\n\t\t\t)\n\n\t\t);\n\n\t}\n\n\ttranspose() {\n\n\t\tconst te = this.elements;\n\t\tlet tmp;\n\n\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\tsetPosition( x, y, z ) {\n\n\t\tconst te = this.elements;\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tte[ 12 ] = x.x;\n\t\t\tte[ 13 ] = x.y;\n\t\t\tte[ 14 ] = x.z;\n\n\t\t} else {\n\n\t\t\tte[ 12 ] = x;\n\t\t\tte[ 13 ] = y;\n\t\t\tte[ 14 ] = z;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tinvert() {\n\n\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ], n41 = te[ 3 ],\n\t\t\tn12 = te[ 4 ], n22 = te[ 5 ], n32 = te[ 6 ], n42 = te[ 7 ],\n\t\t\tn13 = te[ 8 ], n23 = te[ 9 ], n33 = te[ 10 ], n43 = te[ 11 ],\n\t\t\tn14 = te[ 12 ], n24 = te[ 13 ], n34 = te[ 14 ], n44 = te[ 15 ],\n\n\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\tconst det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\tte[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;\n\n\t\tte[ 4 ] = t12 * detInv;\n\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\tte[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;\n\n\t\tte[ 8 ] = t13 * detInv;\n\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\tte[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;\n\n\t\tte[ 12 ] = t14 * detInv;\n\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\tte[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\tscale( v ) {\n\n\t\tconst te = this.elements;\n\t\tconst x = v.x, y = v.y, z = v.z;\n\n\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\treturn this;\n\n\t}\n\n\tgetMaxScaleOnAxis() {\n\n\t\tconst te = this.elements;\n\n\t\tconst scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\tconst scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\tconst scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t}\n\n\tmakeTranslation( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, x,\n\t\t\t0, 1, 0, y,\n\t\t\t0, 0, 1, z,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationX( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, c, - s, 0,\n\t\t\t0, s, c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationY( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t c, 0, s, 0,\n\t\t\t 0, 1, 0, 0,\n\t\t\t- s, 0, c, 0,\n\t\t\t 0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationZ( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0, 0,\n\t\t\ts, c, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeRotationAxis( axis, angle ) {\n\n\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\tconst c = Math.cos( angle );\n\t\tconst s = Math.sin( angle );\n\t\tconst t = 1 - c;\n\t\tconst x = axis.x, y = axis.y, z = axis.z;\n\t\tconst tx = t * x, ty = t * y;\n\n\t\tthis.set(\n\n\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeScale( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0, 0,\n\t\t\t0, y, 0, 0,\n\t\t\t0, 0, z, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tmakeShear( xy, xz, yx, yz, zx, zy ) {\n\n\t\tthis.set(\n\n\t\t\t1, yx, zx, 0,\n\t\t\txy, 1, zy, 0,\n\t\t\txz, yz, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\tcompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w;\n\t\tconst x2 = x + x,\ty2 = y + y, z2 = z + z;\n\t\tconst xx = x * x2, xy = x * y2, xz = x * z2;\n\t\tconst yy = y * y2, yz = y * z2, zz = z * z2;\n\t\tconst wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\tconst sx = scale.x, sy = scale.y, sz = scale.z;\n\n\t\tte[ 0 ] = ( 1 - ( yy + zz ) ) * sx;\n\t\tte[ 1 ] = ( xy + wz ) * sx;\n\t\tte[ 2 ] = ( xz - wy ) * sx;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = ( xy - wz ) * sy;\n\t\tte[ 5 ] = ( 1 - ( xx + zz ) ) * sy;\n\t\tte[ 6 ] = ( yz + wx ) * sy;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = ( xz + wy ) * sz;\n\t\tte[ 9 ] = ( yz - wx ) * sz;\n\t\tte[ 10 ] = ( 1 - ( xx + yy ) ) * sz;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = position.x;\n\t\tte[ 13 ] = position.y;\n\t\tte[ 14 ] = position.z;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tdecompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tlet sx = _v1$5.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\tconst sy = _v1$5.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\tconst sz = _v1$5.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t// if determine is negative, we need to invert one scale\n\t\tconst det = this.determinant();\n\t\tif ( det < 0 ) sx = - sx;\n\n\t\tposition.x = te[ 12 ];\n\t\tposition.y = te[ 13 ];\n\t\tposition.z = te[ 14 ];\n\n\t\t// scale the rotation part\n\t\t_m1$2.copy( this );\n\n\t\tconst invSX = 1 / sx;\n\t\tconst invSY = 1 / sy;\n\t\tconst invSZ = 1 / sz;\n\n\t\t_m1$2.elements[ 0 ] *= invSX;\n\t\t_m1$2.elements[ 1 ] *= invSX;\n\t\t_m1$2.elements[ 2 ] *= invSX;\n\n\t\t_m1$2.elements[ 4 ] *= invSY;\n\t\t_m1$2.elements[ 5 ] *= invSY;\n\t\t_m1$2.elements[ 6 ] *= invSY;\n\n\t\t_m1$2.elements[ 8 ] *= invSZ;\n\t\t_m1$2.elements[ 9 ] *= invSZ;\n\t\t_m1$2.elements[ 10 ] *= invSZ;\n\n\t\tquaternion.setFromRotationMatrix( _m1$2 );\n\n\t\tscale.x = sx;\n\t\tscale.y = sy;\n\t\tscale.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\tmakePerspective( left, right, top, bottom, near, far ) {\n\n\t\tconst te = this.elements;\n\t\tconst x = 2 * near / ( right - left );\n\t\tconst y = 2 * near / ( top - bottom );\n\n\t\tconst a = ( right + left ) / ( right - left );\n\t\tconst b = ( top + bottom ) / ( top - bottom );\n\t\tconst c = - ( far + near ) / ( far - near );\n\t\tconst d = - 2 * far * near / ( far - near );\n\n\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a;\tte[ 12 ] = 0;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b;\tte[ 13 ] = 0;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c;\tte[ 14 ] = d;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = - 1;\tte[ 15 ] = 0;\n\n\t\treturn this;\n\n\t}\n\n\tmakeOrthographic( left, right, top, bottom, near, far ) {\n\n\t\tconst te = this.elements;\n\t\tconst w = 1.0 / ( right - left );\n\t\tconst h = 1.0 / ( top - bottom );\n\t\tconst p = 1.0 / ( far - near );\n\n\t\tconst x = ( right + left ) * w;\n\t\tconst y = ( top + bottom ) * h;\n\t\tconst z = ( far + near ) * p;\n\n\t\tte[ 0 ] = 2 * w;\tte[ 4 ] = 0;\tte[ 8 ] = 0;\tte[ 12 ] = - x;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = 2 * h;\tte[ 9 ] = 0;\tte[ 13 ] = - y;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = - 2 * p;\tte[ 14 ] = - z;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = 0;\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\treturn array;\n\n\t}\n\n}\n\nconst _v1$5 = /*@__PURE__*/ new Vector3();\nconst _m1$2 = /*@__PURE__*/ new Matrix4();\nconst _zero = /*@__PURE__*/ new Vector3( 0, 0, 0 );\nconst _one = /*@__PURE__*/ new Vector3( 1, 1, 1 );\nconst _x = /*@__PURE__*/ new Vector3();\nconst _y = /*@__PURE__*/ new Vector3();\nconst _z = /*@__PURE__*/ new Vector3();\n\nconst _matrix$1 = /*@__PURE__*/ new Matrix4();\nconst _quaternion$3 = /*@__PURE__*/ new Quaternion();\n\nclass Euler {\n\n\tconstructor( x = 0, y = 0, z = 0, order = Euler.DEFAULT_ORDER ) {\n\n\t\tthis.isEuler = true;\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t}\n\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tget order() {\n\n\t\treturn this._order;\n\n\t}\n\n\tset order( value ) {\n\n\t\tthis._order = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\tset( x, y, z, order = this._order ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t}\n\n\tcopy( euler ) {\n\n\t\tthis._x = euler._x;\n\t\tthis._y = euler._y;\n\t\tthis._z = euler._z;\n\t\tthis._order = euler._order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromRotationMatrix( m, order = this._order, update = true ) {\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements;\n\t\tconst m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\tconst m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\tconst m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = 0;\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m22 );\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, - 1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._y = Math.atan2( m13, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._y = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tconsole.warn( 'THREE.Euler: .setFromRotationMatrix() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tthis._order = order;\n\n\t\tif ( update === true ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\tsetFromQuaternion( q, order, update ) {\n\n\t\t_matrix$1.makeRotationFromQuaternion( q );\n\n\t\treturn this.setFromRotationMatrix( _matrix$1, order, update );\n\n\t}\n\n\tsetFromVector3( v, order = this._order ) {\n\n\t\treturn this.set( v.x, v.y, v.z, order );\n\n\t}\n\n\treorder( newOrder ) {\n\n\t\t// WARNING: this discards revolution information -bhouston\n\n\t\t_quaternion$3.setFromEuler( this );\n\n\t\treturn this.setFromQuaternion( _quaternion$3, newOrder );\n\n\t}\n\n\tequals( euler ) {\n\n\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t}\n\n\tfromArray( array ) {\n\n\t\tthis._x = array[ 0 ];\n\t\tthis._y = array[ 1 ];\n\t\tthis._z = array[ 2 ];\n\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._order;\n\n\t\treturn array;\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._order;\n\n\t}\n\n}\n\nEuler.DEFAULT_ORDER = 'XYZ';\n\nclass Layers {\n\n\tconstructor() {\n\n\t\tthis.mask = 1 | 0;\n\n\t}\n\n\tset( channel ) {\n\n\t\tthis.mask = ( 1 << channel | 0 ) >>> 0;\n\n\t}\n\n\tenable( channel ) {\n\n\t\tthis.mask |= 1 << channel | 0;\n\n\t}\n\n\tenableAll() {\n\n\t\tthis.mask = 0xffffffff | 0;\n\n\t}\n\n\ttoggle( channel ) {\n\n\t\tthis.mask ^= 1 << channel | 0;\n\n\t}\n\n\tdisable( channel ) {\n\n\t\tthis.mask &= ~ ( 1 << channel | 0 );\n\n\t}\n\n\tdisableAll() {\n\n\t\tthis.mask = 0;\n\n\t}\n\n\ttest( layers ) {\n\n\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t}\n\n\tisEnabled( channel ) {\n\n\t\treturn ( this.mask & ( 1 << channel | 0 ) ) !== 0;\n\n\t}\n\n}\n\nlet _object3DId = 0;\n\nconst _v1$4 = /*@__PURE__*/ new Vector3();\nconst _q1 = /*@__PURE__*/ new Quaternion();\nconst _m1$1 = /*@__PURE__*/ new Matrix4();\nconst _target = /*@__PURE__*/ new Vector3();\n\nconst _position$3 = /*@__PURE__*/ new Vector3();\nconst _scale$2 = /*@__PURE__*/ new Vector3();\nconst _quaternion$2 = /*@__PURE__*/ new Quaternion();\n\nconst _xAxis = /*@__PURE__*/ new Vector3( 1, 0, 0 );\nconst _yAxis = /*@__PURE__*/ new Vector3( 0, 1, 0 );\nconst _zAxis = /*@__PURE__*/ new Vector3( 0, 0, 1 );\n\nconst _addedEvent = { type: 'added' };\nconst _removedEvent = { type: 'removed' };\n\nclass Object3D extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isObject3D = true;\n\n\t\tObject.defineProperty( this, 'id', { value: _object3DId ++ } );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Object3D';\n\n\t\tthis.parent = null;\n\t\tthis.children = [];\n\n\t\tthis.up = Object3D.DEFAULT_UP.clone();\n\n\t\tconst position = new Vector3();\n\t\tconst rotation = new Euler();\n\t\tconst quaternion = new Quaternion();\n\t\tconst scale = new Vector3( 1, 1, 1 );\n\n\t\tfunction onRotationChange() {\n\n\t\t\tquaternion.setFromEuler( rotation, false );\n\n\t\t}\n\n\t\tfunction onQuaternionChange() {\n\n\t\t\trotation.setFromQuaternion( quaternion, undefined, false );\n\n\t\t}\n\n\t\trotation._onChange( onRotationChange );\n\t\tquaternion._onChange( onQuaternionChange );\n\n\t\tObject.defineProperties( this, {\n\t\t\tposition: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: position\n\t\t\t},\n\t\t\trotation: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: rotation\n\t\t\t},\n\t\t\tquaternion: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: quaternion\n\t\t\t},\n\t\t\tscale: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: scale\n\t\t\t},\n\t\t\tmodelViewMatrix: {\n\t\t\t\tvalue: new Matrix4()\n\t\t\t},\n\t\t\tnormalMatrix: {\n\t\t\t\tvalue: new Matrix3()\n\t\t\t}\n\t\t} );\n\n\t\tthis.matrix = new Matrix4();\n\t\tthis.matrixWorld = new Matrix4();\n\n\t\tthis.matrixAutoUpdate = Object3D.DEFAULT_MATRIX_AUTO_UPDATE;\n\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\tthis.matrixWorldAutoUpdate = Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE; // checked by the renderer\n\n\t\tthis.layers = new Layers();\n\t\tthis.visible = true;\n\n\t\tthis.castShadow = false;\n\t\tthis.receiveShadow = false;\n\n\t\tthis.frustumCulled = true;\n\t\tthis.renderOrder = 0;\n\n\t\tthis.animations = [];\n\n\t\tthis.userData = {};\n\n\t}\n\n\tonBeforeRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\tonAfterRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tthis.matrix.premultiply( matrix );\n\n\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t}\n\n\tapplyQuaternion( q ) {\n\n\t\tthis.quaternion.premultiply( q );\n\n\t\treturn this;\n\n\t}\n\n\tsetRotationFromAxisAngle( axis, angle ) {\n\n\t\t// assumes axis is normalized\n\n\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t}\n\n\tsetRotationFromEuler( euler ) {\n\n\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t}\n\n\tsetRotationFromMatrix( m ) {\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t}\n\n\tsetRotationFromQuaternion( q ) {\n\n\t\t// assumes q is normalized\n\n\t\tthis.quaternion.copy( q );\n\n\t}\n\n\trotateOnAxis( axis, angle ) {\n\n\t\t// rotate object on axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.multiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateOnWorldAxis( axis, angle ) {\n\n\t\t// rotate object on axis in world space\n\t\t// axis is assumed to be normalized\n\t\t// method assumes no rotated parent\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.premultiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateX( angle ) {\n\n\t\treturn this.rotateOnAxis( _xAxis, angle );\n\n\t}\n\n\trotateY( angle ) {\n\n\t\treturn this.rotateOnAxis( _yAxis, angle );\n\n\t}\n\n\trotateZ( angle ) {\n\n\t\treturn this.rotateOnAxis( _zAxis, angle );\n\n\t}\n\n\ttranslateOnAxis( axis, distance ) {\n\n\t\t// translate object by distance along axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_v1$4.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\tthis.position.add( _v1$4.multiplyScalar( distance ) );\n\n\t\treturn this;\n\n\t}\n\n\ttranslateX( distance ) {\n\n\t\treturn this.translateOnAxis( _xAxis, distance );\n\n\t}\n\n\ttranslateY( distance ) {\n\n\t\treturn this.translateOnAxis( _yAxis, distance );\n\n\t}\n\n\ttranslateZ( distance ) {\n\n\t\treturn this.translateOnAxis( _zAxis, distance );\n\n\t}\n\n\tlocalToWorld( vector ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t}\n\n\tworldToLocal( vector ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn vector.applyMatrix4( _m1$1.copy( this.matrixWorld ).invert() );\n\n\t}\n\n\tlookAt( x, y, z ) {\n\n\t\t// This method does not support objects having non-uniformly-scaled parent(s)\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\t_target.copy( x );\n\n\t\t} else {\n\n\t\t\t_target.set( x, y, z );\n\n\t\t}\n\n\t\tconst parent = this.parent;\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_position$3.setFromMatrixPosition( this.matrixWorld );\n\n\t\tif ( this.isCamera || this.isLight ) {\n\n\t\t\t_m1$1.lookAt( _position$3, _target, this.up );\n\n\t\t} else {\n\n\t\t\t_m1$1.lookAt( _target, _position$3, this.up );\n\n\t\t}\n\n\t\tthis.quaternion.setFromRotationMatrix( _m1$1 );\n\n\t\tif ( parent ) {\n\n\t\t\t_m1$1.extractRotation( parent.matrixWorld );\n\t\t\t_q1.setFromRotationMatrix( _m1$1 );\n\t\t\tthis.quaternion.premultiply( _q1.invert() );\n\n\t\t}\n\n\t}\n\n\tadd( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object === this ) {\n\n\t\t\tconsole.error( 'THREE.Object3D.add: object can\\'t be added as a child of itself.', object );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object && object.isObject3D ) {\n\n\t\t\tif ( object.parent !== null ) {\n\n\t\t\t\tobject.parent.remove( object );\n\n\t\t\t}\n\n\t\t\tobject.parent = this;\n\t\t\tthis.children.push( object );\n\n\t\t\tobject.dispatchEvent( _addedEvent );\n\n\t\t} else {\n\n\t\t\tconsole.error( 'THREE.Object3D.add: object not an instance of THREE.Object3D.', object );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremove( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst index = this.children.indexOf( object );\n\n\t\tif ( index !== - 1 ) {\n\n\t\t\tobject.parent = null;\n\t\t\tthis.children.splice( index, 1 );\n\n\t\t\tobject.dispatchEvent( _removedEvent );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremoveFromParent() {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tparent.remove( this );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclear() {\n\n\t\tfor ( let i = 0; i < this.children.length; i ++ ) {\n\n\t\t\tconst object = this.children[ i ];\n\n\t\t\tobject.parent = null;\n\n\t\t\tobject.dispatchEvent( _removedEvent );\n\n\t\t}\n\n\t\tthis.children.length = 0;\n\n\t\treturn this;\n\n\n\t}\n\n\tattach( object ) {\n\n\t\t// adds object as a child of this, while maintaining the object's world transform\n\n\t\t// Note: This method does not support scene graphs having non-uniformly-scaled nodes(s)\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_m1$1.copy( this.matrixWorld ).invert();\n\n\t\tif ( object.parent !== null ) {\n\n\t\t\tobject.parent.updateWorldMatrix( true, false );\n\n\t\t\t_m1$1.multiply( object.parent.matrixWorld );\n\n\t\t}\n\n\t\tobject.applyMatrix4( _m1$1 );\n\n\t\tthis.add( object );\n\n\t\tobject.updateWorldMatrix( false, true );\n\n\t\treturn this;\n\n\t}\n\n\tgetObjectById( id ) {\n\n\t\treturn this.getObjectByProperty( 'id', id );\n\n\t}\n\n\tgetObjectByName( name ) {\n\n\t\treturn this.getObjectByProperty( 'name', name );\n\n\t}\n\n\tgetObjectByProperty( name, value ) {\n\n\t\tif ( this[ name ] === value ) return this;\n\n\t\tfor ( let i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\tconst child = this.children[ i ];\n\t\t\tconst object = child.getObjectByProperty( name, value );\n\n\t\t\tif ( object !== undefined ) {\n\n\t\t\t\treturn object;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\tgetObjectsByProperty( name, value ) {\n\n\t\tlet result = [];\n\n\t\tif ( this[ name ] === value ) result.push( this );\n\n\t\tfor ( let i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\tconst childResult = this.children[ i ].getObjectsByProperty( name, value );\n\n\t\t\tif ( childResult.length > 0 ) {\n\n\t\t\t\tresult = result.concat( childResult );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tgetWorldPosition( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn target.setFromMatrixPosition( this.matrixWorld );\n\n\t}\n\n\tgetWorldQuaternion( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position$3, target, _scale$2 );\n\n\t\treturn target;\n\n\t}\n\n\tgetWorldScale( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position$3, _quaternion$2, target );\n\n\t\treturn target;\n\n\t}\n\n\tgetWorldDirection( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tconst e = this.matrixWorld.elements;\n\n\t\treturn target.set( e[ 8 ], e[ 9 ], e[ 10 ] ).normalize();\n\n\t}\n\n\traycast( /* raycaster, intersects */ ) {}\n\n\ttraverse( callback ) {\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverse( callback );\n\n\t\t}\n\n\t}\n\n\ttraverseVisible( callback ) {\n\n\t\tif ( this.visible === false ) return;\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t}\n\n\t}\n\n\ttraverseAncestors( callback ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tcallback( parent );\n\n\t\t\tparent.traverseAncestors( callback );\n\n\t\t}\n\n\t}\n\n\tupdateMatrix() {\n\n\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.matrixWorldNeedsUpdate || force ) {\n\n\t\t\tif ( this.parent === null ) {\n\n\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t}\n\n\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\tforce = true;\n\n\t\t}\n\n\t\t// update children\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tconst child = children[ i ];\n\n\t\t\tif ( child.matrixWorldAutoUpdate === true || force === true ) {\n\n\t\t\t\tchild.updateMatrixWorld( force );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( updateParents === true && parent !== null && parent.matrixWorldAutoUpdate === true ) {\n\n\t\t\tparent.updateWorldMatrix( true, false );\n\n\t\t}\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.parent === null ) {\n\n\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t} else {\n\n\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t}\n\n\t\t// update children\n\n\t\tif ( updateChildren === true ) {\n\n\t\t\tconst children = this.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = children[ i ];\n\n\t\t\t\tif ( child.matrixWorldAutoUpdate === true ) {\n\n\t\t\t\t\tchild.updateWorldMatrix( false, true );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\t// meta is a string when called from JSON.stringify\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tconst output = {};\n\n\t\t// meta is a hash used to collect geometries, materials.\n\t\t// not providing it implies that this is the root object\n\t\t// being serialized.\n\t\tif ( isRootObject ) {\n\n\t\t\t// initialize meta obj\n\t\t\tmeta = {\n\t\t\t\tgeometries: {},\n\t\t\t\tmaterials: {},\n\t\t\t\ttextures: {},\n\t\t\t\timages: {},\n\t\t\t\tshapes: {},\n\t\t\t\tskeletons: {},\n\t\t\t\tanimations: {},\n\t\t\t\tnodes: {}\n\t\t\t};\n\n\t\t\toutput.metadata = {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Object',\n\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t};\n\n\t\t}\n\n\t\t// standard Object3D serialization\n\n\t\tconst object = {};\n\n\t\tobject.uuid = this.uuid;\n\t\tobject.type = this.type;\n\n\t\tif ( this.name !== '' ) object.name = this.name;\n\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\tif ( this.visible === false ) object.visible = false;\n\t\tif ( this.frustumCulled === false ) object.frustumCulled = false;\n\t\tif ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder;\n\t\tif ( Object.keys( this.userData ).length > 0 ) object.userData = this.userData;\n\n\t\tobject.layers = this.layers.mask;\n\t\tobject.matrix = this.matrix.toArray();\n\n\t\tif ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false;\n\n\t\t// object specific properties\n\n\t\tif ( this.isInstancedMesh ) {\n\n\t\t\tobject.type = 'InstancedMesh';\n\t\t\tobject.count = this.count;\n\t\t\tobject.instanceMatrix = this.instanceMatrix.toJSON();\n\t\t\tif ( this.instanceColor !== null ) object.instanceColor = this.instanceColor.toJSON();\n\n\t\t}\n\n\t\t//\n\n\t\tfunction serialize( library, element ) {\n\n\t\t\tif ( library[ element.uuid ] === undefined ) {\n\n\t\t\t\tlibrary[ element.uuid ] = element.toJSON( meta );\n\n\t\t\t}\n\n\t\t\treturn element.uuid;\n\n\t\t}\n\n\t\tif ( this.isScene ) {\n\n\t\t\tif ( this.background ) {\n\n\t\t\t\tif ( this.background.isColor ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON();\n\n\t\t\t\t} else if ( this.background.isTexture ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON( meta ).uuid;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.environment && this.environment.isTexture && this.environment.isRenderTargetTexture !== true ) {\n\n\t\t\t\tobject.environment = this.environment.toJSON( meta ).uuid;\n\n\t\t\t}\n\n\t\t} else if ( this.isMesh || this.isLine || this.isPoints ) {\n\n\t\t\tobject.geometry = serialize( meta.geometries, this.geometry );\n\n\t\t\tconst parameters = this.geometry.parameters;\n\n\t\t\tif ( parameters !== undefined && parameters.shapes !== undefined ) {\n\n\t\t\t\tconst shapes = parameters.shapes;\n\n\t\t\t\tif ( Array.isArray( shapes ) ) {\n\n\t\t\t\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst shape = shapes[ i ];\n\n\t\t\t\t\t\tserialize( meta.shapes, shape );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tserialize( meta.shapes, shapes );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.isSkinnedMesh ) {\n\n\t\t\tobject.bindMode = this.bindMode;\n\t\t\tobject.bindMatrix = this.bindMatrix.toArray();\n\n\t\t\tif ( this.skeleton !== undefined ) {\n\n\t\t\t\tserialize( meta.skeletons, this.skeleton );\n\n\t\t\t\tobject.skeleton = this.skeleton.uuid;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.material !== undefined ) {\n\n\t\t\tif ( Array.isArray( this.material ) ) {\n\n\t\t\t\tconst uuids = [];\n\n\t\t\t\tfor ( let i = 0, l = this.material.length; i < l; i ++ ) {\n\n\t\t\t\t\tuuids.push( serialize( meta.materials, this.material[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = uuids;\n\n\t\t\t} else {\n\n\t\t\t\tobject.material = serialize( meta.materials, this.material );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.children.length > 0 ) {\n\n\t\t\tobject.children = [];\n\n\t\t\tfor ( let i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.animations.length > 0 ) {\n\n\t\t\tobject.animations = [];\n\n\t\t\tfor ( let i = 0; i < this.animations.length; i ++ ) {\n\n\t\t\t\tconst animation = this.animations[ i ];\n\n\t\t\t\tobject.animations.push( serialize( meta.animations, animation ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst geometries = extractFromCache( meta.geometries );\n\t\t\tconst materials = extractFromCache( meta.materials );\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\t\t\tconst shapes = extractFromCache( meta.shapes );\n\t\t\tconst skeletons = extractFromCache( meta.skeletons );\n\t\t\tconst animations = extractFromCache( meta.animations );\n\t\t\tconst nodes = extractFromCache( meta.nodes );\n\n\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\tif ( images.length > 0 ) output.images = images;\n\t\t\tif ( shapes.length > 0 ) output.shapes = shapes;\n\t\t\tif ( skeletons.length > 0 ) output.skeletons = skeletons;\n\t\t\tif ( animations.length > 0 ) output.animations = animations;\n\t\t\tif ( nodes.length > 0 ) output.nodes = nodes;\n\n\t\t}\n\n\t\toutput.object = object;\n\n\t\treturn output;\n\n\t\t// extract data from the cache hash\n\t\t// remove metadata on each item\n\t\t// and return as array\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t}\n\n\tclone( recursive ) {\n\n\t\treturn new this.constructor().copy( this, recursive );\n\n\t}\n\n\tcopy( source, recursive = true ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.up.copy( source.up );\n\n\t\tthis.position.copy( source.position );\n\t\tthis.rotation.order = source.rotation.order;\n\t\tthis.quaternion.copy( source.quaternion );\n\t\tthis.scale.copy( source.scale );\n\n\t\tthis.matrix.copy( source.matrix );\n\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\tthis.matrixWorldAutoUpdate = source.matrixWorldAutoUpdate;\n\n\t\tthis.layers.mask = source.layers.mask;\n\t\tthis.visible = source.visible;\n\n\t\tthis.castShadow = source.castShadow;\n\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\tthis.frustumCulled = source.frustumCulled;\n\t\tthis.renderOrder = source.renderOrder;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tfor ( let i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\tconst child = source.children[ i ];\n\t\t\t\tthis.add( child.clone() );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nObject3D.DEFAULT_UP = /*@__PURE__*/ new Vector3( 0, 1, 0 );\nObject3D.DEFAULT_MATRIX_AUTO_UPDATE = true;\nObject3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE = true;\n\nconst _v0$1 = /*@__PURE__*/ new Vector3();\nconst _v1$3 = /*@__PURE__*/ new Vector3();\nconst _v2$2 = /*@__PURE__*/ new Vector3();\nconst _v3$1 = /*@__PURE__*/ new Vector3();\n\nconst _vab = /*@__PURE__*/ new Vector3();\nconst _vac = /*@__PURE__*/ new Vector3();\nconst _vbc = /*@__PURE__*/ new Vector3();\nconst _vap = /*@__PURE__*/ new Vector3();\nconst _vbp = /*@__PURE__*/ new Vector3();\nconst _vcp = /*@__PURE__*/ new Vector3();\n\nclass Triangle {\n\n\tconstructor( a = new Vector3(), b = new Vector3(), c = new Vector3() ) {\n\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\n\t}\n\n\tstatic getNormal( a, b, c, target ) {\n\n\t\ttarget.subVectors( c, b );\n\t\t_v0$1.subVectors( a, b );\n\t\ttarget.cross( _v0$1 );\n\n\t\tconst targetLengthSq = target.lengthSq();\n\t\tif ( targetLengthSq > 0 ) {\n\n\t\t\treturn target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) );\n\n\t\t}\n\n\t\treturn target.set( 0, 0, 0 );\n\n\t}\n\n\t// static/instance method to calculate barycentric coordinates\n\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\tstatic getBarycoord( point, a, b, c, target ) {\n\n\t\t_v0$1.subVectors( c, a );\n\t\t_v1$3.subVectors( b, a );\n\t\t_v2$2.subVectors( point, a );\n\n\t\tconst dot00 = _v0$1.dot( _v0$1 );\n\t\tconst dot01 = _v0$1.dot( _v1$3 );\n\t\tconst dot02 = _v0$1.dot( _v2$2 );\n\t\tconst dot11 = _v1$3.dot( _v1$3 );\n\t\tconst dot12 = _v1$3.dot( _v2$2 );\n\n\t\tconst denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t// collinear or singular triangle\n\t\tif ( denom === 0 ) {\n\n\t\t\t// arbitrary location outside of triangle?\n\t\t\t// not sure if this is the best idea, maybe should be returning undefined\n\t\t\treturn target.set( - 2, - 1, - 1 );\n\n\t\t}\n\n\t\tconst invDenom = 1 / denom;\n\t\tconst u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\tconst v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t// barycentric coordinates must always sum to 1\n\t\treturn target.set( 1 - u - v, v, u );\n\n\t}\n\n\tstatic containsPoint( point, a, b, c ) {\n\n\t\tthis.getBarycoord( point, a, b, c, _v3$1 );\n\n\t\treturn ( _v3$1.x >= 0 ) && ( _v3$1.y >= 0 ) && ( ( _v3$1.x + _v3$1.y ) <= 1 );\n\n\t}\n\n\tstatic getUV( point, p1, p2, p3, uv1, uv2, uv3, target ) {\n\n\t\tthis.getBarycoord( point, p1, p2, p3, _v3$1 );\n\n\t\ttarget.set( 0, 0 );\n\t\ttarget.addScaledVector( uv1, _v3$1.x );\n\t\ttarget.addScaledVector( uv2, _v3$1.y );\n\t\ttarget.addScaledVector( uv3, _v3$1.z );\n\n\t\treturn target;\n\n\t}\n\n\tstatic isFrontFacing( a, b, c, direction ) {\n\n\t\t_v0$1.subVectors( c, b );\n\t\t_v1$3.subVectors( a, b );\n\n\t\t// strictly front facing\n\t\treturn ( _v0$1.cross( _v1$3 ).dot( direction ) < 0 ) ? true : false;\n\n\t}\n\n\tset( a, b, c ) {\n\n\t\tthis.a.copy( a );\n\t\tthis.b.copy( b );\n\t\tthis.c.copy( c );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPointsAndIndices( points, i0, i1, i2 ) {\n\n\t\tthis.a.copy( points[ i0 ] );\n\t\tthis.b.copy( points[ i1 ] );\n\t\tthis.c.copy( points[ i2 ] );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromAttributeAndIndices( attribute, i0, i1, i2 ) {\n\n\t\tthis.a.fromBufferAttribute( attribute, i0 );\n\t\tthis.b.fromBufferAttribute( attribute, i1 );\n\t\tthis.c.fromBufferAttribute( attribute, i2 );\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( triangle ) {\n\n\t\tthis.a.copy( triangle.a );\n\t\tthis.b.copy( triangle.b );\n\t\tthis.c.copy( triangle.c );\n\n\t\treturn this;\n\n\t}\n\n\tgetArea() {\n\n\t\t_v0$1.subVectors( this.c, this.b );\n\t\t_v1$3.subVectors( this.a, this.b );\n\n\t\treturn _v0$1.cross( _v1$3 ).length() * 0.5;\n\n\t}\n\n\tgetMidpoint( target ) {\n\n\t\treturn target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t}\n\n\tgetNormal( target ) {\n\n\t\treturn Triangle.getNormal( this.a, this.b, this.c, target );\n\n\t}\n\n\tgetPlane( target ) {\n\n\t\treturn target.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t}\n\n\tgetBarycoord( point, target ) {\n\n\t\treturn Triangle.getBarycoord( point, this.a, this.b, this.c, target );\n\n\t}\n\n\tgetUV( point, uv1, uv2, uv3, target ) {\n\n\t\treturn Triangle.getUV( point, this.a, this.b, this.c, uv1, uv2, uv3, target );\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t}\n\n\tisFrontFacing( direction ) {\n\n\t\treturn Triangle.isFrontFacing( this.a, this.b, this.c, direction );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsTriangle( this );\n\n\t}\n\n\tclosestPointToPoint( p, target ) {\n\n\t\tconst a = this.a, b = this.b, c = this.c;\n\t\tlet v, w;\n\n\t\t// algorithm thanks to Real-Time Collision Detection by Christer Ericson,\n\t\t// published by Morgan Kaufmann Publishers, (c) 2005 Elsevier Inc.,\n\t\t// under the accompanying license; see chapter 5.1.5 for detailed explanation.\n\t\t// basically, we're distinguishing which of the voronoi regions of the triangle\n\t\t// the point lies in with the minimum amount of redundant computation.\n\n\t\t_vab.subVectors( b, a );\n\t\t_vac.subVectors( c, a );\n\t\t_vap.subVectors( p, a );\n\t\tconst d1 = _vab.dot( _vap );\n\t\tconst d2 = _vac.dot( _vap );\n\t\tif ( d1 <= 0 && d2 <= 0 ) {\n\n\t\t\t// vertex region of A; barycentric coords (1, 0, 0)\n\t\t\treturn target.copy( a );\n\n\t\t}\n\n\t\t_vbp.subVectors( p, b );\n\t\tconst d3 = _vab.dot( _vbp );\n\t\tconst d4 = _vac.dot( _vbp );\n\t\tif ( d3 >= 0 && d4 <= d3 ) {\n\n\t\t\t// vertex region of B; barycentric coords (0, 1, 0)\n\t\t\treturn target.copy( b );\n\n\t\t}\n\n\t\tconst vc = d1 * d4 - d3 * d2;\n\t\tif ( vc <= 0 && d1 >= 0 && d3 <= 0 ) {\n\n\t\t\tv = d1 / ( d1 - d3 );\n\t\t\t// edge region of AB; barycentric coords (1-v, v, 0)\n\t\t\treturn target.copy( a ).addScaledVector( _vab, v );\n\n\t\t}\n\n\t\t_vcp.subVectors( p, c );\n\t\tconst d5 = _vab.dot( _vcp );\n\t\tconst d6 = _vac.dot( _vcp );\n\t\tif ( d6 >= 0 && d5 <= d6 ) {\n\n\t\t\t// vertex region of C; barycentric coords (0, 0, 1)\n\t\t\treturn target.copy( c );\n\n\t\t}\n\n\t\tconst vb = d5 * d2 - d1 * d6;\n\t\tif ( vb <= 0 && d2 >= 0 && d6 <= 0 ) {\n\n\t\t\tw = d2 / ( d2 - d6 );\n\t\t\t// edge region of AC; barycentric coords (1-w, 0, w)\n\t\t\treturn target.copy( a ).addScaledVector( _vac, w );\n\n\t\t}\n\n\t\tconst va = d3 * d6 - d5 * d4;\n\t\tif ( va <= 0 && ( d4 - d3 ) >= 0 && ( d5 - d6 ) >= 0 ) {\n\n\t\t\t_vbc.subVectors( c, b );\n\t\t\tw = ( d4 - d3 ) / ( ( d4 - d3 ) + ( d5 - d6 ) );\n\t\t\t// edge region of BC; barycentric coords (0, 1-w, w)\n\t\t\treturn target.copy( b ).addScaledVector( _vbc, w ); // edge region of BC\n\n\t\t}\n\n\t\t// face region\n\t\tconst denom = 1 / ( va + vb + vc );\n\t\t// u = va * denom\n\t\tv = vb * denom;\n\t\tw = vc * denom;\n\n\t\treturn target.copy( a ).addScaledVector( _vab, v ).addScaledVector( _vac, w );\n\n\t}\n\n\tequals( triangle ) {\n\n\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t}\n\n}\n\nlet materialId = 0;\n\nclass Material extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isMaterial = true;\n\n\t\tObject.defineProperty( this, 'id', { value: materialId ++ } );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'Material';\n\n\t\tthis.blending = NormalBlending;\n\t\tthis.side = FrontSide;\n\t\tthis.vertexColors = false;\n\n\t\tthis.opacity = 1;\n\t\tthis.transparent = false;\n\n\t\tthis.blendSrc = SrcAlphaFactor;\n\t\tthis.blendDst = OneMinusSrcAlphaFactor;\n\t\tthis.blendEquation = AddEquation;\n\t\tthis.blendSrcAlpha = null;\n\t\tthis.blendDstAlpha = null;\n\t\tthis.blendEquationAlpha = null;\n\n\t\tthis.depthFunc = LessEqualDepth;\n\t\tthis.depthTest = true;\n\t\tthis.depthWrite = true;\n\n\t\tthis.stencilWriteMask = 0xff;\n\t\tthis.stencilFunc = AlwaysStencilFunc;\n\t\tthis.stencilRef = 0;\n\t\tthis.stencilFuncMask = 0xff;\n\t\tthis.stencilFail = KeepStencilOp;\n\t\tthis.stencilZFail = KeepStencilOp;\n\t\tthis.stencilZPass = KeepStencilOp;\n\t\tthis.stencilWrite = false;\n\n\t\tthis.clippingPlanes = null;\n\t\tthis.clipIntersection = false;\n\t\tthis.clipShadows = false;\n\n\t\tthis.shadowSide = null;\n\n\t\tthis.colorWrite = true;\n\n\t\tthis.precision = null; // override the renderer's default precision for this material\n\n\t\tthis.polygonOffset = false;\n\t\tthis.polygonOffsetFactor = 0;\n\t\tthis.polygonOffsetUnits = 0;\n\n\t\tthis.dithering = false;\n\n\t\tthis.alphaToCoverage = false;\n\t\tthis.premultipliedAlpha = false;\n\t\tthis.forceSinglePass = false;\n\n\t\tthis.visible = true;\n\n\t\tthis.toneMapped = true;\n\n\t\tthis.userData = {};\n\n\t\tthis.version = 0;\n\n\t\tthis._alphaTest = 0;\n\n\t}\n\n\tget alphaTest() {\n\n\t\treturn this._alphaTest;\n\n\t}\n\n\tset alphaTest( value ) {\n\n\t\tif ( this._alphaTest > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._alphaTest = value;\n\n\t}\n\n\tonBuild( /* shaderobject, renderer */ ) {}\n\n\tonBeforeRender( /* renderer, scene, camera, geometry, object, group */ ) {}\n\n\tonBeforeCompile( /* shaderobject, renderer */ ) {}\n\n\tcustomProgramCacheKey() {\n\n\t\treturn this.onBeforeCompile.toString();\n\n\t}\n\n\tsetValues( values ) {\n\n\t\tif ( values === undefined ) return;\n\n\t\tfor ( const key in values ) {\n\n\t\t\tconst newValue = values[ key ];\n\n\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Material: \\'' + key + '\\' parameter is undefined.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst currentValue = this[ key ];\n\n\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.' + this.type + ': \\'' + key + '\\' is not a property of this material.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( currentValue && currentValue.isColor ) {\n\n\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t} else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else {\n\n\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( isRootObject ) {\n\n\t\t\tmeta = {\n\t\t\t\ttextures: {},\n\t\t\t\timages: {}\n\t\t\t};\n\n\t\t}\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Material',\n\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard Material serialization\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\tif ( this.color && this.color.isColor ) data.color = this.color.getHex();\n\n\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\tif ( this.sheen !== undefined ) data.sheen = this.sheen;\n\t\tif ( this.sheenColor && this.sheenColor.isColor ) data.sheenColor = this.sheenColor.getHex();\n\t\tif ( this.sheenRoughness !== undefined ) data.sheenRoughness = this.sheenRoughness;\n\t\tif ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex();\n\t\tif ( this.emissiveIntensity && this.emissiveIntensity !== 1 ) data.emissiveIntensity = this.emissiveIntensity;\n\n\t\tif ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex();\n\t\tif ( this.specularIntensity !== undefined ) data.specularIntensity = this.specularIntensity;\n\t\tif ( this.specularColor && this.specularColor.isColor ) data.specularColor = this.specularColor.getHex();\n\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\t\tif ( this.clearcoat !== undefined ) data.clearcoat = this.clearcoat;\n\t\tif ( this.clearcoatRoughness !== undefined ) data.clearcoatRoughness = this.clearcoatRoughness;\n\n\t\tif ( this.clearcoatMap && this.clearcoatMap.isTexture ) {\n\n\t\t\tdata.clearcoatMap = this.clearcoatMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatRoughnessMap && this.clearcoatRoughnessMap.isTexture ) {\n\n\t\t\tdata.clearcoatRoughnessMap = this.clearcoatRoughnessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture ) {\n\n\t\t\tdata.clearcoatNormalMap = this.clearcoatNormalMap.toJSON( meta ).uuid;\n\t\t\tdata.clearcoatNormalScale = this.clearcoatNormalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.iridescence !== undefined ) data.iridescence = this.iridescence;\n\t\tif ( this.iridescenceIOR !== undefined ) data.iridescenceIOR = this.iridescenceIOR;\n\t\tif ( this.iridescenceThicknessRange !== undefined ) data.iridescenceThicknessRange = this.iridescenceThicknessRange;\n\n\t\tif ( this.iridescenceMap && this.iridescenceMap.isTexture ) {\n\n\t\t\tdata.iridescenceMap = this.iridescenceMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.iridescenceThicknessMap && this.iridescenceThicknessMap.isTexture ) {\n\n\t\t\tdata.iridescenceThicknessMap = this.iridescenceThicknessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid;\n\t\tif ( this.matcap && this.matcap.isTexture ) data.matcap = this.matcap.toJSON( meta ).uuid;\n\t\tif ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\n\t\tif ( this.lightMap && this.lightMap.isTexture ) {\n\n\t\t\tdata.lightMap = this.lightMap.toJSON( meta ).uuid;\n\t\t\tdata.lightMapIntensity = this.lightMapIntensity;\n\n\t\t}\n\n\t\tif ( this.aoMap && this.aoMap.isTexture ) {\n\n\t\t\tdata.aoMap = this.aoMap.toJSON( meta ).uuid;\n\t\t\tdata.aoMapIntensity = this.aoMapIntensity;\n\n\t\t}\n\n\t\tif ( this.bumpMap && this.bumpMap.isTexture ) {\n\n\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t}\n\n\t\tif ( this.normalMap && this.normalMap.isTexture ) {\n\n\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\tdata.normalMapType = this.normalMapType;\n\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.displacementMap && this.displacementMap.isTexture ) {\n\n\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t}\n\n\t\tif ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\tif ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\tif ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\tif ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\t\tif ( this.specularIntensityMap && this.specularIntensityMap.isTexture ) data.specularIntensityMap = this.specularIntensityMap.toJSON( meta ).uuid;\n\t\tif ( this.specularColorMap && this.specularColorMap.isTexture ) data.specularColorMap = this.specularColorMap.toJSON( meta ).uuid;\n\n\t\tif ( this.envMap && this.envMap.isTexture ) {\n\n\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\n\t\t\tif ( this.combine !== undefined ) data.combine = this.combine;\n\n\t\t}\n\n\t\tif ( this.envMapIntensity !== undefined ) data.envMapIntensity = this.envMapIntensity;\n\t\tif ( this.reflectivity !== undefined ) data.reflectivity = this.reflectivity;\n\t\tif ( this.refractionRatio !== undefined ) data.refractionRatio = this.refractionRatio;\n\n\t\tif ( this.gradientMap && this.gradientMap.isTexture ) {\n\n\t\t\tdata.gradientMap = this.gradientMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.transmission !== undefined ) data.transmission = this.transmission;\n\t\tif ( this.transmissionMap && this.transmissionMap.isTexture ) data.transmissionMap = this.transmissionMap.toJSON( meta ).uuid;\n\t\tif ( this.thickness !== undefined ) data.thickness = this.thickness;\n\t\tif ( this.thicknessMap && this.thicknessMap.isTexture ) data.thicknessMap = this.thicknessMap.toJSON( meta ).uuid;\n\t\tif ( this.attenuationDistance !== undefined && this.attenuationDistance !== Infinity ) data.attenuationDistance = this.attenuationDistance;\n\t\tif ( this.attenuationColor !== undefined ) data.attenuationColor = this.attenuationColor.getHex();\n\n\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\tif ( this.shadowSide !== null ) data.shadowSide = this.shadowSide;\n\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\tif ( this.vertexColors ) data.vertexColors = true;\n\n\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\tif ( this.transparent === true ) data.transparent = this.transparent;\n\n\t\tdata.depthFunc = this.depthFunc;\n\t\tdata.depthTest = this.depthTest;\n\t\tdata.depthWrite = this.depthWrite;\n\t\tdata.colorWrite = this.colorWrite;\n\n\t\tdata.stencilWrite = this.stencilWrite;\n\t\tdata.stencilWriteMask = this.stencilWriteMask;\n\t\tdata.stencilFunc = this.stencilFunc;\n\t\tdata.stencilRef = this.stencilRef;\n\t\tdata.stencilFuncMask = this.stencilFuncMask;\n\t\tdata.stencilFail = this.stencilFail;\n\t\tdata.stencilZFail = this.stencilZFail;\n\t\tdata.stencilZPass = this.stencilZPass;\n\n\t\t// rotation (SpriteMaterial)\n\t\tif ( this.rotation !== undefined && this.rotation !== 0 ) data.rotation = this.rotation;\n\n\t\tif ( this.polygonOffset === true ) data.polygonOffset = true;\n\t\tif ( this.polygonOffsetFactor !== 0 ) data.polygonOffsetFactor = this.polygonOffsetFactor;\n\t\tif ( this.polygonOffsetUnits !== 0 ) data.polygonOffsetUnits = this.polygonOffsetUnits;\n\n\t\tif ( this.linewidth !== undefined && this.linewidth !== 1 ) data.linewidth = this.linewidth;\n\t\tif ( this.dashSize !== undefined ) data.dashSize = this.dashSize;\n\t\tif ( this.gapSize !== undefined ) data.gapSize = this.gapSize;\n\t\tif ( this.scale !== undefined ) data.scale = this.scale;\n\n\t\tif ( this.dithering === true ) data.dithering = true;\n\n\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\tif ( this.alphaToCoverage === true ) data.alphaToCoverage = this.alphaToCoverage;\n\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = this.premultipliedAlpha;\n\t\tif ( this.forceSinglePass === true ) data.forceSinglePass = this.forceSinglePass;\n\n\t\tif ( this.wireframe === true ) data.wireframe = this.wireframe;\n\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\tif ( this.flatShading === true ) data.flatShading = this.flatShading;\n\n\t\tif ( this.visible === false ) data.visible = false;\n\n\t\tif ( this.toneMapped === false ) data.toneMapped = false;\n\n\t\tif ( this.fog === false ) data.fog = false;\n\n\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\t// TODO: Copied from Object3D.toJSON\n\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\n\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.blending = source.blending;\n\t\tthis.side = source.side;\n\t\tthis.vertexColors = source.vertexColors;\n\n\t\tthis.opacity = source.opacity;\n\t\tthis.transparent = source.transparent;\n\n\t\tthis.blendSrc = source.blendSrc;\n\t\tthis.blendDst = source.blendDst;\n\t\tthis.blendEquation = source.blendEquation;\n\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\n\t\tthis.depthFunc = source.depthFunc;\n\t\tthis.depthTest = source.depthTest;\n\t\tthis.depthWrite = source.depthWrite;\n\n\t\tthis.stencilWriteMask = source.stencilWriteMask;\n\t\tthis.stencilFunc = source.stencilFunc;\n\t\tthis.stencilRef = source.stencilRef;\n\t\tthis.stencilFuncMask = source.stencilFuncMask;\n\t\tthis.stencilFail = source.stencilFail;\n\t\tthis.stencilZFail = source.stencilZFail;\n\t\tthis.stencilZPass = source.stencilZPass;\n\t\tthis.stencilWrite = source.stencilWrite;\n\n\t\tconst srcPlanes = source.clippingPlanes;\n\t\tlet dstPlanes = null;\n\n\t\tif ( srcPlanes !== null ) {\n\n\t\t\tconst n = srcPlanes.length;\n\t\t\tdstPlanes = new Array( n );\n\n\t\t\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.clippingPlanes = dstPlanes;\n\t\tthis.clipIntersection = source.clipIntersection;\n\t\tthis.clipShadows = source.clipShadows;\n\n\t\tthis.shadowSide = source.shadowSide;\n\n\t\tthis.colorWrite = source.colorWrite;\n\n\t\tthis.precision = source.precision;\n\n\t\tthis.polygonOffset = source.polygonOffset;\n\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\tthis.dithering = source.dithering;\n\n\t\tthis.alphaTest = source.alphaTest;\n\t\tthis.alphaToCoverage = source.alphaToCoverage;\n\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\t\tthis.forceSinglePass = source.forceSinglePass;\n\n\t\tthis.visible = source.visible;\n\n\t\tthis.toneMapped = source.toneMapped;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n}\n\nclass MeshBasicMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshBasicMaterial = true;\n\n\t\tthis.type = 'MeshBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // emissive\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _vector$9 = /*@__PURE__*/ new Vector3();\nconst _vector2$1 = /*@__PURE__*/ new Vector2();\n\nclass BufferAttribute {\n\n\tconstructor( array, itemSize, normalized = false ) {\n\n\t\tif ( Array.isArray( array ) ) {\n\n\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t}\n\n\t\tthis.isBufferAttribute = true;\n\n\t\tthis.name = '';\n\n\t\tthis.array = array;\n\t\tthis.itemSize = itemSize;\n\t\tthis.count = array !== undefined ? array.length / itemSize : 0;\n\t\tthis.normalized = normalized;\n\n\t\tthis.usage = StaticDrawUsage;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.version = 0;\n\n\t}\n\n\tonUploadCallback() {}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.itemSize = source.itemSize;\n\t\tthis.count = source.count;\n\t\tthis.normalized = source.normalized;\n\n\t\tthis.usage = source.usage;\n\n\t\treturn this;\n\n\t}\n\n\tcopyAt( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.itemSize;\n\t\tindex2 *= attribute.itemSize;\n\n\t\tfor ( let i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcopyArray( array ) {\n\n\t\tthis.array.set( array );\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix3( m ) {\n\n\t\tif ( this.itemSize === 2 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector2$1.fromBufferAttribute( this, i );\n\t\t\t\t_vector2$1.applyMatrix3( m );\n\n\t\t\t\tthis.setXY( i, _vector2$1.x, _vector2$1.y );\n\n\t\t\t}\n\n\t\t} else if ( this.itemSize === 3 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector$9.fromBufferAttribute( this, i );\n\t\t\t\t_vector$9.applyMatrix3( m );\n\n\t\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyNormalMatrix( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttransformDirection( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tset( value, offset = 0 ) {\n\n\t\t// Matching BufferAttribute constructor, do not normalize the array.\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t}\n\n\tgetX( index ) {\n\n\t\tlet x = this.array[ index * this.itemSize ];\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\treturn this;\n\n\t}\n\n\tgetY( index ) {\n\n\t\tlet y = this.array[ index * this.itemSize + 1 ];\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tgetZ( index ) {\n\n\t\tlet z = this.array[ index * this.itemSize + 2 ];\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tgetW( index ) {\n\n\t\tlet w = this.array[ index * this.itemSize + 3 ];\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetXY( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\t\tthis.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tonUpload( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.array, this.itemSize ).copy( this );\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\titemSize: this.itemSize,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tarray: Array.from( this.array ),\n\t\t\tnormalized: this.normalized\n\t\t};\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( this.usage !== StaticDrawUsage ) data.usage = this.usage;\n\t\tif ( this.updateRange.offset !== 0 || this.updateRange.count !== - 1 ) data.updateRange = this.updateRange;\n\n\t\treturn data;\n\n\t}\n\n\t// @deprecated\n\n\tcopyColorsArray() {\n\n\t\tconsole.error( 'THREE.BufferAttribute: copyColorsArray() was removed in r144.' );\n\n\t}\n\n\tcopyVector2sArray() {\n\n\t\tconsole.error( 'THREE.BufferAttribute: copyVector2sArray() was removed in r144.' );\n\n\t}\n\n\tcopyVector3sArray() {\n\n\t\tconsole.error( 'THREE.BufferAttribute: copyVector3sArray() was removed in r144.' );\n\n\t}\n\n\tcopyVector4sArray() {\n\n\t\tconsole.error( 'THREE.BufferAttribute: copyVector4sArray() was removed in r144.' );\n\n\t}\n\n}\n\n//\n\nclass Int8BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint8BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint8ClampedBufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8ClampedArray( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Int16BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint16BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Int32BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Uint32BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Float16BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t\tthis.isFloat16BufferAttribute = true;\n\n\t}\n\n}\n\n\nclass Float32BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Float32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nclass Float64BufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Float64Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nlet _id$1 = 0;\n\nconst _m1 = /*@__PURE__*/ new Matrix4();\nconst _obj = /*@__PURE__*/ new Object3D();\nconst _offset = /*@__PURE__*/ new Vector3();\nconst _box$1 = /*@__PURE__*/ new Box3();\nconst _boxMorphTargets = /*@__PURE__*/ new Box3();\nconst _vector$8 = /*@__PURE__*/ new Vector3();\n\nclass BufferGeometry extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isBufferGeometry = true;\n\n\t\tObject.defineProperty( this, 'id', { value: _id$1 ++ } );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.name = '';\n\t\tthis.type = 'BufferGeometry';\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\n\t\tthis.morphAttributes = {};\n\t\tthis.morphTargetsRelative = false;\n\n\t\tthis.groups = [];\n\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\tthis.drawRange = { start: 0, count: Infinity };\n\n\t\tthis.userData = {};\n\n\t}\n\n\tgetIndex() {\n\n\t\treturn this.index;\n\n\t}\n\n\tsetIndex( index ) {\n\n\t\tif ( Array.isArray( index ) ) {\n\n\t\t\tthis.index = new ( arrayNeedsUint32( index ) ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );\n\n\t\t} else {\n\n\t\t\tthis.index = index;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetAttribute( name ) {\n\n\t\treturn this.attributes[ name ];\n\n\t}\n\n\tsetAttribute( name, attribute ) {\n\n\t\tthis.attributes[ name ] = attribute;\n\n\t\treturn this;\n\n\t}\n\n\tdeleteAttribute( name ) {\n\n\t\tdelete this.attributes[ name ];\n\n\t\treturn this;\n\n\t}\n\n\thasAttribute( name ) {\n\n\t\treturn this.attributes[ name ] !== undefined;\n\n\t}\n\n\taddGroup( start, count, materialIndex = 0 ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex\n\n\t\t} );\n\n\t}\n\n\tclearGroups() {\n\n\t\tthis.groups = [];\n\n\t}\n\n\tsetDrawRange( start, count ) {\n\n\t\tthis.drawRange.start = start;\n\t\tthis.drawRange.count = count;\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tconst position = this.attributes.position;\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tposition.applyMatrix4( matrix );\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t}\n\n\t\tconst normal = this.attributes.normal;\n\n\t\tif ( normal !== undefined ) {\n\n\t\t\tconst normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tnormal.applyNormalMatrix( normalMatrix );\n\n\t\t\tnormal.needsUpdate = true;\n\n\t\t}\n\n\t\tconst tangent = this.attributes.tangent;\n\n\t\tif ( tangent !== undefined ) {\n\n\t\t\ttangent.transformDirection( matrix );\n\n\t\t\ttangent.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyQuaternion( q ) {\n\n\t\t_m1.makeRotationFromQuaternion( q );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateX( angle ) {\n\n\t\t// rotate geometry around world x-axis\n\n\t\t_m1.makeRotationX( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateY( angle ) {\n\n\t\t// rotate geometry around world y-axis\n\n\t\t_m1.makeRotationY( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\trotateZ( angle ) {\n\n\t\t// rotate geometry around world z-axis\n\n\t\t_m1.makeRotationZ( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( x, y, z ) {\n\n\t\t// translate geometry\n\n\t\t_m1.makeTranslation( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\tscale( x, y, z ) {\n\n\t\t// scale geometry\n\n\t\t_m1.makeScale( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\tlookAt( vector ) {\n\n\t\t_obj.lookAt( vector );\n\n\t\t_obj.updateMatrix();\n\n\t\tthis.applyMatrix4( _obj.matrix );\n\n\t\treturn this;\n\n\t}\n\n\tcenter() {\n\n\t\tthis.computeBoundingBox();\n\n\t\tthis.boundingBox.getCenter( _offset ).negate();\n\n\t\tthis.translate( _offset.x, _offset.y, _offset.z );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tconst position = [];\n\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tconst point = points[ i ];\n\t\t\tposition.push( point.x, point.y, point.z || 0 );\n\n\t\t}\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( position, 3 ) );\n\n\t\treturn this;\n\n\t}\n\n\tcomputeBoundingBox() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box. Alternatively set \"mesh.frustumCulled\" to \"false\".', this );\n\n\t\t\tthis.boundingBox.set(\n\t\t\t\tnew Vector3( - Infinity, - Infinity, - Infinity ),\n\t\t\t\tnew Vector3( + Infinity, + Infinity, + Infinity )\n\t\t\t);\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tthis.boundingBox.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_box$1.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector$8.addVectors( this.boundingBox.min, _box$1.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector$8 );\n\n\t\t\t\t\t\t_vector$8.addVectors( this.boundingBox.max, _box$1.max );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector$8 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box$1.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box$1.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.boundingBox.makeEmpty();\n\n\t\t}\n\n\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t}\n\n\t}\n\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere. Alternatively set \"mesh.frustumCulled\" to \"false\".', this );\n\n\t\t\tthis.boundingSphere.set( new Vector3(), Infinity );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position ) {\n\n\t\t\t// first, find the center of the bounding sphere\n\n\t\t\tconst center = this.boundingSphere.center;\n\n\t\t\t_box$1.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_boxMorphTargets.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector$8.addVectors( _box$1.min, _boxMorphTargets.min );\n\t\t\t\t\t\t_box$1.expandByPoint( _vector$8 );\n\n\t\t\t\t\t\t_vector$8.addVectors( _box$1.max, _boxMorphTargets.max );\n\t\t\t\t\t\t_box$1.expandByPoint( _vector$8 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_box$1.expandByPoint( _boxMorphTargets.min );\n\t\t\t\t\t\t_box$1.expandByPoint( _boxMorphTargets.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_box$1.getCenter( center );\n\n\t\t\t// second, try to find a boundingSphere with a radius smaller than the\n\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\tlet maxRadiusSq = 0;\n\n\t\t\tfor ( let i = 0, il = position.count; i < il; i ++ ) {\n\n\t\t\t\t_vector$8.fromBufferAttribute( position, i );\n\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$8 ) );\n\n\t\t\t}\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\tconst morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t\t\t\tfor ( let j = 0, jl = morphAttribute.count; j < jl; j ++ ) {\n\n\t\t\t\t\t\t_vector$8.fromBufferAttribute( morphAttribute, j );\n\n\t\t\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t\t\t_offset.fromBufferAttribute( position, j );\n\t\t\t\t\t\t\t_vector$8.add( _offset );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$8 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcomputeTangents() {\n\n\t\tconst index = this.index;\n\t\tconst attributes = this.attributes;\n\n\t\t// based on http://www.terathon.com/code/tangent.html\n\t\t// (per vertex tangents)\n\n\t\tif ( index === null ||\n\t\t\t attributes.position === undefined ||\n\t\t\t attributes.normal === undefined ||\n\t\t\t attributes.uv === undefined ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst indices = index.array;\n\t\tconst positions = attributes.position.array;\n\t\tconst normals = attributes.normal.array;\n\t\tconst uvs = attributes.uv.array;\n\n\t\tconst nVertices = positions.length / 3;\n\n\t\tif ( this.hasAttribute( 'tangent' ) === false ) {\n\n\t\t\tthis.setAttribute( 'tangent', new BufferAttribute( new Float32Array( 4 * nVertices ), 4 ) );\n\n\t\t}\n\n\t\tconst tangents = this.getAttribute( 'tangent' ).array;\n\n\t\tconst tan1 = [], tan2 = [];\n\n\t\tfor ( let i = 0; i < nVertices; i ++ ) {\n\n\t\t\ttan1[ i ] = new Vector3();\n\t\t\ttan2[ i ] = new Vector3();\n\n\t\t}\n\n\t\tconst vA = new Vector3(),\n\t\t\tvB = new Vector3(),\n\t\t\tvC = new Vector3(),\n\n\t\t\tuvA = new Vector2(),\n\t\t\tuvB = new Vector2(),\n\t\t\tuvC = new Vector2(),\n\n\t\t\tsdir = new Vector3(),\n\t\t\ttdir = new Vector3();\n\n\t\tfunction handleTriangle( a, b, c ) {\n\n\t\t\tvA.fromArray( positions, a * 3 );\n\t\t\tvB.fromArray( positions, b * 3 );\n\t\t\tvC.fromArray( positions, c * 3 );\n\n\t\t\tuvA.fromArray( uvs, a * 2 );\n\t\t\tuvB.fromArray( uvs, b * 2 );\n\t\t\tuvC.fromArray( uvs, c * 2 );\n\n\t\t\tvB.sub( vA );\n\t\t\tvC.sub( vA );\n\n\t\t\tuvB.sub( uvA );\n\t\t\tuvC.sub( uvA );\n\n\t\t\tconst r = 1.0 / ( uvB.x * uvC.y - uvC.x * uvB.y );\n\n\t\t\t// silently ignore degenerate uv triangles having coincident or colinear vertices\n\n\t\t\tif ( ! isFinite( r ) ) return;\n\n\t\t\tsdir.copy( vB ).multiplyScalar( uvC.y ).addScaledVector( vC, - uvB.y ).multiplyScalar( r );\n\t\t\ttdir.copy( vC ).multiplyScalar( uvB.x ).addScaledVector( vB, - uvC.x ).multiplyScalar( r );\n\n\t\t\ttan1[ a ].add( sdir );\n\t\t\ttan1[ b ].add( sdir );\n\t\t\ttan1[ c ].add( sdir );\n\n\t\t\ttan2[ a ].add( tdir );\n\t\t\ttan2[ b ].add( tdir );\n\t\t\ttan2[ c ].add( tdir );\n\n\t\t}\n\n\t\tlet groups = this.groups;\n\n\t\tif ( groups.length === 0 ) {\n\n\t\t\tgroups = [ {\n\t\t\t\tstart: 0,\n\t\t\t\tcount: indices.length\n\t\t\t} ];\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleTriangle(\n\t\t\t\t\tindices[ j + 0 ],\n\t\t\t\t\tindices[ j + 1 ],\n\t\t\t\t\tindices[ j + 2 ]\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst tmp = new Vector3(), tmp2 = new Vector3();\n\t\tconst n = new Vector3(), n2 = new Vector3();\n\n\t\tfunction handleVertex( v ) {\n\n\t\t\tn.fromArray( normals, v * 3 );\n\t\t\tn2.copy( n );\n\n\t\t\tconst t = tan1[ v ];\n\n\t\t\t// Gram-Schmidt orthogonalize\n\n\t\t\ttmp.copy( t );\n\t\t\ttmp.sub( n.multiplyScalar( n.dot( t ) ) ).normalize();\n\n\t\t\t// Calculate handedness\n\n\t\t\ttmp2.crossVectors( n2, t );\n\t\t\tconst test = tmp2.dot( tan2[ v ] );\n\t\t\tconst w = ( test < 0.0 ) ? - 1.0 : 1.0;\n\n\t\t\ttangents[ v * 4 ] = tmp.x;\n\t\t\ttangents[ v * 4 + 1 ] = tmp.y;\n\t\t\ttangents[ v * 4 + 2 ] = tmp.z;\n\t\t\ttangents[ v * 4 + 3 ] = w;\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleVertex( indices[ j + 0 ] );\n\t\t\t\thandleVertex( indices[ j + 1 ] );\n\t\t\t\thandleVertex( indices[ j + 2 ] );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcomputeVertexNormals() {\n\n\t\tconst index = this.index;\n\t\tconst positionAttribute = this.getAttribute( 'position' );\n\n\t\tif ( positionAttribute !== undefined ) {\n\n\t\t\tlet normalAttribute = this.getAttribute( 'normal' );\n\n\t\t\tif ( normalAttribute === undefined ) {\n\n\t\t\t\tnormalAttribute = new BufferAttribute( new Float32Array( positionAttribute.count * 3 ), 3 );\n\t\t\t\tthis.setAttribute( 'normal', normalAttribute );\n\n\t\t\t} else {\n\n\t\t\t\t// reset existing normals to zero\n\n\t\t\t\tfor ( let i = 0, il = normalAttribute.count; i < il; i ++ ) {\n\n\t\t\t\t\tnormalAttribute.setXYZ( i, 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst pA = new Vector3(), pB = new Vector3(), pC = new Vector3();\n\t\t\tconst nA = new Vector3(), nB = new Vector3(), nC = new Vector3();\n\t\t\tconst cb = new Vector3(), ab = new Vector3();\n\n\t\t\t// indexed elements\n\n\t\t\tif ( index ) {\n\n\t\t\t\tfor ( let i = 0, il = index.count; i < il; i += 3 ) {\n\n\t\t\t\t\tconst vA = index.getX( i + 0 );\n\t\t\t\t\tconst vB = index.getX( i + 1 );\n\t\t\t\t\tconst vC = index.getX( i + 2 );\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, vA );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, vB );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, vC );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnA.fromBufferAttribute( normalAttribute, vA );\n\t\t\t\t\tnB.fromBufferAttribute( normalAttribute, vB );\n\t\t\t\t\tnC.fromBufferAttribute( normalAttribute, vC );\n\n\t\t\t\t\tnA.add( cb );\n\t\t\t\t\tnB.add( cb );\n\t\t\t\t\tnC.add( cb );\n\n\t\t\t\t\tnormalAttribute.setXYZ( vA, nA.x, nA.y, nA.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vB, nB.x, nB.y, nB.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vC, nC.x, nC.y, nC.z );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\tfor ( let i = 0, il = positionAttribute.count; i < il; i += 3 ) {\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, i + 0 );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, i + 1 );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, i + 2 );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnormalAttribute.setXYZ( i + 0, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 1, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 2, cb.x, cb.y, cb.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.normalizeNormals();\n\n\t\t\tnormalAttribute.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\t// @deprecated since r144\n\n\tmerge() {\n\n\t\tconsole.error( 'THREE.BufferGeometry.merge() has been removed. Use THREE.BufferGeometryUtils.mergeBufferGeometries() instead.' );\n\t\treturn this;\n\n\t}\n\n\tnormalizeNormals() {\n\n\t\tconst normals = this.attributes.normal;\n\n\t\tfor ( let i = 0, il = normals.count; i < il; i ++ ) {\n\n\t\t\t_vector$8.fromBufferAttribute( normals, i );\n\n\t\t\t_vector$8.normalize();\n\n\t\t\tnormals.setXYZ( i, _vector$8.x, _vector$8.y, _vector$8.z );\n\n\t\t}\n\n\t}\n\n\ttoNonIndexed() {\n\n\t\tfunction convertBufferAttribute( attribute, indices ) {\n\n\t\t\tconst array = attribute.array;\n\t\t\tconst itemSize = attribute.itemSize;\n\t\t\tconst normalized = attribute.normalized;\n\n\t\t\tconst array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\tlet index = 0, index2 = 0;\n\n\t\t\tfor ( let i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\tindex = indices[ i ] * attribute.data.stride + attribute.offset;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( array2, itemSize, normalized );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.index === null ) {\n\n\t\t\tconsole.warn( 'THREE.BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed.' );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst geometry2 = new BufferGeometry();\n\n\t\tconst indices = this.index.array;\n\t\tconst attributes = this.attributes;\n\n\t\t// attributes\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\n\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\tgeometry2.setAttribute( name, newAttribute );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = this.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst morphArray = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = morphAttribute[ i ];\n\n\t\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\t\tmorphArray.push( newAttribute );\n\n\t\t\t}\n\n\t\t\tgeometry2.morphAttributes[ name ] = morphArray;\n\n\t\t}\n\n\t\tgeometry2.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = this.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tgeometry2.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn geometry2;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard BufferGeometry serialization\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\tif ( this.parameters !== undefined ) {\n\n\t\t\tconst parameters = this.parameters;\n\n\t\t\tfor ( const key in parameters ) {\n\n\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\t// for simplicity the code assumes attributes are not shared across geometries, see #15811\n\n\t\tdata.data = { attributes: {} };\n\n\t\tconst index = this.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tdata.data.index = {\n\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\tarray: Array.prototype.slice.call( index.array )\n\t\t\t};\n\n\t\t}\n\n\t\tconst attributes = this.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\n\t\t\tdata.data.attributes[ key ] = attribute.toJSON( data.data );\n\n\t\t}\n\n\t\tconst morphAttributes = {};\n\t\tlet hasMorphAttributes = false;\n\n\t\tfor ( const key in this.morphAttributes ) {\n\n\t\t\tconst attributeArray = this.morphAttributes[ key ];\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = attributeArray[ i ];\n\n\t\t\t\tarray.push( attribute.toJSON( data.data ) );\n\n\t\t\t}\n\n\t\t\tif ( array.length > 0 ) {\n\n\t\t\t\tmorphAttributes[ key ] = array;\n\n\t\t\t\thasMorphAttributes = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( hasMorphAttributes ) {\n\n\t\t\tdata.data.morphAttributes = morphAttributes;\n\t\t\tdata.data.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t}\n\n\t\tconst groups = this.groups;\n\n\t\tif ( groups.length > 0 ) {\n\n\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t}\n\n\t\tconst boundingSphere = this.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tdata.data.boundingSphere = {\n\t\t\t\tcenter: boundingSphere.center.toArray(),\n\t\t\t\tradius: boundingSphere.radius\n\t\t\t};\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\t// reset\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\t\tthis.morphAttributes = {};\n\t\tthis.groups = [];\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// used for storing cloned, shared data\n\n\t\tconst data = {};\n\n\t\t// name\n\n\t\tthis.name = source.name;\n\n\t\t// index\n\n\t\tconst index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone( data ) );\n\n\t\t}\n\n\t\t// attributes\n\n\t\tconst attributes = source.attributes;\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\t\t\tthis.setAttribute( name, attribute.clone( data ) );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = source.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst array = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, l = morphAttribute.length; i < l; i ++ ) {\n\n\t\t\t\tarray.push( morphAttribute[ i ].clone( data ) );\n\n\t\t\t}\n\n\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t}\n\n\t\tthis.morphTargetsRelative = source.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = source.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\t// bounding box\n\n\t\tconst boundingBox = source.boundingBox;\n\n\t\tif ( boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t}\n\n\t\t// bounding sphere\n\n\t\tconst boundingSphere = source.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t}\n\n\t\t// draw range\n\n\t\tthis.drawRange.start = source.drawRange.start;\n\t\tthis.drawRange.count = source.drawRange.count;\n\n\t\t// user data\n\n\t\tthis.userData = source.userData;\n\n\t\t// geometry generator parameters\n\n\t\tif ( source.parameters !== undefined ) this.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nconst _inverseMatrix$2 = /*@__PURE__*/ new Matrix4();\nconst _ray$2 = /*@__PURE__*/ new Ray();\nconst _sphere$3 = /*@__PURE__*/ new Sphere();\n\nconst _vA$1 = /*@__PURE__*/ new Vector3();\nconst _vB$1 = /*@__PURE__*/ new Vector3();\nconst _vC$1 = /*@__PURE__*/ new Vector3();\n\nconst _tempA = /*@__PURE__*/ new Vector3();\nconst _morphA = /*@__PURE__*/ new Vector3();\n\nconst _uvA$1 = /*@__PURE__*/ new Vector2();\nconst _uvB$1 = /*@__PURE__*/ new Vector2();\nconst _uvC$1 = /*@__PURE__*/ new Vector2();\n\nconst _intersectionPoint = /*@__PURE__*/ new Vector3();\nconst _intersectionPointWorld = /*@__PURE__*/ new Vector3();\n\nclass Mesh extends Object3D {\n\n\tconstructor( geometry = new BufferGeometry(), material = new MeshBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\tthis.isMesh = true;\n\n\t\tthis.type = 'Mesh';\n\n\t\tthis.geometry = geometry;\n\t\tthis.material = material;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.morphTargetInfluences !== undefined ) {\n\n\t\t\tthis.morphTargetInfluences = source.morphTargetInfluences.slice();\n\n\t\t}\n\n\t\tif ( source.morphTargetDictionary !== undefined ) {\n\n\t\t\tthis.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary );\n\n\t\t}\n\n\t\tthis.material = source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tgetVertexPosition( index, target ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst position = geometry.attributes.position;\n\t\tconst morphPosition = geometry.morphAttributes.position;\n\t\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\n\t\ttarget.fromBufferAttribute( position, index );\n\n\t\tconst morphInfluences = this.morphTargetInfluences;\n\n\t\tif ( morphPosition && morphInfluences ) {\n\n\t\t\t_morphA.set( 0, 0, 0 );\n\n\t\t\tfor ( let i = 0, il = morphPosition.length; i < il; i ++ ) {\n\n\t\t\t\tconst influence = morphInfluences[ i ];\n\t\t\t\tconst morphAttribute = morphPosition[ i ];\n\n\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t_tempA.fromBufferAttribute( morphAttribute, index );\n\n\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA.sub( target ), influence );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttarget.add( _morphA );\n\n\t\t}\n\n\t\tif ( this.isSkinnedMesh ) {\n\n\t\t\tthis.boneTransform( index, target );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\t\tconst matrixWorld = this.matrixWorld;\n\n\t\tif ( material === undefined ) return;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$3.copy( geometry.boundingSphere );\n\t\t_sphere$3.applyMatrix4( matrixWorld );\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$3 ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix$2.copy( matrixWorld ).invert();\n\t\t_ray$2.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$2 );\n\n\t\t// Check boundingBox before continuing\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tif ( _ray$2.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t}\n\n\t\tlet intersection;\n\n\t\tconst index = geometry.index;\n\t\tconst position = geometry.attributes.position;\n\t\tconst uv = geometry.attributes.uv;\n\t\tconst uv2 = geometry.attributes.uv2;\n\t\tconst groups = geometry.groups;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\tif ( index !== null ) {\n\n\t\t\t// indexed buffer geometry\n\n\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\tconst end = Math.min( index.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\tconst a = index.getX( j );\n\t\t\t\t\t\tconst b = index.getX( j + 1 );\n\t\t\t\t\t\tconst c = index.getX( j + 2 );\n\n\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, _ray$2, uv, uv2, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\tconst a = index.getX( i );\n\t\t\t\t\tconst b = index.getX( i + 1 );\n\t\t\t\t\tconst c = index.getX( i + 2 );\n\n\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, material, raycaster, _ray$2, uv, uv2, a, b, c );\n\n\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( position !== undefined ) {\n\n\t\t\t// non-indexed buffer geometry\n\n\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\tconst end = Math.min( position.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\tconst a = j;\n\t\t\t\t\t\tconst b = j + 1;\n\t\t\t\t\t\tconst c = j + 2;\n\n\t\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, groupMaterial, raycaster, _ray$2, uv, uv2, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( position.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\tconst a = i;\n\t\t\t\t\tconst b = i + 1;\n\t\t\t\t\tconst c = i + 2;\n\n\t\t\t\t\tintersection = checkBufferGeometryIntersection( this, material, raycaster, _ray$2, uv, uv2, a, b, c );\n\n\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction checkIntersection( object, material, raycaster, ray, pA, pB, pC, point ) {\n\n\tlet intersect;\n\n\tif ( material.side === BackSide ) {\n\n\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t} else {\n\n\t\tintersect = ray.intersectTriangle( pA, pB, pC, ( material.side === FrontSide ), point );\n\n\t}\n\n\tif ( intersect === null ) return null;\n\n\t_intersectionPointWorld.copy( point );\n\t_intersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\tconst distance = raycaster.ray.origin.distanceTo( _intersectionPointWorld );\n\n\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\treturn {\n\t\tdistance: distance,\n\t\tpoint: _intersectionPointWorld.clone(),\n\t\tobject: object\n\t};\n\n}\n\nfunction checkBufferGeometryIntersection( object, material, raycaster, ray, uv, uv2, a, b, c ) {\n\n\tobject.getVertexPosition( a, _vA$1 );\n\tobject.getVertexPosition( b, _vB$1 );\n\tobject.getVertexPosition( c, _vC$1 );\n\n\tconst intersection = checkIntersection( object, material, raycaster, ray, _vA$1, _vB$1, _vC$1, _intersectionPoint );\n\n\tif ( intersection ) {\n\n\t\tif ( uv ) {\n\n\t\t\t_uvA$1.fromBufferAttribute( uv, a );\n\t\t\t_uvB$1.fromBufferAttribute( uv, b );\n\t\t\t_uvC$1.fromBufferAttribute( uv, c );\n\n\t\t\tintersection.uv = Triangle.getUV( _intersectionPoint, _vA$1, _vB$1, _vC$1, _uvA$1, _uvB$1, _uvC$1, new Vector2() );\n\n\t\t}\n\n\t\tif ( uv2 ) {\n\n\t\t\t_uvA$1.fromBufferAttribute( uv2, a );\n\t\t\t_uvB$1.fromBufferAttribute( uv2, b );\n\t\t\t_uvC$1.fromBufferAttribute( uv2, c );\n\n\t\t\tintersection.uv2 = Triangle.getUV( _intersectionPoint, _vA$1, _vB$1, _vC$1, _uvA$1, _uvB$1, _uvC$1, new Vector2() );\n\n\t\t}\n\n\t\tconst face = {\n\t\t\ta: a,\n\t\t\tb: b,\n\t\t\tc: c,\n\t\t\tnormal: new Vector3(),\n\t\t\tmaterialIndex: 0\n\t\t};\n\n\t\tTriangle.getNormal( _vA$1, _vB$1, _vC$1, face.normal );\n\n\t\tintersection.face = face;\n\n\t}\n\n\treturn intersection;\n\n}\n\nclass BoxGeometry extends BufferGeometry {\n\n\tconstructor( width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'BoxGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tconst scope = this;\n\n\t\t// segments\n\n\t\twidthSegments = Math.floor( widthSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\t\tdepthSegments = Math.floor( depthSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet numberOfVertices = 0;\n\t\tlet groupStart = 0;\n\n\t\t// build each side of the box geometry\n\n\t\tbuildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px\n\t\tbuildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx\n\t\tbuildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py\n\t\tbuildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny\n\t\tbuildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz\n\t\tbuildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\t\tconst segmentWidth = width / gridX;\n\t\t\tconst segmentHeight = height / gridY;\n\n\t\t\tconst widthHalf = width / 2;\n\t\t\tconst heightHalf = height / 2;\n\t\t\tconst depthHalf = depth / 2;\n\n\t\t\tconst gridX1 = gridX + 1;\n\t\t\tconst gridY1 = gridY + 1;\n\n\t\t\tlet vertexCounter = 0;\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\t\tconst y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\t\tconst x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = x * udir;\n\t\t\t\t\tvector[ v ] = y * vdir;\n\t\t\t\t\tvector[ w ] = depthHalf;\n\n\t\t\t\t\t// now apply vector to vertex buffer\n\n\t\t\t\t\tvertices.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = 0;\n\t\t\t\t\tvector[ v ] = 0;\n\t\t\t\t\tvector[ w ] = depth > 0 ? 1 : - 1;\n\n\t\t\t\t\t// now apply vector to normal buffer\n\n\t\t\t\t\tnormals.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// uvs\n\n\t\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t\t\t// counters\n\n\t\t\t\t\tvertexCounter += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\t// 1. you need three indices to draw a single face\n\t\t\t// 2. a single segment consists of two faces\n\t\t\t// 3. so we need to generate six (2*3) indices per segment\n\n\t\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\t\tconst a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tconst b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// increase counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\n\t\t\tnumberOfVertices += vertexCounter;\n\n\t\t}\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new BoxGeometry( data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments );\n\n\t}\n\n}\n\n/**\n * Uniform Utilities\n */\n\nfunction cloneUniforms( src ) {\n\n\tconst dst = {};\n\n\tfor ( const u in src ) {\n\n\t\tdst[ u ] = {};\n\n\t\tfor ( const p in src[ u ] ) {\n\n\t\t\tconst property = src[ u ][ p ];\n\n\t\t\tif ( property && ( property.isColor ||\n\t\t\t\tproperty.isMatrix3 || property.isMatrix4 ||\n\t\t\t\tproperty.isVector2 || property.isVector3 || property.isVector4 ||\n\t\t\t\tproperty.isTexture || property.isQuaternion ) ) {\n\n\t\t\t\tdst[ u ][ p ] = property.clone();\n\n\t\t\t} else if ( Array.isArray( property ) ) {\n\n\t\t\t\tdst[ u ][ p ] = property.slice();\n\n\t\t\t} else {\n\n\t\t\t\tdst[ u ][ p ] = property;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn dst;\n\n}\n\nfunction mergeUniforms( uniforms ) {\n\n\tconst merged = {};\n\n\tfor ( let u = 0; u < uniforms.length; u ++ ) {\n\n\t\tconst tmp = cloneUniforms( uniforms[ u ] );\n\n\t\tfor ( const p in tmp ) {\n\n\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t}\n\n\t}\n\n\treturn merged;\n\n}\n\nfunction cloneUniformsGroups( src ) {\n\n\tconst dst = [];\n\n\tfor ( let u = 0; u < src.length; u ++ ) {\n\n\t\tdst.push( src[ u ].clone() );\n\n\t}\n\n\treturn dst;\n\n}\n\nfunction getUnlitUniformColorSpace( renderer ) {\n\n\tif ( renderer.getRenderTarget() === null ) {\n\n\t\t// https://github.com/mrdoob/three.js/pull/23937#issuecomment-1111067398\n\t\treturn renderer.outputEncoding === sRGBEncoding ? SRGBColorSpace : LinearSRGBColorSpace;\n\n\t}\n\n\treturn LinearSRGBColorSpace;\n\n}\n\n// Legacy\n\nconst UniformsUtils = { clone: cloneUniforms, merge: mergeUniforms };\n\nvar default_vertex = \"void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\";\n\nvar default_fragment = \"void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}\";\n\nclass ShaderMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isShaderMaterial = true;\n\n\t\tthis.type = 'ShaderMaterial';\n\n\t\tthis.defines = {};\n\t\tthis.uniforms = {};\n\t\tthis.uniformsGroups = [];\n\n\t\tthis.vertexShader = default_vertex;\n\t\tthis.fragmentShader = default_fragment;\n\n\t\tthis.linewidth = 1;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.fog = false; // set to use scene fog\n\t\tthis.lights = false; // set to use scene lights\n\t\tthis.clipping = false; // set to use user-defined clipping planes\n\n\t\tthis.extensions = {\n\t\t\tderivatives: false, // set to use derivatives\n\t\t\tfragDepth: false, // set to use fragment depth values\n\t\t\tdrawBuffers: false, // set to use draw buffers\n\t\t\tshaderTextureLOD: false // set to use shader texture LOD\n\t\t};\n\n\t\t// When rendered geometry doesn't include these attributes but the material does,\n\t\t// use these default values in WebGL. This avoids errors when buffer data is missing.\n\t\tthis.defaultAttributeValues = {\n\t\t\t'color': [ 1, 1, 1 ],\n\t\t\t'uv': [ 0, 0 ],\n\t\t\t'uv2': [ 0, 0 ]\n\t\t};\n\n\t\tthis.index0AttributeName = undefined;\n\t\tthis.uniformsNeedUpdate = false;\n\n\t\tthis.glslVersion = null;\n\n\t\tif ( parameters !== undefined ) {\n\n\t\t\tthis.setValues( parameters );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.fragmentShader = source.fragmentShader;\n\t\tthis.vertexShader = source.vertexShader;\n\n\t\tthis.uniforms = cloneUniforms( source.uniforms );\n\t\tthis.uniformsGroups = cloneUniformsGroups( source.uniformsGroups );\n\n\t\tthis.defines = Object.assign( {}, source.defines );\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.fog = source.fog;\n\t\tthis.lights = source.lights;\n\t\tthis.clipping = source.clipping;\n\n\t\tthis.extensions = Object.assign( {}, source.extensions );\n\n\t\tthis.glslVersion = source.glslVersion;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.glslVersion = this.glslVersion;\n\t\tdata.uniforms = {};\n\n\t\tfor ( const name in this.uniforms ) {\n\n\t\t\tconst uniform = this.uniforms[ name ];\n\t\t\tconst value = uniform.value;\n\n\t\t\tif ( value && value.isTexture ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 't',\n\t\t\t\t\tvalue: value.toJSON( meta ).uuid\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isColor ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'c',\n\t\t\t\t\tvalue: value.getHex()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector2 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v2',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\tvalue: value\n\t\t\t\t};\n\n\t\t\t\t// note: the array variants v2v, v3v, v4v, m4v and tv are not supported so far\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( Object.keys( this.defines ).length > 0 ) data.defines = this.defines;\n\n\t\tdata.vertexShader = this.vertexShader;\n\t\tdata.fragmentShader = this.fragmentShader;\n\n\t\tconst extensions = {};\n\n\t\tfor ( const key in this.extensions ) {\n\n\t\t\tif ( this.extensions[ key ] === true ) extensions[ key ] = true;\n\n\t\t}\n\n\t\tif ( Object.keys( extensions ).length > 0 ) data.extensions = extensions;\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass Camera extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isCamera = true;\n\n\t\tthis.type = 'Camera';\n\n\t\tthis.matrixWorldInverse = new Matrix4();\n\n\t\tthis.projectionMatrix = new Matrix4();\n\t\tthis.projectionMatrixInverse = new Matrix4();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\t\tthis.projectionMatrixInverse.copy( source.projectionMatrixInverse );\n\n\t\treturn this;\n\n\t}\n\n\tgetWorldDirection( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tconst e = this.matrixWorld.elements;\n\n\t\treturn target.set( - e[ 8 ], - e[ 9 ], - e[ 10 ] ).normalize();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tsuper.updateWorldMatrix( updateParents, updateChildren );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nclass PerspectiveCamera extends Camera {\n\n\tconstructor( fov = 50, aspect = 1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\tthis.isPerspectiveCamera = true;\n\n\t\tthis.type = 'PerspectiveCamera';\n\n\t\tthis.fov = fov;\n\t\tthis.zoom = 1;\n\n\t\tthis.near = near;\n\t\tthis.far = far;\n\t\tthis.focus = 10;\n\n\t\tthis.aspect = aspect;\n\t\tthis.view = null;\n\n\t\tthis.filmGauge = 35;\t// width of the film (default in millimeters)\n\t\tthis.filmOffset = 0;\t// horizontal film offset (same unit as gauge)\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.fov = source.fov;\n\t\tthis.zoom = source.zoom;\n\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\t\tthis.focus = source.focus;\n\n\t\tthis.aspect = source.aspect;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\tthis.filmGauge = source.filmGauge;\n\t\tthis.filmOffset = source.filmOffset;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the FOV by focal length in respect to the current .filmGauge.\n\t *\n\t * The default film gauge is 35, so that the focal length can be specified for\n\t * a 35mm (full frame) camera.\n\t *\n\t * Values for focal length and film gauge must have the same unit.\n\t */\n\tsetFocalLength( focalLength ) {\n\n\t\t/** see {@link http://www.bobatkins.com/photography/technical/field_of_view.html} */\n\t\tconst vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\tthis.fov = RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Calculates the focal length from the current .fov and .filmGauge.\n\t */\n\tgetFocalLength() {\n\n\t\tconst vExtentSlope = Math.tan( DEG2RAD * 0.5 * this.fov );\n\n\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t}\n\n\tgetEffectiveFOV() {\n\n\t\treturn RAD2DEG * 2 * Math.atan(\n\t\t\tMath.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t}\n\n\tgetFilmWidth() {\n\n\t\t// film not completely covered in portrait format (aspect < 1)\n\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t}\n\n\tgetFilmHeight() {\n\n\t\t// film not completely covered in landscape format (aspect > 1)\n\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t}\n\n\t/**\n\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t * multi-monitor/multi-machine setups.\n\t *\n\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t * the monitors are in grid like this\n\t *\n\t * +---+---+---+\n\t * | A | B | C |\n\t * +---+---+---+\n\t * | D | E | F |\n\t * +---+---+---+\n\t *\n\t * then for each monitor you would call it like this\n\t *\n\t * const w = 1920;\n\t * const h = 1080;\n\t * const fullWidth = w * 3;\n\t * const fullHeight = h * 2;\n\t *\n\t * --A--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t * --B--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t * --C--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t * --D--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t * --E--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t * --F--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t *\n\t * Note there is no reason monitors have to be the same size or in a grid.\n\t */\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tupdateProjectionMatrix() {\n\n\t\tconst near = this.near;\n\t\tlet top = near * Math.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom;\n\t\tlet height = 2 * top;\n\t\tlet width = this.aspect * height;\n\t\tlet left = - 0.5 * width;\n\t\tconst view = this.view;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst fullWidth = view.fullWidth,\n\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\twidth *= view.width / fullWidth;\n\t\t\theight *= view.height / fullHeight;\n\n\t\t}\n\n\t\tconst skew = this.filmOffset;\n\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\tthis.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.fov = this.fov;\n\t\tdata.object.zoom = this.zoom;\n\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\t\tdata.object.focus = this.focus;\n\n\t\tdata.object.aspect = this.aspect;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\tdata.object.filmGauge = this.filmGauge;\n\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst fov = - 90; // negative fov is not an error\nconst aspect = 1;\n\nclass CubeCamera extends Object3D {\n\n\tconstructor( near, far, renderTarget ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CubeCamera';\n\n\t\tthis.renderTarget = renderTarget;\n\n\t\tconst cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPX.layers = this.layers;\n\t\tcameraPX.up.set( 0, 1, 0 );\n\t\tcameraPX.lookAt( 1, 0, 0 );\n\t\tthis.add( cameraPX );\n\n\t\tconst cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNX.layers = this.layers;\n\t\tcameraNX.up.set( 0, 1, 0 );\n\t\tcameraNX.lookAt( - 1, 0, 0 );\n\t\tthis.add( cameraNX );\n\n\t\tconst cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPY.layers = this.layers;\n\t\tcameraPY.up.set( 0, 0, - 1 );\n\t\tcameraPY.lookAt( 0, 1, 0 );\n\t\tthis.add( cameraPY );\n\n\t\tconst cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNY.layers = this.layers;\n\t\tcameraNY.up.set( 0, 0, 1 );\n\t\tcameraNY.lookAt( 0, - 1, 0 );\n\t\tthis.add( cameraNY );\n\n\t\tconst cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPZ.layers = this.layers;\n\t\tcameraPZ.up.set( 0, 1, 0 );\n\t\tcameraPZ.lookAt( 0, 0, 1 );\n\t\tthis.add( cameraPZ );\n\n\t\tconst cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNZ.layers = this.layers;\n\t\tcameraNZ.up.set( 0, 1, 0 );\n\t\tcameraNZ.lookAt( 0, 0, - 1 );\n\t\tthis.add( cameraNZ );\n\n\t}\n\n\tupdate( renderer, scene ) {\n\n\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\tconst renderTarget = this.renderTarget;\n\n\t\tconst [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = this.children;\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\tconst currentToneMapping = renderer.toneMapping;\n\t\tconst currentXrEnabled = renderer.xr.enabled;\n\n\t\trenderer.toneMapping = NoToneMapping;\n\t\trenderer.xr.enabled = false;\n\n\t\tconst generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\trenderer.setRenderTarget( renderTarget, 0 );\n\t\trenderer.render( scene, cameraPX );\n\n\t\trenderer.setRenderTarget( renderTarget, 1 );\n\t\trenderer.render( scene, cameraNX );\n\n\t\trenderer.setRenderTarget( renderTarget, 2 );\n\t\trenderer.render( scene, cameraPY );\n\n\t\trenderer.setRenderTarget( renderTarget, 3 );\n\t\trenderer.render( scene, cameraNY );\n\n\t\trenderer.setRenderTarget( renderTarget, 4 );\n\t\trenderer.render( scene, cameraPZ );\n\n\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\trenderer.setRenderTarget( renderTarget, 5 );\n\t\trenderer.render( scene, cameraNZ );\n\n\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t\trenderer.toneMapping = currentToneMapping;\n\t\trenderer.xr.enabled = currentXrEnabled;\n\n\t\trenderTarget.texture.needsPMREMUpdate = true;\n\n\t}\n\n}\n\nclass CubeTexture extends Texture {\n\n\tconstructor( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding ) {\n\n\t\timages = images !== undefined ? images : [];\n\t\tmapping = mapping !== undefined ? mapping : CubeReflectionMapping;\n\n\t\tsuper( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.isCubeTexture = true;\n\n\t\tthis.flipY = false;\n\n\t}\n\n\tget images() {\n\n\t\treturn this.image;\n\n\t}\n\n\tset images( value ) {\n\n\t\tthis.image = value;\n\n\t}\n\n}\n\nclass WebGLCubeRenderTarget extends WebGLRenderTarget {\n\n\tconstructor( size = 1, options = {} ) {\n\n\t\tsuper( size, size, options );\n\n\t\tthis.isWebGLCubeRenderTarget = true;\n\n\t\tconst image = { width: size, height: size, depth: 1 };\n\t\tconst images = [ image, image, image, image, image, image ];\n\n\t\tthis.texture = new CubeTexture( images, options.mapping, options.wrapS, options.wrapT, options.magFilter, options.minFilter, options.format, options.type, options.anisotropy, options.encoding );\n\n\t\t// By convention -- likely based on the RenderMan spec from the 1990's -- cube maps are specified by WebGL (and three.js)\n\t\t// in a coordinate system in which positive-x is to the right when looking up the positive-z axis -- in other words,\n\t\t// in a left-handed coordinate system. By continuing this convention, preexisting cube maps continued to render correctly.\n\n\t\t// three.js uses a right-handed coordinate system. So environment maps used in three.js appear to have px and nx swapped\n\t\t// and the flag isRenderTargetTexture controls this conversion. The flip is not required when using WebGLCubeRenderTarget.texture\n\t\t// as a cube texture (this is detected when isRenderTargetTexture is set to true for cube textures).\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t\tthis.texture.generateMipmaps = options.generateMipmaps !== undefined ? options.generateMipmaps : false;\n\t\tthis.texture.minFilter = options.minFilter !== undefined ? options.minFilter : LinearFilter;\n\n\t}\n\n\tfromEquirectangularTexture( renderer, texture ) {\n\n\t\tthis.texture.type = texture.type;\n\t\tthis.texture.encoding = texture.encoding;\n\n\t\tthis.texture.generateMipmaps = texture.generateMipmaps;\n\t\tthis.texture.minFilter = texture.minFilter;\n\t\tthis.texture.magFilter = texture.magFilter;\n\n\t\tconst shader = {\n\n\t\t\tuniforms: {\n\t\t\t\ttEquirect: { value: null },\n\t\t\t},\n\n\t\t\tvertexShader: /* glsl */`\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include <begin_vertex>\n\t\t\t\t\t#include <project_vertex>\n\n\t\t\t\t}\n\t\t\t`,\n\n\t\t\tfragmentShader: /* glsl */`\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include <common>\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t`\n\t\t};\n\n\t\tconst geometry = new BoxGeometry( 5, 5, 5 );\n\n\t\tconst material = new ShaderMaterial( {\n\n\t\t\tname: 'CubemapFromEquirect',\n\n\t\t\tuniforms: cloneUniforms( shader.uniforms ),\n\t\t\tvertexShader: shader.vertexShader,\n\t\t\tfragmentShader: shader.fragmentShader,\n\t\t\tside: BackSide,\n\t\t\tblending: NoBlending\n\n\t\t} );\n\n\t\tmaterial.uniforms.tEquirect.value = texture;\n\n\t\tconst mesh = new Mesh( geometry, material );\n\n\t\tconst currentMinFilter = texture.minFilter;\n\n\t\t// Avoid blurred poles\n\t\tif ( texture.minFilter === LinearMipmapLinearFilter ) texture.minFilter = LinearFilter;\n\n\t\tconst camera = new CubeCamera( 1, 10, this );\n\t\tcamera.update( renderer, mesh );\n\n\t\ttexture.minFilter = currentMinFilter;\n\n\t\tmesh.geometry.dispose();\n\t\tmesh.material.dispose();\n\n\t\treturn this;\n\n\t}\n\n\tclear( renderer, color, depth, stencil ) {\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\trenderer.setRenderTarget( this, i );\n\n\t\t\trenderer.clear( color, depth, stencil );\n\n\t\t}\n\n\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t}\n\n}\n\nconst _vector1 = /*@__PURE__*/ new Vector3();\nconst _vector2 = /*@__PURE__*/ new Vector3();\nconst _normalMatrix = /*@__PURE__*/ new Matrix3();\n\nclass Plane {\n\n\tconstructor( normal = new Vector3( 1, 0, 0 ), constant = 0 ) {\n\n\t\tthis.isPlane = true;\n\n\t\t// normal is assumed to be normalized\n\n\t\tthis.normal = normal;\n\t\tthis.constant = constant;\n\n\t}\n\n\tset( normal, constant ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = constant;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponents( x, y, z, w ) {\n\n\t\tthis.normal.set( x, y, z );\n\t\tthis.constant = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromNormalAndCoplanarPoint( normal, point ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = - point.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCoplanarPoints( a, b, c ) {\n\n\t\tconst normal = _vector1.subVectors( c, b ).cross( _vector2.subVectors( a, b ) ).normalize();\n\n\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( plane ) {\n\n\t\tthis.normal.copy( plane.normal );\n\t\tthis.constant = plane.constant;\n\n\t\treturn this;\n\n\t}\n\n\tnormalize() {\n\n\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\tconst inverseNormalLength = 1.0 / this.normal.length();\n\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\tthis.constant *= inverseNormalLength;\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.constant *= - 1;\n\t\tthis.normal.negate();\n\n\t\treturn this;\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn this.normal.dot( point ) + this.constant;\n\n\t}\n\n\tdistanceToSphere( sphere ) {\n\n\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t}\n\n\tprojectPoint( point, target ) {\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.distanceToPoint( point ) ).add( point );\n\n\t}\n\n\tintersectLine( line, target ) {\n\n\t\tconst direction = line.delta( _vector1 );\n\n\t\tconst denominator = this.normal.dot( direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\treturn target.copy( line.start );\n\n\t\t\t}\n\n\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn target.copy( direction ).multiplyScalar( t ).add( line.start );\n\n\t}\n\n\tintersectsLine( line ) {\n\n\t\t// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.\n\n\t\tconst startSign = this.distanceToPoint( line.start );\n\t\tconst endSign = this.distanceToPoint( line.end );\n\n\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsPlane( this );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\treturn sphere.intersectsPlane( this );\n\n\t}\n\n\tcoplanarPoint( target ) {\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t}\n\n\tapplyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\tconst normalMatrix = optionalNormalMatrix || _normalMatrix.getNormalMatrix( matrix );\n\n\t\tconst referencePoint = this.coplanarPoint( _vector1 ).applyMatrix4( matrix );\n\n\t\tconst normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.constant -= offset.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\tequals( plane ) {\n\n\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _sphere$2 = /*@__PURE__*/ new Sphere();\nconst _vector$7 = /*@__PURE__*/ new Vector3();\n\nclass Frustum {\n\n\tconstructor( p0 = new Plane(), p1 = new Plane(), p2 = new Plane(), p3 = new Plane(), p4 = new Plane(), p5 = new Plane() ) {\n\n\t\tthis.planes = [ p0, p1, p2, p3, p4, p5 ];\n\n\t}\n\n\tset( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tconst planes = this.planes;\n\n\t\tplanes[ 0 ].copy( p0 );\n\t\tplanes[ 1 ].copy( p1 );\n\t\tplanes[ 2 ].copy( p2 );\n\t\tplanes[ 3 ].copy( p3 );\n\t\tplanes[ 4 ].copy( p4 );\n\t\tplanes[ 5 ].copy( p5 );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( frustum ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromProjectionMatrix( m ) {\n\n\t\tconst planes = this.planes;\n\t\tconst me = m.elements;\n\t\tconst me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\tconst me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\tconst me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\tconst me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();\n\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();\n\n\t\treturn this;\n\n\t}\n\n\tintersectsObject( object ) {\n\n\t\tconst geometry = object.geometry;\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$2.copy( geometry.boundingSphere ).applyMatrix4( object.matrixWorld );\n\n\t\treturn this.intersectsSphere( _sphere$2 );\n\n\t}\n\n\tintersectsSprite( sprite ) {\n\n\t\t_sphere$2.center.set( 0, 0, 0 );\n\t\t_sphere$2.radius = 0.7071067811865476;\n\t\t_sphere$2.applyMatrix4( sprite.matrixWorld );\n\n\t\treturn this.intersectsSphere( _sphere$2 );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\tconst planes = this.planes;\n\t\tconst center = sphere.center;\n\t\tconst negRadius = - sphere.radius;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst distance = planes[ i ].distanceToPoint( center );\n\n\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst plane = planes[ i ];\n\n\t\t\t// corner at max distance\n\n\t\t\t_vector$7.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t_vector$7.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t_vector$7.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\tif ( plane.distanceToPoint( _vector$7 ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nfunction WebGLAnimation() {\n\n\tlet context = null;\n\tlet isAnimating = false;\n\tlet animationLoop = null;\n\tlet requestId = null;\n\n\tfunction onAnimationFrame( time, frame ) {\n\n\t\tanimationLoop( time, frame );\n\n\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t}\n\n\treturn {\n\n\t\tstart: function () {\n\n\t\t\tif ( isAnimating === true ) return;\n\t\t\tif ( animationLoop === null ) return;\n\n\t\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t\t\tisAnimating = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tcontext.cancelAnimationFrame( requestId );\n\n\t\t\tisAnimating = false;\n\n\t\t},\n\n\t\tsetAnimationLoop: function ( callback ) {\n\n\t\t\tanimationLoop = callback;\n\n\t\t},\n\n\t\tsetContext: function ( value ) {\n\n\t\t\tcontext = value;\n\n\t\t}\n\n\t};\n\n}\n\nfunction WebGLAttributes( gl, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tconst buffers = new WeakMap();\n\n\tfunction createBuffer( attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst usage = attribute.usage;\n\n\t\tconst buffer = gl.createBuffer();\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\t\tgl.bufferData( bufferType, array, usage );\n\n\t\tattribute.onUploadCallback();\n\n\t\tlet type;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\ttype = 5126;\n\n\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\tif ( attribute.isFloat16BufferAttribute ) {\n\n\t\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\t\ttype = 5131;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'THREE.WebGLAttributes: Usage of Float16BufferAttribute requires WebGL2.' );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\ttype = 5123;\n\n\t\t\t}\n\n\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\ttype = 5122;\n\n\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\ttype = 5125;\n\n\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\ttype = 5124;\n\n\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\ttype = 5120;\n\n\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\ttype = 5121;\n\n\t\t} else if ( array instanceof Uint8ClampedArray ) {\n\n\t\t\ttype = 5121;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.WebGLAttributes: Unsupported buffer data format: ' + array );\n\n\t\t}\n\n\t\treturn {\n\t\t\tbuffer: buffer,\n\t\t\ttype: type,\n\t\t\tbytesPerElement: array.BYTES_PER_ELEMENT,\n\t\t\tversion: attribute.version\n\t\t};\n\n\t}\n\n\tfunction updateBuffer( buffer, attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst updateRange = attribute.updateRange;\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\n\t\tif ( updateRange.count === - 1 ) {\n\n\t\t\t// Not using update ranges\n\n\t\t\tgl.bufferSubData( bufferType, 0, array );\n\n\t\t} else {\n\n\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\tgl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray, updateRange.offset, updateRange.count );\n\n\t\t\t} else {\n\n\t\t\t\tgl.bufferSubData( bufferType, updateRange.offset * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray.subarray( updateRange.offset, updateRange.offset + updateRange.count ) );\n\n\t\t\t}\n\n\t\t\tupdateRange.count = - 1; // reset range\n\n\t\t}\n\n\t\tattribute.onUploadCallback();\n\n\t}\n\n\t//\n\n\tfunction get( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\treturn buffers.get( attribute );\n\n\t}\n\n\tfunction remove( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data ) {\n\n\t\t\tgl.deleteBuffer( data.buffer );\n\n\t\t\tbuffers.delete( attribute );\n\n\t\t}\n\n\t}\n\n\tfunction update( attribute, bufferType ) {\n\n\t\tif ( attribute.isGLBufferAttribute ) {\n\n\t\t\tconst cached = buffers.get( attribute );\n\n\t\t\tif ( ! cached || cached.version < attribute.version ) {\n\n\t\t\t\tbuffers.set( attribute, {\n\t\t\t\t\tbuffer: attribute.buffer,\n\t\t\t\t\ttype: attribute.type,\n\t\t\t\t\tbytesPerElement: attribute.elementSize,\n\t\t\t\t\tversion: attribute.version\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data === undefined ) {\n\n\t\t\tbuffers.set( attribute, createBuffer( attribute, bufferType ) );\n\n\t\t} else if ( data.version < attribute.version ) {\n\n\t\t\tupdateBuffer( data.buffer, attribute, bufferType );\n\n\t\t\tdata.version = attribute.version;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update\n\n\t};\n\n}\n\nclass PlaneGeometry extends BufferGeometry {\n\n\tconstructor( width = 1, height = 1, widthSegments = 1, heightSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PlaneGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tconst width_half = width / 2;\n\t\tconst height_half = height / 2;\n\n\t\tconst gridX = Math.floor( widthSegments );\n\t\tconst gridY = Math.floor( heightSegments );\n\n\t\tconst gridX1 = gridX + 1;\n\t\tconst gridY1 = gridY + 1;\n\n\t\tconst segment_width = width / gridX;\n\t\tconst segment_height = height / gridY;\n\n\t\t//\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tconst y = iy * segment_height - height_half;\n\n\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tconst x = ix * segment_width - width_half;\n\n\t\t\t\tvertices.push( x, - y, 0 );\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tconst a = ix + gridX1 * iy;\n\t\t\t\tconst b = ix + gridX1 * ( iy + 1 );\n\t\t\t\tconst c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tconst d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new PlaneGeometry( data.width, data.height, data.widthSegments, data.heightSegments );\n\n\t}\n\n}\n\nvar alphamap_fragment = \"#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, vUv ).g;\\n#endif\";\n\nvar alphamap_pars_fragment = \"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar alphatest_fragment = \"#ifdef USE_ALPHATEST\\n\\tif ( diffuseColor.a < alphaTest ) discard;\\n#endif\";\n\nvar alphatest_pars_fragment = \"#ifdef USE_ALPHATEST\\n\\tuniform float alphaTest;\\n#endif\";\n\nvar aomap_fragment = \"#ifdef USE_AOMAP\\n\\tfloat ambientOcclusion = ( texture2D( aoMap, vUv2 ).r - 1.0 ) * aoMapIntensity + 1.0;\\n\\treflectedLight.indirectDiffuse *= ambientOcclusion;\\n\\t#if defined( USE_ENVMAP ) && defined( STANDARD )\\n\\t\\tfloat dotNV = saturate( dot( geometry.normal, geometry.viewDir ) );\\n\\t\\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\\n\\t#endif\\n#endif\";\n\nvar aomap_pars_fragment = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\";\n\nvar begin_vertex = \"vec3 transformed = vec3( position );\";\n\nvar beginnormal_vertex = \"vec3 objectNormal = vec3( normal );\\n#ifdef USE_TANGENT\\n\\tvec3 objectTangent = vec3( tangent.xyz );\\n#endif\";\n\nvar bsdfs = \"vec3 BRDF_Lambert( const in vec3 diffuseColor ) {\\n\\treturn RECIPROCAL_PI * diffuseColor;\\n}\\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\\n\\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\\n\\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\\n}\\nfloat F_Schlick( const in float f0, const in float f90, const in float dotVH ) {\\n\\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\\n\\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\\n}\\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\\n float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\\n float x2 = x * x;\\n float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\\n return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\\n}\\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\treturn 0.5 / max( gv + gl, EPSILON );\\n}\\nfloat D_GGX( const in float alpha, const in float dotNH ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\\n\\treturn RECIPROCAL_PI * a2 / pow2( denom );\\n}\\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 f0, const in float f90, const in float roughness ) {\\n\\tfloat alpha = pow2( roughness );\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\tvec3 F = F_Schlick( f0, f90, dotVH );\\n\\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\tfloat D = D_GGX( alpha, dotNH );\\n\\treturn F * ( V * D );\\n}\\n#ifdef USE_IRIDESCENCE\\n\\tvec3 BRDF_GGX_Iridescence( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 f0, const in float f90, const in float iridescence, const in vec3 iridescenceFresnel, const in float roughness ) {\\n\\t\\tfloat alpha = pow2( roughness );\\n\\t\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\t\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\t\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\t\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\t\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\t\\tvec3 F = mix( F_Schlick( f0, f90, dotVH ), iridescenceFresnel, iridescence );\\n\\t\\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\t\\tfloat D = D_GGX( alpha, dotNH );\\n\\t\\treturn F * ( V * D );\\n\\t}\\n#endif\\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\\n\\tconst float LUT_SIZE = 64.0;\\n\\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\\n\\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\\n\\tfloat dotNV = saturate( dot( N, V ) );\\n\\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\\n\\tuv = uv * LUT_SCALE + LUT_BIAS;\\n\\treturn uv;\\n}\\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\\n\\tfloat l = length( f );\\n\\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\\n}\\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\\n\\tfloat x = dot( v1, v2 );\\n\\tfloat y = abs( x );\\n\\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\\n\\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\\n\\tfloat v = a / b;\\n\\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\\n\\treturn cross( v1, v2 ) * theta_sintheta;\\n}\\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\\n\\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\\n\\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\\n\\tvec3 lightNormal = cross( v1, v2 );\\n\\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\\n\\tvec3 T1, T2;\\n\\tT1 = normalize( V - N * dot( V, N ) );\\n\\tT2 = - cross( N, T1 );\\n\\tmat3 mat = mInv * transposeMat3( mat3( T1, T2, N ) );\\n\\tvec3 coords[ 4 ];\\n\\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\\n\\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\\n\\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\\n\\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\\n\\tcoords[ 0 ] = normalize( coords[ 0 ] );\\n\\tcoords[ 1 ] = normalize( coords[ 1 ] );\\n\\tcoords[ 2 ] = normalize( coords[ 2 ] );\\n\\tcoords[ 3 ] = normalize( coords[ 3 ] );\\n\\tvec3 vectorFormFactor = vec3( 0.0 );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\\n\\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\\n\\treturn vec3( result );\\n}\\nfloat G_BlinnPhong_Implicit( ) {\\n\\treturn 0.25;\\n}\\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\\n\\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\\n}\\nvec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float shininess ) {\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, 1.0, dotVH );\\n\\tfloat G = G_BlinnPhong_Implicit( );\\n\\tfloat D = D_BlinnPhong( shininess, dotNH );\\n\\treturn F * ( G * D );\\n}\\n#if defined( USE_SHEEN )\\nfloat D_Charlie( float roughness, float dotNH ) {\\n\\tfloat alpha = pow2( roughness );\\n\\tfloat invAlpha = 1.0 / alpha;\\n\\tfloat cos2h = dotNH * dotNH;\\n\\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\\n\\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\\n}\\nfloat V_Neubelt( float dotNV, float dotNL ) {\\n\\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\\n}\\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat D = D_Charlie( sheenRoughness, dotNH );\\n\\tfloat V = V_Neubelt( dotNV, dotNL );\\n\\treturn sheenColor * ( D * V );\\n}\\n#endif\";\n\nvar iridescence_fragment = \"#ifdef USE_IRIDESCENCE\\n\\tconst mat3 XYZ_TO_REC709 = mat3(\\n\\t\\t 3.2404542, -0.9692660, 0.0556434,\\n\\t\\t-1.5371385, 1.8760108, -0.2040259,\\n\\t\\t-0.4985314, 0.0415560, 1.0572252\\n\\t);\\n\\tvec3 Fresnel0ToIor( vec3 fresnel0 ) {\\n\\t\\tvec3 sqrtF0 = sqrt( fresnel0 );\\n\\t\\treturn ( vec3( 1.0 ) + sqrtF0 ) / ( vec3( 1.0 ) - sqrtF0 );\\n\\t}\\n\\tvec3 IorToFresnel0( vec3 transmittedIor, float incidentIor ) {\\n\\t\\treturn pow2( ( transmittedIor - vec3( incidentIor ) ) / ( transmittedIor + vec3( incidentIor ) ) );\\n\\t}\\n\\tfloat IorToFresnel0( float transmittedIor, float incidentIor ) {\\n\\t\\treturn pow2( ( transmittedIor - incidentIor ) / ( transmittedIor + incidentIor ));\\n\\t}\\n\\tvec3 evalSensitivity( float OPD, vec3 shift ) {\\n\\t\\tfloat phase = 2.0 * PI * OPD * 1.0e-9;\\n\\t\\tvec3 val = vec3( 5.4856e-13, 4.4201e-13, 5.2481e-13 );\\n\\t\\tvec3 pos = vec3( 1.6810e+06, 1.7953e+06, 2.2084e+06 );\\n\\t\\tvec3 var = vec3( 4.3278e+09, 9.3046e+09, 6.6121e+09 );\\n\\t\\tvec3 xyz = val * sqrt( 2.0 * PI * var ) * cos( pos * phase + shift ) * exp( - pow2( phase ) * var );\\n\\t\\txyz.x += 9.7470e-14 * sqrt( 2.0 * PI * 4.5282e+09 ) * cos( 2.2399e+06 * phase + shift[ 0 ] ) * exp( - 4.5282e+09 * pow2( phase ) );\\n\\t\\txyz /= 1.0685e-7;\\n\\t\\tvec3 rgb = XYZ_TO_REC709 * xyz;\\n\\t\\treturn rgb;\\n\\t}\\n\\tvec3 evalIridescence( float outsideIOR, float eta2, float cosTheta1, float thinFilmThickness, vec3 baseF0 ) {\\n\\t\\tvec3 I;\\n\\t\\tfloat iridescenceIOR = mix( outsideIOR, eta2, smoothstep( 0.0, 0.03, thinFilmThickness ) );\\n\\t\\tfloat sinTheta2Sq = pow2( outsideIOR / iridescenceIOR ) * ( 1.0 - pow2( cosTheta1 ) );\\n\\t\\tfloat cosTheta2Sq = 1.0 - sinTheta2Sq;\\n\\t\\tif ( cosTheta2Sq < 0.0 ) {\\n\\t\\t\\t return vec3( 1.0 );\\n\\t\\t}\\n\\t\\tfloat cosTheta2 = sqrt( cosTheta2Sq );\\n\\t\\tfloat R0 = IorToFresnel0( iridescenceIOR, outsideIOR );\\n\\t\\tfloat R12 = F_Schlick( R0, 1.0, cosTheta1 );\\n\\t\\tfloat R21 = R12;\\n\\t\\tfloat T121 = 1.0 - R12;\\n\\t\\tfloat phi12 = 0.0;\\n\\t\\tif ( iridescenceIOR < outsideIOR ) phi12 = PI;\\n\\t\\tfloat phi21 = PI - phi12;\\n\\t\\tvec3 baseIOR = Fresnel0ToIor( clamp( baseF0, 0.0, 0.9999 ) );\\t\\tvec3 R1 = IorToFresnel0( baseIOR, iridescenceIOR );\\n\\t\\tvec3 R23 = F_Schlick( R1, 1.0, cosTheta2 );\\n\\t\\tvec3 phi23 = vec3( 0.0 );\\n\\t\\tif ( baseIOR[ 0 ] < iridescenceIOR ) phi23[ 0 ] = PI;\\n\\t\\tif ( baseIOR[ 1 ] < iridescenceIOR ) phi23[ 1 ] = PI;\\n\\t\\tif ( baseIOR[ 2 ] < iridescenceIOR ) phi23[ 2 ] = PI;\\n\\t\\tfloat OPD = 2.0 * iridescenceIOR * thinFilmThickness * cosTheta2;\\n\\t\\tvec3 phi = vec3( phi21 ) + phi23;\\n\\t\\tvec3 R123 = clamp( R12 * R23, 1e-5, 0.9999 );\\n\\t\\tvec3 r123 = sqrt( R123 );\\n\\t\\tvec3 Rs = pow2( T121 ) * R23 / ( vec3( 1.0 ) - R123 );\\n\\t\\tvec3 C0 = R12 + Rs;\\n\\t\\tI = C0;\\n\\t\\tvec3 Cm = Rs - T121;\\n\\t\\tfor ( int m = 1; m <= 2; ++ m ) {\\n\\t\\t\\tCm *= r123;\\n\\t\\t\\tvec3 Sm = 2.0 * evalSensitivity( float( m ) * OPD, float( m ) * phi );\\n\\t\\t\\tI += Cm * Sm;\\n\\t\\t}\\n\\t\\treturn max( I, vec3( 0.0 ) );\\n\\t}\\n#endif\";\n\nvar bumpmap_pars_fragment = \"#ifdef USE_BUMPMAP\\n\\tuniform sampler2D bumpMap;\\n\\tuniform float bumpScale;\\n\\tvec2 dHdxy_fwd() {\\n\\t\\tvec2 dSTdx = dFdx( vUv );\\n\\t\\tvec2 dSTdy = dFdy( vUv );\\n\\t\\tfloat Hll = bumpScale * texture2D( bumpMap, vUv ).x;\\n\\t\\tfloat dBx = bumpScale * texture2D( bumpMap, vUv + dSTdx ).x - Hll;\\n\\t\\tfloat dBy = bumpScale * texture2D( bumpMap, vUv + dSTdy ).x - Hll;\\n\\t\\treturn vec2( dBx, dBy );\\n\\t}\\n\\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\\n\\t\\tvec3 vSigmaX = dFdx( surf_pos.xyz );\\n\\t\\tvec3 vSigmaY = dFdy( surf_pos.xyz );\\n\\t\\tvec3 vN = surf_norm;\\n\\t\\tvec3 R1 = cross( vSigmaY, vN );\\n\\t\\tvec3 R2 = cross( vN, vSigmaX );\\n\\t\\tfloat fDet = dot( vSigmaX, R1 ) * faceDirection;\\n\\t\\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\\n\\t\\treturn normalize( abs( fDet ) * surf_norm - vGrad );\\n\\t}\\n#endif\";\n\nvar clipping_planes_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvec4 plane;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\\n\\t\\tplane = clippingPlanes[ i ];\\n\\t\\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\tbool clipped = true;\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t\\tif ( clipped ) discard;\\n\\t#endif\\n#endif\";\n\nvar clipping_planes_pars_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvarying vec3 vClipPosition;\\n\\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\\n#endif\";\n\nvar clipping_planes_pars_vertex = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvarying vec3 vClipPosition;\\n#endif\";\n\nvar clipping_planes_vertex = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvClipPosition = - mvPosition.xyz;\\n#endif\";\n\nvar color_fragment = \"#if defined( USE_COLOR_ALPHA )\\n\\tdiffuseColor *= vColor;\\n#elif defined( USE_COLOR )\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\";\n\nvar color_pars_fragment = \"#if defined( USE_COLOR_ALPHA )\\n\\tvarying vec4 vColor;\\n#elif defined( USE_COLOR )\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_pars_vertex = \"#if defined( USE_COLOR_ALPHA )\\n\\tvarying vec4 vColor;\\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_vertex = \"#if defined( USE_COLOR_ALPHA )\\n\\tvColor = vec4( 1.0 );\\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR )\\n\\tvColor = vec3( 1.0 );\\n#endif\\n#ifdef USE_COLOR\\n\\tvColor *= color;\\n#endif\\n#ifdef USE_INSTANCING_COLOR\\n\\tvColor.xyz *= instanceColor.xyz;\\n#endif\";\n\nvar common = \"#define PI 3.141592653589793\\n#define PI2 6.283185307179586\\n#define PI_HALF 1.5707963267948966\\n#define RECIPROCAL_PI 0.3183098861837907\\n#define RECIPROCAL_PI2 0.15915494309189535\\n#define EPSILON 1e-6\\n#ifndef saturate\\n#define saturate( a ) clamp( a, 0.0, 1.0 )\\n#endif\\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\\nfloat pow2( const in float x ) { return x*x; }\\nvec3 pow2( const in vec3 x ) { return x*x; }\\nfloat pow3( const in float x ) { return x*x*x; }\\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\\nhighp float rand( const in vec2 uv ) {\\n\\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\\n\\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\\n\\treturn fract( sin( sn ) * c );\\n}\\n#ifdef HIGH_PRECISION\\n\\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\\n#else\\n\\tfloat precisionSafeLength( vec3 v ) {\\n\\t\\tfloat maxComponent = max3( abs( v ) );\\n\\t\\treturn length( v / maxComponent ) * maxComponent;\\n\\t}\\n#endif\\nstruct IncidentLight {\\n\\tvec3 color;\\n\\tvec3 direction;\\n\\tbool visible;\\n};\\nstruct ReflectedLight {\\n\\tvec3 directDiffuse;\\n\\tvec3 directSpecular;\\n\\tvec3 indirectDiffuse;\\n\\tvec3 indirectSpecular;\\n};\\nstruct GeometricContext {\\n\\tvec3 position;\\n\\tvec3 normal;\\n\\tvec3 viewDir;\\n#ifdef USE_CLEARCOAT\\n\\tvec3 clearcoatNormal;\\n#endif\\n};\\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\\n}\\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\\n}\\nmat3 transposeMat3( const in mat3 m ) {\\n\\tmat3 tmp;\\n\\ttmp[ 0 ] = vec3( m[ 0 ].x, m[ 1 ].x, m[ 2 ].x );\\n\\ttmp[ 1 ] = vec3( m[ 0 ].y, m[ 1 ].y, m[ 2 ].y );\\n\\ttmp[ 2 ] = vec3( m[ 0 ].z, m[ 1 ].z, m[ 2 ].z );\\n\\treturn tmp;\\n}\\nfloat luminance( const in vec3 rgb ) {\\n\\tconst vec3 weights = vec3( 0.2126729, 0.7151522, 0.0721750 );\\n\\treturn dot( weights, rgb );\\n}\\nbool isPerspectiveMatrix( mat4 m ) {\\n\\treturn m[ 2 ][ 3 ] == - 1.0;\\n}\\nvec2 equirectUv( in vec3 dir ) {\\n\\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\\n\\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\\n\\treturn vec2( u, v );\\n}\";\n\nvar cube_uv_reflection_fragment = \"#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t#define cubeUV_minMipLevel 4.0\\n\\t#define cubeUV_minTileSize 16.0\\n\\tfloat getFace( vec3 direction ) {\\n\\t\\tvec3 absDirection = abs( direction );\\n\\t\\tfloat face = - 1.0;\\n\\t\\tif ( absDirection.x > absDirection.z ) {\\n\\t\\t\\tif ( absDirection.x > absDirection.y )\\n\\t\\t\\t\\tface = direction.x > 0.0 ? 0.0 : 3.0;\\n\\t\\t\\telse\\n\\t\\t\\t\\tface = direction.y > 0.0 ? 1.0 : 4.0;\\n\\t\\t} else {\\n\\t\\t\\tif ( absDirection.z > absDirection.y )\\n\\t\\t\\t\\tface = direction.z > 0.0 ? 2.0 : 5.0;\\n\\t\\t\\telse\\n\\t\\t\\t\\tface = direction.y > 0.0 ? 1.0 : 4.0;\\n\\t\\t}\\n\\t\\treturn face;\\n\\t}\\n\\tvec2 getUV( vec3 direction, float face ) {\\n\\t\\tvec2 uv;\\n\\t\\tif ( face == 0.0 ) {\\n\\t\\t\\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\\n\\t\\t} else if ( face == 1.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\\n\\t\\t} else if ( face == 2.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\\n\\t\\t} else if ( face == 3.0 ) {\\n\\t\\t\\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\\n\\t\\t} else if ( face == 4.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\\n\\t\\t} else {\\n\\t\\t\\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\\n\\t\\t}\\n\\t\\treturn 0.5 * ( uv + 1.0 );\\n\\t}\\n\\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\\n\\t\\tfloat face = getFace( direction );\\n\\t\\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\\n\\t\\tmipInt = max( mipInt, cubeUV_minMipLevel );\\n\\t\\tfloat faceSize = exp2( mipInt );\\n\\t\\thighp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\\n\\t\\tif ( face > 2.0 ) {\\n\\t\\t\\tuv.y += faceSize;\\n\\t\\t\\tface -= 3.0;\\n\\t\\t}\\n\\t\\tuv.x += face * faceSize;\\n\\t\\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\\n\\t\\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\\n\\t\\tuv.x *= CUBEUV_TEXEL_WIDTH;\\n\\t\\tuv.y *= CUBEUV_TEXEL_HEIGHT;\\n\\t\\t#ifdef texture2DGradEXT\\n\\t\\t\\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\\n\\t\\t#else\\n\\t\\t\\treturn texture2D( envMap, uv ).rgb;\\n\\t\\t#endif\\n\\t}\\n\\t#define cubeUV_r0 1.0\\n\\t#define cubeUV_v0 0.339\\n\\t#define cubeUV_m0 - 2.0\\n\\t#define cubeUV_r1 0.8\\n\\t#define cubeUV_v1 0.276\\n\\t#define cubeUV_m1 - 1.0\\n\\t#define cubeUV_r4 0.4\\n\\t#define cubeUV_v4 0.046\\n\\t#define cubeUV_m4 2.0\\n\\t#define cubeUV_r5 0.305\\n\\t#define cubeUV_v5 0.016\\n\\t#define cubeUV_m5 3.0\\n\\t#define cubeUV_r6 0.21\\n\\t#define cubeUV_v6 0.0038\\n\\t#define cubeUV_m6 4.0\\n\\tfloat roughnessToMip( float roughness ) {\\n\\t\\tfloat mip = 0.0;\\n\\t\\tif ( roughness >= cubeUV_r1 ) {\\n\\t\\t\\tmip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\\n\\t\\t} else if ( roughness >= cubeUV_r4 ) {\\n\\t\\t\\tmip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\\n\\t\\t} else if ( roughness >= cubeUV_r5 ) {\\n\\t\\t\\tmip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\\n\\t\\t} else if ( roughness >= cubeUV_r6 ) {\\n\\t\\t\\tmip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5;\\n\\t\\t} else {\\n\\t\\t\\tmip = - 2.0 * log2( 1.16 * roughness );\\t\\t}\\n\\t\\treturn mip;\\n\\t}\\n\\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\\n\\t\\tfloat mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP );\\n\\t\\tfloat mipF = fract( mip );\\n\\t\\tfloat mipInt = floor( mip );\\n\\t\\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\\n\\t\\tif ( mipF == 0.0 ) {\\n\\t\\t\\treturn vec4( color0, 1.0 );\\n\\t\\t} else {\\n\\t\\t\\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\\n\\t\\t\\treturn vec4( mix( color0, color1, mipF ), 1.0 );\\n\\t\\t}\\n\\t}\\n#endif\";\n\nvar defaultnormal_vertex = \"vec3 transformedNormal = objectNormal;\\n#ifdef USE_INSTANCING\\n\\tmat3 m = mat3( instanceMatrix );\\n\\ttransformedNormal /= vec3( dot( m[ 0 ], m[ 0 ] ), dot( m[ 1 ], m[ 1 ] ), dot( m[ 2 ], m[ 2 ] ) );\\n\\ttransformedNormal = m * transformedNormal;\\n#endif\\ntransformedNormal = normalMatrix * transformedNormal;\\n#ifdef FLIP_SIDED\\n\\ttransformedNormal = - transformedNormal;\\n#endif\\n#ifdef USE_TANGENT\\n\\tvec3 transformedTangent = ( modelViewMatrix * vec4( objectTangent, 0.0 ) ).xyz;\\n\\t#ifdef FLIP_SIDED\\n\\t\\ttransformedTangent = - transformedTangent;\\n\\t#endif\\n#endif\";\n\nvar displacementmap_pars_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\";\n\nvar displacementmap_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vUv ).x * displacementScale + displacementBias );\\n#endif\";\n\nvar emissivemap_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vUv );\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\";\n\nvar emissivemap_pars_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\";\n\nvar encodings_fragment = \"gl_FragColor = linearToOutputTexel( gl_FragColor );\";\n\nvar encodings_pars_fragment = \"vec4 LinearToLinear( in vec4 value ) {\\n\\treturn value;\\n}\\nvec4 LinearTosRGB( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\\n}\";\n\nvar envmap_fragment = \"#ifdef USE_ENVMAP\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvec3 cameraToFrag;\\n\\t\\tif ( isOrthographic ) {\\n\\t\\t\\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\\n\\t\\t} else {\\n\\t\\t\\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\\n\\t\\t}\\n\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#else\\n\\t\\tvec3 reflectVec = vReflect;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 envColor = textureCube( envMap, vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\\n\\t#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\n\\t#endif\\n\\t#ifdef ENVMAP_BLENDING_MULTIPLY\\n\\t\\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_MIX )\\n\\t\\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_ADD )\\n\\t\\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\\n\\t#endif\\n#endif\";\n\nvar envmap_common_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tuniform float envMapIntensity;\\n\\tuniform float flipEnvMap;\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n\\t\\n#endif\";\n\nvar envmap_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tuniform float reflectivity;\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\\n\\t\\t#define ENV_WORLDPOS\\n\\t#endif\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t\\tuniform float refractionRatio;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t#endif\\n#endif\";\n\nvar envmap_pars_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\\n\\t\\t#define ENV_WORLDPOS\\n\\t#endif\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\t\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t\\tuniform float refractionRatio;\\n\\t#endif\\n#endif\";\n\nvar envmap_vertex = \"#ifdef USE_ENVMAP\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvWorldPosition = worldPosition.xyz;\\n\\t#else\\n\\t\\tvec3 cameraToVertex;\\n\\t\\tif ( isOrthographic ) {\\n\\t\\t\\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\\n\\t\\t} else {\\n\\t\\t\\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\\n\\t\\t}\\n\\t\\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvReflect = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar fog_vertex = \"#ifdef USE_FOG\\n\\tvFogDepth = - mvPosition.z;\\n#endif\";\n\nvar fog_pars_vertex = \"#ifdef USE_FOG\\n\\tvarying float vFogDepth;\\n#endif\";\n\nvar fog_fragment = \"#ifdef USE_FOG\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\";\n\nvar fog_pars_fragment = \"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\tvarying float vFogDepth;\\n\\t#ifdef FOG_EXP2\\n\\t\\tuniform float fogDensity;\\n\\t#else\\n\\t\\tuniform float fogNear;\\n\\t\\tuniform float fogFar;\\n\\t#endif\\n#endif\";\n\nvar gradientmap_pars_fragment = \"#ifdef USE_GRADIENTMAP\\n\\tuniform sampler2D gradientMap;\\n#endif\\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\\n\\tfloat dotNL = dot( normal, lightDirection );\\n\\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\\n\\t#ifdef USE_GRADIENTMAP\\n\\t\\treturn vec3( texture2D( gradientMap, coord ).r );\\n\\t#else\\n\\t\\tvec2 fw = fwidth( coord ) * 0.5;\\n\\t\\treturn mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) );\\n\\t#endif\\n}\";\n\nvar lightmap_fragment = \"#ifdef USE_LIGHTMAP\\n\\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\\n\\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\\n\\treflectedLight.indirectDiffuse += lightMapIrradiance;\\n#endif\";\n\nvar lightmap_pars_fragment = \"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\";\n\nvar lights_lambert_fragment = \"LambertMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularStrength = specularStrength;\";\n\nvar lights_lambert_pars_fragment = \"varying vec3 vViewPosition;\\nstruct LambertMaterial {\\n\\tvec3 diffuseColor;\\n\\tfloat specularStrength;\\n};\\nvoid RE_Direct_Lambert( const in IncidentLight directLight, const in GeometricContext geometry, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in GeometricContext geometry, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Lambert\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Lambert\";\n\nvar lights_pars_begin = \"uniform bool receiveShadow;\\nuniform vec3 ambientLightColor;\\nuniform vec3 lightProbe[ 9 ];\\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\\n\\tfloat x = normal.x, y = normal.y, z = normal.z;\\n\\tvec3 result = shCoefficients[ 0 ] * 0.886227;\\n\\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\\n\\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\\n\\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\\n\\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\\n\\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\\n\\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\\n\\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\\n\\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\\n\\treturn result;\\n}\\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\\n\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\\n\\treturn irradiance;\\n}\\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\\n\\tvec3 irradiance = ambientLightColor;\\n\\treturn irradiance;\\n}\\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\\n\\t#if defined ( PHYSICALLY_CORRECT_LIGHTS )\\n\\t\\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\\n\\t\\tif ( cutoffDistance > 0.0 ) {\\n\\t\\t\\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\\n\\t\\t}\\n\\t\\treturn distanceFalloff;\\n\\t#else\\n\\t\\tif ( cutoffDistance > 0.0 && decayExponent > 0.0 ) {\\n\\t\\t\\treturn pow( saturate( - lightDistance / cutoffDistance + 1.0 ), decayExponent );\\n\\t\\t}\\n\\t\\treturn 1.0;\\n\\t#endif\\n}\\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\\n\\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\\n}\\n#if NUM_DIR_LIGHTS > 0\\n\\tstruct DirectionalLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t};\\n\\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\\n\\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, const in GeometricContext geometry, out IncidentLight light ) {\\n\\t\\tlight.color = directionalLight.color;\\n\\t\\tlight.direction = directionalLight.direction;\\n\\t\\tlight.visible = true;\\n\\t}\\n#endif\\n#if NUM_POINT_LIGHTS > 0\\n\\tstruct PointLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t};\\n\\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\\n\\tvoid getPointLightInfo( const in PointLight pointLight, const in GeometricContext geometry, out IncidentLight light ) {\\n\\t\\tvec3 lVector = pointLight.position - geometry.position;\\n\\t\\tlight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tlight.color = pointLight.color;\\n\\t\\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\tlight.visible = ( light.color != vec3( 0.0 ) );\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tstruct SpotLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tfloat coneCos;\\n\\t\\tfloat penumbraCos;\\n\\t};\\n\\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\\n\\tvoid getSpotLightInfo( const in SpotLight spotLight, const in GeometricContext geometry, out IncidentLight light ) {\\n\\t\\tvec3 lVector = spotLight.position - geometry.position;\\n\\t\\tlight.direction = normalize( lVector );\\n\\t\\tfloat angleCos = dot( light.direction, spotLight.direction );\\n\\t\\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\tif ( spotAttenuation > 0.0 ) {\\n\\t\\t\\tfloat lightDistance = length( lVector );\\n\\t\\t\\tlight.color = spotLight.color * spotAttenuation;\\n\\t\\t\\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tlight.visible = ( light.color != vec3( 0.0 ) );\\n\\t\\t} else {\\n\\t\\t\\tlight.color = vec3( 0.0 );\\n\\t\\t\\tlight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tstruct RectAreaLight {\\n\\t\\tvec3 color;\\n\\t\\tvec3 position;\\n\\t\\tvec3 halfWidth;\\n\\t\\tvec3 halfHeight;\\n\\t};\\n\\tuniform sampler2D ltc_1;\\tuniform sampler2D ltc_2;\\n\\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tstruct HemisphereLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 skyColor;\\n\\t\\tvec3 groundColor;\\n\\t};\\n\\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\\n\\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\\n\\t\\tfloat dotNL = dot( normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\";\n\nvar envmap_physical_pars_fragment = \"#if defined( USE_ENVMAP )\\n\\tvec3 getIBLIrradiance( const in vec3 normal ) {\\n\\t\\t#if defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, worldNormal, 1.0 );\\n\\t\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t\\t#else\\n\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t#endif\\n\\t}\\n\\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\\n\\t\\t#if defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\t\\tvec3 reflectVec = reflect( - viewDir, normal );\\n\\t\\t\\treflectVec = normalize( mix( reflectVec, normal, roughness * roughness) );\\n\\t\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, reflectVec, roughness );\\n\\t\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t\\t#else\\n\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t#endif\\n\\t}\\n#endif\";\n\nvar lights_toon_fragment = \"ToonMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\";\n\nvar lights_toon_pars_fragment = \"varying vec3 vViewPosition;\\nstruct ToonMaterial {\\n\\tvec3 diffuseColor;\\n};\\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tvec3 irradiance = getGradientIrradiance( geometry.normal, directLight.direction ) * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in GeometricContext geometry, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Toon\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Toon\";\n\nvar lights_phong_fragment = \"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\";\n\nvar lights_phong_pars_fragment = \"varying vec3 vViewPosition;\\nstruct BlinnPhongMaterial {\\n\\tvec3 diffuseColor;\\n\\tvec3 specularColor;\\n\\tfloat specularShininess;\\n\\tfloat specularStrength;\\n};\\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in GeometricContext geometry, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_BlinnPhong\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_BlinnPhong\";\n\nvar lights_physical_fragment = \"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nvec3 dxy = max( abs( dFdx( geometryNormal ) ), abs( dFdy( geometryNormal ) ) );\\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\\nmaterial.roughness = min( material.roughness, 1.0 );\\n#ifdef IOR\\n\\tmaterial.ior = ior;\\n\\t#ifdef SPECULAR\\n\\t\\tfloat specularIntensityFactor = specularIntensity;\\n\\t\\tvec3 specularColorFactor = specularColor;\\n\\t\\t#ifdef USE_SPECULARINTENSITYMAP\\n\\t\\t\\tspecularIntensityFactor *= texture2D( specularIntensityMap, vUv ).a;\\n\\t\\t#endif\\n\\t\\t#ifdef USE_SPECULARCOLORMAP\\n\\t\\t\\tspecularColorFactor *= texture2D( specularColorMap, vUv ).rgb;\\n\\t\\t#endif\\n\\t\\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\\n\\t#else\\n\\t\\tfloat specularIntensityFactor = 1.0;\\n\\t\\tvec3 specularColorFactor = vec3( 1.0 );\\n\\t\\tmaterial.specularF90 = 1.0;\\n\\t#endif\\n\\tmaterial.specularColor = mix( min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor, diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = mix( vec3( 0.04 ), diffuseColor.rgb, metalnessFactor );\\n\\tmaterial.specularF90 = 1.0;\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tmaterial.clearcoat = clearcoat;\\n\\tmaterial.clearcoatRoughness = clearcoatRoughness;\\n\\tmaterial.clearcoatF0 = vec3( 0.04 );\\n\\tmaterial.clearcoatF90 = 1.0;\\n\\t#ifdef USE_CLEARCOATMAP\\n\\t\\tmaterial.clearcoat *= texture2D( clearcoatMap, vUv ).x;\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\t\\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vUv ).y;\\n\\t#endif\\n\\tmaterial.clearcoat = saturate( material.clearcoat );\\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\\n\\tmaterial.clearcoatRoughness += geometryRoughness;\\n\\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tmaterial.iridescence = iridescence;\\n\\tmaterial.iridescenceIOR = iridescenceIOR;\\n\\t#ifdef USE_IRIDESCENCEMAP\\n\\t\\tmaterial.iridescence *= texture2D( iridescenceMap, vUv ).r;\\n\\t#endif\\n\\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\t\\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vUv ).g + iridescenceThicknessMinimum;\\n\\t#else\\n\\t\\tmaterial.iridescenceThickness = iridescenceThicknessMaximum;\\n\\t#endif\\n#endif\\n#ifdef USE_SHEEN\\n\\tmaterial.sheenColor = sheenColor;\\n\\t#ifdef USE_SHEENCOLORMAP\\n\\t\\tmaterial.sheenColor *= texture2D( sheenColorMap, vUv ).rgb;\\n\\t#endif\\n\\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\\n\\t#ifdef USE_SHEENROUGHNESSMAP\\n\\t\\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vUv ).a;\\n\\t#endif\\n#endif\";\n\nvar lights_physical_pars_fragment = \"struct PhysicalMaterial {\\n\\tvec3 diffuseColor;\\n\\tfloat roughness;\\n\\tvec3 specularColor;\\n\\tfloat specularF90;\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat clearcoat;\\n\\t\\tfloat clearcoatRoughness;\\n\\t\\tvec3 clearcoatF0;\\n\\t\\tfloat clearcoatF90;\\n\\t#endif\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tfloat iridescence;\\n\\t\\tfloat iridescenceIOR;\\n\\t\\tfloat iridescenceThickness;\\n\\t\\tvec3 iridescenceFresnel;\\n\\t\\tvec3 iridescenceF0;\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tvec3 sheenColor;\\n\\t\\tfloat sheenRoughness;\\n\\t#endif\\n\\t#ifdef IOR\\n\\t\\tfloat ior;\\n\\t#endif\\n\\t#ifdef USE_TRANSMISSION\\n\\t\\tfloat transmission;\\n\\t\\tfloat transmissionAlpha;\\n\\t\\tfloat thickness;\\n\\t\\tfloat attenuationDistance;\\n\\t\\tvec3 attenuationColor;\\n\\t#endif\\n};\\nvec3 clearcoatSpecular = vec3( 0.0 );\\nvec3 sheenSpecular = vec3( 0.0 );\\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat r2 = roughness * roughness;\\n\\tfloat a = roughness < 0.25 ? -339.2 * r2 + 161.4 * roughness - 25.9 : -8.48 * r2 + 14.3 * roughness - 9.95;\\n\\tfloat b = roughness < 0.25 ? 44.0 * r2 - 23.7 * roughness + 3.26 : 1.97 * r2 - 3.27 * roughness + 0.72;\\n\\tfloat DG = exp( a * dotNV + b ) + ( roughness < 0.25 ? 0.0 : 0.1 * ( roughness - 0.25 ) );\\n\\treturn saturate( DG * RECIPROCAL_PI );\\n}\\nvec2 DFGApprox( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tconst vec4 c0 = vec4( - 1, - 0.0275, - 0.572, 0.022 );\\n\\tconst vec4 c1 = vec4( 1, 0.0425, 1.04, - 0.04 );\\n\\tvec4 r = roughness * c0 + c1;\\n\\tfloat a004 = min( r.x * r.x, exp2( - 9.28 * dotNV ) ) * r.x + r.y;\\n\\tvec2 fab = vec2( - 1.04, 1.04 ) * a004 + r.zw;\\n\\treturn fab;\\n}\\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\\n\\tvec2 fab = DFGApprox( normal, viewDir, roughness );\\n\\treturn specularColor * fab.x + specularF90 * fab.y;\\n}\\n#ifdef USE_IRIDESCENCE\\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\\n#else\\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\\n#endif\\n\\tvec2 fab = DFGApprox( normal, viewDir, roughness );\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\\n\\t#else\\n\\t\\tvec3 Fr = specularColor;\\n\\t#endif\\n\\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\\n\\tfloat Ess = fab.x + fab.y;\\n\\tfloat Ems = 1.0 - Ess;\\n\\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\\n\\tsingleScatter += FssEss;\\n\\tmultiScatter += Fms * Ems;\\n}\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 normal = geometry.normal;\\n\\t\\tvec3 viewDir = geometry.viewDir;\\n\\t\\tvec3 position = geometry.position;\\n\\t\\tvec3 lightPos = rectAreaLight.position;\\n\\t\\tvec3 halfWidth = rectAreaLight.halfWidth;\\n\\t\\tvec3 halfHeight = rectAreaLight.halfHeight;\\n\\t\\tvec3 lightColor = rectAreaLight.color;\\n\\t\\tfloat roughness = material.roughness;\\n\\t\\tvec3 rectCoords[ 4 ];\\n\\t\\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\\t\\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\\n\\t\\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\\n\\t\\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\\n\\t\\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\\n\\t\\tvec4 t1 = texture2D( ltc_1, uv );\\n\\t\\tvec4 t2 = texture2D( ltc_2, uv );\\n\\t\\tmat3 mInv = mat3(\\n\\t\\t\\tvec3( t1.x, 0, t1.y ),\\n\\t\\t\\tvec3( 0, 1, 0 ),\\n\\t\\t\\tvec3( t1.z, 0, t1.w )\\n\\t\\t);\\n\\t\\tvec3 fresnel = ( material.specularColor * t2.x + ( vec3( 1.0 ) - material.specularColor ) * t2.y );\\n\\t\\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\\n\\t\\treflectedLight.directDiffuse += lightColor * material.diffuseColor * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\\n\\t}\\n#endif\\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometry.normal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat dotNLcc = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );\\n\\t\\tvec3 ccIrradiance = dotNLcc * directLight.color;\\n\\t\\tclearcoatSpecular += ccIrradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.clearcoatNormal, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tsheenSpecular += irradiance * BRDF_Sheen( directLight.direction, geometry.viewDir, geometry.normal, material.sheenColor, material.sheenRoughness );\\n\\t#endif\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\treflectedLight.directSpecular += irradiance * BRDF_GGX_Iridescence( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness );\\n\\t#else\\n\\t\\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometry.viewDir, geometry.normal, material.specularColor, material.specularF90, material.roughness );\\n\\t#endif\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tclearcoatSpecular += clearcoatRadiance * EnvironmentBRDF( geometry.clearcoatNormal, geometry.viewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tsheenSpecular += irradiance * material.sheenColor * IBLSheenBRDF( geometry.normal, geometry.viewDir, material.sheenRoughness );\\n\\t#endif\\n\\tvec3 singleScattering = vec3( 0.0 );\\n\\tvec3 multiScattering = vec3( 0.0 );\\n\\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tcomputeMultiscatteringIridescence( geometry.normal, geometry.viewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\\n\\t#else\\n\\t\\tcomputeMultiscattering( geometry.normal, geometry.viewDir, material.specularColor, material.specularF90, material.roughness, singleScattering, multiScattering );\\n\\t#endif\\n\\tvec3 totalScattering = singleScattering + multiScattering;\\n\\tvec3 diffuse = material.diffuseColor * ( 1.0 - max( max( totalScattering.r, totalScattering.g ), totalScattering.b ) );\\n\\treflectedLight.indirectSpecular += radiance * singleScattering;\\n\\treflectedLight.indirectSpecular += multiScattering * cosineWeightedIrradiance;\\n\\treflectedLight.indirectDiffuse += diffuse * cosineWeightedIrradiance;\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Physical\\n#define RE_Direct_RectArea\\t\\tRE_Direct_RectArea_Physical\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Physical\\n#define RE_IndirectSpecular\\t\\tRE_IndirectSpecular_Physical\\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\\n\\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\\n}\";\n\nvar lights_fragment_begin = \"\\nGeometricContext geometry;\\ngeometry.position = - vViewPosition;\\ngeometry.normal = normal;\\ngeometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\\n#ifdef USE_CLEARCOAT\\n\\tgeometry.clearcoatNormal = clearcoatNormal;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tfloat dotNVi = saturate( dot( normal, geometry.viewDir ) );\\n\\tif ( material.iridescenceThickness == 0.0 ) {\\n\\t\\tmaterial.iridescence = 0.0;\\n\\t} else {\\n\\t\\tmaterial.iridescence = saturate( material.iridescence );\\n\\t}\\n\\tif ( material.iridescence > 0.0 ) {\\n\\t\\tmaterial.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\\n\\t\\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\\n\\t}\\n#endif\\nIncidentLight directLight;\\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tPointLight pointLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\\n\\tPointLightShadow pointLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tgetPointLightInfo( pointLight, geometry, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\\n\\t\\tpointLightShadow = pointLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tSpotLight spotLight;\\n\\tvec4 spotColor;\\n\\tvec3 spotLightCoord;\\n\\tbool inSpotLightMap;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\\n\\tSpotLightShadow spotLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tgetSpotLightInfo( spotLight, geometry, directLight );\\n\\t\\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\\n\\t\\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\\n\\t\\t#else\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\\n\\t\\t#endif\\n\\t\\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\\n\\t\\t\\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\\n\\t\\t\\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\\n\\t\\t\\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\\n\\t\\t\\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\\n\\t\\t#endif\\n\\t\\t#undef SPOT_LIGHT_MAP_INDEX\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\tspotLightShadow = spotLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tDirectionalLight directionalLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\\n\\tDirectionalLightShadow directionalLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tgetDirectionalLightInfo( directionalLight, geometry, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\\n\\t\\tdirectionalLightShadow = directionalLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometry, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\\n\\tRectAreaLight rectAreaLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\\n\\t\\trectAreaLight = rectAreaLights[ i ];\\n\\t\\tRE_Direct_RectArea( rectAreaLight, geometry, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if defined( RE_IndirectDiffuse )\\n\\tvec3 iblIrradiance = vec3( 0.0 );\\n\\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\n\\tirradiance += getLightProbeIrradiance( lightProbe, geometry.normal );\\n\\t#if ( NUM_HEMI_LIGHTS > 0 )\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\t\\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometry.normal );\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tvec3 radiance = vec3( 0.0 );\\n\\tvec3 clearcoatRadiance = vec3( 0.0 );\\n#endif\";\n\nvar lights_fragment_maps = \"#if defined( RE_IndirectDiffuse )\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\\n\\t\\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\\n\\t\\tirradiance += lightMapIrradiance;\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tiblIrradiance += getIBLIrradiance( geometry.normal );\\n\\t#endif\\n#endif\\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\\n\\tradiance += getIBLRadiance( geometry.viewDir, geometry.normal, material.roughness );\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tclearcoatRadiance += getIBLRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness );\\n\\t#endif\\n#endif\";\n\nvar lights_fragment_end = \"#if defined( RE_IndirectDiffuse )\\n\\tRE_IndirectDiffuse( irradiance, geometry, material, reflectedLight );\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometry, material, reflectedLight );\\n#endif\";\n\nvar logdepthbuf_fragment = \"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\\n\\tgl_FragDepthEXT = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\\n#endif\";\n\nvar logdepthbuf_pars_fragment = \"#if defined( USE_LOGDEPTHBUF ) && defined( USE_LOGDEPTHBUF_EXT )\\n\\tuniform float logDepthBufFC;\\n\\tvarying float vFragDepth;\\n\\tvarying float vIsPerspective;\\n#endif\";\n\nvar logdepthbuf_pars_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvarying float vFragDepth;\\n\\t\\tvarying float vIsPerspective;\\n\\t#else\\n\\t\\tuniform float logDepthBufFC;\\n\\t#endif\\n#endif\";\n\nvar logdepthbuf_vertex = \"#ifdef USE_LOGDEPTHBUF\\n\\t#ifdef USE_LOGDEPTHBUF_EXT\\n\\t\\tvFragDepth = 1.0 + gl_Position.w;\\n\\t\\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\\n\\t#else\\n\\t\\tif ( isPerspectiveMatrix( projectionMatrix ) ) {\\n\\t\\t\\tgl_Position.z = log2( max( EPSILON, gl_Position.w + 1.0 ) ) * logDepthBufFC - 1.0;\\n\\t\\t\\tgl_Position.z *= gl_Position.w;\\n\\t\\t}\\n\\t#endif\\n#endif\";\n\nvar map_fragment = \"#ifdef USE_MAP\\n\\tvec4 sampledDiffuseColor = texture2D( map, vUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE\\n\\t\\tsampledDiffuseColor = vec4( mix( pow( sampledDiffuseColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), sampledDiffuseColor.rgb * 0.0773993808, vec3( lessThanEqual( sampledDiffuseColor.rgb, vec3( 0.04045 ) ) ) ), sampledDiffuseColor.w );\\n\\t#endif\\n\\tdiffuseColor *= sampledDiffuseColor;\\n#endif\";\n\nvar map_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\";\n\nvar map_particle_fragment = \"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\\n\\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\\n#endif\\n#ifdef USE_MAP\\n\\tdiffuseColor *= texture2D( map, uv );\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\\n#endif\";\n\nvar map_particle_pars_fragment = \"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\\n\\tuniform mat3 uvTransform;\\n#endif\\n#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar metalnessmap_fragment = \"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vUv );\\n\\tmetalnessFactor *= texelMetalness.b;\\n#endif\";\n\nvar metalnessmap_pars_fragment = \"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\";\n\nvar morphcolor_vertex = \"#if defined( USE_MORPHCOLORS ) && defined( MORPHTARGETS_TEXTURE )\\n\\tvColor *= morphTargetBaseInfluence;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\t#if defined( USE_COLOR_ALPHA )\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ];\\n\\t\\t#elif defined( USE_COLOR )\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ];\\n\\t\\t#endif\\n\\t}\\n#endif\";\n\nvar morphnormal_vertex = \"#ifdef USE_MORPHNORMALS\\n\\tobjectNormal *= morphTargetBaseInfluence;\\n\\t#ifdef MORPHTARGETS_TEXTURE\\n\\t\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\\n\\t\\t}\\n\\t#else\\n\\t\\tobjectNormal += morphNormal0 * morphTargetInfluences[ 0 ];\\n\\t\\tobjectNormal += morphNormal1 * morphTargetInfluences[ 1 ];\\n\\t\\tobjectNormal += morphNormal2 * morphTargetInfluences[ 2 ];\\n\\t\\tobjectNormal += morphNormal3 * morphTargetInfluences[ 3 ];\\n\\t#endif\\n#endif\";\n\nvar morphtarget_pars_vertex = \"#ifdef USE_MORPHTARGETS\\n\\tuniform float morphTargetBaseInfluence;\\n\\t#ifdef MORPHTARGETS_TEXTURE\\n\\t\\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\\n\\t\\tuniform sampler2DArray morphTargetsTexture;\\n\\t\\tuniform ivec2 morphTargetsTextureSize;\\n\\t\\tvec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\\n\\t\\t\\tint texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\\n\\t\\t\\tint y = texelIndex / morphTargetsTextureSize.x;\\n\\t\\t\\tint x = texelIndex - y * morphTargetsTextureSize.x;\\n\\t\\t\\tivec3 morphUV = ivec3( x, y, morphTargetIndex );\\n\\t\\t\\treturn texelFetch( morphTargetsTexture, morphUV, 0 );\\n\\t\\t}\\n\\t#else\\n\\t\\t#ifndef USE_MORPHNORMALS\\n\\t\\t\\tuniform float morphTargetInfluences[ 8 ];\\n\\t\\t#else\\n\\t\\t\\tuniform float morphTargetInfluences[ 4 ];\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar morphtarget_vertex = \"#ifdef USE_MORPHTARGETS\\n\\ttransformed *= morphTargetBaseInfluence;\\n\\t#ifdef MORPHTARGETS_TEXTURE\\n\\t\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\\n\\t\\t}\\n\\t#else\\n\\t\\ttransformed += morphTarget0 * morphTargetInfluences[ 0 ];\\n\\t\\ttransformed += morphTarget1 * morphTargetInfluences[ 1 ];\\n\\t\\ttransformed += morphTarget2 * morphTargetInfluences[ 2 ];\\n\\t\\ttransformed += morphTarget3 * morphTargetInfluences[ 3 ];\\n\\t\\t#ifndef USE_MORPHNORMALS\\n\\t\\t\\ttransformed += morphTarget4 * morphTargetInfluences[ 4 ];\\n\\t\\t\\ttransformed += morphTarget5 * morphTargetInfluences[ 5 ];\\n\\t\\t\\ttransformed += morphTarget6 * morphTargetInfluences[ 6 ];\\n\\t\\t\\ttransformed += morphTarget7 * morphTargetInfluences[ 7 ];\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar normal_fragment_begin = \"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\\n#ifdef FLAT_SHADED\\n\\tvec3 fdx = dFdx( vViewPosition );\\n\\tvec3 fdy = dFdy( vViewPosition );\\n\\tvec3 normal = normalize( cross( fdx, fdy ) );\\n#else\\n\\tvec3 normal = normalize( vNormal );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal = normal * faceDirection;\\n\\t#endif\\n\\t#ifdef USE_TANGENT\\n\\t\\tvec3 tangent = normalize( vTangent );\\n\\t\\tvec3 bitangent = normalize( vBitangent );\\n\\t\\t#ifdef DOUBLE_SIDED\\n\\t\\t\\ttangent = tangent * faceDirection;\\n\\t\\t\\tbitangent = bitangent * faceDirection;\\n\\t\\t#endif\\n\\t\\t#if defined( TANGENTSPACE_NORMALMAP ) || defined( USE_CLEARCOAT_NORMALMAP )\\n\\t\\t\\tmat3 vTBN = mat3( tangent, bitangent, normal );\\n\\t\\t#endif\\n\\t#endif\\n#endif\\nvec3 geometryNormal = normal;\";\n\nvar normal_fragment_maps = \"#ifdef OBJECTSPACE_NORMALMAP\\n\\tnormal = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\\n\\t#ifdef FLIP_SIDED\\n\\t\\tnormal = - normal;\\n\\t#endif\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal = normal * faceDirection;\\n\\t#endif\\n\\tnormal = normalize( normalMatrix * normal );\\n#elif defined( TANGENTSPACE_NORMALMAP )\\n\\tvec3 mapN = texture2D( normalMap, vUv ).xyz * 2.0 - 1.0;\\n\\tmapN.xy *= normalScale;\\n\\t#ifdef USE_TANGENT\\n\\t\\tnormal = normalize( vTBN * mapN );\\n\\t#else\\n\\t\\tnormal = perturbNormal2Arb( - vViewPosition, normal, mapN, faceDirection );\\n\\t#endif\\n#elif defined( USE_BUMPMAP )\\n\\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\\n#endif\";\n\nvar normal_pars_fragment = \"#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\";\n\nvar normal_pars_vertex = \"#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\";\n\nvar normal_vertex = \"#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n\\t#ifdef USE_TANGENT\\n\\t\\tvTangent = normalize( transformedTangent );\\n\\t\\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\\n\\t#endif\\n#endif\";\n\nvar normalmap_pars_fragment = \"#ifdef USE_NORMALMAP\\n\\tuniform sampler2D normalMap;\\n\\tuniform vec2 normalScale;\\n#endif\\n#ifdef OBJECTSPACE_NORMALMAP\\n\\tuniform mat3 normalMatrix;\\n#endif\\n#if ! defined ( USE_TANGENT ) && ( defined ( TANGENTSPACE_NORMALMAP ) || defined ( USE_CLEARCOAT_NORMALMAP ) )\\n\\tvec3 perturbNormal2Arb( vec3 eye_pos, vec3 surf_norm, vec3 mapN, float faceDirection ) {\\n\\t\\tvec3 q0 = dFdx( eye_pos.xyz );\\n\\t\\tvec3 q1 = dFdy( eye_pos.xyz );\\n\\t\\tvec2 st0 = dFdx( vUv.st );\\n\\t\\tvec2 st1 = dFdy( vUv.st );\\n\\t\\tvec3 N = surf_norm;\\n\\t\\tvec3 q1perp = cross( q1, N );\\n\\t\\tvec3 q0perp = cross( N, q0 );\\n\\t\\tvec3 T = q1perp * st0.x + q0perp * st1.x;\\n\\t\\tvec3 B = q1perp * st0.y + q0perp * st1.y;\\n\\t\\tfloat det = max( dot( T, T ), dot( B, B ) );\\n\\t\\tfloat scale = ( det == 0.0 ) ? 0.0 : faceDirection * inversesqrt( det );\\n\\t\\treturn normalize( T * ( mapN.x * scale ) + B * ( mapN.y * scale ) + N * mapN.z );\\n\\t}\\n#endif\";\n\nvar clearcoat_normal_fragment_begin = \"#ifdef USE_CLEARCOAT\\n\\tvec3 clearcoatNormal = geometryNormal;\\n#endif\";\n\nvar clearcoat_normal_fragment_maps = \"#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vUv ).xyz * 2.0 - 1.0;\\n\\tclearcoatMapN.xy *= clearcoatNormalScale;\\n\\t#ifdef USE_TANGENT\\n\\t\\tclearcoatNormal = normalize( vTBN * clearcoatMapN );\\n\\t#else\\n\\t\\tclearcoatNormal = perturbNormal2Arb( - vViewPosition, clearcoatNormal, clearcoatMapN, faceDirection );\\n\\t#endif\\n#endif\";\n\nvar clearcoat_pars_fragment = \"#ifdef USE_CLEARCOATMAP\\n\\tuniform sampler2D clearcoatMap;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tuniform sampler2D clearcoatRoughnessMap;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tuniform sampler2D clearcoatNormalMap;\\n\\tuniform vec2 clearcoatNormalScale;\\n#endif\";\n\nvar iridescence_pars_fragment = \"#ifdef USE_IRIDESCENCEMAP\\n\\tuniform sampler2D iridescenceMap;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tuniform sampler2D iridescenceThicknessMap;\\n#endif\";\n\nvar output_fragment = \"#ifdef OPAQUE\\ndiffuseColor.a = 1.0;\\n#endif\\n#ifdef USE_TRANSMISSION\\ndiffuseColor.a *= material.transmissionAlpha + 0.1;\\n#endif\\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );\";\n\nvar packing = \"vec3 packNormalToRGB( const in vec3 normal ) {\\n\\treturn normalize( normal ) * 0.5 + 0.5;\\n}\\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\\n\\treturn 2.0 * rgb.xyz - 1.0;\\n}\\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;\\nconst vec3 PackFactors = vec3( 256. * 256. * 256., 256. * 256., 256. );\\nconst vec4 UnpackFactors = UnpackDownscale / vec4( PackFactors, 1. );\\nconst float ShiftRight8 = 1. / 256.;\\nvec4 packDepthToRGBA( const in float v ) {\\n\\tvec4 r = vec4( fract( v * PackFactors ), v );\\n\\tr.yzw -= r.xyz * ShiftRight8;\\treturn r * PackUpscale;\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n\\treturn dot( v, UnpackFactors );\\n}\\nvec2 packDepthToRG( in highp float v ) {\\n\\treturn packDepthToRGBA( v ).yx;\\n}\\nfloat unpackRGToDepth( const in highp vec2 v ) {\\n\\treturn unpackRGBAToDepth( vec4( v.xy, 0.0, 0.0 ) );\\n}\\nvec4 pack2HalfToRGBA( vec2 v ) {\\n\\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\\n\\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\\n}\\nvec2 unpackRGBATo2Half( vec4 v ) {\\n\\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\\n}\\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( viewZ + near ) / ( near - far );\\n}\\nfloat orthographicDepthToViewZ( const in float linearClipZ, const in float near, const in float far ) {\\n\\treturn linearClipZ * ( near - far ) - near;\\n}\\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\\n}\\nfloat perspectiveDepthToViewZ( const in float invClipZ, const in float near, const in float far ) {\\n\\treturn ( near * far ) / ( ( far - near ) * invClipZ - far );\\n}\";\n\nvar premultiplied_alpha_fragment = \"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\";\n\nvar project_vertex = \"vec4 mvPosition = vec4( transformed, 1.0 );\\n#ifdef USE_INSTANCING\\n\\tmvPosition = instanceMatrix * mvPosition;\\n#endif\\nmvPosition = modelViewMatrix * mvPosition;\\ngl_Position = projectionMatrix * mvPosition;\";\n\nvar dithering_fragment = \"#ifdef DITHERING\\n\\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\\n#endif\";\n\nvar dithering_pars_fragment = \"#ifdef DITHERING\\n\\tvec3 dithering( vec3 color ) {\\n\\t\\tfloat grid_position = rand( gl_FragCoord.xy );\\n\\t\\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\\n\\t\\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\\n\\t\\treturn color + dither_shift_RGB;\\n\\t}\\n#endif\";\n\nvar roughnessmap_fragment = \"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vUv );\\n\\troughnessFactor *= texelRoughness.g;\\n#endif\";\n\nvar roughnessmap_pars_fragment = \"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\";\n\nvar shadowmap_pars_fragment = \"#if NUM_SPOT_LIGHT_COORDS > 0\\n varying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\\n#endif\\n#if NUM_SPOT_LIGHT_MAPS > 0\\n uniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\\n#endif\\n#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tstruct DirectionalLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tuniform sampler2D pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\tfloat texture2DCompare( sampler2D depths, vec2 uv, float compare ) {\\n\\t\\treturn step( compare, unpackRGBAToDepth( texture2D( depths, uv ) ) );\\n\\t}\\n\\tvec2 texture2DDistribution( sampler2D shadow, vec2 uv ) {\\n\\t\\treturn unpackRGBATo2Half( texture2D( shadow, uv ) );\\n\\t}\\n\\tfloat VSMShadow (sampler2D shadow, vec2 uv, float compare ){\\n\\t\\tfloat occlusion = 1.0;\\n\\t\\tvec2 distribution = texture2DDistribution( shadow, uv );\\n\\t\\tfloat hard_shadow = step( compare , distribution.x );\\n\\t\\tif (hard_shadow != 1.0 ) {\\n\\t\\t\\tfloat distance = compare - distribution.x ;\\n\\t\\t\\tfloat variance = max( 0.00000, distribution.y * distribution.y );\\n\\t\\t\\tfloat softness_probability = variance / (variance + distance * distance );\\t\\t\\tsoftness_probability = clamp( ( softness_probability - 0.3 ) / ( 0.95 - 0.3 ), 0.0, 1.0 );\\t\\t\\tocclusion = clamp( max( hard_shadow, softness_probability ), 0.0, 1.0 );\\n\\t\\t}\\n\\t\\treturn occlusion;\\n\\t}\\n\\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\\n\\t\\tfloat shadow = 1.0;\\n\\t\\tshadowCoord.xyz /= shadowCoord.w;\\n\\t\\tshadowCoord.z += shadowBias;\\n\\t\\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\\n\\t\\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\\n\\t\\tif ( frustumTest ) {\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx0 = - texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy0 = - texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx1 = + texelSize.x * shadowRadius;\\n\\t\\t\\tfloat dy1 = + texelSize.y * shadowRadius;\\n\\t\\t\\tfloat dx2 = dx0 / 2.0;\\n\\t\\t\\tfloat dy2 = dy0 / 2.0;\\n\\t\\t\\tfloat dx3 = dx1 / 2.0;\\n\\t\\t\\tfloat dy3 = dy1 / 2.0;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy2 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx2, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx3, dy3 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( 0.0, dy1 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, shadowCoord.xy + vec2( dx1, dy1 ), shadowCoord.z )\\n\\t\\t\\t) * ( 1.0 / 17.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_PCF_SOFT )\\n\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\tfloat dx = texelSize.x;\\n\\t\\t\\tfloat dy = texelSize.y;\\n\\t\\t\\tvec2 uv = shadowCoord.xy;\\n\\t\\t\\tvec2 f = fract( uv * shadowMapSize + 0.5 );\\n\\t\\t\\tuv -= f * texelSize;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv, shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + vec2( dx, 0.0 ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + vec2( 0.0, dy ), shadowCoord.z ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, uv + texelSize, shadowCoord.z ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, 0.0 ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 0.0 ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.x ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( -dx, dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.x ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( 0.0, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 0.0, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.y ) +\\n\\t\\t\\t\\tmix( texture2DCompare( shadowMap, uv + vec2( dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t f.y ) +\\n\\t\\t\\t\\tmix( mix( texture2DCompare( shadowMap, uv + vec2( -dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, -dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t f.x ),\\n\\t\\t\\t\\t\\t mix( texture2DCompare( shadowMap, uv + vec2( -dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t texture2DCompare( shadowMap, uv + vec2( 2.0 * dx, 2.0 * dy ), shadowCoord.z ),\\n\\t\\t\\t\\t\\t\\t f.x ),\\n\\t\\t\\t\\t\\t f.y )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#elif defined( SHADOWMAP_TYPE_VSM )\\n\\t\\t\\tshadow = VSMShadow( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#else\\n\\t\\t\\tshadow = texture2DCompare( shadowMap, shadowCoord.xy, shadowCoord.z );\\n\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn shadow;\\n\\t}\\n\\tvec2 cubeToUV( vec3 v, float texelSizeY ) {\\n\\t\\tvec3 absV = abs( v );\\n\\t\\tfloat scaleToCube = 1.0 / max( absV.x, max( absV.y, absV.z ) );\\n\\t\\tabsV *= scaleToCube;\\n\\t\\tv *= scaleToCube * ( 1.0 - 2.0 * texelSizeY );\\n\\t\\tvec2 planar = v.xy;\\n\\t\\tfloat almostATexel = 1.5 * texelSizeY;\\n\\t\\tfloat almostOne = 1.0 - almostATexel;\\n\\t\\tif ( absV.z >= almostOne ) {\\n\\t\\t\\tif ( v.z > 0.0 )\\n\\t\\t\\t\\tplanar.x = 4.0 - v.x;\\n\\t\\t} else if ( absV.x >= almostOne ) {\\n\\t\\t\\tfloat signX = sign( v.x );\\n\\t\\t\\tplanar.x = v.z * signX + 2.0 * signX;\\n\\t\\t} else if ( absV.y >= almostOne ) {\\n\\t\\t\\tfloat signY = sign( v.y );\\n\\t\\t\\tplanar.x = v.x + 2.0 * signY + 2.0;\\n\\t\\t\\tplanar.y = v.z * signY - 2.0;\\n\\t\\t}\\n\\t\\treturn vec2( 0.125, 0.25 ) * planar + vec2( 0.375, 0.75 );\\n\\t}\\n\\tfloat getPointShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\\n\\t\\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\\n\\t\\tvec3 lightToPosition = shadowCoord.xyz;\\n\\t\\tfloat dp = ( length( lightToPosition ) - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\\t\\tdp += shadowBias;\\n\\t\\tvec3 bd3D = normalize( lightToPosition );\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\\n\\t\\t\\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\\n\\t\\t\\treturn (\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\\n\\t\\t\\t\\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\\n\\t\\t\\t) * ( 1.0 / 9.0 );\\n\\t\\t#else\\n\\t\\t\\treturn texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\\n\\t\\t#endif\\n\\t}\\n#endif\";\n\nvar shadowmap_pars_vertex = \"#if NUM_SPOT_LIGHT_COORDS > 0\\n uniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\\n varying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\\n#endif\\n#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tstruct DirectionalLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t#endif\\n#endif\";\n\nvar shadowmap_vertex = \"#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\\n\\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\tvec4 shadowWorldPosition;\\n#endif\\n#if defined( USE_SHADOWMAP )\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n\\t\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\t\\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\t\\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n#endif\\n#if NUM_SPOT_LIGHT_COORDS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\\n\\t\\tshadowWorldPosition = worldPosition;\\n\\t\\t#if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\t\\tshadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\\n\\t\\t#endif\\n\\t\\tvSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\";\n\nvar shadowmask_pars_fragment = \"float getShadowMask() {\\n\\tfloat shadow = 1.0;\\n\\t#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\tDirectionalLightShadow directionalLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\tSpotLightShadow spotLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tspotLight = spotLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\tPointLightShadow pointLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tpointLight = pointLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#endif\\n\\treturn shadow;\\n}\";\n\nvar skinbase_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\\n\\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\\n\\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\\n\\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\\n#endif\";\n\nvar skinning_pars_vertex = \"#ifdef USE_SKINNING\\n\\tuniform mat4 bindMatrix;\\n\\tuniform mat4 bindMatrixInverse;\\n\\tuniform highp sampler2D boneTexture;\\n\\tuniform int boneTextureSize;\\n\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\tfloat j = i * 4.0;\\n\\t\\tfloat x = mod( j, float( boneTextureSize ) );\\n\\t\\tfloat y = floor( j / float( boneTextureSize ) );\\n\\t\\tfloat dx = 1.0 / float( boneTextureSize );\\n\\t\\tfloat dy = 1.0 / float( boneTextureSize );\\n\\t\\ty = dy * ( y + 0.5 );\\n\\t\\tvec4 v1 = texture2D( boneTexture, vec2( dx * ( x + 0.5 ), y ) );\\n\\t\\tvec4 v2 = texture2D( boneTexture, vec2( dx * ( x + 1.5 ), y ) );\\n\\t\\tvec4 v3 = texture2D( boneTexture, vec2( dx * ( x + 2.5 ), y ) );\\n\\t\\tvec4 v4 = texture2D( boneTexture, vec2( dx * ( x + 3.5 ), y ) );\\n\\t\\tmat4 bone = mat4( v1, v2, v3, v4 );\\n\\t\\treturn bone;\\n\\t}\\n#endif\";\n\nvar skinning_vertex = \"#ifdef USE_SKINNING\\n\\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\\n\\tvec4 skinned = vec4( 0.0 );\\n\\tskinned += boneMatX * skinVertex * skinWeight.x;\\n\\tskinned += boneMatY * skinVertex * skinWeight.y;\\n\\tskinned += boneMatZ * skinVertex * skinWeight.z;\\n\\tskinned += boneMatW * skinVertex * skinWeight.w;\\n\\ttransformed = ( bindMatrixInverse * skinned ).xyz;\\n#endif\";\n\nvar skinnormal_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 skinMatrix = mat4( 0.0 );\\n\\tskinMatrix += skinWeight.x * boneMatX;\\n\\tskinMatrix += skinWeight.y * boneMatY;\\n\\tskinMatrix += skinWeight.z * boneMatZ;\\n\\tskinMatrix += skinWeight.w * boneMatW;\\n\\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\\n\\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\\n\\t#ifdef USE_TANGENT\\n\\t\\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\\n\\t#endif\\n#endif\";\n\nvar specularmap_fragment = \"float specularStrength;\\n#ifdef USE_SPECULARMAP\\n\\tvec4 texelSpecular = texture2D( specularMap, vUv );\\n\\tspecularStrength = texelSpecular.r;\\n#else\\n\\tspecularStrength = 1.0;\\n#endif\";\n\nvar specularmap_pars_fragment = \"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\";\n\nvar tonemapping_fragment = \"#if defined( TONE_MAPPING )\\n\\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\";\n\nvar tonemapping_pars_fragment = \"#ifndef saturate\\n#define saturate( a ) clamp( a, 0.0, 1.0 )\\n#endif\\nuniform float toneMappingExposure;\\nvec3 LinearToneMapping( vec3 color ) {\\n\\treturn toneMappingExposure * color;\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( color / ( vec3( 1.0 ) + color ) );\\n}\\nvec3 OptimizedCineonToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = max( vec3( 0.0 ), color - 0.004 );\\n\\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\\n}\\nvec3 RRTAndODTFit( vec3 v ) {\\n\\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\\n\\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\\n\\treturn a / b;\\n}\\nvec3 ACESFilmicToneMapping( vec3 color ) {\\n\\tconst mat3 ACESInputMat = mat3(\\n\\t\\tvec3( 0.59719, 0.07600, 0.02840 ),\\t\\tvec3( 0.35458, 0.90834, 0.13383 ),\\n\\t\\tvec3( 0.04823, 0.01566, 0.83777 )\\n\\t);\\n\\tconst mat3 ACESOutputMat = mat3(\\n\\t\\tvec3( 1.60475, -0.10208, -0.00327 ),\\t\\tvec3( -0.53108, 1.10813, -0.07276 ),\\n\\t\\tvec3( -0.07367, -0.00605, 1.07602 )\\n\\t);\\n\\tcolor *= toneMappingExposure / 0.6;\\n\\tcolor = ACESInputMat * color;\\n\\tcolor = RRTAndODTFit( color );\\n\\tcolor = ACESOutputMat * color;\\n\\treturn saturate( color );\\n}\\nvec3 CustomToneMapping( vec3 color ) { return color; }\";\n\nvar transmission_fragment = \"#ifdef USE_TRANSMISSION\\n\\tmaterial.transmission = transmission;\\n\\tmaterial.transmissionAlpha = 1.0;\\n\\tmaterial.thickness = thickness;\\n\\tmaterial.attenuationDistance = attenuationDistance;\\n\\tmaterial.attenuationColor = attenuationColor;\\n\\t#ifdef USE_TRANSMISSIONMAP\\n\\t\\tmaterial.transmission *= texture2D( transmissionMap, vUv ).r;\\n\\t#endif\\n\\t#ifdef USE_THICKNESSMAP\\n\\t\\tmaterial.thickness *= texture2D( thicknessMap, vUv ).g;\\n\\t#endif\\n\\tvec3 pos = vWorldPosition;\\n\\tvec3 v = normalize( cameraPosition - pos );\\n\\tvec3 n = inverseTransformDirection( normal, viewMatrix );\\n\\tvec4 transmission = getIBLVolumeRefraction(\\n\\t\\tn, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\\n\\t\\tpos, modelMatrix, viewMatrix, projectionMatrix, material.ior, material.thickness,\\n\\t\\tmaterial.attenuationColor, material.attenuationDistance );\\n\\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmission.a, material.transmission );\\n\\ttotalDiffuse = mix( totalDiffuse, transmission.rgb, material.transmission );\\n#endif\";\n\nvar transmission_pars_fragment = \"#ifdef USE_TRANSMISSION\\n\\tuniform float transmission;\\n\\tuniform float thickness;\\n\\tuniform float attenuationDistance;\\n\\tuniform vec3 attenuationColor;\\n\\t#ifdef USE_TRANSMISSIONMAP\\n\\t\\tuniform sampler2D transmissionMap;\\n\\t#endif\\n\\t#ifdef USE_THICKNESSMAP\\n\\t\\tuniform sampler2D thicknessMap;\\n\\t#endif\\n\\tuniform vec2 transmissionSamplerSize;\\n\\tuniform sampler2D transmissionSamplerMap;\\n\\tuniform mat4 modelMatrix;\\n\\tuniform mat4 projectionMatrix;\\n\\tvarying vec3 vWorldPosition;\\n\\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\\n\\t\\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\\n\\t\\tvec3 modelScale;\\n\\t\\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\\n\\t\\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\\n\\t\\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\\n\\t\\treturn normalize( refractionVector ) * thickness * modelScale;\\n\\t}\\n\\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\\n\\t\\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\\n\\t}\\n\\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\\n\\t\\tfloat framebufferLod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\\n\\t\\t#ifdef texture2DLodEXT\\n\\t\\t\\treturn texture2DLodEXT( transmissionSamplerMap, fragCoord.xy, framebufferLod );\\n\\t\\t#else\\n\\t\\t\\treturn texture2D( transmissionSamplerMap, fragCoord.xy, framebufferLod );\\n\\t\\t#endif\\n\\t}\\n\\tvec3 applyVolumeAttenuation( const in vec3 radiance, const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\\n\\t\\tif ( isinf( attenuationDistance ) ) {\\n\\t\\t\\treturn radiance;\\n\\t\\t} else {\\n\\t\\t\\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\\n\\t\\t\\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\\t\\t\\treturn transmittance * radiance;\\n\\t\\t}\\n\\t}\\n\\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\\n\\t\\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\\n\\t\\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float ior, const in float thickness,\\n\\t\\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\\n\\t\\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\\n\\t\\tvec3 refractedRayExit = position + transmissionRay;\\n\\t\\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\\n\\t\\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\\n\\t\\trefractionCoords += 1.0;\\n\\t\\trefractionCoords /= 2.0;\\n\\t\\tvec4 transmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\\n\\t\\tvec3 attenuatedColor = applyVolumeAttenuation( transmittedLight.rgb, length( transmissionRay ), attenuationColor, attenuationDistance );\\n\\t\\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\\n\\t\\treturn vec4( ( 1.0 - F ) * attenuatedColor * diffuseColor, transmittedLight.a );\\n\\t}\\n#endif\";\n\nvar uv_pars_fragment = \"#if ( defined( USE_UV ) && ! defined( UVS_VERTEX_ONLY ) )\\n\\tvarying vec2 vUv;\\n#endif\";\n\nvar uv_pars_vertex = \"#ifdef USE_UV\\n\\t#ifdef UVS_VERTEX_ONLY\\n\\t\\tvec2 vUv;\\n\\t#else\\n\\t\\tvarying vec2 vUv;\\n\\t#endif\\n\\tuniform mat3 uvTransform;\\n#endif\";\n\nvar uv_vertex = \"#ifdef USE_UV\\n\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n#endif\";\n\nvar uv2_pars_fragment = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvarying vec2 vUv2;\\n#endif\";\n\nvar uv2_pars_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tattribute vec2 uv2;\\n\\tvarying vec2 vUv2;\\n\\tuniform mat3 uv2Transform;\\n#endif\";\n\nvar uv2_vertex = \"#if defined( USE_LIGHTMAP ) || defined( USE_AOMAP )\\n\\tvUv2 = ( uv2Transform * vec3( uv2, 1 ) ).xy;\\n#endif\";\n\nvar worldpos_vertex = \"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\\n\\tvec4 worldPosition = vec4( transformed, 1.0 );\\n\\t#ifdef USE_INSTANCING\\n\\t\\tworldPosition = instanceMatrix * worldPosition;\\n\\t#endif\\n\\tworldPosition = modelMatrix * worldPosition;\\n#endif\";\n\nconst vertex$h = \"varying vec2 vUv;\\nuniform mat3 uvTransform;\\nvoid main() {\\n\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n\\tgl_Position = vec4( position.xy, 1.0, 1.0 );\\n}\";\n\nconst fragment$h = \"uniform sampler2D t2D;\\nuniform float backgroundIntensity;\\nvarying vec2 vUv;\\nvoid main() {\\n\\tvec4 texColor = texture2D( t2D, vUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE\\n\\t\\ttexColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );\\n\\t#endif\\n\\ttexColor.rgb *= backgroundIntensity;\\n\\tgl_FragColor = texColor;\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n}\";\n\nconst vertex$g = \"varying vec3 vWorldDirection;\\n#include <common>\\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include <begin_vertex>\\n\\t#include <project_vertex>\\n\\tgl_Position.z = gl_Position.w;\\n}\";\n\nconst fragment$g = \"#ifdef ENVMAP_TYPE_CUBE\\n\\tuniform samplerCube envMap;\\n#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\tuniform sampler2D envMap;\\n#endif\\nuniform float flipEnvMap;\\nuniform float backgroundBlurriness;\\nuniform float backgroundIntensity;\\nvarying vec3 vWorldDirection;\\n#include <cube_uv_reflection_fragment>\\nvoid main() {\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 texColor = textureCube( envMap, vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\\n\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tvec4 texColor = textureCubeUV( envMap, vWorldDirection, backgroundBlurriness );\\n\\t#else\\n\\t\\tvec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\\n\\t#endif\\n\\ttexColor.rgb *= backgroundIntensity;\\n\\tgl_FragColor = texColor;\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n}\";\n\nconst vertex$f = \"varying vec3 vWorldDirection;\\n#include <common>\\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include <begin_vertex>\\n\\t#include <project_vertex>\\n\\tgl_Position.z = gl_Position.w;\\n}\";\n\nconst fragment$f = \"uniform samplerCube tCube;\\nuniform float tFlip;\\nuniform float opacity;\\nvarying vec3 vWorldDirection;\\nvoid main() {\\n\\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\\n\\tgl_FragColor = texColor;\\n\\tgl_FragColor.a *= opacity;\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n}\";\n\nconst vertex$e = \"#include <common>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvarying vec2 vHighPrecisionZW;\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include <beginnormal_vertex>\\n\\t\\t#include <morphnormal_vertex>\\n\\t\\t#include <skinnormal_vertex>\\n\\t#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvHighPrecisionZW = gl_Position.zw;\\n}\";\n\nconst fragment$e = \"#if DEPTH_PACKING == 3200\\n\\tuniform float opacity;\\n#endif\\n#include <common>\\n#include <packing>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvarying vec2 vHighPrecisionZW;\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tdiffuseColor.a = opacity;\\n\\t#endif\\n\\t#include <map_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <logdepthbuf_fragment>\\n\\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[0] / vHighPrecisionZW[1] + 0.5;\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\\n\\t#elif DEPTH_PACKING == 3201\\n\\t\\tgl_FragColor = packDepthToRGBA( fragCoordZ );\\n\\t#endif\\n}\";\n\nconst vertex$d = \"#define DISTANCE\\nvarying vec3 vWorldPosition;\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include <beginnormal_vertex>\\n\\t\\t#include <morphnormal_vertex>\\n\\t\\t#include <skinnormal_vertex>\\n\\t#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvWorldPosition = worldPosition.xyz;\\n}\";\n\nconst fragment$d = \"#define DISTANCE\\nuniform vec3 referencePosition;\\nuniform float nearDistance;\\nuniform float farDistance;\\nvarying vec3 vWorldPosition;\\n#include <common>\\n#include <packing>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main () {\\n\\t#include <clipping_planes_fragment>\\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#include <map_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\tfloat dist = length( vWorldPosition - referencePosition );\\n\\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\\n\\tdist = saturate( dist );\\n\\tgl_FragColor = packDepthToRGBA( dist );\\n}\";\n\nconst vertex$c = \"varying vec3 vWorldDirection;\\n#include <common>\\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include <begin_vertex>\\n\\t#include <project_vertex>\\n}\";\n\nconst fragment$c = \"uniform sampler2D tEquirect;\\nvarying vec3 vWorldDirection;\\n#include <common>\\nvoid main() {\\n\\tvec3 direction = normalize( vWorldDirection );\\n\\tvec2 sampleUV = equirectUv( direction );\\n\\tgl_FragColor = texture2D( tEquirect, sampleUV );\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n}\";\n\nconst vertex$b = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include <common>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\tvLineDistance = scale * lineDistance;\\n\\t#include <color_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$b = \"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform float dashSize;\\nuniform float totalSize;\\nvarying float vLineDistance;\\n#include <common>\\n#include <color_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\\n\\t\\tdiscard;\\n\\t}\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <color_fragment>\\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include <output_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n}\";\n\nconst vertex$a = \"#include <common>\\n#include <uv_pars_vertex>\\n#include <uv2_pars_vertex>\\n#include <envmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <uv2_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\\n\\t\\t#include <beginnormal_vertex>\\n\\t\\t#include <morphnormal_vertex>\\n\\t\\t#include <skinbase_vertex>\\n\\t\\t#include <skinnormal_vertex>\\n\\t\\t#include <defaultnormal_vertex>\\n\\t#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <envmap_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$a = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include <common>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <uv2_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <envmap_common_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <specularmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <specularmap_fragment>\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vUv2 );\\n\\t\\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t#include <aomap_fragment>\\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include <envmap_fragment>\\n\\t#include <output_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$9 = \"#define LAMBERT\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <uv2_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <envmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <uv2_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include <worldpos_vertex>\\n\\t#include <envmap_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$9 = \"#define LAMBERT\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\n#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <uv2_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <envmap_common_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars_begin>\\n#include <normal_pars_fragment>\\n#include <lights_lambert_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <specularmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <specularmap_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\t#include <emissivemap_fragment>\\n\\t#include <lights_lambert_fragment>\\n\\t#include <lights_fragment_begin>\\n\\t#include <lights_fragment_maps>\\n\\t#include <lights_fragment_end>\\n\\t#include <aomap_fragment>\\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include <envmap_fragment>\\n\\t#include <output_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$8 = \"#define MATCAP\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <color_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <fog_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n}\";\n\nconst fragment$8 = \"#define MATCAP\\nuniform vec3 diffuse;\\nuniform float opacity;\\nuniform sampler2D matcap;\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <normal_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\tvec3 viewDir = normalize( vViewPosition );\\n\\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\\n\\tvec3 y = cross( viewDir, x );\\n\\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\\n\\t#ifdef USE_MATCAP\\n\\t\\tvec4 matcapColor = texture2D( matcap, uv );\\n\\t#else\\n\\t\\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\\n\\t#endif\\n\\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\\n\\t#include <output_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$7 = \"#define NORMAL\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n}\";\n\nconst fragment$7 = \"#define NORMAL\\nuniform float opacity;\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( TANGENTSPACE_NORMALMAP )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#include <packing>\\n#include <uv_pars_fragment>\\n#include <normal_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\tgl_FragColor = vec4( packNormalToRGB( normal ), opacity );\\n\\t#ifdef OPAQUE\\n\\t\\tgl_FragColor.a = 1.0;\\n\\t#endif\\n}\";\n\nconst vertex$6 = \"#define PHONG\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <uv2_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <envmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <uv2_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include <worldpos_vertex>\\n\\t#include <envmap_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$6 = \"#define PHONG\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\\nuniform float opacity;\\n#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <uv2_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <envmap_common_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars_begin>\\n#include <normal_pars_fragment>\\n#include <lights_phong_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <specularmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <specularmap_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\t#include <emissivemap_fragment>\\n\\t#include <lights_phong_fragment>\\n\\t#include <lights_fragment_begin>\\n\\t#include <lights_fragment_maps>\\n\\t#include <lights_fragment_end>\\n\\t#include <aomap_fragment>\\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\t#include <envmap_fragment>\\n\\t#include <output_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$5 = \"#define STANDARD\\nvarying vec3 vViewPosition;\\n#ifdef USE_TRANSMISSION\\n\\tvarying vec3 vWorldPosition;\\n#endif\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <uv2_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <uv2_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include <worldpos_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n#ifdef USE_TRANSMISSION\\n\\tvWorldPosition = worldPosition.xyz;\\n#endif\\n}\";\n\nconst fragment$5 = \"#define STANDARD\\n#ifdef PHYSICAL\\n\\t#define IOR\\n\\t#define SPECULAR\\n#endif\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifdef IOR\\n\\tuniform float ior;\\n#endif\\n#ifdef SPECULAR\\n\\tuniform float specularIntensity;\\n\\tuniform vec3 specularColor;\\n\\t#ifdef USE_SPECULARINTENSITYMAP\\n\\t\\tuniform sampler2D specularIntensityMap;\\n\\t#endif\\n\\t#ifdef USE_SPECULARCOLORMAP\\n\\t\\tuniform sampler2D specularColorMap;\\n\\t#endif\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tuniform float clearcoat;\\n\\tuniform float clearcoatRoughness;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tuniform float iridescence;\\n\\tuniform float iridescenceIOR;\\n\\tuniform float iridescenceThicknessMinimum;\\n\\tuniform float iridescenceThicknessMaximum;\\n#endif\\n#ifdef USE_SHEEN\\n\\tuniform vec3 sheenColor;\\n\\tuniform float sheenRoughness;\\n\\t#ifdef USE_SHEENCOLORMAP\\n\\t\\tuniform sampler2D sheenColorMap;\\n\\t#endif\\n\\t#ifdef USE_SHEENROUGHNESSMAP\\n\\t\\tuniform sampler2D sheenRoughnessMap;\\n\\t#endif\\n#endif\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <uv2_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <bsdfs>\\n#include <iridescence_fragment>\\n#include <cube_uv_reflection_fragment>\\n#include <envmap_common_pars_fragment>\\n#include <envmap_physical_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <lights_pars_begin>\\n#include <normal_pars_fragment>\\n#include <lights_physical_pars_fragment>\\n#include <transmission_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <clearcoat_pars_fragment>\\n#include <iridescence_pars_fragment>\\n#include <roughnessmap_pars_fragment>\\n#include <metalnessmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <roughnessmap_fragment>\\n\\t#include <metalnessmap_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\t#include <clearcoat_normal_fragment_begin>\\n\\t#include <clearcoat_normal_fragment_maps>\\n\\t#include <emissivemap_fragment>\\n\\t#include <lights_physical_fragment>\\n\\t#include <lights_fragment_begin>\\n\\t#include <lights_fragment_maps>\\n\\t#include <lights_fragment_end>\\n\\t#include <aomap_fragment>\\n\\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\\n\\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\\n\\t#include <transmission_fragment>\\n\\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\\n\\t#ifdef USE_SHEEN\\n\\t\\tfloat sheenEnergyComp = 1.0 - 0.157 * max3( material.sheenColor );\\n\\t\\toutgoingLight = outgoingLight * sheenEnergyComp + sheenSpecular;\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat dotNVcc = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );\\n\\t\\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\\n\\t\\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + clearcoatSpecular * material.clearcoat;\\n\\t#endif\\n\\t#include <output_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$4 = \"#define TOON\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <uv2_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <uv2_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include <worldpos_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$4 = \"#define TOON\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\n#include <common>\\n#include <packing>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <uv2_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <gradientmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars_begin>\\n#include <normal_pars_fragment>\\n#include <lights_toon_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\t#include <emissivemap_fragment>\\n\\t#include <lights_toon_fragment>\\n\\t#include <lights_fragment_begin>\\n\\t#include <lights_fragment_maps>\\n\\t#include <lights_fragment_end>\\n\\t#include <aomap_fragment>\\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include <output_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$3 = \"uniform float size;\\nuniform float scale;\\n#include <common>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <color_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <project_vertex>\\n\\tgl_PointSize = size;\\n\\t#ifdef USE_SIZEATTENUATION\\n\\t\\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\\n\\t\\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\\n\\t#endif\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$3 = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include <common>\\n#include <color_pars_fragment>\\n#include <map_particle_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_particle_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphatest_fragment>\\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include <output_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n}\";\n\nconst vertex$2 = \"#include <common>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\nvoid main() {\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <project_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$2 = \"uniform vec3 color;\\nuniform float opacity;\\n#include <common>\\n#include <packing>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars_begin>\\n#include <shadowmap_pars_fragment>\\n#include <shadowmask_pars_fragment>\\nvoid main() {\\n\\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n\\t#include <fog_fragment>\\n}\";\n\nconst vertex$1 = \"uniform float rotation;\\nuniform vec2 center;\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\tvec4 mvPosition = modelViewMatrix * vec4( 0.0, 0.0, 0.0, 1.0 );\\n\\tvec2 scale;\\n\\tscale.x = length( vec3( modelMatrix[ 0 ].x, modelMatrix[ 0 ].y, modelMatrix[ 0 ].z ) );\\n\\tscale.y = length( vec3( modelMatrix[ 1 ].x, modelMatrix[ 1 ].y, modelMatrix[ 1 ].z ) );\\n\\t#ifndef USE_SIZEATTENUATION\\n\\t\\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\\n\\t\\tif ( isPerspective ) scale *= - mvPosition.z;\\n\\t#endif\\n\\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\\n\\tvec2 rotatedPosition;\\n\\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\\n\\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\\n\\tmvPosition.xy += rotatedPosition;\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$1 = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include <common>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\t#include <clipping_planes_fragment>\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include <output_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <encodings_fragment>\\n\\t#include <fog_fragment>\\n}\";\n\nconst ShaderChunk = {\n\talphamap_fragment: alphamap_fragment,\n\talphamap_pars_fragment: alphamap_pars_fragment,\n\talphatest_fragment: alphatest_fragment,\n\talphatest_pars_fragment: alphatest_pars_fragment,\n\taomap_fragment: aomap_fragment,\n\taomap_pars_fragment: aomap_pars_fragment,\n\tbegin_vertex: begin_vertex,\n\tbeginnormal_vertex: beginnormal_vertex,\n\tbsdfs: bsdfs,\n\tiridescence_fragment: iridescence_fragment,\n\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\tclipping_planes_fragment: clipping_planes_fragment,\n\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\tclipping_planes_vertex: clipping_planes_vertex,\n\tcolor_fragment: color_fragment,\n\tcolor_pars_fragment: color_pars_fragment,\n\tcolor_pars_vertex: color_pars_vertex,\n\tcolor_vertex: color_vertex,\n\tcommon: common,\n\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\tdefaultnormal_vertex: defaultnormal_vertex,\n\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\tdisplacementmap_vertex: displacementmap_vertex,\n\temissivemap_fragment: emissivemap_fragment,\n\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\tencodings_fragment: encodings_fragment,\n\tencodings_pars_fragment: encodings_pars_fragment,\n\tenvmap_fragment: envmap_fragment,\n\tenvmap_common_pars_fragment: envmap_common_pars_fragment,\n\tenvmap_pars_fragment: envmap_pars_fragment,\n\tenvmap_pars_vertex: envmap_pars_vertex,\n\tenvmap_physical_pars_fragment: envmap_physical_pars_fragment,\n\tenvmap_vertex: envmap_vertex,\n\tfog_vertex: fog_vertex,\n\tfog_pars_vertex: fog_pars_vertex,\n\tfog_fragment: fog_fragment,\n\tfog_pars_fragment: fog_pars_fragment,\n\tgradientmap_pars_fragment: gradientmap_pars_fragment,\n\tlightmap_fragment: lightmap_fragment,\n\tlightmap_pars_fragment: lightmap_pars_fragment,\n\tlights_lambert_fragment: lights_lambert_fragment,\n\tlights_lambert_pars_fragment: lights_lambert_pars_fragment,\n\tlights_pars_begin: lights_pars_begin,\n\tlights_toon_fragment: lights_toon_fragment,\n\tlights_toon_pars_fragment: lights_toon_pars_fragment,\n\tlights_phong_fragment: lights_phong_fragment,\n\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\tlights_physical_fragment: lights_physical_fragment,\n\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\tlights_fragment_begin: lights_fragment_begin,\n\tlights_fragment_maps: lights_fragment_maps,\n\tlights_fragment_end: lights_fragment_end,\n\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\tmap_fragment: map_fragment,\n\tmap_pars_fragment: map_pars_fragment,\n\tmap_particle_fragment: map_particle_fragment,\n\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\tmetalnessmap_fragment: metalnessmap_fragment,\n\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\tmorphcolor_vertex: morphcolor_vertex,\n\tmorphnormal_vertex: morphnormal_vertex,\n\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\tmorphtarget_vertex: morphtarget_vertex,\n\tnormal_fragment_begin: normal_fragment_begin,\n\tnormal_fragment_maps: normal_fragment_maps,\n\tnormal_pars_fragment: normal_pars_fragment,\n\tnormal_pars_vertex: normal_pars_vertex,\n\tnormal_vertex: normal_vertex,\n\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\tclearcoat_normal_fragment_begin: clearcoat_normal_fragment_begin,\n\tclearcoat_normal_fragment_maps: clearcoat_normal_fragment_maps,\n\tclearcoat_pars_fragment: clearcoat_pars_fragment,\n\tiridescence_pars_fragment: iridescence_pars_fragment,\n\toutput_fragment: output_fragment,\n\tpacking: packing,\n\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\tproject_vertex: project_vertex,\n\tdithering_fragment: dithering_fragment,\n\tdithering_pars_fragment: dithering_pars_fragment,\n\troughnessmap_fragment: roughnessmap_fragment,\n\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\tshadowmap_vertex: shadowmap_vertex,\n\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\tskinbase_vertex: skinbase_vertex,\n\tskinning_pars_vertex: skinning_pars_vertex,\n\tskinning_vertex: skinning_vertex,\n\tskinnormal_vertex: skinnormal_vertex,\n\tspecularmap_fragment: specularmap_fragment,\n\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\ttonemapping_fragment: tonemapping_fragment,\n\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\ttransmission_fragment: transmission_fragment,\n\ttransmission_pars_fragment: transmission_pars_fragment,\n\tuv_pars_fragment: uv_pars_fragment,\n\tuv_pars_vertex: uv_pars_vertex,\n\tuv_vertex: uv_vertex,\n\tuv2_pars_fragment: uv2_pars_fragment,\n\tuv2_pars_vertex: uv2_pars_vertex,\n\tuv2_vertex: uv2_vertex,\n\tworldpos_vertex: worldpos_vertex,\n\n\tbackground_vert: vertex$h,\n\tbackground_frag: fragment$h,\n\tbackgroundCube_vert: vertex$g,\n\tbackgroundCube_frag: fragment$g,\n\tcube_vert: vertex$f,\n\tcube_frag: fragment$f,\n\tdepth_vert: vertex$e,\n\tdepth_frag: fragment$e,\n\tdistanceRGBA_vert: vertex$d,\n\tdistanceRGBA_frag: fragment$d,\n\tequirect_vert: vertex$c,\n\tequirect_frag: fragment$c,\n\tlinedashed_vert: vertex$b,\n\tlinedashed_frag: fragment$b,\n\tmeshbasic_vert: vertex$a,\n\tmeshbasic_frag: fragment$a,\n\tmeshlambert_vert: vertex$9,\n\tmeshlambert_frag: fragment$9,\n\tmeshmatcap_vert: vertex$8,\n\tmeshmatcap_frag: fragment$8,\n\tmeshnormal_vert: vertex$7,\n\tmeshnormal_frag: fragment$7,\n\tmeshphong_vert: vertex$6,\n\tmeshphong_frag: fragment$6,\n\tmeshphysical_vert: vertex$5,\n\tmeshphysical_frag: fragment$5,\n\tmeshtoon_vert: vertex$4,\n\tmeshtoon_frag: fragment$4,\n\tpoints_vert: vertex$3,\n\tpoints_frag: fragment$3,\n\tshadow_vert: vertex$2,\n\tshadow_frag: fragment$2,\n\tsprite_vert: vertex$1,\n\tsprite_frag: fragment$1\n};\n\n/**\n * Uniforms library for shared webgl shaders\n */\n\nconst UniformsLib = {\n\n\tcommon: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\n\t\tmap: { value: null },\n\t\tuvTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tuv2Transform: { value: /*@__PURE__*/ new Matrix3() },\n\n\t\talphaMap: { value: null },\n\t\talphaTest: { value: 0 }\n\n\t},\n\n\tspecularmap: {\n\n\t\tspecularMap: { value: null },\n\n\t},\n\n\tenvmap: {\n\n\t\tenvMap: { value: null },\n\t\tflipEnvMap: { value: - 1 },\n\t\treflectivity: { value: 1.0 }, // basic, lambert, phong\n\t\tior: { value: 1.5 }, // physical\n\t\trefractionRatio: { value: 0.98 }, // basic, lambert, phong\n\n\t},\n\n\taomap: {\n\n\t\taoMap: { value: null },\n\t\taoMapIntensity: { value: 1 }\n\n\t},\n\n\tlightmap: {\n\n\t\tlightMap: { value: null },\n\t\tlightMapIntensity: { value: 1 }\n\n\t},\n\n\temissivemap: {\n\n\t\temissiveMap: { value: null }\n\n\t},\n\n\tbumpmap: {\n\n\t\tbumpMap: { value: null },\n\t\tbumpScale: { value: 1 }\n\n\t},\n\n\tnormalmap: {\n\n\t\tnormalMap: { value: null },\n\t\tnormalScale: { value: /*@__PURE__*/ new Vector2( 1, 1 ) }\n\n\t},\n\n\tdisplacementmap: {\n\n\t\tdisplacementMap: { value: null },\n\t\tdisplacementScale: { value: 1 },\n\t\tdisplacementBias: { value: 0 }\n\n\t},\n\n\troughnessmap: {\n\n\t\troughnessMap: { value: null }\n\n\t},\n\n\tmetalnessmap: {\n\n\t\tmetalnessMap: { value: null }\n\n\t},\n\n\tgradientmap: {\n\n\t\tgradientMap: { value: null }\n\n\t},\n\n\tfog: {\n\n\t\tfogDensity: { value: 0.00025 },\n\t\tfogNear: { value: 1 },\n\t\tfogFar: { value: 2000 },\n\t\tfogColor: { value: /*@__PURE__*/ new Color( 0xffffff ) }\n\n\t},\n\n\tlights: {\n\n\t\tambientLightColor: { value: [] },\n\n\t\tlightProbe: { value: [] },\n\n\t\tdirectionalLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tcolor: {}\n\t\t} },\n\n\t\tdirectionalLightShadows: { value: [], properties: {\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tdirectionalShadowMap: { value: [] },\n\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\tspotLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdirection: {},\n\t\t\tdistance: {},\n\t\t\tconeCos: {},\n\t\t\tpenumbraCos: {},\n\t\t\tdecay: {}\n\t\t} },\n\n\t\tspotLightShadows: { value: [], properties: {\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tspotLightMap: { value: [] },\n\t\tspotShadowMap: { value: [] },\n\t\tspotLightMatrix: { value: [] },\n\n\t\tpointLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdecay: {},\n\t\t\tdistance: {}\n\t\t} },\n\n\t\tpointLightShadows: { value: [], properties: {\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {},\n\t\t\tshadowCameraNear: {},\n\t\t\tshadowCameraFar: {}\n\t\t} },\n\n\t\tpointShadowMap: { value: [] },\n\t\tpointShadowMatrix: { value: [] },\n\n\t\themisphereLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tskyColor: {},\n\t\t\tgroundColor: {}\n\t\t} },\n\n\t\t// TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src\n\t\trectAreaLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\twidth: {},\n\t\t\theight: {}\n\t\t} },\n\n\t\tltc_1: { value: null },\n\t\tltc_2: { value: null }\n\n\t},\n\n\tpoints: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tsize: { value: 1.0 },\n\t\tscale: { value: 1.0 },\n\t\tmap: { value: null },\n\t\talphaMap: { value: null },\n\t\talphaTest: { value: 0 },\n\t\tuvTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tsprite: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tcenter: { value: /*@__PURE__*/ new Vector2( 0.5, 0.5 ) },\n\t\trotation: { value: 0.0 },\n\t\tmap: { value: null },\n\t\talphaMap: { value: null },\n\t\talphaTest: { value: 0 },\n\t\tuvTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t}\n\n};\n\nconst ShaderLib = {\n\n\tbasic: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t},\n\n\tlambert: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t},\n\n\tphong: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\t\tspecular: { value: /*@__PURE__*/ new Color( 0x111111 ) },\n\t\t\t\tshininess: { value: 30 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t},\n\n\tstandard: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.roughnessmap,\n\t\t\tUniformsLib.metalnessmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\t\troughness: { value: 1.0 },\n\t\t\t\tmetalness: { value: 0.0 },\n\t\t\t\tenvMapIntensity: { value: 1 } // temporary\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t},\n\n\ttoon: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.gradientmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshtoon_vert,\n\t\tfragmentShader: ShaderChunk.meshtoon_frag\n\n\t},\n\n\tmatcap: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tmatcap: { value: null }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshmatcap_vert,\n\t\tfragmentShader: ShaderChunk.meshmatcap_frag\n\n\t},\n\n\tpoints: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.points,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.points_vert,\n\t\tfragmentShader: ShaderChunk.points_frag\n\n\t},\n\n\tdashed: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tscale: { value: 1 },\n\t\t\t\tdashSize: { value: 1 },\n\t\t\t\ttotalSize: { value: 2 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t},\n\n\tdepth: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.depth_vert,\n\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t},\n\n\tnormal: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshnormal_vert,\n\t\tfragmentShader: ShaderChunk.meshnormal_frag\n\n\t},\n\n\tsprite: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.sprite,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.sprite_vert,\n\t\tfragmentShader: ShaderChunk.sprite_frag\n\n\t},\n\n\tbackground: {\n\n\t\tuniforms: {\n\t\t\tuvTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tt2D: { value: null },\n\t\t\tbackgroundIntensity: { value: 1 }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.background_vert,\n\t\tfragmentShader: ShaderChunk.background_frag\n\n\t},\n\n\tbackgroundCube: {\n\n\t\tuniforms: {\n\t\t\tenvMap: { value: null },\n\t\t\tflipEnvMap: { value: - 1 },\n\t\t\tbackgroundBlurriness: { value: 0 },\n\t\t\tbackgroundIntensity: { value: 1 }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.backgroundCube_vert,\n\t\tfragmentShader: ShaderChunk.backgroundCube_frag\n\n\t},\n\n\tcube: {\n\n\t\tuniforms: {\n\t\t\ttCube: { value: null },\n\t\t\ttFlip: { value: - 1 },\n\t\t\topacity: { value: 1.0 }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.cube_vert,\n\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t},\n\n\tequirect: {\n\n\t\tuniforms: {\n\t\t\ttEquirect: { value: null },\n\t\t},\n\n\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t},\n\n\tdistanceRGBA: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\treferencePosition: { value: /*@__PURE__*/ new Vector3() },\n\t\t\t\tnearDistance: { value: 1 },\n\t\t\t\tfarDistance: { value: 1000 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.distanceRGBA_vert,\n\t\tfragmentShader: ShaderChunk.distanceRGBA_frag\n\n\t},\n\n\tshadow: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.lights,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tcolor: { value: /*@__PURE__*/ new Color( 0x00000 ) },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.shadow_vert,\n\t\tfragmentShader: ShaderChunk.shadow_frag\n\n\t}\n\n};\n\nShaderLib.physical = {\n\n\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\tShaderLib.standard.uniforms,\n\t\t{\n\t\t\tclearcoat: { value: 0 },\n\t\t\tclearcoatMap: { value: null },\n\t\t\tclearcoatRoughness: { value: 0 },\n\t\t\tclearcoatRoughnessMap: { value: null },\n\t\t\tclearcoatNormalScale: { value: /*@__PURE__*/ new Vector2( 1, 1 ) },\n\t\t\tclearcoatNormalMap: { value: null },\n\t\t\tiridescence: { value: 0 },\n\t\t\tiridescenceMap: { value: null },\n\t\t\tiridescenceIOR: { value: 1.3 },\n\t\t\tiridescenceThicknessMinimum: { value: 100 },\n\t\t\tiridescenceThicknessMaximum: { value: 400 },\n\t\t\tiridescenceThicknessMap: { value: null },\n\t\t\tsheen: { value: 0 },\n\t\t\tsheenColor: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\tsheenColorMap: { value: null },\n\t\t\tsheenRoughness: { value: 1 },\n\t\t\tsheenRoughnessMap: { value: null },\n\t\t\ttransmission: { value: 0 },\n\t\t\ttransmissionMap: { value: null },\n\t\t\ttransmissionSamplerSize: { value: /*@__PURE__*/ new Vector2() },\n\t\t\ttransmissionSamplerMap: { value: null },\n\t\t\tthickness: { value: 0 },\n\t\t\tthicknessMap: { value: null },\n\t\t\tattenuationDistance: { value: 0 },\n\t\t\tattenuationColor: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\tspecularIntensity: { value: 1 },\n\t\t\tspecularIntensityMap: { value: null },\n\t\t\tspecularColor: { value: /*@__PURE__*/ new Color( 1, 1, 1 ) },\n\t\t\tspecularColorMap: { value: null },\n\t\t}\n\t] ),\n\n\tvertexShader: ShaderChunk.meshphysical_vert,\n\tfragmentShader: ShaderChunk.meshphysical_frag\n\n};\n\nconst _rgb = { r: 0, b: 0, g: 0 };\n\nfunction WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha, premultipliedAlpha ) {\n\n\tconst clearColor = new Color( 0x000000 );\n\tlet clearAlpha = alpha === true ? 0 : 1;\n\n\tlet planeMesh;\n\tlet boxMesh;\n\n\tlet currentBackground = null;\n\tlet currentBackgroundVersion = 0;\n\tlet currentTonemapping = null;\n\n\tfunction render( renderList, scene ) {\n\n\t\tlet forceClear = false;\n\t\tlet background = scene.isScene === true ? scene.background : null;\n\n\t\tif ( background && background.isTexture ) {\n\n\t\t\tconst usePMREM = scene.backgroundBlurriness > 0; // use PMREM if the user wants to blur the background\n\t\t\tbackground = ( usePMREM ? cubeuvmaps : cubemaps ).get( background );\n\n\t\t}\n\n\t\t// Ignore background in AR\n\t\t// TODO: Reconsider this.\n\n\t\tconst xr = renderer.xr;\n\t\tconst session = xr.getSession && xr.getSession();\n\n\t\tif ( session && session.environmentBlendMode === 'additive' ) {\n\n\t\t\tbackground = null;\n\n\t\t}\n\n\t\tif ( background === null ) {\n\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t} else if ( background && background.isColor ) {\n\n\t\t\tsetClear( background, 1 );\n\t\t\tforceClear = true;\n\n\t\t}\n\n\t\tif ( renderer.autoClear || forceClear ) {\n\n\t\t\trenderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\n\t\t}\n\n\t\tif ( background && ( background.isCubeTexture || background.mapping === CubeUVReflectionMapping ) ) {\n\n\t\t\tif ( boxMesh === undefined ) {\n\n\t\t\t\tboxMesh = new Mesh(\n\t\t\t\t\tnew BoxGeometry( 1, 1, 1 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundCubeMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.backgroundCube.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.backgroundCube.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.backgroundCube.fragmentShader,\n\t\t\t\t\t\tside: BackSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'normal' );\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'uv' );\n\n\t\t\t\tboxMesh.onBeforeRender = function ( renderer, scene, camera ) {\n\n\t\t\t\t\tthis.matrixWorld.copyPosition( camera.matrixWorld );\n\n\t\t\t\t};\n\n\t\t\t\t// add \"envMap\" material property so the renderer can evaluate it like for built-in materials\n\t\t\t\tObject.defineProperty( boxMesh.material, 'envMap', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.envMap.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( boxMesh );\n\n\t\t\t}\n\n\t\t\tboxMesh.material.uniforms.envMap.value = background;\n\t\t\tboxMesh.material.uniforms.flipEnvMap.value = ( background.isCubeTexture && background.isRenderTargetTexture === false ) ? - 1 : 1;\n\t\t\tboxMesh.material.uniforms.backgroundBlurriness.value = scene.backgroundBlurriness;\n\t\t\tboxMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity;\n\t\t\tboxMesh.material.toneMapped = ( background.encoding === sRGBEncoding ) ? false : true;\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tboxMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\tboxMesh.layers.enableAll();\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( boxMesh, boxMesh.geometry, boxMesh.material, 0, 0, null );\n\n\t\t} else if ( background && background.isTexture ) {\n\n\t\t\tif ( planeMesh === undefined ) {\n\n\t\t\t\tplaneMesh = new Mesh(\n\t\t\t\t\tnew PlaneGeometry( 2, 2 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.background.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.background.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.background.fragmentShader,\n\t\t\t\t\t\tside: FrontSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tplaneMesh.geometry.deleteAttribute( 'normal' );\n\n\t\t\t\t// add \"map\" material property so the renderer can evaluate it like for built-in materials\n\t\t\t\tObject.defineProperty( planeMesh.material, 'map', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.t2D.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( planeMesh );\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.t2D.value = background;\n\t\t\tplaneMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity;\n\t\t\tplaneMesh.material.toneMapped = ( background.encoding === sRGBEncoding ) ? false : true;\n\n\t\t\tif ( background.matrixAutoUpdate === true ) {\n\n\t\t\t\tbackground.updateMatrix();\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.uvTransform.value.copy( background.matrix );\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tplaneMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\tplaneMesh.layers.enableAll();\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( planeMesh, planeMesh.geometry, planeMesh.material, 0, 0, null );\n\n\t\t}\n\n\t}\n\n\tfunction setClear( color, alpha ) {\n\n\t\tcolor.getRGB( _rgb, getUnlitUniformColorSpace( renderer ) );\n\n\t\tstate.buffers.color.setClear( _rgb.r, _rgb.g, _rgb.b, alpha, premultipliedAlpha );\n\n\t}\n\n\treturn {\n\n\t\tgetClearColor: function () {\n\n\t\t\treturn clearColor;\n\n\t\t},\n\t\tsetClearColor: function ( color, alpha = 1 ) {\n\n\t\t\tclearColor.set( color );\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\tgetClearAlpha: function () {\n\n\t\t\treturn clearAlpha;\n\n\t\t},\n\t\tsetClearAlpha: function ( alpha ) {\n\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\trender: render\n\n\t};\n\n}\n\nfunction WebGLBindingStates( gl, extensions, attributes, capabilities ) {\n\n\tconst maxVertexAttributes = gl.getParameter( 34921 );\n\n\tconst extension = capabilities.isWebGL2 ? null : extensions.get( 'OES_vertex_array_object' );\n\tconst vaoAvailable = capabilities.isWebGL2 || extension !== null;\n\n\tconst bindingStates = {};\n\n\tconst defaultState = createBindingState( null );\n\tlet currentState = defaultState;\n\tlet forceUpdate = false;\n\n\tfunction setup( object, material, program, geometry, index ) {\n\n\t\tlet updateBuffers = false;\n\n\t\tif ( vaoAvailable ) {\n\n\t\t\tconst state = getBindingState( geometry, program, material );\n\n\t\t\tif ( currentState !== state ) {\n\n\t\t\t\tcurrentState = state;\n\t\t\t\tbindVertexArrayObject( currentState.object );\n\n\t\t\t}\n\n\t\t\tupdateBuffers = needsUpdate( object, geometry, program, index );\n\n\t\t\tif ( updateBuffers ) saveCache( object, geometry, program, index );\n\n\t\t} else {\n\n\t\t\tconst wireframe = ( material.wireframe === true );\n\n\t\t\tif ( currentState.geometry !== geometry.id ||\n\t\t\t\tcurrentState.program !== program.id ||\n\t\t\t\tcurrentState.wireframe !== wireframe ) {\n\n\t\t\t\tcurrentState.geometry = geometry.id;\n\t\t\t\tcurrentState.program = program.id;\n\t\t\t\tcurrentState.wireframe = wireframe;\n\n\t\t\t\tupdateBuffers = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( index !== null ) {\n\n\t\t\tattributes.update( index, 34963 );\n\n\t\t}\n\n\t\tif ( updateBuffers || forceUpdate ) {\n\n\t\t\tforceUpdate = false;\n\n\t\t\tsetupVertexAttributes( object, material, program, geometry );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tgl.bindBuffer( 34963, attributes.get( index ).buffer );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction createVertexArrayObject() {\n\n\t\tif ( capabilities.isWebGL2 ) return gl.createVertexArray();\n\n\t\treturn extension.createVertexArrayOES();\n\n\t}\n\n\tfunction bindVertexArrayObject( vao ) {\n\n\t\tif ( capabilities.isWebGL2 ) return gl.bindVertexArray( vao );\n\n\t\treturn extension.bindVertexArrayOES( vao );\n\n\t}\n\n\tfunction deleteVertexArrayObject( vao ) {\n\n\t\tif ( capabilities.isWebGL2 ) return gl.deleteVertexArray( vao );\n\n\t\treturn extension.deleteVertexArrayOES( vao );\n\n\t}\n\n\tfunction getBindingState( geometry, program, material ) {\n\n\t\tconst wireframe = ( material.wireframe === true );\n\n\t\tlet programMap = bindingStates[ geometry.id ];\n\n\t\tif ( programMap === undefined ) {\n\n\t\t\tprogramMap = {};\n\t\t\tbindingStates[ geometry.id ] = programMap;\n\n\t\t}\n\n\t\tlet stateMap = programMap[ program.id ];\n\n\t\tif ( stateMap === undefined ) {\n\n\t\t\tstateMap = {};\n\t\t\tprogramMap[ program.id ] = stateMap;\n\n\t\t}\n\n\t\tlet state = stateMap[ wireframe ];\n\n\t\tif ( state === undefined ) {\n\n\t\t\tstate = createBindingState( createVertexArrayObject() );\n\t\t\tstateMap[ wireframe ] = state;\n\n\t\t}\n\n\t\treturn state;\n\n\t}\n\n\tfunction createBindingState( vao ) {\n\n\t\tconst newAttributes = [];\n\t\tconst enabledAttributes = [];\n\t\tconst attributeDivisors = [];\n\n\t\tfor ( let i = 0; i < maxVertexAttributes; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\t\t\tenabledAttributes[ i ] = 0;\n\t\t\tattributeDivisors[ i ] = 0;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\t// for backward compatibility on non-VAO support browser\n\t\t\tgeometry: null,\n\t\t\tprogram: null,\n\t\t\twireframe: false,\n\n\t\t\tnewAttributes: newAttributes,\n\t\t\tenabledAttributes: enabledAttributes,\n\t\t\tattributeDivisors: attributeDivisors,\n\t\t\tobject: vao,\n\t\t\tattributes: {},\n\t\t\tindex: null\n\n\t\t};\n\n\t}\n\n\tfunction needsUpdate( object, geometry, program, index ) {\n\n\t\tconst cachedAttributes = currentState.attributes;\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tlet attributesNum = 0;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tconst cachedAttribute = cachedAttributes[ name ];\n\t\t\t\tlet geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tif ( cachedAttribute === undefined ) return true;\n\n\t\t\t\tif ( cachedAttribute.attribute !== geometryAttribute ) return true;\n\n\t\t\t\tif ( geometryAttribute && cachedAttribute.data !== geometryAttribute.data ) return true;\n\n\t\t\t\tattributesNum ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( currentState.attributesNum !== attributesNum ) return true;\n\n\t\tif ( currentState.index !== index ) return true;\n\n\t\treturn false;\n\n\t}\n\n\tfunction saveCache( object, geometry, program, index ) {\n\n\t\tconst cache = {};\n\t\tconst attributes = geometry.attributes;\n\t\tlet attributesNum = 0;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tlet attribute = attributes[ name ];\n\n\t\t\t\tif ( attribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) attribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) attribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tconst data = {};\n\t\t\t\tdata.attribute = attribute;\n\n\t\t\t\tif ( attribute && attribute.data ) {\n\n\t\t\t\t\tdata.data = attribute.data;\n\n\t\t\t\t}\n\n\t\t\t\tcache[ name ] = data;\n\n\t\t\t\tattributesNum ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tcurrentState.attributes = cache;\n\t\tcurrentState.attributesNum = attributesNum;\n\n\t\tcurrentState.index = index;\n\n\t}\n\n\tfunction initAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\n\t\tfor ( let i = 0, il = newAttributes.length; i < il; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\tfunction enableAttribute( attribute ) {\n\n\t\tenableAttributeAndDivisor( attribute, 0 );\n\n\t}\n\n\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute ) {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\t\tconst attributeDivisors = currentState.attributeDivisors;\n\n\t\tnewAttributes[ attribute ] = 1;\n\n\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t}\n\n\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\tconst extension = capabilities.isWebGL2 ? gl : extensions.get( 'ANGLE_instanced_arrays' );\n\n\t\t\textension[ capabilities.isWebGL2 ? 'vertexAttribDivisor' : 'vertexAttribDivisorANGLE' ]( attribute, meshPerAttribute );\n\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t}\n\n\t}\n\n\tfunction disableUnusedAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\n\t\tfor ( let i = 0, il = enabledAttributes.length; i < il; i ++ ) {\n\n\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction vertexAttribPointer( index, size, type, normalized, stride, offset ) {\n\n\t\tif ( capabilities.isWebGL2 === true && ( type === 5124 || type === 5125 ) ) {\n\n\t\t\tgl.vertexAttribIPointer( index, size, type, stride, offset );\n\n\t\t} else {\n\n\t\t\tgl.vertexAttribPointer( index, size, type, normalized, stride, offset );\n\n\t\t}\n\n\t}\n\n\tfunction setupVertexAttributes( object, material, program, geometry ) {\n\n\t\tif ( capabilities.isWebGL2 === false && ( object.isInstancedMesh || geometry.isInstancedBufferGeometry ) ) {\n\n\t\t\tif ( extensions.get( 'ANGLE_instanced_arrays' ) === null ) return;\n\n\t\t}\n\n\t\tinitAttributes();\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tconst materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tlet geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\tconst normalized = geometryAttribute.normalized;\n\t\t\t\t\tconst size = geometryAttribute.itemSize;\n\n\t\t\t\t\tconst attribute = attributes.get( geometryAttribute );\n\n\t\t\t\t\t// TODO Attribute may not be available on context restore\n\n\t\t\t\t\tif ( attribute === undefined ) continue;\n\n\t\t\t\t\tconst buffer = attribute.buffer;\n\t\t\t\t\tconst type = attribute.type;\n\t\t\t\t\tconst bytesPerElement = attribute.bytesPerElement;\n\n\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst data = geometryAttribute.data;\n\t\t\t\t\t\tconst stride = data.stride;\n\t\t\t\t\t\tconst offset = geometryAttribute.offset;\n\n\t\t\t\t\t\tif ( data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, data.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = data.meshPerAttribute * data.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( 34962, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tstride * bytesPerElement,\n\t\t\t\t\t\t\t\t( offset + ( size / programAttribute.locationSize ) * i ) * bytesPerElement\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, geometryAttribute.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( 34962, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tsize * bytesPerElement,\n\t\t\t\t\t\t\t\t( size / programAttribute.locationSize ) * i * bytesPerElement\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\tconst value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\tgl.vertexAttrib2fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\tgl.vertexAttrib3fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\tgl.vertexAttrib4fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tgl.vertexAttrib1fv( programAttribute.location, value );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tdisableUnusedAttributes();\n\n\t}\n\n\tfunction dispose() {\n\n\t\treset();\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tfor ( const programId in programMap ) {\n\n\t\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t\t}\n\n\t\t\t\tdelete programMap[ programId ];\n\n\t\t\t}\n\n\t\t\tdelete bindingStates[ geometryId ];\n\n\t\t}\n\n\t}\n\n\tfunction releaseStatesOfGeometry( geometry ) {\n\n\t\tif ( bindingStates[ geometry.id ] === undefined ) return;\n\n\t\tconst programMap = bindingStates[ geometry.id ];\n\n\t\tfor ( const programId in programMap ) {\n\n\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ programId ];\n\n\t\t}\n\n\t\tdelete bindingStates[ geometry.id ];\n\n\t}\n\n\tfunction releaseStatesOfProgram( program ) {\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tif ( programMap[ program.id ] === undefined ) continue;\n\n\t\t\tconst stateMap = programMap[ program.id ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ program.id ];\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\tresetDefaultState();\n\t\tforceUpdate = true;\n\n\t\tif ( currentState === defaultState ) return;\n\n\t\tcurrentState = defaultState;\n\t\tbindVertexArrayObject( currentState.object );\n\n\t}\n\n\t// for backward-compatibility\n\n\tfunction resetDefaultState() {\n\n\t\tdefaultState.geometry = null;\n\t\tdefaultState.program = null;\n\t\tdefaultState.wireframe = false;\n\n\t}\n\n\treturn {\n\n\t\tsetup: setup,\n\t\treset: reset,\n\t\tresetDefaultState: resetDefaultState,\n\t\tdispose: dispose,\n\t\treleaseStatesOfGeometry: releaseStatesOfGeometry,\n\t\treleaseStatesOfProgram: releaseStatesOfProgram,\n\n\t\tinitAttributes: initAttributes,\n\t\tenableAttribute: enableAttribute,\n\t\tdisableUnusedAttributes: disableUnusedAttributes\n\n\t};\n\n}\n\nfunction WebGLBufferRenderer( gl, extensions, info, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawArrays( mode, start, count );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tlet extension, methodName;\n\n\t\tif ( isWebGL2 ) {\n\n\t\t\textension = gl;\n\t\t\tmethodName = 'drawArraysInstanced';\n\n\t\t} else {\n\n\t\t\textension = extensions.get( 'ANGLE_instanced_arrays' );\n\t\t\tmethodName = 'drawArraysInstancedANGLE';\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\textension[ methodName ]( mode, start, count, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\n}\n\nfunction WebGLCapabilities( gl, extensions, parameters ) {\n\n\tlet maxAnisotropy;\n\n\tfunction getMaxAnisotropy() {\n\n\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t} else {\n\n\t\t\tmaxAnisotropy = 0;\n\n\t\t}\n\n\t\treturn maxAnisotropy;\n\n\t}\n\n\tfunction getMaxPrecision( precision ) {\n\n\t\tif ( precision === 'highp' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( 35633, 36338 ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( 35632, 36338 ).precision > 0 ) {\n\n\t\t\t\treturn 'highp';\n\n\t\t\t}\n\n\t\t\tprecision = 'mediump';\n\n\t\t}\n\n\t\tif ( precision === 'mediump' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( 35633, 36337 ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( 35632, 36337 ).precision > 0 ) {\n\n\t\t\t\treturn 'mediump';\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn 'lowp';\n\n\t}\n\n\tconst isWebGL2 = typeof WebGL2RenderingContext !== 'undefined' && gl instanceof WebGL2RenderingContext;\n\n\tlet precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\tconst maxPrecision = getMaxPrecision( precision );\n\n\tif ( maxPrecision !== precision ) {\n\n\t\tconsole.warn( 'THREE.WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\tprecision = maxPrecision;\n\n\t}\n\n\tconst drawBuffers = isWebGL2 || extensions.has( 'WEBGL_draw_buffers' );\n\n\tconst logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;\n\n\tconst maxTextures = gl.getParameter( 34930 );\n\tconst maxVertexTextures = gl.getParameter( 35660 );\n\tconst maxTextureSize = gl.getParameter( 3379 );\n\tconst maxCubemapSize = gl.getParameter( 34076 );\n\n\tconst maxAttributes = gl.getParameter( 34921 );\n\tconst maxVertexUniforms = gl.getParameter( 36347 );\n\tconst maxVaryings = gl.getParameter( 36348 );\n\tconst maxFragmentUniforms = gl.getParameter( 36349 );\n\n\tconst vertexTextures = maxVertexTextures > 0;\n\tconst floatFragmentTextures = isWebGL2 || extensions.has( 'OES_texture_float' );\n\tconst floatVertexTextures = vertexTextures && floatFragmentTextures;\n\n\tconst maxSamples = isWebGL2 ? gl.getParameter( 36183 ) : 0;\n\n\treturn {\n\n\t\tisWebGL2: isWebGL2,\n\n\t\tdrawBuffers: drawBuffers,\n\n\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\tprecision: precision,\n\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\tmaxTextures: maxTextures,\n\t\tmaxVertexTextures: maxVertexTextures,\n\t\tmaxTextureSize: maxTextureSize,\n\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\tmaxAttributes: maxAttributes,\n\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\tmaxVaryings: maxVaryings,\n\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\tvertexTextures: vertexTextures,\n\t\tfloatFragmentTextures: floatFragmentTextures,\n\t\tfloatVertexTextures: floatVertexTextures,\n\n\t\tmaxSamples: maxSamples\n\n\t};\n\n}\n\nfunction WebGLClipping( properties ) {\n\n\tconst scope = this;\n\n\tlet globalState = null,\n\t\tnumGlobalPlanes = 0,\n\t\tlocalClippingEnabled = false,\n\t\trenderingShadows = false;\n\n\tconst plane = new Plane(),\n\t\tviewNormalMatrix = new Matrix3(),\n\n\t\tuniform = { value: null, needsUpdate: false };\n\n\tthis.uniform = uniform;\n\tthis.numPlanes = 0;\n\tthis.numIntersection = 0;\n\n\tthis.init = function ( planes, enableLocalClipping ) {\n\n\t\tconst enabled =\n\t\t\tplanes.length !== 0 ||\n\t\t\tenableLocalClipping ||\n\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t// run another frame in order to reset the state:\n\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\tlocalClippingEnabled;\n\n\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\tnumGlobalPlanes = planes.length;\n\n\t\treturn enabled;\n\n\t};\n\n\tthis.beginShadows = function () {\n\n\t\trenderingShadows = true;\n\t\tprojectPlanes( null );\n\n\t};\n\n\tthis.endShadows = function () {\n\n\t\trenderingShadows = false;\n\n\t};\n\n\tthis.setGlobalState = function ( planes, camera ) {\n\n\t\tglobalState = projectPlanes( planes, camera, 0 );\n\n\t};\n\n\tthis.setState = function ( material, camera, useCache ) {\n\n\t\tconst planes = material.clippingPlanes,\n\t\t\tclipIntersection = material.clipIntersection,\n\t\t\tclipShadows = material.clipShadows;\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tif ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) {\n\n\t\t\t// there's no local clipping\n\n\t\t\tif ( renderingShadows ) {\n\n\t\t\t\t// there's no global clipping\n\n\t\t\t\tprojectPlanes( null );\n\n\t\t\t} else {\n\n\t\t\t\tresetGlobalState();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\tlGlobal = nGlobal * 4;\n\n\t\t\tlet dstArray = materialProperties.clippingState || null;\n\n\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, useCache );\n\n\t\t\tfor ( let i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t}\n\n\t\t\tmaterialProperties.clippingState = dstArray;\n\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\tthis.numPlanes += nGlobal;\n\n\t\t}\n\n\n\t};\n\n\tfunction resetGlobalState() {\n\n\t\tif ( uniform.value !== globalState ) {\n\n\t\t\tuniform.value = globalState;\n\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t}\n\n\t\tscope.numPlanes = numGlobalPlanes;\n\t\tscope.numIntersection = 0;\n\n\t}\n\n\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\tconst nPlanes = planes !== null ? planes.length : 0;\n\t\tlet dstArray = null;\n\n\t\tif ( nPlanes !== 0 ) {\n\n\t\t\tdstArray = uniform.value;\n\n\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\tconst flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\tplane.copy( planes[ i ] ).applyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tuniform.value = dstArray;\n\t\t\tuniform.needsUpdate = true;\n\n\t\t}\n\n\t\tscope.numPlanes = nPlanes;\n\t\tscope.numIntersection = 0;\n\n\t\treturn dstArray;\n\n\t}\n\n}\n\nfunction WebGLCubeMaps( renderer ) {\n\n\tlet cubemaps = new WeakMap();\n\n\tfunction mapTextureMapping( texture, mapping ) {\n\n\t\tif ( mapping === EquirectangularReflectionMapping ) {\n\n\t\t\ttexture.mapping = CubeReflectionMapping;\n\n\t\t} else if ( mapping === EquirectangularRefractionMapping ) {\n\n\t\t\ttexture.mapping = CubeRefractionMapping;\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture && texture.isRenderTargetTexture === false ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tif ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) {\n\n\t\t\t\tif ( cubemaps.has( texture ) ) {\n\n\t\t\t\t\tconst cubemap = cubemaps.get( texture ).texture;\n\t\t\t\t\treturn mapTextureMapping( cubemap, texture.mapping );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\tif ( image && image.height > 0 ) {\n\n\t\t\t\t\t\tconst renderTarget = new WebGLCubeRenderTarget( image.height / 2 );\n\t\t\t\t\t\trenderTarget.fromEquirectangularTexture( renderer, texture );\n\t\t\t\t\t\tcubemaps.set( texture, renderTarget );\n\n\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\treturn mapTextureMapping( renderTarget.texture, texture.mapping );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemap = cubemaps.get( texture );\n\n\t\tif ( cubemap !== undefined ) {\n\n\t\t\tcubemaps.delete( texture );\n\t\t\tcubemap.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubemaps = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nclass OrthographicCamera extends Camera {\n\n\tconstructor( left = - 1, right = 1, top = 1, bottom = - 1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\tthis.isOrthographicCamera = true;\n\n\t\tthis.type = 'OrthographicCamera';\n\n\t\tthis.zoom = 1;\n\t\tthis.view = null;\n\n\t\tthis.left = left;\n\t\tthis.right = right;\n\t\tthis.top = top;\n\t\tthis.bottom = bottom;\n\n\t\tthis.near = near;\n\t\tthis.far = far;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.left = source.left;\n\t\tthis.right = source.right;\n\t\tthis.top = source.top;\n\t\tthis.bottom = source.bottom;\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\n\t\tthis.zoom = source.zoom;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\treturn this;\n\n\t}\n\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tupdateProjectionMatrix() {\n\n\t\tconst dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\tconst dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\tconst cx = ( this.right + this.left ) / 2;\n\t\tconst cy = ( this.top + this.bottom ) / 2;\n\n\t\tlet left = cx - dx;\n\t\tlet right = cx + dx;\n\t\tlet top = cy + dy;\n\t\tlet bottom = cy - dy;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst scaleW = ( this.right - this.left ) / this.view.fullWidth / this.zoom;\n\t\t\tconst scaleH = ( this.top - this.bottom ) / this.view.fullHeight / this.zoom;\n\n\t\t\tleft += scaleW * this.view.offsetX;\n\t\t\tright = left + scaleW * this.view.width;\n\t\t\ttop -= scaleH * this.view.offsetY;\n\t\t\tbottom = top - scaleH * this.view.height;\n\n\t\t}\n\n\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.zoom = this.zoom;\n\t\tdata.object.left = this.left;\n\t\tdata.object.right = this.right;\n\t\tdata.object.top = this.top;\n\t\tdata.object.bottom = this.bottom;\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst LOD_MIN = 4;\n\n// The standard deviations (radians) associated with the extra mips. These are\n// chosen to approximate a Trowbridge-Reitz distribution function times the\n// geometric shadowing function. These sigma values squared must match the\n// variance #defines in cube_uv_reflection_fragment.glsl.js.\nconst EXTRA_LOD_SIGMA = [ 0.125, 0.215, 0.35, 0.446, 0.526, 0.582 ];\n\n// The maximum length of the blur for loop. Smaller sigmas will use fewer\n// samples and exit early, but not recompile the shader.\nconst MAX_SAMPLES = 20;\n\nconst _flatCamera = /*@__PURE__*/ new OrthographicCamera();\nconst _clearColor = /*@__PURE__*/ new Color();\nlet _oldTarget = null;\n\n// Golden Ratio\nconst PHI = ( 1 + Math.sqrt( 5 ) ) / 2;\nconst INV_PHI = 1 / PHI;\n\n// Vertices of a dodecahedron (except the opposites, which represent the\n// same axis), used as axis directions evenly spread on a sphere.\nconst _axisDirections = [\n\t/*@__PURE__*/ new Vector3( 1, 1, 1 ),\n\t/*@__PURE__*/ new Vector3( - 1, 1, 1 ),\n\t/*@__PURE__*/ new Vector3( 1, 1, - 1 ),\n\t/*@__PURE__*/ new Vector3( - 1, 1, - 1 ),\n\t/*@__PURE__*/ new Vector3( 0, PHI, INV_PHI ),\n\t/*@__PURE__*/ new Vector3( 0, PHI, - INV_PHI ),\n\t/*@__PURE__*/ new Vector3( INV_PHI, 0, PHI ),\n\t/*@__PURE__*/ new Vector3( - INV_PHI, 0, PHI ),\n\t/*@__PURE__*/ new Vector3( PHI, INV_PHI, 0 ),\n\t/*@__PURE__*/ new Vector3( - PHI, INV_PHI, 0 ) ];\n\n/**\n * This class generates a Prefiltered, Mipmapped Radiance Environment Map\n * (PMREM) from a cubeMap environment texture. This allows different levels of\n * blur to be quickly accessed based on material roughness. It is packed into a\n * special CubeUV format that allows us to perform custom interpolation so that\n * we can support nonlinear formats such as RGBE. Unlike a traditional mipmap\n * chain, it only goes down to the LOD_MIN level (above), and then creates extra\n * even more filtered 'mips' at the same LOD_MIN resolution, associated with\n * higher roughness levels. In this way we maintain resolution to smoothly\n * interpolate diffuse lighting while limiting sampling computation.\n *\n * Paper: Fast, Accurate Image-Based Lighting\n * https://drive.google.com/file/d/15y8r_UpKlU9SvV4ILb0C3qCPecS8pvLz/view\n*/\n\nclass PMREMGenerator {\n\n\tconstructor( renderer ) {\n\n\t\tthis._renderer = renderer;\n\t\tthis._pingPongRenderTarget = null;\n\n\t\tthis._lodMax = 0;\n\t\tthis._cubeSize = 0;\n\t\tthis._lodPlanes = [];\n\t\tthis._sizeLods = [];\n\t\tthis._sigmas = [];\n\n\t\tthis._blurMaterial = null;\n\t\tthis._cubemapMaterial = null;\n\t\tthis._equirectMaterial = null;\n\n\t\tthis._compileMaterial( this._blurMaterial );\n\n\t}\n\n\t/**\n\t * Generates a PMREM from a supplied Scene, which can be faster than using an\n\t * image if networking bandwidth is low. Optional sigma specifies a blur radius\n\t * in radians to be applied to the scene before PMREM generation. Optional near\n\t * and far planes ensure the scene is rendered in its entirety (the cubeCamera\n\t * is placed at the origin).\n\t */\n\tfromScene( scene, sigma = 0, near = 0.1, far = 100 ) {\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\n\t\tthis._setSize( 256 );\n\n\t\tconst cubeUVRenderTarget = this._allocateTargets();\n\t\tcubeUVRenderTarget.depthBuffer = true;\n\n\t\tthis._sceneToCubeUV( scene, near, far, cubeUVRenderTarget );\n\n\t\tif ( sigma > 0 ) {\n\n\t\t\tthis._blur( cubeUVRenderTarget, 0, 0, sigma );\n\n\t\t}\n\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an equirectangular texture, which can be either LDR\n\t * or HDR. The ideal input image size is 1k (1024 x 512),\n\t * as this matches best with the 256 x 256 cubemap output.\n\t */\n\tfromEquirectangular( equirectangular, renderTarget = null ) {\n\n\t\treturn this._fromTexture( equirectangular, renderTarget );\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an cubemap texture, which can be either LDR\n\t * or HDR. The ideal input cube size is 256 x 256,\n\t * as this matches best with the 256 x 256 cubemap output.\n\t */\n\tfromCubemap( cubemap, renderTarget = null ) {\n\n\t\treturn this._fromTexture( cubemap, renderTarget );\n\n\t}\n\n\t/**\n\t * Pre-compiles the cubemap shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileCubemapShader() {\n\n\t\tif ( this._cubemapMaterial === null ) {\n\n\t\t\tthis._cubemapMaterial = _getCubemapMaterial();\n\t\t\tthis._compileMaterial( this._cubemapMaterial );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileEquirectangularShader() {\n\n\t\tif ( this._equirectMaterial === null ) {\n\n\t\t\tthis._equirectMaterial = _getEquirectMaterial();\n\t\t\tthis._compileMaterial( this._equirectMaterial );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Disposes of the PMREMGenerator's internal memory. Note that PMREMGenerator is a static class,\n\t * so you should not need more than one PMREMGenerator object. If you do, calling dispose() on\n\t * one of them will cause any others to also become unusable.\n\t */\n\tdispose() {\n\n\t\tthis._dispose();\n\n\t\tif ( this._cubemapMaterial !== null ) this._cubemapMaterial.dispose();\n\t\tif ( this._equirectMaterial !== null ) this._equirectMaterial.dispose();\n\n\t}\n\n\t// private interface\n\n\t_setSize( cubeSize ) {\n\n\t\tthis._lodMax = Math.floor( Math.log2( cubeSize ) );\n\t\tthis._cubeSize = Math.pow( 2, this._lodMax );\n\n\t}\n\n\t_dispose() {\n\n\t\tif ( this._blurMaterial !== null ) this._blurMaterial.dispose();\n\n\t\tif ( this._pingPongRenderTarget !== null ) this._pingPongRenderTarget.dispose();\n\n\t\tfor ( let i = 0; i < this._lodPlanes.length; i ++ ) {\n\n\t\t\tthis._lodPlanes[ i ].dispose();\n\n\t\t}\n\n\t}\n\n\t_cleanup( outputTarget ) {\n\n\t\tthis._renderer.setRenderTarget( _oldTarget );\n\t\toutputTarget.scissorTest = false;\n\t\t_setViewport( outputTarget, 0, 0, outputTarget.width, outputTarget.height );\n\n\t}\n\n\t_fromTexture( texture, renderTarget ) {\n\n\t\tif ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping ) {\n\n\t\t\tthis._setSize( texture.image.length === 0 ? 16 : ( texture.image[ 0 ].width || texture.image[ 0 ].image.width ) );\n\n\t\t} else { // Equirectangular\n\n\t\t\tthis._setSize( texture.image.width / 4 );\n\n\t\t}\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\n\t\tconst cubeUVRenderTarget = renderTarget || this._allocateTargets();\n\t\tthis._textureToCubeUV( texture, cubeUVRenderTarget );\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_allocateTargets() {\n\n\t\tconst width = 3 * Math.max( this._cubeSize, 16 * 7 );\n\t\tconst height = 4 * this._cubeSize;\n\n\t\tconst params = {\n\t\t\tmagFilter: LinearFilter,\n\t\t\tminFilter: LinearFilter,\n\t\t\tgenerateMipmaps: false,\n\t\t\ttype: HalfFloatType,\n\t\t\tformat: RGBAFormat,\n\t\t\tencoding: LinearEncoding,\n\t\t\tdepthBuffer: false\n\t\t};\n\n\t\tconst cubeUVRenderTarget = _createRenderTarget( width, height, params );\n\n\t\tif ( this._pingPongRenderTarget === null || this._pingPongRenderTarget.width !== width || this._pingPongRenderTarget.height !== height ) {\n\n\t\t\tif ( this._pingPongRenderTarget !== null ) {\n\n\t\t\t\tthis._dispose();\n\n\t\t\t}\n\n\t\t\tthis._pingPongRenderTarget = _createRenderTarget( width, height, params );\n\n\t\t\tconst { _lodMax } = this;\n\t\t\t( { sizeLods: this._sizeLods, lodPlanes: this._lodPlanes, sigmas: this._sigmas } = _createPlanes( _lodMax ) );\n\n\t\t\tthis._blurMaterial = _getBlurShader( _lodMax, width, height );\n\n\t\t}\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_compileMaterial( material ) {\n\n\t\tconst tmpMesh = new Mesh( this._lodPlanes[ 0 ], material );\n\t\tthis._renderer.compile( tmpMesh, _flatCamera );\n\n\t}\n\n\t_sceneToCubeUV( scene, near, far, cubeUVRenderTarget ) {\n\n\t\tconst fov = 90;\n\t\tconst aspect = 1;\n\t\tconst cubeCamera = new PerspectiveCamera( fov, aspect, near, far );\n\t\tconst upSign = [ 1, - 1, 1, 1, 1, 1 ];\n\t\tconst forwardSign = [ 1, 1, 1, - 1, - 1, - 1 ];\n\t\tconst renderer = this._renderer;\n\n\t\tconst originalAutoClear = renderer.autoClear;\n\t\tconst toneMapping = renderer.toneMapping;\n\t\trenderer.getClearColor( _clearColor );\n\n\t\trenderer.toneMapping = NoToneMapping;\n\t\trenderer.autoClear = false;\n\n\t\tconst backgroundMaterial = new MeshBasicMaterial( {\n\t\t\tname: 'PMREM.Background',\n\t\t\tside: BackSide,\n\t\t\tdepthWrite: false,\n\t\t\tdepthTest: false,\n\t\t} );\n\n\t\tconst backgroundBox = new Mesh( new BoxGeometry(), backgroundMaterial );\n\n\t\tlet useSolidColor = false;\n\t\tconst background = scene.background;\n\n\t\tif ( background ) {\n\n\t\t\tif ( background.isColor ) {\n\n\t\t\t\tbackgroundMaterial.color.copy( background );\n\t\t\t\tscene.background = null;\n\t\t\t\tuseSolidColor = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tbackgroundMaterial.color.copy( _clearColor );\n\t\t\tuseSolidColor = true;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst col = i % 3;\n\n\t\t\tif ( col === 0 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.lookAt( forwardSign[ i ], 0, 0 );\n\n\t\t\t} else if ( col === 1 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, 0, upSign[ i ] );\n\t\t\t\tcubeCamera.lookAt( 0, forwardSign[ i ], 0 );\n\n\t\t\t} else {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.lookAt( 0, 0, forwardSign[ i ] );\n\n\t\t\t}\n\n\t\t\tconst size = this._cubeSize;\n\n\t\t\t_setViewport( cubeUVRenderTarget, col * size, i > 2 ? size : 0, size, size );\n\n\t\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\n\t\t\tif ( useSolidColor ) {\n\n\t\t\t\trenderer.render( backgroundBox, cubeCamera );\n\n\t\t\t}\n\n\t\t\trenderer.render( scene, cubeCamera );\n\n\t\t}\n\n\t\tbackgroundBox.geometry.dispose();\n\t\tbackgroundBox.material.dispose();\n\n\t\trenderer.toneMapping = toneMapping;\n\t\trenderer.autoClear = originalAutoClear;\n\t\tscene.background = background;\n\n\t}\n\n\t_textureToCubeUV( texture, cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\n\t\tconst isCubeTexture = ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping );\n\n\t\tif ( isCubeTexture ) {\n\n\t\t\tif ( this._cubemapMaterial === null ) {\n\n\t\t\t\tthis._cubemapMaterial = _getCubemapMaterial();\n\n\t\t\t}\n\n\t\t\tthis._cubemapMaterial.uniforms.flipEnvMap.value = ( texture.isRenderTargetTexture === false ) ? - 1 : 1;\n\n\t\t} else {\n\n\t\t\tif ( this._equirectMaterial === null ) {\n\n\t\t\t\tthis._equirectMaterial = _getEquirectMaterial();\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst material = isCubeTexture ? this._cubemapMaterial : this._equirectMaterial;\n\t\tconst mesh = new Mesh( this._lodPlanes[ 0 ], material );\n\n\t\tconst uniforms = material.uniforms;\n\n\t\tuniforms[ 'envMap' ].value = texture;\n\n\t\tconst size = this._cubeSize;\n\n\t\t_setViewport( cubeUVRenderTarget, 0, 0, 3 * size, 2 * size );\n\n\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\trenderer.render( mesh, _flatCamera );\n\n\t}\n\n\t_applyPMREM( cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst autoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\tfor ( let i = 1; i < this._lodPlanes.length; i ++ ) {\n\n\t\t\tconst sigma = Math.sqrt( this._sigmas[ i ] * this._sigmas[ i ] - this._sigmas[ i - 1 ] * this._sigmas[ i - 1 ] );\n\n\t\t\tconst poleAxis = _axisDirections[ ( i - 1 ) % _axisDirections.length ];\n\n\t\t\tthis._blur( cubeUVRenderTarget, i - 1, i, sigma, poleAxis );\n\n\t\t}\n\n\t\trenderer.autoClear = autoClear;\n\n\t}\n\n\t/**\n\t * This is a two-pass Gaussian blur for a cubemap. Normally this is done\n\t * vertically and horizontally, but this breaks down on a cube. Here we apply\n\t * the blur latitudinally (around the poles), and then longitudinally (towards\n\t * the poles) to approximate the orthogonally-separable blur. It is least\n\t * accurate at the poles, but still does a decent job.\n\t */\n\t_blur( cubeUVRenderTarget, lodIn, lodOut, sigma, poleAxis ) {\n\n\t\tconst pingPongRenderTarget = this._pingPongRenderTarget;\n\n\t\tthis._halfBlur(\n\t\t\tcubeUVRenderTarget,\n\t\t\tpingPongRenderTarget,\n\t\t\tlodIn,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'latitudinal',\n\t\t\tpoleAxis );\n\n\t\tthis._halfBlur(\n\t\t\tpingPongRenderTarget,\n\t\t\tcubeUVRenderTarget,\n\t\t\tlodOut,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'longitudinal',\n\t\t\tpoleAxis );\n\n\t}\n\n\t_halfBlur( targetIn, targetOut, lodIn, lodOut, sigmaRadians, direction, poleAxis ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst blurMaterial = this._blurMaterial;\n\n\t\tif ( direction !== 'latitudinal' && direction !== 'longitudinal' ) {\n\n\t\t\tconsole.error(\n\t\t\t\t'blur direction must be either latitudinal or longitudinal!' );\n\n\t\t}\n\n\t\t// Number of standard deviations at which to cut off the discrete approximation.\n\t\tconst STANDARD_DEVIATIONS = 3;\n\n\t\tconst blurMesh = new Mesh( this._lodPlanes[ lodOut ], blurMaterial );\n\t\tconst blurUniforms = blurMaterial.uniforms;\n\n\t\tconst pixels = this._sizeLods[ lodIn ] - 1;\n\t\tconst radiansPerPixel = isFinite( sigmaRadians ) ? Math.PI / ( 2 * pixels ) : 2 * Math.PI / ( 2 * MAX_SAMPLES - 1 );\n\t\tconst sigmaPixels = sigmaRadians / radiansPerPixel;\n\t\tconst samples = isFinite( sigmaRadians ) ? 1 + Math.floor( STANDARD_DEVIATIONS * sigmaPixels ) : MAX_SAMPLES;\n\n\t\tif ( samples > MAX_SAMPLES ) {\n\n\t\t\tconsole.warn( `sigmaRadians, ${\n\t\t\t\tsigmaRadians}, is too large and will clip, as it requested ${\n\t\t\t\tsamples} samples when the maximum is set to ${MAX_SAMPLES}` );\n\n\t\t}\n\n\t\tconst weights = [];\n\t\tlet sum = 0;\n\n\t\tfor ( let i = 0; i < MAX_SAMPLES; ++ i ) {\n\n\t\t\tconst x = i / sigmaPixels;\n\t\t\tconst weight = Math.exp( - x * x / 2 );\n\t\t\tweights.push( weight );\n\n\t\t\tif ( i === 0 ) {\n\n\t\t\t\tsum += weight;\n\n\t\t\t} else if ( i < samples ) {\n\n\t\t\t\tsum += 2 * weight;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let i = 0; i < weights.length; i ++ ) {\n\n\t\t\tweights[ i ] = weights[ i ] / sum;\n\n\t\t}\n\n\t\tblurUniforms[ 'envMap' ].value = targetIn.texture;\n\t\tblurUniforms[ 'samples' ].value = samples;\n\t\tblurUniforms[ 'weights' ].value = weights;\n\t\tblurUniforms[ 'latitudinal' ].value = direction === 'latitudinal';\n\n\t\tif ( poleAxis ) {\n\n\t\t\tblurUniforms[ 'poleAxis' ].value = poleAxis;\n\n\t\t}\n\n\t\tconst { _lodMax } = this;\n\t\tblurUniforms[ 'dTheta' ].value = radiansPerPixel;\n\t\tblurUniforms[ 'mipInt' ].value = _lodMax - lodIn;\n\n\t\tconst outputSize = this._sizeLods[ lodOut ];\n\t\tconst x = 3 * outputSize * ( lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0 );\n\t\tconst y = 4 * ( this._cubeSize - outputSize );\n\n\t\t_setViewport( targetOut, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( targetOut );\n\t\trenderer.render( blurMesh, _flatCamera );\n\n\t}\n\n}\n\n\n\nfunction _createPlanes( lodMax ) {\n\n\tconst lodPlanes = [];\n\tconst sizeLods = [];\n\tconst sigmas = [];\n\n\tlet lod = lodMax;\n\n\tconst totalLods = lodMax - LOD_MIN + 1 + EXTRA_LOD_SIGMA.length;\n\n\tfor ( let i = 0; i < totalLods; i ++ ) {\n\n\t\tconst sizeLod = Math.pow( 2, lod );\n\t\tsizeLods.push( sizeLod );\n\t\tlet sigma = 1.0 / sizeLod;\n\n\t\tif ( i > lodMax - LOD_MIN ) {\n\n\t\t\tsigma = EXTRA_LOD_SIGMA[ i - lodMax + LOD_MIN - 1 ];\n\n\t\t} else if ( i === 0 ) {\n\n\t\t\tsigma = 0;\n\n\t\t}\n\n\t\tsigmas.push( sigma );\n\n\t\tconst texelSize = 1.0 / ( sizeLod - 2 );\n\t\tconst min = - texelSize;\n\t\tconst max = 1 + texelSize;\n\t\tconst uv1 = [ min, min, max, min, max, max, min, min, max, max, min, max ];\n\n\t\tconst cubeFaces = 6;\n\t\tconst vertices = 6;\n\t\tconst positionSize = 3;\n\t\tconst uvSize = 2;\n\t\tconst faceIndexSize = 1;\n\n\t\tconst position = new Float32Array( positionSize * vertices * cubeFaces );\n\t\tconst uv = new Float32Array( uvSize * vertices * cubeFaces );\n\t\tconst faceIndex = new Float32Array( faceIndexSize * vertices * cubeFaces );\n\n\t\tfor ( let face = 0; face < cubeFaces; face ++ ) {\n\n\t\t\tconst x = ( face % 3 ) * 2 / 3 - 1;\n\t\t\tconst y = face > 2 ? 0 : - 1;\n\t\t\tconst coordinates = [\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y + 1, 0\n\t\t\t];\n\t\t\tposition.set( coordinates, positionSize * vertices * face );\n\t\t\tuv.set( uv1, uvSize * vertices * face );\n\t\t\tconst fill = [ face, face, face, face, face, face ];\n\t\t\tfaceIndex.set( fill, faceIndexSize * vertices * face );\n\n\t\t}\n\n\t\tconst planes = new BufferGeometry();\n\t\tplanes.setAttribute( 'position', new BufferAttribute( position, positionSize ) );\n\t\tplanes.setAttribute( 'uv', new BufferAttribute( uv, uvSize ) );\n\t\tplanes.setAttribute( 'faceIndex', new BufferAttribute( faceIndex, faceIndexSize ) );\n\t\tlodPlanes.push( planes );\n\n\t\tif ( lod > LOD_MIN ) {\n\n\t\t\tlod --;\n\n\t\t}\n\n\t}\n\n\treturn { lodPlanes, sizeLods, sigmas };\n\n}\n\nfunction _createRenderTarget( width, height, params ) {\n\n\tconst cubeUVRenderTarget = new WebGLRenderTarget( width, height, params );\n\tcubeUVRenderTarget.texture.mapping = CubeUVReflectionMapping;\n\tcubeUVRenderTarget.texture.name = 'PMREM.cubeUv';\n\tcubeUVRenderTarget.scissorTest = true;\n\treturn cubeUVRenderTarget;\n\n}\n\nfunction _setViewport( target, x, y, width, height ) {\n\n\ttarget.viewport.set( x, y, width, height );\n\ttarget.scissor.set( x, y, width, height );\n\n}\n\nfunction _getBlurShader( lodMax, width, height ) {\n\n\tconst weights = new Float32Array( MAX_SAMPLES );\n\tconst poleAxis = new Vector3( 0, 1, 0 );\n\tconst shaderMaterial = new ShaderMaterial( {\n\n\t\tname: 'SphericalGaussianBlur',\n\n\t\tdefines: {\n\t\t\t'n': MAX_SAMPLES,\n\t\t\t'CUBEUV_TEXEL_WIDTH': 1.0 / width,\n\t\t\t'CUBEUV_TEXEL_HEIGHT': 1.0 / height,\n\t\t\t'CUBEUV_MAX_MIP': `${lodMax}.0`,\n\t\t},\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'samples': { value: 1 },\n\t\t\t'weights': { value: weights },\n\t\t\t'latitudinal': { value: false },\n\t\t\t'dTheta': { value: 0 },\n\t\t\t'mipInt': { value: 0 },\n\t\t\t'poleAxis': { value: poleAxis }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include <cube_uv_reflection_fragment>\n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getEquirectMaterial() {\n\n\treturn new ShaderMaterial( {\n\n\t\tname: 'EquirectangularToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\n\t\t\t#include <common>\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tgl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n}\n\nfunction _getCubemapMaterial() {\n\n\treturn new ShaderMaterial( {\n\n\t\tname: 'CubemapToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'flipEnvMap': { value: - 1 }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tuniform float flipEnvMap;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n}\n\nfunction _getCommonVertexShader() {\n\n\treturn /* glsl */`\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t`;\n\n}\n\nfunction WebGLCubeUVMaps( renderer ) {\n\n\tlet cubeUVmaps = new WeakMap();\n\n\tlet pmremGenerator = null;\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tconst isEquirectMap = ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping );\n\t\t\tconst isCubeMap = ( mapping === CubeReflectionMapping || mapping === CubeRefractionMapping );\n\n\t\t\t// equirect/cube map to cubeUV conversion\n\n\t\t\tif ( isEquirectMap || isCubeMap ) {\n\n\t\t\t\tif ( texture.isRenderTargetTexture && texture.needsPMREMUpdate === true ) {\n\n\t\t\t\t\ttexture.needsPMREMUpdate = false;\n\n\t\t\t\t\tlet renderTarget = cubeUVmaps.get( texture );\n\n\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\trenderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture, renderTarget ) : pmremGenerator.fromCubemap( texture, renderTarget );\n\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( cubeUVmaps.has( texture ) ) {\n\n\t\t\t\t\t\treturn cubeUVmaps.get( texture ).texture;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\t\tif ( ( isEquirectMap && image && image.height > 0 ) || ( isCubeMap && image && isCubeTextureComplete( image ) ) ) {\n\n\t\t\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\t\t\tconst renderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture ) : pmremGenerator.fromCubemap( texture );\n\t\t\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction isCubeTextureComplete( image ) {\n\n\t\tlet count = 0;\n\t\tconst length = 6;\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tif ( image[ i ] !== undefined ) count ++;\n\n\t\t}\n\n\t\treturn count === length;\n\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemapUV = cubeUVmaps.get( texture );\n\n\t\tif ( cubemapUV !== undefined ) {\n\n\t\t\tcubeUVmaps.delete( texture );\n\t\t\tcubemapUV.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubeUVmaps = new WeakMap();\n\n\t\tif ( pmremGenerator !== null ) {\n\n\t\t\tpmremGenerator.dispose();\n\t\t\tpmremGenerator = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction WebGLExtensions( gl ) {\n\n\tconst extensions = {};\n\n\tfunction getExtension( name ) {\n\n\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\treturn extensions[ name ];\n\n\t\t}\n\n\t\tlet extension;\n\n\t\tswitch ( name ) {\n\n\t\t\tcase 'WEBGL_depth_texture':\n\t\t\t\textension = gl.getExtension( 'WEBGL_depth_texture' ) || gl.getExtension( 'MOZ_WEBGL_depth_texture' ) || gl.getExtension( 'WEBKIT_WEBGL_depth_texture' );\n\t\t\t\tbreak;\n\n\t\t\tcase 'EXT_texture_filter_anisotropic':\n\t\t\t\textension = gl.getExtension( 'EXT_texture_filter_anisotropic' ) || gl.getExtension( 'MOZ_EXT_texture_filter_anisotropic' ) || gl.getExtension( 'WEBKIT_EXT_texture_filter_anisotropic' );\n\t\t\t\tbreak;\n\n\t\t\tcase 'WEBGL_compressed_texture_s3tc':\n\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'MOZ_WEBGL_compressed_texture_s3tc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_s3tc' );\n\t\t\t\tbreak;\n\n\t\t\tcase 'WEBGL_compressed_texture_pvrtc':\n\t\t\t\textension = gl.getExtension( 'WEBGL_compressed_texture_pvrtc' ) || gl.getExtension( 'WEBKIT_WEBGL_compressed_texture_pvrtc' );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\textension = gl.getExtension( name );\n\n\t\t}\n\n\t\textensions[ name ] = extension;\n\n\t\treturn extension;\n\n\t}\n\n\treturn {\n\n\t\thas: function ( name ) {\n\n\t\t\treturn getExtension( name ) !== null;\n\n\t\t},\n\n\t\tinit: function ( capabilities ) {\n\n\t\t\tif ( capabilities.isWebGL2 ) {\n\n\t\t\t\tgetExtension( 'EXT_color_buffer_float' );\n\n\t\t\t} else {\n\n\t\t\t\tgetExtension( 'WEBGL_depth_texture' );\n\t\t\t\tgetExtension( 'OES_texture_float' );\n\t\t\t\tgetExtension( 'OES_texture_half_float' );\n\t\t\t\tgetExtension( 'OES_texture_half_float_linear' );\n\t\t\t\tgetExtension( 'OES_standard_derivatives' );\n\t\t\t\tgetExtension( 'OES_element_index_uint' );\n\t\t\t\tgetExtension( 'OES_vertex_array_object' );\n\t\t\t\tgetExtension( 'ANGLE_instanced_arrays' );\n\n\t\t\t}\n\n\t\t\tgetExtension( 'OES_texture_float_linear' );\n\t\t\tgetExtension( 'EXT_color_buffer_half_float' );\n\t\t\tgetExtension( 'WEBGL_multisampled_render_to_texture' );\n\n\t\t},\n\n\t\tget: function ( name ) {\n\n\t\t\tconst extension = getExtension( name );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t}\n\n\t\t\treturn extension;\n\n\t\t}\n\n\t};\n\n}\n\nfunction WebGLGeometries( gl, attributes, info, bindingStates ) {\n\n\tconst geometries = {};\n\tconst wireframeAttributes = new WeakMap();\n\n\tfunction onGeometryDispose( event ) {\n\n\t\tconst geometry = event.target;\n\n\t\tif ( geometry.index !== null ) {\n\n\t\t\tattributes.remove( geometry.index );\n\n\t\t}\n\n\t\tfor ( const name in geometry.attributes ) {\n\n\t\t\tattributes.remove( geometry.attributes[ name ] );\n\n\t\t}\n\n\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\tdelete geometries[ geometry.id ];\n\n\t\tconst attribute = wireframeAttributes.get( geometry );\n\n\t\tif ( attribute ) {\n\n\t\t\tattributes.remove( attribute );\n\t\t\twireframeAttributes.delete( geometry );\n\n\t\t}\n\n\t\tbindingStates.releaseStatesOfGeometry( geometry );\n\n\t\tif ( geometry.isInstancedBufferGeometry === true ) {\n\n\t\t\tdelete geometry._maxInstanceCount;\n\n\t\t}\n\n\t\t//\n\n\t\tinfo.memory.geometries --;\n\n\t}\n\n\tfunction get( object, geometry ) {\n\n\t\tif ( geometries[ geometry.id ] === true ) return geometry;\n\n\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\tgeometries[ geometry.id ] = true;\n\n\t\tinfo.memory.geometries ++;\n\n\t\treturn geometry;\n\n\t}\n\n\tfunction update( geometry ) {\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates.\n\n\t\tfor ( const name in geometryAttributes ) {\n\n\t\t\tattributes.update( geometryAttributes[ name ], 34962 );\n\n\t\t}\n\n\t\t// morph targets\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst array = morphAttributes[ name ];\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tattributes.update( array[ i ], 34962 );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction updateWireframeAttribute( geometry ) {\n\n\t\tconst indices = [];\n\n\t\tconst geometryIndex = geometry.index;\n\t\tconst geometryPosition = geometry.attributes.position;\n\t\tlet version = 0;\n\n\t\tif ( geometryIndex !== null ) {\n\n\t\t\tconst array = geometryIndex.array;\n\t\t\tversion = geometryIndex.version;\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tconst a = array[ i + 0 ];\n\t\t\t\tconst b = array[ i + 1 ];\n\t\t\t\tconst c = array[ i + 2 ];\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst array = geometryPosition.array;\n\t\t\tversion = geometryPosition.version;\n\n\t\t\tfor ( let i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\tconst a = i + 0;\n\t\t\t\tconst b = i + 1;\n\t\t\t\tconst c = i + 2;\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst attribute = new ( arrayNeedsUint32( indices ) ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );\n\t\tattribute.version = version;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates\n\n\t\t//\n\n\t\tconst previousAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( previousAttribute ) attributes.remove( previousAttribute );\n\n\t\t//\n\n\t\twireframeAttributes.set( geometry, attribute );\n\n\t}\n\n\tfunction getWireframeAttribute( geometry ) {\n\n\t\tconst currentAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( currentAttribute ) {\n\n\t\t\tconst geometryIndex = geometry.index;\n\n\t\t\tif ( geometryIndex !== null ) {\n\n\t\t\t\t// if the attribute is obsolete, create a new one\n\n\t\t\t\tif ( currentAttribute.version < geometryIndex.version ) {\n\n\t\t\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t}\n\n\t\treturn wireframeAttributes.get( geometry );\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tupdate: update,\n\n\t\tgetWireframeAttribute: getWireframeAttribute\n\n\t};\n\n}\n\nfunction WebGLIndexedBufferRenderer( gl, extensions, info, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tlet type, bytesPerElement;\n\n\tfunction setIndex( value ) {\n\n\t\ttype = value.type;\n\t\tbytesPerElement = value.bytesPerElement;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawElements( mode, count, type, start * bytesPerElement );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tlet extension, methodName;\n\n\t\tif ( isWebGL2 ) {\n\n\t\t\textension = gl;\n\t\t\tmethodName = 'drawElementsInstanced';\n\n\t\t} else {\n\n\t\t\textension = extensions.get( 'ANGLE_instanced_arrays' );\n\t\t\tmethodName = 'drawElementsInstancedANGLE';\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLIndexedBufferRenderer: using THREE.InstancedBufferGeometry but hardware does not support extension ANGLE_instanced_arrays.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\textension[ methodName ]( mode, count, type, start * bytesPerElement, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.setIndex = setIndex;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\n}\n\nfunction WebGLInfo( gl ) {\n\n\tconst memory = {\n\t\tgeometries: 0,\n\t\ttextures: 0\n\t};\n\n\tconst render = {\n\t\tframe: 0,\n\t\tcalls: 0,\n\t\ttriangles: 0,\n\t\tpoints: 0,\n\t\tlines: 0\n\t};\n\n\tfunction update( count, mode, instanceCount ) {\n\n\t\trender.calls ++;\n\n\t\tswitch ( mode ) {\n\n\t\t\tcase 4:\n\t\t\t\trender.triangles += instanceCount * ( count / 3 );\n\t\t\t\tbreak;\n\n\t\t\tcase 1:\n\t\t\t\trender.lines += instanceCount * ( count / 2 );\n\t\t\t\tbreak;\n\n\t\t\tcase 3:\n\t\t\t\trender.lines += instanceCount * ( count - 1 );\n\t\t\t\tbreak;\n\n\t\t\tcase 2:\n\t\t\t\trender.lines += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tcase 0:\n\t\t\t\trender.points += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.error( 'THREE.WebGLInfo: Unknown draw mode:', mode );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\trender.frame ++;\n\t\trender.calls = 0;\n\t\trender.triangles = 0;\n\t\trender.points = 0;\n\t\trender.lines = 0;\n\n\t}\n\n\treturn {\n\t\tmemory: memory,\n\t\trender: render,\n\t\tprograms: null,\n\t\tautoReset: true,\n\t\treset: reset,\n\t\tupdate: update\n\t};\n\n}\n\nfunction numericalSort( a, b ) {\n\n\treturn a[ 0 ] - b[ 0 ];\n\n}\n\nfunction absNumericalSort( a, b ) {\n\n\treturn Math.abs( b[ 1 ] ) - Math.abs( a[ 1 ] );\n\n}\n\nfunction WebGLMorphtargets( gl, capabilities, textures ) {\n\n\tconst influencesList = {};\n\tconst morphInfluences = new Float32Array( 8 );\n\tconst morphTextures = new WeakMap();\n\tconst morph = new Vector4();\n\n\tconst workInfluences = [];\n\n\tfor ( let i = 0; i < 8; i ++ ) {\n\n\t\tworkInfluences[ i ] = [ i, 0 ];\n\n\t}\n\n\tfunction update( object, geometry, material, program ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\tif ( capabilities.isWebGL2 === true ) {\n\n\t\t\t// instead of using attributes, the WebGL 2 code path encodes morph targets\n\t\t\t// into an array of data textures. Each layer represents a single morph target.\n\n\t\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\t\tlet entry = morphTextures.get( geometry );\n\n\t\t\tif ( entry === undefined || entry.count !== morphTargetsCount ) {\n\n\t\t\t\tif ( entry !== undefined ) entry.texture.dispose();\n\n\t\t\t\tconst hasMorphPosition = geometry.morphAttributes.position !== undefined;\n\t\t\t\tconst hasMorphNormals = geometry.morphAttributes.normal !== undefined;\n\t\t\t\tconst hasMorphColors = geometry.morphAttributes.color !== undefined;\n\n\t\t\t\tconst morphTargets = geometry.morphAttributes.position || [];\n\t\t\t\tconst morphNormals = geometry.morphAttributes.normal || [];\n\t\t\t\tconst morphColors = geometry.morphAttributes.color || [];\n\n\t\t\t\tlet vertexDataCount = 0;\n\n\t\t\t\tif ( hasMorphPosition === true ) vertexDataCount = 1;\n\t\t\t\tif ( hasMorphNormals === true ) vertexDataCount = 2;\n\t\t\t\tif ( hasMorphColors === true ) vertexDataCount = 3;\n\n\t\t\t\tlet width = geometry.attributes.position.count * vertexDataCount;\n\t\t\t\tlet height = 1;\n\n\t\t\t\tif ( width > capabilities.maxTextureSize ) {\n\n\t\t\t\t\theight = Math.ceil( width / capabilities.maxTextureSize );\n\t\t\t\t\twidth = capabilities.maxTextureSize;\n\n\t\t\t\t}\n\n\t\t\t\tconst buffer = new Float32Array( width * height * 4 * morphTargetsCount );\n\n\t\t\t\tconst texture = new DataArrayTexture( buffer, width, height, morphTargetsCount );\n\t\t\t\ttexture.type = FloatType;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t// fill buffer\n\n\t\t\t\tconst vertexDataStride = vertexDataCount * 4;\n\n\t\t\t\tfor ( let i = 0; i < morphTargetsCount; i ++ ) {\n\n\t\t\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\t\t\tconst morphNormal = morphNormals[ i ];\n\t\t\t\t\tconst morphColor = morphColors[ i ];\n\n\t\t\t\t\tconst offset = width * height * 4 * i;\n\n\t\t\t\t\tfor ( let j = 0; j < morphTarget.count; j ++ ) {\n\n\t\t\t\t\t\tconst stride = j * vertexDataStride;\n\n\t\t\t\t\t\tif ( hasMorphPosition === true ) {\n\n\t\t\t\t\t\t\tmorph.fromBufferAttribute( morphTarget, j );\n\n\t\t\t\t\t\t\tbuffer[ offset + stride + 0 ] = morph.x;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 1 ] = morph.y;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 2 ] = morph.z;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 3 ] = 0;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasMorphNormals === true ) {\n\n\t\t\t\t\t\t\tmorph.fromBufferAttribute( morphNormal, j );\n\n\t\t\t\t\t\t\tbuffer[ offset + stride + 4 ] = morph.x;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 5 ] = morph.y;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 6 ] = morph.z;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 7 ] = 0;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( hasMorphColors === true ) {\n\n\t\t\t\t\t\t\tmorph.fromBufferAttribute( morphColor, j );\n\n\t\t\t\t\t\t\tbuffer[ offset + stride + 8 ] = morph.x;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 9 ] = morph.y;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 10 ] = morph.z;\n\t\t\t\t\t\t\tbuffer[ offset + stride + 11 ] = ( morphColor.itemSize === 4 ) ? morph.w : 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tentry = {\n\t\t\t\t\tcount: morphTargetsCount,\n\t\t\t\t\ttexture: texture,\n\t\t\t\t\tsize: new Vector2( width, height )\n\t\t\t\t};\n\n\t\t\t\tmorphTextures.set( geometry, entry );\n\n\t\t\t\tfunction disposeTexture() {\n\n\t\t\t\t\ttexture.dispose();\n\n\t\t\t\t\tmorphTextures.delete( geometry );\n\n\t\t\t\t\tgeometry.removeEventListener( 'dispose', disposeTexture );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.addEventListener( 'dispose', disposeTexture );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet morphInfluencesSum = 0;\n\n\t\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\t\tmorphInfluencesSum += objectInfluences[ i ];\n\n\t\t\t}\n\n\t\t\tconst morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetInfluences', objectInfluences );\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTexture', entry.texture, textures );\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTextureSize', entry.size );\n\n\n\t\t} else {\n\n\t\t\t// When object doesn't have morph target influences defined, we treat it as a 0-length array\n\t\t\t// This is important to make sure we set up morphTargetBaseInfluence / morphTargetInfluences\n\n\t\t\tconst length = objectInfluences === undefined ? 0 : objectInfluences.length;\n\n\t\t\tlet influences = influencesList[ geometry.id ];\n\n\t\t\tif ( influences === undefined || influences.length !== length ) {\n\n\t\t\t\t// initialise list\n\n\t\t\t\tinfluences = [];\n\n\t\t\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\t\t\tinfluences[ i ] = [ i, 0 ];\n\n\t\t\t\t}\n\n\t\t\t\tinfluencesList[ geometry.id ] = influences;\n\n\t\t\t}\n\n\t\t\t// Collect influences\n\n\t\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\t\tconst influence = influences[ i ];\n\n\t\t\t\tinfluence[ 0 ] = i;\n\t\t\t\tinfluence[ 1 ] = objectInfluences[ i ];\n\n\t\t\t}\n\n\t\t\tinfluences.sort( absNumericalSort );\n\n\t\t\tfor ( let i = 0; i < 8; i ++ ) {\n\n\t\t\t\tif ( i < length && influences[ i ][ 1 ] ) {\n\n\t\t\t\t\tworkInfluences[ i ][ 0 ] = influences[ i ][ 0 ];\n\t\t\t\t\tworkInfluences[ i ][ 1 ] = influences[ i ][ 1 ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tworkInfluences[ i ][ 0 ] = Number.MAX_SAFE_INTEGER;\n\t\t\t\t\tworkInfluences[ i ][ 1 ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tworkInfluences.sort( numericalSort );\n\n\t\t\tconst morphTargets = geometry.morphAttributes.position;\n\t\t\tconst morphNormals = geometry.morphAttributes.normal;\n\n\t\t\tlet morphInfluencesSum = 0;\n\n\t\t\tfor ( let i = 0; i < 8; i ++ ) {\n\n\t\t\t\tconst influence = workInfluences[ i ];\n\t\t\t\tconst index = influence[ 0 ];\n\t\t\t\tconst value = influence[ 1 ];\n\n\t\t\t\tif ( index !== Number.MAX_SAFE_INTEGER && value ) {\n\n\t\t\t\t\tif ( morphTargets && geometry.getAttribute( 'morphTarget' + i ) !== morphTargets[ index ] ) {\n\n\t\t\t\t\t\tgeometry.setAttribute( 'morphTarget' + i, morphTargets[ index ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( morphNormals && geometry.getAttribute( 'morphNormal' + i ) !== morphNormals[ index ] ) {\n\n\t\t\t\t\t\tgeometry.setAttribute( 'morphNormal' + i, morphNormals[ index ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmorphInfluences[ i ] = value;\n\t\t\t\t\tmorphInfluencesSum += value;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( morphTargets && geometry.hasAttribute( 'morphTarget' + i ) === true ) {\n\n\t\t\t\t\t\tgeometry.deleteAttribute( 'morphTarget' + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( morphNormals && geometry.hasAttribute( 'morphNormal' + i ) === true ) {\n\n\t\t\t\t\t\tgeometry.deleteAttribute( 'morphNormal' + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmorphInfluences[ i ] = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// GLSL shader uses formula baseinfluence * base + sum(target * influence)\n\t\t\t// This allows us to switch between absolute morphs and relative morphs without changing shader code\n\t\t\t// When baseinfluence = 1 - sum(influence), the above is equivalent to sum((target - base) * influence)\n\t\t\tconst morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetInfluences', morphInfluences );\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tupdate: update\n\n\t};\n\n}\n\nfunction WebGLObjects( gl, geometries, attributes, info ) {\n\n\tlet updateMap = new WeakMap();\n\n\tfunction update( object ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\tconst geometry = object.geometry;\n\t\tconst buffergeometry = geometries.get( object, geometry );\n\n\t\t// Update once per frame\n\n\t\tif ( updateMap.get( buffergeometry ) !== frame ) {\n\n\t\t\tgeometries.update( buffergeometry );\n\n\t\t\tupdateMap.set( buffergeometry, frame );\n\n\t\t}\n\n\t\tif ( object.isInstancedMesh ) {\n\n\t\t\tif ( object.hasEventListener( 'dispose', onInstancedMeshDispose ) === false ) {\n\n\t\t\t\tobject.addEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\t\t}\n\n\t\t\tattributes.update( object.instanceMatrix, 34962 );\n\n\t\t\tif ( object.instanceColor !== null ) {\n\n\t\t\t\tattributes.update( object.instanceColor, 34962 );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn buffergeometry;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tupdateMap = new WeakMap();\n\n\t}\n\n\tfunction onInstancedMeshDispose( event ) {\n\n\t\tconst instancedMesh = event.target;\n\n\t\tinstancedMesh.removeEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\tattributes.remove( instancedMesh.instanceMatrix );\n\n\t\tif ( instancedMesh.instanceColor !== null ) attributes.remove( instancedMesh.instanceColor );\n\n\t}\n\n\treturn {\n\n\t\tupdate: update,\n\t\tdispose: dispose\n\n\t};\n\n}\n\n/**\n * Uniforms of a program.\n * Those form a tree structure with a special top-level container for the root,\n * which you get by calling 'new WebGLUniforms( gl, program )'.\n *\n *\n * Properties of inner nodes including the top-level container:\n *\n * .seq - array of nested uniforms\n * .map - nested uniforms by name\n *\n *\n * Methods of all nodes except the top-level container:\n *\n * .setValue( gl, value, [textures] )\n *\n * \t\tuploads a uniform value(s)\n * \tthe 'textures' parameter is needed for sampler uniforms\n *\n *\n * Static methods of the top-level container (textures factorizations):\n *\n * .upload( gl, seq, values, textures )\n *\n * \t\tsets uniforms in 'seq' to 'values[id].value'\n *\n * .seqWithValue( seq, values ) : filteredSeq\n *\n * \t\tfilters 'seq' entries with corresponding entry in values\n *\n *\n * Methods of the top-level container (textures factorizations):\n *\n * .setValue( gl, name, value, textures )\n *\n * \t\tsets uniform with name 'name' to 'value'\n *\n * .setOptional( gl, obj, prop )\n *\n * \t\tlike .set for an optional property of the object\n *\n */\n\nconst emptyTexture = /*@__PURE__*/ new Texture();\nconst emptyArrayTexture = /*@__PURE__*/ new DataArrayTexture();\nconst empty3dTexture = /*@__PURE__*/ new Data3DTexture();\nconst emptyCubeTexture = /*@__PURE__*/ new CubeTexture();\n\n// --- Utilities ---\n\n// Array Caches (provide typed arrays for temporary by size)\n\nconst arrayCacheF32 = [];\nconst arrayCacheI32 = [];\n\n// Float32Array caches used for uploading Matrix uniforms\n\nconst mat4array = new Float32Array( 16 );\nconst mat3array = new Float32Array( 9 );\nconst mat2array = new Float32Array( 4 );\n\n// Flattening for arrays of vectors and matrices\n\nfunction flatten( array, nBlocks, blockSize ) {\n\n\tconst firstElem = array[ 0 ];\n\n\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t// unoptimized: ! isNaN( firstElem )\n\t// see http://jacksondunstan.com/articles/983\n\n\tconst n = nBlocks * blockSize;\n\tlet r = arrayCacheF32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Float32Array( n );\n\t\tarrayCacheF32[ n ] = r;\n\n\t}\n\n\tif ( nBlocks !== 0 ) {\n\n\t\tfirstElem.toArray( r, 0 );\n\n\t\tfor ( let i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\toffset += blockSize;\n\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t}\n\n\t}\n\n\treturn r;\n\n}\n\nfunction arraysEqual( a, b ) {\n\n\tif ( a.length !== b.length ) return false;\n\n\tfor ( let i = 0, l = a.length; i < l; i ++ ) {\n\n\t\tif ( a[ i ] !== b[ i ] ) return false;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction copyArray( a, b ) {\n\n\tfor ( let i = 0, l = b.length; i < l; i ++ ) {\n\n\t\ta[ i ] = b[ i ];\n\n\t}\n\n}\n\n// Texture unit allocation\n\nfunction allocTexUnits( textures, n ) {\n\n\tlet r = arrayCacheI32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Int32Array( n );\n\t\tarrayCacheI32[ n ] = r;\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\tr[ i ] = textures.allocateTextureUnit();\n\n\t}\n\n\treturn r;\n\n}\n\n// --- Setters ---\n\n// Note: Defining these methods externally, because they come in a bunch\n// and this way their names minify.\n\n// Single scalar\n\nfunction setValueV1f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1f( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single float vector (from flat array or THREE.VectorN)\n\nfunction setValueV2f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2f( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else if ( v.r !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.r || cache[ 1 ] !== v.g || cache[ 2 ] !== v.b ) {\n\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\n\t\t\tcache[ 0 ] = v.r;\n\t\t\tcache[ 1 ] = v.g;\n\t\t\tcache[ 2 ] = v.b;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n// Single matrix (from flat array or THREE.MatrixN)\n\nfunction setValueM2( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat2array.set( elements );\n\n\t\tgl.uniformMatrix2fv( this.addr, false, mat2array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM3( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat3array.set( elements );\n\n\t\tgl.uniformMatrix3fv( this.addr, false, mat3array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM4( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat4array.set( elements );\n\n\t\tgl.uniformMatrix4fv( this.addr, false, mat4array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\n// Single integer / boolean\n\nfunction setValueV1i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1i( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single integer / boolean vector (from flat array or THREE.VectorN)\n\nfunction setValueV2i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2i( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3i( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4i( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n// Single unsigned integer\n\nfunction setValueV1ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1ui( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single unsigned integer vector (from flat array or THREE.VectorN)\n\nfunction setValueV2ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2ui( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3ui( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4ui( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n\n// Single texture (2D / Cube)\n\nfunction setValueT1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture2D( v || emptyTexture, unit );\n\n}\n\nfunction setValueT3D1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture3D( v || empty3dTexture, unit );\n\n}\n\nfunction setValueT6( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTextureCube( v || emptyCubeTexture, unit );\n\n}\n\nfunction setValueT2DArray1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture2DArray( v || emptyArrayTexture, unit );\n\n}\n\n// Helper to pick the right setter for the singular case\n\nfunction getSingularSetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1f; // FLOAT\n\t\tcase 0x8b50: return setValueV2f; // _VEC2\n\t\tcase 0x8b51: return setValueV3f; // _VEC3\n\t\tcase 0x8b52: return setValueV4f; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2; // _MAT2\n\t\tcase 0x8b5b: return setValueM3; // _MAT3\n\t\tcase 0x8b5c: return setValueM4; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1i; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2i; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3i; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4i; // _VEC4\n\n\t\tcase 0x1405: return setValueV1ui; // UINT\n\t\tcase 0x8dc6: return setValueV2ui; // _VEC2\n\t\tcase 0x8dc7: return setValueV3ui; // _VEC3\n\t\tcase 0x8dc8: return setValueV4ui; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3D1;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArray1;\n\n\t}\n\n}\n\n\n// Array of scalars\n\nfunction setValueV1fArray( gl, v ) {\n\n\tgl.uniform1fv( this.addr, v );\n\n}\n\n// Array of vectors (from flat array or array of THREE.VectorN)\n\nfunction setValueV2fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 2 );\n\n\tgl.uniform2fv( this.addr, data );\n\n}\n\nfunction setValueV3fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 3 );\n\n\tgl.uniform3fv( this.addr, data );\n\n}\n\nfunction setValueV4fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniform4fv( this.addr, data );\n\n}\n\n// Array of matrices (from flat array or array of THREE.MatrixN)\n\nfunction setValueM2Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniformMatrix2fv( this.addr, false, data );\n\n}\n\nfunction setValueM3Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 9 );\n\n\tgl.uniformMatrix3fv( this.addr, false, data );\n\n}\n\nfunction setValueM4Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 16 );\n\n\tgl.uniformMatrix4fv( this.addr, false, data );\n\n}\n\n// Array of integer / boolean\n\nfunction setValueV1iArray( gl, v ) {\n\n\tgl.uniform1iv( this.addr, v );\n\n}\n\n// Array of integer / boolean vectors (from flat array)\n\nfunction setValueV2iArray( gl, v ) {\n\n\tgl.uniform2iv( this.addr, v );\n\n}\n\nfunction setValueV3iArray( gl, v ) {\n\n\tgl.uniform3iv( this.addr, v );\n\n}\n\nfunction setValueV4iArray( gl, v ) {\n\n\tgl.uniform4iv( this.addr, v );\n\n}\n\n// Array of unsigned integer\n\nfunction setValueV1uiArray( gl, v ) {\n\n\tgl.uniform1uiv( this.addr, v );\n\n}\n\n// Array of unsigned integer vectors (from flat array)\n\nfunction setValueV2uiArray( gl, v ) {\n\n\tgl.uniform2uiv( this.addr, v );\n\n}\n\nfunction setValueV3uiArray( gl, v ) {\n\n\tgl.uniform3uiv( this.addr, v );\n\n}\n\nfunction setValueV4uiArray( gl, v ) {\n\n\tgl.uniform4uiv( this.addr, v );\n\n}\n\n\n// Array of textures (2D / 3D / Cube / 2DArray)\n\nfunction setValueT1Array( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture2D( v[ i ] || emptyTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT3DArray( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture3D( v[ i ] || empty3dTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT6Array( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT2DArrayArray( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture2DArray( v[ i ] || emptyArrayTexture, units[ i ] );\n\n\t}\n\n}\n\n\n// Helper to pick the right setter for a pure (bottom-level) array\n\nfunction getPureArraySetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1fArray; // FLOAT\n\t\tcase 0x8b50: return setValueV2fArray; // _VEC2\n\t\tcase 0x8b51: return setValueV3fArray; // _VEC3\n\t\tcase 0x8b52: return setValueV4fArray; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2Array; // _MAT2\n\t\tcase 0x8b5b: return setValueM3Array; // _MAT3\n\t\tcase 0x8b5c: return setValueM4Array; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1iArray; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2iArray; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3iArray; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4iArray; // _VEC4\n\n\t\tcase 0x1405: return setValueV1uiArray; // UINT\n\t\tcase 0x8dc6: return setValueV2uiArray; // _VEC2\n\t\tcase 0x8dc7: return setValueV3uiArray; // _VEC3\n\t\tcase 0x8dc8: return setValueV4uiArray; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1Array;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3DArray;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6Array;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArrayArray;\n\n\t}\n\n}\n\n// --- Uniform Classes ---\n\nclass SingleUniform {\n\n\tconstructor( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.cache = [];\n\t\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n}\n\nclass PureArrayUniform {\n\n\tconstructor( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.cache = [];\n\t\tthis.size = activeInfo.size;\n\t\tthis.setValue = getPureArraySetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n}\n\nclass StructuredUniform {\n\n\tconstructor( id ) {\n\n\t\tthis.id = id;\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t}\n\n\tsetValue( gl, value, textures ) {\n\n\t\tconst seq = this.seq;\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ];\n\t\t\tu.setValue( gl, value[ u.id ], textures );\n\n\t\t}\n\n\t}\n\n}\n\n// --- Top-level ---\n\n// Parser - builds up the property tree from the path strings\n\nconst RePathPart = /(\\w+)(\\])?(\\[|\\.)?/g;\n\n// extracts\n// \t- the identifier (member name or array index)\n// - followed by an optional right bracket (found when array index)\n// - followed by an optional left bracket or dot (type of subscript)\n//\n// Note: These portions can be read in a non-overlapping fashion and\n// allow straightforward parsing of the hierarchy that WebGL encodes\n// in the uniform names.\n\nfunction addUniform( container, uniformObject ) {\n\n\tcontainer.seq.push( uniformObject );\n\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n}\n\nfunction parseUniform( activeInfo, addr, container ) {\n\n\tconst path = activeInfo.name,\n\t\tpathLength = path.length;\n\n\t// reset RegExp object, because of the early exit of a previous run\n\tRePathPart.lastIndex = 0;\n\n\twhile ( true ) {\n\n\t\tconst match = RePathPart.exec( path ),\n\t\t\tmatchEnd = RePathPart.lastIndex;\n\n\t\tlet id = match[ 1 ];\n\t\tconst idIsIndex = match[ 2 ] === ']',\n\t\t\tsubscript = match[ 3 ];\n\n\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\tif ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) {\n\n\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\tbreak;\n\n\t\t} else {\n\n\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\tconst map = container.map;\n\t\t\tlet next = map[ id ];\n\n\t\t\tif ( next === undefined ) {\n\n\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\taddUniform( container, next );\n\n\t\t\t}\n\n\t\t\tcontainer = next;\n\n\t\t}\n\n\t}\n\n}\n\n// Root Container\n\nclass WebGLUniforms {\n\n\tconstructor( gl, program ) {\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t\tconst n = gl.getProgramParameter( program, 35718 );\n\n\t\tfor ( let i = 0; i < n; ++ i ) {\n\n\t\t\tconst info = gl.getActiveUniform( program, i ),\n\t\t\t\taddr = gl.getUniformLocation( program, info.name );\n\n\t\t\tparseUniform( info, addr, this );\n\n\t\t}\n\n\t}\n\n\tsetValue( gl, name, value, textures ) {\n\n\t\tconst u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, value, textures );\n\n\t}\n\n\tsetOptional( gl, object, name ) {\n\n\t\tconst v = object[ name ];\n\n\t\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n\t}\n\n\tstatic upload( gl, seq, values, textures ) {\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ],\n\t\t\t\tv = values[ u.id ];\n\n\t\t\tif ( v.needsUpdate !== false ) {\n\n\t\t\t\t// note: always updating when .needsUpdate is undefined\n\t\t\t\tu.setValue( gl, v.value, textures );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tstatic seqWithValue( seq, values ) {\n\n\t\tconst r = [];\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ];\n\t\t\tif ( u.id in values ) r.push( u );\n\n\t\t}\n\n\t\treturn r;\n\n\t}\n\n}\n\nfunction WebGLShader( gl, type, string ) {\n\n\tconst shader = gl.createShader( type );\n\n\tgl.shaderSource( shader, string );\n\tgl.compileShader( shader );\n\n\treturn shader;\n\n}\n\nlet programIdCount = 0;\n\nfunction handleSource( string, errorLine ) {\n\n\tconst lines = string.split( '\\n' );\n\tconst lines2 = [];\n\n\tconst from = Math.max( errorLine - 6, 0 );\n\tconst to = Math.min( errorLine + 6, lines.length );\n\n\tfor ( let i = from; i < to; i ++ ) {\n\n\t\tconst line = i + 1;\n\t\tlines2.push( `${line === errorLine ? '>' : ' '} ${line}: ${lines[ i ]}` );\n\n\t}\n\n\treturn lines2.join( '\\n' );\n\n}\n\nfunction getEncodingComponents( encoding ) {\n\n\tswitch ( encoding ) {\n\n\t\tcase LinearEncoding:\n\t\t\treturn [ 'Linear', '( value )' ];\n\t\tcase sRGBEncoding:\n\t\t\treturn [ 'sRGB', '( value )' ];\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.WebGLProgram: Unsupported encoding:', encoding );\n\t\t\treturn [ 'Linear', '( value )' ];\n\n\t}\n\n}\n\nfunction getShaderErrors( gl, shader, type ) {\n\n\tconst status = gl.getShaderParameter( shader, 35713 );\n\tconst errors = gl.getShaderInfoLog( shader ).trim();\n\n\tif ( status && errors === '' ) return '';\n\n\tconst errorMatches = /ERROR: 0:(\\d+)/.exec( errors );\n\tif ( errorMatches ) {\n\n\t\t// --enable-privileged-webgl-extension\n\t\t// console.log( '**' + type + '**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\t\tconst errorLine = parseInt( errorMatches[ 1 ] );\n\t\treturn type.toUpperCase() + '\\n\\n' + errors + '\\n\\n' + handleSource( gl.getShaderSource( shader ), errorLine );\n\n\t} else {\n\n\t\treturn errors;\n\n\t}\n\n}\n\nfunction getTexelEncodingFunction( functionName, encoding ) {\n\n\tconst components = getEncodingComponents( encoding );\n\treturn 'vec4 ' + functionName + '( vec4 value ) { return LinearTo' + components[ 0 ] + components[ 1 ] + '; }';\n\n}\n\nfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\tlet toneMappingName;\n\n\tswitch ( toneMapping ) {\n\n\t\tcase LinearToneMapping:\n\t\t\ttoneMappingName = 'Linear';\n\t\t\tbreak;\n\n\t\tcase ReinhardToneMapping:\n\t\t\ttoneMappingName = 'Reinhard';\n\t\t\tbreak;\n\n\t\tcase CineonToneMapping:\n\t\t\ttoneMappingName = 'OptimizedCineon';\n\t\t\tbreak;\n\n\t\tcase ACESFilmicToneMapping:\n\t\t\ttoneMappingName = 'ACESFilmic';\n\t\t\tbreak;\n\n\t\tcase CustomToneMapping:\n\t\t\ttoneMappingName = 'Custom';\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tconsole.warn( 'THREE.WebGLProgram: Unsupported toneMapping:', toneMapping );\n\t\t\ttoneMappingName = 'Linear';\n\n\t}\n\n\treturn 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }';\n\n}\n\nfunction generateExtensions( parameters ) {\n\n\tconst chunks = [\n\t\t( parameters.extensionDerivatives || !! parameters.envMapCubeUVHeight || parameters.bumpMap || parameters.tangentSpaceNormalMap || parameters.clearcoatNormalMap || parameters.flatShading || parameters.shaderID === 'physical' ) ? '#extension GL_OES_standard_derivatives : enable' : '',\n\t\t( parameters.extensionFragDepth || parameters.logarithmicDepthBuffer ) && parameters.rendererExtensionFragDepth ? '#extension GL_EXT_frag_depth : enable' : '',\n\t\t( parameters.extensionDrawBuffers && parameters.rendererExtensionDrawBuffers ) ? '#extension GL_EXT_draw_buffers : require' : '',\n\t\t( parameters.extensionShaderTextureLOD || parameters.envMap || parameters.transmission ) && parameters.rendererExtensionShaderTextureLod ? '#extension GL_EXT_shader_texture_lod : enable' : ''\n\t];\n\n\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n}\n\nfunction generateDefines( defines ) {\n\n\tconst chunks = [];\n\n\tfor ( const name in defines ) {\n\n\t\tconst value = defines[ name ];\n\n\t\tif ( value === false ) continue;\n\n\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t}\n\n\treturn chunks.join( '\\n' );\n\n}\n\nfunction fetchAttributeLocations( gl, program ) {\n\n\tconst attributes = {};\n\n\tconst n = gl.getProgramParameter( program, 35721 );\n\n\tfor ( let i = 0; i < n; i ++ ) {\n\n\t\tconst info = gl.getActiveAttrib( program, i );\n\t\tconst name = info.name;\n\n\t\tlet locationSize = 1;\n\t\tif ( info.type === 35674 ) locationSize = 2;\n\t\tif ( info.type === 35675 ) locationSize = 3;\n\t\tif ( info.type === 35676 ) locationSize = 4;\n\n\t\t// console.log( 'THREE.WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i );\n\n\t\tattributes[ name ] = {\n\t\t\ttype: info.type,\n\t\t\tlocation: gl.getAttribLocation( program, name ),\n\t\t\tlocationSize: locationSize\n\t\t};\n\n\t}\n\n\treturn attributes;\n\n}\n\nfunction filterEmptyLine( string ) {\n\n\treturn string !== '';\n\n}\n\nfunction replaceLightNums( string, parameters ) {\n\n\tconst numSpotLightCoords = parameters.numSpotLightShadows + parameters.numSpotLightMaps - parameters.numSpotLightShadowsWithMaps;\n\n\treturn string\n\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t.replace( /NUM_SPOT_LIGHT_MAPS/g, parameters.numSpotLightMaps )\n\t\t.replace( /NUM_SPOT_LIGHT_COORDS/g, numSpotLightCoords )\n\t\t.replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights )\n\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights )\n\t\t.replace( /NUM_DIR_LIGHT_SHADOWS/g, parameters.numDirLightShadows )\n\t\t.replace( /NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g, parameters.numSpotLightShadowsWithMaps )\n\t\t.replace( /NUM_SPOT_LIGHT_SHADOWS/g, parameters.numSpotLightShadows )\n\t\t.replace( /NUM_POINT_LIGHT_SHADOWS/g, parameters.numPointLightShadows );\n\n}\n\nfunction replaceClippingPlaneNums( string, parameters ) {\n\n\treturn string\n\t\t.replace( /NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes )\n\t\t.replace( /UNION_CLIPPING_PLANES/g, ( parameters.numClippingPlanes - parameters.numClipIntersection ) );\n\n}\n\n// Resolve Includes\n\nconst includePattern = /^[ \\t]*#include +<([\\w\\d./]+)>/gm;\n\nfunction resolveIncludes( string ) {\n\n\treturn string.replace( includePattern, includeReplacer );\n\n}\n\nfunction includeReplacer( match, include ) {\n\n\tconst string = ShaderChunk[ include ];\n\n\tif ( string === undefined ) {\n\n\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t}\n\n\treturn resolveIncludes( string );\n\n}\n\n// Unroll Loops\n\nconst unrollLoopPattern = /#pragma unroll_loop_start\\s+for\\s*\\(\\s*int\\s+i\\s*=\\s*(\\d+)\\s*;\\s*i\\s*<\\s*(\\d+)\\s*;\\s*i\\s*\\+\\+\\s*\\)\\s*{([\\s\\S]+?)}\\s+#pragma unroll_loop_end/g;\n\nfunction unrollLoops( string ) {\n\n\treturn string.replace( unrollLoopPattern, loopReplacer );\n\n}\n\nfunction loopReplacer( match, start, end, snippet ) {\n\n\tlet string = '';\n\n\tfor ( let i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\tstring += snippet\n\t\t\t.replace( /\\[\\s*i\\s*\\]/g, '[ ' + i + ' ]' )\n\t\t\t.replace( /UNROLLED_LOOP_INDEX/g, i );\n\n\t}\n\n\treturn string;\n\n}\n\n//\n\nfunction generatePrecision( parameters ) {\n\n\tlet precisionstring = 'precision ' + parameters.precision + ' float;\\nprecision ' + parameters.precision + ' int;';\n\n\tif ( parameters.precision === 'highp' ) {\n\n\t\tprecisionstring += '\\n#define HIGH_PRECISION';\n\n\t} else if ( parameters.precision === 'mediump' ) {\n\n\t\tprecisionstring += '\\n#define MEDIUM_PRECISION';\n\n\t} else if ( parameters.precision === 'lowp' ) {\n\n\t\tprecisionstring += '\\n#define LOW_PRECISION';\n\n\t}\n\n\treturn precisionstring;\n\n}\n\nfunction generateShadowMapTypeDefine( parameters ) {\n\n\tlet shadowMapTypeDefine = 'SHADOWMAP_TYPE_BASIC';\n\n\tif ( parameters.shadowMapType === PCFShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF';\n\n\t} else if ( parameters.shadowMapType === PCFSoftShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_PCF_SOFT';\n\n\t} else if ( parameters.shadowMapType === VSMShadowMap ) {\n\n\t\tshadowMapTypeDefine = 'SHADOWMAP_TYPE_VSM';\n\n\t}\n\n\treturn shadowMapTypeDefine;\n\n}\n\nfunction generateEnvMapTypeDefine( parameters ) {\n\n\tlet envMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeReflectionMapping:\n\t\t\tcase CubeRefractionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE';\n\t\t\t\tbreak;\n\n\t\t\tcase CubeUVReflectionMapping:\n\t\t\t\tenvMapTypeDefine = 'ENVMAP_TYPE_CUBE_UV';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapTypeDefine;\n\n}\n\nfunction generateEnvMapModeDefine( parameters ) {\n\n\tlet envMapModeDefine = 'ENVMAP_MODE_REFLECTION';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.envMapMode ) {\n\n\t\t\tcase CubeRefractionMapping:\n\n\t\t\t\tenvMapModeDefine = 'ENVMAP_MODE_REFRACTION';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapModeDefine;\n\n}\n\nfunction generateEnvMapBlendingDefine( parameters ) {\n\n\tlet envMapBlendingDefine = 'ENVMAP_BLENDING_NONE';\n\n\tif ( parameters.envMap ) {\n\n\t\tswitch ( parameters.combine ) {\n\n\t\t\tcase MultiplyOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MULTIPLY';\n\t\t\t\tbreak;\n\n\t\t\tcase MixOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_MIX';\n\t\t\t\tbreak;\n\n\t\t\tcase AddOperation:\n\t\t\t\tenvMapBlendingDefine = 'ENVMAP_BLENDING_ADD';\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\treturn envMapBlendingDefine;\n\n}\n\nfunction generateCubeUVSize( parameters ) {\n\n\tconst imageHeight = parameters.envMapCubeUVHeight;\n\n\tif ( imageHeight === null ) return null;\n\n\tconst maxMip = Math.log2( imageHeight ) - 2;\n\n\tconst texelHeight = 1.0 / imageHeight;\n\n\tconst texelWidth = 1.0 / ( 3 * Math.max( Math.pow( 2, maxMip ), 7 * 16 ) );\n\n\treturn { texelWidth, texelHeight, maxMip };\n\n}\n\nfunction WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {\n\n\t// TODO Send this event to Three.js DevTools\n\t// console.log( 'WebGLProgram', cacheKey );\n\n\tconst gl = renderer.getContext();\n\n\tconst defines = parameters.defines;\n\n\tlet vertexShader = parameters.vertexShader;\n\tlet fragmentShader = parameters.fragmentShader;\n\n\tconst shadowMapTypeDefine = generateShadowMapTypeDefine( parameters );\n\tconst envMapTypeDefine = generateEnvMapTypeDefine( parameters );\n\tconst envMapModeDefine = generateEnvMapModeDefine( parameters );\n\tconst envMapBlendingDefine = generateEnvMapBlendingDefine( parameters );\n\tconst envMapCubeUVSize = generateCubeUVSize( parameters );\n\n\tconst customExtensions = parameters.isWebGL2 ? '' : generateExtensions( parameters );\n\n\tconst customDefines = generateDefines( defines );\n\n\tconst program = gl.createProgram();\n\n\tlet prefixVertex, prefixFragment;\n\tlet versionString = parameters.glslVersion ? '#version ' + parameters.glslVersion + '\\n' : '';\n\n\tif ( parameters.isRawShaderMaterial ) {\n\n\t\tprefixVertex = [\n\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixVertex.length > 0 ) {\n\n\t\t\tprefixVertex += '\\n';\n\n\t\t}\n\n\t\tprefixFragment = [\n\n\t\t\tcustomExtensions,\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixFragment.length > 0 ) {\n\n\t\t\tprefixFragment += '\\n';\n\n\t\t}\n\n\t} else {\n\n\t\tprefixVertex = [\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.instancing ? '#define USE_INSTANCING' : '',\n\t\t\tparameters.instancingColor ? '#define USE_INSTANCING_COLOR' : '',\n\n\t\t\tparameters.supportsVertexTextures ? '#define VERTEX_TEXTURES' : '',\n\n\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t( parameters.useFog && parameters.fogExp2 ) ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.tangentSpaceNormalMap ) ? '#define TANGENTSPACE_NORMALMAP' : '',\n\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.iridescenceMap ? '#define USE_IRIDESCENCEMAP' : '',\n\t\t\tparameters.iridescenceThicknessMap ? '#define USE_IRIDESCENCE_THICKNESSMAP' : '',\n\n\t\t\tparameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULARINTENSITYMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULARCOLORMAP' : '',\n\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEENCOLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEENROUGHNESSMAP' : '',\n\n\t\t\tparameters.vertexTangents ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUvs ? '#define USE_UV' : '',\n\t\t\tparameters.uvsVertexOnly ? '#define UVS_VERTEX_ONLY' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\n\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\t( parameters.morphColors && parameters.isWebGL2 ) ? '#define USE_MORPHCOLORS' : '',\n\t\t\t( parameters.morphTargetsCount > 0 && parameters.isWebGL2 ) ? '#define MORPHTARGETS_TEXTURE' : '',\n\t\t\t( parameters.morphTargetsCount > 0 && parameters.isWebGL2 ) ? '#define MORPHTARGETS_TEXTURE_STRIDE ' + parameters.morphTextureStride : '',\n\t\t\t( parameters.morphTargetsCount > 0 && parameters.isWebGL2 ) ? '#define MORPHTARGETS_COUNT ' + parameters.morphTargetsCount : '',\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t( parameters.logarithmicDepthBuffer && parameters.rendererExtensionFragDepth ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t'#ifdef USE_INSTANCING',\n\n\t\t\t'\tattribute mat4 instanceMatrix;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_INSTANCING_COLOR',\n\n\t\t\t'\tattribute vec3 instanceColor;',\n\n\t\t\t'#endif',\n\n\t\t\t'attribute vec3 position;',\n\t\t\t'attribute vec3 normal;',\n\t\t\t'attribute vec2 uv;',\n\n\t\t\t'#ifdef USE_TANGENT',\n\n\t\t\t'\tattribute vec4 tangent;',\n\n\t\t\t'#endif',\n\n\t\t\t'#if defined( USE_COLOR_ALPHA )',\n\n\t\t\t'\tattribute vec4 color;',\n\n\t\t\t'#elif defined( USE_COLOR )',\n\n\t\t\t'\tattribute vec3 color;',\n\n\t\t\t'#endif',\n\n\t\t\t'#if ( defined( USE_MORPHTARGETS ) && ! defined( MORPHTARGETS_TEXTURE ) )',\n\n\t\t\t'\tattribute vec3 morphTarget0;',\n\t\t\t'\tattribute vec3 morphTarget1;',\n\t\t\t'\tattribute vec3 morphTarget2;',\n\t\t\t'\tattribute vec3 morphTarget3;',\n\n\t\t\t'\t#ifdef USE_MORPHNORMALS',\n\n\t\t\t'\t\tattribute vec3 morphNormal0;',\n\t\t\t'\t\tattribute vec3 morphNormal1;',\n\t\t\t'\t\tattribute vec3 morphNormal2;',\n\t\t\t'\t\tattribute vec3 morphNormal3;',\n\n\t\t\t'\t#else',\n\n\t\t\t'\t\tattribute vec3 morphTarget4;',\n\t\t\t'\t\tattribute vec3 morphTarget5;',\n\t\t\t'\t\tattribute vec3 morphTarget6;',\n\t\t\t'\t\tattribute vec3 morphTarget7;',\n\n\t\t\t'\t#endif',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t'#endif',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tprefixFragment = [\n\n\t\t\tcustomExtensions,\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\t( parameters.useFog && parameters.fog ) ? '#define USE_FOG' : '',\n\t\t\t( parameters.useFog && parameters.fogExp2 ) ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.matcap ? '#define USE_MATCAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_TEXEL_WIDTH ' + envMapCubeUVSize.texelWidth : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_TEXEL_HEIGHT ' + envMapCubeUVSize.texelHeight : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_MAX_MIP ' + envMapCubeUVSize.maxMip + '.0' : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '',\n\t\t\t( parameters.normalMap && parameters.tangentSpaceNormalMap ) ? '#define TANGENTSPACE_NORMALMAP' : '',\n\n\t\t\tparameters.clearcoat ? '#define USE_CLEARCOAT' : '',\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.iridescence ? '#define USE_IRIDESCENCE' : '',\n\t\t\tparameters.iridescenceMap ? '#define USE_IRIDESCENCEMAP' : '',\n\t\t\tparameters.iridescenceThicknessMap ? '#define USE_IRIDESCENCE_THICKNESSMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULARINTENSITYMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULARCOLORMAP' : '',\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\tparameters.alphaTest ? '#define USE_ALPHATEST' : '',\n\n\t\t\tparameters.sheen ? '#define USE_SHEEN' : '',\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEENCOLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEENROUGHNESSMAP' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.decodeVideoTexture ? '#define DECODE_VIDEO_TEXTURE' : '',\n\n\t\t\tparameters.vertexTangents ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors || parameters.instancingColor ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUvs ? '#define USE_UV' : '',\n\t\t\tparameters.uvsVertexOnly ? '#define UVS_VERTEX_ONLY' : '',\n\n\t\t\tparameters.gradientMap ? '#define USE_GRADIENTMAP' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '',\n\n\t\t\tparameters.physicallyCorrectLights ? '#define PHYSICALLY_CORRECT_LIGHTS' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGDEPTHBUF' : '',\n\t\t\t( parameters.logarithmicDepthBuffer && parameters.rendererExtensionFragDepth ) ? '#define USE_LOGDEPTHBUF_EXT' : '',\n\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? '#define TONE_MAPPING' : '',\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '',\n\n\t\t\tparameters.dithering ? '#define DITHERING' : '',\n\t\t\tparameters.opaque ? '#define OPAQUE' : '',\n\n\t\t\tShaderChunk[ 'encodings_pars_fragment' ], // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\tgetTexelEncodingFunction( 'linearToOutputTexel', parameters.outputEncoding ),\n\n\t\t\tparameters.useDepthPacking ? '#define DEPTH_PACKING ' + parameters.depthPacking : '',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tvertexShader = resolveIncludes( vertexShader );\n\tvertexShader = replaceLightNums( vertexShader, parameters );\n\tvertexShader = replaceClippingPlaneNums( vertexShader, parameters );\n\n\tfragmentShader = resolveIncludes( fragmentShader );\n\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\tfragmentShader = replaceClippingPlaneNums( fragmentShader, parameters );\n\n\tvertexShader = unrollLoops( vertexShader );\n\tfragmentShader = unrollLoops( fragmentShader );\n\n\tif ( parameters.isWebGL2 && parameters.isRawShaderMaterial !== true ) {\n\n\t\t// GLSL 3.0 conversion for built-in materials and ShaderMaterial\n\n\t\tversionString = '#version 300 es\\n';\n\n\t\tprefixVertex = [\n\t\t\t'precision mediump sampler2DArray;',\n\t\t\t'#define attribute in',\n\t\t\t'#define varying out',\n\t\t\t'#define texture2D texture'\n\t\t].join( '\\n' ) + '\\n' + prefixVertex;\n\n\t\tprefixFragment = [\n\t\t\t'#define varying in',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : 'layout(location = 0) out highp vec4 pc_fragColor;',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : '#define gl_FragColor pc_fragColor',\n\t\t\t'#define gl_FragDepthEXT gl_FragDepth',\n\t\t\t'#define texture2D texture',\n\t\t\t'#define textureCube texture',\n\t\t\t'#define texture2DProj textureProj',\n\t\t\t'#define texture2DLodEXT textureLod',\n\t\t\t'#define texture2DProjLodEXT textureProjLod',\n\t\t\t'#define textureCubeLodEXT textureLod',\n\t\t\t'#define texture2DGradEXT textureGrad',\n\t\t\t'#define texture2DProjGradEXT textureProjGrad',\n\t\t\t'#define textureCubeGradEXT textureGrad'\n\t\t].join( '\\n' ) + '\\n' + prefixFragment;\n\n\t}\n\n\tconst vertexGlsl = versionString + prefixVertex + vertexShader;\n\tconst fragmentGlsl = versionString + prefixFragment + fragmentShader;\n\n\t// console.log( '*VERTEX*', vertexGlsl );\n\t// console.log( '*FRAGMENT*', fragmentGlsl );\n\n\tconst glVertexShader = WebGLShader( gl, 35633, vertexGlsl );\n\tconst glFragmentShader = WebGLShader( gl, 35632, fragmentGlsl );\n\n\tgl.attachShader( program, glVertexShader );\n\tgl.attachShader( program, glFragmentShader );\n\n\t// Force a particular attribute to index 0.\n\n\tif ( parameters.index0AttributeName !== undefined ) {\n\n\t\tgl.bindAttribLocation( program, 0, parameters.index0AttributeName );\n\n\t} else if ( parameters.morphTargets === true ) {\n\n\t\t// programs with morphTargets displace position out of attribute 0\n\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t}\n\n\tgl.linkProgram( program );\n\n\t// check for link errors\n\tif ( renderer.debug.checkShaderErrors ) {\n\n\t\tconst programLog = gl.getProgramInfoLog( program ).trim();\n\t\tconst vertexLog = gl.getShaderInfoLog( glVertexShader ).trim();\n\t\tconst fragmentLog = gl.getShaderInfoLog( glFragmentShader ).trim();\n\n\t\tlet runnable = true;\n\t\tlet haveDiagnostics = true;\n\n\t\tif ( gl.getProgramParameter( program, 35714 ) === false ) {\n\n\t\t\trunnable = false;\n\n\t\t\tconst vertexErrors = getShaderErrors( gl, glVertexShader, 'vertex' );\n\t\t\tconst fragmentErrors = getShaderErrors( gl, glFragmentShader, 'fragment' );\n\n\t\t\tconsole.error(\n\t\t\t\t'THREE.WebGLProgram: Shader Error ' + gl.getError() + ' - ' +\n\t\t\t\t'VALIDATE_STATUS ' + gl.getProgramParameter( program, 35715 ) + '\\n\\n' +\n\t\t\t\t'Program Info Log: ' + programLog + '\\n' +\n\t\t\t\tvertexErrors + '\\n' +\n\t\t\t\tfragmentErrors\n\t\t\t);\n\n\t\t} else if ( programLog !== '' ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLProgram: Program Info Log:', programLog );\n\n\t\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\t\thaveDiagnostics = false;\n\n\t\t}\n\n\t\tif ( haveDiagnostics ) {\n\n\t\t\tthis.diagnostics = {\n\n\t\t\t\trunnable: runnable,\n\n\t\t\t\tprogramLog: programLog,\n\n\t\t\t\tvertexShader: {\n\n\t\t\t\t\tlog: vertexLog,\n\t\t\t\t\tprefix: prefixVertex\n\n\t\t\t\t},\n\n\t\t\t\tfragmentShader: {\n\n\t\t\t\t\tlog: fragmentLog,\n\t\t\t\t\tprefix: prefixFragment\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t}\n\n\t// Clean up\n\n\t// Crashes in iOS9 and iOS10. #18402\n\t// gl.detachShader( program, glVertexShader );\n\t// gl.detachShader( program, glFragmentShader );\n\n\tgl.deleteShader( glVertexShader );\n\tgl.deleteShader( glFragmentShader );\n\n\t// set up caching for uniform locations\n\n\tlet cachedUniforms;\n\n\tthis.getUniforms = function () {\n\n\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\tcachedUniforms = new WebGLUniforms( gl, program );\n\n\t\t}\n\n\t\treturn cachedUniforms;\n\n\t};\n\n\t// set up caching for attribute locations\n\n\tlet cachedAttributes;\n\n\tthis.getAttributes = function () {\n\n\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t\t}\n\n\t\treturn cachedAttributes;\n\n\t};\n\n\t// free resource\n\n\tthis.destroy = function () {\n\n\t\tbindingStates.releaseStatesOfProgram( this );\n\n\t\tgl.deleteProgram( program );\n\t\tthis.program = undefined;\n\n\t};\n\n\t//\n\n\tthis.name = parameters.shaderName;\n\tthis.id = programIdCount ++;\n\tthis.cacheKey = cacheKey;\n\tthis.usedTimes = 1;\n\tthis.program = program;\n\tthis.vertexShader = glVertexShader;\n\tthis.fragmentShader = glFragmentShader;\n\n\treturn this;\n\n}\n\nlet _id = 0;\n\nclass WebGLShaderCache {\n\n\tconstructor() {\n\n\t\tthis.shaderCache = new Map();\n\t\tthis.materialCache = new Map();\n\n\t}\n\n\tupdate( material ) {\n\n\t\tconst vertexShader = material.vertexShader;\n\t\tconst fragmentShader = material.fragmentShader;\n\n\t\tconst vertexShaderStage = this._getShaderStage( vertexShader );\n\t\tconst fragmentShaderStage = this._getShaderStage( fragmentShader );\n\n\t\tconst materialShaders = this._getShaderCacheForMaterial( material );\n\n\t\tif ( materialShaders.has( vertexShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( vertexShaderStage );\n\t\t\tvertexShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\tif ( materialShaders.has( fragmentShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( fragmentShaderStage );\n\t\t\tfragmentShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremove( material ) {\n\n\t\tconst materialShaders = this.materialCache.get( material );\n\n\t\tfor ( const shaderStage of materialShaders ) {\n\n\t\t\tshaderStage.usedTimes --;\n\n\t\t\tif ( shaderStage.usedTimes === 0 ) this.shaderCache.delete( shaderStage.code );\n\n\t\t}\n\n\t\tthis.materialCache.delete( material );\n\n\t\treturn this;\n\n\t}\n\n\tgetVertexShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.vertexShader ).id;\n\n\t}\n\n\tgetFragmentShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.fragmentShader ).id;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shaderCache.clear();\n\t\tthis.materialCache.clear();\n\n\t}\n\n\t_getShaderCacheForMaterial( material ) {\n\n\t\tconst cache = this.materialCache;\n\t\tlet set = cache.get( material );\n\n\t\tif ( set === undefined ) {\n\n\t\t\tset = new Set();\n\t\t\tcache.set( material, set );\n\n\t\t}\n\n\t\treturn set;\n\n\t}\n\n\t_getShaderStage( code ) {\n\n\t\tconst cache = this.shaderCache;\n\t\tlet stage = cache.get( code );\n\n\t\tif ( stage === undefined ) {\n\n\t\t\tstage = new WebGLShaderStage( code );\n\t\t\tcache.set( code, stage );\n\n\t\t}\n\n\t\treturn stage;\n\n\t}\n\n}\n\nclass WebGLShaderStage {\n\n\tconstructor( code ) {\n\n\t\tthis.id = _id ++;\n\n\t\tthis.code = code;\n\t\tthis.usedTimes = 0;\n\n\t}\n\n}\n\nfunction WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping ) {\n\n\tconst _programLayers = new Layers();\n\tconst _customShaders = new WebGLShaderCache();\n\tconst programs = [];\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\tconst logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer;\n\tconst vertexTextures = capabilities.vertexTextures;\n\tlet precision = capabilities.precision;\n\n\tconst shaderIDs = {\n\t\tMeshDepthMaterial: 'depth',\n\t\tMeshDistanceMaterial: 'distanceRGBA',\n\t\tMeshNormalMaterial: 'normal',\n\t\tMeshBasicMaterial: 'basic',\n\t\tMeshLambertMaterial: 'lambert',\n\t\tMeshPhongMaterial: 'phong',\n\t\tMeshToonMaterial: 'toon',\n\t\tMeshStandardMaterial: 'physical',\n\t\tMeshPhysicalMaterial: 'physical',\n\t\tMeshMatcapMaterial: 'matcap',\n\t\tLineBasicMaterial: 'basic',\n\t\tLineDashedMaterial: 'dashed',\n\t\tPointsMaterial: 'points',\n\t\tShadowMaterial: 'shadow',\n\t\tSpriteMaterial: 'sprite'\n\t};\n\n\tfunction getParameters( material, lights, shadows, scene, object ) {\n\n\t\tconst fog = scene.fog;\n\t\tconst geometry = object.geometry;\n\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\n\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\t\tconst envMapCubeUVHeight = ( !! envMap ) && ( envMap.mapping === CubeUVReflectionMapping ) ? envMap.image.height : null;\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\n\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t// (not to blow over maxLights budget)\n\n\t\tif ( material.precision !== null ) {\n\n\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\tlet morphTextureStride = 0;\n\n\t\tif ( geometry.morphAttributes.position !== undefined ) morphTextureStride = 1;\n\t\tif ( geometry.morphAttributes.normal !== undefined ) morphTextureStride = 2;\n\t\tif ( geometry.morphAttributes.color !== undefined ) morphTextureStride = 3;\n\n\t\t//\n\n\t\tlet vertexShader, fragmentShader;\n\t\tlet customVertexShaderID, customFragmentShaderID;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\n\t\t\tvertexShader = shader.vertexShader;\n\t\t\tfragmentShader = shader.fragmentShader;\n\n\t\t} else {\n\n\t\t\tvertexShader = material.vertexShader;\n\t\t\tfragmentShader = material.fragmentShader;\n\n\t\t\t_customShaders.update( material );\n\n\t\t\tcustomVertexShaderID = _customShaders.getVertexShaderID( material );\n\t\t\tcustomFragmentShaderID = _customShaders.getFragmentShaderID( material );\n\n\t\t}\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\tconst useAlphaTest = material.alphaTest > 0;\n\t\tconst useClearcoat = material.clearcoat > 0;\n\t\tconst useIridescence = material.iridescence > 0;\n\n\t\tconst parameters = {\n\n\t\t\tisWebGL2: isWebGL2,\n\n\t\t\tshaderID: shaderID,\n\t\t\tshaderName: material.type,\n\n\t\t\tvertexShader: vertexShader,\n\t\t\tfragmentShader: fragmentShader,\n\t\t\tdefines: material.defines,\n\n\t\t\tcustomVertexShaderID: customVertexShaderID,\n\t\t\tcustomFragmentShaderID: customFragmentShaderID,\n\n\t\t\tisRawShaderMaterial: material.isRawShaderMaterial === true,\n\t\t\tglslVersion: material.glslVersion,\n\n\t\t\tprecision: precision,\n\n\t\t\tinstancing: object.isInstancedMesh === true,\n\t\t\tinstancingColor: object.isInstancedMesh === true && object.instanceColor !== null,\n\n\t\t\tsupportsVertexTextures: vertexTextures,\n\t\t\toutputEncoding: ( currentRenderTarget === null ) ? renderer.outputEncoding : ( currentRenderTarget.isXRRenderTarget === true ? currentRenderTarget.texture.encoding : LinearEncoding ),\n\t\t\tmap: !! material.map,\n\t\t\tmatcap: !! material.matcap,\n\t\t\tenvMap: !! envMap,\n\t\t\tenvMapMode: envMap && envMap.mapping,\n\t\t\tenvMapCubeUVHeight: envMapCubeUVHeight,\n\t\t\tlightMap: !! material.lightMap,\n\t\t\taoMap: !! material.aoMap,\n\t\t\temissiveMap: !! material.emissiveMap,\n\t\t\tbumpMap: !! material.bumpMap,\n\t\t\tnormalMap: !! material.normalMap,\n\t\t\tobjectSpaceNormalMap: material.normalMapType === ObjectSpaceNormalMap,\n\t\t\ttangentSpaceNormalMap: material.normalMapType === TangentSpaceNormalMap,\n\n\t\t\tdecodeVideoTexture: !! material.map && ( material.map.isVideoTexture === true ) && ( material.map.encoding === sRGBEncoding ),\n\n\t\t\tclearcoat: useClearcoat,\n\t\t\tclearcoatMap: useClearcoat && !! material.clearcoatMap,\n\t\t\tclearcoatRoughnessMap: useClearcoat && !! material.clearcoatRoughnessMap,\n\t\t\tclearcoatNormalMap: useClearcoat && !! material.clearcoatNormalMap,\n\n\t\t\tiridescence: useIridescence,\n\t\t\tiridescenceMap: useIridescence && !! material.iridescenceMap,\n\t\t\tiridescenceThicknessMap: useIridescence && !! material.iridescenceThicknessMap,\n\n\t\t\tdisplacementMap: !! material.displacementMap,\n\t\t\troughnessMap: !! material.roughnessMap,\n\t\t\tmetalnessMap: !! material.metalnessMap,\n\t\t\tspecularMap: !! material.specularMap,\n\t\t\tspecularIntensityMap: !! material.specularIntensityMap,\n\t\t\tspecularColorMap: !! material.specularColorMap,\n\n\t\t\topaque: material.transparent === false && material.blending === NormalBlending,\n\n\t\t\talphaMap: !! material.alphaMap,\n\t\t\talphaTest: useAlphaTest,\n\n\t\t\tgradientMap: !! material.gradientMap,\n\n\t\t\tsheen: material.sheen > 0,\n\t\t\tsheenColorMap: !! material.sheenColorMap,\n\t\t\tsheenRoughnessMap: !! material.sheenRoughnessMap,\n\n\t\t\ttransmission: material.transmission > 0,\n\t\t\ttransmissionMap: !! material.transmissionMap,\n\t\t\tthicknessMap: !! material.thicknessMap,\n\n\t\t\tcombine: material.combine,\n\n\t\t\tvertexTangents: ( !! material.normalMap && !! geometry.attributes.tangent ),\n\t\t\tvertexColors: material.vertexColors,\n\t\t\tvertexAlphas: material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4,\n\t\t\tvertexUvs: !! material.map || !! material.bumpMap || !! material.normalMap || !! material.specularMap || !! material.alphaMap || !! material.emissiveMap || !! material.roughnessMap || !! material.metalnessMap || !! material.clearcoatMap || !! material.clearcoatRoughnessMap || !! material.clearcoatNormalMap || !! material.iridescenceMap || !! material.iridescenceThicknessMap || !! material.displacementMap || !! material.transmissionMap || !! material.thicknessMap || !! material.specularIntensityMap || !! material.specularColorMap || !! material.sheenColorMap || !! material.sheenRoughnessMap,\n\t\t\tuvsVertexOnly: ! ( !! material.map || !! material.bumpMap || !! material.normalMap || !! material.specularMap || !! material.alphaMap || !! material.emissiveMap || !! material.roughnessMap || !! material.metalnessMap || !! material.clearcoatNormalMap || !! material.iridescenceMap || !! material.iridescenceThicknessMap || material.transmission > 0 || !! material.transmissionMap || !! material.thicknessMap || !! material.specularIntensityMap || !! material.specularColorMap || material.sheen > 0 || !! material.sheenColorMap || !! material.sheenRoughnessMap ) && !! material.displacementMap,\n\n\t\t\tfog: !! fog,\n\t\t\tuseFog: material.fog === true,\n\t\t\tfogExp2: ( fog && fog.isFogExp2 ),\n\n\t\t\tflatShading: !! material.flatShading,\n\n\t\t\tsizeAttenuation: material.sizeAttenuation,\n\t\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\n\t\t\tskinning: object.isSkinnedMesh === true,\n\n\t\t\tmorphTargets: geometry.morphAttributes.position !== undefined,\n\t\t\tmorphNormals: geometry.morphAttributes.normal !== undefined,\n\t\t\tmorphColors: geometry.morphAttributes.color !== undefined,\n\t\t\tmorphTargetsCount: morphTargetsCount,\n\t\t\tmorphTextureStride: morphTextureStride,\n\n\t\t\tnumDirLights: lights.directional.length,\n\t\t\tnumPointLights: lights.point.length,\n\t\t\tnumSpotLights: lights.spot.length,\n\t\t\tnumSpotLightMaps: lights.spotLightMap.length,\n\t\t\tnumRectAreaLights: lights.rectArea.length,\n\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\tnumDirLightShadows: lights.directionalShadowMap.length,\n\t\t\tnumPointLightShadows: lights.pointShadowMap.length,\n\t\t\tnumSpotLightShadows: lights.spotShadowMap.length,\n\t\t\tnumSpotLightShadowsWithMaps: lights.numSpotLightShadowsWithMaps,\n\n\t\t\tnumClippingPlanes: clipping.numPlanes,\n\t\t\tnumClipIntersection: clipping.numIntersection,\n\n\t\t\tdithering: material.dithering,\n\n\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && shadows.length > 0,\n\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\ttoneMapping: material.toneMapped ? renderer.toneMapping : NoToneMapping,\n\t\t\tphysicallyCorrectLights: renderer.physicallyCorrectLights,\n\n\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\tflipSided: material.side === BackSide,\n\n\t\t\tuseDepthPacking: !! material.depthPacking,\n\t\t\tdepthPacking: material.depthPacking || 0,\n\n\t\t\tindex0AttributeName: material.index0AttributeName,\n\n\t\t\textensionDerivatives: material.extensions && material.extensions.derivatives,\n\t\t\textensionFragDepth: material.extensions && material.extensions.fragDepth,\n\t\t\textensionDrawBuffers: material.extensions && material.extensions.drawBuffers,\n\t\t\textensionShaderTextureLOD: material.extensions && material.extensions.shaderTextureLOD,\n\n\t\t\trendererExtensionFragDepth: isWebGL2 || extensions.has( 'EXT_frag_depth' ),\n\t\t\trendererExtensionDrawBuffers: isWebGL2 || extensions.has( 'WEBGL_draw_buffers' ),\n\t\t\trendererExtensionShaderTextureLod: isWebGL2 || extensions.has( 'EXT_shader_texture_lod' ),\n\n\t\t\tcustomProgramCacheKey: material.customProgramCacheKey()\n\n\t\t};\n\n\t\treturn parameters;\n\n\t}\n\n\tfunction getProgramCacheKey( parameters ) {\n\n\t\tconst array = [];\n\n\t\tif ( parameters.shaderID ) {\n\n\t\t\tarray.push( parameters.shaderID );\n\n\t\t} else {\n\n\t\t\tarray.push( parameters.customVertexShaderID );\n\t\t\tarray.push( parameters.customFragmentShaderID );\n\n\t\t}\n\n\t\tif ( parameters.defines !== undefined ) {\n\n\t\t\tfor ( const name in parameters.defines ) {\n\n\t\t\t\tarray.push( name );\n\t\t\t\tarray.push( parameters.defines[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( parameters.isRawShaderMaterial === false ) {\n\n\t\t\tgetProgramCacheKeyParameters( array, parameters );\n\t\t\tgetProgramCacheKeyBooleans( array, parameters );\n\t\t\tarray.push( renderer.outputEncoding );\n\n\t\t}\n\n\t\tarray.push( parameters.customProgramCacheKey );\n\n\t\treturn array.join();\n\n\t}\n\n\tfunction getProgramCacheKeyParameters( array, parameters ) {\n\n\t\tarray.push( parameters.precision );\n\t\tarray.push( parameters.outputEncoding );\n\t\tarray.push( parameters.envMapMode );\n\t\tarray.push( parameters.envMapCubeUVHeight );\n\t\tarray.push( parameters.combine );\n\t\tarray.push( parameters.vertexUvs );\n\t\tarray.push( parameters.fogExp2 );\n\t\tarray.push( parameters.sizeAttenuation );\n\t\tarray.push( parameters.morphTargetsCount );\n\t\tarray.push( parameters.morphAttributeCount );\n\t\tarray.push( parameters.numDirLights );\n\t\tarray.push( parameters.numPointLights );\n\t\tarray.push( parameters.numSpotLights );\n\t\tarray.push( parameters.numSpotLightMaps );\n\t\tarray.push( parameters.numHemiLights );\n\t\tarray.push( parameters.numRectAreaLights );\n\t\tarray.push( parameters.numDirLightShadows );\n\t\tarray.push( parameters.numPointLightShadows );\n\t\tarray.push( parameters.numSpotLightShadows );\n\t\tarray.push( parameters.numSpotLightShadowsWithMaps );\n\t\tarray.push( parameters.shadowMapType );\n\t\tarray.push( parameters.toneMapping );\n\t\tarray.push( parameters.numClippingPlanes );\n\t\tarray.push( parameters.numClipIntersection );\n\t\tarray.push( parameters.depthPacking );\n\n\t}\n\n\tfunction getProgramCacheKeyBooleans( array, parameters ) {\n\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.isWebGL2 )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.supportsVertexTextures )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.instancing )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.instancingColor )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.map )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.matcap )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.envMap )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.lightMap )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.aoMap )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.emissiveMap )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.bumpMap )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.normalMap )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.objectSpaceNormalMap )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.tangentSpaceNormalMap )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.clearcoat )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.clearcoatMap )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.clearcoatRoughnessMap )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.clearcoatNormalMap )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.iridescence )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.iridescenceMap )\n\t\t\t_programLayers.enable( 19 );\n\t\tif ( parameters.iridescenceThicknessMap )\n\t\t\t_programLayers.enable( 20 );\n\t\tif ( parameters.displacementMap )\n\t\t\t_programLayers.enable( 21 );\n\t\tif ( parameters.specularMap )\n\t\t\t_programLayers.enable( 22 );\n\t\tif ( parameters.roughnessMap )\n\t\t\t_programLayers.enable( 23 );\n\t\tif ( parameters.metalnessMap )\n\t\t\t_programLayers.enable( 24 );\n\t\tif ( parameters.gradientMap )\n\t\t\t_programLayers.enable( 25 );\n\t\tif ( parameters.alphaMap )\n\t\t\t_programLayers.enable( 26 );\n\t\tif ( parameters.alphaTest )\n\t\t\t_programLayers.enable( 27 );\n\t\tif ( parameters.vertexColors )\n\t\t\t_programLayers.enable( 28 );\n\t\tif ( parameters.vertexAlphas )\n\t\t\t_programLayers.enable( 29 );\n\t\tif ( parameters.vertexUvs )\n\t\t\t_programLayers.enable( 30 );\n\t\tif ( parameters.vertexTangents )\n\t\t\t_programLayers.enable( 31 );\n\t\tif ( parameters.uvsVertexOnly )\n\t\t\t_programLayers.enable( 32 );\n\n\t\tarray.push( _programLayers.mask );\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.fog )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.useFog )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.flatShading )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.logarithmicDepthBuffer )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.skinning )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.morphTargets )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.morphNormals )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.morphColors )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.premultipliedAlpha )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.shadowMapEnabled )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.physicallyCorrectLights )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.doubleSided )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.flipSided )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.useDepthPacking )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.dithering )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.specularIntensityMap )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.specularColorMap )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.transmission )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.transmissionMap )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.thicknessMap )\n\t\t\t_programLayers.enable( 19 );\n\t\tif ( parameters.sheen )\n\t\t\t_programLayers.enable( 20 );\n\t\tif ( parameters.sheenColorMap )\n\t\t\t_programLayers.enable( 21 );\n\t\tif ( parameters.sheenRoughnessMap )\n\t\t\t_programLayers.enable( 22 );\n\t\tif ( parameters.decodeVideoTexture )\n\t\t\t_programLayers.enable( 23 );\n\t\tif ( parameters.opaque )\n\t\t\t_programLayers.enable( 24 );\n\n\t\tarray.push( _programLayers.mask );\n\n\t}\n\n\tfunction getUniforms( material ) {\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\t\tlet uniforms;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\t\t\tuniforms = UniformsUtils.clone( shader.uniforms );\n\n\t\t} else {\n\n\t\t\tuniforms = material.uniforms;\n\n\t\t}\n\n\t\treturn uniforms;\n\n\t}\n\n\tfunction acquireProgram( parameters, cacheKey ) {\n\n\t\tlet program;\n\n\t\t// Check if code has been already compiled\n\t\tfor ( let p = 0, pl = programs.length; p < pl; p ++ ) {\n\n\t\t\tconst preexistingProgram = programs[ p ];\n\n\t\t\tif ( preexistingProgram.cacheKey === cacheKey ) {\n\n\t\t\t\tprogram = preexistingProgram;\n\t\t\t\t++ program.usedTimes;\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( program === undefined ) {\n\n\t\t\tprogram = new WebGLProgram( renderer, cacheKey, parameters, bindingStates );\n\t\t\tprograms.push( program );\n\n\t\t}\n\n\t\treturn program;\n\n\t}\n\n\tfunction releaseProgram( program ) {\n\n\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t// Remove from unordered set\n\t\t\tconst i = programs.indexOf( program );\n\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\tprograms.pop();\n\n\t\t\t// Free WebGL resources\n\t\t\tprogram.destroy();\n\n\t\t}\n\n\t}\n\n\tfunction releaseShaderCache( material ) {\n\n\t\t_customShaders.remove( material );\n\n\t}\n\n\tfunction dispose() {\n\n\t\t_customShaders.dispose();\n\n\t}\n\n\treturn {\n\t\tgetParameters: getParameters,\n\t\tgetProgramCacheKey: getProgramCacheKey,\n\t\tgetUniforms: getUniforms,\n\t\tacquireProgram: acquireProgram,\n\t\treleaseProgram: releaseProgram,\n\t\treleaseShaderCache: releaseShaderCache,\n\t\t// Exposed for resource monitoring & error feedback via renderer.info:\n\t\tprograms: programs,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction WebGLProperties() {\n\n\tlet properties = new WeakMap();\n\n\tfunction get( object ) {\n\n\t\tlet map = properties.get( object );\n\n\t\tif ( map === undefined ) {\n\n\t\t\tmap = {};\n\t\t\tproperties.set( object, map );\n\n\t\t}\n\n\t\treturn map;\n\n\t}\n\n\tfunction remove( object ) {\n\n\t\tproperties.delete( object );\n\n\t}\n\n\tfunction update( object, key, value ) {\n\n\t\tproperties.get( object )[ key ] = value;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tproperties = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction painterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.material.id !== b.material.id ) {\n\n\t\treturn a.material.id - b.material.id;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn a.z - b.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\nfunction reversePainterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn b.z - a.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\n\nfunction WebGLRenderList() {\n\n\tconst renderItems = [];\n\tlet renderItemsIndex = 0;\n\n\tconst opaque = [];\n\tconst transmissive = [];\n\tconst transparent = [];\n\n\tfunction init() {\n\n\t\trenderItemsIndex = 0;\n\n\t\topaque.length = 0;\n\t\ttransmissive.length = 0;\n\t\ttransparent.length = 0;\n\n\t}\n\n\tfunction getNextRenderItem( object, geometry, material, groupOrder, z, group ) {\n\n\t\tlet renderItem = renderItems[ renderItemsIndex ];\n\n\t\tif ( renderItem === undefined ) {\n\n\t\t\trenderItem = {\n\t\t\t\tid: object.id,\n\t\t\t\tobject: object,\n\t\t\t\tgeometry: geometry,\n\t\t\t\tmaterial: material,\n\t\t\t\tgroupOrder: groupOrder,\n\t\t\t\trenderOrder: object.renderOrder,\n\t\t\t\tz: z,\n\t\t\t\tgroup: group\n\t\t\t};\n\n\t\t\trenderItems[ renderItemsIndex ] = renderItem;\n\n\t\t} else {\n\n\t\t\trenderItem.id = object.id;\n\t\t\trenderItem.object = object;\n\t\t\trenderItem.geometry = geometry;\n\t\t\trenderItem.material = material;\n\t\t\trenderItem.groupOrder = groupOrder;\n\t\t\trenderItem.renderOrder = object.renderOrder;\n\t\t\trenderItem.z = z;\n\t\t\trenderItem.group = group;\n\n\t\t}\n\n\t\trenderItemsIndex ++;\n\n\t\treturn renderItem;\n\n\t}\n\n\tfunction push( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.push( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.push( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.push( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction unshift( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.unshift( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.unshift( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.unshift( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction sort( customOpaqueSort, customTransparentSort ) {\n\n\t\tif ( opaque.length > 1 ) opaque.sort( customOpaqueSort || painterSortStable );\n\t\tif ( transmissive.length > 1 ) transmissive.sort( customTransparentSort || reversePainterSortStable );\n\t\tif ( transparent.length > 1 ) transparent.sort( customTransparentSort || reversePainterSortStable );\n\n\t}\n\n\tfunction finish() {\n\n\t\t// Clear references from inactive renderItems in the list\n\n\t\tfor ( let i = renderItemsIndex, il = renderItems.length; i < il; i ++ ) {\n\n\t\t\tconst renderItem = renderItems[ i ];\n\n\t\t\tif ( renderItem.id === null ) break;\n\n\t\t\trenderItem.id = null;\n\t\t\trenderItem.object = null;\n\t\t\trenderItem.geometry = null;\n\t\t\trenderItem.material = null;\n\t\t\trenderItem.group = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\topaque: opaque,\n\t\ttransmissive: transmissive,\n\t\ttransparent: transparent,\n\n\t\tinit: init,\n\t\tpush: push,\n\t\tunshift: unshift,\n\t\tfinish: finish,\n\n\t\tsort: sort\n\t};\n\n}\n\nfunction WebGLRenderLists() {\n\n\tlet lists = new WeakMap();\n\n\tfunction get( scene, renderCallDepth ) {\n\n\t\tconst listArray = lists.get( scene );\n\t\tlet list;\n\n\t\tif ( listArray === undefined ) {\n\n\t\t\tlist = new WebGLRenderList();\n\t\t\tlists.set( scene, [ list ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= listArray.length ) {\n\n\t\t\t\tlist = new WebGLRenderList();\n\t\t\t\tlistArray.push( list );\n\n\t\t\t} else {\n\n\t\t\t\tlist = listArray[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn list;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tlists = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction UniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'RectAreaLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\thalfWidth: new Vector3(),\n\t\t\t\t\t\thalfHeight: new Vector3()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\nfunction ShadowUniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2(),\n\t\t\t\t\t\tshadowCameraNear: 1,\n\t\t\t\t\t\tshadowCameraFar: 1000\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\t// TODO (abelnation): set RectAreaLight shadow uniforms\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\n\n\nlet nextVersion = 0;\n\nfunction shadowCastingAndTexturingLightsFirst( lightA, lightB ) {\n\n\treturn ( lightB.castShadow ? 2 : 0 ) - ( lightA.castShadow ? 2 : 0 ) + ( lightB.map ? 1 : 0 ) - ( lightA.map ? 1 : 0 );\n\n}\n\nfunction WebGLLights( extensions, capabilities ) {\n\n\tconst cache = new UniformsCache();\n\n\tconst shadowCache = ShadowUniformsCache();\n\n\tconst state = {\n\n\t\tversion: 0,\n\n\t\thash: {\n\t\t\tdirectionalLength: - 1,\n\t\t\tpointLength: - 1,\n\t\t\tspotLength: - 1,\n\t\t\trectAreaLength: - 1,\n\t\t\themiLength: - 1,\n\n\t\t\tnumDirectionalShadows: - 1,\n\t\t\tnumPointShadows: - 1,\n\t\t\tnumSpotShadows: - 1,\n\t\t\tnumSpotMaps: - 1\n\t\t},\n\n\t\tambient: [ 0, 0, 0 ],\n\t\tprobe: [],\n\t\tdirectional: [],\n\t\tdirectionalShadow: [],\n\t\tdirectionalShadowMap: [],\n\t\tdirectionalShadowMatrix: [],\n\t\tspot: [],\n\t\tspotLightMap: [],\n\t\tspotShadow: [],\n\t\tspotShadowMap: [],\n\t\tspotLightMatrix: [],\n\t\trectArea: [],\n\t\trectAreaLTC1: null,\n\t\trectAreaLTC2: null,\n\t\tpoint: [],\n\t\tpointShadow: [],\n\t\tpointShadowMap: [],\n\t\tpointShadowMatrix: [],\n\t\themi: [],\n\t\tnumSpotLightShadowsWithMaps: 0\n\n\t};\n\n\tfor ( let i = 0; i < 9; i ++ ) state.probe.push( new Vector3() );\n\n\tconst vector3 = new Vector3();\n\tconst matrix4 = new Matrix4();\n\tconst matrix42 = new Matrix4();\n\n\tfunction setup( lights, physicallyCorrectLights ) {\n\n\t\tlet r = 0, g = 0, b = 0;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) state.probe[ i ].set( 0, 0, 0 );\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tlet numDirectionalShadows = 0;\n\t\tlet numPointShadows = 0;\n\t\tlet numSpotShadows = 0;\n\t\tlet numSpotMaps = 0;\n\t\tlet numSpotShadowsWithMaps = 0;\n\n\t\t// ordering : [shadow casting + map texturing, map texturing, shadow casting, none ]\n\t\tlights.sort( shadowCastingAndTexturingLightsFirst );\n\n\t\t// artist-friendly light intensity scaling factor\n\t\tconst scaleFactor = ( physicallyCorrectLights !== true ) ? Math.PI : 1;\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tconst color = light.color;\n\t\t\tconst intensity = light.intensity;\n\t\t\tconst distance = light.distance;\n\n\t\t\tconst shadowMap = ( light.shadow && light.shadow.map ) ? light.shadow.map.texture : null;\n\n\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\tr += color.r * intensity * scaleFactor;\n\t\t\t\tg += color.g * intensity * scaleFactor;\n\t\t\t\tb += color.b * intensity * scaleFactor;\n\n\t\t\t} else if ( light.isLightProbe ) {\n\n\t\t\t\tfor ( let j = 0; j < 9; j ++ ) {\n\n\t\t\t\t\tstate.probe[ j ].addScaledVector( light.sh.coefficients[ j ], intensity );\n\n\t\t\t\t}\n\n\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity * scaleFactor );\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.directionalShadow[ directionalLength ] = shadowUniforms;\n\t\t\t\t\tstate.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\t\tstate.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumDirectionalShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.directional[ directionalLength ] = uniforms;\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity * scaleFactor );\n\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tstate.spot[ spotLength ] = uniforms;\n\n\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\tif ( light.map ) {\n\n\t\t\t\t\tstate.spotLightMap[ numSpotMaps ] = light.map;\n\t\t\t\t\tnumSpotMaps ++;\n\n\t\t\t\t\t// make sure the lightMatrix is up to date\n\t\t\t\t\t// TODO : do it if required only\n\t\t\t\t\tshadow.updateMatrices( light );\n\n\t\t\t\t\tif ( light.castShadow ) numSpotShadowsWithMaps ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.spotLightMatrix[ spotLength ] = shadow.matrix;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.spotShadow[ spotLength ] = shadowUniforms;\n\t\t\t\t\tstate.spotShadowMap[ spotLength ] = shadowMap;\n\n\t\t\t\t\tnumSpotShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tstate.rectArea[ rectAreaLength ] = uniforms;\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity * scaleFactor );\n\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\t\t\t\t\tshadowUniforms.shadowCameraNear = shadow.camera.near;\n\t\t\t\t\tshadowUniforms.shadowCameraFar = shadow.camera.far;\n\n\t\t\t\t\tstate.pointShadow[ pointLength ] = shadowUniforms;\n\t\t\t\t\tstate.pointShadowMap[ pointLength ] = shadowMap;\n\t\t\t\t\tstate.pointShadowMatrix[ pointLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumPointShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.point[ pointLength ] = uniforms;\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity * scaleFactor );\n\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity * scaleFactor );\n\n\t\t\t\tstate.hemi[ hemiLength ] = uniforms;\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( rectAreaLength > 0 ) {\n\n\t\t\tif ( capabilities.isWebGL2 ) {\n\n\t\t\t\t// WebGL 2\n\n\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;\n\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;\n\n\t\t\t} else {\n\n\t\t\t\t// WebGL 1\n\n\t\t\t\tif ( extensions.has( 'OES_texture_float_linear' ) === true ) {\n\n\t\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;\n\t\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;\n\n\t\t\t\t} else if ( extensions.has( 'OES_texture_half_float_linear' ) === true ) {\n\n\t\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_HALF_1;\n\t\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_HALF_2;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer: Unable to use RectAreaLight. Missing WebGL extensions.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.ambient[ 0 ] = r;\n\t\tstate.ambient[ 1 ] = g;\n\t\tstate.ambient[ 2 ] = b;\n\n\t\tconst hash = state.hash;\n\n\t\tif ( hash.directionalLength !== directionalLength ||\n\t\t\thash.pointLength !== pointLength ||\n\t\t\thash.spotLength !== spotLength ||\n\t\t\thash.rectAreaLength !== rectAreaLength ||\n\t\t\thash.hemiLength !== hemiLength ||\n\t\t\thash.numDirectionalShadows !== numDirectionalShadows ||\n\t\t\thash.numPointShadows !== numPointShadows ||\n\t\t\thash.numSpotShadows !== numSpotShadows ||\n\t\t\thash.numSpotMaps !== numSpotMaps ) {\n\n\t\t\tstate.directional.length = directionalLength;\n\t\t\tstate.spot.length = spotLength;\n\t\t\tstate.rectArea.length = rectAreaLength;\n\t\t\tstate.point.length = pointLength;\n\t\t\tstate.hemi.length = hemiLength;\n\n\t\t\tstate.directionalShadow.length = numDirectionalShadows;\n\t\t\tstate.directionalShadowMap.length = numDirectionalShadows;\n\t\t\tstate.pointShadow.length = numPointShadows;\n\t\t\tstate.pointShadowMap.length = numPointShadows;\n\t\t\tstate.spotShadow.length = numSpotShadows;\n\t\t\tstate.spotShadowMap.length = numSpotShadows;\n\t\t\tstate.directionalShadowMatrix.length = numDirectionalShadows;\n\t\t\tstate.pointShadowMatrix.length = numPointShadows;\n\t\t\tstate.spotLightMatrix.length = numSpotShadows + numSpotMaps - numSpotShadowsWithMaps;\n\t\t\tstate.spotLightMap.length = numSpotMaps;\n\t\t\tstate.numSpotLightShadowsWithMaps = numSpotShadowsWithMaps;\n\n\t\t\thash.directionalLength = directionalLength;\n\t\t\thash.pointLength = pointLength;\n\t\t\thash.spotLength = spotLength;\n\t\t\thash.rectAreaLength = rectAreaLength;\n\t\t\thash.hemiLength = hemiLength;\n\n\t\t\thash.numDirectionalShadows = numDirectionalShadows;\n\t\t\thash.numPointShadows = numPointShadows;\n\t\t\thash.numSpotShadows = numSpotShadows;\n\t\t\thash.numSpotMaps = numSpotMaps;\n\n\t\t\tstate.version = nextVersion ++;\n\n\t\t}\n\n\t}\n\n\tfunction setupView( lights, camera ) {\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tconst viewMatrix = camera.matrixWorldInverse;\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tif ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = state.directional[ directionalLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = state.spot[ spotLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = state.rectArea[ rectAreaLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t// extract local rotation of light to derive width/height half vectors\n\t\t\t\tmatrix42.identity();\n\t\t\t\tmatrix4.copy( light.matrixWorld );\n\t\t\t\tmatrix4.premultiply( viewMatrix );\n\t\t\t\tmatrix42.extractRotation( matrix4 );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tuniforms.halfWidth.applyMatrix4( matrix42 );\n\t\t\t\tuniforms.halfHeight.applyMatrix4( matrix42 );\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = state.point[ pointLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = state.hemi[ hemiLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tsetup: setup,\n\t\tsetupView: setupView,\n\t\tstate: state\n\t};\n\n}\n\nfunction WebGLRenderState( extensions, capabilities ) {\n\n\tconst lights = new WebGLLights( extensions, capabilities );\n\n\tconst lightsArray = [];\n\tconst shadowsArray = [];\n\n\tfunction init() {\n\n\t\tlightsArray.length = 0;\n\t\tshadowsArray.length = 0;\n\n\t}\n\n\tfunction pushLight( light ) {\n\n\t\tlightsArray.push( light );\n\n\t}\n\n\tfunction pushShadow( shadowLight ) {\n\n\t\tshadowsArray.push( shadowLight );\n\n\t}\n\n\tfunction setupLights( physicallyCorrectLights ) {\n\n\t\tlights.setup( lightsArray, physicallyCorrectLights );\n\n\t}\n\n\tfunction setupLightsView( camera ) {\n\n\t\tlights.setupView( lightsArray, camera );\n\n\t}\n\n\tconst state = {\n\t\tlightsArray: lightsArray,\n\t\tshadowsArray: shadowsArray,\n\n\t\tlights: lights\n\t};\n\n\treturn {\n\t\tinit: init,\n\t\tstate: state,\n\t\tsetupLights: setupLights,\n\t\tsetupLightsView: setupLightsView,\n\n\t\tpushLight: pushLight,\n\t\tpushShadow: pushShadow\n\t};\n\n}\n\nfunction WebGLRenderStates( extensions, capabilities ) {\n\n\tlet renderStates = new WeakMap();\n\n\tfunction get( scene, renderCallDepth = 0 ) {\n\n\t\tconst renderStateArray = renderStates.get( scene );\n\t\tlet renderState;\n\n\t\tif ( renderStateArray === undefined ) {\n\n\t\t\trenderState = new WebGLRenderState( extensions, capabilities );\n\t\t\trenderStates.set( scene, [ renderState ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= renderStateArray.length ) {\n\n\t\t\t\trenderState = new WebGLRenderState( extensions, capabilities );\n\t\t\t\trenderStateArray.push( renderState );\n\n\t\t\t} else {\n\n\t\t\t\trenderState = renderStateArray[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn renderState;\n\n\t}\n\n\tfunction dispose() {\n\n\t\trenderStates = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nclass MeshDepthMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshDepthMaterial = true;\n\n\t\tthis.type = 'MeshDepthMaterial';\n\n\t\tthis.depthPacking = BasicDepthPacking;\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.depthPacking = source.depthPacking;\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshDistanceMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshDistanceMaterial = true;\n\n\t\tthis.type = 'MeshDistanceMaterial';\n\n\t\tthis.referencePosition = new Vector3();\n\t\tthis.nearDistance = 1;\n\t\tthis.farDistance = 1000;\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.referencePosition.copy( source.referencePosition );\n\t\tthis.nearDistance = source.nearDistance;\n\t\tthis.farDistance = source.farDistance;\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst vertex = \"void main() {\\n\\tgl_Position = vec4( position, 1.0 );\\n}\";\n\nconst fragment = \"uniform sampler2D shadow_pass;\\nuniform vec2 resolution;\\nuniform float radius;\\n#include <packing>\\nvoid main() {\\n\\tconst float samples = float( VSM_SAMPLES );\\n\\tfloat mean = 0.0;\\n\\tfloat squared_mean = 0.0;\\n\\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\\n\\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\\n\\tfor ( float i = 0.0; i < samples; i ++ ) {\\n\\t\\tfloat uvOffset = uvStart + i * uvStride;\\n\\t\\t#ifdef HORIZONTAL_PASS\\n\\t\\t\\tvec2 distribution = unpackRGBATo2Half( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ) );\\n\\t\\t\\tmean += distribution.x;\\n\\t\\t\\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\\n\\t\\t#else\\n\\t\\t\\tfloat depth = unpackRGBAToDepth( texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ) );\\n\\t\\t\\tmean += depth;\\n\\t\\t\\tsquared_mean += depth * depth;\\n\\t\\t#endif\\n\\t}\\n\\tmean = mean / samples;\\n\\tsquared_mean = squared_mean / samples;\\n\\tfloat std_dev = sqrt( squared_mean - mean * mean );\\n\\tgl_FragColor = pack2HalfToRGBA( vec2( mean, std_dev ) );\\n}\";\n\nfunction WebGLShadowMap( _renderer, _objects, _capabilities ) {\n\n\tlet _frustum = new Frustum();\n\n\tconst _shadowMapSize = new Vector2(),\n\t\t_viewportSize = new Vector2(),\n\n\t\t_viewport = new Vector4(),\n\n\t\t_depthMaterial = new MeshDepthMaterial( { depthPacking: RGBADepthPacking } ),\n\t\t_distanceMaterial = new MeshDistanceMaterial(),\n\n\t\t_materialCache = {},\n\n\t\t_maxTextureSize = _capabilities.maxTextureSize;\n\n\tconst shadowSide = { [ FrontSide ]: BackSide, [ BackSide ]: FrontSide, [ DoubleSide ]: DoubleSide };\n\n\tconst shadowMaterialVertical = new ShaderMaterial( {\n\t\tdefines: {\n\t\t\tVSM_SAMPLES: 8\n\t\t},\n\t\tuniforms: {\n\t\t\tshadow_pass: { value: null },\n\t\t\tresolution: { value: new Vector2() },\n\t\t\tradius: { value: 4.0 }\n\t\t},\n\n\t\tvertexShader: vertex,\n\t\tfragmentShader: fragment\n\n\t} );\n\n\tconst shadowMaterialHorizontal = shadowMaterialVertical.clone();\n\tshadowMaterialHorizontal.defines.HORIZONTAL_PASS = 1;\n\n\tconst fullScreenTri = new BufferGeometry();\n\tfullScreenTri.setAttribute(\n\t\t'position',\n\t\tnew BufferAttribute(\n\t\t\tnew Float32Array( [ - 1, - 1, 0.5, 3, - 1, 0.5, - 1, 3, 0.5 ] ),\n\t\t\t3\n\t\t)\n\t);\n\n\tconst fullScreenMesh = new Mesh( fullScreenTri, shadowMaterialVertical );\n\n\tconst scope = this;\n\n\tthis.enabled = false;\n\n\tthis.autoUpdate = true;\n\tthis.needsUpdate = false;\n\n\tthis.type = PCFShadowMap;\n\n\tthis.render = function ( lights, scene, camera ) {\n\n\t\tif ( scope.enabled === false ) return;\n\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\tif ( lights.length === 0 ) return;\n\n\t\tconst currentRenderTarget = _renderer.getRenderTarget();\n\t\tconst activeCubeFace = _renderer.getActiveCubeFace();\n\t\tconst activeMipmapLevel = _renderer.getActiveMipmapLevel();\n\n\t\tconst _state = _renderer.state;\n\n\t\t// Set GL state for depth map.\n\t\t_state.setBlending( NoBlending );\n\t\t_state.buffers.color.setClear( 1, 1, 1, 1 );\n\t\t_state.buffers.depth.setTest( true );\n\t\t_state.setScissorTest( false );\n\n\t\t// render depth map\n\n\t\tfor ( let i = 0, il = lights.length; i < il; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\t\t\tconst shadow = light.shadow;\n\n\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLShadowMap:', light, 'has no shadow.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( shadow.autoUpdate === false && shadow.needsUpdate === false ) continue;\n\n\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\n\t\t\tconst shadowFrameExtents = shadow.getFrameExtents();\n\n\t\t\t_shadowMapSize.multiply( shadowFrameExtents );\n\n\t\t\t_viewportSize.copy( shadow.mapSize );\n\n\t\t\tif ( _shadowMapSize.x > _maxTextureSize || _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\tif ( _shadowMapSize.x > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.x = Math.floor( _maxTextureSize / shadowFrameExtents.x );\n\t\t\t\t\t_shadowMapSize.x = _viewportSize.x * shadowFrameExtents.x;\n\t\t\t\t\tshadow.mapSize.x = _viewportSize.x;\n\n\t\t\t\t}\n\n\t\t\t\tif ( _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.y = Math.floor( _maxTextureSize / shadowFrameExtents.y );\n\t\t\t\t\t_shadowMapSize.y = _viewportSize.y * shadowFrameExtents.y;\n\t\t\t\t\tshadow.mapSize.y = _viewportSize.y;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( shadow.map === null ) {\n\n\t\t\t\tconst pars = ( this.type !== VSMShadowMap ) ? { minFilter: NearestFilter, magFilter: NearestFilter } : {};\n\n\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, pars );\n\t\t\t\tshadow.map.texture.name = light.name + '.shadowMap';\n\n\t\t\t\tshadow.camera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t\t_renderer.setRenderTarget( shadow.map );\n\t\t\t_renderer.clear();\n\n\t\t\tconst viewportCount = shadow.getViewportCount();\n\n\t\t\tfor ( let vp = 0; vp < viewportCount; vp ++ ) {\n\n\t\t\t\tconst viewport = shadow.getViewport( vp );\n\n\t\t\t\t_viewport.set(\n\t\t\t\t\t_viewportSize.x * viewport.x,\n\t\t\t\t\t_viewportSize.y * viewport.y,\n\t\t\t\t\t_viewportSize.x * viewport.z,\n\t\t\t\t\t_viewportSize.y * viewport.w\n\t\t\t\t);\n\n\t\t\t\t_state.viewport( _viewport );\n\n\t\t\t\tshadow.updateMatrices( light, vp );\n\n\t\t\t\t_frustum = shadow.getFrustum();\n\n\t\t\t\trenderObject( scene, camera, shadow.camera, light, this.type );\n\n\t\t\t}\n\n\t\t\t// do blur pass for VSM\n\n\t\t\tif ( shadow.isPointLightShadow !== true && this.type === VSMShadowMap ) {\n\n\t\t\t\tVSMPass( shadow, camera );\n\n\t\t\t}\n\n\t\t\tshadow.needsUpdate = false;\n\n\t\t}\n\n\t\tscope.needsUpdate = false;\n\n\t\t_renderer.setRenderTarget( currentRenderTarget, activeCubeFace, activeMipmapLevel );\n\n\t};\n\n\tfunction VSMPass( shadow, camera ) {\n\n\t\tconst geometry = _objects.update( fullScreenMesh );\n\n\t\tif ( shadowMaterialVertical.defines.VSM_SAMPLES !== shadow.blurSamples ) {\n\n\t\t\tshadowMaterialVertical.defines.VSM_SAMPLES = shadow.blurSamples;\n\t\t\tshadowMaterialHorizontal.defines.VSM_SAMPLES = shadow.blurSamples;\n\n\t\t\tshadowMaterialVertical.needsUpdate = true;\n\t\t\tshadowMaterialHorizontal.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( shadow.mapPass === null ) {\n\n\t\t\tshadow.mapPass = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y );\n\n\t\t}\n\n\t\t// vertical pass\n\n\t\tshadowMaterialVertical.uniforms.shadow_pass.value = shadow.map.texture;\n\t\tshadowMaterialVertical.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialVertical.uniforms.radius.value = shadow.radius;\n\t\t_renderer.setRenderTarget( shadow.mapPass );\n\t\t_renderer.clear();\n\t\t_renderer.renderBufferDirect( camera, null, geometry, shadowMaterialVertical, fullScreenMesh, null );\n\n\t\t// horizontal pass\n\n\t\tshadowMaterialHorizontal.uniforms.shadow_pass.value = shadow.mapPass.texture;\n\t\tshadowMaterialHorizontal.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialHorizontal.uniforms.radius.value = shadow.radius;\n\t\t_renderer.setRenderTarget( shadow.map );\n\t\t_renderer.clear();\n\t\t_renderer.renderBufferDirect( camera, null, geometry, shadowMaterialHorizontal, fullScreenMesh, null );\n\n\t}\n\n\tfunction getDepthMaterial( object, material, light, shadowCameraNear, shadowCameraFar, type ) {\n\n\t\tlet result = null;\n\n\t\tconst customMaterial = ( light.isPointLight === true ) ? object.customDistanceMaterial : object.customDepthMaterial;\n\n\t\tif ( customMaterial !== undefined ) {\n\n\t\t\tresult = customMaterial;\n\n\t\t} else {\n\n\t\t\tresult = ( light.isPointLight === true ) ? _distanceMaterial : _depthMaterial;\n\n\t\t\tif ( ( _renderer.localClippingEnabled && material.clipShadows === true && Array.isArray( material.clippingPlanes ) && material.clippingPlanes.length !== 0 ) ||\n\t\t\t\t( material.displacementMap && material.displacementScale !== 0 ) ||\n\t\t\t\t( material.alphaMap && material.alphaTest > 0 ) ||\n\t\t\t\t( material.map && material.alphaTest > 0 ) ) {\n\n\t\t\t\t// in this case we need a unique material instance reflecting the\n\t\t\t\t// appropriate state\n\n\t\t\t\tconst keyA = result.uuid, keyB = material.uuid;\n\n\t\t\t\tlet materialsForVariant = _materialCache[ keyA ];\n\n\t\t\t\tif ( materialsForVariant === undefined ) {\n\n\t\t\t\t\tmaterialsForVariant = {};\n\t\t\t\t\t_materialCache[ keyA ] = materialsForVariant;\n\n\t\t\t\t}\n\n\t\t\t\tlet cachedMaterial = materialsForVariant[ keyB ];\n\n\t\t\t\tif ( cachedMaterial === undefined ) {\n\n\t\t\t\t\tcachedMaterial = result.clone();\n\t\t\t\t\tmaterialsForVariant[ keyB ] = cachedMaterial;\n\n\t\t\t\t}\n\n\t\t\t\tresult = cachedMaterial;\n\n\t\t\t}\n\n\t\t}\n\n\t\tresult.visible = material.visible;\n\t\tresult.wireframe = material.wireframe;\n\n\t\tif ( type === VSMShadowMap ) {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : material.side;\n\n\t\t} else {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : shadowSide[ material.side ];\n\n\t\t}\n\n\t\tresult.alphaMap = material.alphaMap;\n\t\tresult.alphaTest = material.alphaTest;\n\t\tresult.map = material.map;\n\n\t\tresult.clipShadows = material.clipShadows;\n\t\tresult.clippingPlanes = material.clippingPlanes;\n\t\tresult.clipIntersection = material.clipIntersection;\n\n\t\tresult.displacementMap = material.displacementMap;\n\t\tresult.displacementScale = material.displacementScale;\n\t\tresult.displacementBias = material.displacementBias;\n\n\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\tresult.linewidth = material.linewidth;\n\n\t\tif ( light.isPointLight === true && result.isMeshDistanceMaterial === true ) {\n\n\t\t\tresult.referencePosition.setFromMatrixPosition( light.matrixWorld );\n\t\t\tresult.nearDistance = shadowCameraNear;\n\t\t\tresult.farDistance = shadowCameraFar;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tfunction renderObject( object, camera, shadowCamera, light, type ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tconst visible = object.layers.test( camera.layers );\n\n\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\tif ( ( object.castShadow || ( object.receiveShadow && type === VSMShadowMap ) ) && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) {\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\n\t\t\t\tconst geometry = _objects.update( object );\n\t\t\t\tconst material = object.material;\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\tfor ( let k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tconst group = groups[ k ];\n\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, groupMaterial, light, shadowCamera.near, shadowCamera.far, type );\n\n\t\t\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, material, light, shadowCamera.near, shadowCamera.far, type );\n\n\t\t\t\t\t_renderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\trenderObject( children[ i ], camera, shadowCamera, light, type );\n\n\t\t}\n\n\t}\n\n}\n\nfunction WebGLState( gl, extensions, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tfunction ColorBuffer() {\n\n\t\tlet locked = false;\n\n\t\tconst color = new Vector4();\n\t\tlet currentColorMask = null;\n\t\tconst currentColorClear = new Vector4( 0, 0, 0, 0 );\n\n\t\treturn {\n\n\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( r, g, b, a, premultipliedAlpha ) {\n\n\t\t\t\tif ( premultipliedAlpha === true ) {\n\n\t\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t\t}\n\n\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentColorMask = null;\n\t\t\t\tcurrentColorClear.set( - 1, 0, 0, 0 ); // set to invalid state\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction DepthBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentDepthMask = null;\n\t\tlet currentDepthFunc = null;\n\t\tlet currentDepthClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\tenable( 2929 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdisable( 2929 );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( 512 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( 519 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( 513 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( 515 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( 514 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( 518 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( 516 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( 517 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tgl.depthFunc( 515 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentDepthMask = null;\n\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\tcurrentDepthClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction StencilBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentStencilMask = null;\n\t\tlet currentStencilFunc = null;\n\t\tlet currentStencilRef = null;\n\t\tlet currentStencilFuncMask = null;\n\t\tlet currentStencilFail = null;\n\t\tlet currentStencilZFail = null;\n\t\tlet currentStencilZPass = null;\n\t\tlet currentStencilClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( stencilTest ) {\n\n\t\t\t\tif ( ! locked ) {\n\n\t\t\t\t\tif ( stencilTest ) {\n\n\t\t\t\t\t\tenable( 2960 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( 2960 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( stencilMask ) {\n\n\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t currentStencilRef !== stencilRef ||\n\t\t\t\t currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\tif ( currentStencilFail !== stencilFail ||\n\t\t\t\t currentStencilZFail !== stencilZFail ||\n\t\t\t\t currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentStencilMask = null;\n\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\tcurrentStencilRef = null;\n\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\tcurrentStencilFail = null;\n\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t//\n\n\tconst colorBuffer = new ColorBuffer();\n\tconst depthBuffer = new DepthBuffer();\n\tconst stencilBuffer = new StencilBuffer();\n\n\tconst uboBindings = new WeakMap();\n\tconst uboProgramMap = new WeakMap();\n\n\tlet enabledCapabilities = {};\n\n\tlet currentBoundFramebuffers = {};\n\tlet currentDrawbuffers = new WeakMap();\n\tlet defaultDrawbuffers = [];\n\n\tlet currentProgram = null;\n\n\tlet currentBlendingEnabled = false;\n\tlet currentBlending = null;\n\tlet currentBlendEquation = null;\n\tlet currentBlendSrc = null;\n\tlet currentBlendDst = null;\n\tlet currentBlendEquationAlpha = null;\n\tlet currentBlendSrcAlpha = null;\n\tlet currentBlendDstAlpha = null;\n\tlet currentPremultipledAlpha = false;\n\n\tlet currentFlipSided = null;\n\tlet currentCullFace = null;\n\n\tlet currentLineWidth = null;\n\n\tlet currentPolygonOffsetFactor = null;\n\tlet currentPolygonOffsetUnits = null;\n\n\tconst maxTextures = gl.getParameter( 35661 );\n\n\tlet lineWidthAvailable = false;\n\tlet version = 0;\n\tconst glVersion = gl.getParameter( 7938 );\n\n\tif ( glVersion.indexOf( 'WebGL' ) !== - 1 ) {\n\n\t\tversion = parseFloat( /^WebGL (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 1.0 );\n\n\t} else if ( glVersion.indexOf( 'OpenGL ES' ) !== - 1 ) {\n\n\t\tversion = parseFloat( /^OpenGL ES (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 2.0 );\n\n\t}\n\n\tlet currentTextureSlot = null;\n\tlet currentBoundTextures = {};\n\n\tconst scissorParam = gl.getParameter( 3088 );\n\tconst viewportParam = gl.getParameter( 2978 );\n\n\tconst currentScissor = new Vector4().fromArray( scissorParam );\n\tconst currentViewport = new Vector4().fromArray( viewportParam );\n\n\tfunction createTexture( type, target, count ) {\n\n\t\tconst data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\tconst texture = gl.createTexture();\n\n\t\tgl.bindTexture( type, texture );\n\t\tgl.texParameteri( type, 10241, 9728 );\n\t\tgl.texParameteri( type, 10240, 9728 );\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tgl.texImage2D( target + i, 0, 6408, 1, 1, 0, 6408, 5121, data );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tconst emptyTextures = {};\n\temptyTextures[ 3553 ] = createTexture( 3553, 3553, 1 );\n\temptyTextures[ 34067 ] = createTexture( 34067, 34069, 6 );\n\n\t// init\n\n\tcolorBuffer.setClear( 0, 0, 0, 1 );\n\tdepthBuffer.setClear( 1 );\n\tstencilBuffer.setClear( 0 );\n\n\tenable( 2929 );\n\tdepthBuffer.setFunc( LessEqualDepth );\n\n\tsetFlipSided( false );\n\tsetCullFace( CullFaceBack );\n\tenable( 2884 );\n\n\tsetBlending( NoBlending );\n\n\t//\n\n\tfunction enable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== true ) {\n\n\t\t\tgl.enable( id );\n\t\t\tenabledCapabilities[ id ] = true;\n\n\t\t}\n\n\t}\n\n\tfunction disable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== false ) {\n\n\t\t\tgl.disable( id );\n\t\t\tenabledCapabilities[ id ] = false;\n\n\t\t}\n\n\t}\n\n\tfunction bindFramebuffer( target, framebuffer ) {\n\n\t\tif ( currentBoundFramebuffers[ target ] !== framebuffer ) {\n\n\t\t\tgl.bindFramebuffer( target, framebuffer );\n\n\t\t\tcurrentBoundFramebuffers[ target ] = framebuffer;\n\n\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\t// 36009 is equivalent to 36160\n\n\t\t\t\tif ( target === 36009 ) {\n\n\t\t\t\t\tcurrentBoundFramebuffers[ 36160 ] = framebuffer;\n\n\t\t\t\t}\n\n\t\t\t\tif ( target === 36160 ) {\n\n\t\t\t\t\tcurrentBoundFramebuffers[ 36009 ] = framebuffer;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction drawBuffers( renderTarget, framebuffer ) {\n\n\t\tlet drawBuffers = defaultDrawbuffers;\n\n\t\tlet needsUpdate = false;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tdrawBuffers = currentDrawbuffers.get( framebuffer );\n\n\t\t\tif ( drawBuffers === undefined ) {\n\n\t\t\t\tdrawBuffers = [];\n\t\t\t\tcurrentDrawbuffers.set( framebuffer, drawBuffers );\n\n\t\t\t}\n\n\t\t\tif ( renderTarget.isWebGLMultipleRenderTargets ) {\n\n\t\t\t\tconst textures = renderTarget.texture;\n\n\t\t\t\tif ( drawBuffers.length !== textures.length || drawBuffers[ 0 ] !== 36064 ) {\n\n\t\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tdrawBuffers[ i ] = 36064 + i;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tdrawBuffers.length = textures.length;\n\n\t\t\t\t\tneedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( drawBuffers[ 0 ] !== 36064 ) {\n\n\t\t\t\t\tdrawBuffers[ 0 ] = 36064;\n\n\t\t\t\t\tneedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( drawBuffers[ 0 ] !== 1029 ) {\n\n\t\t\t\tdrawBuffers[ 0 ] = 1029;\n\n\t\t\t\tneedsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tif ( capabilities.isWebGL2 ) {\n\n\t\t\t\tgl.drawBuffers( drawBuffers );\n\n\t\t\t} else {\n\n\t\t\t\textensions.get( 'WEBGL_draw_buffers' ).drawBuffersWEBGL( drawBuffers );\n\n\t\t\t}\n\n\t\t}\n\n\n\t}\n\n\tfunction useProgram( program ) {\n\n\t\tif ( currentProgram !== program ) {\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tcurrentProgram = program;\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tconst equationToGL = {\n\t\t[ AddEquation ]: 32774,\n\t\t[ SubtractEquation ]: 32778,\n\t\t[ ReverseSubtractEquation ]: 32779\n\t};\n\n\tif ( isWebGL2 ) {\n\n\t\tequationToGL[ MinEquation ] = 32775;\n\t\tequationToGL[ MaxEquation ] = 32776;\n\n\t} else {\n\n\t\tconst extension = extensions.get( 'EXT_blend_minmax' );\n\n\t\tif ( extension !== null ) {\n\n\t\t\tequationToGL[ MinEquation ] = extension.MIN_EXT;\n\t\t\tequationToGL[ MaxEquation ] = extension.MAX_EXT;\n\n\t\t}\n\n\t}\n\n\tconst factorToGL = {\n\t\t[ ZeroFactor ]: 0,\n\t\t[ OneFactor ]: 1,\n\t\t[ SrcColorFactor ]: 768,\n\t\t[ SrcAlphaFactor ]: 770,\n\t\t[ SrcAlphaSaturateFactor ]: 776,\n\t\t[ DstColorFactor ]: 774,\n\t\t[ DstAlphaFactor ]: 772,\n\t\t[ OneMinusSrcColorFactor ]: 769,\n\t\t[ OneMinusSrcAlphaFactor ]: 771,\n\t\t[ OneMinusDstColorFactor ]: 775,\n\t\t[ OneMinusDstAlphaFactor ]: 773\n\t};\n\n\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) {\n\n\t\tif ( blending === NoBlending ) {\n\n\t\t\tif ( currentBlendingEnabled === true ) {\n\n\t\t\t\tdisable( 3042 );\n\t\t\t\tcurrentBlendingEnabled = false;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( currentBlendingEnabled === false ) {\n\n\t\t\tenable( 3042 );\n\t\t\tcurrentBlendingEnabled = true;\n\n\t\t}\n\n\t\tif ( blending !== CustomBlending ) {\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tif ( currentBlendEquation !== AddEquation || currentBlendEquationAlpha !== AddEquation ) {\n\n\t\t\t\t\tgl.blendEquation( 32774 );\n\n\t\t\t\t\tcurrentBlendEquation = AddEquation;\n\t\t\t\t\tcurrentBlendEquationAlpha = AddEquation;\n\n\t\t\t\t}\n\n\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( 1, 771, 1, 771 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( 1, 1 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( 0, 769, 0, 1 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( 0, 768, 0, 770 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( 770, 771, 1, 771 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( 770, 1 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( 0, 769, 0, 1 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFunc( 0, 768 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrentBlendSrc = null;\n\t\t\t\tcurrentBlendDst = null;\n\t\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\t\tcurrentBlendDstAlpha = null;\n\n\t\t\t\tcurrentBlending = blending;\n\t\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// custom blending\n\n\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\tgl.blendEquationSeparate( equationToGL[ blendEquation ], equationToGL[ blendEquationAlpha ] );\n\n\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t}\n\n\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\tgl.blendFuncSeparate( factorToGL[ blendSrc ], factorToGL[ blendDst ], factorToGL[ blendSrcAlpha ], factorToGL[ blendDstAlpha ] );\n\n\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\tcurrentBlendDst = blendDst;\n\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t}\n\n\t\tcurrentBlending = blending;\n\t\tcurrentPremultipledAlpha = false;\n\n\t}\n\n\tfunction setMaterial( material, frontFaceCW ) {\n\n\t\tmaterial.side === DoubleSide\n\t\t\t? disable( 2884 )\n\t\t\t: enable( 2884 );\n\n\t\tlet flipSided = ( material.side === BackSide );\n\t\tif ( frontFaceCW ) flipSided = ! flipSided;\n\n\t\tsetFlipSided( flipSided );\n\n\t\t( material.blending === NormalBlending && material.transparent === false )\n\t\t\t? setBlending( NoBlending )\n\t\t\t: setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha );\n\n\t\tdepthBuffer.setFunc( material.depthFunc );\n\t\tdepthBuffer.setTest( material.depthTest );\n\t\tdepthBuffer.setMask( material.depthWrite );\n\t\tcolorBuffer.setMask( material.colorWrite );\n\n\t\tconst stencilWrite = material.stencilWrite;\n\t\tstencilBuffer.setTest( stencilWrite );\n\t\tif ( stencilWrite ) {\n\n\t\t\tstencilBuffer.setMask( material.stencilWriteMask );\n\t\t\tstencilBuffer.setFunc( material.stencilFunc, material.stencilRef, material.stencilFuncMask );\n\t\t\tstencilBuffer.setOp( material.stencilFail, material.stencilZFail, material.stencilZPass );\n\n\t\t}\n\n\t\tsetPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t\tmaterial.alphaToCoverage === true\n\t\t\t? enable( 32926 )\n\t\t\t: disable( 32926 );\n\n\t}\n\n\t//\n\n\tfunction setFlipSided( flipSided ) {\n\n\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\tif ( flipSided ) {\n\n\t\t\t\tgl.frontFace( 2304 );\n\n\t\t\t} else {\n\n\t\t\t\tgl.frontFace( 2305 );\n\n\t\t\t}\n\n\t\t\tcurrentFlipSided = flipSided;\n\n\t\t}\n\n\t}\n\n\tfunction setCullFace( cullFace ) {\n\n\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\tenable( 2884 );\n\n\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\tgl.cullFace( 1029 );\n\n\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\tgl.cullFace( 1028 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.cullFace( 1032 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( 2884 );\n\n\t\t}\n\n\t\tcurrentCullFace = cullFace;\n\n\t}\n\n\tfunction setLineWidth( width ) {\n\n\t\tif ( width !== currentLineWidth ) {\n\n\t\t\tif ( lineWidthAvailable ) gl.lineWidth( width );\n\n\t\t\tcurrentLineWidth = width;\n\n\t\t}\n\n\t}\n\n\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\tif ( polygonOffset ) {\n\n\t\t\tenable( 32823 );\n\n\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( 32823 );\n\n\t\t}\n\n\t}\n\n\tfunction setScissorTest( scissorTest ) {\n\n\t\tif ( scissorTest ) {\n\n\t\t\tenable( 3089 );\n\n\t\t} else {\n\n\t\t\tdisable( 3089 );\n\n\t\t}\n\n\t}\n\n\t// texture\n\n\tfunction activeTexture( webglSlot ) {\n\n\t\tif ( webglSlot === undefined ) webglSlot = 33984 + maxTextures - 1;\n\n\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\tgl.activeTexture( webglSlot );\n\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t}\n\n\t}\n\n\tfunction bindTexture( webglType, webglTexture, webglSlot ) {\n\n\t\tif ( webglSlot === undefined ) {\n\n\t\t\tif ( currentTextureSlot === null ) {\n\n\t\t\t\twebglSlot = 33984 + maxTextures - 1;\n\n\t\t\t} else {\n\n\t\t\t\twebglSlot = currentTextureSlot;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet boundTexture = currentBoundTextures[ webglSlot ];\n\n\t\tif ( boundTexture === undefined ) {\n\n\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\tcurrentBoundTextures[ webglSlot ] = boundTexture;\n\n\t\t}\n\n\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\t\tgl.activeTexture( webglSlot );\n\t\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t\t}\n\n\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\tboundTexture.type = webglType;\n\t\t\tboundTexture.texture = webglTexture;\n\n\t\t}\n\n\t}\n\n\tfunction unbindTexture() {\n\n\t\tconst boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\tif ( boundTexture !== undefined && boundTexture.type !== undefined ) {\n\n\t\t\tgl.bindTexture( boundTexture.type, null );\n\n\t\t\tboundTexture.type = undefined;\n\t\t\tboundTexture.texture = undefined;\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexImage3D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texSubImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage3D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexSubImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexSubImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexSubImage3D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texStorage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texStorage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage3D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage2D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\tfunction texImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage3D.apply( gl, arguments );\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.error( 'THREE.WebGLState:', error );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction scissor( scissor ) {\n\n\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\tcurrentScissor.copy( scissor );\n\n\t\t}\n\n\t}\n\n\tfunction viewport( viewport ) {\n\n\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\tcurrentViewport.copy( viewport );\n\n\t\t}\n\n\t}\n\n\tfunction updateUBOMapping( uniformsGroup, program ) {\n\n\t\tlet mapping = uboProgramMap.get( program );\n\n\t\tif ( mapping === undefined ) {\n\n\t\t\tmapping = new WeakMap();\n\n\t\t\tuboProgramMap.set( program, mapping );\n\n\t\t}\n\n\t\tlet blockIndex = mapping.get( uniformsGroup );\n\n\t\tif ( blockIndex === undefined ) {\n\n\t\t\tblockIndex = gl.getUniformBlockIndex( program, uniformsGroup.name );\n\n\t\t\tmapping.set( uniformsGroup, blockIndex );\n\n\t\t}\n\n\t}\n\n\tfunction uniformBlockBinding( uniformsGroup, program ) {\n\n\t\tconst mapping = uboProgramMap.get( program );\n\t\tconst blockIndex = mapping.get( uniformsGroup );\n\n\t\tif ( uboBindings.get( program ) !== blockIndex ) {\n\n\t\t\t// bind shader specific block index to global block point\n\t\t\tgl.uniformBlockBinding( program, blockIndex, uniformsGroup.__bindingPointIndex );\n\n\t\t\tuboBindings.set( program, blockIndex );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction reset() {\n\n\t\t// reset state\n\n\t\tgl.disable( 3042 );\n\t\tgl.disable( 2884 );\n\t\tgl.disable( 2929 );\n\t\tgl.disable( 32823 );\n\t\tgl.disable( 3089 );\n\t\tgl.disable( 2960 );\n\t\tgl.disable( 32926 );\n\n\t\tgl.blendEquation( 32774 );\n\t\tgl.blendFunc( 1, 0 );\n\t\tgl.blendFuncSeparate( 1, 0, 1, 0 );\n\n\t\tgl.colorMask( true, true, true, true );\n\t\tgl.clearColor( 0, 0, 0, 0 );\n\n\t\tgl.depthMask( true );\n\t\tgl.depthFunc( 513 );\n\t\tgl.clearDepth( 1 );\n\n\t\tgl.stencilMask( 0xffffffff );\n\t\tgl.stencilFunc( 519, 0, 0xffffffff );\n\t\tgl.stencilOp( 7680, 7680, 7680 );\n\t\tgl.clearStencil( 0 );\n\n\t\tgl.cullFace( 1029 );\n\t\tgl.frontFace( 2305 );\n\n\t\tgl.polygonOffset( 0, 0 );\n\n\t\tgl.activeTexture( 33984 );\n\n\t\tgl.bindFramebuffer( 36160, null );\n\n\t\tif ( isWebGL2 === true ) {\n\n\t\t\tgl.bindFramebuffer( 36009, null );\n\t\t\tgl.bindFramebuffer( 36008, null );\n\n\t\t}\n\n\t\tgl.useProgram( null );\n\n\t\tgl.lineWidth( 1 );\n\n\t\tgl.scissor( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tgl.viewport( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\t// reset internals\n\n\t\tenabledCapabilities = {};\n\n\t\tcurrentTextureSlot = null;\n\t\tcurrentBoundTextures = {};\n\n\t\tcurrentBoundFramebuffers = {};\n\t\tcurrentDrawbuffers = new WeakMap();\n\t\tdefaultDrawbuffers = [];\n\n\t\tcurrentProgram = null;\n\n\t\tcurrentBlendingEnabled = false;\n\t\tcurrentBlending = null;\n\t\tcurrentBlendEquation = null;\n\t\tcurrentBlendSrc = null;\n\t\tcurrentBlendDst = null;\n\t\tcurrentBlendEquationAlpha = null;\n\t\tcurrentBlendSrcAlpha = null;\n\t\tcurrentBlendDstAlpha = null;\n\t\tcurrentPremultipledAlpha = false;\n\n\t\tcurrentFlipSided = null;\n\t\tcurrentCullFace = null;\n\n\t\tcurrentLineWidth = null;\n\n\t\tcurrentPolygonOffsetFactor = null;\n\t\tcurrentPolygonOffsetUnits = null;\n\n\t\tcurrentScissor.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tcurrentViewport.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\tcolorBuffer.reset();\n\t\tdepthBuffer.reset();\n\t\tstencilBuffer.reset();\n\n\t}\n\n\treturn {\n\n\t\tbuffers: {\n\t\t\tcolor: colorBuffer,\n\t\t\tdepth: depthBuffer,\n\t\t\tstencil: stencilBuffer\n\t\t},\n\n\t\tenable: enable,\n\t\tdisable: disable,\n\n\t\tbindFramebuffer: bindFramebuffer,\n\t\tdrawBuffers: drawBuffers,\n\n\t\tuseProgram: useProgram,\n\n\t\tsetBlending: setBlending,\n\t\tsetMaterial: setMaterial,\n\n\t\tsetFlipSided: setFlipSided,\n\t\tsetCullFace: setCullFace,\n\n\t\tsetLineWidth: setLineWidth,\n\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\tsetScissorTest: setScissorTest,\n\n\t\tactiveTexture: activeTexture,\n\t\tbindTexture: bindTexture,\n\t\tunbindTexture: unbindTexture,\n\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\tcompressedTexImage3D: compressedTexImage3D,\n\t\ttexImage2D: texImage2D,\n\t\ttexImage3D: texImage3D,\n\n\t\tupdateUBOMapping: updateUBOMapping,\n\t\tuniformBlockBinding: uniformBlockBinding,\n\n\t\ttexStorage2D: texStorage2D,\n\t\ttexStorage3D: texStorage3D,\n\t\ttexSubImage2D: texSubImage2D,\n\t\ttexSubImage3D: texSubImage3D,\n\t\tcompressedTexSubImage2D: compressedTexSubImage2D,\n\t\tcompressedTexSubImage3D: compressedTexSubImage3D,\n\n\t\tscissor: scissor,\n\t\tviewport: viewport,\n\n\t\treset: reset\n\n\t};\n\n}\n\nfunction WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\tconst maxTextures = capabilities.maxTextures;\n\tconst maxCubemapSize = capabilities.maxCubemapSize;\n\tconst maxTextureSize = capabilities.maxTextureSize;\n\tconst maxSamples = capabilities.maxSamples;\n\tconst multisampledRTTExt = extensions.has( 'WEBGL_multisampled_render_to_texture' ) ? extensions.get( 'WEBGL_multisampled_render_to_texture' ) : null;\n\tconst supportsInvalidateFramebuffer = typeof navigator === 'undefined' ? false : /OculusBrowser/g.test( navigator.userAgent );\n\n\tconst _videoTextures = new WeakMap();\n\tlet _canvas;\n\n\tconst _sources = new WeakMap(); // maps WebglTexture objects to instances of Source\n\n\t// cordova iOS (as of 5.0) still uses UIWebView, which provides OffscreenCanvas,\n\t// also OffscreenCanvas.getContext(\"webgl\"), but not OffscreenCanvas.getContext(\"2d\")!\n\t// Some implementations may only implement OffscreenCanvas partially (e.g. lacking 2d).\n\n\tlet useOffscreenCanvas = false;\n\n\ttry {\n\n\t\tuseOffscreenCanvas = typeof OffscreenCanvas !== 'undefined'\n\t\t\t// eslint-disable-next-line compat/compat\n\t\t\t&& ( new OffscreenCanvas( 1, 1 ).getContext( '2d' ) ) !== null;\n\n\t} catch ( err ) {\n\n\t\t// Ignore any errors\n\n\t}\n\n\tfunction createCanvas( width, height ) {\n\n\t\t// Use OffscreenCanvas when available. Specially needed in web workers\n\n\t\treturn useOffscreenCanvas ?\n\t\t\t// eslint-disable-next-line compat/compat\n\t\t\tnew OffscreenCanvas( width, height ) : createElementNS( 'canvas' );\n\n\t}\n\n\tfunction resizeImage( image, needsPowerOfTwo, needsNewCanvas, maxSize ) {\n\n\t\tlet scale = 1;\n\n\t\t// handle case if texture exceeds max size\n\n\t\tif ( image.width > maxSize || image.height > maxSize ) {\n\n\t\t\tscale = maxSize / Math.max( image.width, image.height );\n\n\t\t}\n\n\t\t// only perform resize if necessary\n\n\t\tif ( scale < 1 || needsPowerOfTwo === true ) {\n\n\t\t\t// only perform resize for certain image types\n\n\t\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t\t\tconst floor = needsPowerOfTwo ? floorPowerOfTwo : Math.floor;\n\n\t\t\t\tconst width = floor( scale * image.width );\n\t\t\t\tconst height = floor( scale * image.height );\n\n\t\t\t\tif ( _canvas === undefined ) _canvas = createCanvas( width, height );\n\n\t\t\t\t// cube textures can't reuse the same canvas\n\n\t\t\t\tconst canvas = needsNewCanvas ? createCanvas( width, height ) : _canvas;\n\n\t\t\t\tcanvas.width = width;\n\t\t\t\tcanvas.height = height;\n\n\t\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, width, height );\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture has been resized from (' + image.width + 'x' + image.height + ') to (' + width + 'x' + height + ').' );\n\n\t\t\t\treturn canvas;\n\n\t\t\t} else {\n\n\t\t\t\tif ( 'data' in image ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Image in DataTexture is too big (' + image.width + 'x' + image.height + ').' );\n\n\t\t\t\t}\n\n\t\t\t\treturn image;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction isPowerOfTwo$1( image ) {\n\n\t\treturn isPowerOfTwo( image.width ) && isPowerOfTwo( image.height );\n\n\t}\n\n\tfunction textureNeedsPowerOfTwo( texture ) {\n\n\t\tif ( isWebGL2 ) return false;\n\n\t\treturn ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) ||\n\t\t\t( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter );\n\n\t}\n\n\tfunction textureNeedsGenerateMipmaps( texture, supportsMips ) {\n\n\t\treturn texture.generateMipmaps && supportsMips &&\n\t\t\ttexture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter;\n\n\t}\n\n\tfunction generateMipmap( target ) {\n\n\t\t_gl.generateMipmap( target );\n\n\t}\n\n\tfunction getInternalFormat( internalFormatName, glFormat, glType, encoding, forceLinearEncoding = false ) {\n\n\t\tif ( isWebGL2 === false ) return glFormat;\n\n\t\tif ( internalFormatName !== null ) {\n\n\t\t\tif ( _gl[ internalFormatName ] !== undefined ) return _gl[ internalFormatName ];\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format \\'' + internalFormatName + '\\'' );\n\n\t\t}\n\n\t\tlet internalFormat = glFormat;\n\n\t\tif ( glFormat === 6403 ) {\n\n\t\t\tif ( glType === 5126 ) internalFormat = 33326;\n\t\t\tif ( glType === 5131 ) internalFormat = 33325;\n\t\t\tif ( glType === 5121 ) internalFormat = 33321;\n\n\t\t}\n\n\t\tif ( glFormat === 33319 ) {\n\n\t\t\tif ( glType === 5126 ) internalFormat = 33328;\n\t\t\tif ( glType === 5131 ) internalFormat = 33327;\n\t\t\tif ( glType === 5121 ) internalFormat = 33323;\n\n\t\t}\n\n\t\tif ( glFormat === 6408 ) {\n\n\t\t\tif ( glType === 5126 ) internalFormat = 34836;\n\t\t\tif ( glType === 5131 ) internalFormat = 34842;\n\t\t\tif ( glType === 5121 ) internalFormat = ( encoding === sRGBEncoding && forceLinearEncoding === false ) ? 35907 : 32856;\n\t\t\tif ( glType === 32819 ) internalFormat = 32854;\n\t\t\tif ( glType === 32820 ) internalFormat = 32855;\n\n\t\t}\n\n\t\tif ( internalFormat === 33325 || internalFormat === 33326 ||\n\t\t\tinternalFormat === 33327 || internalFormat === 33328 ||\n\t\t\tinternalFormat === 34842 || internalFormat === 34836 ) {\n\n\t\t\textensions.get( 'EXT_color_buffer_float' );\n\n\t\t}\n\n\t\treturn internalFormat;\n\n\t}\n\n\tfunction getMipLevels( texture, image, supportsMips ) {\n\n\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) === true || ( texture.isFramebufferTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) ) {\n\n\t\t\treturn Math.log2( Math.max( image.width, image.height ) ) + 1;\n\n\t\t} else if ( texture.mipmaps !== undefined && texture.mipmaps.length > 0 ) {\n\n\t\t\t// user-defined mipmaps\n\n\t\t\treturn texture.mipmaps.length;\n\n\t\t} else if ( texture.isCompressedTexture && Array.isArray( texture.image ) ) {\n\n\t\t\treturn image.mipmaps.length;\n\n\t\t} else {\n\n\t\t\t// texture without mipmaps (only base level)\n\n\t\t\treturn 1;\n\n\t\t}\n\n\t}\n\n\t// Fallback filters for non-power-of-2 textures\n\n\tfunction filterFallback( f ) {\n\n\t\tif ( f === NearestFilter || f === NearestMipmapNearestFilter || f === NearestMipmapLinearFilter ) {\n\n\t\t\treturn 9728;\n\n\t\t}\n\n\t\treturn 9729;\n\n\t}\n\n\t//\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tdeallocateTexture( texture );\n\n\t\tif ( texture.isVideoTexture ) {\n\n\t\t\t_videoTextures.delete( texture );\n\n\t\t}\n\n\t}\n\n\tfunction onRenderTargetDispose( event ) {\n\n\t\tconst renderTarget = event.target;\n\n\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tdeallocateRenderTarget( renderTarget );\n\n\t}\n\n\t//\n\n\tfunction deallocateTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t// check if it's necessary to remove the WebGLTexture object\n\n\t\tconst source = texture.source;\n\t\tconst webglTextures = _sources.get( source );\n\n\t\tif ( webglTextures ) {\n\n\t\t\tconst webglTexture = webglTextures[ textureProperties.__cacheKey ];\n\t\t\twebglTexture.usedTimes --;\n\n\t\t\t// the WebGLTexture object is not used anymore, remove it\n\n\t\t\tif ( webglTexture.usedTimes === 0 ) {\n\n\t\t\t\tdeleteTexture( texture );\n\n\t\t\t}\n\n\t\t\t// remove the weak map entry if no WebGLTexture uses the source anymore\n\n\t\t\tif ( Object.keys( webglTextures ).length === 0 ) {\n\n\t\t\t\t_sources.delete( source );\n\n\t\t\t}\n\n\t\t}\n\n\t\tproperties.remove( texture );\n\n\t}\n\n\tfunction deleteTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\tconst source = texture.source;\n\t\tconst webglTextures = _sources.get( source );\n\t\tdelete webglTextures[ textureProperties.__cacheKey ];\n\n\t\tinfo.memory.textures --;\n\n\t}\n\n\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\tconst texture = renderTarget.texture;\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( textureProperties.__webglTexture !== undefined ) {\n\n\t\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\t\tinfo.memory.textures --;\n\n\t\t}\n\n\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t}\n\n\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\t\t\tif ( renderTargetProperties.__webglMultisampledFramebuffer ) _gl.deleteFramebuffer( renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\tif ( renderTargetProperties.__webglColorRenderbuffer ) {\n\n\t\t\t\tfor ( let i = 0; i < renderTargetProperties.__webglColorRenderbuffer.length; i ++ ) {\n\n\t\t\t\t\tif ( renderTargetProperties.__webglColorRenderbuffer[ i ] ) _gl.deleteRenderbuffer( renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( renderTargetProperties.__webglDepthRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthRenderbuffer );\n\n\t\t}\n\n\t\tif ( renderTarget.isWebGLMultipleRenderTargets ) {\n\n\t\t\tfor ( let i = 0, il = texture.length; i < il; i ++ ) {\n\n\t\t\t\tconst attachmentProperties = properties.get( texture[ i ] );\n\n\t\t\t\tif ( attachmentProperties.__webglTexture ) {\n\n\t\t\t\t\t_gl.deleteTexture( attachmentProperties.__webglTexture );\n\n\t\t\t\t\tinfo.memory.textures --;\n\n\t\t\t\t}\n\n\t\t\t\tproperties.remove( texture[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tproperties.remove( texture );\n\t\tproperties.remove( renderTarget );\n\n\t}\n\n\t//\n\n\tlet textureUnits = 0;\n\n\tfunction resetTextureUnits() {\n\n\t\ttextureUnits = 0;\n\n\t}\n\n\tfunction allocateTextureUnit() {\n\n\t\tconst textureUnit = textureUnits;\n\n\t\tif ( textureUnit >= maxTextures ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLTextures: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + maxTextures );\n\n\t\t}\n\n\t\ttextureUnits += 1;\n\n\t\treturn textureUnit;\n\n\t}\n\n\tfunction getTextureCacheKey( texture ) {\n\n\t\tconst array = [];\n\n\t\tarray.push( texture.wrapS );\n\t\tarray.push( texture.wrapT );\n\t\tarray.push( texture.wrapR || 0 );\n\t\tarray.push( texture.magFilter );\n\t\tarray.push( texture.minFilter );\n\t\tarray.push( texture.anisotropy );\n\t\tarray.push( texture.internalFormat );\n\t\tarray.push( texture.format );\n\t\tarray.push( texture.type );\n\t\tarray.push( texture.generateMipmaps );\n\t\tarray.push( texture.premultiplyAlpha );\n\t\tarray.push( texture.flipY );\n\t\tarray.push( texture.unpackAlignment );\n\t\tarray.push( texture.encoding );\n\n\t\treturn array.join();\n\n\t}\n\n\t//\n\n\tfunction setTexture2D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isVideoTexture ) updateVideoTexture( texture );\n\n\t\tif ( texture.isRenderTargetTexture === false && texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tconst image = texture.image;\n\n\t\t\tif ( image === null ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but no image data found.' );\n\n\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture marked for update but image is incomplete' );\n\n\t\t\t} else {\n\n\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindTexture( 3553, textureProperties.__webglTexture, 33984 + slot );\n\n\t}\n\n\tfunction setTexture2DArray( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.bindTexture( 35866, textureProperties.__webglTexture, 33984 + slot );\n\n\t}\n\n\tfunction setTexture3D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.bindTexture( 32879, textureProperties.__webglTexture, 33984 + slot );\n\n\t}\n\n\tfunction setTextureCube( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadCubeTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.bindTexture( 34067, textureProperties.__webglTexture, 33984 + slot );\n\n\t}\n\n\tconst wrappingToGL = {\n\t\t[ RepeatWrapping ]: 10497,\n\t\t[ ClampToEdgeWrapping ]: 33071,\n\t\t[ MirroredRepeatWrapping ]: 33648\n\t};\n\n\tconst filterToGL = {\n\t\t[ NearestFilter ]: 9728,\n\t\t[ NearestMipmapNearestFilter ]: 9984,\n\t\t[ NearestMipmapLinearFilter ]: 9986,\n\n\t\t[ LinearFilter ]: 9729,\n\t\t[ LinearMipmapNearestFilter ]: 9985,\n\t\t[ LinearMipmapLinearFilter ]: 9987\n\t};\n\n\tfunction setTextureParameters( textureType, texture, supportsMips ) {\n\n\t\tif ( supportsMips ) {\n\n\t\t\t_gl.texParameteri( textureType, 10242, wrappingToGL[ texture.wrapS ] );\n\t\t\t_gl.texParameteri( textureType, 10243, wrappingToGL[ texture.wrapT ] );\n\n\t\t\tif ( textureType === 32879 || textureType === 35866 ) {\n\n\t\t\t\t_gl.texParameteri( textureType, 32882, wrappingToGL[ texture.wrapR ] );\n\n\t\t\t}\n\n\t\t\t_gl.texParameteri( textureType, 10240, filterToGL[ texture.magFilter ] );\n\t\t\t_gl.texParameteri( textureType, 10241, filterToGL[ texture.minFilter ] );\n\n\t\t} else {\n\n\t\t\t_gl.texParameteri( textureType, 10242, 33071 );\n\t\t\t_gl.texParameteri( textureType, 10243, 33071 );\n\n\t\t\tif ( textureType === 32879 || textureType === 35866 ) {\n\n\t\t\t\t_gl.texParameteri( textureType, 32882, 33071 );\n\n\t\t\t}\n\n\t\t\tif ( texture.wrapS !== ClampToEdgeWrapping || texture.wrapT !== ClampToEdgeWrapping ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.wrapS and Texture.wrapT should be set to THREE.ClampToEdgeWrapping.' );\n\n\t\t\t}\n\n\t\t\t_gl.texParameteri( textureType, 10240, filterFallback( texture.magFilter ) );\n\t\t\t_gl.texParameteri( textureType, 10241, filterFallback( texture.minFilter ) );\n\n\t\t\tif ( texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture is not power of two. Texture.minFilter should be set to THREE.NearestFilter or THREE.LinearFilter.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tif ( texture.magFilter === NearestFilter ) return;\n\t\t\tif ( texture.minFilter !== NearestMipmapLinearFilter && texture.minFilter !== LinearMipmapLinearFilter ) return;\n\t\t\tif ( texture.type === FloatType && extensions.has( 'OES_texture_float_linear' ) === false ) return; // verify extension for WebGL 1 and WebGL 2\n\t\t\tif ( isWebGL2 === false && ( texture.type === HalfFloatType && extensions.has( 'OES_texture_half_float_linear' ) === false ) ) return; // verify extension for WebGL 1 only\n\n\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction initTexture( textureProperties, texture ) {\n\n\t\tlet forceUpload = false;\n\n\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t}\n\n\t\t// create Source <-> WebGLTextures mapping if necessary\n\n\t\tconst source = texture.source;\n\t\tlet webglTextures = _sources.get( source );\n\n\t\tif ( webglTextures === undefined ) {\n\n\t\t\twebglTextures = {};\n\t\t\t_sources.set( source, webglTextures );\n\n\t\t}\n\n\t\t// check if there is already a WebGLTexture object for the given texture parameters\n\n\t\tconst textureCacheKey = getTextureCacheKey( texture );\n\n\t\tif ( textureCacheKey !== textureProperties.__cacheKey ) {\n\n\t\t\t// if not, create a new instance of WebGLTexture\n\n\t\t\tif ( webglTextures[ textureCacheKey ] === undefined ) {\n\n\t\t\t\t// create new entry\n\n\t\t\t\twebglTextures[ textureCacheKey ] = {\n\t\t\t\t\ttexture: _gl.createTexture(),\n\t\t\t\t\tusedTimes: 0\n\t\t\t\t};\n\n\t\t\t\tinfo.memory.textures ++;\n\n\t\t\t\t// when a new instance of WebGLTexture was created, a texture upload is required\n\t\t\t\t// even if the image contents are identical\n\n\t\t\t\tforceUpload = true;\n\n\t\t\t}\n\n\t\t\twebglTextures[ textureCacheKey ].usedTimes ++;\n\n\t\t\t// every time the texture cache key changes, it's necessary to check if an instance of\n\t\t\t// WebGLTexture can be deleted in order to avoid a memory leak.\n\n\t\t\tconst webglTexture = webglTextures[ textureProperties.__cacheKey ];\n\n\t\t\tif ( webglTexture !== undefined ) {\n\n\t\t\t\twebglTextures[ textureProperties.__cacheKey ].usedTimes --;\n\n\t\t\t\tif ( webglTexture.usedTimes === 0 ) {\n\n\t\t\t\t\tdeleteTexture( texture );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// store references to cache key and WebGLTexture object\n\n\t\t\ttextureProperties.__cacheKey = textureCacheKey;\n\t\t\ttextureProperties.__webglTexture = webglTextures[ textureCacheKey ].texture;\n\n\t\t}\n\n\t\treturn forceUpload;\n\n\t}\n\n\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\tlet textureType = 3553;\n\n\t\tif ( texture.isDataArrayTexture || texture.isCompressedArrayTexture ) textureType = 35866;\n\t\tif ( texture.isData3DTexture ) textureType = 32879;\n\n\t\tconst forceUpload = initTexture( textureProperties, texture );\n\t\tconst source = texture.source;\n\n\t\tstate.bindTexture( textureType, textureProperties.__webglTexture, 33984 + slot );\n\n\t\tconst sourceProperties = properties.get( source );\n\n\t\tif ( source.version !== sourceProperties.__version || forceUpload === true ) {\n\n\t\t\tstate.activeTexture( 33984 + slot );\n\n\t\t\t_gl.pixelStorei( 37440, texture.flipY );\n\t\t\t_gl.pixelStorei( 37441, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( 3317, texture.unpackAlignment );\n\t\t\t_gl.pixelStorei( 37443, 0 );\n\n\t\t\tconst needsPowerOfTwo = textureNeedsPowerOfTwo( texture ) && isPowerOfTwo$1( texture.image ) === false;\n\t\t\tlet image = resizeImage( texture.image, needsPowerOfTwo, false, maxTextureSize );\n\t\t\timage = verifyColorSpace( texture, image );\n\n\t\t\tconst supportsMips = isPowerOfTwo$1( image ) || isWebGL2,\n\t\t\t\tglFormat = utils.convert( texture.format, texture.encoding );\n\n\t\t\tlet glType = utils.convert( texture.type ),\n\t\t\t\tglInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding, texture.isVideoTexture );\n\n\t\t\tsetTextureParameters( textureType, texture, supportsMips );\n\n\t\t\tlet mipmap;\n\t\t\tconst mipmaps = texture.mipmaps;\n\n\t\t\tconst useTexStorage = ( isWebGL2 && texture.isVideoTexture !== true );\n\t\t\tconst allocateMemory = ( sourceProperties.__version === undefined ) || ( forceUpload === true );\n\t\t\tconst levels = getMipLevels( texture, image, supportsMips );\n\n\t\t\tif ( texture.isDepthTexture ) {\n\n\t\t\t\t// populate depth texture with dummy data\n\n\t\t\t\tglInternalFormat = 6402;\n\n\t\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\t\t\tglInternalFormat = 36012;\n\n\t\t\t\t\t} else if ( texture.type === UnsignedIntType ) {\n\n\t\t\t\t\t\tglInternalFormat = 33190;\n\n\t\t\t\t\t} else if ( texture.type === UnsignedInt248Type ) {\n\n\t\t\t\t\t\tglInternalFormat = 35056;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tglInternalFormat = 33189; // WebGL2 requires sized internalformat for glTexImage2D\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( texture.type === FloatType ) {\n\n\t\t\t\t\t\tconsole.error( 'WebGLRenderer: Floating point depth texture requires WebGL2.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// validation checks for WebGL 1\n\n\t\t\t\tif ( texture.format === DepthFormat && glInternalFormat === 6402 ) {\n\n\t\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t\t// DEPTH_COMPONENT and type is not UNSIGNED_SHORT or UNSIGNED_INT\n\t\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\t\tif ( texture.type !== UnsignedShortType && texture.type !== UnsignedIntType ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Use UnsignedShortType or UnsignedIntType for DepthFormat DepthTexture.' );\n\n\t\t\t\t\t\ttexture.type = UnsignedIntType;\n\t\t\t\t\t\tglType = utils.convert( texture.type );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( texture.format === DepthStencilFormat && glInternalFormat === 6402 ) {\n\n\t\t\t\t\t// Depth stencil textures need the DEPTH_STENCIL internal format\n\t\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\t\tglInternalFormat = 34041;\n\n\t\t\t\t\t// The error INVALID_OPERATION is generated by texImage2D if format and internalformat are\n\t\t\t\t\t// DEPTH_STENCIL and type is not UNSIGNED_INT_24_8_WEBGL.\n\t\t\t\t\t// (https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/)\n\t\t\t\t\tif ( texture.type !== UnsignedInt248Type ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Use UnsignedInt248Type for DepthStencilFormat DepthTexture.' );\n\n\t\t\t\t\t\ttexture.type = UnsignedInt248Type;\n\t\t\t\t\t\tglType = utils.convert( texture.type );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t//\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texStorage2D( 3553, 1, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( 3553, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isDataTexture ) {\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 && supportsMips ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( 3553, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( 3553, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( 3553, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\t\tstate.texStorage2D( 3553, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstate.texSubImage2D( 3553, 0, 0, 0, image.width, image.height, glFormat, glType, image.data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( 3553, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isCompressedTexture ) {\n\n\t\t\t\tif ( texture.isCompressedArrayTexture ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( 35866, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage3D( 35866, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, mipmap.data, 0, 0 );\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage3D( 35866, i, glInternalFormat, mipmap.width, mipmap.height, image.depth, 0, mipmap.data, 0, 0 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage3D( 35866, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage3D( 35866, i, glInternalFormat, mipmap.width, mipmap.height, image.depth, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( 3553, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage2D( 3553, i, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( 3553, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( 3553, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( 3553, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isDataArrayTexture ) {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( 35866, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.texSubImage3D( 35866, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage3D( 35866, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isData3DTexture ) {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( 32879, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.texSubImage3D( 32879, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage3D( 32879, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isFramebufferTexture ) {\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texStorage2D( 3553, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tlet width = image.width, height = image.height;\n\n\t\t\t\t\t\tfor ( let i = 0; i < levels; i ++ ) {\n\n\t\t\t\t\t\t\tstate.texImage2D( 3553, i, glInternalFormat, width, height, 0, glFormat, glType, null );\n\n\t\t\t\t\t\t\twidth >>= 1;\n\t\t\t\t\t\t\theight >>= 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// regular Texture (image, video, canvas)\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 && supportsMips ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( 3553, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( 3553, i, 0, 0, glFormat, glType, mipmap );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( 3553, i, glInternalFormat, glFormat, glType, mipmap );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\t\tstate.texStorage2D( 3553, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstate.texSubImage2D( 3553, 0, 0, 0, glFormat, glType, image );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( 3553, 0, glInternalFormat, glFormat, glType, image );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t\tgenerateMipmap( textureType );\n\n\t\t\t}\n\n\t\t\tsourceProperties.__version = source.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t}\n\n\tfunction uploadCubeTexture( textureProperties, texture, slot ) {\n\n\t\tif ( texture.image.length !== 6 ) return;\n\n\t\tconst forceUpload = initTexture( textureProperties, texture );\n\t\tconst source = texture.source;\n\n\t\tstate.bindTexture( 34067, textureProperties.__webglTexture, 33984 + slot );\n\n\t\tconst sourceProperties = properties.get( source );\n\n\t\tif ( source.version !== sourceProperties.__version || forceUpload === true ) {\n\n\t\t\tstate.activeTexture( 33984 + slot );\n\n\t\t\t_gl.pixelStorei( 37440, texture.flipY );\n\t\t\t_gl.pixelStorei( 37441, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( 3317, texture.unpackAlignment );\n\t\t\t_gl.pixelStorei( 37443, 0 );\n\n\t\t\tconst isCompressed = ( texture.isCompressedTexture || texture.image[ 0 ].isCompressedTexture );\n\t\t\tconst isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );\n\n\t\t\tconst cubeImage = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\t\tcubeImage[ i ] = resizeImage( texture.image[ i ], false, true, maxCubemapSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcubeImage[ i ] = verifyColorSpace( texture, cubeImage[ i ] );\n\n\t\t\t}\n\n\t\t\tconst image = cubeImage[ 0 ],\n\t\t\t\tsupportsMips = isPowerOfTwo$1( image ) || isWebGL2,\n\t\t\t\tglFormat = utils.convert( texture.format, texture.encoding ),\n\t\t\t\tglType = utils.convert( texture.type ),\n\t\t\t\tglInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );\n\n\t\t\tconst useTexStorage = ( isWebGL2 && texture.isVideoTexture !== true );\n\t\t\tconst allocateMemory = ( sourceProperties.__version === undefined ) || ( forceUpload === true );\n\t\t\tlet levels = getMipLevels( texture, image, supportsMips );\n\n\t\t\tsetTextureParameters( 34067, texture, supportsMips );\n\n\t\t\tlet mipmaps;\n\n\t\t\tif ( isCompressed ) {\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\tstate.texStorage2D( 34067, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tmipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage2D( 34069 + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( 34069 + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( 34069 + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( 34069 + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tmipmaps = texture.mipmaps;\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t// TODO: Uniformly handle mipmap definitions\n\t\t\t\t\t// Normal textures and compressed cube textures define base level + mips with their mipmap array\n\t\t\t\t\t// Uncompressed cube textures use their mipmap array only for mips (no base level)\n\n\t\t\t\t\tif ( mipmaps.length > 0 ) levels ++;\n\n\t\t\t\t\tstate.texStorage2D( 34067, levels, glInternalFormat, cubeImage[ 0 ].width, cubeImage[ 0 ].height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tif ( isDataTexture ) {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( 34069 + i, 0, 0, 0, cubeImage[ i ].width, cubeImage[ i ].height, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( 34069 + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\t\t\t\t\t\t\tconst mipmapImage = mipmap.image[ i ].image;\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( 34069 + i, j + 1, 0, 0, mipmapImage.width, mipmapImage.height, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( 34069 + i, j + 1, glInternalFormat, mipmapImage.width, mipmapImage.height, 0, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( 34069 + i, 0, 0, 0, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( 34069 + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( 34069 + i, j + 1, 0, 0, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( 34069 + i, j + 1, glInternalFormat, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t\t// We assume images for cube map have the same size.\n\t\t\t\tgenerateMipmap( 34067 );\n\n\t\t\t}\n\n\t\t\tsourceProperties.__version = source.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t}\n\n\t// Render targets\n\n\t// Setup storage for target texture and bind it to correct framebuffer\n\tfunction setupFrameBufferTexture( framebuffer, renderTarget, texture, attachment, textureTarget ) {\n\n\t\tconst glFormat = utils.convert( texture.format, texture.encoding );\n\t\tconst glType = utils.convert( texture.type );\n\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( ! renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\tif ( textureTarget === 32879 || textureTarget === 35866 ) {\n\n\t\t\t\tstate.texImage3D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, renderTarget.depth, 0, glFormat, glType, null );\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage2D( textureTarget, 0, glInternalFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( 36160, framebuffer );\n\n\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( 36160, attachment, textureTarget, properties.get( texture ).__webglTexture, 0, getRenderTargetSamples( renderTarget ) );\n\n\t\t} else if ( textureTarget === 3553 || ( textureTarget >= 34069 && textureTarget <= 34074 ) ) { // see #24753\n\n\t\t\t_gl.framebufferTexture2D( 36160, attachment, textureTarget, properties.get( texture ).__webglTexture, 0 );\n\n\t\t}\n\n\t\tstate.bindFramebuffer( 36160, null );\n\n\t}\n\n\n\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\tfunction setupRenderBufferStorage( renderbuffer, renderTarget, isMultisample ) {\n\n\t\t_gl.bindRenderbuffer( 36161, renderbuffer );\n\n\t\tif ( renderTarget.depthBuffer && ! renderTarget.stencilBuffer ) {\n\n\t\t\tlet glInternalFormat = 33189;\n\n\t\t\tif ( isMultisample || useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tconst depthTexture = renderTarget.depthTexture;\n\n\t\t\t\tif ( depthTexture && depthTexture.isDepthTexture ) {\n\n\t\t\t\t\tif ( depthTexture.type === FloatType ) {\n\n\t\t\t\t\t\tglInternalFormat = 36012;\n\n\t\t\t\t\t} else if ( depthTexture.type === UnsignedIntType ) {\n\n\t\t\t\t\t\tglInternalFormat = 33190;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.renderbufferStorageMultisample( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( 36161, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\t_gl.framebufferRenderbuffer( 36160, 36096, 36161, renderbuffer );\n\n\t\t} else if ( renderTarget.depthBuffer && renderTarget.stencilBuffer ) {\n\n\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\tif ( isMultisample && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\t_gl.renderbufferStorageMultisample( 36161, samples, 35056, renderTarget.width, renderTarget.height );\n\n\t\t\t} else if ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( 36161, samples, 35056, renderTarget.width, renderTarget.height );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( 36161, 34041, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\n\t\t\t_gl.framebufferRenderbuffer( 36160, 33306, 36161, renderbuffer );\n\n\t\t} else {\n\n\t\t\tconst textures = renderTarget.isWebGLMultipleRenderTargets === true ? renderTarget.texture : [ renderTarget.texture ];\n\n\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\tconst texture = textures[ i ];\n\n\t\t\t\tconst glFormat = utils.convert( texture.format, texture.encoding );\n\t\t\t\tconst glType = utils.convert( texture.type );\n\t\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding );\n\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\t\t\tif ( isMultisample && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\t\t_gl.renderbufferStorageMultisample( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else if ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.renderbufferStorage( 36161, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t_gl.bindRenderbuffer( 36161, null );\n\n\t}\n\n\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\tfunction setupDepthTexture( framebuffer, renderTarget ) {\n\n\t\tconst isCube = ( renderTarget && renderTarget.isWebGLCubeRenderTarget );\n\t\tif ( isCube ) throw new Error( 'Depth Texture with cube render targets is not supported' );\n\n\t\tstate.bindFramebuffer( 36160, framebuffer );\n\n\t\tif ( ! ( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) {\n\n\t\t\tthrow new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' );\n\n\t\t}\n\n\t\t// upload an empty depth texture with framebuffer size\n\t\tif ( ! properties.get( renderTarget.depthTexture ).__webglTexture ||\n\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\n\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\n\t\t}\n\n\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\tconst webglDepthTexture = properties.get( renderTarget.depthTexture ).__webglTexture;\n\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( 36160, 36096, 3553, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( 36160, 36096, 3553, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( 36160, 33306, 3553, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( 36160, 33306, 3553, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'Unknown depthTexture format' );\n\n\t\t}\n\n\t}\n\n\t// Setup GL resources for a non-texture depth buffer\n\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\n\t\tif ( renderTarget.depthTexture && ! renderTargetProperties.__autoAllocateDepthBuffer ) {\n\n\t\t\tif ( isCube ) throw new Error( 'target.depthTexture not supported in Cube render targets' );\n\n\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget );\n\n\t\t} else {\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tstate.bindFramebuffer( 36160, renderTargetProperties.__webglFramebuffer[ i ] );\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget, false );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tstate.bindFramebuffer( 36160, renderTargetProperties.__webglFramebuffer );\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget, false );\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( 36160, null );\n\n\t}\n\n\t// rebind framebuffer with external textures\n\tfunction rebindTextures( renderTarget, colorTexture, depthTexture ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( colorTexture !== undefined ) {\n\n\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, renderTarget.texture, 36064, 3553 );\n\n\t\t}\n\n\t\tif ( depthTexture !== undefined ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\t// Set up GL resources for the render target\n\tfunction setupRenderTarget( renderTarget ) {\n\n\t\tconst texture = renderTarget.texture;\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( texture );\n\n\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tif ( renderTarget.isWebGLMultipleRenderTargets !== true ) {\n\n\t\t\tif ( textureProperties.__webglTexture === undefined ) {\n\n\t\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t}\n\n\t\t\ttextureProperties.__version = texture.version;\n\t\t\tinfo.memory.textures ++;\n\n\t\t}\n\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\t\tconst isMultipleRenderTargets = ( renderTarget.isWebGLMultipleRenderTargets === true );\n\t\tconst supportsMips = isPowerOfTwo$1( renderTarget ) || isWebGL2;\n\n\t\t// Setup framebuffer\n\n\t\tif ( isCube ) {\n\n\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\trenderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();\n\n\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\tif ( capabilities.drawBuffers ) {\n\n\t\t\t\t\tconst textures = renderTarget.texture;\n\n\t\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst attachmentProperties = properties.get( textures[ i ] );\n\n\t\t\t\t\t\tif ( attachmentProperties.__webglTexture === undefined ) {\n\n\t\t\t\t\t\t\tattachmentProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t\t\t\t\tinfo.memory.textures ++;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: WebGLMultipleRenderTargets can only be used with WebGL2 or WEBGL_draw_buffers extension.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ( isWebGL2 && renderTarget.samples > 0 ) && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\tconst textures = isMultipleRenderTargets ? texture : [ texture ];\n\n\t\t\t\trenderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer();\n\t\t\t\trenderTargetProperties.__webglColorRenderbuffer = [];\n\n\t\t\t\tstate.bindFramebuffer( 36160, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\tconst texture = textures[ i ];\n\t\t\t\t\trenderTargetProperties.__webglColorRenderbuffer[ i ] = _gl.createRenderbuffer();\n\n\t\t\t\t\t_gl.bindRenderbuffer( 36161, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\tconst glFormat = utils.convert( texture.format, texture.encoding );\n\t\t\t\t\tconst glType = utils.convert( texture.type );\n\t\t\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.encoding, renderTarget.isXRRenderTarget === true );\n\t\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\t\t\t\t\t_gl.renderbufferStorageMultisample( 36161, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t\t_gl.framebufferRenderbuffer( 36160, 36064 + i, 36161, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\t_gl.bindRenderbuffer( 36161, null );\n\n\t\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthRenderbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthRenderbuffer, renderTarget, true );\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( 36160, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Setup color buffer\n\n\t\tif ( isCube ) {\n\n\t\t\tstate.bindTexture( 34067, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( 34067, texture, supportsMips );\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, texture, 36064, 34069 + i );\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t\tgenerateMipmap( 34067 );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else if ( isMultipleRenderTargets ) {\n\n\t\t\tconst textures = renderTarget.texture;\n\n\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\tconst attachment = textures[ i ];\n\t\t\t\tconst attachmentProperties = properties.get( attachment );\n\n\t\t\t\tstate.bindTexture( 3553, attachmentProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( 3553, attachment, supportsMips );\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, attachment, 36064 + i, 3553 );\n\n\t\t\t\tif ( textureNeedsGenerateMipmaps( attachment, supportsMips ) ) {\n\n\t\t\t\t\tgenerateMipmap( 3553 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else {\n\n\t\t\tlet glTextureType = 3553;\n\n\t\t\tif ( renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget ) {\n\n\t\t\t\tif ( isWebGL2 ) {\n\n\t\t\t\t\tglTextureType = renderTarget.isWebGL3DRenderTarget ? 32879 : 35866;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLTextures: THREE.Data3DTexture and THREE.DataArrayTexture only supported with WebGL2.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.bindTexture( glTextureType, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( glTextureType, texture, supportsMips );\n\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, texture, 36064, glTextureType );\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t\tgenerateMipmap( glTextureType );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t}\n\n\t\t// Setup depth and stencil buffers\n\n\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\tconst supportsMips = isPowerOfTwo$1( renderTarget ) || isWebGL2;\n\n\t\tconst textures = renderTarget.isWebGLMultipleRenderTargets === true ? renderTarget.texture : [ renderTarget.texture ];\n\n\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\tconst texture = textures[ i ];\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture, supportsMips ) ) {\n\n\t\t\t\tconst target = renderTarget.isWebGLCubeRenderTarget ? 34067 : 3553;\n\t\t\t\tconst webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\t\tstate.bindTexture( target, webglTexture );\n\t\t\t\tgenerateMipmap( target );\n\t\t\t\tstate.unbindTexture();\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction updateMultisampleRenderTarget( renderTarget ) {\n\n\t\tif ( ( isWebGL2 && renderTarget.samples > 0 ) && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\tconst textures = renderTarget.isWebGLMultipleRenderTargets ? renderTarget.texture : [ renderTarget.texture ];\n\t\t\tconst width = renderTarget.width;\n\t\t\tconst height = renderTarget.height;\n\t\t\tlet mask = 16384;\n\t\t\tconst invalidationArray = [];\n\t\t\tconst depthStyle = renderTarget.stencilBuffer ? 33306 : 36096;\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\t\tconst isMultipleRenderTargets = ( renderTarget.isWebGLMultipleRenderTargets === true );\n\n\t\t\t// If MRT we need to remove FBO attachments\n\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\tstate.bindFramebuffer( 36160, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t\t_gl.framebufferRenderbuffer( 36160, 36064 + i, 36161, null );\n\n\t\t\t\t\tstate.bindFramebuffer( 36160, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\t_gl.framebufferTexture2D( 36009, 36064 + i, 3553, null, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.bindFramebuffer( 36008, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\tstate.bindFramebuffer( 36009, renderTargetProperties.__webglFramebuffer );\n\n\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\tinvalidationArray.push( 36064 + i );\n\n\t\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\tinvalidationArray.push( depthStyle );\n\n\t\t\t\t}\n\n\t\t\t\tconst ignoreDepthValues = ( renderTargetProperties.__ignoreDepthValues !== undefined ) ? renderTargetProperties.__ignoreDepthValues : false;\n\n\t\t\t\tif ( ignoreDepthValues === false ) {\n\n\t\t\t\t\tif ( renderTarget.depthBuffer ) mask |= 256;\n\t\t\t\t\tif ( renderTarget.stencilBuffer ) mask |= 1024;\n\n\t\t\t\t}\n\n\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\t_gl.framebufferRenderbuffer( 36008, 36064, 36161, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ignoreDepthValues === true ) {\n\n\t\t\t\t\t_gl.invalidateFramebuffer( 36008, [ depthStyle ] );\n\t\t\t\t\t_gl.invalidateFramebuffer( 36009, [ depthStyle ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\tconst webglTexture = properties.get( textures[ i ] ).__webglTexture;\n\t\t\t\t\t_gl.framebufferTexture2D( 36009, 36064, 3553, webglTexture, 0 );\n\n\t\t\t\t}\n\n\t\t\t\t_gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, 9728 );\n\n\t\t\t\tif ( supportsInvalidateFramebuffer ) {\n\n\t\t\t\t\t_gl.invalidateFramebuffer( 36008, invalidationArray );\n\n\t\t\t\t}\n\n\n\t\t\t}\n\n\t\t\tstate.bindFramebuffer( 36008, null );\n\t\t\tstate.bindFramebuffer( 36009, null );\n\n\t\t\t// If MRT since pre-blit we removed the FBO we need to reconstruct the attachments\n\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\tstate.bindFramebuffer( 36160, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t\t_gl.framebufferRenderbuffer( 36160, 36064 + i, 36161, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\tconst webglTexture = properties.get( textures[ i ] ).__webglTexture;\n\n\t\t\t\t\tstate.bindFramebuffer( 36160, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\t_gl.framebufferTexture2D( 36009, 36064 + i, 3553, webglTexture, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.bindFramebuffer( 36009, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t}\n\n\t}\n\n\tfunction getRenderTargetSamples( renderTarget ) {\n\n\t\treturn Math.min( maxSamples, renderTarget.samples );\n\n\t}\n\n\tfunction useMultisampledRTT( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\treturn isWebGL2 && renderTarget.samples > 0 && extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true && renderTargetProperties.__useRenderToTexture !== false;\n\n\t}\n\n\tfunction updateVideoTexture( texture ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\t// Check the last frame we updated the VideoTexture\n\n\t\tif ( _videoTextures.get( texture ) !== frame ) {\n\n\t\t\t_videoTextures.set( texture, frame );\n\t\t\ttexture.update();\n\n\t\t}\n\n\t}\n\n\tfunction verifyColorSpace( texture, image ) {\n\n\t\tconst encoding = texture.encoding;\n\t\tconst format = texture.format;\n\t\tconst type = texture.type;\n\n\t\tif ( texture.isCompressedTexture === true || texture.isVideoTexture === true || texture.format === _SRGBAFormat ) return image;\n\n\t\tif ( encoding !== LinearEncoding ) {\n\n\t\t\t// sRGB\n\n\t\t\tif ( encoding === sRGBEncoding ) {\n\n\t\t\t\tif ( isWebGL2 === false ) {\n\n\t\t\t\t\t// in WebGL 1, try to use EXT_sRGB extension and unsized formats\n\n\t\t\t\t\tif ( extensions.has( 'EXT_sRGB' ) === true && format === RGBAFormat ) {\n\n\t\t\t\t\t\ttexture.format = _SRGBAFormat;\n\n\t\t\t\t\t\t// it's not possible to generate mips in WebGL 1 with this extension\n\n\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\t\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// slow fallback (CPU decode)\n\n\t\t\t\t\t\timage = ImageUtils.sRGBToLinear( image );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// in WebGL 2 uncompressed textures can only be sRGB encoded if they have the RGBA8 format\n\n\t\t\t\t\tif ( format !== RGBAFormat || type !== UnsignedByteType ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.WebGLTextures: Unsupported texture encoding:', encoding );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\t//\n\n\tthis.allocateTextureUnit = allocateTextureUnit;\n\tthis.resetTextureUnits = resetTextureUnits;\n\n\tthis.setTexture2D = setTexture2D;\n\tthis.setTexture2DArray = setTexture2DArray;\n\tthis.setTexture3D = setTexture3D;\n\tthis.setTextureCube = setTextureCube;\n\tthis.rebindTextures = rebindTextures;\n\tthis.setupRenderTarget = setupRenderTarget;\n\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\tthis.updateMultisampleRenderTarget = updateMultisampleRenderTarget;\n\tthis.setupDepthRenderbuffer = setupDepthRenderbuffer;\n\tthis.setupFrameBufferTexture = setupFrameBufferTexture;\n\tthis.useMultisampledRTT = useMultisampledRTT;\n\n}\n\nfunction WebGLUtils( gl, extensions, capabilities ) {\n\n\tconst isWebGL2 = capabilities.isWebGL2;\n\n\tfunction convert( p, encoding = null ) {\n\n\t\tlet extension;\n\n\t\tif ( p === UnsignedByteType ) return 5121;\n\t\tif ( p === UnsignedShort4444Type ) return 32819;\n\t\tif ( p === UnsignedShort5551Type ) return 32820;\n\n\t\tif ( p === ByteType ) return 5120;\n\t\tif ( p === ShortType ) return 5122;\n\t\tif ( p === UnsignedShortType ) return 5123;\n\t\tif ( p === IntType ) return 5124;\n\t\tif ( p === UnsignedIntType ) return 5125;\n\t\tif ( p === FloatType ) return 5126;\n\n\t\tif ( p === HalfFloatType ) {\n\n\t\t\tif ( isWebGL2 ) return 5131;\n\n\t\t\textension = extensions.get( 'OES_texture_half_float' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.HALF_FLOAT_OES;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( p === AlphaFormat ) return 6406;\n\t\tif ( p === RGBAFormat ) return 6408;\n\t\tif ( p === LuminanceFormat ) return 6409;\n\t\tif ( p === LuminanceAlphaFormat ) return 6410;\n\t\tif ( p === DepthFormat ) return 6402;\n\t\tif ( p === DepthStencilFormat ) return 34041;\n\n\t\t// WebGL 1 sRGB fallback\n\n\t\tif ( p === _SRGBAFormat ) {\n\n\t\t\textension = extensions.get( 'EXT_sRGB' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.SRGB_ALPHA_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// WebGL2 formats.\n\n\t\tif ( p === RedFormat ) return 6403;\n\t\tif ( p === RedIntegerFormat ) return 36244;\n\t\tif ( p === RGFormat ) return 33319;\n\t\tif ( p === RGIntegerFormat ) return 33320;\n\t\tif ( p === RGBAIntegerFormat ) return 36249;\n\n\t\t// S3TC\n\n\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\n\n\t\t\tif ( encoding === sRGBEncoding ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc_srgb' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// PVRTC\n\n\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ETC1\n\n\t\tif ( p === RGB_ETC1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc1' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.COMPRESSED_RGB_ETC1_WEBGL;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ETC2\n\n\t\tif ( p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_ETC2_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ETC2 : extension.COMPRESSED_RGB8_ETC2;\n\t\t\t\tif ( p === RGBA_ETC2_EAC_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : extension.COMPRESSED_RGBA8_ETC2_EAC;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ASTC\n\n\t\tif ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format ||\n\t\t\tp === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format ||\n\t\t\tp === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format ||\n\t\t\tp === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format ||\n\t\t\tp === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_astc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_ASTC_4x4_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR : extension.COMPRESSED_RGBA_ASTC_4x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x4_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR : extension.COMPRESSED_RGBA_ASTC_5x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x5_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR : extension.COMPRESSED_RGBA_ASTC_5x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x5_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR : extension.COMPRESSED_RGBA_ASTC_6x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x6_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR : extension.COMPRESSED_RGBA_ASTC_6x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x5_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR : extension.COMPRESSED_RGBA_ASTC_8x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x6_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR : extension.COMPRESSED_RGBA_ASTC_8x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x8_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR : extension.COMPRESSED_RGBA_ASTC_8x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x5_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR : extension.COMPRESSED_RGBA_ASTC_10x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x6_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR : extension.COMPRESSED_RGBA_ASTC_10x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x8_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR : extension.COMPRESSED_RGBA_ASTC_10x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x10_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR : extension.COMPRESSED_RGBA_ASTC_10x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x10_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR : extension.COMPRESSED_RGBA_ASTC_12x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x12_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR : extension.COMPRESSED_RGBA_ASTC_12x12_KHR;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// BPTC\n\n\t\tif ( p === RGBA_BPTC_Format ) {\n\n\t\t\textension = extensions.get( 'EXT_texture_compression_bptc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_BPTC_Format ) return ( encoding === sRGBEncoding ) ? extension.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT : extension.COMPRESSED_RGBA_BPTC_UNORM_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// RGTC\n\n\t\tif ( p === RED_RGTC1_Format || p === SIGNED_RED_RGTC1_Format || p === RED_GREEN_RGTC2_Format || p === SIGNED_RED_GREEN_RGTC2_Format ) {\n\n\t\t\textension = extensions.get( 'EXT_texture_compression_rgtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_BPTC_Format ) return extension.COMPRESSED_RED_RGTC1_EXT;\n\t\t\t\tif ( p === SIGNED_RED_RGTC1_Format ) return extension.COMPRESSED_SIGNED_RED_RGTC1_EXT;\n\t\t\t\tif ( p === RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_RED_GREEN_RGTC2_EXT;\n\t\t\t\tif ( p === SIGNED_RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( p === UnsignedInt248Type ) {\n\n\t\t\tif ( isWebGL2 ) return 34042;\n\n\t\t\textension = extensions.get( 'WEBGL_depth_texture' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\treturn extension.UNSIGNED_INT_24_8_WEBGL;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// if \"p\" can't be resolved, assume the user defines a WebGL constant as a string (fallback/workaround for packed RGB formats)\n\n\t\treturn ( gl[ p ] !== undefined ) ? gl[ p ] : null;\n\n\t}\n\n\treturn { convert: convert };\n\n}\n\nclass ArrayCamera extends PerspectiveCamera {\n\n\tconstructor( array = [] ) {\n\n\t\tsuper();\n\n\t\tthis.isArrayCamera = true;\n\n\t\tthis.cameras = array;\n\n\t}\n\n}\n\nclass Group extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isGroup = true;\n\n\t\tthis.type = 'Group';\n\n\t}\n\n}\n\nconst _moveEvent = { type: 'move' };\n\nclass WebXRController {\n\n\tconstructor() {\n\n\t\tthis._targetRay = null;\n\t\tthis._grip = null;\n\t\tthis._hand = null;\n\n\t}\n\n\tgetHandSpace() {\n\n\t\tif ( this._hand === null ) {\n\n\t\t\tthis._hand = new Group();\n\t\t\tthis._hand.matrixAutoUpdate = false;\n\t\t\tthis._hand.visible = false;\n\n\t\t\tthis._hand.joints = {};\n\t\t\tthis._hand.inputState = { pinching: false };\n\n\t\t}\n\n\t\treturn this._hand;\n\n\t}\n\n\tgetTargetRaySpace() {\n\n\t\tif ( this._targetRay === null ) {\n\n\t\t\tthis._targetRay = new Group();\n\t\t\tthis._targetRay.matrixAutoUpdate = false;\n\t\t\tthis._targetRay.visible = false;\n\t\t\tthis._targetRay.hasLinearVelocity = false;\n\t\t\tthis._targetRay.linearVelocity = new Vector3();\n\t\t\tthis._targetRay.hasAngularVelocity = false;\n\t\t\tthis._targetRay.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._targetRay;\n\n\t}\n\n\tgetGripSpace() {\n\n\t\tif ( this._grip === null ) {\n\n\t\t\tthis._grip = new Group();\n\t\t\tthis._grip.matrixAutoUpdate = false;\n\t\t\tthis._grip.visible = false;\n\t\t\tthis._grip.hasLinearVelocity = false;\n\t\t\tthis._grip.linearVelocity = new Vector3();\n\t\t\tthis._grip.hasAngularVelocity = false;\n\t\t\tthis._grip.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._grip;\n\n\t}\n\n\tdispatchEvent( event ) {\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.dispatchEvent( event );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tconnect( inputSource ) {\n\n\t\tif ( inputSource && inputSource.hand ) {\n\n\t\t\tconst hand = this._hand;\n\n\t\t\tif ( hand ) {\n\n\t\t\t\tfor ( const inputjoint of inputSource.hand.values() ) {\n\n\t\t\t\t\t// Initialize hand with joints when connected\n\t\t\t\t\tthis._getHandJoint( hand, inputjoint );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.dispatchEvent( { type: 'connected', data: inputSource } );\n\n\t\treturn this;\n\n\t}\n\n\tdisconnect( inputSource ) {\n\n\t\tthis.dispatchEvent( { type: 'disconnected', data: inputSource } );\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.visible = false;\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.visible = false;\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.visible = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tupdate( inputSource, frame, referenceSpace ) {\n\n\t\tlet inputPose = null;\n\t\tlet gripPose = null;\n\t\tlet handPose = null;\n\n\t\tconst targetRay = this._targetRay;\n\t\tconst grip = this._grip;\n\t\tconst hand = this._hand;\n\n\t\tif ( inputSource && frame.session.visibilityState !== 'visible-blurred' ) {\n\n\t\t\tif ( hand && inputSource.hand ) {\n\n\t\t\t\thandPose = true;\n\n\t\t\t\tfor ( const inputjoint of inputSource.hand.values() ) {\n\n\t\t\t\t\t// Update the joints groups with the XRJoint poses\n\t\t\t\t\tconst jointPose = frame.getJointPose( inputjoint, referenceSpace );\n\n\t\t\t\t\t// The transform of this joint will be updated with the joint pose on each frame\n\t\t\t\t\tconst joint = this._getHandJoint( hand, inputjoint );\n\n\t\t\t\t\tif ( jointPose !== null ) {\n\n\t\t\t\t\t\tjoint.matrix.fromArray( jointPose.transform.matrix );\n\t\t\t\t\t\tjoint.matrix.decompose( joint.position, joint.rotation, joint.scale );\n\t\t\t\t\t\tjoint.jointRadius = jointPose.radius;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tjoint.visible = jointPose !== null;\n\n\t\t\t\t}\n\n\t\t\t\t// Custom events\n\n\t\t\t\t// Check pinchz\n\t\t\t\tconst indexTip = hand.joints[ 'index-finger-tip' ];\n\t\t\t\tconst thumbTip = hand.joints[ 'thumb-tip' ];\n\t\t\t\tconst distance = indexTip.position.distanceTo( thumbTip.position );\n\n\t\t\t\tconst distanceToPinch = 0.02;\n\t\t\t\tconst threshold = 0.005;\n\n\t\t\t\tif ( hand.inputState.pinching && distance > distanceToPinch + threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = false;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchend',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t} else if ( ! hand.inputState.pinching && distance <= distanceToPinch - threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = true;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchstart',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( grip !== null && inputSource.gripSpace ) {\n\n\t\t\t\t\tgripPose = frame.getPose( inputSource.gripSpace, referenceSpace );\n\n\t\t\t\t\tif ( gripPose !== null ) {\n\n\t\t\t\t\t\tgrip.matrix.fromArray( gripPose.transform.matrix );\n\t\t\t\t\t\tgrip.matrix.decompose( grip.position, grip.rotation, grip.scale );\n\n\t\t\t\t\t\tif ( gripPose.linearVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = true;\n\t\t\t\t\t\t\tgrip.linearVelocity.copy( gripPose.linearVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( gripPose.angularVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = true;\n\t\t\t\t\t\t\tgrip.angularVelocity.copy( gripPose.angularVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( targetRay !== null ) {\n\n\t\t\t\tinputPose = frame.getPose( inputSource.targetRaySpace, referenceSpace );\n\n\t\t\t\t// Some runtimes (namely Vive Cosmos with Vive OpenXR Runtime) have only grip space and ray space is equal to it\n\t\t\t\tif ( inputPose === null && gripPose !== null ) {\n\n\t\t\t\t\tinputPose = gripPose;\n\n\t\t\t\t}\n\n\t\t\t\tif ( inputPose !== null ) {\n\n\t\t\t\t\ttargetRay.matrix.fromArray( inputPose.transform.matrix );\n\t\t\t\t\ttargetRay.matrix.decompose( targetRay.position, targetRay.rotation, targetRay.scale );\n\n\t\t\t\t\tif ( inputPose.linearVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = true;\n\t\t\t\t\t\ttargetRay.linearVelocity.copy( inputPose.linearVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( inputPose.angularVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = true;\n\t\t\t\t\t\ttargetRay.angularVelocity.copy( inputPose.angularVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.dispatchEvent( _moveEvent );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t}\n\n\t\tif ( targetRay !== null ) {\n\n\t\t\ttargetRay.visible = ( inputPose !== null );\n\n\t\t}\n\n\t\tif ( grip !== null ) {\n\n\t\t\tgrip.visible = ( gripPose !== null );\n\n\t\t}\n\n\t\tif ( hand !== null ) {\n\n\t\t\thand.visible = ( handPose !== null );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// private method\n\n\t_getHandJoint( hand, inputjoint ) {\n\n\t\tif ( hand.joints[ inputjoint.jointName ] === undefined ) {\n\n\t\t\tconst joint = new Group();\n\t\t\tjoint.matrixAutoUpdate = false;\n\t\t\tjoint.visible = false;\n\t\t\thand.joints[ inputjoint.jointName ] = joint;\n\n\t\t\thand.add( joint );\n\n\t\t}\n\n\t\treturn hand.joints[ inputjoint.jointName ];\n\n\t}\n\n}\n\nclass DepthTexture extends Texture {\n\n\tconstructor( width, height, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format ) {\n\n\t\tformat = format !== undefined ? format : DepthFormat;\n\n\t\tif ( format !== DepthFormat && format !== DepthStencilFormat ) {\n\n\t\t\tthrow new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' );\n\n\t\t}\n\n\t\tif ( type === undefined && format === DepthFormat ) type = UnsignedIntType;\n\t\tif ( type === undefined && format === DepthStencilFormat ) type = UnsignedInt248Type;\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.isDepthTexture = true;\n\n\t\tthis.image = { width: width, height: height };\n\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : NearestFilter;\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : NearestFilter;\n\n\t\tthis.flipY = false;\n\t\tthis.generateMipmaps = false;\n\n\t}\n\n\n}\n\nclass WebXRManager extends EventDispatcher {\n\n\tconstructor( renderer, gl ) {\n\n\t\tsuper();\n\n\t\tconst scope = this;\n\n\t\tlet session = null;\n\t\tlet framebufferScaleFactor = 1.0;\n\n\t\tlet referenceSpace = null;\n\t\tlet referenceSpaceType = 'local-floor';\n\t\t// Set default foveation to maximum.\n\t\tlet foveation = 1.0;\n\t\tlet customReferenceSpace = null;\n\n\t\tlet pose = null;\n\t\tlet glBinding = null;\n\t\tlet glProjLayer = null;\n\t\tlet glBaseLayer = null;\n\t\tlet xrFrame = null;\n\t\tconst attributes = gl.getContextAttributes();\n\t\tlet initialRenderTarget = null;\n\t\tlet newRenderTarget = null;\n\n\t\tconst controllers = [];\n\t\tconst controllerInputSources = [];\n\n\t\tconst planes = new Set();\n\t\tconst planesLastChangedTimes = new Map();\n\n\t\t//\n\n\t\tconst cameraL = new PerspectiveCamera();\n\t\tcameraL.layers.enable( 1 );\n\t\tcameraL.viewport = new Vector4();\n\n\t\tconst cameraR = new PerspectiveCamera();\n\t\tcameraR.layers.enable( 2 );\n\t\tcameraR.viewport = new Vector4();\n\n\t\tconst cameras = [ cameraL, cameraR ];\n\n\t\tconst cameraVR = new ArrayCamera();\n\t\tcameraVR.layers.enable( 1 );\n\t\tcameraVR.layers.enable( 2 );\n\n\t\tlet _currentDepthNear = null;\n\t\tlet _currentDepthFar = null;\n\n\t\t//\n\n\t\tthis.cameraAutoUpdate = true;\n\t\tthis.enabled = false;\n\n\t\tthis.isPresenting = false;\n\n\t\tthis.getController = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getTargetRaySpace();\n\n\t\t};\n\n\t\tthis.getControllerGrip = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getGripSpace();\n\n\t\t};\n\n\t\tthis.getHand = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getHandSpace();\n\n\t\t};\n\n\t\t//\n\n\t\tfunction onSessionEvent( event ) {\n\n\t\t\tconst controllerIndex = controllerInputSources.indexOf( event.inputSource );\n\n\t\t\tif ( controllerIndex === - 1 ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst controller = controllers[ controllerIndex ];\n\n\t\t\tif ( controller !== undefined ) {\n\n\t\t\t\tcontroller.dispatchEvent( { type: event.type, data: event.inputSource } );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onSessionEnd() {\n\n\t\t\tsession.removeEventListener( 'select', onSessionEvent );\n\t\t\tsession.removeEventListener( 'selectstart', onSessionEvent );\n\t\t\tsession.removeEventListener( 'selectend', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeeze', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeezestart', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeezeend', onSessionEvent );\n\t\t\tsession.removeEventListener( 'end', onSessionEnd );\n\t\t\tsession.removeEventListener( 'inputsourceschange', onInputSourcesChange );\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tconst inputSource = controllerInputSources[ i ];\n\n\t\t\t\tif ( inputSource === null ) continue;\n\n\t\t\t\tcontrollerInputSources[ i ] = null;\n\n\t\t\t\tcontrollers[ i ].disconnect( inputSource );\n\n\t\t\t}\n\n\t\t\t_currentDepthNear = null;\n\t\t\t_currentDepthFar = null;\n\n\t\t\t// restore framebuffer/rendering state\n\n\t\t\trenderer.setRenderTarget( initialRenderTarget );\n\n\t\t\tglBaseLayer = null;\n\t\t\tglProjLayer = null;\n\t\t\tglBinding = null;\n\t\t\tsession = null;\n\t\t\tnewRenderTarget = null;\n\n\t\t\t//\n\n\t\t\tanimation.stop();\n\n\t\t\tscope.isPresenting = false;\n\n\t\t\tscope.dispatchEvent( { type: 'sessionend' } );\n\n\t\t}\n\n\t\tthis.setFramebufferScaleFactor = function ( value ) {\n\n\t\t\tframebufferScaleFactor = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebXRManager: Cannot change framebuffer scale while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.setReferenceSpaceType = function ( value ) {\n\n\t\t\treferenceSpaceType = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebXRManager: Cannot change reference space type while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.getReferenceSpace = function () {\n\n\t\t\treturn customReferenceSpace || referenceSpace;\n\n\t\t};\n\n\t\tthis.setReferenceSpace = function ( space ) {\n\n\t\t\tcustomReferenceSpace = space;\n\n\t\t};\n\n\t\tthis.getBaseLayer = function () {\n\n\t\t\treturn glProjLayer !== null ? glProjLayer : glBaseLayer;\n\n\t\t};\n\n\t\tthis.getBinding = function () {\n\n\t\t\treturn glBinding;\n\n\t\t};\n\n\t\tthis.getFrame = function () {\n\n\t\t\treturn xrFrame;\n\n\t\t};\n\n\t\tthis.getSession = function () {\n\n\t\t\treturn session;\n\n\t\t};\n\n\t\tthis.setSession = async function ( value ) {\n\n\t\t\tsession = value;\n\n\t\t\tif ( session !== null ) {\n\n\t\t\t\tinitialRenderTarget = renderer.getRenderTarget();\n\n\t\t\t\tsession.addEventListener( 'select', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectstart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeeze', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezestart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezeend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'end', onSessionEnd );\n\t\t\t\tsession.addEventListener( 'inputsourceschange', onInputSourcesChange );\n\n\t\t\t\tif ( attributes.xrCompatible !== true ) {\n\n\t\t\t\t\tawait gl.makeXRCompatible();\n\n\t\t\t\t}\n\n\t\t\t\tif ( ( session.renderState.layers === undefined ) || ( renderer.capabilities.isWebGL2 === false ) ) {\n\n\t\t\t\t\tconst layerInit = {\n\t\t\t\t\t\tantialias: ( session.renderState.layers === undefined ) ? attributes.antialias : true,\n\t\t\t\t\t\talpha: attributes.alpha,\n\t\t\t\t\t\tdepth: attributes.depth,\n\t\t\t\t\t\tstencil: attributes.stencil,\n\t\t\t\t\t\tframebufferScaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBaseLayer = new XRWebGLLayer( session, gl, layerInit );\n\n\t\t\t\t\tsession.updateRenderState( { baseLayer: glBaseLayer } );\n\n\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\tglBaseLayer.framebufferWidth,\n\t\t\t\t\t\tglBaseLayer.framebufferHeight,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\tencoding: renderer.outputEncoding,\n\t\t\t\t\t\t\tstencilBuffer: attributes.stencil\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tlet depthFormat = null;\n\t\t\t\t\tlet depthType = null;\n\t\t\t\t\tlet glDepthFormat = null;\n\n\t\t\t\t\tif ( attributes.depth ) {\n\n\t\t\t\t\t\tglDepthFormat = attributes.stencil ? 35056 : 33190;\n\t\t\t\t\t\tdepthFormat = attributes.stencil ? DepthStencilFormat : DepthFormat;\n\t\t\t\t\t\tdepthType = attributes.stencil ? UnsignedInt248Type : UnsignedIntType;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst projectionlayerInit = {\n\t\t\t\t\t\tcolorFormat: 32856,\n\t\t\t\t\t\tdepthFormat: glDepthFormat,\n\t\t\t\t\t\tscaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBinding = new XRWebGLBinding( session, gl );\n\n\t\t\t\t\tglProjLayer = glBinding.createProjectionLayer( projectionlayerInit );\n\n\t\t\t\t\tsession.updateRenderState( { layers: [ glProjLayer ] } );\n\n\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\tglProjLayer.textureWidth,\n\t\t\t\t\t\tglProjLayer.textureHeight,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\tdepthTexture: new DepthTexture( glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, undefined, undefined, undefined, undefined, undefined, undefined, depthFormat ),\n\t\t\t\t\t\t\tstencilBuffer: attributes.stencil,\n\t\t\t\t\t\t\tencoding: renderer.outputEncoding,\n\t\t\t\t\t\t\tsamples: attributes.antialias ? 4 : 0\n\t\t\t\t\t\t} );\n\n\t\t\t\t\tconst renderTargetProperties = renderer.properties.get( newRenderTarget );\n\t\t\t\t\trenderTargetProperties.__ignoreDepthValues = glProjLayer.ignoreDepthValues;\n\n\t\t\t\t}\n\n\t\t\t\tnewRenderTarget.isXRRenderTarget = true; // TODO Remove this when possible, see #23278\n\n\t\t\t\tthis.setFoveation( foveation );\n\n\t\t\t\tcustomReferenceSpace = null;\n\t\t\t\treferenceSpace = await session.requestReferenceSpace( referenceSpaceType );\n\n\t\t\t\tanimation.setContext( session );\n\t\t\t\tanimation.start();\n\n\t\t\t\tscope.isPresenting = true;\n\n\t\t\t\tscope.dispatchEvent( { type: 'sessionstart' } );\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction onInputSourcesChange( event ) {\n\n\t\t\t// Notify disconnected\n\n\t\t\tfor ( let i = 0; i < event.removed.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.removed[ i ];\n\t\t\t\tconst index = controllerInputSources.indexOf( inputSource );\n\n\t\t\t\tif ( index >= 0 ) {\n\n\t\t\t\t\tcontrollerInputSources[ index ] = null;\n\t\t\t\t\tcontrollers[ index ].disconnect( inputSource );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Notify connected\n\n\t\t\tfor ( let i = 0; i < event.added.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.added[ i ];\n\n\t\t\t\tlet controllerIndex = controllerInputSources.indexOf( inputSource );\n\n\t\t\t\tif ( controllerIndex === - 1 ) {\n\n\t\t\t\t\t// Assign input source a controller that currently has no input source\n\n\t\t\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\t\t\tif ( i >= controllerInputSources.length ) {\n\n\t\t\t\t\t\t\tcontrollerInputSources.push( inputSource );\n\t\t\t\t\t\t\tcontrollerIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t} else if ( controllerInputSources[ i ] === null ) {\n\n\t\t\t\t\t\t\tcontrollerInputSources[ i ] = inputSource;\n\t\t\t\t\t\t\tcontrollerIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// If all controllers do currently receive input we ignore new ones\n\n\t\t\t\t\tif ( controllerIndex === - 1 ) break;\n\n\t\t\t\t}\n\n\t\t\t\tconst controller = controllers[ controllerIndex ];\n\n\t\t\t\tif ( controller ) {\n\n\t\t\t\t\tcontroller.connect( inputSource );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst cameraLPos = new Vector3();\n\t\tconst cameraRPos = new Vector3();\n\n\t\t/**\n\t\t * Assumes 2 cameras that are parallel and share an X-axis, and that\n\t\t * the cameras' projection and world matrices have already been set.\n\t\t * And that near and far planes are identical for both cameras.\n\t\t * Visualization of this technique: https://computergraphics.stackexchange.com/a/4765\n\t\t */\n\t\tfunction setProjectionFromUnion( camera, cameraL, cameraR ) {\n\n\t\t\tcameraLPos.setFromMatrixPosition( cameraL.matrixWorld );\n\t\t\tcameraRPos.setFromMatrixPosition( cameraR.matrixWorld );\n\n\t\t\tconst ipd = cameraLPos.distanceTo( cameraRPos );\n\n\t\t\tconst projL = cameraL.projectionMatrix.elements;\n\t\t\tconst projR = cameraR.projectionMatrix.elements;\n\n\t\t\t// VR systems will have identical far and near planes, and\n\t\t\t// most likely identical top and bottom frustum extents.\n\t\t\t// Use the left camera for these values.\n\t\t\tconst near = projL[ 14 ] / ( projL[ 10 ] - 1 );\n\t\t\tconst far = projL[ 14 ] / ( projL[ 10 ] + 1 );\n\t\t\tconst topFov = ( projL[ 9 ] + 1 ) / projL[ 5 ];\n\t\t\tconst bottomFov = ( projL[ 9 ] - 1 ) / projL[ 5 ];\n\n\t\t\tconst leftFov = ( projL[ 8 ] - 1 ) / projL[ 0 ];\n\t\t\tconst rightFov = ( projR[ 8 ] + 1 ) / projR[ 0 ];\n\t\t\tconst left = near * leftFov;\n\t\t\tconst right = near * rightFov;\n\n\t\t\t// Calculate the new camera's position offset from the\n\t\t\t// left camera. xOffset should be roughly half `ipd`.\n\t\t\tconst zOffset = ipd / ( - leftFov + rightFov );\n\t\t\tconst xOffset = zOffset * - leftFov;\n\n\t\t\t// TODO: Better way to apply this offset?\n\t\t\tcameraL.matrixWorld.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.translateX( xOffset );\n\t\t\tcamera.translateZ( zOffset );\n\t\t\tcamera.matrixWorld.compose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t\t// Find the union of the frustum values of the cameras and scale\n\t\t\t// the values so that the near plane's position does not change in world space,\n\t\t\t// although must now be relative to the new union camera.\n\t\t\tconst near2 = near + zOffset;\n\t\t\tconst far2 = far + zOffset;\n\t\t\tconst left2 = left - xOffset;\n\t\t\tconst right2 = right + ( ipd - xOffset );\n\t\t\tconst top2 = topFov * far / far2 * near2;\n\t\t\tconst bottom2 = bottomFov * far / far2 * near2;\n\n\t\t\tcamera.projectionMatrix.makePerspective( left2, right2, top2, bottom2, near2, far2 );\n\n\t\t}\n\n\t\tfunction updateCamera( camera, parent ) {\n\n\t\t\tif ( parent === null ) {\n\n\t\t\t\tcamera.matrixWorld.copy( camera.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tcamera.matrixWorld.multiplyMatrices( parent.matrixWorld, camera.matrix );\n\n\t\t\t}\n\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t}\n\n\t\tthis.updateCamera = function ( camera ) {\n\n\t\t\tif ( session === null ) return;\n\n\t\t\tcameraVR.near = cameraR.near = cameraL.near = camera.near;\n\t\t\tcameraVR.far = cameraR.far = cameraL.far = camera.far;\n\n\t\t\tif ( _currentDepthNear !== cameraVR.near || _currentDepthFar !== cameraVR.far ) {\n\n\t\t\t\t// Note that the new renderState won't apply until the next frame. See #18320\n\n\t\t\t\tsession.updateRenderState( {\n\t\t\t\t\tdepthNear: cameraVR.near,\n\t\t\t\t\tdepthFar: cameraVR.far\n\t\t\t\t} );\n\n\t\t\t\t_currentDepthNear = cameraVR.near;\n\t\t\t\t_currentDepthFar = cameraVR.far;\n\n\t\t\t}\n\n\t\t\tconst parent = camera.parent;\n\t\t\tconst cameras = cameraVR.cameras;\n\n\t\t\tupdateCamera( cameraVR, parent );\n\n\t\t\tfor ( let i = 0; i < cameras.length; i ++ ) {\n\n\t\t\t\tupdateCamera( cameras[ i ], parent );\n\n\t\t\t}\n\n\t\t\tcameraVR.matrixWorld.decompose( cameraVR.position, cameraVR.quaternion, cameraVR.scale );\n\n\t\t\t// update user camera and its children\n\n\t\t\tcamera.matrix.copy( cameraVR.matrix );\n\t\t\tcamera.matrix.decompose( camera.position, camera.quaternion, camera.scale );\n\n\t\t\tconst children = camera.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tchildren[ i ].updateMatrixWorld( true );\n\n\t\t\t}\n\n\t\t\t// update projection matrix for proper view frustum culling\n\n\t\t\tif ( cameras.length === 2 ) {\n\n\t\t\t\tsetProjectionFromUnion( cameraVR, cameraL, cameraR );\n\n\t\t\t} else {\n\n\t\t\t\t// assume single camera setup (AR)\n\n\t\t\t\tcameraVR.projectionMatrix.copy( cameraL.projectionMatrix );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.getCamera = function () {\n\n\t\t\treturn cameraVR;\n\n\t\t};\n\n\t\tthis.getFoveation = function () {\n\n\t\t\tif ( glProjLayer === null && glBaseLayer === null ) {\n\n\t\t\t\treturn undefined;\n\n\t\t\t}\n\n\t\t\treturn foveation;\n\n\t\t};\n\n\t\tthis.setFoveation = function ( value ) {\n\n\t\t\t// 0 = no foveation = full resolution\n\t\t\t// 1 = maximum foveation = the edges render at lower resolution\n\n\t\t\tfoveation = value;\n\n\t\t\tif ( glProjLayer !== null ) {\n\n\t\t\t\tglProjLayer.fixedFoveation = value;\n\n\t\t\t}\n\n\t\t\tif ( glBaseLayer !== null && glBaseLayer.fixedFoveation !== undefined ) {\n\n\t\t\t\tglBaseLayer.fixedFoveation = value;\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.getPlanes = function () {\n\n\t\t\treturn planes;\n\n\t\t};\n\n\t\t// Animation Loop\n\n\t\tlet onAnimationFrameCallback = null;\n\n\t\tfunction onAnimationFrame( time, frame ) {\n\n\t\t\tpose = frame.getViewerPose( customReferenceSpace || referenceSpace );\n\t\t\txrFrame = frame;\n\n\t\t\tif ( pose !== null ) {\n\n\t\t\t\tconst views = pose.views;\n\n\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\trenderer.setRenderTargetFramebuffer( newRenderTarget, glBaseLayer.framebuffer );\n\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t}\n\n\t\t\t\tlet cameraVRNeedsUpdate = false;\n\n\t\t\t\t// check if it's necessary to rebuild cameraVR's camera list\n\n\t\t\t\tif ( views.length !== cameraVR.cameras.length ) {\n\n\t\t\t\t\tcameraVR.cameras.length = 0;\n\t\t\t\t\tcameraVRNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < views.length; i ++ ) {\n\n\t\t\t\t\tconst view = views[ i ];\n\n\t\t\t\t\tlet viewport = null;\n\n\t\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\t\tviewport = glBaseLayer.getViewport( view );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst glSubImage = glBinding.getViewSubImage( glProjLayer, view );\n\t\t\t\t\t\tviewport = glSubImage.viewport;\n\n\t\t\t\t\t\t// For side-by-side projection, we only produce a single texture for both eyes.\n\t\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\t\trenderer.setRenderTargetTextures(\n\t\t\t\t\t\t\t\tnewRenderTarget,\n\t\t\t\t\t\t\t\tglSubImage.colorTexture,\n\t\t\t\t\t\t\t\tglProjLayer.ignoreDepthValues ? undefined : glSubImage.depthStencilTexture );\n\n\t\t\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet camera = cameras[ i ];\n\n\t\t\t\t\tif ( camera === undefined ) {\n\n\t\t\t\t\t\tcamera = new PerspectiveCamera();\n\t\t\t\t\t\tcamera.layers.enable( i );\n\t\t\t\t\t\tcamera.viewport = new Vector4();\n\t\t\t\t\t\tcameras[ i ] = camera;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcamera.matrix.fromArray( view.transform.matrix );\n\t\t\t\t\tcamera.projectionMatrix.fromArray( view.projectionMatrix );\n\t\t\t\t\tcamera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height );\n\n\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\tcameraVR.matrix.copy( camera.matrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( cameraVRNeedsUpdate === true ) {\n\n\t\t\t\t\t\tcameraVR.cameras.push( camera );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tconst inputSource = controllerInputSources[ i ];\n\t\t\t\tconst controller = controllers[ i ];\n\n\t\t\t\tif ( inputSource !== null && controller !== undefined ) {\n\n\t\t\t\t\tcontroller.update( inputSource, frame, customReferenceSpace || referenceSpace );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time, frame );\n\n\t\t\tif ( frame.detectedPlanes ) {\n\n\t\t\t\tscope.dispatchEvent( { type: 'planesdetected', data: frame.detectedPlanes } );\n\n\t\t\t\tlet planesToRemove = null;\n\n\t\t\t\tfor ( const plane of planes ) {\n\n\t\t\t\t\tif ( ! frame.detectedPlanes.has( plane ) ) {\n\n\t\t\t\t\t\tif ( planesToRemove === null ) {\n\n\t\t\t\t\t\t\tplanesToRemove = [];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tplanesToRemove.push( plane );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( planesToRemove !== null ) {\n\n\t\t\t\t\tfor ( const plane of planesToRemove ) {\n\n\t\t\t\t\t\tplanes.delete( plane );\n\t\t\t\t\t\tplanesLastChangedTimes.delete( plane );\n\t\t\t\t\t\tscope.dispatchEvent( { type: 'planeremoved', data: plane } );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( const plane of frame.detectedPlanes ) {\n\n\t\t\t\t\tif ( ! planes.has( plane ) ) {\n\n\t\t\t\t\t\tplanes.add( plane );\n\t\t\t\t\t\tplanesLastChangedTimes.set( plane, frame.lastChangedTime );\n\t\t\t\t\t\tscope.dispatchEvent( { type: 'planeadded', data: plane } );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst lastKnownTime = planesLastChangedTimes.get( plane );\n\n\t\t\t\t\t\tif ( plane.lastChangedTime > lastKnownTime ) {\n\n\t\t\t\t\t\t\tplanesLastChangedTimes.set( plane, plane.lastChangedTime );\n\t\t\t\t\t\t\tscope.dispatchEvent( { type: 'planechanged', data: plane } );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\txrFrame = null;\n\n\t\t}\n\n\t\tconst animation = new WebGLAnimation();\n\n\t\tanimation.setAnimationLoop( onAnimationFrame );\n\n\t\tthis.setAnimationLoop = function ( callback ) {\n\n\t\t\tonAnimationFrameCallback = callback;\n\n\t\t};\n\n\t\tthis.dispose = function () {};\n\n\t}\n\n}\n\nfunction WebGLMaterials( renderer, properties ) {\n\n\tfunction refreshFogUniforms( uniforms, fog ) {\n\n\t\tfog.color.getRGB( uniforms.fogColor.value, getUnlitUniformColorSpace( renderer ) );\n\n\t\tif ( fog.isFog ) {\n\n\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t}\n\n\t}\n\n\tfunction refreshMaterialUniforms( uniforms, material, pixelRatio, height, transmissionRenderTarget ) {\n\n\t\tif ( material.isMeshBasicMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshToonMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsToon( uniforms, material );\n\n\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsPhong( uniforms, material );\n\n\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsStandard( uniforms, material );\n\n\t\t\tif ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\trefreshUniformsPhysical( uniforms, material, transmissionRenderTarget );\n\n\t\t\t}\n\n\t\t} else if ( material.isMeshMatcapMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsMatcap( uniforms, material );\n\n\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshDistanceMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsDistance( uniforms, material );\n\n\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isLineBasicMaterial ) {\n\n\t\t\trefreshUniformsLine( uniforms, material );\n\n\t\t\tif ( material.isLineDashedMaterial ) {\n\n\t\t\t\trefreshUniformsDash( uniforms, material );\n\n\t\t\t}\n\n\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\trefreshUniformsPoints( uniforms, material, pixelRatio, height );\n\n\t\t} else if ( material.isSpriteMaterial ) {\n\n\t\t\trefreshUniformsSprites( uniforms, material );\n\n\t\t} else if ( material.isShadowMaterial ) {\n\n\t\t\tuniforms.color.value.copy( material.color );\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t} else if ( material.isShaderMaterial ) {\n\n\t\t\tmaterial.uniformsNeedUpdate = false; // #15581\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsCommon( uniforms, material ) {\n\n\t\tuniforms.opacity.value = material.opacity;\n\n\t\tif ( material.color ) {\n\n\t\t\tuniforms.diffuse.value.copy( material.color );\n\n\t\t}\n\n\t\tif ( material.emissive ) {\n\n\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t}\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\t\t\tif ( material.side === BackSide ) uniforms.bumpScale.value *= - 1;\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\t\t\tif ( material.side === BackSide ) uniforms.normalScale.value.negate();\n\n\t\t}\n\n\t\tif ( material.specularMap ) {\n\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t\tconst envMap = properties.get( material ).envMap;\n\n\t\tif ( envMap ) {\n\n\t\t\tuniforms.envMap.value = envMap;\n\n\t\t\tuniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? - 1 : 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.ior.value = material.ior;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t}\n\n\t\tif ( material.lightMap ) {\n\n\t\t\tuniforms.lightMap.value = material.lightMap;\n\n\t\t\t// artist-friendly light intensity scaling factor\n\t\t\tconst scaleFactor = ( renderer.physicallyCorrectLights !== true ) ? Math.PI : 1;\n\n\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity * scaleFactor;\n\n\t\t}\n\n\t\tif ( material.aoMap ) {\n\n\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities\n\t\t// 1. color map\n\t\t// 2. specular map\n\t\t// 3. displacementMap map\n\t\t// 4. normal map\n\t\t// 5. bump map\n\t\t// 6. roughnessMap map\n\t\t// 7. metalnessMap map\n\t\t// 8. alphaMap map\n\t\t// 9. emissiveMap map\n\t\t// 10. clearcoat map\n\t\t// 11. clearcoat normal map\n\t\t// 12. clearcoat roughnessMap map\n\t\t// 13. iridescence map\n\t\t// 14. iridescence thickness map\n\t\t// 15. specular intensity map\n\t\t// 16. specular tint map\n\t\t// 17. transmission map\n\t\t// 18. thickness map\n\n\t\tlet uvScaleMap;\n\n\t\tif ( material.map ) {\n\n\t\t\tuvScaleMap = material.map;\n\n\t\t} else if ( material.specularMap ) {\n\n\t\t\tuvScaleMap = material.specularMap;\n\n\t\t} else if ( material.displacementMap ) {\n\n\t\t\tuvScaleMap = material.displacementMap;\n\n\t\t} else if ( material.normalMap ) {\n\n\t\t\tuvScaleMap = material.normalMap;\n\n\t\t} else if ( material.bumpMap ) {\n\n\t\t\tuvScaleMap = material.bumpMap;\n\n\t\t} else if ( material.roughnessMap ) {\n\n\t\t\tuvScaleMap = material.roughnessMap;\n\n\t\t} else if ( material.metalnessMap ) {\n\n\t\t\tuvScaleMap = material.metalnessMap;\n\n\t\t} else if ( material.alphaMap ) {\n\n\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t} else if ( material.emissiveMap ) {\n\n\t\t\tuvScaleMap = material.emissiveMap;\n\n\t\t} else if ( material.clearcoatMap ) {\n\n\t\t\tuvScaleMap = material.clearcoatMap;\n\n\t\t} else if ( material.clearcoatNormalMap ) {\n\n\t\t\tuvScaleMap = material.clearcoatNormalMap;\n\n\t\t} else if ( material.clearcoatRoughnessMap ) {\n\n\t\t\tuvScaleMap = material.clearcoatRoughnessMap;\n\n\t\t} else if ( material.iridescenceMap ) {\n\n\t\t\tuvScaleMap = material.iridescenceMap;\n\n\t\t} else if ( material.iridescenceThicknessMap ) {\n\n\t\t\tuvScaleMap = material.iridescenceThicknessMap;\n\n\t\t} else if ( material.specularIntensityMap ) {\n\n\t\t\tuvScaleMap = material.specularIntensityMap;\n\n\t\t} else if ( material.specularColorMap ) {\n\n\t\t\tuvScaleMap = material.specularColorMap;\n\n\t\t} else if ( material.transmissionMap ) {\n\n\t\t\tuvScaleMap = material.transmissionMap;\n\n\t\t} else if ( material.thicknessMap ) {\n\n\t\t\tuvScaleMap = material.thicknessMap;\n\n\t\t} else if ( material.sheenColorMap ) {\n\n\t\t\tuvScaleMap = material.sheenColorMap;\n\n\t\t} else if ( material.sheenRoughnessMap ) {\n\n\t\t\tuvScaleMap = material.sheenRoughnessMap;\n\n\t\t}\n\n\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\t// backwards compatibility\n\t\t\tif ( uvScaleMap.isWebGLRenderTarget ) {\n\n\t\t\t\tuvScaleMap = uvScaleMap.texture;\n\n\t\t\t}\n\n\t\t\tif ( uvScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuvScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uvTransform.value.copy( uvScaleMap.matrix );\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities for uv2\n\t\t// 1. ao map\n\t\t// 2. light map\n\n\t\tlet uv2ScaleMap;\n\n\t\tif ( material.aoMap ) {\n\n\t\t\tuv2ScaleMap = material.aoMap;\n\n\t\t} else if ( material.lightMap ) {\n\n\t\t\tuv2ScaleMap = material.lightMap;\n\n\t\t}\n\n\t\tif ( uv2ScaleMap !== undefined ) {\n\n\t\t\t// backwards compatibility\n\t\t\tif ( uv2ScaleMap.isWebGLRenderTarget ) {\n\n\t\t\t\tuv2ScaleMap = uv2ScaleMap.texture;\n\n\t\t\t}\n\n\t\t\tif ( uv2ScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuv2ScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uv2Transform.value.copy( uv2ScaleMap.matrix );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\n\t}\n\n\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\tuniforms.dashSize.value = material.dashSize;\n\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\tuniforms.scale.value = material.scale;\n\n\t}\n\n\tfunction refreshUniformsPoints( uniforms, material, pixelRatio, height ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.size.value = material.size * pixelRatio;\n\t\tuniforms.scale.value = height * 0.5;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities\n\t\t// 1. color map\n\t\t// 2. alpha map\n\n\t\tlet uvScaleMap;\n\n\t\tif ( material.map ) {\n\n\t\t\tuvScaleMap = material.map;\n\n\t\t} else if ( material.alphaMap ) {\n\n\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t}\n\n\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\tif ( uvScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuvScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uvTransform.value.copy( uvScaleMap.matrix );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsSprites( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.rotation.value = material.rotation;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t\t// uv repeat and offset setting priorities\n\t\t// 1. color map\n\t\t// 2. alpha map\n\n\t\tlet uvScaleMap;\n\n\t\tif ( material.map ) {\n\n\t\t\tuvScaleMap = material.map;\n\n\t\t} else if ( material.alphaMap ) {\n\n\t\t\tuvScaleMap = material.alphaMap;\n\n\t\t}\n\n\t\tif ( uvScaleMap !== undefined ) {\n\n\t\t\tif ( uvScaleMap.matrixAutoUpdate === true ) {\n\n\t\t\t\tuvScaleMap.updateMatrix();\n\n\t\t\t}\n\n\t\t\tuniforms.uvTransform.value.copy( uvScaleMap.matrix );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\tuniforms.specular.value.copy( material.specular );\n\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t}\n\n\tfunction refreshUniformsToon( uniforms, material ) {\n\n\t\tif ( material.gradientMap ) {\n\n\t\t\tuniforms.gradientMap.value = material.gradientMap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsStandard( uniforms, material ) {\n\n\t\tuniforms.roughness.value = material.roughness;\n\t\tuniforms.metalness.value = material.metalness;\n\n\t\tif ( material.roughnessMap ) {\n\n\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t}\n\n\t\tif ( material.metalnessMap ) {\n\n\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t}\n\n\t\tconst envMap = properties.get( material ).envMap;\n\n\t\tif ( envMap ) {\n\n\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhysical( uniforms, material, transmissionRenderTarget ) {\n\n\t\tuniforms.ior.value = material.ior; // also part of uniforms common\n\n\t\tif ( material.sheen > 0 ) {\n\n\t\t\tuniforms.sheenColor.value.copy( material.sheenColor ).multiplyScalar( material.sheen );\n\n\t\t\tuniforms.sheenRoughness.value = material.sheenRoughness;\n\n\t\t\tif ( material.sheenColorMap ) {\n\n\t\t\t\tuniforms.sheenColorMap.value = material.sheenColorMap;\n\n\t\t\t}\n\n\t\t\tif ( material.sheenRoughnessMap ) {\n\n\t\t\t\tuniforms.sheenRoughnessMap.value = material.sheenRoughnessMap;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.clearcoat > 0 ) {\n\n\t\t\tuniforms.clearcoat.value = material.clearcoat;\n\t\t\tuniforms.clearcoatRoughness.value = material.clearcoatRoughness;\n\n\t\t\tif ( material.clearcoatMap ) {\n\n\t\t\t\tuniforms.clearcoatMap.value = material.clearcoatMap;\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatRoughnessMap ) {\n\n\t\t\t\tuniforms.clearcoatRoughnessMap.value = material.clearcoatRoughnessMap;\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatNormalMap ) {\n\n\t\t\t\tuniforms.clearcoatNormalScale.value.copy( material.clearcoatNormalScale );\n\t\t\t\tuniforms.clearcoatNormalMap.value = material.clearcoatNormalMap;\n\n\t\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\t\tuniforms.clearcoatNormalScale.value.negate();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.iridescence > 0 ) {\n\n\t\t\tuniforms.iridescence.value = material.iridescence;\n\t\t\tuniforms.iridescenceIOR.value = material.iridescenceIOR;\n\t\t\tuniforms.iridescenceThicknessMinimum.value = material.iridescenceThicknessRange[ 0 ];\n\t\t\tuniforms.iridescenceThicknessMaximum.value = material.iridescenceThicknessRange[ 1 ];\n\n\t\t\tif ( material.iridescenceMap ) {\n\n\t\t\t\tuniforms.iridescenceMap.value = material.iridescenceMap;\n\n\t\t\t}\n\n\t\t\tif ( material.iridescenceThicknessMap ) {\n\n\t\t\t\tuniforms.iridescenceThicknessMap.value = material.iridescenceThicknessMap;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.transmission > 0 ) {\n\n\t\t\tuniforms.transmission.value = material.transmission;\n\t\t\tuniforms.transmissionSamplerMap.value = transmissionRenderTarget.texture;\n\t\t\tuniforms.transmissionSamplerSize.value.set( transmissionRenderTarget.width, transmissionRenderTarget.height );\n\n\t\t\tif ( material.transmissionMap ) {\n\n\t\t\t\tuniforms.transmissionMap.value = material.transmissionMap;\n\n\t\t\t}\n\n\t\t\tuniforms.thickness.value = material.thickness;\n\n\t\t\tif ( material.thicknessMap ) {\n\n\t\t\t\tuniforms.thicknessMap.value = material.thicknessMap;\n\n\t\t\t}\n\n\t\t\tuniforms.attenuationDistance.value = material.attenuationDistance;\n\t\t\tuniforms.attenuationColor.value.copy( material.attenuationColor );\n\n\t\t}\n\n\t\tuniforms.specularIntensity.value = material.specularIntensity;\n\t\tuniforms.specularColor.value.copy( material.specularColor );\n\n\t\tif ( material.specularIntensityMap ) {\n\n\t\t\tuniforms.specularIntensityMap.value = material.specularIntensityMap;\n\n\t\t}\n\n\t\tif ( material.specularColorMap ) {\n\n\t\t\tuniforms.specularColorMap.value = material.specularColorMap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsMatcap( uniforms, material ) {\n\n\t\tif ( material.matcap ) {\n\n\t\t\tuniforms.matcap.value = material.matcap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDistance( uniforms, material ) {\n\n\t\tuniforms.referencePosition.value.copy( material.referencePosition );\n\t\tuniforms.nearDistance.value = material.nearDistance;\n\t\tuniforms.farDistance.value = material.farDistance;\n\n\t}\n\n\treturn {\n\t\trefreshFogUniforms: refreshFogUniforms,\n\t\trefreshMaterialUniforms: refreshMaterialUniforms\n\t};\n\n}\n\nfunction WebGLUniformsGroups( gl, info, capabilities, state ) {\n\n\tlet buffers = {};\n\tlet updateList = {};\n\tlet allocatedBindingPoints = [];\n\n\tconst maxBindingPoints = ( capabilities.isWebGL2 ) ? gl.getParameter( 35375 ) : 0; // binding points are global whereas block indices are per shader program\n\n\tfunction bind( uniformsGroup, program ) {\n\n\t\tconst webglProgram = program.program;\n\t\tstate.uniformBlockBinding( uniformsGroup, webglProgram );\n\n\t}\n\n\tfunction update( uniformsGroup, program ) {\n\n\t\tlet buffer = buffers[ uniformsGroup.id ];\n\n\t\tif ( buffer === undefined ) {\n\n\t\t\tprepareUniformsGroup( uniformsGroup );\n\n\t\t\tbuffer = createBuffer( uniformsGroup );\n\t\t\tbuffers[ uniformsGroup.id ] = buffer;\n\n\t\t\tuniformsGroup.addEventListener( 'dispose', onUniformsGroupsDispose );\n\n\t\t}\n\n\t\t// ensure to update the binding points/block indices mapping for this program\n\n\t\tconst webglProgram = program.program;\n\t\tstate.updateUBOMapping( uniformsGroup, webglProgram );\n\n\t\t// update UBO once per frame\n\n\t\tconst frame = info.render.frame;\n\n\t\tif ( updateList[ uniformsGroup.id ] !== frame ) {\n\n\t\t\tupdateBufferData( uniformsGroup );\n\n\t\t\tupdateList[ uniformsGroup.id ] = frame;\n\n\t\t}\n\n\t}\n\n\tfunction createBuffer( uniformsGroup ) {\n\n\t\t// the setup of an UBO is independent of a particular shader program but global\n\n\t\tconst bindingPointIndex = allocateBindingPointIndex();\n\t\tuniformsGroup.__bindingPointIndex = bindingPointIndex;\n\n\t\tconst buffer = gl.createBuffer();\n\t\tconst size = uniformsGroup.__size;\n\t\tconst usage = uniformsGroup.usage;\n\n\t\tgl.bindBuffer( 35345, buffer );\n\t\tgl.bufferData( 35345, size, usage );\n\t\tgl.bindBuffer( 35345, null );\n\t\tgl.bindBufferBase( 35345, bindingPointIndex, buffer );\n\n\t\treturn buffer;\n\n\t}\n\n\tfunction allocateBindingPointIndex() {\n\n\t\tfor ( let i = 0; i < maxBindingPoints; i ++ ) {\n\n\t\t\tif ( allocatedBindingPoints.indexOf( i ) === - 1 ) {\n\n\t\t\t\tallocatedBindingPoints.push( i );\n\t\t\t\treturn i;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconsole.error( 'THREE.WebGLRenderer: Maximum number of simultaneously usable uniforms groups reached.' );\n\n\t\treturn 0;\n\n\t}\n\n\tfunction updateBufferData( uniformsGroup ) {\n\n\t\tconst buffer = buffers[ uniformsGroup.id ];\n\t\tconst uniforms = uniformsGroup.uniforms;\n\t\tconst cache = uniformsGroup.__cache;\n\n\t\tgl.bindBuffer( 35345, buffer );\n\n\t\tfor ( let i = 0, il = uniforms.length; i < il; i ++ ) {\n\n\t\t\tconst uniform = uniforms[ i ];\n\n\t\t\t// partly update the buffer if necessary\n\n\t\t\tif ( hasUniformChanged( uniform, i, cache ) === true ) {\n\n\t\t\t\tconst offset = uniform.__offset;\n\n\t\t\t\tconst values = Array.isArray( uniform.value ) ? uniform.value : [ uniform.value ];\n\n\t\t\t\tlet arrayOffset = 0;\n\n\t\t\t\tfor ( let i = 0; i < values.length; i ++ ) {\n\n\t\t\t\t\tconst value = values[ i ];\n\n\t\t\t\t\tconst info = getUniformSize( value );\n\n\t\t\t\t\tif ( typeof value === 'number' ) {\n\n\t\t\t\t\t\tuniform.__data[ 0 ] = value;\n\t\t\t\t\t\tgl.bufferSubData( 35345, offset + arrayOffset, uniform.__data );\n\n\t\t\t\t\t} else if ( value.isMatrix3 ) {\n\n\t\t\t\t\t\t// manually converting 3x3 to 3x4\n\n\t\t\t\t\t\tuniform.__data[ 0 ] = value.elements[ 0 ];\n\t\t\t\t\t\tuniform.__data[ 1 ] = value.elements[ 1 ];\n\t\t\t\t\t\tuniform.__data[ 2 ] = value.elements[ 2 ];\n\t\t\t\t\t\tuniform.__data[ 3 ] = value.elements[ 0 ];\n\t\t\t\t\t\tuniform.__data[ 4 ] = value.elements[ 3 ];\n\t\t\t\t\t\tuniform.__data[ 5 ] = value.elements[ 4 ];\n\t\t\t\t\t\tuniform.__data[ 6 ] = value.elements[ 5 ];\n\t\t\t\t\t\tuniform.__data[ 7 ] = value.elements[ 0 ];\n\t\t\t\t\t\tuniform.__data[ 8 ] = value.elements[ 6 ];\n\t\t\t\t\t\tuniform.__data[ 9 ] = value.elements[ 7 ];\n\t\t\t\t\t\tuniform.__data[ 10 ] = value.elements[ 8 ];\n\t\t\t\t\t\tuniform.__data[ 11 ] = value.elements[ 0 ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvalue.toArray( uniform.__data, arrayOffset );\n\n\t\t\t\t\t\tarrayOffset += info.storage / Float32Array.BYTES_PER_ELEMENT;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgl.bufferSubData( 35345, offset, uniform.__data );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgl.bindBuffer( 35345, null );\n\n\t}\n\n\tfunction hasUniformChanged( uniform, index, cache ) {\n\n\t\tconst value = uniform.value;\n\n\t\tif ( cache[ index ] === undefined ) {\n\n\t\t\t// cache entry does not exist so far\n\n\t\t\tif ( typeof value === 'number' ) {\n\n\t\t\t\tcache[ index ] = value;\n\n\t\t\t} else {\n\n\t\t\t\tconst values = Array.isArray( value ) ? value : [ value ];\n\n\t\t\t\tconst tempValues = [];\n\n\t\t\t\tfor ( let i = 0; i < values.length; i ++ ) {\n\n\t\t\t\t\ttempValues.push( values[ i ].clone() );\n\n\t\t\t\t}\n\n\t\t\t\tcache[ index ] = tempValues;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t} else {\n\n\t\t\t// compare current value with cached entry\n\n\t\t\tif ( typeof value === 'number' ) {\n\n\t\t\t\tif ( cache[ index ] !== value ) {\n\n\t\t\t\t\tcache[ index ] = value;\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst cachedObjects = Array.isArray( cache[ index ] ) ? cache[ index ] : [ cache[ index ] ];\n\t\t\t\tconst values = Array.isArray( value ) ? value : [ value ];\n\n\t\t\t\tfor ( let i = 0; i < cachedObjects.length; i ++ ) {\n\n\t\t\t\t\tconst cachedObject = cachedObjects[ i ];\n\n\t\t\t\t\tif ( cachedObject.equals( values[ i ] ) === false ) {\n\n\t\t\t\t\t\tcachedObject.copy( values[ i ] );\n\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction prepareUniformsGroup( uniformsGroup ) {\n\n\t\t// determine total buffer size according to the STD140 layout\n\t\t// Hint: STD140 is the only supported layout in WebGL 2\n\n\t\tconst uniforms = uniformsGroup.uniforms;\n\n\t\tlet offset = 0; // global buffer offset in bytes\n\t\tconst chunkSize = 16; // size of a chunk in bytes\n\t\tlet chunkOffset = 0; // offset within a single chunk in bytes\n\n\t\tfor ( let i = 0, l = uniforms.length; i < l; i ++ ) {\n\n\t\t\tconst uniform = uniforms[ i ];\n\n\t\t\tconst infos = {\n\t\t\t\tboundary: 0, // bytes\n\t\t\t\tstorage: 0 // bytes\n\t\t\t};\n\n\t\t\tconst values = Array.isArray( uniform.value ) ? uniform.value : [ uniform.value ];\n\n\t\t\tfor ( let j = 0, jl = values.length; j < jl; j ++ ) {\n\n\t\t\t\tconst value = values[ j ];\n\n\t\t\t\tconst info = getUniformSize( value );\n\n\t\t\t\tinfos.boundary += info.boundary;\n\t\t\t\tinfos.storage += info.storage;\n\n\t\t\t}\n\n\t\t\t// the following two properties will be used for partial buffer updates\n\n\t\t\tuniform.__data = new Float32Array( infos.storage / Float32Array.BYTES_PER_ELEMENT );\n\t\t\tuniform.__offset = offset;\n\n\t\t\t//\n\n\t\t\tif ( i > 0 ) {\n\n\t\t\t\tchunkOffset = offset % chunkSize;\n\n\t\t\t\tconst remainingSizeInChunk = chunkSize - chunkOffset;\n\n\t\t\t\t// check for chunk overflow\n\n\t\t\t\tif ( chunkOffset !== 0 && ( remainingSizeInChunk - infos.boundary ) < 0 ) {\n\n\t\t\t\t\t// add padding and adjust offset\n\n\t\t\t\t\toffset += ( chunkSize - chunkOffset );\n\t\t\t\t\tuniform.__offset = offset;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\toffset += infos.storage;\n\n\t\t}\n\n\t\t// ensure correct final padding\n\n\t\tchunkOffset = offset % chunkSize;\n\n\t\tif ( chunkOffset > 0 ) offset += ( chunkSize - chunkOffset );\n\n\t\t//\n\n\t\tuniformsGroup.__size = offset;\n\t\tuniformsGroup.__cache = {};\n\n\t\treturn this;\n\n\t}\n\n\tfunction getUniformSize( value ) {\n\n\t\tconst info = {\n\t\t\tboundary: 0, // bytes\n\t\t\tstorage: 0 // bytes\n\t\t};\n\n\t\t// determine sizes according to STD140\n\n\t\tif ( typeof value === 'number' ) {\n\n\t\t\t// float/int\n\n\t\t\tinfo.boundary = 4;\n\t\t\tinfo.storage = 4;\n\n\t\t} else if ( value.isVector2 ) {\n\n\t\t\t// vec2\n\n\t\t\tinfo.boundary = 8;\n\t\t\tinfo.storage = 8;\n\n\t\t} else if ( value.isVector3 || value.isColor ) {\n\n\t\t\t// vec3\n\n\t\t\tinfo.boundary = 16;\n\t\t\tinfo.storage = 12; // evil: vec3 must start on a 16-byte boundary but it only consumes 12 bytes\n\n\t\t} else if ( value.isVector4 ) {\n\n\t\t\t// vec4\n\n\t\t\tinfo.boundary = 16;\n\t\t\tinfo.storage = 16;\n\n\t\t} else if ( value.isMatrix3 ) {\n\n\t\t\t// mat3 (in STD140 a 3x3 matrix is represented as 3x4)\n\n\t\t\tinfo.boundary = 48;\n\t\t\tinfo.storage = 48;\n\n\t\t} else if ( value.isMatrix4 ) {\n\n\t\t\t// mat4\n\n\t\t\tinfo.boundary = 64;\n\t\t\tinfo.storage = 64;\n\n\t\t} else if ( value.isTexture ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Texture samplers can not be part of an uniforms group.' );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Unsupported uniform value type.', value );\n\n\t\t}\n\n\t\treturn info;\n\n\t}\n\n\tfunction onUniformsGroupsDispose( event ) {\n\n\t\tconst uniformsGroup = event.target;\n\n\t\tuniformsGroup.removeEventListener( 'dispose', onUniformsGroupsDispose );\n\n\t\tconst index = allocatedBindingPoints.indexOf( uniformsGroup.__bindingPointIndex );\n\t\tallocatedBindingPoints.splice( index, 1 );\n\n\t\tgl.deleteBuffer( buffers[ uniformsGroup.id ] );\n\n\t\tdelete buffers[ uniformsGroup.id ];\n\t\tdelete updateList[ uniformsGroup.id ];\n\n\t}\n\n\tfunction dispose() {\n\n\t\tfor ( const id in buffers ) {\n\n\t\t\tgl.deleteBuffer( buffers[ id ] );\n\n\t\t}\n\n\t\tallocatedBindingPoints = [];\n\t\tbuffers = {};\n\t\tupdateList = {};\n\n\t}\n\n\treturn {\n\n\t\tbind: bind,\n\t\tupdate: update,\n\n\t\tdispose: dispose\n\n\t};\n\n}\n\nfunction createCanvasElement() {\n\n\tconst canvas = createElementNS( 'canvas' );\n\tcanvas.style.display = 'block';\n\treturn canvas;\n\n}\n\nfunction WebGLRenderer( parameters = {} ) {\n\n\tthis.isWebGLRenderer = true;\n\n\tconst _canvas = parameters.canvas !== undefined ? parameters.canvas : createCanvasElement(),\n\t\t_context = parameters.context !== undefined ? parameters.context : null,\n\n\t\t_depth = parameters.depth !== undefined ? parameters.depth : true,\n\t\t_stencil = parameters.stencil !== undefined ? parameters.stencil : true,\n\t\t_antialias = parameters.antialias !== undefined ? parameters.antialias : false,\n\t\t_premultipliedAlpha = parameters.premultipliedAlpha !== undefined ? parameters.premultipliedAlpha : true,\n\t\t_preserveDrawingBuffer = parameters.preserveDrawingBuffer !== undefined ? parameters.preserveDrawingBuffer : false,\n\t\t_powerPreference = parameters.powerPreference !== undefined ? parameters.powerPreference : 'default',\n\t\t_failIfMajorPerformanceCaveat = parameters.failIfMajorPerformanceCaveat !== undefined ? parameters.failIfMajorPerformanceCaveat : false;\n\n\tlet _alpha;\n\n\tif ( _context !== null ) {\n\n\t\t_alpha = _context.getContextAttributes().alpha;\n\n\t} else {\n\n\t\t_alpha = parameters.alpha !== undefined ? parameters.alpha : false;\n\n\t}\n\n\tlet currentRenderList = null;\n\tlet currentRenderState = null;\n\n\t// render() can be called from within a callback triggered by another render.\n\t// We track this so that the nested render call gets its list and state isolated from the parent render call.\n\n\tconst renderListStack = [];\n\tconst renderStateStack = [];\n\n\t// public properties\n\n\tthis.domElement = _canvas;\n\n\t// Debug configuration container\n\tthis.debug = {\n\n\t\t/**\n\t\t * Enables error checking and reporting when shader programs are being compiled\n\t\t * @type {boolean}\n\t\t */\n\t\tcheckShaderErrors: true\n\t};\n\n\t// clearing\n\n\tthis.autoClear = true;\n\tthis.autoClearColor = true;\n\tthis.autoClearDepth = true;\n\tthis.autoClearStencil = true;\n\n\t// scene graph\n\n\tthis.sortObjects = true;\n\n\t// user-defined clipping\n\n\tthis.clippingPlanes = [];\n\tthis.localClippingEnabled = false;\n\n\t// physically based shading\n\n\tthis.outputEncoding = LinearEncoding;\n\n\t// physical lights\n\n\tthis.physicallyCorrectLights = false;\n\n\t// tone mapping\n\n\tthis.toneMapping = NoToneMapping;\n\tthis.toneMappingExposure = 1.0;\n\n\t// internal properties\n\n\tconst _this = this;\n\n\tlet _isContextLost = false;\n\n\t// internal state cache\n\n\tlet _currentActiveCubeFace = 0;\n\tlet _currentActiveMipmapLevel = 0;\n\tlet _currentRenderTarget = null;\n\tlet _currentMaterialId = - 1;\n\n\tlet _currentCamera = null;\n\n\tconst _currentViewport = new Vector4();\n\tconst _currentScissor = new Vector4();\n\tlet _currentScissorTest = null;\n\n\t//\n\n\tlet _width = _canvas.width;\n\tlet _height = _canvas.height;\n\n\tlet _pixelRatio = 1;\n\tlet _opaqueSort = null;\n\tlet _transparentSort = null;\n\n\tconst _viewport = new Vector4( 0, 0, _width, _height );\n\tconst _scissor = new Vector4( 0, 0, _width, _height );\n\tlet _scissorTest = false;\n\n\t// frustum\n\n\tconst _frustum = new Frustum();\n\n\t// clipping\n\n\tlet _clippingEnabled = false;\n\tlet _localClippingEnabled = false;\n\n\t// transmission\n\n\tlet _transmissionRenderTarget = null;\n\n\t// camera matrices cache\n\n\tconst _projScreenMatrix = new Matrix4();\n\n\tconst _vector2 = new Vector2();\n\tconst _vector3 = new Vector3();\n\n\tconst _emptyScene = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: true };\n\n\tfunction getTargetPixelRatio() {\n\n\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t}\n\n\t// initialize\n\n\tlet _gl = _context;\n\n\tfunction getContext( contextNames, contextAttributes ) {\n\n\t\tfor ( let i = 0; i < contextNames.length; i ++ ) {\n\n\t\t\tconst contextName = contextNames[ i ];\n\t\t\tconst context = _canvas.getContext( contextName, contextAttributes );\n\t\t\tif ( context !== null ) return context;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\ttry {\n\n\t\tconst contextAttributes = {\n\t\t\talpha: true,\n\t\t\tdepth: _depth,\n\t\t\tstencil: _stencil,\n\t\t\tantialias: _antialias,\n\t\t\tpremultipliedAlpha: _premultipliedAlpha,\n\t\t\tpreserveDrawingBuffer: _preserveDrawingBuffer,\n\t\t\tpowerPreference: _powerPreference,\n\t\t\tfailIfMajorPerformanceCaveat: _failIfMajorPerformanceCaveat\n\t\t};\n\n\t\t// OffscreenCanvas does not have setAttribute, see #22811\n\t\tif ( 'setAttribute' in _canvas ) _canvas.setAttribute( 'data-engine', `three.js r${REVISION}` );\n\n\t\t// event listeners must be registered before WebGL context is created, see #12753\n\t\t_canvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\t\t_canvas.addEventListener( 'webglcontextrestored', onContextRestore, false );\n\t\t_canvas.addEventListener( 'webglcontextcreationerror', onContextCreationError, false );\n\n\t\tif ( _gl === null ) {\n\n\t\t\tconst contextNames = [ 'webgl2', 'webgl', 'experimental-webgl' ];\n\n\t\t\tif ( _this.isWebGL1Renderer === true ) {\n\n\t\t\t\tcontextNames.shift();\n\n\t\t\t}\n\n\t\t\t_gl = getContext( contextNames, contextAttributes );\n\n\t\t\tif ( _gl === null ) {\n\n\t\t\t\tif ( getContext( contextNames ) ) {\n\n\t\t\t\t\tthrow new Error( 'Error creating WebGL context with your selected attributes.' );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'Error creating WebGL context.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Some experimental-webgl implementations do not have getShaderPrecisionFormat\n\n\t\tif ( _gl.getShaderPrecisionFormat === undefined ) {\n\n\t\t\t_gl.getShaderPrecisionFormat = function () {\n\n\t\t\t\treturn { 'rangeMin': 1, 'rangeMax': 1, 'precision': 1 };\n\n\t\t\t};\n\n\t\t}\n\n\t} catch ( error ) {\n\n\t\tconsole.error( 'THREE.WebGLRenderer: ' + error.message );\n\t\tthrow error;\n\n\t}\n\n\tlet extensions, capabilities, state, info;\n\tlet properties, textures, cubemaps, cubeuvmaps, attributes, geometries, objects;\n\tlet programCache, materials, renderLists, renderStates, clipping, shadowMap;\n\n\tlet background, morphtargets, bufferRenderer, indexedBufferRenderer;\n\n\tlet utils, bindingStates, uniformsGroups;\n\n\tfunction initGLContext() {\n\n\t\textensions = new WebGLExtensions( _gl );\n\n\t\tcapabilities = new WebGLCapabilities( _gl, extensions, parameters );\n\n\t\textensions.init( capabilities );\n\n\t\tutils = new WebGLUtils( _gl, extensions, capabilities );\n\n\t\tstate = new WebGLState( _gl, extensions, capabilities );\n\n\t\tinfo = new WebGLInfo();\n\t\tproperties = new WebGLProperties();\n\t\ttextures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info );\n\t\tcubemaps = new WebGLCubeMaps( _this );\n\t\tcubeuvmaps = new WebGLCubeUVMaps( _this );\n\t\tattributes = new WebGLAttributes( _gl, capabilities );\n\t\tbindingStates = new WebGLBindingStates( _gl, extensions, attributes, capabilities );\n\t\tgeometries = new WebGLGeometries( _gl, attributes, info, bindingStates );\n\t\tobjects = new WebGLObjects( _gl, geometries, attributes, info );\n\t\tmorphtargets = new WebGLMorphtargets( _gl, capabilities, textures );\n\t\tclipping = new WebGLClipping( properties );\n\t\tprogramCache = new WebGLPrograms( _this, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping );\n\t\tmaterials = new WebGLMaterials( _this, properties );\n\t\trenderLists = new WebGLRenderLists();\n\t\trenderStates = new WebGLRenderStates( extensions, capabilities );\n\t\tbackground = new WebGLBackground( _this, cubemaps, cubeuvmaps, state, objects, _alpha, _premultipliedAlpha );\n\t\tshadowMap = new WebGLShadowMap( _this, objects, capabilities );\n\t\tuniformsGroups = new WebGLUniformsGroups( _gl, info, capabilities, state );\n\n\t\tbufferRenderer = new WebGLBufferRenderer( _gl, extensions, info, capabilities );\n\t\tindexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info, capabilities );\n\n\t\tinfo.programs = programCache.programs;\n\n\t\t_this.capabilities = capabilities;\n\t\t_this.extensions = extensions;\n\t\t_this.properties = properties;\n\t\t_this.renderLists = renderLists;\n\t\t_this.shadowMap = shadowMap;\n\t\t_this.state = state;\n\t\t_this.info = info;\n\n\t}\n\n\tinitGLContext();\n\n\t// xr\n\n\tconst xr = new WebXRManager( _this, _gl );\n\n\tthis.xr = xr;\n\n\t// API\n\n\tthis.getContext = function () {\n\n\t\treturn _gl;\n\n\t};\n\n\tthis.getContextAttributes = function () {\n\n\t\treturn _gl.getContextAttributes();\n\n\t};\n\n\tthis.forceContextLoss = function () {\n\n\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\tif ( extension ) extension.loseContext();\n\n\t};\n\n\tthis.forceContextRestore = function () {\n\n\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\tif ( extension ) extension.restoreContext();\n\n\t};\n\n\tthis.getPixelRatio = function () {\n\n\t\treturn _pixelRatio;\n\n\t};\n\n\tthis.setPixelRatio = function ( value ) {\n\n\t\tif ( value === undefined ) return;\n\n\t\t_pixelRatio = value;\n\n\t\tthis.setSize( _width, _height, false );\n\n\t};\n\n\tthis.getSize = function ( target ) {\n\n\t\treturn target.set( _width, _height );\n\n\t};\n\n\tthis.setSize = function ( width, height, updateStyle ) {\n\n\t\tif ( xr.isPresenting ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer: Can\\'t change size while VR device is presenting.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\t_width = width;\n\t\t_height = height;\n\n\t\t_canvas.width = Math.floor( width * _pixelRatio );\n\t\t_canvas.height = Math.floor( height * _pixelRatio );\n\n\t\tif ( updateStyle !== false ) {\n\n\t\t\t_canvas.style.width = width + 'px';\n\t\t\t_canvas.style.height = height + 'px';\n\n\t\t}\n\n\t\tthis.setViewport( 0, 0, width, height );\n\n\t};\n\n\tthis.getDrawingBufferSize = function ( target ) {\n\n\t\treturn target.set( _width * _pixelRatio, _height * _pixelRatio ).floor();\n\n\t};\n\n\tthis.setDrawingBufferSize = function ( width, height, pixelRatio ) {\n\n\t\t_width = width;\n\t\t_height = height;\n\n\t\t_pixelRatio = pixelRatio;\n\n\t\t_canvas.width = Math.floor( width * pixelRatio );\n\t\t_canvas.height = Math.floor( height * pixelRatio );\n\n\t\tthis.setViewport( 0, 0, width, height );\n\n\t};\n\n\tthis.getCurrentViewport = function ( target ) {\n\n\t\treturn target.copy( _currentViewport );\n\n\t};\n\n\tthis.getViewport = function ( target ) {\n\n\t\treturn target.copy( _viewport );\n\n\t};\n\n\tthis.setViewport = function ( x, y, width, height ) {\n\n\t\tif ( x.isVector4 ) {\n\n\t\t\t_viewport.set( x.x, x.y, x.z, x.w );\n\n\t\t} else {\n\n\t\t\t_viewport.set( x, y, width, height );\n\n\t\t}\n\n\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor() );\n\n\t};\n\n\tthis.getScissor = function ( target ) {\n\n\t\treturn target.copy( _scissor );\n\n\t};\n\n\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\tif ( x.isVector4 ) {\n\n\t\t\t_scissor.set( x.x, x.y, x.z, x.w );\n\n\t\t} else {\n\n\t\t\t_scissor.set( x, y, width, height );\n\n\t\t}\n\n\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor() );\n\n\t};\n\n\tthis.getScissorTest = function () {\n\n\t\treturn _scissorTest;\n\n\t};\n\n\tthis.setScissorTest = function ( boolean ) {\n\n\t\tstate.setScissorTest( _scissorTest = boolean );\n\n\t};\n\n\tthis.setOpaqueSort = function ( method ) {\n\n\t\t_opaqueSort = method;\n\n\t};\n\n\tthis.setTransparentSort = function ( method ) {\n\n\t\t_transparentSort = method;\n\n\t};\n\n\t// Clearing\n\n\tthis.getClearColor = function ( target ) {\n\n\t\treturn target.copy( background.getClearColor() );\n\n\t};\n\n\tthis.setClearColor = function () {\n\n\t\tbackground.setClearColor.apply( background, arguments );\n\n\t};\n\n\tthis.getClearAlpha = function () {\n\n\t\treturn background.getClearAlpha();\n\n\t};\n\n\tthis.setClearAlpha = function () {\n\n\t\tbackground.setClearAlpha.apply( background, arguments );\n\n\t};\n\n\tthis.clear = function ( color = true, depth = true, stencil = true ) {\n\n\t\tlet bits = 0;\n\n\t\tif ( color ) bits |= 16384;\n\t\tif ( depth ) bits |= 256;\n\t\tif ( stencil ) bits |= 1024;\n\n\t\t_gl.clear( bits );\n\n\t};\n\n\tthis.clearColor = function () {\n\n\t\tthis.clear( true, false, false );\n\n\t};\n\n\tthis.clearDepth = function () {\n\n\t\tthis.clear( false, true, false );\n\n\t};\n\n\tthis.clearStencil = function () {\n\n\t\tthis.clear( false, false, true );\n\n\t};\n\n\t//\n\n\tthis.dispose = function () {\n\n\t\t_canvas.removeEventListener( 'webglcontextlost', onContextLost, false );\n\t\t_canvas.removeEventListener( 'webglcontextrestored', onContextRestore, false );\n\t\t_canvas.removeEventListener( 'webglcontextcreationerror', onContextCreationError, false );\n\n\t\trenderLists.dispose();\n\t\trenderStates.dispose();\n\t\tproperties.dispose();\n\t\tcubemaps.dispose();\n\t\tcubeuvmaps.dispose();\n\t\tobjects.dispose();\n\t\tbindingStates.dispose();\n\t\tuniformsGroups.dispose();\n\t\tprogramCache.dispose();\n\n\t\txr.dispose();\n\n\t\txr.removeEventListener( 'sessionstart', onXRSessionStart );\n\t\txr.removeEventListener( 'sessionend', onXRSessionEnd );\n\n\t\tif ( _transmissionRenderTarget ) {\n\n\t\t\t_transmissionRenderTarget.dispose();\n\t\t\t_transmissionRenderTarget = null;\n\n\t\t}\n\n\t\tanimation.stop();\n\n\t};\n\n\t// Events\n\n\tfunction onContextLost( event ) {\n\n\t\tevent.preventDefault();\n\n\t\tconsole.log( 'THREE.WebGLRenderer: Context Lost.' );\n\n\t\t_isContextLost = true;\n\n\t}\n\n\tfunction onContextRestore( /* event */ ) {\n\n\t\tconsole.log( 'THREE.WebGLRenderer: Context Restored.' );\n\n\t\t_isContextLost = false;\n\n\t\tconst infoAutoReset = info.autoReset;\n\t\tconst shadowMapEnabled = shadowMap.enabled;\n\t\tconst shadowMapAutoUpdate = shadowMap.autoUpdate;\n\t\tconst shadowMapNeedsUpdate = shadowMap.needsUpdate;\n\t\tconst shadowMapType = shadowMap.type;\n\n\t\tinitGLContext();\n\n\t\tinfo.autoReset = infoAutoReset;\n\t\tshadowMap.enabled = shadowMapEnabled;\n\t\tshadowMap.autoUpdate = shadowMapAutoUpdate;\n\t\tshadowMap.needsUpdate = shadowMapNeedsUpdate;\n\t\tshadowMap.type = shadowMapType;\n\n\t}\n\n\tfunction onContextCreationError( event ) {\n\n\t\tconsole.error( 'THREE.WebGLRenderer: A WebGL context could not be created. Reason: ', event.statusMessage );\n\n\t}\n\n\tfunction onMaterialDispose( event ) {\n\n\t\tconst material = event.target;\n\n\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\tdeallocateMaterial( material );\n\n\t}\n\n\t// Buffer deallocation\n\n\tfunction deallocateMaterial( material ) {\n\n\t\treleaseMaterialProgramReferences( material );\n\n\t\tproperties.remove( material );\n\n\t}\n\n\n\tfunction releaseMaterialProgramReferences( material ) {\n\n\t\tconst programs = properties.get( material ).programs;\n\n\t\tif ( programs !== undefined ) {\n\n\t\t\tprograms.forEach( function ( program ) {\n\n\t\t\t\tprogramCache.releaseProgram( program );\n\n\t\t\t} );\n\n\t\t\tif ( material.isShaderMaterial ) {\n\n\t\t\t\tprogramCache.releaseShaderCache( material );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// Buffer rendering\n\n\tthis.renderBufferDirect = function ( camera, scene, geometry, material, object, group ) {\n\n\t\tif ( scene === null ) scene = _emptyScene; // renderBufferDirect second parameter used to be fog (could be null)\n\n\t\tconst frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );\n\n\t\tconst program = setProgram( camera, scene, geometry, material, object );\n\n\t\tstate.setMaterial( material, frontFaceCW );\n\n\t\t//\n\n\t\tlet index = geometry.index;\n\t\tlet rangeFactor = 1;\n\n\t\tif ( material.wireframe === true ) {\n\n\t\t\tindex = geometries.getWireframeAttribute( geometry );\n\t\t\trangeFactor = 2;\n\n\t\t}\n\n\t\t//\n\n\t\tconst drawRange = geometry.drawRange;\n\t\tconst position = geometry.attributes.position;\n\n\t\tlet drawStart = drawRange.start * rangeFactor;\n\t\tlet drawEnd = ( drawRange.start + drawRange.count ) * rangeFactor;\n\n\t\tif ( group !== null ) {\n\n\t\t\tdrawStart = Math.max( drawStart, group.start * rangeFactor );\n\t\t\tdrawEnd = Math.min( drawEnd, ( group.start + group.count ) * rangeFactor );\n\n\t\t}\n\n\t\tif ( index !== null ) {\n\n\t\t\tdrawStart = Math.max( drawStart, 0 );\n\t\t\tdrawEnd = Math.min( drawEnd, index.count );\n\n\t\t} else if ( position !== undefined && position !== null ) {\n\n\t\t\tdrawStart = Math.max( drawStart, 0 );\n\t\t\tdrawEnd = Math.min( drawEnd, position.count );\n\n\t\t}\n\n\t\tconst drawCount = drawEnd - drawStart;\n\n\t\tif ( drawCount < 0 || drawCount === Infinity ) return;\n\n\t\t//\n\n\t\tbindingStates.setup( object, material, program, geometry, index );\n\n\t\tlet attribute;\n\t\tlet renderer = bufferRenderer;\n\n\t\tif ( index !== null ) {\n\n\t\t\tattribute = attributes.get( index );\n\n\t\t\trenderer = indexedBufferRenderer;\n\t\t\trenderer.setIndex( attribute );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( object.isMesh ) {\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tstate.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );\n\t\t\t\trenderer.setMode( 1 );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.setMode( 4 );\n\n\t\t\t}\n\n\t\t} else if ( object.isLine ) {\n\n\t\t\tlet lineWidth = material.linewidth;\n\n\t\t\tif ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material\n\n\t\t\tstate.setLineWidth( lineWidth * getTargetPixelRatio() );\n\n\t\t\tif ( object.isLineSegments ) {\n\n\t\t\t\trenderer.setMode( 1 );\n\n\t\t\t} else if ( object.isLineLoop ) {\n\n\t\t\t\trenderer.setMode( 2 );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.setMode( 3 );\n\n\t\t\t}\n\n\t\t} else if ( object.isPoints ) {\n\n\t\t\trenderer.setMode( 0 );\n\n\t\t} else if ( object.isSprite ) {\n\n\t\t\trenderer.setMode( 4 );\n\n\t\t}\n\n\t\tif ( object.isInstancedMesh ) {\n\n\t\t\trenderer.renderInstances( drawStart, drawCount, object.count );\n\n\t\t} else if ( geometry.isInstancedBufferGeometry ) {\n\n\t\t\tconst maxInstanceCount = geometry._maxInstanceCount !== undefined ? geometry._maxInstanceCount : Infinity;\n\t\t\tconst instanceCount = Math.min( geometry.instanceCount, maxInstanceCount );\n\n\t\t\trenderer.renderInstances( drawStart, drawCount, instanceCount );\n\n\t\t} else {\n\n\t\t\trenderer.render( drawStart, drawCount );\n\n\t\t}\n\n\t};\n\n\t// Compile\n\n\tthis.compile = function ( scene, camera ) {\n\n\t\tfunction prepare( material, scene, object ) {\n\n\t\t\tif ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {\n\n\t\t\t\tmaterial.side = BackSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t\tmaterial.side = FrontSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t\tmaterial.side = DoubleSide;\n\n\t\t\t} else {\n\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t}\n\n\t\t}\n\n\t\tcurrentRenderState = renderStates.get( scene );\n\t\tcurrentRenderState.init();\n\n\t\trenderStateStack.push( currentRenderState );\n\n\t\tscene.traverseVisible( function ( object ) {\n\n\t\t\tif ( object.isLight && object.layers.test( camera.layers ) ) {\n\n\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t\tcurrentRenderState.setupLights( _this.physicallyCorrectLights );\n\n\t\tscene.traverse( function ( object ) {\n\n\t\t\tconst material = object.material;\n\n\t\t\tif ( material ) {\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tfor ( let i = 0; i < material.length; i ++ ) {\n\n\t\t\t\t\t\tconst material2 = material[ i ];\n\n\t\t\t\t\t\tprepare( material2, scene, object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tprepare( material, scene, object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t\trenderStateStack.pop();\n\t\tcurrentRenderState = null;\n\n\t};\n\n\t// Animation Loop\n\n\tlet onAnimationFrameCallback = null;\n\n\tfunction onAnimationFrame( time ) {\n\n\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time );\n\n\t}\n\n\tfunction onXRSessionStart() {\n\n\t\tanimation.stop();\n\n\t}\n\n\tfunction onXRSessionEnd() {\n\n\t\tanimation.start();\n\n\t}\n\n\tconst animation = new WebGLAnimation();\n\tanimation.setAnimationLoop( onAnimationFrame );\n\n\tif ( typeof self !== 'undefined' ) animation.setContext( self );\n\n\tthis.setAnimationLoop = function ( callback ) {\n\n\t\tonAnimationFrameCallback = callback;\n\t\txr.setAnimationLoop( callback );\n\n\t\t( callback === null ) ? animation.stop() : animation.start();\n\n\t};\n\n\txr.addEventListener( 'sessionstart', onXRSessionStart );\n\txr.addEventListener( 'sessionend', onXRSessionEnd );\n\n\t// Rendering\n\n\tthis.render = function ( scene, camera ) {\n\n\t\tif ( camera !== undefined && camera.isCamera !== true ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( _isContextLost === true ) return;\n\n\t\t// update scene graph\n\n\t\tif ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t// update camera matrices and frustum\n\n\t\tif ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();\n\n\t\tif ( xr.enabled === true && xr.isPresenting === true ) {\n\n\t\t\tif ( xr.cameraAutoUpdate === true ) xr.updateCamera( camera );\n\n\t\t\tcamera = xr.getCamera(); // use XR camera for rendering\n\n\t\t}\n\n\t\t//\n\t\tif ( scene.isScene === true ) scene.onBeforeRender( _this, scene, camera, _currentRenderTarget );\n\n\t\tcurrentRenderState = renderStates.get( scene, renderStateStack.length );\n\t\tcurrentRenderState.init();\n\n\t\trenderStateStack.push( currentRenderState );\n\n\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t_frustum.setFromProjectionMatrix( _projScreenMatrix );\n\n\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t_clippingEnabled = clipping.init( this.clippingPlanes, _localClippingEnabled );\n\n\t\tcurrentRenderList = renderLists.get( scene, renderListStack.length );\n\t\tcurrentRenderList.init();\n\n\t\trenderListStack.push( currentRenderList );\n\n\t\tprojectObject( scene, camera, 0, _this.sortObjects );\n\n\t\tcurrentRenderList.finish();\n\n\t\tif ( _this.sortObjects === true ) {\n\n\t\t\tcurrentRenderList.sort( _opaqueSort, _transparentSort );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( _clippingEnabled === true ) clipping.beginShadows();\n\n\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\tshadowMap.render( shadowsArray, scene, camera );\n\n\t\tif ( _clippingEnabled === true ) clipping.endShadows();\n\n\t\t//\n\n\t\tif ( this.info.autoReset === true ) this.info.reset();\n\n\t\t//\n\n\t\tbackground.render( currentRenderList, scene );\n\n\t\t// render scene\n\n\t\tcurrentRenderState.setupLights( _this.physicallyCorrectLights );\n\n\t\tif ( camera.isArrayCamera ) {\n\n\t\t\tconst cameras = camera.cameras;\n\n\t\t\tfor ( let i = 0, l = cameras.length; i < l; i ++ ) {\n\n\t\t\t\tconst camera2 = cameras[ i ];\n\n\t\t\t\trenderScene( currentRenderList, scene, camera2, camera2.viewport );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\trenderScene( currentRenderList, scene, camera );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( _currentRenderTarget !== null ) {\n\n\t\t\t// resolve multisample renderbuffers to a single-sample texture if necessary\n\n\t\t\ttextures.updateMultisampleRenderTarget( _currentRenderTarget );\n\n\t\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\t\ttextures.updateRenderTargetMipmap( _currentRenderTarget );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( scene.isScene === true ) scene.onAfterRender( _this, scene, camera );\n\n\t\t// _gl.finish();\n\n\t\tbindingStates.resetDefaultState();\n\t\t_currentMaterialId = - 1;\n\t\t_currentCamera = null;\n\n\t\trenderStateStack.pop();\n\n\t\tif ( renderStateStack.length > 0 ) {\n\n\t\t\tcurrentRenderState = renderStateStack[ renderStateStack.length - 1 ];\n\n\t\t} else {\n\n\t\t\tcurrentRenderState = null;\n\n\t\t}\n\n\t\trenderListStack.pop();\n\n\t\tif ( renderListStack.length > 0 ) {\n\n\t\t\tcurrentRenderList = renderListStack[ renderListStack.length - 1 ];\n\n\t\t} else {\n\n\t\t\tcurrentRenderList = null;\n\n\t\t}\n\n\t};\n\n\tfunction projectObject( object, camera, groupOrder, sortObjects ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tconst visible = object.layers.test( camera.layers );\n\n\t\tif ( visible ) {\n\n\t\t\tif ( object.isGroup ) {\n\n\t\t\t\tgroupOrder = object.renderOrder;\n\n\t\t\t} else if ( object.isLOD ) {\n\n\t\t\t\tif ( object.autoUpdate === true ) object.update( camera );\n\n\t\t\t} else if ( object.isLight ) {\n\n\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {\n\n\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\tif ( material.visible ) {\n\n\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\t\t// update skeleton only once in a frame\n\n\t\t\t\t\tif ( object.skeleton.frame !== info.render.frame ) {\n\n\t\t\t\t\t\tobject.skeleton.update();\n\t\t\t\t\t\tobject.skeleton.frame = info.render.frame;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {\n\n\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, groupMaterial, groupOrder, _vector3.z, group );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector3.z, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tprojectObject( children[ i ], camera, groupOrder, sortObjects );\n\n\t\t}\n\n\t}\n\n\tfunction renderScene( currentRenderList, scene, camera, viewport ) {\n\n\t\tconst opaqueObjects = currentRenderList.opaque;\n\t\tconst transmissiveObjects = currentRenderList.transmissive;\n\t\tconst transparentObjects = currentRenderList.transparent;\n\n\t\tcurrentRenderState.setupLightsView( camera );\n\n\t\tif ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, camera );\n\n\t\tif ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, scene, camera );\n\n\t\tif ( viewport ) state.viewport( _currentViewport.copy( viewport ) );\n\n\t\tif ( opaqueObjects.length > 0 ) renderObjects( opaqueObjects, scene, camera );\n\t\tif ( transmissiveObjects.length > 0 ) renderObjects( transmissiveObjects, scene, camera );\n\t\tif ( transparentObjects.length > 0 ) renderObjects( transparentObjects, scene, camera );\n\n\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\tstate.buffers.depth.setTest( true );\n\t\tstate.buffers.depth.setMask( true );\n\t\tstate.buffers.color.setMask( true );\n\n\t\tstate.setPolygonOffset( false );\n\n\t}\n\n\tfunction renderTransmissionPass( opaqueObjects, scene, camera ) {\n\n\t\tconst isWebGL2 = capabilities.isWebGL2;\n\n\t\tif ( _transmissionRenderTarget === null ) {\n\n\t\t\t_transmissionRenderTarget = new WebGLRenderTarget( 1, 1, {\n\t\t\t\tgenerateMipmaps: true,\n\t\t\t\ttype: extensions.has( 'EXT_color_buffer_half_float' ) ? HalfFloatType : UnsignedByteType,\n\t\t\t\tminFilter: LinearMipmapLinearFilter,\n\t\t\t\tsamples: ( isWebGL2 && _antialias === true ) ? 4 : 0\n\t\t\t} );\n\n\t\t}\n\n\t\t_this.getDrawingBufferSize( _vector2 );\n\n\t\tif ( isWebGL2 ) {\n\n\t\t\t_transmissionRenderTarget.setSize( _vector2.x, _vector2.y );\n\n\t\t} else {\n\n\t\t\t_transmissionRenderTarget.setSize( floorPowerOfTwo( _vector2.x ), floorPowerOfTwo( _vector2.y ) );\n\n\t\t}\n\n\t\t//\n\n\t\tconst currentRenderTarget = _this.getRenderTarget();\n\t\t_this.setRenderTarget( _transmissionRenderTarget );\n\t\t_this.clear();\n\n\t\t// Turn off the features which can affect the frag color for opaque objects pass.\n\t\t// Otherwise they are applied twice in opaque objects pass and transmission objects pass.\n\t\tconst currentToneMapping = _this.toneMapping;\n\t\t_this.toneMapping = NoToneMapping;\n\n\t\trenderObjects( opaqueObjects, scene, camera );\n\n\t\t_this.toneMapping = currentToneMapping;\n\n\t\ttextures.updateMultisampleRenderTarget( _transmissionRenderTarget );\n\t\ttextures.updateRenderTargetMipmap( _transmissionRenderTarget );\n\n\t\t_this.setRenderTarget( currentRenderTarget );\n\n\t}\n\n\tfunction renderObjects( renderList, scene, camera ) {\n\n\t\tconst overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;\n\n\t\tfor ( let i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\tconst renderItem = renderList[ i ];\n\n\t\t\tconst object = renderItem.object;\n\t\t\tconst geometry = renderItem.geometry;\n\t\t\tconst material = overrideMaterial === null ? renderItem.material : overrideMaterial;\n\t\t\tconst group = renderItem.group;\n\n\t\t\tif ( object.layers.test( camera.layers ) ) {\n\n\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction renderObject( object, scene, camera, geometry, material, group ) {\n\n\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\n\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\tmaterial.onBeforeRender( _this, scene, camera, geometry, object, group );\n\n\t\tif ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {\n\n\t\t\tmaterial.side = BackSide;\n\t\t\tmaterial.needsUpdate = true;\n\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\tmaterial.side = FrontSide;\n\t\t\tmaterial.needsUpdate = true;\n\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\tmaterial.side = DoubleSide;\n\n\t\t} else {\n\n\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t}\n\n\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\n\t}\n\n\tfunction getProgram( material, scene, object ) {\n\n\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tconst lights = currentRenderState.state.lights;\n\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\tconst lightsStateVersion = lights.state.version;\n\n\t\tconst parameters = programCache.getParameters( material, lights.state, shadowsArray, scene, object );\n\t\tconst programCacheKey = programCache.getProgramCacheKey( parameters );\n\n\t\tlet programs = materialProperties.programs;\n\n\t\t// always update environment and fog - changing these trigger an getProgram call, but it's possible that the program doesn't change\n\n\t\tmaterialProperties.environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\tmaterialProperties.fog = scene.fog;\n\t\tmaterialProperties.envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || materialProperties.environment );\n\n\t\tif ( programs === undefined ) {\n\n\t\t\t// new material\n\n\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\tprograms = new Map();\n\t\t\tmaterialProperties.programs = programs;\n\n\t\t}\n\n\t\tlet program = programs.get( programCacheKey );\n\n\t\tif ( program !== undefined ) {\n\n\t\t\t// early out if program and light state is identical\n\n\t\t\tif ( materialProperties.currentProgram === program && materialProperties.lightsStateVersion === lightsStateVersion ) {\n\n\t\t\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t\t\treturn program;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tparameters.uniforms = programCache.getUniforms( material );\n\n\t\t\tmaterial.onBuild( object, parameters, _this );\n\n\t\t\tmaterial.onBeforeCompile( parameters, _this );\n\n\t\t\tprogram = programCache.acquireProgram( parameters, programCacheKey );\n\t\t\tprograms.set( programCacheKey, program );\n\n\t\t\tmaterialProperties.uniforms = parameters.uniforms;\n\n\t\t}\n\n\t\tconst uniforms = materialProperties.uniforms;\n\n\t\tif ( ( ! material.isShaderMaterial && ! material.isRawShaderMaterial ) || material.clipping === true ) {\n\n\t\t\tuniforms.clippingPlanes = clipping.uniform;\n\n\t\t}\n\n\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t// store the light setup it was created for\n\n\t\tmaterialProperties.needsLights = materialNeedsLights( material );\n\t\tmaterialProperties.lightsStateVersion = lightsStateVersion;\n\n\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t// wire up the material to this renderer's lighting state\n\n\t\t\tuniforms.ambientLightColor.value = lights.state.ambient;\n\t\t\tuniforms.lightProbe.value = lights.state.probe;\n\t\t\tuniforms.directionalLights.value = lights.state.directional;\n\t\t\tuniforms.directionalLightShadows.value = lights.state.directionalShadow;\n\t\t\tuniforms.spotLights.value = lights.state.spot;\n\t\t\tuniforms.spotLightShadows.value = lights.state.spotShadow;\n\t\t\tuniforms.rectAreaLights.value = lights.state.rectArea;\n\t\t\tuniforms.ltc_1.value = lights.state.rectAreaLTC1;\n\t\t\tuniforms.ltc_2.value = lights.state.rectAreaLTC2;\n\t\t\tuniforms.pointLights.value = lights.state.point;\n\t\t\tuniforms.pointLightShadows.value = lights.state.pointShadow;\n\t\t\tuniforms.hemisphereLights.value = lights.state.hemi;\n\n\t\t\tuniforms.directionalShadowMap.value = lights.state.directionalShadowMap;\n\t\t\tuniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix;\n\t\t\tuniforms.spotShadowMap.value = lights.state.spotShadowMap;\n\t\t\tuniforms.spotLightMatrix.value = lights.state.spotLightMatrix;\n\t\t\tuniforms.spotLightMap.value = lights.state.spotLightMap;\n\t\t\tuniforms.pointShadowMap.value = lights.state.pointShadowMap;\n\t\t\tuniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix;\n\t\t\t// TODO (abelnation): add area lights shadow info to uniforms\n\n\t\t}\n\n\t\tconst progUniforms = program.getUniforms();\n\t\tconst uniformsList = WebGLUniforms.seqWithValue( progUniforms.seq, uniforms );\n\n\t\tmaterialProperties.currentProgram = program;\n\t\tmaterialProperties.uniformsList = uniformsList;\n\n\t\treturn program;\n\n\t}\n\n\tfunction updateCommonMaterialProperties( material, parameters ) {\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tmaterialProperties.outputEncoding = parameters.outputEncoding;\n\t\tmaterialProperties.instancing = parameters.instancing;\n\t\tmaterialProperties.skinning = parameters.skinning;\n\t\tmaterialProperties.morphTargets = parameters.morphTargets;\n\t\tmaterialProperties.morphNormals = parameters.morphNormals;\n\t\tmaterialProperties.morphColors = parameters.morphColors;\n\t\tmaterialProperties.morphTargetsCount = parameters.morphTargetsCount;\n\t\tmaterialProperties.numClippingPlanes = parameters.numClippingPlanes;\n\t\tmaterialProperties.numIntersection = parameters.numClipIntersection;\n\t\tmaterialProperties.vertexAlphas = parameters.vertexAlphas;\n\t\tmaterialProperties.vertexTangents = parameters.vertexTangents;\n\t\tmaterialProperties.toneMapping = parameters.toneMapping;\n\n\t}\n\n\tfunction setProgram( camera, scene, geometry, material, object ) {\n\n\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\ttextures.resetTextureUnits();\n\n\t\tconst fog = scene.fog;\n\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\tconst encoding = ( _currentRenderTarget === null ) ? _this.outputEncoding : ( _currentRenderTarget.isXRRenderTarget === true ? _currentRenderTarget.texture.encoding : LinearEncoding );\n\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\t\tconst vertexAlphas = material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4;\n\t\tconst vertexTangents = !! material.normalMap && !! geometry.attributes.tangent;\n\t\tconst morphTargets = !! geometry.morphAttributes.position;\n\t\tconst morphNormals = !! geometry.morphAttributes.normal;\n\t\tconst morphColors = !! geometry.morphAttributes.color;\n\t\tconst toneMapping = material.toneMapped ? _this.toneMapping : NoToneMapping;\n\n\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\tconst materialProperties = properties.get( material );\n\t\tconst lights = currentRenderState.state.lights;\n\n\t\tif ( _clippingEnabled === true ) {\n\n\t\t\tif ( _localClippingEnabled === true || camera !== _currentCamera ) {\n\n\t\t\t\tconst useCache =\n\t\t\t\t\tcamera === _currentCamera &&\n\t\t\t\t\tmaterial.id === _currentMaterialId;\n\n\t\t\t\t// we might want to call this function with some ClippingGroup\n\t\t\t\t// object instead of the material, once it becomes feasible\n\t\t\t\t// (#8465, #8379)\n\t\t\t\tclipping.setState( material, camera, useCache );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tlet needsProgramChange = false;\n\n\t\tif ( material.version === materialProperties.__version ) {\n\n\t\t\tif ( materialProperties.needsLights && ( materialProperties.lightsStateVersion !== lights.state.version ) ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.outputEncoding !== encoding ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancing === false ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( ! object.isInstancedMesh && materialProperties.instancing === true ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( object.isSkinnedMesh && materialProperties.skinning === false ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( ! object.isSkinnedMesh && materialProperties.skinning === true ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.envMap !== envMap ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( material.fog === true && materialProperties.fog !== fog ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.numClippingPlanes !== undefined &&\n\t\t\t\t( materialProperties.numClippingPlanes !== clipping.numPlanes ||\n\t\t\t\tmaterialProperties.numIntersection !== clipping.numIntersection ) ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.vertexAlphas !== vertexAlphas ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.vertexTangents !== vertexTangents ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.morphTargets !== morphTargets ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.morphNormals !== morphNormals ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.morphColors !== morphColors ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( materialProperties.toneMapping !== toneMapping ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t} else if ( capabilities.isWebGL2 === true && materialProperties.morphTargetsCount !== morphTargetsCount ) {\n\n\t\t\t\tneedsProgramChange = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tneedsProgramChange = true;\n\t\t\tmaterialProperties.__version = material.version;\n\n\t\t}\n\n\t\t//\n\n\t\tlet program = materialProperties.currentProgram;\n\n\t\tif ( needsProgramChange === true ) {\n\n\t\t\tprogram = getProgram( material, scene, object );\n\n\t\t}\n\n\t\tlet refreshProgram = false;\n\t\tlet refreshMaterial = false;\n\t\tlet refreshLights = false;\n\n\t\tconst p_uniforms = program.getUniforms(),\n\t\t\tm_uniforms = materialProperties.uniforms;\n\n\t\tif ( state.useProgram( program.program ) ) {\n\n\t\t\trefreshProgram = true;\n\t\t\trefreshMaterial = true;\n\t\t\trefreshLights = true;\n\n\t\t}\n\n\t\tif ( material.id !== _currentMaterialId ) {\n\n\t\t\t_currentMaterialId = material.id;\n\n\t\t\trefreshMaterial = true;\n\n\t\t}\n\n\t\tif ( refreshProgram || _currentCamera !== camera ) {\n\n\t\t\tp_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );\n\n\t\t\tif ( capabilities.logarithmicDepthBuffer ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'logDepthBufFC',\n\t\t\t\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t}\n\n\t\t\tif ( _currentCamera !== camera ) {\n\n\t\t\t\t_currentCamera = camera;\n\n\t\t\t\t// lighting uniforms depend on the camera so enforce an update\n\t\t\t\t// now, in case this material supports lights - or later, when\n\t\t\t\t// the next material that does gets activated:\n\n\t\t\t\trefreshMaterial = true;\t\t// set to true on material change\n\t\t\t\trefreshLights = true;\t\t// remains set until update done\n\n\t\t\t}\n\n\t\t\t// load material specific uniforms\n\t\t\t// (shader material also gets them for the sake of genericity)\n\n\t\t\tif ( material.isShaderMaterial ||\n\t\t\t\tmaterial.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\tmaterial.envMap ) {\n\n\t\t\t\tconst uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\tuCamPos.setValue( _gl,\n\t\t\t\t\t\t_vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\tmaterial.isShaderMaterial ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'isOrthographic', camera.isOrthographicCamera === true );\n\n\t\t\t}\n\n\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\tmaterial.isShaderMaterial ||\n\t\t\t\tmaterial.isShadowMaterial ||\n\t\t\t\tobject.isSkinnedMesh ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// skinning and morph target uniforms must be set even if material didn't change\n\t\t// auto-setting of texture unit for bone and morph texture must go before other textures\n\t\t// otherwise textures used for skinning and morphing can take over texture units reserved for other material textures\n\n\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrix' );\n\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );\n\n\t\t\tconst skeleton = object.skeleton;\n\n\t\t\tif ( skeleton ) {\n\n\t\t\t\tif ( capabilities.floatVertexTextures ) {\n\n\t\t\t\t\tif ( skeleton.boneTexture === null ) skeleton.computeBoneTexture();\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture, textures );\n\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTextureSize', skeleton.boneTextureSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: SkinnedMesh can only be used with WebGL 2. With WebGL 1 OES_texture_float and vertex textures support is required.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\n\t\tif ( morphAttributes.position !== undefined || morphAttributes.normal !== undefined || ( morphAttributes.color !== undefined && capabilities.isWebGL2 === true ) ) {\n\n\t\t\tmorphtargets.update( object, geometry, material, program );\n\n\t\t}\n\n\t\tif ( refreshMaterial || materialProperties.receiveShadow !== object.receiveShadow ) {\n\n\t\t\tmaterialProperties.receiveShadow = object.receiveShadow;\n\t\t\tp_uniforms.setValue( _gl, 'receiveShadow', object.receiveShadow );\n\n\t\t}\n\n\t\t// https://github.com/mrdoob/three.js/pull/24467#issuecomment-1209031512\n\n\t\tif ( material.isMeshGouraudMaterial && material.envMap !== null ) {\n\n\t\t\tm_uniforms.envMap.value = envMap;\n\n\t\t\tm_uniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? - 1 : 1;\n\n\t\t}\n\n\t\tif ( refreshMaterial ) {\n\n\t\t\tp_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure );\n\n\t\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t\t// the current material requires lighting info\n\n\t\t\t\t// note: all lighting uniforms are always set correctly\n\t\t\t\t// they simply reference the renderer's state for their\n\t\t\t\t// values\n\t\t\t\t//\n\t\t\t\t// use the current material's .needsUpdate flags to set\n\t\t\t\t// the GL state when required\n\n\t\t\t\tmarkUniformsLightsNeedsUpdate( m_uniforms, refreshLights );\n\n\t\t\t}\n\n\t\t\t// refresh uniforms common to several materials\n\n\t\t\tif ( fog && material.fog === true ) {\n\n\t\t\t\tmaterials.refreshFogUniforms( m_uniforms, fog );\n\n\t\t\t}\n\n\t\t\tmaterials.refreshMaterialUniforms( m_uniforms, material, _pixelRatio, _height, _transmissionRenderTarget );\n\n\t\t\tWebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, textures );\n\n\t\t}\n\n\t\tif ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) {\n\n\t\t\tWebGLUniforms.upload( _gl, materialProperties.uniformsList, m_uniforms, textures );\n\t\t\tmaterial.uniformsNeedUpdate = false;\n\n\t\t}\n\n\t\tif ( material.isSpriteMaterial ) {\n\n\t\t\tp_uniforms.setValue( _gl, 'center', object.center );\n\n\t\t}\n\n\t\t// common matrices\n\n\t\tp_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix );\n\t\tp_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix );\n\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\t// UBOs\n\n\t\tif ( material.isShaderMaterial || material.isRawShaderMaterial ) {\n\n\t\t\tconst groups = material.uniformsGroups;\n\n\t\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\tif ( capabilities.isWebGL2 ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\n\t\t\t\t\tuniformsGroups.update( group, program );\n\t\t\t\t\tuniformsGroups.bind( group, program );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Uniform Buffer Objects can only be used with WebGL 2.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn program;\n\n\t}\n\n\t// If uniforms are marked as clean, they don't need to be loaded to the GPU.\n\n\tfunction markUniformsLightsNeedsUpdate( uniforms, value ) {\n\n\t\tuniforms.ambientLightColor.needsUpdate = value;\n\t\tuniforms.lightProbe.needsUpdate = value;\n\n\t\tuniforms.directionalLights.needsUpdate = value;\n\t\tuniforms.directionalLightShadows.needsUpdate = value;\n\t\tuniforms.pointLights.needsUpdate = value;\n\t\tuniforms.pointLightShadows.needsUpdate = value;\n\t\tuniforms.spotLights.needsUpdate = value;\n\t\tuniforms.spotLightShadows.needsUpdate = value;\n\t\tuniforms.rectAreaLights.needsUpdate = value;\n\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t}\n\n\tfunction materialNeedsLights( material ) {\n\n\t\treturn material.isMeshLambertMaterial || material.isMeshToonMaterial || material.isMeshPhongMaterial ||\n\t\t\tmaterial.isMeshStandardMaterial || material.isShadowMaterial ||\n\t\t\t( material.isShaderMaterial && material.lights === true );\n\n\t}\n\n\tthis.getActiveCubeFace = function () {\n\n\t\treturn _currentActiveCubeFace;\n\n\t};\n\n\tthis.getActiveMipmapLevel = function () {\n\n\t\treturn _currentActiveMipmapLevel;\n\n\t};\n\n\tthis.getRenderTarget = function () {\n\n\t\treturn _currentRenderTarget;\n\n\t};\n\n\tthis.setRenderTargetTextures = function ( renderTarget, colorTexture, depthTexture ) {\n\n\t\tproperties.get( renderTarget.texture ).__webglTexture = colorTexture;\n\t\tproperties.get( renderTarget.depthTexture ).__webglTexture = depthTexture;\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\trenderTargetProperties.__hasExternalTextures = true;\n\n\t\tif ( renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\trenderTargetProperties.__autoAllocateDepthBuffer = depthTexture === undefined;\n\n\t\t\tif ( ! renderTargetProperties.__autoAllocateDepthBuffer ) {\n\n\t\t\t\t// The multisample_render_to_texture extension doesn't work properly if there\n\t\t\t\t// are midframe flushes and an external depth buffer. Disable use of the extension.\n\t\t\t\tif ( extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: Render-to-texture extension was disabled because an external texture was provided' );\n\t\t\t\t\trenderTargetProperties.__useRenderToTexture = false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tthis.setRenderTargetFramebuffer = function ( renderTarget, defaultFramebuffer ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\trenderTargetProperties.__webglFramebuffer = defaultFramebuffer;\n\t\trenderTargetProperties.__useDefaultFramebuffer = defaultFramebuffer === undefined;\n\n\t};\n\n\tthis.setRenderTarget = function ( renderTarget, activeCubeFace = 0, activeMipmapLevel = 0 ) {\n\n\t\t_currentRenderTarget = renderTarget;\n\t\t_currentActiveCubeFace = activeCubeFace;\n\t\t_currentActiveMipmapLevel = activeMipmapLevel;\n\n\t\tlet useDefaultFramebuffer = true;\n\t\tlet framebuffer = null;\n\t\tlet isCube = false;\n\t\tlet isRenderTarget3D = false;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\t\tif ( renderTargetProperties.__useDefaultFramebuffer !== undefined ) {\n\n\t\t\t\t// We need to make sure to rebind the framebuffer.\n\t\t\t\tstate.bindFramebuffer( 36160, null );\n\t\t\t\tuseDefaultFramebuffer = false;\n\n\t\t\t} else if ( renderTargetProperties.__webglFramebuffer === undefined ) {\n\n\t\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t\t} else if ( renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\t\t// Color and depth texture must be rebound in order for the swapchain to update.\n\t\t\t\ttextures.rebindTextures( renderTarget, properties.get( renderTarget.texture ).__webglTexture, properties.get( renderTarget.depthTexture ).__webglTexture );\n\n\t\t\t}\n\n\t\t\tconst texture = renderTarget.texture;\n\n\t\t\tif ( texture.isData3DTexture || texture.isDataArrayTexture || texture.isCompressedArrayTexture ) {\n\n\t\t\t\tisRenderTarget3D = true;\n\n\t\t\t}\n\n\t\t\tconst __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\t\tframebuffer = __webglFramebuffer[ activeCubeFace ];\n\t\t\t\tisCube = true;\n\n\t\t\t} else if ( ( capabilities.isWebGL2 && renderTarget.samples > 0 ) && textures.useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\tframebuffer = properties.get( renderTarget ).__webglMultisampledFramebuffer;\n\n\t\t\t} else {\n\n\t\t\t\tframebuffer = __webglFramebuffer;\n\n\t\t\t}\n\n\t\t\t_currentViewport.copy( renderTarget.viewport );\n\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t} else {\n\n\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t}\n\n\t\tconst framebufferBound = state.bindFramebuffer( 36160, framebuffer );\n\n\t\tif ( framebufferBound && capabilities.drawBuffers && useDefaultFramebuffer ) {\n\n\t\t\tstate.drawBuffers( renderTarget, framebuffer );\n\n\t\t}\n\n\t\tstate.viewport( _currentViewport );\n\t\tstate.scissor( _currentScissor );\n\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\tif ( isCube ) {\n\n\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\t_gl.framebufferTexture2D( 36160, 36064, 34069 + activeCubeFace, textureProperties.__webglTexture, activeMipmapLevel );\n\n\t\t} else if ( isRenderTarget3D ) {\n\n\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\tconst layer = activeCubeFace || 0;\n\t\t\t_gl.framebufferTextureLayer( 36160, 36064, textureProperties.__webglTexture, activeMipmapLevel || 0, layer );\n\n\t\t}\n\n\t\t_currentMaterialId = - 1; // reset current material to ensure correct uniform bindings\n\n\t};\n\n\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex ) {\n\n\t\tif ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {\n\n\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tlet framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\tif ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) {\n\n\t\t\tframebuffer = framebuffer[ activeCubeFaceIndex ];\n\n\t\t}\n\n\t\tif ( framebuffer ) {\n\n\t\t\tstate.bindFramebuffer( 36160, framebuffer );\n\n\t\t\ttry {\n\n\t\t\t\tconst texture = renderTarget.texture;\n\t\t\t\tconst textureFormat = texture.format;\n\t\t\t\tconst textureType = texture.type;\n\n\t\t\t\tif ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== _gl.getParameter( 35739 ) ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tconst halfFloatSupportedByExt = ( textureType === HalfFloatType ) && ( extensions.has( 'EXT_color_buffer_half_float' ) || ( capabilities.isWebGL2 && extensions.has( 'EXT_color_buffer_float' ) ) );\n\n\t\t\t\tif ( textureType !== UnsignedByteType && utils.convert( textureType ) !== _gl.getParameter( 35738 ) && // Edge and Chrome Mac < 52 (#9513)\n\t\t\t\t\t! ( textureType === FloatType && ( capabilities.isWebGL2 || extensions.has( 'OES_texture_float' ) || extensions.has( 'WEBGL_color_buffer_float' ) ) ) && // Chrome Mac >= 52 and Firefox\n\t\t\t\t\t! halfFloatSupportedByExt ) {\n\n\t\t\t\t\tconsole.error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\n\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer );\n\n\t\t\t\t}\n\n\t\t\t} finally {\n\n\t\t\t\t// restore framebuffer of current render target if necessary\n\n\t\t\t\tconst framebuffer = ( _currentRenderTarget !== null ) ? properties.get( _currentRenderTarget ).__webglFramebuffer : null;\n\t\t\t\tstate.bindFramebuffer( 36160, framebuffer );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tthis.copyFramebufferToTexture = function ( position, texture, level = 0 ) {\n\n\t\tconst levelScale = Math.pow( 2, - level );\n\t\tconst width = Math.floor( texture.image.width * levelScale );\n\t\tconst height = Math.floor( texture.image.height * levelScale );\n\n\t\ttextures.setTexture2D( texture, 0 );\n\n\t\t_gl.copyTexSubImage2D( 3553, level, 0, 0, position.x, position.y, width, height );\n\n\t\tstate.unbindTexture();\n\n\t};\n\n\tthis.copyTextureToTexture = function ( position, srcTexture, dstTexture, level = 0 ) {\n\n\t\tconst width = srcTexture.image.width;\n\t\tconst height = srcTexture.image.height;\n\t\tconst glFormat = utils.convert( dstTexture.format );\n\t\tconst glType = utils.convert( dstTexture.type );\n\n\t\ttextures.setTexture2D( dstTexture, 0 );\n\n\t\t// As another texture upload may have changed pixelStorei\n\t\t// parameters, make sure they are correct for the dstTexture\n\t\t_gl.pixelStorei( 37440, dstTexture.flipY );\n\t\t_gl.pixelStorei( 37441, dstTexture.premultiplyAlpha );\n\t\t_gl.pixelStorei( 3317, dstTexture.unpackAlignment );\n\n\t\tif ( srcTexture.isDataTexture ) {\n\n\t\t\t_gl.texSubImage2D( 3553, level, position.x, position.y, width, height, glFormat, glType, srcTexture.image.data );\n\n\t\t} else {\n\n\t\t\tif ( srcTexture.isCompressedTexture ) {\n\n\t\t\t\t_gl.compressedTexSubImage2D( 3553, level, position.x, position.y, srcTexture.mipmaps[ 0 ].width, srcTexture.mipmaps[ 0 ].height, glFormat, srcTexture.mipmaps[ 0 ].data );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.texSubImage2D( 3553, level, position.x, position.y, glFormat, glType, srcTexture.image );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Generate mipmaps only when copying level 0\n\t\tif ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( 3553 );\n\n\t\tstate.unbindTexture();\n\n\t};\n\n\tthis.copyTextureToTexture3D = function ( sourceBox, position, srcTexture, dstTexture, level = 0 ) {\n\n\t\tif ( _this.isWebGL1Renderer ) {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: can only be used with WebGL2.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst width = sourceBox.max.x - sourceBox.min.x + 1;\n\t\tconst height = sourceBox.max.y - sourceBox.min.y + 1;\n\t\tconst depth = sourceBox.max.z - sourceBox.min.z + 1;\n\t\tconst glFormat = utils.convert( dstTexture.format );\n\t\tconst glType = utils.convert( dstTexture.type );\n\t\tlet glTarget;\n\n\t\tif ( dstTexture.isData3DTexture ) {\n\n\t\t\ttextures.setTexture3D( dstTexture, 0 );\n\t\t\tglTarget = 32879;\n\n\t\t} else if ( dstTexture.isDataArrayTexture ) {\n\n\t\t\ttextures.setTexture2DArray( dstTexture, 0 );\n\t\t\tglTarget = 35866;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: only supports THREE.DataTexture3D and THREE.DataTexture2DArray.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\t_gl.pixelStorei( 37440, dstTexture.flipY );\n\t\t_gl.pixelStorei( 37441, dstTexture.premultiplyAlpha );\n\t\t_gl.pixelStorei( 3317, dstTexture.unpackAlignment );\n\n\t\tconst unpackRowLen = _gl.getParameter( 3314 );\n\t\tconst unpackImageHeight = _gl.getParameter( 32878 );\n\t\tconst unpackSkipPixels = _gl.getParameter( 3316 );\n\t\tconst unpackSkipRows = _gl.getParameter( 3315 );\n\t\tconst unpackSkipImages = _gl.getParameter( 32877 );\n\n\t\tconst image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[ 0 ] : srcTexture.image;\n\n\t\t_gl.pixelStorei( 3314, image.width );\n\t\t_gl.pixelStorei( 32878, image.height );\n\t\t_gl.pixelStorei( 3316, sourceBox.min.x );\n\t\t_gl.pixelStorei( 3315, sourceBox.min.y );\n\t\t_gl.pixelStorei( 32877, sourceBox.min.z );\n\n\t\tif ( srcTexture.isDataTexture || srcTexture.isData3DTexture ) {\n\n\t\t\t_gl.texSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, glType, image.data );\n\n\t\t} else {\n\n\t\t\tif ( srcTexture.isCompressedArrayTexture ) {\n\n\t\t\t\tconsole.warn( 'THREE.WebGLRenderer.copyTextureToTexture3D: untested support for compressed srcTexture.' );\n\t\t\t\t_gl.compressedTexSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, image.data );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.texSubImage3D( glTarget, level, position.x, position.y, position.z, width, height, depth, glFormat, glType, image );\n\n\t\t\t}\n\n\t\t}\n\n\t\t_gl.pixelStorei( 3314, unpackRowLen );\n\t\t_gl.pixelStorei( 32878, unpackImageHeight );\n\t\t_gl.pixelStorei( 3316, unpackSkipPixels );\n\t\t_gl.pixelStorei( 3315, unpackSkipRows );\n\t\t_gl.pixelStorei( 32877, unpackSkipImages );\n\n\t\t// Generate mipmaps only when copying level 0\n\t\tif ( level === 0 && dstTexture.generateMipmaps ) _gl.generateMipmap( glTarget );\n\n\t\tstate.unbindTexture();\n\n\t};\n\n\tthis.initTexture = function ( texture ) {\n\n\t\tif ( texture.isCubeTexture ) {\n\n\t\t\ttextures.setTextureCube( texture, 0 );\n\n\t\t} else if ( texture.isData3DTexture ) {\n\n\t\t\ttextures.setTexture3D( texture, 0 );\n\n\t\t} else if ( texture.isDataArrayTexture || texture.isCompressedArrayTexture ) {\n\n\t\t\ttextures.setTexture2DArray( texture, 0 );\n\n\t\t} else {\n\n\t\t\ttextures.setTexture2D( texture, 0 );\n\n\t\t}\n\n\t\tstate.unbindTexture();\n\n\t};\n\n\tthis.resetState = function () {\n\n\t\t_currentActiveCubeFace = 0;\n\t\t_currentActiveMipmapLevel = 0;\n\t\t_currentRenderTarget = null;\n\n\t\tstate.reset();\n\t\tbindingStates.reset();\n\n\t};\n\n\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );\n\n\t}\n\n}\n\nclass WebGL1Renderer extends WebGLRenderer {}\n\nWebGL1Renderer.prototype.isWebGL1Renderer = true;\n\nclass FogExp2 {\n\n\tconstructor( color, density = 0.00025 ) {\n\n\t\tthis.isFogExp2 = true;\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\t\tthis.density = density;\n\n\t}\n\n\tclone() {\n\n\t\treturn new FogExp2( this.color, this.density );\n\n\t}\n\n\ttoJSON( /* meta */ ) {\n\n\t\treturn {\n\t\t\ttype: 'FogExp2',\n\t\t\tcolor: this.color.getHex(),\n\t\t\tdensity: this.density\n\t\t};\n\n\t}\n\n}\n\nclass Fog {\n\n\tconstructor( color, near = 1, far = 1000 ) {\n\n\t\tthis.isFog = true;\n\n\t\tthis.name = '';\n\n\t\tthis.color = new Color( color );\n\n\t\tthis.near = near;\n\t\tthis.far = far;\n\n\t}\n\n\tclone() {\n\n\t\treturn new Fog( this.color, this.near, this.far );\n\n\t}\n\n\ttoJSON( /* meta */ ) {\n\n\t\treturn {\n\t\t\ttype: 'Fog',\n\t\t\tcolor: this.color.getHex(),\n\t\t\tnear: this.near,\n\t\t\tfar: this.far\n\t\t};\n\n\t}\n\n}\n\nclass Scene extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isScene = true;\n\n\t\tthis.type = 'Scene';\n\n\t\tthis.background = null;\n\t\tthis.environment = null;\n\t\tthis.fog = null;\n\n\t\tthis.backgroundBlurriness = 0;\n\t\tthis.backgroundIntensity = 1;\n\n\t\tthis.overrideMaterial = null;\n\n\t\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.background !== null ) this.background = source.background.clone();\n\t\tif ( source.environment !== null ) this.environment = source.environment.clone();\n\t\tif ( source.fog !== null ) this.fog = source.fog.clone();\n\n\t\tthis.backgroundBlurriness = source.backgroundBlurriness;\n\t\tthis.backgroundIntensity = source.backgroundIntensity;\n\n\t\tif ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.fog !== null ) data.object.fog = this.fog.toJSON();\n\t\tif ( this.backgroundBlurriness > 0 ) data.object.backgroundBlurriness = this.backgroundBlurriness;\n\t\tif ( this.backgroundIntensity !== 1 ) data.object.backgroundIntensity = this.backgroundIntensity;\n\n\t\treturn data;\n\n\t}\n\n\t// @deprecated\n\n\tget autoUpdate() {\n\n\t\tconsole.warn( 'THREE.Scene: autoUpdate was renamed to matrixWorldAutoUpdate in r144.' );\n\t\treturn this.matrixWorldAutoUpdate;\n\n\t}\n\n\tset autoUpdate( value ) {\n\n\t\tconsole.warn( 'THREE.Scene: autoUpdate was renamed to matrixWorldAutoUpdate in r144.' );\n\t\tthis.matrixWorldAutoUpdate = value;\n\n\t}\n\n}\n\nclass InterleavedBuffer {\n\n\tconstructor( array, stride ) {\n\n\t\tthis.isInterleavedBuffer = true;\n\n\t\tthis.array = array;\n\t\tthis.stride = stride;\n\t\tthis.count = array !== undefined ? array.length / stride : 0;\n\n\t\tthis.usage = StaticDrawUsage;\n\t\tthis.updateRange = { offset: 0, count: - 1 };\n\n\t\tthis.version = 0;\n\n\t\tthis.uuid = generateUUID();\n\n\t}\n\n\tonUploadCallback() {}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.count = source.count;\n\t\tthis.stride = source.stride;\n\t\tthis.usage = source.usage;\n\n\t\treturn this;\n\n\t}\n\n\tcopyAt( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.stride;\n\t\tindex2 *= attribute.stride;\n\n\t\tfor ( let i = 0, l = this.stride; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tset( value, offset = 0 ) {\n\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t}\n\n\tclone( data ) {\n\n\t\tif ( data.arrayBuffers === undefined ) {\n\n\t\t\tdata.arrayBuffers = {};\n\n\t\t}\n\n\t\tif ( this.array.buffer._uuid === undefined ) {\n\n\t\t\tthis.array.buffer._uuid = generateUUID();\n\n\t\t}\n\n\t\tif ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) {\n\n\t\t\tdata.arrayBuffers[ this.array.buffer._uuid ] = this.array.slice( 0 ).buffer;\n\n\t\t}\n\n\t\tconst array = new this.array.constructor( data.arrayBuffers[ this.array.buffer._uuid ] );\n\n\t\tconst ib = new this.constructor( array, this.stride );\n\t\tib.setUsage( this.usage );\n\n\t\treturn ib;\n\n\t}\n\n\tonUpload( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( data ) {\n\n\t\tif ( data.arrayBuffers === undefined ) {\n\n\t\t\tdata.arrayBuffers = {};\n\n\t\t}\n\n\t\t// generate UUID for array buffer if necessary\n\n\t\tif ( this.array.buffer._uuid === undefined ) {\n\n\t\t\tthis.array.buffer._uuid = generateUUID();\n\n\t\t}\n\n\t\tif ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) {\n\n\t\t\tdata.arrayBuffers[ this.array.buffer._uuid ] = Array.from( new Uint32Array( this.array.buffer ) );\n\n\t\t}\n\n\t\t//\n\n\t\treturn {\n\t\t\tuuid: this.uuid,\n\t\t\tbuffer: this.array.buffer._uuid,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tstride: this.stride\n\t\t};\n\n\t}\n\n}\n\nconst _vector$6 = /*@__PURE__*/ new Vector3();\n\nclass InterleavedBufferAttribute {\n\n\tconstructor( interleavedBuffer, itemSize, offset, normalized = false ) {\n\n\t\tthis.isInterleavedBufferAttribute = true;\n\n\t\tthis.name = '';\n\n\t\tthis.data = interleavedBuffer;\n\t\tthis.itemSize = itemSize;\n\t\tthis.offset = offset;\n\n\t\tthis.normalized = normalized;\n\n\t}\n\n\tget count() {\n\n\t\treturn this.data.count;\n\n\t}\n\n\tget array() {\n\n\t\treturn this.data.array;\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tthis.data.needsUpdate = value;\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tfor ( let i = 0, l = this.data.count; i < l; i ++ ) {\n\n\t\t\t_vector$6.fromBufferAttribute( this, i );\n\n\t\t\t_vector$6.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector$6.x, _vector$6.y, _vector$6.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tapplyNormalMatrix( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$6.fromBufferAttribute( this, i );\n\n\t\t\t_vector$6.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector$6.x, _vector$6.y, _vector$6.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttransformDirection( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$6.fromBufferAttribute( this, i );\n\n\t\t\t_vector$6.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector$6.x, _vector$6.y, _vector$6.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset ] = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tgetX( index ) {\n\n\t\tlet x = this.data.array[ index * this.data.stride + this.offset ];\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\tgetY( index ) {\n\n\t\tlet y = this.data.array[ index * this.data.stride + this.offset + 1 ];\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\tgetZ( index ) {\n\n\t\tlet z = this.data.array[ index * this.data.stride + this.offset + 2 ];\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\tgetW( index ) {\n\n\t\tlet w = this.data.array[ index * this.data.stride + this.offset + 3 ];\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\tsetXY( index, x, y ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\t\tthis.data.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\tclone( data ) {\n\n\t\tif ( data === undefined ) {\n\n\t\t\tconsole.log( 'THREE.InterleavedBufferAttribute.clone(): Cloning an interleaved buffer attribute will de-interleave buffer data.' );\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0; i < this.count; i ++ ) {\n\n\t\t\t\tconst index = i * this.data.stride + this.offset;\n\n\t\t\t\tfor ( let j = 0; j < this.itemSize; j ++ ) {\n\n\t\t\t\t\tarray.push( this.data.array[ index + j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( new this.array.constructor( array ), this.itemSize, this.normalized );\n\n\t\t} else {\n\n\t\t\tif ( data.interleavedBuffers === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers = {};\n\n\t\t\t}\n\n\t\t\tif ( data.interleavedBuffers[ this.data.uuid ] === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers[ this.data.uuid ] = this.data.clone( data );\n\n\t\t\t}\n\n\t\t\treturn new InterleavedBufferAttribute( data.interleavedBuffers[ this.data.uuid ], this.itemSize, this.offset, this.normalized );\n\n\t\t}\n\n\t}\n\n\ttoJSON( data ) {\n\n\t\tif ( data === undefined ) {\n\n\t\t\tconsole.log( 'THREE.InterleavedBufferAttribute.toJSON(): Serializing an interleaved buffer attribute will de-interleave buffer data.' );\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0; i < this.count; i ++ ) {\n\n\t\t\t\tconst index = i * this.data.stride + this.offset;\n\n\t\t\t\tfor ( let j = 0; j < this.itemSize; j ++ ) {\n\n\t\t\t\t\tarray.push( this.data.array[ index + j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// de-interleave data and save it as an ordinary buffer attribute for now\n\n\t\t\treturn {\n\t\t\t\titemSize: this.itemSize,\n\t\t\t\ttype: this.array.constructor.name,\n\t\t\t\tarray: array,\n\t\t\t\tnormalized: this.normalized\n\t\t\t};\n\n\t\t} else {\n\n\t\t\t// save as true interleaved attribute\n\n\t\t\tif ( data.interleavedBuffers === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers = {};\n\n\t\t\t}\n\n\t\t\tif ( data.interleavedBuffers[ this.data.uuid ] === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers[ this.data.uuid ] = this.data.toJSON( data );\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tisInterleavedBufferAttribute: true,\n\t\t\t\titemSize: this.itemSize,\n\t\t\t\tdata: this.data.uuid,\n\t\t\t\toffset: this.offset,\n\t\t\t\tnormalized: this.normalized\n\t\t\t};\n\n\t\t}\n\n\t}\n\n}\n\nclass SpriteMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isSpriteMaterial = true;\n\n\t\tthis.type = 'SpriteMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.rotation = 0;\n\n\t\tthis.sizeAttenuation = true;\n\n\t\tthis.transparent = true;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nlet _geometry;\n\nconst _intersectPoint = /*@__PURE__*/ new Vector3();\nconst _worldScale = /*@__PURE__*/ new Vector3();\nconst _mvPosition = /*@__PURE__*/ new Vector3();\n\nconst _alignedPosition = /*@__PURE__*/ new Vector2();\nconst _rotatedPosition = /*@__PURE__*/ new Vector2();\nconst _viewWorldMatrix = /*@__PURE__*/ new Matrix4();\n\nconst _vA = /*@__PURE__*/ new Vector3();\nconst _vB = /*@__PURE__*/ new Vector3();\nconst _vC = /*@__PURE__*/ new Vector3();\n\nconst _uvA = /*@__PURE__*/ new Vector2();\nconst _uvB = /*@__PURE__*/ new Vector2();\nconst _uvC = /*@__PURE__*/ new Vector2();\n\nclass Sprite extends Object3D {\n\n\tconstructor( material ) {\n\n\t\tsuper();\n\n\t\tthis.isSprite = true;\n\n\t\tthis.type = 'Sprite';\n\n\t\tif ( _geometry === undefined ) {\n\n\t\t\t_geometry = new BufferGeometry();\n\n\t\t\tconst float32Array = new Float32Array( [\n\t\t\t\t- 0.5, - 0.5, 0, 0, 0,\n\t\t\t\t0.5, - 0.5, 0, 1, 0,\n\t\t\t\t0.5, 0.5, 0, 1, 1,\n\t\t\t\t- 0.5, 0.5, 0, 0, 1\n\t\t\t] );\n\n\t\t\tconst interleavedBuffer = new InterleavedBuffer( float32Array, 5 );\n\n\t\t\t_geometry.setIndex( [ 0, 1, 2,\t0, 2, 3 ] );\n\t\t\t_geometry.setAttribute( 'position', new InterleavedBufferAttribute( interleavedBuffer, 3, 0, false ) );\n\t\t\t_geometry.setAttribute( 'uv', new InterleavedBufferAttribute( interleavedBuffer, 2, 3, false ) );\n\n\t\t}\n\n\t\tthis.geometry = _geometry;\n\t\tthis.material = ( material !== undefined ) ? material : new SpriteMaterial();\n\n\t\tthis.center = new Vector2( 0.5, 0.5 );\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tif ( raycaster.camera === null ) {\n\n\t\t\tconsole.error( 'THREE.Sprite: \"Raycaster.camera\" needs to be set in order to raycast against sprites.' );\n\n\t\t}\n\n\t\t_worldScale.setFromMatrixScale( this.matrixWorld );\n\n\t\t_viewWorldMatrix.copy( raycaster.camera.matrixWorld );\n\t\tthis.modelViewMatrix.multiplyMatrices( raycaster.camera.matrixWorldInverse, this.matrixWorld );\n\n\t\t_mvPosition.setFromMatrixPosition( this.modelViewMatrix );\n\n\t\tif ( raycaster.camera.isPerspectiveCamera && this.material.sizeAttenuation === false ) {\n\n\t\t\t_worldScale.multiplyScalar( - _mvPosition.z );\n\n\t\t}\n\n\t\tconst rotation = this.material.rotation;\n\t\tlet sin, cos;\n\n\t\tif ( rotation !== 0 ) {\n\n\t\t\tcos = Math.cos( rotation );\n\t\t\tsin = Math.sin( rotation );\n\n\t\t}\n\n\t\tconst center = this.center;\n\n\t\ttransformVertex( _vA.set( - 0.5, - 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\ttransformVertex( _vB.set( 0.5, - 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\ttransformVertex( _vC.set( 0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\n\t\t_uvA.set( 0, 0 );\n\t\t_uvB.set( 1, 0 );\n\t\t_uvC.set( 1, 1 );\n\n\t\t// check first triangle\n\t\tlet intersect = raycaster.ray.intersectTriangle( _vA, _vB, _vC, false, _intersectPoint );\n\n\t\tif ( intersect === null ) {\n\n\t\t\t// check second triangle\n\t\t\ttransformVertex( _vB.set( - 0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\t\t_uvB.set( 0, 1 );\n\n\t\t\tintersect = raycaster.ray.intersectTriangle( _vA, _vC, _vB, false, _intersectPoint );\n\t\t\tif ( intersect === null ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst distance = raycaster.ray.origin.distanceTo( _intersectPoint );\n\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\tintersects.push( {\n\n\t\t\tdistance: distance,\n\t\t\tpoint: _intersectPoint.clone(),\n\t\t\tuv: Triangle.getUV( _intersectPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2() ),\n\t\t\tface: null,\n\t\t\tobject: this\n\n\t\t} );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.center !== undefined ) this.center.copy( source.center );\n\n\t\tthis.material = source.material;\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction transformVertex( vertexPosition, mvPosition, center, scale, sin, cos ) {\n\n\t// compute position in camera space\n\t_alignedPosition.subVectors( vertexPosition, center ).addScalar( 0.5 ).multiply( scale );\n\n\t// to check if rotation is not zero\n\tif ( sin !== undefined ) {\n\n\t\t_rotatedPosition.x = ( cos * _alignedPosition.x ) - ( sin * _alignedPosition.y );\n\t\t_rotatedPosition.y = ( sin * _alignedPosition.x ) + ( cos * _alignedPosition.y );\n\n\t} else {\n\n\t\t_rotatedPosition.copy( _alignedPosition );\n\n\t}\n\n\n\tvertexPosition.copy( mvPosition );\n\tvertexPosition.x += _rotatedPosition.x;\n\tvertexPosition.y += _rotatedPosition.y;\n\n\t// transform to world space\n\tvertexPosition.applyMatrix4( _viewWorldMatrix );\n\n}\n\nconst _v1$2 = /*@__PURE__*/ new Vector3();\nconst _v2$1 = /*@__PURE__*/ new Vector3();\n\nclass LOD extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis._currentLevel = 0;\n\n\t\tthis.type = 'LOD';\n\n\t\tObject.defineProperties( this, {\n\t\t\tlevels: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: []\n\t\t\t},\n\t\t\tisLOD: {\n\t\t\t\tvalue: true,\n\t\t\t}\n\t\t} );\n\n\t\tthis.autoUpdate = true;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source, false );\n\n\t\tconst levels = source.levels;\n\n\t\tfor ( let i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tconst level = levels[ i ];\n\n\t\t\tthis.addLevel( level.object.clone(), level.distance, level.hysteresis );\n\n\t\t}\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\n\t\treturn this;\n\n\t}\n\n\taddLevel( object, distance = 0, hysteresis = 0 ) {\n\n\t\tdistance = Math.abs( distance );\n\n\t\tconst levels = this.levels;\n\n\t\tlet l;\n\n\t\tfor ( l = 0; l < levels.length; l ++ ) {\n\n\t\t\tif ( distance < levels[ l ].distance ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlevels.splice( l, 0, { distance: distance, hysteresis: hysteresis, object: object } );\n\n\t\tthis.add( object );\n\n\t\treturn this;\n\n\t}\n\n\tgetCurrentLevel() {\n\n\t\treturn this._currentLevel;\n\n\t}\n\n\n\n\tgetObjectForDistance( distance ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 0 ) {\n\n\t\t\tlet i, l;\n\n\t\t\tfor ( i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tlet levelDistance = levels[ i ].distance;\n\n\t\t\t\tif ( levels[ i ].object.visible ) {\n\n\t\t\t\t\tlevelDistance -= levelDistance * levels[ i ].hysteresis;\n\n\t\t\t\t}\n\n\t\t\t\tif ( distance < levelDistance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn levels[ i - 1 ].object;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 0 ) {\n\n\t\t\t_v1$2.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tconst distance = raycaster.ray.origin.distanceTo( _v1$2 );\n\n\t\t\tthis.getObjectForDistance( distance ).raycast( raycaster, intersects );\n\n\t\t}\n\n\t}\n\n\tupdate( camera ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 1 ) {\n\n\t\t\t_v1$2.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t_v2$1.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tconst distance = _v1$2.distanceTo( _v2$1 ) / camera.zoom;\n\n\t\t\tlevels[ 0 ].object.visible = true;\n\n\t\t\tlet i, l;\n\n\t\t\tfor ( i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tlet levelDistance = levels[ i ].distance;\n\n\t\t\t\tif ( levels[ i ].object.visible ) {\n\n\t\t\t\t\tlevelDistance -= levelDistance * levels[ i ].hysteresis;\n\n\t\t\t\t}\n\n\t\t\t\tif ( distance >= levelDistance ) {\n\n\t\t\t\t\tlevels[ i - 1 ].object.visible = false;\n\t\t\t\t\tlevels[ i ].object.visible = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._currentLevel = i - 1;\n\n\t\t\tfor ( ; i < l; i ++ ) {\n\n\t\t\t\tlevels[ i ].object.visible = false;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.autoUpdate === false ) data.object.autoUpdate = false;\n\n\t\tdata.object.levels = [];\n\n\t\tconst levels = this.levels;\n\n\t\tfor ( let i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tconst level = levels[ i ];\n\n\t\t\tdata.object.levels.push( {\n\t\t\t\tobject: level.object.uuid,\n\t\t\t\tdistance: level.distance,\n\t\t\t\thysteresis: level.hysteresis\n\t\t\t} );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst _basePosition = /*@__PURE__*/ new Vector3();\n\nconst _skinIndex = /*@__PURE__*/ new Vector4();\nconst _skinWeight = /*@__PURE__*/ new Vector4();\n\nconst _vector$5 = /*@__PURE__*/ new Vector3();\nconst _matrix = /*@__PURE__*/ new Matrix4();\n\nclass SkinnedMesh extends Mesh {\n\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.isSkinnedMesh = true;\n\n\t\tthis.type = 'SkinnedMesh';\n\n\t\tthis.bindMode = 'attached';\n\t\tthis.bindMatrix = new Matrix4();\n\t\tthis.bindMatrixInverse = new Matrix4();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.bindMode = source.bindMode;\n\t\tthis.bindMatrix.copy( source.bindMatrix );\n\t\tthis.bindMatrixInverse.copy( source.bindMatrixInverse );\n\n\t\tthis.skeleton = source.skeleton;\n\n\t\treturn this;\n\n\t}\n\n\tbind( skeleton, bindMatrix ) {\n\n\t\tthis.skeleton = skeleton;\n\n\t\tif ( bindMatrix === undefined ) {\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\tthis.skeleton.calculateInverses();\n\n\t\t\tbindMatrix = this.matrixWorld;\n\n\t\t}\n\n\t\tthis.bindMatrix.copy( bindMatrix );\n\t\tthis.bindMatrixInverse.copy( bindMatrix ).invert();\n\n\t}\n\n\tpose() {\n\n\t\tthis.skeleton.pose();\n\n\t}\n\n\tnormalizeSkinWeights() {\n\n\t\tconst vector = new Vector4();\n\n\t\tconst skinWeight = this.geometry.attributes.skinWeight;\n\n\t\tfor ( let i = 0, l = skinWeight.count; i < l; i ++ ) {\n\n\t\t\tvector.fromBufferAttribute( skinWeight, i );\n\n\t\t\tconst scale = 1.0 / vector.manhattanLength();\n\n\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\tvector.multiplyScalar( scale );\n\n\t\t\t} else {\n\n\t\t\t\tvector.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t}\n\n\t\t\tskinWeight.setXYZW( i, vector.x, vector.y, vector.z, vector.w );\n\n\t\t}\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tif ( this.bindMode === 'attached' ) {\n\n\t\t\tthis.bindMatrixInverse.copy( this.matrixWorld ).invert();\n\n\t\t} else if ( this.bindMode === 'detached' ) {\n\n\t\t\tthis.bindMatrixInverse.copy( this.bindMatrix ).invert();\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.SkinnedMesh: Unrecognized bindMode: ' + this.bindMode );\n\n\t\t}\n\n\t}\n\n\tboneTransform( index, target ) {\n\n\t\tconst skeleton = this.skeleton;\n\t\tconst geometry = this.geometry;\n\n\t\t_skinIndex.fromBufferAttribute( geometry.attributes.skinIndex, index );\n\t\t_skinWeight.fromBufferAttribute( geometry.attributes.skinWeight, index );\n\n\t\t_basePosition.copy( target ).applyMatrix4( this.bindMatrix );\n\n\t\ttarget.set( 0, 0, 0 );\n\n\t\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\t\tconst weight = _skinWeight.getComponent( i );\n\n\t\t\tif ( weight !== 0 ) {\n\n\t\t\t\tconst boneIndex = _skinIndex.getComponent( i );\n\n\t\t\t\t_matrix.multiplyMatrices( skeleton.bones[ boneIndex ].matrixWorld, skeleton.boneInverses[ boneIndex ] );\n\n\t\t\t\ttarget.addScaledVector( _vector$5.copy( _basePosition ).applyMatrix4( _matrix ), weight );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn target.applyMatrix4( this.bindMatrixInverse );\n\n\t}\n\n}\n\nclass Bone extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isBone = true;\n\n\t\tthis.type = 'Bone';\n\n\t}\n\n}\n\nclass DataTexture extends Texture {\n\n\tconstructor( data = null, width = 1, height = 1, format, type, mapping, wrapS, wrapT, magFilter = NearestFilter, minFilter = NearestFilter, anisotropy, encoding ) {\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.isDataTexture = true;\n\n\t\tthis.image = { data: data, width: width, height: height };\n\n\t\tthis.generateMipmaps = false;\n\t\tthis.flipY = false;\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\nconst _offsetMatrix = /*@__PURE__*/ new Matrix4();\nconst _identityMatrix = /*@__PURE__*/ new Matrix4();\n\nclass Skeleton {\n\n\tconstructor( bones = [], boneInverses = [] ) {\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.bones = bones.slice( 0 );\n\t\tthis.boneInverses = boneInverses;\n\t\tthis.boneMatrices = null;\n\n\t\tthis.boneTexture = null;\n\t\tthis.boneTextureSize = 0;\n\n\t\tthis.frame = - 1;\n\n\t\tthis.init();\n\n\t}\n\n\tinit() {\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tthis.boneMatrices = new Float32Array( bones.length * 16 );\n\n\t\t// calculate inverse bone matrices if necessary\n\n\t\tif ( boneInverses.length === 0 ) {\n\n\t\t\tthis.calculateInverses();\n\n\t\t} else {\n\n\t\t\t// handle special case\n\n\t\t\tif ( bones.length !== boneInverses.length ) {\n\n\t\t\t\tconsole.warn( 'THREE.Skeleton: Number of inverse bone matrices does not match amount of bones.' );\n\n\t\t\t\tthis.boneInverses = [];\n\n\t\t\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\t\t\tthis.boneInverses.push( new Matrix4() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcalculateInverses() {\n\n\t\tthis.boneInverses.length = 0;\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst inverse = new Matrix4();\n\n\t\t\tif ( this.bones[ i ] ) {\n\n\t\t\t\tinverse.copy( this.bones[ i ].matrixWorld ).invert();\n\n\t\t\t}\n\n\t\t\tthis.boneInverses.push( inverse );\n\n\t\t}\n\n\t}\n\n\tpose() {\n\n\t\t// recover the bind-time world matrices\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tbone.matrixWorld.copy( this.boneInverses[ i ] ).invert();\n\n\t\t\t}\n\n\t\t}\n\n\t\t// compute the local matrices, positions, rotations and scales\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t\tbone.matrix.copy( bone.parent.matrixWorld ).invert();\n\t\t\t\t\tbone.matrix.multiply( bone.matrixWorld );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbone.matrix.copy( bone.matrixWorld );\n\n\t\t\t\t}\n\n\t\t\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tupdate() {\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\t\tconst boneMatrices = this.boneMatrices;\n\t\tconst boneTexture = this.boneTexture;\n\n\t\t// flatten bone matrices to array\n\n\t\tfor ( let i = 0, il = bones.length; i < il; i ++ ) {\n\n\t\t\t// compute the offset between the current and the original transform\n\n\t\t\tconst matrix = bones[ i ] ? bones[ i ].matrixWorld : _identityMatrix;\n\n\t\t\t_offsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] );\n\t\t\t_offsetMatrix.toArray( boneMatrices, i * 16 );\n\n\t\t}\n\n\t\tif ( boneTexture !== null ) {\n\n\t\t\tboneTexture.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new Skeleton( this.bones, this.boneInverses );\n\n\t}\n\n\tcomputeBoneTexture() {\n\n\t\t// layout (1 matrix = 4 pixels)\n\t\t// RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t// with 8x8 pixel texture max 16 bones * 4 pixels = (8 * 8)\n\t\t// 16x16 pixel texture max 64 bones * 4 pixels = (16 * 16)\n\t\t// 32x32 pixel texture max 256 bones * 4 pixels = (32 * 32)\n\t\t// 64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)\n\n\t\tlet size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix\n\t\tsize = ceilPowerOfTwo( size );\n\t\tsize = Math.max( size, 4 );\n\n\t\tconst boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel\n\t\tboneMatrices.set( this.boneMatrices ); // copy current values\n\n\t\tconst boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType );\n\t\tboneTexture.needsUpdate = true;\n\n\t\tthis.boneMatrices = boneMatrices;\n\t\tthis.boneTexture = boneTexture;\n\t\tthis.boneTextureSize = size;\n\n\t\treturn this;\n\n\t}\n\n\tgetBoneByName( name ) {\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone.name === name ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\tdispose( ) {\n\n\t\tif ( this.boneTexture !== null ) {\n\n\t\t\tthis.boneTexture.dispose();\n\n\t\t\tthis.boneTexture = null;\n\n\t\t}\n\n\t}\n\n\tfromJSON( json, bones ) {\n\n\t\tthis.uuid = json.uuid;\n\n\t\tfor ( let i = 0, l = json.bones.length; i < l; i ++ ) {\n\n\t\t\tconst uuid = json.bones[ i ];\n\t\t\tlet bone = bones[ uuid ];\n\n\t\t\tif ( bone === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.Skeleton: No bone found with UUID:', uuid );\n\t\t\t\tbone = new Bone();\n\n\t\t\t}\n\n\t\t\tthis.bones.push( bone );\n\t\t\tthis.boneInverses.push( new Matrix4().fromArray( json.boneInverses[ i ] ) );\n\n\t\t}\n\n\t\tthis.init();\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Skeleton',\n\t\t\t\tgenerator: 'Skeleton.toJSON'\n\t\t\t},\n\t\t\tbones: [],\n\t\t\tboneInverses: []\n\t\t};\n\n\t\tdata.uuid = this.uuid;\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tfor ( let i = 0, l = bones.length; i < l; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\t\t\tdata.bones.push( bone.uuid );\n\n\t\t\tconst boneInverse = boneInverses[ i ];\n\t\t\tdata.boneInverses.push( boneInverse.toArray() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass InstancedBufferAttribute extends BufferAttribute {\n\n\tconstructor( array, itemSize, normalized, meshPerAttribute = 1 ) {\n\n\t\tsuper( array, itemSize, normalized );\n\n\t\tthis.isInstancedBufferAttribute = true;\n\n\t\tthis.meshPerAttribute = meshPerAttribute;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.meshPerAttribute = this.meshPerAttribute;\n\n\t\tdata.isInstancedBufferAttribute = true;\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst _instanceLocalMatrix = /*@__PURE__*/ new Matrix4();\nconst _instanceWorldMatrix = /*@__PURE__*/ new Matrix4();\n\nconst _instanceIntersects = [];\n\nconst _identity = /*@__PURE__*/ new Matrix4();\nconst _mesh = /*@__PURE__*/ new Mesh();\n\nclass InstancedMesh extends Mesh {\n\n\tconstructor( geometry, material, count ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.isInstancedMesh = true;\n\n\t\tthis.instanceMatrix = new InstancedBufferAttribute( new Float32Array( count * 16 ), 16 );\n\t\tthis.instanceColor = null;\n\n\t\tthis.count = count;\n\n\t\tthis.frustumCulled = false;\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.setMatrixAt( i, _identity );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.instanceMatrix.copy( source.instanceMatrix );\n\n\t\tif ( source.instanceColor !== null ) this.instanceColor = source.instanceColor.clone();\n\n\t\tthis.count = source.count;\n\n\t\treturn this;\n\n\t}\n\n\tgetColorAt( index, color ) {\n\n\t\tcolor.fromArray( this.instanceColor.array, index * 3 );\n\n\t}\n\n\tgetMatrixAt( index, matrix ) {\n\n\t\tmatrix.fromArray( this.instanceMatrix.array, index * 16 );\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst raycastTimes = this.count;\n\n\t\t_mesh.geometry = this.geometry;\n\t\t_mesh.material = this.material;\n\n\t\tif ( _mesh.material === undefined ) return;\n\n\t\tfor ( let instanceId = 0; instanceId < raycastTimes; instanceId ++ ) {\n\n\t\t\t// calculate the world matrix for each instance\n\n\t\t\tthis.getMatrixAt( instanceId, _instanceLocalMatrix );\n\n\t\t\t_instanceWorldMatrix.multiplyMatrices( matrixWorld, _instanceLocalMatrix );\n\n\t\t\t// the mesh represents this single instance\n\n\t\t\t_mesh.matrixWorld = _instanceWorldMatrix;\n\n\t\t\t_mesh.raycast( raycaster, _instanceIntersects );\n\n\t\t\t// process the result of raycast\n\n\t\t\tfor ( let i = 0, l = _instanceIntersects.length; i < l; i ++ ) {\n\n\t\t\t\tconst intersect = _instanceIntersects[ i ];\n\t\t\t\tintersect.instanceId = instanceId;\n\t\t\t\tintersect.object = this;\n\t\t\t\tintersects.push( intersect );\n\n\t\t\t}\n\n\t\t\t_instanceIntersects.length = 0;\n\n\t\t}\n\n\t}\n\n\tsetColorAt( index, color ) {\n\n\t\tif ( this.instanceColor === null ) {\n\n\t\t\tthis.instanceColor = new InstancedBufferAttribute( new Float32Array( this.instanceMatrix.count * 3 ), 3 );\n\n\t\t}\n\n\t\tcolor.toArray( this.instanceColor.array, index * 3 );\n\n\t}\n\n\tsetMatrixAt( index, matrix ) {\n\n\t\tmatrix.toArray( this.instanceMatrix.array, index * 16 );\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nclass LineBasicMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isLineBasicMaterial = true;\n\n\t\tthis.type = 'LineBasicMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.linewidth = 1;\n\t\tthis.linecap = 'round';\n\t\tthis.linejoin = 'round';\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.linewidth = source.linewidth;\n\t\tthis.linecap = source.linecap;\n\t\tthis.linejoin = source.linejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _start$1 = /*@__PURE__*/ new Vector3();\nconst _end$1 = /*@__PURE__*/ new Vector3();\nconst _inverseMatrix$1 = /*@__PURE__*/ new Matrix4();\nconst _ray$1 = /*@__PURE__*/ new Ray();\nconst _sphere$1 = /*@__PURE__*/ new Sphere();\n\nclass Line extends Object3D {\n\n\tconstructor( geometry = new BufferGeometry(), material = new LineBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\tthis.isLine = true;\n\n\t\tthis.type = 'Line';\n\n\t\tthis.geometry = geometry;\n\t\tthis.material = material;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.material = source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\t// we assume non-indexed geometry\n\n\t\tif ( geometry.index === null ) {\n\n\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\tconst lineDistances = [ 0 ];\n\n\t\t\tfor ( let i = 1, l = positionAttribute.count; i < l; i ++ ) {\n\n\t\t\t\t_start$1.fromBufferAttribute( positionAttribute, i - 1 );\n\t\t\t\t_end$1.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\tlineDistances[ i ] = lineDistances[ i - 1 ];\n\t\t\t\tlineDistances[ i ] += _start$1.distanceTo( _end$1 );\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Line.threshold;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$1.copy( geometry.boundingSphere );\n\t\t_sphere$1.applyMatrix4( matrixWorld );\n\t\t_sphere$1.radius += threshold;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$1 ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix$1.copy( matrixWorld ).invert();\n\t\t_ray$1.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$1 );\n\n\t\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\tconst localThresholdSq = localThreshold * localThreshold;\n\n\t\tconst vStart = new Vector3();\n\t\tconst vEnd = new Vector3();\n\t\tconst interSegment = new Vector3();\n\t\tconst interRay = new Vector3();\n\t\tconst step = this.isLineSegments ? 2 : 1;\n\n\t\tconst index = geometry.index;\n\t\tconst attributes = geometry.attributes;\n\t\tconst positionAttribute = attributes.position;\n\n\t\tif ( index !== null ) {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end - 1; i < l; i += step ) {\n\n\t\t\t\tconst a = index.getX( i );\n\t\t\t\tconst b = index.getX( i + 1 );\n\n\t\t\t\tvStart.fromBufferAttribute( positionAttribute, a );\n\t\t\t\tvEnd.fromBufferAttribute( positionAttribute, b );\n\n\t\t\t\tconst distSq = _ray$1.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\tif ( distSq > localThresholdSq ) continue;\n\n\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\tconst distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\tintersects.push( {\n\n\t\t\t\t\tdistance: distance,\n\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\tindex: i,\n\t\t\t\t\tface: null,\n\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\tobject: this\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end - 1; i < l; i += step ) {\n\n\t\t\t\tvStart.fromBufferAttribute( positionAttribute, i );\n\t\t\t\tvEnd.fromBufferAttribute( positionAttribute, i + 1 );\n\n\t\t\t\tconst distSq = _ray$1.distanceSqToSegment( vStart, vEnd, interRay, interSegment );\n\n\t\t\t\tif ( distSq > localThresholdSq ) continue;\n\n\t\t\t\tinterRay.applyMatrix4( this.matrixWorld ); //Move back to world space for distance calculation\n\n\t\t\t\tconst distance = raycaster.ray.origin.distanceTo( interRay );\n\n\t\t\t\tif ( distance < raycaster.near || distance > raycaster.far ) continue;\n\n\t\t\t\tintersects.push( {\n\n\t\t\t\t\tdistance: distance,\n\t\t\t\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t\t\t\t// point: raycaster.ray.at( distance ),\n\t\t\t\t\tpoint: interSegment.clone().applyMatrix4( this.matrixWorld ),\n\t\t\t\t\tindex: i,\n\t\t\t\t\tface: null,\n\t\t\t\t\tfaceIndex: null,\n\t\t\t\t\tobject: this\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nconst _start = /*@__PURE__*/ new Vector3();\nconst _end = /*@__PURE__*/ new Vector3();\n\nclass LineSegments extends Line {\n\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.isLineSegments = true;\n\n\t\tthis.type = 'LineSegments';\n\n\t}\n\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\t// we assume non-indexed geometry\n\n\t\tif ( geometry.index === null ) {\n\n\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\tconst lineDistances = [];\n\n\t\t\tfor ( let i = 0, l = positionAttribute.count; i < l; i += 2 ) {\n\n\t\t\t\t_start.fromBufferAttribute( positionAttribute, i );\n\t\t\t\t_end.fromBufferAttribute( positionAttribute, i + 1 );\n\n\t\t\t\tlineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ];\n\t\t\t\tlineDistances[ i + 1 ] = lineDistances[ i ] + _start.distanceTo( _end );\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass LineLoop extends Line {\n\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.isLineLoop = true;\n\n\t\tthis.type = 'LineLoop';\n\n\t}\n\n}\n\nclass PointsMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isPointsMaterial = true;\n\n\t\tthis.type = 'PointsMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.size = 1;\n\t\tthis.sizeAttenuation = true;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.size = source.size;\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _inverseMatrix = /*@__PURE__*/ new Matrix4();\nconst _ray = /*@__PURE__*/ new Ray();\nconst _sphere = /*@__PURE__*/ new Sphere();\nconst _position$2 = /*@__PURE__*/ new Vector3();\n\nclass Points extends Object3D {\n\n\tconstructor( geometry = new BufferGeometry(), material = new PointsMaterial() ) {\n\n\t\tsuper();\n\n\t\tthis.isPoints = true;\n\n\t\tthis.type = 'Points';\n\n\t\tthis.geometry = geometry;\n\t\tthis.material = material;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.material = source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Points.threshold;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere.copy( geometry.boundingSphere );\n\t\t_sphere.applyMatrix4( matrixWorld );\n\t\t_sphere.radius += threshold;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix.copy( matrixWorld ).invert();\n\t\t_ray.copy( raycaster.ray ).applyMatrix4( _inverseMatrix );\n\n\t\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\tconst localThresholdSq = localThreshold * localThreshold;\n\n\t\tconst index = geometry.index;\n\t\tconst attributes = geometry.attributes;\n\t\tconst positionAttribute = attributes.position;\n\n\t\tif ( index !== null ) {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, il = end; i < il; i ++ ) {\n\n\t\t\t\tconst a = index.getX( i );\n\n\t\t\t\t_position$2.fromBufferAttribute( positionAttribute, a );\n\n\t\t\t\ttestPoint( _position$2, a, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end; i < l; i ++ ) {\n\n\t\t\t\t_position$2.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\ttestPoint( _position$2, i, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction testPoint( point, index, localThresholdSq, matrixWorld, raycaster, intersects, object ) {\n\n\tconst rayPointDistanceSq = _ray.distanceSqToPoint( point );\n\n\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\tconst intersectPoint = new Vector3();\n\n\t\t_ray.closestPointToPoint( point, intersectPoint );\n\t\tintersectPoint.applyMatrix4( matrixWorld );\n\n\t\tconst distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\tintersects.push( {\n\n\t\t\tdistance: distance,\n\t\t\tdistanceToRay: Math.sqrt( rayPointDistanceSq ),\n\t\t\tpoint: intersectPoint,\n\t\t\tindex: index,\n\t\t\tface: null,\n\t\t\tobject: object\n\n\t\t} );\n\n\t}\n\n}\n\nclass VideoTexture extends Texture {\n\n\tconstructor( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tsuper( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.isVideoTexture = true;\n\n\t\tthis.minFilter = minFilter !== undefined ? minFilter : LinearFilter;\n\t\tthis.magFilter = magFilter !== undefined ? magFilter : LinearFilter;\n\n\t\tthis.generateMipmaps = false;\n\n\t\tconst scope = this;\n\n\t\tfunction updateVideo() {\n\n\t\t\tscope.needsUpdate = true;\n\t\t\tvideo.requestVideoFrameCallback( updateVideo );\n\n\t\t}\n\n\t\tif ( 'requestVideoFrameCallback' in video ) {\n\n\t\t\tvideo.requestVideoFrameCallback( updateVideo );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.image ).copy( this );\n\n\t}\n\n\tupdate() {\n\n\t\tconst video = this.image;\n\t\tconst hasVideoFrameCallback = 'requestVideoFrameCallback' in video;\n\n\t\tif ( hasVideoFrameCallback === false && video.readyState >= video.HAVE_CURRENT_DATA ) {\n\n\t\t\tthis.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n}\n\nclass FramebufferTexture extends Texture {\n\n\tconstructor( width, height, format ) {\n\n\t\tsuper( { width, height } );\n\n\t\tthis.isFramebufferTexture = true;\n\n\t\tthis.format = format;\n\n\t\tthis.magFilter = NearestFilter;\n\t\tthis.minFilter = NearestFilter;\n\n\t\tthis.generateMipmaps = false;\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\nclass CompressedTexture extends Texture {\n\n\tconstructor( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, encoding ) {\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, encoding );\n\n\t\tthis.isCompressedTexture = true;\n\n\t\tthis.image = { width: width, height: height };\n\t\tthis.mipmaps = mipmaps;\n\n\t\t// no flipping for cube textures\n\t\t// (also flipping doesn't work for compressed textures )\n\n\t\tthis.flipY = false;\n\n\t\t// can't generate mipmaps for compressed textures\n\t\t// mips must be embedded in DDS files\n\n\t\tthis.generateMipmaps = false;\n\n\t}\n\n}\n\nclass CompressedArrayTexture extends CompressedTexture {\n\n\tconstructor( mipmaps, width, height, depth, format, type ) {\n\n\t\tsuper( mipmaps, width, height, format, type );\n\n\t\tthis.isCompressedArrayTexture = true;\n\t\tthis.image.depth = depth;\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t}\n\n}\n\nclass CanvasTexture extends Texture {\n\n\tconstructor( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tsuper( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\tthis.isCanvasTexture = true;\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\n/**\n * Extensible curve object.\n *\n * Some common of curve methods:\n * .getPoint( t, optionalTarget ), .getTangent( t, optionalTarget )\n * .getPointAt( u, optionalTarget ), .getTangentAt( u, optionalTarget )\n * .getPoints(), .getSpacedPoints()\n * .getLength()\n * .updateArcLengths()\n *\n * This following curves inherit from THREE.Curve:\n *\n * -- 2D curves --\n * THREE.ArcCurve\n * THREE.CubicBezierCurve\n * THREE.EllipseCurve\n * THREE.LineCurve\n * THREE.QuadraticBezierCurve\n * THREE.SplineCurve\n *\n * -- 3D curves --\n * THREE.CatmullRomCurve3\n * THREE.CubicBezierCurve3\n * THREE.LineCurve3\n * THREE.QuadraticBezierCurve3\n *\n * A series of curves can be represented as a THREE.CurvePath.\n *\n **/\n\nclass Curve {\n\n\tconstructor() {\n\n\t\tthis.type = 'Curve';\n\n\t\tthis.arcLengthDivisions = 200;\n\n\t}\n\n\t// Virtual base class method to overwrite and implement in subclasses\n\t//\t- t [0 .. 1]\n\n\tgetPoint( /* t, optionalTarget */ ) {\n\n\t\tconsole.warn( 'THREE.Curve: .getPoint() not implemented.' );\n\t\treturn null;\n\n\t}\n\n\t// Get point at relative position in curve according to arc length\n\t// - u [0 .. 1]\n\n\tgetPointAt( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getPoint( t, optionalTarget );\n\n\t}\n\n\t// Get sequence of points using getPoint( t )\n\n\tgetPoints( divisions = 5 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPoint( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\t// Get sequence of points using getPointAt( u )\n\n\tgetSpacedPoints( divisions = 5 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPointAt( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\t// Get total curve arc length\n\n\tgetLength() {\n\n\t\tconst lengths = this.getLengths();\n\t\treturn lengths[ lengths.length - 1 ];\n\n\t}\n\n\t// Get list of cumulative segment lengths\n\n\tgetLengths( divisions = this.arcLengthDivisions ) {\n\n\t\tif ( this.cacheArcLengths &&\n\t\t\t( this.cacheArcLengths.length === divisions + 1 ) &&\n\t\t\t! this.needsUpdate ) {\n\n\t\t\treturn this.cacheArcLengths;\n\n\t\t}\n\n\t\tthis.needsUpdate = false;\n\n\t\tconst cache = [];\n\t\tlet current, last = this.getPoint( 0 );\n\t\tlet sum = 0;\n\n\t\tcache.push( 0 );\n\n\t\tfor ( let p = 1; p <= divisions; p ++ ) {\n\n\t\t\tcurrent = this.getPoint( p / divisions );\n\t\t\tsum += current.distanceTo( last );\n\t\t\tcache.push( sum );\n\t\t\tlast = current;\n\n\t\t}\n\n\t\tthis.cacheArcLengths = cache;\n\n\t\treturn cache; // { sums: cache, sum: sum }; Sum is in the last element.\n\n\t}\n\n\tupdateArcLengths() {\n\n\t\tthis.needsUpdate = true;\n\t\tthis.getLengths();\n\n\t}\n\n\t// Given u ( 0 .. 1 ), get a t to find p. This gives you points which are equidistant\n\n\tgetUtoTmapping( u, distance ) {\n\n\t\tconst arcLengths = this.getLengths();\n\n\t\tlet i = 0;\n\t\tconst il = arcLengths.length;\n\n\t\tlet targetArcLength; // The targeted u distance value to get\n\n\t\tif ( distance ) {\n\n\t\t\ttargetArcLength = distance;\n\n\t\t} else {\n\n\t\t\ttargetArcLength = u * arcLengths[ il - 1 ];\n\n\t\t}\n\n\t\t// binary search for the index with largest value smaller than target u distance\n\n\t\tlet low = 0, high = il - 1, comparison;\n\n\t\twhile ( low <= high ) {\n\n\t\t\ti = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats\n\n\t\t\tcomparison = arcLengths[ i ] - targetArcLength;\n\n\t\t\tif ( comparison < 0 ) {\n\n\t\t\t\tlow = i + 1;\n\n\t\t\t} else if ( comparison > 0 ) {\n\n\t\t\t\thigh = i - 1;\n\n\t\t\t} else {\n\n\t\t\t\thigh = i;\n\t\t\t\tbreak;\n\n\t\t\t\t// DONE\n\n\t\t\t}\n\n\t\t}\n\n\t\ti = high;\n\n\t\tif ( arcLengths[ i ] === targetArcLength ) {\n\n\t\t\treturn i / ( il - 1 );\n\n\t\t}\n\n\t\t// we could get finer grain at lengths, or use simple interpolation between two points\n\n\t\tconst lengthBefore = arcLengths[ i ];\n\t\tconst lengthAfter = arcLengths[ i + 1 ];\n\n\t\tconst segmentLength = lengthAfter - lengthBefore;\n\n\t\t// determine where we are between the 'before' and 'after' points\n\n\t\tconst segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\n\n\t\t// add that fractional amount to t\n\n\t\tconst t = ( i + segmentFraction ) / ( il - 1 );\n\n\t\treturn t;\n\n\t}\n\n\t// Returns a unit vector tangent at t\n\t// In case any sub curve does not implement its tangent derivation,\n\t// 2 points a small delta apart will be used to find its gradient\n\t// which seems to give a reasonable approximation\n\n\tgetTangent( t, optionalTarget ) {\n\n\t\tconst delta = 0.0001;\n\t\tlet t1 = t - delta;\n\t\tlet t2 = t + delta;\n\n\t\t// Capping in case of danger\n\n\t\tif ( t1 < 0 ) t1 = 0;\n\t\tif ( t2 > 1 ) t2 = 1;\n\n\t\tconst pt1 = this.getPoint( t1 );\n\t\tconst pt2 = this.getPoint( t2 );\n\n\t\tconst tangent = optionalTarget || ( ( pt1.isVector2 ) ? new Vector2() : new Vector3() );\n\n\t\ttangent.copy( pt2 ).sub( pt1 ).normalize();\n\n\t\treturn tangent;\n\n\t}\n\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getTangent( t, optionalTarget );\n\n\t}\n\n\tcomputeFrenetFrames( segments, closed ) {\n\n\t\t// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\n\t\tconst normal = new Vector3();\n\n\t\tconst tangents = [];\n\t\tconst normals = [];\n\t\tconst binormals = [];\n\n\t\tconst vec = new Vector3();\n\t\tconst mat = new Matrix4();\n\n\t\t// compute the tangent vectors for each segment on the curve\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst u = i / segments;\n\n\t\t\ttangents[ i ] = this.getTangentAt( u, new Vector3() );\n\n\t\t}\n\n\t\t// select an initial normal vector perpendicular to the first tangent vector,\n\t\t// and in the direction of the minimum tangent xyz component\n\n\t\tnormals[ 0 ] = new Vector3();\n\t\tbinormals[ 0 ] = new Vector3();\n\t\tlet min = Number.MAX_VALUE;\n\t\tconst tx = Math.abs( tangents[ 0 ].x );\n\t\tconst ty = Math.abs( tangents[ 0 ].y );\n\t\tconst tz = Math.abs( tangents[ 0 ].z );\n\n\t\tif ( tx <= min ) {\n\n\t\t\tmin = tx;\n\t\t\tnormal.set( 1, 0, 0 );\n\n\t\t}\n\n\t\tif ( ty <= min ) {\n\n\t\t\tmin = ty;\n\t\t\tnormal.set( 0, 1, 0 );\n\n\t\t}\n\n\t\tif ( tz <= min ) {\n\n\t\t\tnormal.set( 0, 0, 1 );\n\n\t\t}\n\n\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\n\n\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\n\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\n\n\n\t\t// compute the slowly-varying normal and binormal vectors for each segment on the curve\n\n\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\tnormals[ i ] = normals[ i - 1 ].clone();\n\n\t\t\tbinormals[ i ] = binormals[ i - 1 ].clone();\n\n\t\t\tvec.crossVectors( tangents[ i - 1 ], tangents[ i ] );\n\n\t\t\tif ( vec.length() > Number.EPSILON ) {\n\n\t\t\t\tvec.normalize();\n\n\t\t\t\tconst theta = Math.acos( clamp( tangents[ i - 1 ].dot( tangents[ i ] ), - 1, 1 ) ); // clamp for floating pt errors\n\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\n\n\t\t\t}\n\n\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t}\n\n\t\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\n\n\t\tif ( closed === true ) {\n\n\t\t\tlet theta = Math.acos( clamp( normals[ 0 ].dot( normals[ segments ] ), - 1, 1 ) );\n\t\t\ttheta /= segments;\n\n\t\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {\n\n\t\t\t\ttheta = - theta;\n\n\t\t\t}\n\n\t\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\t\t// twist a little...\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\n\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttangents: tangents,\n\t\t\tnormals: normals,\n\t\t\tbinormals: binormals\n\t\t};\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.arcLengthDivisions = source.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.5,\n\t\t\t\ttype: 'Curve',\n\t\t\t\tgenerator: 'Curve.toJSON'\n\t\t\t}\n\t\t};\n\n\t\tdata.arcLengthDivisions = this.arcLengthDivisions;\n\t\tdata.type = this.type;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tthis.arcLengthDivisions = json.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass EllipseCurve extends Curve {\n\n\tconstructor( aX = 0, aY = 0, xRadius = 1, yRadius = 1, aStartAngle = 0, aEndAngle = Math.PI * 2, aClockwise = false, aRotation = 0 ) {\n\n\t\tsuper();\n\n\t\tthis.isEllipseCurve = true;\n\n\t\tthis.type = 'EllipseCurve';\n\n\t\tthis.aX = aX;\n\t\tthis.aY = aY;\n\n\t\tthis.xRadius = xRadius;\n\t\tthis.yRadius = yRadius;\n\n\t\tthis.aStartAngle = aStartAngle;\n\t\tthis.aEndAngle = aEndAngle;\n\n\t\tthis.aClockwise = aClockwise;\n\n\t\tthis.aRotation = aRotation;\n\n\t}\n\n\tgetPoint( t, optionalTarget ) {\n\n\t\tconst point = optionalTarget || new Vector2();\n\n\t\tconst twoPi = Math.PI * 2;\n\t\tlet deltaAngle = this.aEndAngle - this.aStartAngle;\n\t\tconst samePoints = Math.abs( deltaAngle ) < Number.EPSILON;\n\n\t\t// ensures that deltaAngle is 0 .. 2 PI\n\t\twhile ( deltaAngle < 0 ) deltaAngle += twoPi;\n\t\twhile ( deltaAngle > twoPi ) deltaAngle -= twoPi;\n\n\t\tif ( deltaAngle < Number.EPSILON ) {\n\n\t\t\tif ( samePoints ) {\n\n\t\t\t\tdeltaAngle = 0;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.aClockwise === true && ! samePoints ) {\n\n\t\t\tif ( deltaAngle === twoPi ) {\n\n\t\t\t\tdeltaAngle = - twoPi;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = deltaAngle - twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst angle = this.aStartAngle + t * deltaAngle;\n\t\tlet x = this.aX + this.xRadius * Math.cos( angle );\n\t\tlet y = this.aY + this.yRadius * Math.sin( angle );\n\n\t\tif ( this.aRotation !== 0 ) {\n\n\t\t\tconst cos = Math.cos( this.aRotation );\n\t\t\tconst sin = Math.sin( this.aRotation );\n\n\t\t\tconst tx = x - this.aX;\n\t\t\tconst ty = y - this.aY;\n\n\t\t\t// Rotate the point about the center of the ellipse.\n\t\t\tx = tx * cos - ty * sin + this.aX;\n\t\t\ty = tx * sin + ty * cos + this.aY;\n\n\t\t}\n\n\t\treturn point.set( x, y );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.aX = source.aX;\n\t\tthis.aY = source.aY;\n\n\t\tthis.xRadius = source.xRadius;\n\t\tthis.yRadius = source.yRadius;\n\n\t\tthis.aStartAngle = source.aStartAngle;\n\t\tthis.aEndAngle = source.aEndAngle;\n\n\t\tthis.aClockwise = source.aClockwise;\n\n\t\tthis.aRotation = source.aRotation;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.aX = this.aX;\n\t\tdata.aY = this.aY;\n\n\t\tdata.xRadius = this.xRadius;\n\t\tdata.yRadius = this.yRadius;\n\n\t\tdata.aStartAngle = this.aStartAngle;\n\t\tdata.aEndAngle = this.aEndAngle;\n\n\t\tdata.aClockwise = this.aClockwise;\n\n\t\tdata.aRotation = this.aRotation;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.aX = json.aX;\n\t\tthis.aY = json.aY;\n\n\t\tthis.xRadius = json.xRadius;\n\t\tthis.yRadius = json.yRadius;\n\n\t\tthis.aStartAngle = json.aStartAngle;\n\t\tthis.aEndAngle = json.aEndAngle;\n\n\t\tthis.aClockwise = json.aClockwise;\n\n\t\tthis.aRotation = json.aRotation;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass ArcCurve extends EllipseCurve {\n\n\tconstructor( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tsuper( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\tthis.isArcCurve = true;\n\n\t\tthis.type = 'ArcCurve';\n\n\t}\n\n}\n\n/**\n * Centripetal CatmullRom Curve - which is useful for avoiding\n * cusps and self-intersections in non-uniform catmull rom curves.\n * http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf\n *\n * curve.type accepts centripetal(default), chordal and catmullrom\n * curve.tension is used for catmullrom which defaults to 0.5\n */\n\n\n/*\nBased on an optimized c++ solution in\n - http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/\n - http://ideone.com/NoEbVM\n\nThis CubicPoly class could be used for reusing some variables and calculations,\nbut for three.js curve use, it could be possible inlined and flatten into a single function call\nwhich can be placed in CurveUtils.\n*/\n\nfunction CubicPoly() {\n\n\tlet c0 = 0, c1 = 0, c2 = 0, c3 = 0;\n\n\t/*\n\t * Compute coefficients for a cubic polynomial\n\t * p(s) = c0 + c1*s + c2*s^2 + c3*s^3\n\t * such that\n\t * p(0) = x0, p(1) = x1\n\t * and\n\t * p'(0) = t0, p'(1) = t1.\n\t */\n\tfunction init( x0, x1, t0, t1 ) {\n\n\t\tc0 = x0;\n\t\tc1 = t0;\n\t\tc2 = - 3 * x0 + 3 * x1 - 2 * t0 - t1;\n\t\tc3 = 2 * x0 - 2 * x1 + t0 + t1;\n\n\t}\n\n\treturn {\n\n\t\tinitCatmullRom: function ( x0, x1, x2, x3, tension ) {\n\n\t\t\tinit( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );\n\n\t\t},\n\n\t\tinitNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) {\n\n\t\t\t// compute tangents when parameterized in [t1,t2]\n\t\t\tlet t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\n\t\t\tlet t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;\n\n\t\t\t// rescale tangents for parametrization in [0,1]\n\t\t\tt1 *= dt1;\n\t\t\tt2 *= dt1;\n\n\t\t\tinit( x1, x2, t1, t2 );\n\n\t\t},\n\n\t\tcalc: function ( t ) {\n\n\t\t\tconst t2 = t * t;\n\t\t\tconst t3 = t2 * t;\n\t\t\treturn c0 + c1 * t + c2 * t2 + c3 * t3;\n\n\t\t}\n\n\t};\n\n}\n\n//\n\nconst tmp = /*@__PURE__*/ new Vector3();\nconst px = /*@__PURE__*/ new CubicPoly();\nconst py = /*@__PURE__*/ new CubicPoly();\nconst pz = /*@__PURE__*/ new CubicPoly();\n\nclass CatmullRomCurve3 extends Curve {\n\n\tconstructor( points = [], closed = false, curveType = 'centripetal', tension = 0.5 ) {\n\n\t\tsuper();\n\n\t\tthis.isCatmullRomCurve3 = true;\n\n\t\tthis.type = 'CatmullRomCurve3';\n\n\t\tthis.points = points;\n\t\tthis.closed = closed;\n\t\tthis.curveType = curveType;\n\t\tthis.tension = tension;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst points = this.points;\n\t\tconst l = points.length;\n\n\t\tconst p = ( l - ( this.closed ? 0 : 1 ) ) * t;\n\t\tlet intPoint = Math.floor( p );\n\t\tlet weight = p - intPoint;\n\n\t\tif ( this.closed ) {\n\n\t\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / l ) + 1 ) * l;\n\n\t\t} else if ( weight === 0 && intPoint === l - 1 ) {\n\n\t\t\tintPoint = l - 2;\n\t\t\tweight = 1;\n\n\t\t}\n\n\t\tlet p0, p3; // 4 points (p1 & p2 defined below)\n\n\t\tif ( this.closed || intPoint > 0 ) {\n\n\t\t\tp0 = points[ ( intPoint - 1 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate first point\n\t\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\n\t\t\tp0 = tmp;\n\n\t\t}\n\n\t\tconst p1 = points[ intPoint % l ];\n\t\tconst p2 = points[ ( intPoint + 1 ) % l ];\n\n\t\tif ( this.closed || intPoint + 2 < l ) {\n\n\t\t\tp3 = points[ ( intPoint + 2 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate last point\n\t\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\n\t\t\tp3 = tmp;\n\n\t\t}\n\n\t\tif ( this.curveType === 'centripetal' || this.curveType === 'chordal' ) {\n\n\t\t\t// init Centripetal / Chordal Catmull-Rom\n\t\t\tconst pow = this.curveType === 'chordal' ? 0.5 : 0.25;\n\t\t\tlet dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\n\t\t\tlet dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\n\t\t\tlet dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\n\n\t\t\t// safety check for repeated points\n\t\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\n\t\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\n\t\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\n\n\t\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\n\t\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\n\t\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\n\n\t\t} else if ( this.curveType === 'catmullrom' ) {\n\n\t\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, this.tension );\n\t\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, this.tension );\n\t\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, this.tension );\n\n\t\t}\n\n\t\tpoint.set(\n\t\t\tpx.calc( weight ),\n\t\t\tpy.calc( weight ),\n\t\t\tpz.calc( weight )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = source.points[ i ];\n\n\t\t\tthis.points.push( point.clone() );\n\n\t\t}\n\n\t\tthis.closed = source.closed;\n\t\tthis.curveType = source.curveType;\n\t\tthis.tension = source.tension;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.points = [];\n\n\t\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = this.points[ i ];\n\t\t\tdata.points.push( point.toArray() );\n\n\t\t}\n\n\t\tdata.closed = this.closed;\n\t\tdata.curveType = this.curveType;\n\t\tdata.tension = this.tension;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = json.points[ i ];\n\t\t\tthis.points.push( new Vector3().fromArray( point ) );\n\n\t\t}\n\n\t\tthis.closed = json.closed;\n\t\tthis.curveType = json.curveType;\n\t\tthis.tension = json.tension;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Bezier Curves formulas obtained from\n * https://en.wikipedia.org/wiki/B%C3%A9zier_curve\n */\n\nfunction CatmullRom( t, p0, p1, p2, p3 ) {\n\n\tconst v0 = ( p2 - p0 ) * 0.5;\n\tconst v1 = ( p3 - p1 ) * 0.5;\n\tconst t2 = t * t;\n\tconst t3 = t * t2;\n\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( - 3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n}\n\n//\n\nfunction QuadraticBezierP0( t, p ) {\n\n\tconst k = 1 - t;\n\treturn k * k * p;\n\n}\n\nfunction QuadraticBezierP1( t, p ) {\n\n\treturn 2 * ( 1 - t ) * t * p;\n\n}\n\nfunction QuadraticBezierP2( t, p ) {\n\n\treturn t * t * p;\n\n}\n\nfunction QuadraticBezier( t, p0, p1, p2 ) {\n\n\treturn QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) +\n\t\tQuadraticBezierP2( t, p2 );\n\n}\n\n//\n\nfunction CubicBezierP0( t, p ) {\n\n\tconst k = 1 - t;\n\treturn k * k * k * p;\n\n}\n\nfunction CubicBezierP1( t, p ) {\n\n\tconst k = 1 - t;\n\treturn 3 * k * k * t * p;\n\n}\n\nfunction CubicBezierP2( t, p ) {\n\n\treturn 3 * ( 1 - t ) * t * t * p;\n\n}\n\nfunction CubicBezierP3( t, p ) {\n\n\treturn t * t * t * p;\n\n}\n\nfunction CubicBezier( t, p0, p1, p2, p3 ) {\n\n\treturn CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) +\n\t\tCubicBezierP3( t, p3 );\n\n}\n\nclass CubicBezierCurve extends Curve {\n\n\tconstructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2(), v3 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\tthis.isCubicBezierCurve = true;\n\n\t\tthis.type = 'CubicBezierCurve';\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t\tthis.v3 = v3;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\tpoint.set(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\t\tthis.v3.copy( source.v3 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\t\tdata.v3 = this.v3.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\t\tthis.v3.fromArray( json.v3 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass CubicBezierCurve3 extends Curve {\n\n\tconstructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3(), v3 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\tthis.isCubicBezierCurve3 = true;\n\n\t\tthis.type = 'CubicBezierCurve3';\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t\tthis.v3 = v3;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\tpoint.set(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y ),\n\t\t\tCubicBezier( t, v0.z, v1.z, v2.z, v3.z )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\t\tthis.v3.copy( source.v3 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\t\tdata.v3 = this.v3.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\t\tthis.v3.fromArray( json.v3 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass LineCurve extends Curve {\n\n\tconstructor( v1 = new Vector2(), v2 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\tthis.isLineCurve = true;\n\n\t\tthis.type = 'LineCurve';\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tif ( t === 1 ) {\n\n\t\t\tpoint.copy( this.v2 );\n\n\t\t} else {\n\n\t\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\t}\n\n\t\treturn point;\n\n\t}\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\tgetPointAt( u, optionalTarget ) {\n\n\t\treturn this.getPoint( u, optionalTarget );\n\n\t}\n\n\tgetTangent( t, optionalTarget ) {\n\n\t\tconst tangent = optionalTarget || new Vector2();\n\n\t\ttangent.copy( this.v2 ).sub( this.v1 ).normalize();\n\n\t\treturn tangent;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass LineCurve3 extends Curve {\n\n\tconstructor( v1 = new Vector3(), v2 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\tthis.isLineCurve3 = true;\n\n\t\tthis.type = 'LineCurve3';\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tif ( t === 1 ) {\n\n\t\t\tpoint.copy( this.v2 );\n\n\t\t} else {\n\n\t\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\t}\n\n\t\treturn point;\n\n\t}\n\t// Line curve is linear, so we can overwrite default getPointAt\n\tgetPointAt( u, optionalTarget ) {\n\n\t\treturn this.getPoint( u, optionalTarget );\n\n\t}\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass QuadraticBezierCurve extends Curve {\n\n\tconstructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\tthis.isQuadraticBezierCurve = true;\n\n\t\tthis.type = 'QuadraticBezierCurve';\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\tpoint.set(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass QuadraticBezierCurve3 extends Curve {\n\n\tconstructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\tthis.isQuadraticBezierCurve3 = true;\n\n\t\tthis.type = 'QuadraticBezierCurve3';\n\n\t\tthis.v0 = v0;\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\tpoint.set(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y ),\n\t\t\tQuadraticBezier( t, v0.z, v1.z, v2.z )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass SplineCurve extends Curve {\n\n\tconstructor( points = [] ) {\n\n\t\tsuper();\n\n\t\tthis.isSplineCurve = true;\n\n\t\tthis.type = 'SplineCurve';\n\n\t\tthis.points = points;\n\n\t}\n\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst points = this.points;\n\t\tconst p = ( points.length - 1 ) * t;\n\n\t\tconst intPoint = Math.floor( p );\n\t\tconst weight = p - intPoint;\n\n\t\tconst p0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\n\t\tconst p1 = points[ intPoint ];\n\t\tconst p2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\tconst p3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\tpoint.set(\n\t\t\tCatmullRom( weight, p0.x, p1.x, p2.x, p3.x ),\n\t\t\tCatmullRom( weight, p0.y, p1.y, p2.y, p3.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = source.points[ i ];\n\n\t\t\tthis.points.push( point.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.points = [];\n\n\t\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = this.points[ i ];\n\t\t\tdata.points.push( point.toArray() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = json.points[ i ];\n\t\t\tthis.points.push( new Vector2().fromArray( point ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nvar Curves = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tArcCurve: ArcCurve,\n\tCatmullRomCurve3: CatmullRomCurve3,\n\tCubicBezierCurve: CubicBezierCurve,\n\tCubicBezierCurve3: CubicBezierCurve3,\n\tEllipseCurve: EllipseCurve,\n\tLineCurve: LineCurve,\n\tLineCurve3: LineCurve3,\n\tQuadraticBezierCurve: QuadraticBezierCurve,\n\tQuadraticBezierCurve3: QuadraticBezierCurve3,\n\tSplineCurve: SplineCurve\n});\n\n/**************************************************************\n *\tCurved Path - a curve path is simply a array of connected\n * curves, but retains the api of a curve\n **************************************************************/\n\nclass CurvePath extends Curve {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'CurvePath';\n\n\t\tthis.curves = [];\n\t\tthis.autoClose = false; // Automatically closes the path\n\n\t}\n\n\tadd( curve ) {\n\n\t\tthis.curves.push( curve );\n\n\t}\n\n\tclosePath() {\n\n\t\t// Add a line curve if start and end of lines are not connected\n\t\tconst startPoint = this.curves[ 0 ].getPoint( 0 );\n\t\tconst endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\n\n\t\tif ( ! startPoint.equals( endPoint ) ) {\n\n\t\t\tthis.curves.push( new LineCurve( endPoint, startPoint ) );\n\n\t\t}\n\n\t}\n\n\t// To get accurate point with reference to\n\t// entire path distance at time t,\n\t// following has to be done:\n\n\t// 1. Length of each sub path have to be known\n\t// 2. Locate and identify type of curve\n\t// 3. Get t for the curve\n\t// 4. Return curve.getPointAt(t')\n\n\tgetPoint( t, optionalTarget ) {\n\n\t\tconst d = t * this.getLength();\n\t\tconst curveLengths = this.getCurveLengths();\n\t\tlet i = 0;\n\n\t\t// To think about boundaries points.\n\n\t\twhile ( i < curveLengths.length ) {\n\n\t\t\tif ( curveLengths[ i ] >= d ) {\n\n\t\t\t\tconst diff = curveLengths[ i ] - d;\n\t\t\t\tconst curve = this.curves[ i ];\n\n\t\t\t\tconst segmentLength = curve.getLength();\n\t\t\t\tconst u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\treturn curve.getPointAt( u, optionalTarget );\n\n\t\t\t}\n\n\t\t\ti ++;\n\n\t\t}\n\n\t\treturn null;\n\n\t\t// loop where sum != 0, sum > d , sum+1 <d\n\n\t}\n\n\t// We cannot use the default THREE.Curve getPoint() with getLength() because in\n\t// THREE.Curve, getLength() depends on getPoint() but in THREE.CurvePath\n\t// getPoint() depends on getLength\n\n\tgetLength() {\n\n\t\tconst lens = this.getCurveLengths();\n\t\treturn lens[ lens.length - 1 ];\n\n\t}\n\n\t// cacheLengths must be recalculated.\n\tupdateArcLengths() {\n\n\t\tthis.needsUpdate = true;\n\t\tthis.cacheLengths = null;\n\t\tthis.getCurveLengths();\n\n\t}\n\n\t// Compute lengths and cache them\n\t// We cannot overwrite getLengths() because UtoT mapping uses it.\n\n\tgetCurveLengths() {\n\n\t\t// We use cache values if curves and cache array are same length\n\n\t\tif ( this.cacheLengths && this.cacheLengths.length === this.curves.length ) {\n\n\t\t\treturn this.cacheLengths;\n\n\t\t}\n\n\t\t// Get length of sub-curve\n\t\t// Push sums into cached array\n\n\t\tconst lengths = [];\n\t\tlet sums = 0;\n\n\t\tfor ( let i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tsums += this.curves[ i ].getLength();\n\t\t\tlengths.push( sums );\n\n\t\t}\n\n\t\tthis.cacheLengths = lengths;\n\n\t\treturn lengths;\n\n\t}\n\n\tgetSpacedPoints( divisions = 40 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let i = 0; i <= divisions; i ++ ) {\n\n\t\t\tpoints.push( this.getPoint( i / divisions ) );\n\n\t\t}\n\n\t\tif ( this.autoClose ) {\n\n\t\t\tpoints.push( points[ 0 ] );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\tgetPoints( divisions = 12 ) {\n\n\t\tconst points = [];\n\t\tlet last;\n\n\t\tfor ( let i = 0, curves = this.curves; i < curves.length; i ++ ) {\n\n\t\t\tconst curve = curves[ i ];\n\t\t\tconst resolution = curve.isEllipseCurve ? divisions * 2\n\t\t\t\t: ( curve.isLineCurve || curve.isLineCurve3 ) ? 1\n\t\t\t\t\t: curve.isSplineCurve ? divisions * curve.points.length\n\t\t\t\t\t\t: divisions;\n\n\t\t\tconst pts = curve.getPoints( resolution );\n\n\t\t\tfor ( let j = 0; j < pts.length; j ++ ) {\n\n\t\t\t\tconst point = pts[ j ];\n\n\t\t\t\tif ( last && last.equals( point ) ) continue; // ensures no consecutive points are duplicates\n\n\t\t\t\tpoints.push( point );\n\t\t\t\tlast = point;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.autoClose && points.length > 1 && ! points[ points.length - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\tpoints.push( points[ 0 ] );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = source.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = source.curves[ i ];\n\n\t\t\tthis.curves.push( curve.clone() );\n\n\t\t}\n\n\t\tthis.autoClose = source.autoClose;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.autoClose = this.autoClose;\n\t\tdata.curves = [];\n\n\t\tfor ( let i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = this.curves[ i ];\n\t\t\tdata.curves.push( curve.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.autoClose = json.autoClose;\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = json.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = json.curves[ i ];\n\t\t\tthis.curves.push( new Curves[ curve.type ]().fromJSON( curve ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass Path extends CurvePath {\n\n\tconstructor( points ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Path';\n\n\t\tthis.currentPoint = new Vector2();\n\n\t\tif ( points ) {\n\n\t\t\tthis.setFromPoints( points );\n\n\t\t}\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tthis.moveTo( points[ 0 ].x, points[ 0 ].y );\n\n\t\tfor ( let i = 1, l = points.length; i < l; i ++ ) {\n\n\t\t\tthis.lineTo( points[ i ].x, points[ i ].y );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tmoveTo( x, y ) {\n\n\t\tthis.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?\n\n\t\treturn this;\n\n\t}\n\n\tlineTo( x, y ) {\n\n\t\tconst curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( x, y );\n\n\t\treturn this;\n\n\t}\n\n\tquadraticCurveTo( aCPx, aCPy, aX, aY ) {\n\n\t\tconst curve = new QuadraticBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCPx, aCPy ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\tbezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tconst curve = new CubicBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCP1x, aCP1y ),\n\t\t\tnew Vector2( aCP2x, aCP2y ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\tsplineThru( pts /*Array of Vector*/ ) {\n\n\t\tconst npts = [ this.currentPoint.clone() ].concat( pts );\n\n\t\tconst curve = new SplineCurve( npts );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.copy( pts[ pts.length - 1 ] );\n\n\t\treturn this;\n\n\t}\n\n\tarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absarc( aX + x0, aY + y0, aRadius,\n\t\t\taStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t}\n\n\tabsarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tthis.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t}\n\n\tellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\treturn this;\n\n\t}\n\n\tabsellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\tif ( this.curves.length > 0 ) {\n\n\t\t\t// if a previous curve is present, attempt to join\n\t\t\tconst firstPoint = curve.getPoint( 0 );\n\n\t\t\tif ( ! firstPoint.equals( this.currentPoint ) ) {\n\n\t\t\t\tthis.lineTo( firstPoint.x, firstPoint.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.curves.push( curve );\n\n\t\tconst lastPoint = curve.getPoint( 1 );\n\t\tthis.currentPoint.copy( lastPoint );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.currentPoint.copy( source.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.currentPoint = this.currentPoint.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.currentPoint.fromArray( json.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass LatheGeometry extends BufferGeometry {\n\n\tconstructor( points = [ new Vector2( 0, - 0.5 ), new Vector2( 0.5, 0 ), new Vector2( 0, 0.5 ) ], segments = 12, phiStart = 0, phiLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'LatheGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpoints: points,\n\t\t\tsegments: segments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength\n\t\t};\n\n\t\tsegments = Math.floor( segments );\n\n\t\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\n\t\tphiLength = clamp( phiLength, 0, Math.PI * 2 );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst uvs = [];\n\t\tconst initNormals = [];\n\t\tconst normals = [];\n\n\t\t// helper variables\n\n\t\tconst inverseSegments = 1.0 / segments;\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\t\tconst normal = new Vector3();\n\t\tconst curNormal = new Vector3();\n\t\tconst prevNormal = new Vector3();\n\t\tlet dx = 0;\n\t\tlet dy = 0;\n\n\t\t// pre-compute normals for initial \"meridian\"\n\n\t\tfor ( let j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\tswitch ( j ) {\n\n\t\t\t\tcase 0:\t\t\t\t// special handling for 1st vertex on path\n\n\t\t\t\t\tdx = points[ j + 1 ].x - points[ j ].x;\n\t\t\t\t\tdy = points[ j + 1 ].y - points[ j ].y;\n\n\t\t\t\t\tnormal.x = dy * 1.0;\n\t\t\t\t\tnormal.y = - dx;\n\t\t\t\t\tnormal.z = dy * 0.0;\n\n\t\t\t\t\tprevNormal.copy( normal );\n\n\t\t\t\t\tnormal.normalize();\n\n\t\t\t\t\tinitNormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ( points.length - 1 ):\t// special handling for last Vertex on path\n\n\t\t\t\t\tinitNormals.push( prevNormal.x, prevNormal.y, prevNormal.z );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\t\t\t// default handling for all vertices in between\n\n\t\t\t\t\tdx = points[ j + 1 ].x - points[ j ].x;\n\t\t\t\t\tdy = points[ j + 1 ].y - points[ j ].y;\n\n\t\t\t\t\tnormal.x = dy * 1.0;\n\t\t\t\t\tnormal.y = - dx;\n\t\t\t\t\tnormal.z = dy * 0.0;\n\n\t\t\t\t\tcurNormal.copy( normal );\n\n\t\t\t\t\tnormal.x += prevNormal.x;\n\t\t\t\t\tnormal.y += prevNormal.y;\n\t\t\t\t\tnormal.z += prevNormal.z;\n\n\t\t\t\t\tnormal.normalize();\n\n\t\t\t\t\tinitNormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\tprevNormal.copy( curNormal );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate vertices, uvs and normals\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst phi = phiStart + i * inverseSegments * phiLength;\n\n\t\t\tconst sin = Math.sin( phi );\n\t\t\tconst cos = Math.cos( phi );\n\n\t\t\tfor ( let j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = points[ j ].x * sin;\n\t\t\t\tvertex.y = points[ j ].y;\n\t\t\t\tvertex.z = points[ j ].x * cos;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = i / segments;\n\t\t\t\tuv.y = j / ( points.length - 1 );\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// normal\n\n\t\t\t\tconst x = initNormals[ 3 * j + 0 ] * sin;\n\t\t\t\tconst y = initNormals[ 3 * j + 1 ];\n\t\t\t\tconst z = initNormals[ 3 * j + 0 ] * cos;\n\n\t\t\t\tnormals.push( x, y, z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let i = 0; i < segments; i ++ ) {\n\n\t\t\tfor ( let j = 0; j < ( points.length - 1 ); j ++ ) {\n\n\t\t\t\tconst base = j + i * points.length;\n\n\t\t\t\tconst a = base;\n\t\t\t\tconst b = base + points.length;\n\t\t\t\tconst c = base + points.length + 1;\n\t\t\t\tconst d = base + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( c, d, b );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new LatheGeometry( data.points, data.segments, data.phiStart, data.phiLength );\n\n\t}\n\n}\n\nclass CapsuleGeometry extends LatheGeometry {\n\n\tconstructor( radius = 1, length = 1, capSegments = 4, radialSegments = 8 ) {\n\n\t\tconst path = new Path();\n\t\tpath.absarc( 0, - length / 2, radius, Math.PI * 1.5, 0 );\n\t\tpath.absarc( 0, length / 2, radius, 0, Math.PI * 0.5 );\n\n\t\tsuper( path.getPoints( capSegments ), radialSegments );\n\n\t\tthis.type = 'CapsuleGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: length,\n\t\t\tcapSegments: capSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new CapsuleGeometry( data.radius, data.length, data.capSegments, data.radialSegments );\n\n\t}\n\n}\n\nclass CircleGeometry extends BufferGeometry {\n\n\tconstructor( radius = 1, segments = 32, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CircleGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tsegments: segments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tsegments = Math.max( 3, segments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// center point\n\n\t\tvertices.push( 0, 0, 0 );\n\t\tnormals.push( 0, 0, 1 );\n\t\tuvs.push( 0.5, 0.5 );\n\n\t\tfor ( let s = 0, i = 3; s <= segments; s ++, i += 3 ) {\n\n\t\t\tconst segment = thetaStart + s / segments * thetaLength;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t// uvs\n\n\t\t\tuv.x = ( vertices[ i ] / radius + 1 ) / 2;\n\t\t\tuv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2;\n\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\tindices.push( i, i + 1, 0 );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new CircleGeometry( data.radius, data.segments, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nclass CylinderGeometry extends BufferGeometry {\n\n\tconstructor( radiusTop = 1, radiusBottom = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CylinderGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradiusTop: radiusTop,\n\t\t\tradiusBottom: radiusBottom,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tconst scope = this;\n\n\t\tradialSegments = Math.floor( radialSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet index = 0;\n\t\tconst indexArray = [];\n\t\tconst halfHeight = height / 2;\n\t\tlet groupStart = 0;\n\n\t\t// generate geometry\n\n\t\tgenerateTorso();\n\n\t\tif ( openEnded === false ) {\n\n\t\t\tif ( radiusTop > 0 ) generateCap( true );\n\t\t\tif ( radiusBottom > 0 ) generateCap( false );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction generateTorso() {\n\n\t\t\tconst normal = new Vector3();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\n\t\t\t// this will be used to calculate the normal\n\t\t\tconst slope = ( radiusBottom - radiusTop ) / height;\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\t\tconst indexRow = [];\n\n\t\t\t\tconst v = y / heightSegments;\n\n\t\t\t\t// calculate the radius of the current row\n\n\t\t\t\tconst radius = v * ( radiusBottom - radiusTop ) + radiusTop;\n\n\t\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\t\tconst u = x / radialSegments;\n\n\t\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\t\tconst sinTheta = Math.sin( theta );\n\t\t\t\t\tconst cosTheta = Math.cos( theta );\n\n\t\t\t\t\t// vertex\n\n\t\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\t\tvertex.y = - v * height + halfHeight;\n\t\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t// normal\n\n\t\t\t\t\tnormal.set( sinTheta, slope, cosTheta ).normalize();\n\t\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\t// uv\n\n\t\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\t\t// save index of vertex in respective row\n\n\t\t\t\t\tindexRow.push( index ++ );\n\n\t\t\t\t}\n\n\t\t\t\t// now save vertices of the row in our index array\n\n\t\t\t\tindexArray.push( indexRow );\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tfor ( let y = 0; y < heightSegments; y ++ ) {\n\n\t\t\t\t\t// we use the index array to access the correct indices\n\n\t\t\t\t\tconst a = indexArray[ y ][ x ];\n\t\t\t\t\tconst b = indexArray[ y + 1 ][ x ];\n\t\t\t\t\tconst c = indexArray[ y + 1 ][ x + 1 ];\n\t\t\t\t\tconst d = indexArray[ y ][ x + 1 ];\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// update group counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, 0 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t\tfunction generateCap( top ) {\n\n\t\t\t// save the index of the first center vertex\n\t\t\tconst centerIndexStart = index;\n\n\t\t\tconst uv = new Vector2();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst radius = ( top === true ) ? radiusTop : radiusBottom;\n\t\t\tconst sign = ( top === true ) ? 1 : - 1;\n\n\t\t\t// first we generate the center vertex data of the cap.\n\t\t\t// because the geometry needs one set of uvs per face,\n\t\t\t// we must generate a center vertex per face/segment\n\n\t\t\tfor ( let x = 1; x <= radialSegments; x ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertices.push( 0, halfHeight * sign, 0 );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( 0.5, 0.5 );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// save the index of the last center vertex\n\t\t\tconst centerIndexEnd = index;\n\n\t\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\tconst u = x / radialSegments;\n\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\tconst cosTheta = Math.cos( theta );\n\t\t\t\tconst sinTheta = Math.sin( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\tvertex.y = halfHeight * sign;\n\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( cosTheta * 0.5 ) + 0.5;\n\t\t\t\tuv.y = ( sinTheta * 0.5 * sign ) + 0.5;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tconst c = centerIndexStart + x;\n\t\t\t\tconst i = centerIndexEnd + x;\n\n\t\t\t\tif ( top === true ) {\n\n\t\t\t\t\t// face top\n\n\t\t\t\t\tindices.push( i, i + 1, c );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// face bottom\n\n\t\t\t\t\tindices.push( i + 1, i, c );\n\n\t\t\t\t}\n\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new CylinderGeometry( data.radiusTop, data.radiusBottom, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nclass ConeGeometry extends CylinderGeometry {\n\n\tconstructor( radius = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper( 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new ConeGeometry( data.radius, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nclass PolyhedronGeometry extends BufferGeometry {\n\n\tconstructor( vertices = [], indices = [], radius = 1, detail = 0 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PolyhedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tvertices: vertices,\n\t\t\tindices: indices,\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\t// default buffer data\n\n\t\tconst vertexBuffer = [];\n\t\tconst uvBuffer = [];\n\n\t\t// the subdivision creates the vertex buffer data\n\n\t\tsubdivide( detail );\n\n\t\t// all vertices should lie on a conceptual sphere with a given radius\n\n\t\tapplyRadius( radius );\n\n\t\t// finally, create the uv data\n\n\t\tgenerateUVs();\n\n\t\t// build non-indexed geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) );\n\n\t\tif ( detail === 0 ) {\n\n\t\t\tthis.computeVertexNormals(); // flat normals\n\n\t\t} else {\n\n\t\t\tthis.normalizeNormals(); // smooth normals\n\n\t\t}\n\n\t\t// helper functions\n\n\t\tfunction subdivide( detail ) {\n\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\t// iterate over all faces and apply a subdivision with the given detail value\n\n\t\t\tfor ( let i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t// get the vertices of the face\n\n\t\t\t\tgetVertexByIndex( indices[ i + 0 ], a );\n\t\t\t\tgetVertexByIndex( indices[ i + 1 ], b );\n\t\t\t\tgetVertexByIndex( indices[ i + 2 ], c );\n\n\t\t\t\t// perform subdivision\n\n\t\t\t\tsubdivideFace( a, b, c, detail );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction subdivideFace( a, b, c, detail ) {\n\n\t\t\tconst cols = detail + 1;\n\n\t\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\t\tconst v = [];\n\n\t\t\t// construct all of the vertices for this subdivision\n\n\t\t\tfor ( let i = 0; i <= cols; i ++ ) {\n\n\t\t\t\tv[ i ] = [];\n\n\t\t\t\tconst aj = a.clone().lerp( c, i / cols );\n\t\t\t\tconst bj = b.clone().lerp( c, i / cols );\n\n\t\t\t\tconst rows = cols - i;\n\n\t\t\t\tfor ( let j = 0; j <= rows; j ++ ) {\n\n\t\t\t\t\tif ( j === 0 && i === cols ) {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj.clone().lerp( bj, j / rows );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// construct all of the faces\n\n\t\t\tfor ( let i = 0; i < cols; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\n\n\t\t\t\t\tconst k = Math.floor( j / 2 );\n\n\t\t\t\t\tif ( j % 2 === 0 ) {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\t\t\t\t\t\tpushVertex( v[ i ][ k ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction applyRadius( radius ) {\n\n\t\t\tconst vertex = new Vector3();\n\n\t\t\t// iterate over the entire buffer and apply the radius to each vertex\n\n\t\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tvertex.normalize().multiplyScalar( radius );\n\n\t\t\t\tvertexBuffer[ i + 0 ] = vertex.x;\n\t\t\t\tvertexBuffer[ i + 1 ] = vertex.y;\n\t\t\t\tvertexBuffer[ i + 2 ] = vertex.z;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tconst u = azimuth( vertex ) / 2 / Math.PI + 0.5;\n\t\t\t\tconst v = inclination( vertex ) / Math.PI + 0.5;\n\t\t\t\tuvBuffer.push( u, 1 - v );\n\n\t\t\t}\n\n\t\t\tcorrectUVs();\n\n\t\t\tcorrectSeam();\n\n\t\t}\n\n\t\tfunction correctSeam() {\n\n\t\t\t// handle case when face straddles the seam, see #3269\n\n\t\t\tfor ( let i = 0; i < uvBuffer.length; i += 6 ) {\n\n\t\t\t\t// uv data of a single face\n\n\t\t\t\tconst x0 = uvBuffer[ i + 0 ];\n\t\t\t\tconst x1 = uvBuffer[ i + 2 ];\n\t\t\t\tconst x2 = uvBuffer[ i + 4 ];\n\n\t\t\t\tconst max = Math.max( x0, x1, x2 );\n\t\t\t\tconst min = Math.min( x0, x1, x2 );\n\n\t\t\t\t// 0.9 is somewhat arbitrary\n\n\t\t\t\tif ( max > 0.9 && min < 0.1 ) {\n\n\t\t\t\t\tif ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1;\n\t\t\t\t\tif ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1;\n\t\t\t\t\tif ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction pushVertex( vertex ) {\n\n\t\t\tvertexBuffer.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t\tfunction getVertexByIndex( index, vertex ) {\n\n\t\t\tconst stride = index * 3;\n\n\t\t\tvertex.x = vertices[ stride + 0 ];\n\t\t\tvertex.y = vertices[ stride + 1 ];\n\t\t\tvertex.z = vertices[ stride + 2 ];\n\n\t\t}\n\n\t\tfunction correctUVs() {\n\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\tconst centroid = new Vector3();\n\n\t\t\tconst uvA = new Vector2();\n\t\t\tconst uvB = new Vector2();\n\t\t\tconst uvC = new Vector2();\n\n\t\t\tfor ( let i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) {\n\n\t\t\t\ta.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] );\n\t\t\t\tb.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] );\n\t\t\t\tc.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] );\n\n\t\t\t\tuvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] );\n\t\t\t\tuvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] );\n\t\t\t\tuvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] );\n\n\t\t\t\tcentroid.copy( a ).add( b ).add( c ).divideScalar( 3 );\n\n\t\t\t\tconst azi = azimuth( centroid );\n\n\t\t\t\tcorrectUV( uvA, j + 0, a, azi );\n\t\t\t\tcorrectUV( uvB, j + 2, b, azi );\n\t\t\t\tcorrectUV( uvC, j + 4, c, azi );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction correctUV( uv, stride, vector, azimuth ) {\n\n\t\t\tif ( ( azimuth < 0 ) && ( uv.x === 1 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = uv.x - 1;\n\n\t\t\t}\n\n\t\t\tif ( ( vector.x === 0 ) && ( vector.z === 0 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Angle around the Y axis, counter-clockwise when looking from above.\n\n\t\tfunction azimuth( vector ) {\n\n\t\t\treturn Math.atan2( vector.z, - vector.x );\n\n\t\t}\n\n\n\t\t// Angle above the XZ plane.\n\n\t\tfunction inclination( vector ) {\n\n\t\t\treturn Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );\n\n\t\t}\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new PolyhedronGeometry( data.vertices, data.indices, data.radius, data.details );\n\n\t}\n\n}\n\nclass DodecahedronGeometry extends PolyhedronGeometry {\n\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\t\tconst r = 1 / t;\n\n\t\tconst vertices = [\n\n\t\t\t// (±1, ±1, ±1)\n\t\t\t- 1, - 1, - 1,\t- 1, - 1, 1,\n\t\t\t- 1, 1, - 1, - 1, 1, 1,\n\t\t\t1, - 1, - 1, 1, - 1, 1,\n\t\t\t1, 1, - 1, 1, 1, 1,\n\n\t\t\t// (0, ±1/φ, ±φ)\n\t\t\t0, - r, - t, 0, - r, t,\n\t\t\t0, r, - t, 0, r, t,\n\n\t\t\t// (±1/φ, ±φ, 0)\n\t\t\t- r, - t, 0, - r, t, 0,\n\t\t\tr, - t, 0, r, t, 0,\n\n\t\t\t// (±φ, 0, ±1/φ)\n\t\t\t- t, 0, - r, t, 0, - r,\n\t\t\t- t, 0, r, t, 0, r\n\t\t];\n\n\t\tconst indices = [\n\t\t\t3, 11, 7, \t3, 7, 15, \t3, 15, 13,\n\t\t\t7, 19, 17, \t7, 17, 6, \t7, 6, 15,\n\t\t\t17, 4, 8, \t17, 8, 10, \t17, 10, 6,\n\t\t\t8, 0, 16, \t8, 16, 2, \t8, 2, 10,\n\t\t\t0, 12, 1, \t0, 1, 18, \t0, 18, 16,\n\t\t\t6, 10, 2, \t6, 2, 13, \t6, 13, 15,\n\t\t\t2, 16, 18, \t2, 18, 3, \t2, 3, 13,\n\t\t\t18, 1, 9, \t18, 9, 11, \t18, 11, 3,\n\t\t\t4, 14, 12, \t4, 12, 0, \t4, 0, 8,\n\t\t\t11, 9, 5, \t11, 5, 19, \t11, 19, 7,\n\t\t\t19, 5, 14, \t19, 14, 4, \t19, 4, 17,\n\t\t\t1, 12, 14, \t1, 14, 5, \t1, 5, 9\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'DodecahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new DodecahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nconst _v0 = /*@__PURE__*/ new Vector3();\nconst _v1$1 = /*@__PURE__*/ new Vector3();\nconst _normal = /*@__PURE__*/ new Vector3();\nconst _triangle = /*@__PURE__*/ new Triangle();\n\nclass EdgesGeometry extends BufferGeometry {\n\n\tconstructor( geometry = null, thresholdAngle = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'EdgesGeometry';\n\n\t\tthis.parameters = {\n\t\t\tgeometry: geometry,\n\t\t\tthresholdAngle: thresholdAngle\n\t\t};\n\n\t\tif ( geometry !== null ) {\n\n\t\t\tconst precisionPoints = 4;\n\t\t\tconst precision = Math.pow( 10, precisionPoints );\n\t\t\tconst thresholdDot = Math.cos( DEG2RAD * thresholdAngle );\n\n\t\t\tconst indexAttr = geometry.getIndex();\n\t\t\tconst positionAttr = geometry.getAttribute( 'position' );\n\t\t\tconst indexCount = indexAttr ? indexAttr.count : positionAttr.count;\n\n\t\t\tconst indexArr = [ 0, 0, 0 ];\n\t\t\tconst vertKeys = [ 'a', 'b', 'c' ];\n\t\t\tconst hashes = new Array( 3 );\n\n\t\t\tconst edgeData = {};\n\t\t\tconst vertices = [];\n\t\t\tfor ( let i = 0; i < indexCount; i += 3 ) {\n\n\t\t\t\tif ( indexAttr ) {\n\n\t\t\t\t\tindexArr[ 0 ] = indexAttr.getX( i );\n\t\t\t\t\tindexArr[ 1 ] = indexAttr.getX( i + 1 );\n\t\t\t\t\tindexArr[ 2 ] = indexAttr.getX( i + 2 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindexArr[ 0 ] = i;\n\t\t\t\t\tindexArr[ 1 ] = i + 1;\n\t\t\t\t\tindexArr[ 2 ] = i + 2;\n\n\t\t\t\t}\n\n\t\t\t\tconst { a, b, c } = _triangle;\n\t\t\t\ta.fromBufferAttribute( positionAttr, indexArr[ 0 ] );\n\t\t\t\tb.fromBufferAttribute( positionAttr, indexArr[ 1 ] );\n\t\t\t\tc.fromBufferAttribute( positionAttr, indexArr[ 2 ] );\n\t\t\t\t_triangle.getNormal( _normal );\n\n\t\t\t\t// create hashes for the edge from the vertices\n\t\t\t\thashes[ 0 ] = `${ Math.round( a.x * precision ) },${ Math.round( a.y * precision ) },${ Math.round( a.z * precision ) }`;\n\t\t\t\thashes[ 1 ] = `${ Math.round( b.x * precision ) },${ Math.round( b.y * precision ) },${ Math.round( b.z * precision ) }`;\n\t\t\t\thashes[ 2 ] = `${ Math.round( c.x * precision ) },${ Math.round( c.y * precision ) },${ Math.round( c.z * precision ) }`;\n\n\t\t\t\t// skip degenerate triangles\n\t\t\t\tif ( hashes[ 0 ] === hashes[ 1 ] || hashes[ 1 ] === hashes[ 2 ] || hashes[ 2 ] === hashes[ 0 ] ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// iterate over every edge\n\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t// get the first and next vertex making up the edge\n\t\t\t\t\tconst jNext = ( j + 1 ) % 3;\n\t\t\t\t\tconst vecHash0 = hashes[ j ];\n\t\t\t\t\tconst vecHash1 = hashes[ jNext ];\n\t\t\t\t\tconst v0 = _triangle[ vertKeys[ j ] ];\n\t\t\t\t\tconst v1 = _triangle[ vertKeys[ jNext ] ];\n\n\t\t\t\t\tconst hash = `${ vecHash0 }_${ vecHash1 }`;\n\t\t\t\t\tconst reverseHash = `${ vecHash1 }_${ vecHash0 }`;\n\n\t\t\t\t\tif ( reverseHash in edgeData && edgeData[ reverseHash ] ) {\n\n\t\t\t\t\t\t// if we found a sibling edge add it into the vertex array if\n\t\t\t\t\t\t// it meets the angle threshold and delete the edge from the map.\n\t\t\t\t\t\tif ( _normal.dot( edgeData[ reverseHash ].normal ) <= thresholdDot ) {\n\n\t\t\t\t\t\t\tvertices.push( v0.x, v0.y, v0.z );\n\t\t\t\t\t\t\tvertices.push( v1.x, v1.y, v1.z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tedgeData[ reverseHash ] = null;\n\n\t\t\t\t\t} else if ( ! ( hash in edgeData ) ) {\n\n\t\t\t\t\t\t// if we've already got an edge here then skip adding a new one\n\t\t\t\t\t\tedgeData[ hash ] = {\n\n\t\t\t\t\t\t\tindex0: indexArr[ j ],\n\t\t\t\t\t\t\tindex1: indexArr[ jNext ],\n\t\t\t\t\t\t\tnormal: _normal.clone(),\n\n\t\t\t\t\t\t};\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// iterate over all remaining, unmatched edges and add them to the vertex array\n\t\t\tfor ( const key in edgeData ) {\n\n\t\t\t\tif ( edgeData[ key ] ) {\n\n\t\t\t\t\tconst { index0, index1 } = edgeData[ key ];\n\t\t\t\t\t_v0.fromBufferAttribute( positionAttr, index0 );\n\t\t\t\t\t_v1$1.fromBufferAttribute( positionAttr, index1 );\n\n\t\t\t\t\tvertices.push( _v0.x, _v0.y, _v0.z );\n\t\t\t\t\tvertices.push( _v1$1.x, _v1$1.y, _v1$1.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t}\n\n\t}\n\n}\n\nclass Shape extends Path {\n\n\tconstructor( points ) {\n\n\t\tsuper( points );\n\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.type = 'Shape';\n\n\t\tthis.holes = [];\n\n\t}\n\n\tgetPointsHoles( divisions ) {\n\n\t\tconst holesPts = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tholesPts[ i ] = this.holes[ i ].getPoints( divisions );\n\n\t\t}\n\n\t\treturn holesPts;\n\n\t}\n\n\t// get points of shape and holes (keypoints based on segments parameter)\n\n\textractPoints( divisions ) {\n\n\t\treturn {\n\n\t\t\tshape: this.getPoints( divisions ),\n\t\t\tholes: this.getPointsHoles( divisions )\n\n\t\t};\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = source.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = source.holes[ i ];\n\n\t\t\tthis.holes.push( hole.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.holes = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = this.holes[ i ];\n\t\t\tdata.holes.push( hole.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.uuid = json.uuid;\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = json.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = json.holes[ i ];\n\t\t\tthis.holes.push( new Path().fromJSON( hole ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Port from https://github.com/mapbox/earcut (v2.2.4)\n */\n\nconst Earcut = {\n\n\ttriangulate: function ( data, holeIndices, dim = 2 ) {\n\n\t\tconst hasHoles = holeIndices && holeIndices.length;\n\t\tconst outerLen = hasHoles ? holeIndices[ 0 ] * dim : data.length;\n\t\tlet outerNode = linkedList( data, 0, outerLen, dim, true );\n\t\tconst triangles = [];\n\n\t\tif ( ! outerNode || outerNode.next === outerNode.prev ) return triangles;\n\n\t\tlet minX, minY, maxX, maxY, x, y, invSize;\n\n\t\tif ( hasHoles ) outerNode = eliminateHoles( data, holeIndices, outerNode, dim );\n\n\t\t// if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n\t\tif ( data.length > 80 * dim ) {\n\n\t\t\tminX = maxX = data[ 0 ];\n\t\t\tminY = maxY = data[ 1 ];\n\n\t\t\tfor ( let i = dim; i < outerLen; i += dim ) {\n\n\t\t\t\tx = data[ i ];\n\t\t\t\ty = data[ i + 1 ];\n\t\t\t\tif ( x < minX ) minX = x;\n\t\t\t\tif ( y < minY ) minY = y;\n\t\t\t\tif ( x > maxX ) maxX = x;\n\t\t\t\tif ( y > maxY ) maxY = y;\n\n\t\t\t}\n\n\t\t\t// minX, minY and invSize are later used to transform coords into integers for z-order calculation\n\t\t\tinvSize = Math.max( maxX - minX, maxY - minY );\n\t\t\tinvSize = invSize !== 0 ? 32767 / invSize : 0;\n\n\t\t}\n\n\t\tearcutLinked( outerNode, triangles, dim, minX, minY, invSize, 0 );\n\n\t\treturn triangles;\n\n\t}\n\n};\n\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList( data, start, end, dim, clockwise ) {\n\n\tlet i, last;\n\n\tif ( clockwise === ( signedArea( data, start, end, dim ) > 0 ) ) {\n\n\t\tfor ( i = start; i < end; i += dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last );\n\n\t} else {\n\n\t\tfor ( i = end - dim; i >= start; i -= dim ) last = insertNode( i, data[ i ], data[ i + 1 ], last );\n\n\t}\n\n\tif ( last && equals( last, last.next ) ) {\n\n\t\tremoveNode( last );\n\t\tlast = last.next;\n\n\t}\n\n\treturn last;\n\n}\n\n// eliminate colinear or duplicate points\nfunction filterPoints( start, end ) {\n\n\tif ( ! start ) return start;\n\tif ( ! end ) end = start;\n\n\tlet p = start,\n\t\tagain;\n\tdo {\n\n\t\tagain = false;\n\n\t\tif ( ! p.steiner && ( equals( p, p.next ) || area( p.prev, p, p.next ) === 0 ) ) {\n\n\t\t\tremoveNode( p );\n\t\t\tp = end = p.prev;\n\t\t\tif ( p === p.next ) break;\n\t\t\tagain = true;\n\n\t\t} else {\n\n\t\t\tp = p.next;\n\n\t\t}\n\n\t} while ( again || p !== end );\n\n\treturn end;\n\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked( ear, triangles, dim, minX, minY, invSize, pass ) {\n\n\tif ( ! ear ) return;\n\n\t// interlink polygon nodes in z-order\n\tif ( ! pass && invSize ) indexCurve( ear, minX, minY, invSize );\n\n\tlet stop = ear,\n\t\tprev, next;\n\n\t// iterate through ears, slicing them one by one\n\twhile ( ear.prev !== ear.next ) {\n\n\t\tprev = ear.prev;\n\t\tnext = ear.next;\n\n\t\tif ( invSize ? isEarHashed( ear, minX, minY, invSize ) : isEar( ear ) ) {\n\n\t\t\t// cut off the triangle\n\t\t\ttriangles.push( prev.i / dim | 0 );\n\t\t\ttriangles.push( ear.i / dim | 0 );\n\t\t\ttriangles.push( next.i / dim | 0 );\n\n\t\t\tremoveNode( ear );\n\n\t\t\t// skipping the next vertex leads to less sliver triangles\n\t\t\tear = next.next;\n\t\t\tstop = next.next;\n\n\t\t\tcontinue;\n\n\t\t}\n\n\t\tear = next;\n\n\t\t// if we looped through the whole remaining polygon and can't find any more ears\n\t\tif ( ear === stop ) {\n\n\t\t\t// try filtering points and slicing again\n\t\t\tif ( ! pass ) {\n\n\t\t\t\tearcutLinked( filterPoints( ear ), triangles, dim, minX, minY, invSize, 1 );\n\n\t\t\t\t// if this didn't work, try curing all small self-intersections locally\n\n\t\t\t} else if ( pass === 1 ) {\n\n\t\t\t\tear = cureLocalIntersections( filterPoints( ear ), triangles, dim );\n\t\t\t\tearcutLinked( ear, triangles, dim, minX, minY, invSize, 2 );\n\n\t\t\t\t// as a last resort, try splitting the remaining polygon into two\n\n\t\t\t} else if ( pass === 2 ) {\n\n\t\t\t\tsplitEarcut( ear, triangles, dim, minX, minY, invSize );\n\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar( ear ) {\n\n\tconst a = ear.prev,\n\t\tb = ear,\n\t\tc = ear.next;\n\n\tif ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear\n\n\t// now make sure we don't have other points inside the potential ear\n\tconst ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n\n\t// triangle bbox; min & max are calculated like this for speed\n\tconst x0 = ax < bx ? ( ax < cx ? ax : cx ) : ( bx < cx ? bx : cx ),\n\t\ty0 = ay < by ? ( ay < cy ? ay : cy ) : ( by < cy ? by : cy ),\n\t\tx1 = ax > bx ? ( ax > cx ? ax : cx ) : ( bx > cx ? bx : cx ),\n\t\ty1 = ay > by ? ( ay > cy ? ay : cy ) : ( by > cy ? by : cy );\n\n\tlet p = c.next;\n\twhile ( p !== a ) {\n\n\t\tif ( p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 &&\n\t\t\tpointInTriangle( ax, ay, bx, by, cx, cy, p.x, p.y ) &&\n\t\t\tarea( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.next;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction isEarHashed( ear, minX, minY, invSize ) {\n\n\tconst a = ear.prev,\n\t\tb = ear,\n\t\tc = ear.next;\n\n\tif ( area( a, b, c ) >= 0 ) return false; // reflex, can't be an ear\n\n\tconst ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n\n\t// triangle bbox; min & max are calculated like this for speed\n\tconst x0 = ax < bx ? ( ax < cx ? ax : cx ) : ( bx < cx ? bx : cx ),\n\t\ty0 = ay < by ? ( ay < cy ? ay : cy ) : ( by < cy ? by : cy ),\n\t\tx1 = ax > bx ? ( ax > cx ? ax : cx ) : ( bx > cx ? bx : cx ),\n\t\ty1 = ay > by ? ( ay > cy ? ay : cy ) : ( by > cy ? by : cy );\n\n\t// z-order range for the current triangle bbox;\n\tconst minZ = zOrder( x0, y0, minX, minY, invSize ),\n\t\tmaxZ = zOrder( x1, y1, minX, minY, invSize );\n\n\tlet p = ear.prevZ,\n\t\tn = ear.nextZ;\n\n\t// look for points inside the triangle in both directions\n\twhile ( p && p.z >= minZ && n && n.z <= maxZ ) {\n\n\t\tif ( p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\n\t\t\tpointInTriangle( ax, ay, bx, by, cx, cy, p.x, p.y ) && area( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.prevZ;\n\n\t\tif ( n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\n\t\t\tpointInTriangle( ax, ay, bx, by, cx, cy, n.x, n.y ) && area( n.prev, n, n.next ) >= 0 ) return false;\n\t\tn = n.nextZ;\n\n\t}\n\n\t// look for remaining points in decreasing z-order\n\twhile ( p && p.z >= minZ ) {\n\n\t\tif ( p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\n\t\t\tpointInTriangle( ax, ay, bx, by, cx, cy, p.x, p.y ) && area( p.prev, p, p.next ) >= 0 ) return false;\n\t\tp = p.prevZ;\n\n\t}\n\n\t// look for remaining points in increasing z-order\n\twhile ( n && n.z <= maxZ ) {\n\n\t\tif ( n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\n\t\t\tpointInTriangle( ax, ay, bx, by, cx, cy, n.x, n.y ) && area( n.prev, n, n.next ) >= 0 ) return false;\n\t\tn = n.nextZ;\n\n\t}\n\n\treturn true;\n\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections( start, triangles, dim ) {\n\n\tlet p = start;\n\tdo {\n\n\t\tconst a = p.prev,\n\t\t\tb = p.next.next;\n\n\t\tif ( ! equals( a, b ) && intersects( a, p, p.next, b ) && locallyInside( a, b ) && locallyInside( b, a ) ) {\n\n\t\t\ttriangles.push( a.i / dim | 0 );\n\t\t\ttriangles.push( p.i / dim | 0 );\n\t\t\ttriangles.push( b.i / dim | 0 );\n\n\t\t\t// remove two nodes involved\n\t\t\tremoveNode( p );\n\t\t\tremoveNode( p.next );\n\n\t\t\tp = start = b;\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\treturn filterPoints( p );\n\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut( start, triangles, dim, minX, minY, invSize ) {\n\n\t// look for a valid diagonal that divides the polygon into two\n\tlet a = start;\n\tdo {\n\n\t\tlet b = a.next.next;\n\t\twhile ( b !== a.prev ) {\n\n\t\t\tif ( a.i !== b.i && isValidDiagonal( a, b ) ) {\n\n\t\t\t\t// split the polygon in two by the diagonal\n\t\t\t\tlet c = splitPolygon( a, b );\n\n\t\t\t\t// filter colinear points around the cuts\n\t\t\t\ta = filterPoints( a, a.next );\n\t\t\t\tc = filterPoints( c, c.next );\n\n\t\t\t\t// run earcut on each half\n\t\t\t\tearcutLinked( a, triangles, dim, minX, minY, invSize, 0 );\n\t\t\t\tearcutLinked( c, triangles, dim, minX, minY, invSize, 0 );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tb = b.next;\n\n\t\t}\n\n\t\ta = a.next;\n\n\t} while ( a !== start );\n\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles( data, holeIndices, outerNode, dim ) {\n\n\tconst queue = [];\n\tlet i, len, start, end, list;\n\n\tfor ( i = 0, len = holeIndices.length; i < len; i ++ ) {\n\n\t\tstart = holeIndices[ i ] * dim;\n\t\tend = i < len - 1 ? holeIndices[ i + 1 ] * dim : data.length;\n\t\tlist = linkedList( data, start, end, dim, false );\n\t\tif ( list === list.next ) list.steiner = true;\n\t\tqueue.push( getLeftmost( list ) );\n\n\t}\n\n\tqueue.sort( compareX );\n\n\t// process holes from left to right\n\tfor ( i = 0; i < queue.length; i ++ ) {\n\n\t\touterNode = eliminateHole( queue[ i ], outerNode );\n\n\t}\n\n\treturn outerNode;\n\n}\n\nfunction compareX( a, b ) {\n\n\treturn a.x - b.x;\n\n}\n\n// find a bridge between vertices that connects hole with an outer ring and link it\nfunction eliminateHole( hole, outerNode ) {\n\n\tconst bridge = findHoleBridge( hole, outerNode );\n\tif ( ! bridge ) {\n\n\t\treturn outerNode;\n\n\t}\n\n\tconst bridgeReverse = splitPolygon( bridge, hole );\n\n\t// filter collinear points around the cuts\n\tfilterPoints( bridgeReverse, bridgeReverse.next );\n\treturn filterPoints( bridge, bridge.next );\n\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge( hole, outerNode ) {\n\n\tlet p = outerNode,\n\t\tqx = - Infinity,\n\t\tm;\n\n\tconst hx = hole.x, hy = hole.y;\n\n\t// find a segment intersected by a ray from the hole's leftmost point to the left;\n\t// segment's endpoint with lesser x will be potential connection point\n\tdo {\n\n\t\tif ( hy <= p.y && hy >= p.next.y && p.next.y !== p.y ) {\n\n\t\t\tconst x = p.x + ( hy - p.y ) * ( p.next.x - p.x ) / ( p.next.y - p.y );\n\t\t\tif ( x <= hx && x > qx ) {\n\n\t\t\t\tqx = x;\n\t\t\t\tm = p.x < p.next.x ? p : p.next;\n\t\t\t\tif ( x === hx ) return m; // hole touches outer segment; pick leftmost endpoint\n\n\t\t\t}\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== outerNode );\n\n\tif ( ! m ) return null;\n\n\t// look for points inside the triangle of hole point, segment intersection and endpoint;\n\t// if there are no points found, we have a valid connection;\n\t// otherwise choose the point of the minimum angle with the ray as connection point\n\n\tconst stop = m,\n\t\tmx = m.x,\n\t\tmy = m.y;\n\tlet tanMin = Infinity, tan;\n\n\tp = m;\n\n\tdo {\n\n\t\tif ( hx >= p.x && p.x >= mx && hx !== p.x &&\n\t\t\t\tpointInTriangle( hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y ) ) {\n\n\t\t\ttan = Math.abs( hy - p.y ) / ( hx - p.x ); // tangential\n\n\t\t\tif ( locallyInside( p, hole ) && ( tan < tanMin || ( tan === tanMin && ( p.x > m.x || ( p.x === m.x && sectorContainsSector( m, p ) ) ) ) ) ) {\n\n\t\t\t\tm = p;\n\t\t\t\ttanMin = tan;\n\n\t\t\t}\n\n\t\t}\n\n\t\tp = p.next;\n\n\t} while ( p !== stop );\n\n\treturn m;\n\n}\n\n// whether sector in vertex m contains sector in vertex p in the same coordinates\nfunction sectorContainsSector( m, p ) {\n\n\treturn area( m.prev, m, p.prev ) < 0 && area( p.next, m, m.next ) < 0;\n\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve( start, minX, minY, invSize ) {\n\n\tlet p = start;\n\tdo {\n\n\t\tif ( p.z === 0 ) p.z = zOrder( p.x, p.y, minX, minY, invSize );\n\t\tp.prevZ = p.prev;\n\t\tp.nextZ = p.next;\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\tp.prevZ.nextZ = null;\n\tp.prevZ = null;\n\n\tsortLinked( p );\n\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked( list ) {\n\n\tlet i, p, q, e, tail, numMerges, pSize, qSize,\n\t\tinSize = 1;\n\n\tdo {\n\n\t\tp = list;\n\t\tlist = null;\n\t\ttail = null;\n\t\tnumMerges = 0;\n\n\t\twhile ( p ) {\n\n\t\t\tnumMerges ++;\n\t\t\tq = p;\n\t\t\tpSize = 0;\n\t\t\tfor ( i = 0; i < inSize; i ++ ) {\n\n\t\t\t\tpSize ++;\n\t\t\t\tq = q.nextZ;\n\t\t\t\tif ( ! q ) break;\n\n\t\t\t}\n\n\t\t\tqSize = inSize;\n\n\t\t\twhile ( pSize > 0 || ( qSize > 0 && q ) ) {\n\n\t\t\t\tif ( pSize !== 0 && ( qSize === 0 || ! q || p.z <= q.z ) ) {\n\n\t\t\t\t\te = p;\n\t\t\t\t\tp = p.nextZ;\n\t\t\t\t\tpSize --;\n\n\t\t\t\t} else {\n\n\t\t\t\t\te = q;\n\t\t\t\t\tq = q.nextZ;\n\t\t\t\t\tqSize --;\n\n\t\t\t\t}\n\n\t\t\t\tif ( tail ) tail.nextZ = e;\n\t\t\t\telse list = e;\n\n\t\t\t\te.prevZ = tail;\n\t\t\t\ttail = e;\n\n\t\t\t}\n\n\t\t\tp = q;\n\n\t\t}\n\n\t\ttail.nextZ = null;\n\t\tinSize *= 2;\n\n\t} while ( numMerges > 1 );\n\n\treturn list;\n\n}\n\n// z-order of a point given coords and inverse of the longer side of data bbox\nfunction zOrder( x, y, minX, minY, invSize ) {\n\n\t// coords are transformed into non-negative 15-bit integer range\n\tx = ( x - minX ) * invSize | 0;\n\ty = ( y - minY ) * invSize | 0;\n\n\tx = ( x | ( x << 8 ) ) & 0x00FF00FF;\n\tx = ( x | ( x << 4 ) ) & 0x0F0F0F0F;\n\tx = ( x | ( x << 2 ) ) & 0x33333333;\n\tx = ( x | ( x << 1 ) ) & 0x55555555;\n\n\ty = ( y | ( y << 8 ) ) & 0x00FF00FF;\n\ty = ( y | ( y << 4 ) ) & 0x0F0F0F0F;\n\ty = ( y | ( y << 2 ) ) & 0x33333333;\n\ty = ( y | ( y << 1 ) ) & 0x55555555;\n\n\treturn x | ( y << 1 );\n\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost( start ) {\n\n\tlet p = start,\n\t\tleftmost = start;\n\tdo {\n\n\t\tif ( p.x < leftmost.x || ( p.x === leftmost.x && p.y < leftmost.y ) ) leftmost = p;\n\t\tp = p.next;\n\n\t} while ( p !== start );\n\n\treturn leftmost;\n\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle( ax, ay, bx, by, cx, cy, px, py ) {\n\n\treturn ( cx - px ) * ( ay - py ) >= ( ax - px ) * ( cy - py ) &&\n ( ax - px ) * ( by - py ) >= ( bx - px ) * ( ay - py ) &&\n ( bx - px ) * ( cy - py ) >= ( cx - px ) * ( by - py );\n\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal( a, b ) {\n\n\treturn a.next.i !== b.i && a.prev.i !== b.i && ! intersectsPolygon( a, b ) && // dones't intersect other edges\n ( locallyInside( a, b ) && locallyInside( b, a ) && middleInside( a, b ) && // locally visible\n ( area( a.prev, a, b.prev ) || area( a, b.prev, b ) ) || // does not create opposite-facing sectors\n equals( a, b ) && area( a.prev, a, a.next ) > 0 && area( b.prev, b, b.next ) > 0 ); // special zero-length case\n\n}\n\n// signed area of a triangle\nfunction area( p, q, r ) {\n\n\treturn ( q.y - p.y ) * ( r.x - q.x ) - ( q.x - p.x ) * ( r.y - q.y );\n\n}\n\n// check if two points are equal\nfunction equals( p1, p2 ) {\n\n\treturn p1.x === p2.x && p1.y === p2.y;\n\n}\n\n// check if two segments intersect\nfunction intersects( p1, q1, p2, q2 ) {\n\n\tconst o1 = sign( area( p1, q1, p2 ) );\n\tconst o2 = sign( area( p1, q1, q2 ) );\n\tconst o3 = sign( area( p2, q2, p1 ) );\n\tconst o4 = sign( area( p2, q2, q1 ) );\n\n\tif ( o1 !== o2 && o3 !== o4 ) return true; // general case\n\n\tif ( o1 === 0 && onSegment( p1, p2, q1 ) ) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1\n\tif ( o2 === 0 && onSegment( p1, q2, q1 ) ) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1\n\tif ( o3 === 0 && onSegment( p2, p1, q2 ) ) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2\n\tif ( o4 === 0 && onSegment( p2, q1, q2 ) ) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2\n\n\treturn false;\n\n}\n\n// for collinear points p, q, r, check if point q lies on segment pr\nfunction onSegment( p, q, r ) {\n\n\treturn q.x <= Math.max( p.x, r.x ) && q.x >= Math.min( p.x, r.x ) && q.y <= Math.max( p.y, r.y ) && q.y >= Math.min( p.y, r.y );\n\n}\n\nfunction sign( num ) {\n\n\treturn num > 0 ? 1 : num < 0 ? - 1 : 0;\n\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon( a, b ) {\n\n\tlet p = a;\n\tdo {\n\n\t\tif ( p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n\t\t\tintersects( p, p.next, a, b ) ) return true;\n\t\tp = p.next;\n\n\t} while ( p !== a );\n\n\treturn false;\n\n}\n\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside( a, b ) {\n\n\treturn area( a.prev, a, a.next ) < 0 ?\n\t\tarea( a, b, a.next ) >= 0 && area( a, a.prev, b ) >= 0 :\n\t\tarea( a, b, a.prev ) < 0 || area( a, a.next, b ) < 0;\n\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside( a, b ) {\n\n\tlet p = a,\n\t\tinside = false;\n\tconst px = ( a.x + b.x ) / 2,\n\t\tpy = ( a.y + b.y ) / 2;\n\tdo {\n\n\t\tif ( ( ( p.y > py ) !== ( p.next.y > py ) ) && p.next.y !== p.y &&\n\t\t\t( px < ( p.next.x - p.x ) * ( py - p.y ) / ( p.next.y - p.y ) + p.x ) )\n\t\t\tinside = ! inside;\n\t\tp = p.next;\n\n\t} while ( p !== a );\n\n\treturn inside;\n\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon( a, b ) {\n\n\tconst a2 = new Node( a.i, a.x, a.y ),\n\t\tb2 = new Node( b.i, b.x, b.y ),\n\t\tan = a.next,\n\t\tbp = b.prev;\n\n\ta.next = b;\n\tb.prev = a;\n\n\ta2.next = an;\n\tan.prev = a2;\n\n\tb2.next = a2;\n\ta2.prev = b2;\n\n\tbp.next = b2;\n\tb2.prev = bp;\n\n\treturn b2;\n\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode( i, x, y, last ) {\n\n\tconst p = new Node( i, x, y );\n\n\tif ( ! last ) {\n\n\t\tp.prev = p;\n\t\tp.next = p;\n\n\t} else {\n\n\t\tp.next = last.next;\n\t\tp.prev = last;\n\t\tlast.next.prev = p;\n\t\tlast.next = p;\n\n\t}\n\n\treturn p;\n\n}\n\nfunction removeNode( p ) {\n\n\tp.next.prev = p.prev;\n\tp.prev.next = p.next;\n\n\tif ( p.prevZ ) p.prevZ.nextZ = p.nextZ;\n\tif ( p.nextZ ) p.nextZ.prevZ = p.prevZ;\n\n}\n\nfunction Node( i, x, y ) {\n\n\t// vertex index in coordinates array\n\tthis.i = i;\n\n\t// vertex coordinates\n\tthis.x = x;\n\tthis.y = y;\n\n\t// previous and next vertex nodes in a polygon ring\n\tthis.prev = null;\n\tthis.next = null;\n\n\t// z-order curve value\n\tthis.z = 0;\n\n\t// previous and next nodes in z-order\n\tthis.prevZ = null;\n\tthis.nextZ = null;\n\n\t// indicates whether this is a steiner point\n\tthis.steiner = false;\n\n}\n\nfunction signedArea( data, start, end, dim ) {\n\n\tlet sum = 0;\n\tfor ( let i = start, j = end - dim; i < end; i += dim ) {\n\n\t\tsum += ( data[ j ] - data[ i ] ) * ( data[ i + 1 ] + data[ j + 1 ] );\n\t\tj = i;\n\n\t}\n\n\treturn sum;\n\n}\n\nclass ShapeUtils {\n\n\t// calculate area of the contour polygon\n\n\tstatic area( contour ) {\n\n\t\tconst n = contour.length;\n\t\tlet a = 0.0;\n\n\t\tfor ( let p = n - 1, q = 0; q < n; p = q ++ ) {\n\n\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\n\n\t\t}\n\n\t\treturn a * 0.5;\n\n\t}\n\n\tstatic isClockWise( pts ) {\n\n\t\treturn ShapeUtils.area( pts ) < 0;\n\n\t}\n\n\tstatic triangulateShape( contour, holes ) {\n\n\t\tconst vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ]\n\t\tconst holeIndices = []; // array of hole indices\n\t\tconst faces = []; // final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ]\n\n\t\tremoveDupEndPts( contour );\n\t\taddContour( vertices, contour );\n\n\t\t//\n\n\t\tlet holeIndex = contour.length;\n\n\t\tholes.forEach( removeDupEndPts );\n\n\t\tfor ( let i = 0; i < holes.length; i ++ ) {\n\n\t\t\tholeIndices.push( holeIndex );\n\t\t\tholeIndex += holes[ i ].length;\n\t\t\taddContour( vertices, holes[ i ] );\n\n\t\t}\n\n\t\t//\n\n\t\tconst triangles = Earcut.triangulate( vertices, holeIndices );\n\n\t\t//\n\n\t\tfor ( let i = 0; i < triangles.length; i += 3 ) {\n\n\t\t\tfaces.push( triangles.slice( i, i + 3 ) );\n\n\t\t}\n\n\t\treturn faces;\n\n\t}\n\n}\n\nfunction removeDupEndPts( points ) {\n\n\tconst l = points.length;\n\n\tif ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {\n\n\t\tpoints.pop();\n\n\t}\n\n}\n\nfunction addContour( vertices, contour ) {\n\n\tfor ( let i = 0; i < contour.length; i ++ ) {\n\n\t\tvertices.push( contour[ i ].x );\n\t\tvertices.push( contour[ i ].y );\n\n\t}\n\n}\n\n/**\n * Creates extruded geometry from a path shape.\n *\n * parameters = {\n *\n * curveSegments: <int>, // number of points on the curves\n * steps: <int>, // number of points for z-side extrusions / used for subdividing segments of extrude spline too\n * depth: <float>, // Depth to extrude the shape\n *\n * bevelEnabled: <bool>, // turn on bevel\n * bevelThickness: <float>, // how deep into the original shape bevel goes\n * bevelSize: <float>, // how far from shape outline (including bevelOffset) is bevel\n * bevelOffset: <float>, // how far from shape outline does bevel start\n * bevelSegments: <int>, // number of bevel layers\n *\n * extrudePath: <THREE.Curve> // curve to extrude shape along\n *\n * UVGenerator: <Object> // object that provides UV generator functions\n *\n * }\n */\n\nclass ExtrudeGeometry extends BufferGeometry {\n\n\tconstructor( shapes = new Shape( [ new Vector2( 0.5, 0.5 ), new Vector2( - 0.5, 0.5 ), new Vector2( - 0.5, - 0.5 ), new Vector2( 0.5, - 0.5 ) ] ), options = {} ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ExtrudeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\toptions: options\n\t\t};\n\n\t\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\n\n\t\tconst scope = this;\n\n\t\tconst verticesArray = [];\n\t\tconst uvArray = [];\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\t\t\taddShape( shape );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvArray, 2 ) );\n\n\t\tthis.computeVertexNormals();\n\n\t\t// functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tconst placeholder = [];\n\n\t\t\t// options\n\n\t\t\tconst curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\t\t\tconst steps = options.steps !== undefined ? options.steps : 1;\n\t\t\tconst depth = options.depth !== undefined ? options.depth : 1;\n\n\t\t\tlet bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true;\n\t\t\tlet bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 0.2;\n\t\t\tlet bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 0.1;\n\t\t\tlet bevelOffset = options.bevelOffset !== undefined ? options.bevelOffset : 0;\n\t\t\tlet bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\n\n\t\t\tconst extrudePath = options.extrudePath;\n\n\t\t\tconst uvgen = options.UVGenerator !== undefined ? options.UVGenerator : WorldUVGenerator;\n\n\t\t\t//\n\n\t\t\tlet extrudePts, extrudeByPath = false;\n\t\t\tlet splineTube, binormal, normal, position2;\n\n\t\t\tif ( extrudePath ) {\n\n\t\t\t\textrudePts = extrudePath.getSpacedPoints( steps );\n\n\t\t\t\textrudeByPath = true;\n\t\t\t\tbevelEnabled = false; // bevels not supported for path extrusion\n\n\t\t\t\t// SETUP TNB variables\n\n\t\t\t\t// TODO1 - have a .isClosed in spline?\n\n\t\t\t\tsplineTube = extrudePath.computeFrenetFrames( steps, false );\n\n\t\t\t\t// console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\n\n\t\t\t\tbinormal = new Vector3();\n\t\t\t\tnormal = new Vector3();\n\t\t\t\tposition2 = new Vector3();\n\n\t\t\t}\n\n\t\t\t// Safeguards if bevels are not enabled\n\n\t\t\tif ( ! bevelEnabled ) {\n\n\t\t\t\tbevelSegments = 0;\n\t\t\t\tbevelThickness = 0;\n\t\t\t\tbevelSize = 0;\n\t\t\t\tbevelOffset = 0;\n\n\t\t\t}\n\n\t\t\t// Variables initialization\n\n\t\t\tconst shapePoints = shape.extractPoints( curveSegments );\n\n\t\t\tlet vertices = shapePoints.shape;\n\t\t\tconst holes = shapePoints.holes;\n\n\t\t\tconst reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\t\tif ( reverse ) {\n\n\t\t\t\tvertices = vertices.reverse();\n\n\t\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\t\tif ( ShapeUtils.isClockWise( ahole ) ) {\n\n\t\t\t\t\t\tholes[ h ] = ahole.reverse();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tconst faces = ShapeUtils.triangulateShape( vertices, holes );\n\n\t\t\t/* Vertices */\n\n\t\t\tconst contour = vertices; // vertices has all points but contour has only points of circumference\n\n\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\tvertices = vertices.concat( ahole );\n\n\t\t\t}\n\n\n\t\t\tfunction scalePt2( pt, vec, size ) {\n\n\t\t\t\tif ( ! vec ) console.error( 'THREE.ExtrudeGeometry: vec does not exist' );\n\n\t\t\t\treturn vec.clone().multiplyScalar( size ).add( pt );\n\n\t\t\t}\n\n\t\t\tconst vlen = vertices.length, flen = faces.length;\n\n\n\t\t\t// Find directions for point movement\n\n\n\t\t\tfunction getBevelVec( inPt, inPrev, inNext ) {\n\n\t\t\t\t// computes for inPt the corresponding point inPt' on a new contour\n\t\t\t\t// shifted by 1 unit (length of normalized vector) to the left\n\t\t\t\t// if we walk along contour clockwise, this new contour is outside the old one\n\t\t\t\t//\n\t\t\t\t// inPt' is the intersection of the two lines parallel to the two\n\t\t\t\t// adjacent edges of inPt at a distance of 1 unit on the left side.\n\n\t\t\t\tlet v_trans_x, v_trans_y, shrink_by; // resulting translation vector for inPt\n\n\t\t\t\t// good reading for geometry algorithms (here: line-line intersection)\n\t\t\t\t// http://geomalgorithms.com/a05-_intersect-1.html\n\n\t\t\t\tconst v_prev_x = inPt.x - inPrev.x,\n\t\t\t\t\tv_prev_y = inPt.y - inPrev.y;\n\t\t\t\tconst v_next_x = inNext.x - inPt.x,\n\t\t\t\t\tv_next_y = inNext.y - inPt.y;\n\n\t\t\t\tconst v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\n\n\t\t\t\t// check for collinear edges\n\t\t\t\tconst collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not collinear\n\n\t\t\t\t\t// length of vectors for normalizing\n\n\t\t\t\t\tconst v_prev_len = Math.sqrt( v_prev_lensq );\n\t\t\t\t\tconst v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\n\n\t\t\t\t\t// shift adjacent points by unit vectors to the left\n\n\t\t\t\t\tconst ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\n\t\t\t\t\tconst ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\n\n\t\t\t\t\tconst ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\n\t\t\t\t\tconst ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\n\n\t\t\t\t\t// scaling factor for v_prev to intersection point\n\n\t\t\t\t\tconst sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -\n\t\t\t\t\t\t\t( ptNextShift_y - ptPrevShift_y ) * v_next_x ) /\n\t\t\t\t\t\t( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\t\t// vector from inPt to intersection point\n\n\t\t\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\n\t\t\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\n\n\t\t\t\t\t// Don't normalize!, otherwise sharp corners become ugly\n\t\t\t\t\t// but prevent crazy spikes\n\t\t\t\t\tconst v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\n\t\t\t\t\tif ( v_trans_lensq <= 2 ) {\n\n\t\t\t\t\t\treturn new Vector2( v_trans_x, v_trans_y );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// handle special case of collinear edges\n\n\t\t\t\t\tlet direction_eq = false; // assumes: opposite\n\n\t\t\t\t\tif ( v_prev_x > Number.EPSILON ) {\n\n\t\t\t\t\t\tif ( v_next_x > Number.EPSILON ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( v_prev_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\n\n\t\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( direction_eq ) {\n\n\t\t\t\t\t\t// console.log(\"Warning: lines are a straight sequence\");\n\t\t\t\t\t\tv_trans_x = - v_prev_y;\n\t\t\t\t\t\tv_trans_y = v_prev_x;\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// console.log(\"Warning: lines are a straight spike\");\n\t\t\t\t\t\tv_trans_x = v_prev_x;\n\t\t\t\t\t\tv_trans_y = v_prev_y;\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\n\n\t\t\t}\n\n\n\t\t\tconst contourMovements = [];\n\n\t\t\tfor ( let i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t// (j)---(i)---(k)\n\t\t\t\t// console.log('i,j,k', i, j , k)\n\n\t\t\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\n\n\t\t\t}\n\n\t\t\tconst holesMovements = [];\n\t\t\tlet oneHoleMovements, verticesMovements = contourMovements.concat();\n\n\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\toneHoleMovements = [];\n\n\t\t\t\tfor ( let i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t\t// (j)---(i)---(k)\n\t\t\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\n\n\t\t\t\t}\n\n\t\t\t\tholesMovements.push( oneHoleMovements );\n\t\t\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\n\n\t\t\t}\n\n\n\t\t\t// Loop bevelSegments, 1 for the front, 1 for the back\n\n\t\t\tfor ( let b = 0; b < bevelSegments; b ++ ) {\n\n\t\t\t\t//for ( b = bevelSegments; b > 0; b -- ) {\n\n\t\t\t\tconst t = b / bevelSegments;\n\t\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t\t// contract shape\n\n\t\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\n\t\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t\t}\n\n\t\t\t\t// expand holes\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\t\tv( vert.x, vert.y, - z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst bs = bevelSize + bevelOffset;\n\n\t\t\t// Back facing vertices\n\n\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\tconst vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\tv( vert.x, vert.y, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\n\n\t\t\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\n\t\t\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\tposition2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );\n\n\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Add stepped vertices...\n\t\t\t// Including front facing vertices\n\n\t\t\tfor ( let s = 1; s <= steps; s ++ ) {\n\n\t\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\t\tconst vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\tv( vert.x, vert.y, depth / steps * s );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\n\n\t\t\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\n\t\t\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\n\n\t\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\t// Add bevel segments planes\n\n\t\t\t//for ( b = 1; b <= bevelSegments; b ++ ) {\n\t\t\tfor ( let b = bevelSegments - 1; b >= 0; b -- ) {\n\n\t\t\t\tconst t = b / bevelSegments;\n\t\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t\t// contract shape\n\n\t\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t}\n\n\t\t\t\t// expand holes\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tv( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t/* Faces */\n\n\t\t\t// Top and bottom faces\n\n\t\t\tbuildLidFaces();\n\n\t\t\t// Sides faces\n\n\t\t\tbuildSideFaces();\n\n\n\t\t\t///// Internal functions\n\n\t\t\tfunction buildLidFaces() {\n\n\t\t\t\tconst start = verticesArray.length / 3;\n\n\t\t\t\tif ( bevelEnabled ) {\n\n\t\t\t\t\tlet layer = 0; // steps + 1\n\t\t\t\t\tlet offset = vlen * layer;\n\n\t\t\t\t\t// Bottom faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlayer = steps + bevelSegments * 2;\n\t\t\t\t\toffset = vlen * layer;\n\n\t\t\t\t\t// Top faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Bottom faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Top faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 0 );\n\n\t\t\t}\n\n\t\t\t// Create faces for the z-sides of the shape\n\n\t\t\tfunction buildSideFaces() {\n\n\t\t\t\tconst start = verticesArray.length / 3;\n\t\t\t\tlet layeroffset = 0;\n\t\t\t\tsidewalls( contour, layeroffset );\n\t\t\t\tlayeroffset += contour.length;\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\tsidewalls( ahole, layeroffset );\n\n\t\t\t\t\t//, true\n\t\t\t\t\tlayeroffset += ahole.length;\n\n\t\t\t\t}\n\n\n\t\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 1 );\n\n\n\t\t\t}\n\n\t\t\tfunction sidewalls( contour, layeroffset ) {\n\n\t\t\t\tlet i = contour.length;\n\n\t\t\t\twhile ( -- i >= 0 ) {\n\n\t\t\t\t\tconst j = i;\n\t\t\t\t\tlet k = i - 1;\n\t\t\t\t\tif ( k < 0 ) k = contour.length - 1;\n\n\t\t\t\t\t//console.log('b', i,j, i-1, k,vertices.length);\n\n\t\t\t\t\tfor ( let s = 0, sl = ( steps + bevelSegments * 2 ); s < sl; s ++ ) {\n\n\t\t\t\t\t\tconst slen1 = vlen * s;\n\t\t\t\t\t\tconst slen2 = vlen * ( s + 1 );\n\n\t\t\t\t\t\tconst a = layeroffset + j + slen1,\n\t\t\t\t\t\t\tb = layeroffset + k + slen1,\n\t\t\t\t\t\t\tc = layeroffset + k + slen2,\n\t\t\t\t\t\t\td = layeroffset + j + slen2;\n\n\t\t\t\t\t\tf4( a, b, c, d );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction v( x, y, z ) {\n\n\t\t\t\tplaceholder.push( x );\n\t\t\t\tplaceholder.push( y );\n\t\t\t\tplaceholder.push( z );\n\n\t\t\t}\n\n\n\t\t\tfunction f3( a, b, c ) {\n\n\t\t\t\taddVertex( a );\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( c );\n\n\t\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\t\tconst uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\t\taddUV( uvs[ 0 ] );\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 2 ] );\n\n\t\t\t}\n\n\t\t\tfunction f4( a, b, c, d ) {\n\n\t\t\t\taddVertex( a );\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( d );\n\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( c );\n\t\t\t\taddVertex( d );\n\n\n\t\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\t\tconst uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\t\taddUV( uvs[ 0 ] );\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 2 ] );\n\t\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\t}\n\n\t\t\tfunction addVertex( index ) {\n\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 0 ] );\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 1 ] );\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 2 ] );\n\n\t\t\t}\n\n\n\t\t\tfunction addUV( vector2 ) {\n\n\t\t\t\tuvArray.push( vector2.x );\n\t\t\t\tuvArray.push( vector2.y );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tconst shapes = this.parameters.shapes;\n\t\tconst options = this.parameters.options;\n\n\t\treturn toJSON$1( shapes, options, data );\n\n\t}\n\n\tstatic fromJSON( data, shapes ) {\n\n\t\tconst geometryShapes = [];\n\n\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\tgeometryShapes.push( shape );\n\n\t\t}\n\n\t\tconst extrudePath = data.options.extrudePath;\n\n\t\tif ( extrudePath !== undefined ) {\n\n\t\t\tdata.options.extrudePath = new Curves[ extrudePath.type ]().fromJSON( extrudePath );\n\n\t\t}\n\n\t\treturn new ExtrudeGeometry( geometryShapes, data.options );\n\n\t}\n\n}\n\nconst WorldUVGenerator = {\n\n\tgenerateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\n\t\treturn [\n\t\t\tnew Vector2( a_x, a_y ),\n\t\t\tnew Vector2( b_x, b_y ),\n\t\t\tnew Vector2( c_x, c_y )\n\t\t];\n\n\t},\n\n\tgenerateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst a_z = vertices[ indexA * 3 + 2 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst b_z = vertices[ indexB * 3 + 2 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\t\tconst c_z = vertices[ indexC * 3 + 2 ];\n\t\tconst d_x = vertices[ indexD * 3 ];\n\t\tconst d_y = vertices[ indexD * 3 + 1 ];\n\t\tconst d_z = vertices[ indexD * 3 + 2 ];\n\n\t\tif ( Math.abs( a_y - b_y ) < Math.abs( a_x - b_x ) ) {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_x, 1 - a_z ),\n\t\t\t\tnew Vector2( b_x, 1 - b_z ),\n\t\t\t\tnew Vector2( c_x, 1 - c_z ),\n\t\t\t\tnew Vector2( d_x, 1 - d_z )\n\t\t\t];\n\n\t\t} else {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_y, 1 - a_z ),\n\t\t\t\tnew Vector2( b_y, 1 - b_z ),\n\t\t\t\tnew Vector2( c_y, 1 - c_z ),\n\t\t\t\tnew Vector2( d_y, 1 - d_z )\n\t\t\t];\n\n\t\t}\n\n\t}\n\n};\n\nfunction toJSON$1( shapes, options, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\tdata.options = Object.assign( {}, options );\n\n\tif ( options.extrudePath !== undefined ) data.options.extrudePath = options.extrudePath.toJSON();\n\n\treturn data;\n\n}\n\nclass IcosahedronGeometry extends PolyhedronGeometry {\n\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\n\t\tconst vertices = [\n\t\t\t- 1, t, 0, \t1, t, 0, \t- 1, - t, 0, \t1, - t, 0,\n\t\t\t0, - 1, t, \t0, 1, t,\t0, - 1, - t, \t0, 1, - t,\n\t\t\tt, 0, - 1, \tt, 0, 1, \t- t, 0, - 1, \t- t, 0, 1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 11, 5, \t0, 5, 1, \t0, 1, 7, \t0, 7, 10, \t0, 10, 11,\n\t\t\t1, 5, 9, \t5, 11, 4,\t11, 10, 2,\t10, 7, 6,\t7, 1, 8,\n\t\t\t3, 9, 4, \t3, 4, 2,\t3, 2, 6,\t3, 6, 8,\t3, 8, 9,\n\t\t\t4, 9, 5, \t2, 4, 11,\t6, 2, 10,\t8, 6, 7,\t9, 8, 1\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'IcosahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new IcosahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nclass OctahedronGeometry extends PolyhedronGeometry {\n\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst vertices = [\n\t\t\t1, 0, 0, \t- 1, 0, 0,\t0, 1, 0,\n\t\t\t0, - 1, 0, \t0, 0, 1,\t0, 0, - 1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 2, 4,\t0, 4, 3,\t0, 3, 5,\n\t\t\t0, 5, 2,\t1, 2, 5,\t1, 5, 3,\n\t\t\t1, 3, 4,\t1, 4, 2\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'OctahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new OctahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nclass RingGeometry extends BufferGeometry {\n\n\tconstructor( innerRadius = 0.5, outerRadius = 1, thetaSegments = 32, phiSegments = 1, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'RingGeometry';\n\n\t\tthis.parameters = {\n\t\t\tinnerRadius: innerRadius,\n\t\t\touterRadius: outerRadius,\n\t\t\tthetaSegments: thetaSegments,\n\t\t\tphiSegments: phiSegments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthetaSegments = Math.max( 3, thetaSegments );\n\t\tphiSegments = Math.max( 1, phiSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// some helper variables\n\n\t\tlet radius = innerRadius;\n\t\tconst radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let j = 0; j <= phiSegments; j ++ ) {\n\n\t\t\tfor ( let i = 0; i <= thetaSegments; i ++ ) {\n\n\t\t\t\t// values are generate from the inside of the ring to the outside\n\n\t\t\t\tconst segment = thetaStart + i / thetaSegments * thetaLength;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\n\t\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t}\n\n\t\t\t// increase the radius for next row of vertices\n\n\t\t\tradius += radiusStep;\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let j = 0; j < phiSegments; j ++ ) {\n\n\t\t\tconst thetaSegmentLevel = j * ( thetaSegments + 1 );\n\n\t\t\tfor ( let i = 0; i < thetaSegments; i ++ ) {\n\n\t\t\t\tconst segment = i + thetaSegmentLevel;\n\n\t\t\t\tconst a = segment;\n\t\t\t\tconst b = segment + thetaSegments + 1;\n\t\t\t\tconst c = segment + thetaSegments + 2;\n\t\t\t\tconst d = segment + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new RingGeometry( data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nclass ShapeGeometry extends BufferGeometry {\n\n\tconstructor( shapes = new Shape( [ new Vector2( 0, 0.5 ), new Vector2( - 0.5, - 0.5 ), new Vector2( 0.5, - 0.5 ) ] ), curveSegments = 12 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ShapeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\tcurveSegments: curveSegments\n\t\t};\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet groupStart = 0;\n\t\tlet groupCount = 0;\n\n\t\t// allow single and array values for \"shapes\" parameter\n\n\t\tif ( Array.isArray( shapes ) === false ) {\n\n\t\t\taddShape( shapes );\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0; i < shapes.length; i ++ ) {\n\n\t\t\t\taddShape( shapes[ i ] );\n\n\t\t\t\tthis.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support\n\n\t\t\t\tgroupStart += groupCount;\n\t\t\t\tgroupCount = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\n\t\t// helper functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tconst indexOffset = vertices.length / 3;\n\t\t\tconst points = shape.extractPoints( curveSegments );\n\n\t\t\tlet shapeVertices = points.shape;\n\t\t\tconst shapeHoles = points.holes;\n\n\t\t\t// check direction of vertices\n\n\t\t\tif ( ShapeUtils.isClockWise( shapeVertices ) === false ) {\n\n\t\t\t\tshapeVertices = shapeVertices.reverse();\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tconst shapeHole = shapeHoles[ i ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( shapeHole ) === true ) {\n\n\t\t\t\t\tshapeHoles[ i ] = shapeHole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles );\n\n\t\t\t// join vertices of inner and outer paths to a single array\n\n\t\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tconst shapeHole = shapeHoles[ i ];\n\t\t\t\tshapeVertices = shapeVertices.concat( shapeHole );\n\n\t\t\t}\n\n\t\t\t// vertices, normals, uvs\n\n\t\t\tfor ( let i = 0, l = shapeVertices.length; i < l; i ++ ) {\n\n\t\t\t\tconst vertex = shapeVertices[ i ];\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, 0 );\n\t\t\t\tnormals.push( 0, 0, 1 );\n\t\t\t\tuvs.push( vertex.x, vertex.y ); // world uvs\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\tfor ( let i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tconst face = faces[ i ];\n\n\t\t\t\tconst a = face[ 0 ] + indexOffset;\n\t\t\t\tconst b = face[ 1 ] + indexOffset;\n\t\t\t\tconst c = face[ 2 ] + indexOffset;\n\n\t\t\t\tindices.push( a, b, c );\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tconst shapes = this.parameters.shapes;\n\n\t\treturn toJSON( shapes, data );\n\n\t}\n\n\tstatic fromJSON( data, shapes ) {\n\n\t\tconst geometryShapes = [];\n\n\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\tgeometryShapes.push( shape );\n\n\t\t}\n\n\t\treturn new ShapeGeometry( geometryShapes, data.curveSegments );\n\n\t}\n\n}\n\nfunction toJSON( shapes, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\treturn data;\n\n}\n\nclass SphereGeometry extends BufferGeometry {\n\n\tconstructor( radius = 1, widthSegments = 32, heightSegments = 16, phiStart = 0, phiLength = Math.PI * 2, thetaStart = 0, thetaLength = Math.PI ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'SphereGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\twidthSegments = Math.max( 3, Math.floor( widthSegments ) );\n\t\theightSegments = Math.max( 2, Math.floor( heightSegments ) );\n\n\t\tconst thetaEnd = Math.min( thetaStart + thetaLength, Math.PI );\n\n\t\tlet index = 0;\n\t\tconst grid = [];\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let iy = 0; iy <= heightSegments; iy ++ ) {\n\n\t\t\tconst verticesRow = [];\n\n\t\t\tconst v = iy / heightSegments;\n\n\t\t\t// special case for the poles\n\n\t\t\tlet uOffset = 0;\n\n\t\t\tif ( iy == 0 && thetaStart == 0 ) {\n\n\t\t\t\tuOffset = 0.5 / widthSegments;\n\n\t\t\t} else if ( iy == heightSegments && thetaEnd == Math.PI ) {\n\n\t\t\t\tuOffset = - 0.5 / widthSegments;\n\n\t\t\t}\n\n\t\t\tfor ( let ix = 0; ix <= widthSegments; ix ++ ) {\n\n\t\t\t\tconst u = ix / widthSegments;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\t\t\t\tvertex.y = radius * Math.cos( thetaStart + v * thetaLength );\n\t\t\t\tvertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.copy( vertex ).normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u + uOffset, 1 - v );\n\n\t\t\t\tverticesRow.push( index ++ );\n\n\t\t\t}\n\n\t\t\tgrid.push( verticesRow );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let iy = 0; iy < heightSegments; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < widthSegments; ix ++ ) {\n\n\t\t\t\tconst a = grid[ iy ][ ix + 1 ];\n\t\t\t\tconst b = grid[ iy ][ ix ];\n\t\t\t\tconst c = grid[ iy + 1 ][ ix ];\n\t\t\t\tconst d = grid[ iy + 1 ][ ix + 1 ];\n\n\t\t\t\tif ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d );\n\t\t\t\tif ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new SphereGeometry( data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\nclass TetrahedronGeometry extends PolyhedronGeometry {\n\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst vertices = [\n\t\t\t1, 1, 1, \t- 1, - 1, 1, \t- 1, 1, - 1, \t1, - 1, - 1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t2, 1, 0, \t0, 3, 2,\t1, 3, 0,\t2, 3, 1\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'TetrahedronGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new TetrahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nclass TorusGeometry extends BufferGeometry {\n\n\tconstructor( radius = 1, tube = 0.4, radialSegments = 12, tubularSegments = 48, arc = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TorusGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\tradialSegments: radialSegments,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tarc: arc\n\t\t};\n\n\t\tradialSegments = Math.floor( radialSegments );\n\t\ttubularSegments = Math.floor( tubularSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst center = new Vector3();\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tconst u = i / tubularSegments * arc;\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );\n\t\t\t\tvertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );\n\t\t\t\tvertex.z = tube * Math.sin( v );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tcenter.x = radius * Math.cos( u );\n\t\t\t\tcenter.y = radius * Math.sin( u );\n\t\t\t\tnormal.subVectors( vertex, center ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let j = 1; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= tubularSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tconst a = ( tubularSegments + 1 ) * j + i - 1;\n\t\t\t\tconst b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n\t\t\t\tconst c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n\t\t\t\tconst d = ( tubularSegments + 1 ) * j + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new TorusGeometry( data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc );\n\n\t}\n\n}\n\nclass TorusKnotGeometry extends BufferGeometry {\n\n\tconstructor( radius = 1, tube = 0.4, tubularSegments = 64, radialSegments = 8, p = 2, q = 3 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TorusKnotGeometry';\n\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\tp: p,\n\t\t\tq: q\n\t\t};\n\n\t\ttubularSegments = Math.floor( tubularSegments );\n\t\tradialSegments = Math.floor( radialSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\tconst P1 = new Vector3();\n\t\tconst P2 = new Vector3();\n\n\t\tconst B = new Vector3();\n\t\tconst T = new Vector3();\n\t\tconst N = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let i = 0; i <= tubularSegments; ++ i ) {\n\n\t\t\t// the radian \"u\" is used to calculate the position on the torus curve of the current tubular segment\n\n\t\t\tconst u = i / tubularSegments * p * Math.PI * 2;\n\n\t\t\t// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.\n\t\t\t// these points are used to create a special \"coordinate space\", which is necessary to calculate the correct vertex positions\n\n\t\t\tcalculatePositionOnCurve( u, p, q, radius, P1 );\n\t\t\tcalculatePositionOnCurve( u + 0.01, p, q, radius, P2 );\n\n\t\t\t// calculate orthonormal basis\n\n\t\t\tT.subVectors( P2, P1 );\n\t\t\tN.addVectors( P2, P1 );\n\t\t\tB.crossVectors( T, N );\n\t\t\tN.crossVectors( B, T );\n\n\t\t\t// normalize B, N. T can be ignored, we don't use it\n\n\t\t\tB.normalize();\n\t\t\tN.normalize();\n\n\t\t\tfor ( let j = 0; j <= radialSegments; ++ j ) {\n\n\t\t\t\t// now calculate the vertices. they are nothing more than an extrusion of the torus curve.\n\t\t\t\t// because we extrude a shape in the xy-plane, there is no need to calculate a z-value.\n\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\t\t\t\tconst cx = - tube * Math.cos( v );\n\t\t\t\tconst cy = tube * Math.sin( v );\n\n\t\t\t\t// now calculate the final vertex position.\n\t\t\t\t// first we orient the extrusion with our basis vectors, then we add it to the current position on the curve\n\n\t\t\t\tvertex.x = P1.x + ( cx * N.x + cy * B.x );\n\t\t\t\tvertex.y = P1.y + ( cx * N.y + cy * B.y );\n\t\t\t\tvertex.z = P1.z + ( cx * N.z + cy * B.z );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)\n\n\t\t\t\tnormal.subVectors( vertex, P1 ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// this function calculates the current position on the torus curve\n\n\t\tfunction calculatePositionOnCurve( u, p, q, radius, position ) {\n\n\t\t\tconst cu = Math.cos( u );\n\t\t\tconst su = Math.sin( u );\n\t\t\tconst quOverP = q / p * u;\n\t\t\tconst cs = Math.cos( quOverP );\n\n\t\t\tposition.x = radius * ( 2 + cs ) * 0.5 * cu;\n\t\t\tposition.y = radius * ( 2 + cs ) * su * 0.5;\n\t\t\tposition.z = radius * Math.sin( quOverP ) * 0.5;\n\n\t\t}\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\treturn new TorusKnotGeometry( data.radius, data.tube, data.tubularSegments, data.radialSegments, data.p, data.q );\n\n\t}\n\n}\n\nclass TubeGeometry extends BufferGeometry {\n\n\tconstructor( path = new QuadraticBezierCurve3( new Vector3( - 1, - 1, 0 ), new Vector3( - 1, 1, 0 ), new Vector3( 1, 1, 0 ) ), tubularSegments = 64, radius = 1, radialSegments = 8, closed = false ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TubeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tpath: path,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradius: radius,\n\t\t\tradialSegments: radialSegments,\n\t\t\tclosed: closed\n\t\t};\n\n\t\tconst frames = path.computeFrenetFrames( tubularSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = frames.tangents;\n\t\tthis.normals = frames.normals;\n\t\tthis.binormals = frames.binormals;\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\t\tconst uv = new Vector2();\n\t\tlet P = new Vector3();\n\n\t\t// buffer\n\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\t\tconst indices = [];\n\n\t\t// create buffer data\n\n\t\tgenerateBufferData();\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// functions\n\n\t\tfunction generateBufferData() {\n\n\t\t\tfor ( let i = 0; i < tubularSegments; i ++ ) {\n\n\t\t\t\tgenerateSegment( i );\n\n\t\t\t}\n\n\t\t\t// if the geometry is not closed, generate the last row of vertices and normals\n\t\t\t// at the regular position on the given path\n\t\t\t//\n\t\t\t// if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ)\n\n\t\t\tgenerateSegment( ( closed === false ) ? tubularSegments : 0 );\n\n\t\t\t// uvs are generated in a separate function.\n\t\t\t// this makes it easy compute correct values for closed geometries\n\n\t\t\tgenerateUVs();\n\n\t\t\t// finally create faces\n\n\t\t\tgenerateIndices();\n\n\t\t}\n\n\t\tfunction generateSegment( i ) {\n\n\t\t\t// we use getPointAt to sample evenly distributed points from the given path\n\n\t\t\tP = path.getPointAt( i / tubularSegments, P );\n\n\t\t\t// retrieve corresponding normal and binormal\n\n\t\t\tconst N = frames.normals[ i ];\n\t\t\tconst B = frames.binormals[ i ];\n\n\t\t\t// generate normals and vertices for the current segment\n\n\t\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\tconst sin = Math.sin( v );\n\t\t\t\tconst cos = - Math.cos( v );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.x = ( cos * N.x + sin * B.x );\n\t\t\t\tnormal.y = ( cos * N.y + sin * B.y );\n\t\t\t\tnormal.z = ( cos * N.z + sin * B.z );\n\t\t\t\tnormal.normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = P.x + radius * normal.x;\n\t\t\t\tvertex.y = P.y + radius * normal.y;\n\t\t\t\tvertex.z = P.z + radius * normal.z;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateIndices() {\n\n\t\t\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\t\tuv.x = i / tubularSegments;\n\t\t\t\t\tuv.y = j / radialSegments;\n\n\t\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.path = this.parameters.path.toJSON();\n\n\t\treturn data;\n\n\t}\n\n\tstatic fromJSON( data ) {\n\n\t\t// This only works for built-in curves (e.g. CatmullRomCurve3).\n\t\t// User defined curves or instances of CurvePath will not be deserialized.\n\t\treturn new TubeGeometry(\n\t\t\tnew Curves[ data.path.type ]().fromJSON( data.path ),\n\t\t\tdata.tubularSegments,\n\t\t\tdata.radius,\n\t\t\tdata.radialSegments,\n\t\t\tdata.closed\n\t\t);\n\n\t}\n\n}\n\nclass WireframeGeometry extends BufferGeometry {\n\n\tconstructor( geometry = null ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'WireframeGeometry';\n\n\t\tthis.parameters = {\n\t\t\tgeometry: geometry\n\t\t};\n\n\t\tif ( geometry !== null ) {\n\n\t\t\t// buffer\n\n\t\t\tconst vertices = [];\n\t\t\tconst edges = new Set();\n\n\t\t\t// helper variables\n\n\t\t\tconst start = new Vector3();\n\t\t\tconst end = new Vector3();\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\t// indexed BufferGeometry\n\n\t\t\t\tconst position = geometry.attributes.position;\n\t\t\t\tconst indices = geometry.index;\n\t\t\t\tlet groups = geometry.groups;\n\n\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\tgroups = [ { start: 0, count: indices.count, materialIndex: 0 } ];\n\n\t\t\t\t}\n\n\t\t\t\t// create a data structure that contains all edges without duplicates\n\n\t\t\t\tfor ( let o = 0, ol = groups.length; o < ol; ++ o ) {\n\n\t\t\t\t\tconst group = groups[ o ];\n\n\t\t\t\t\tconst groupStart = group.start;\n\t\t\t\t\tconst groupCount = group.count;\n\n\t\t\t\t\tfor ( let i = groupStart, l = ( groupStart + groupCount ); i < l; i += 3 ) {\n\n\t\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\tconst index1 = indices.getX( i + j );\n\t\t\t\t\t\t\tconst index2 = indices.getX( i + ( j + 1 ) % 3 );\n\n\t\t\t\t\t\t\tstart.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\t\tend.fromBufferAttribute( position, index2 );\n\n\t\t\t\t\t\t\tif ( isUniqueEdge( start, end, edges ) === true ) {\n\n\t\t\t\t\t\t\t\tvertices.push( start.x, start.y, start.z );\n\t\t\t\t\t\t\t\tvertices.push( end.x, end.y, end.z );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed BufferGeometry\n\n\t\t\t\tconst position = geometry.attributes.position;\n\n\t\t\t\tfor ( let i = 0, l = ( position.count / 3 ); i < l; i ++ ) {\n\n\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t// three edges per triangle, an edge is represented as (index1, index2)\n\t\t\t\t\t\t// e.g. the first triangle has the following edges: (0,1),(1,2),(2,0)\n\n\t\t\t\t\t\tconst index1 = 3 * i + j;\n\t\t\t\t\t\tconst index2 = 3 * i + ( ( j + 1 ) % 3 );\n\n\t\t\t\t\t\tstart.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\tend.fromBufferAttribute( position, index2 );\n\n\t\t\t\t\t\tif ( isUniqueEdge( start, end, edges ) === true ) {\n\n\t\t\t\t\t\t\tvertices.push( start.x, start.y, start.z );\n\t\t\t\t\t\t\tvertices.push( end.x, end.y, end.z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// build geometry\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t}\n\n\t}\n\n}\n\nfunction isUniqueEdge( start, end, edges ) {\n\n\tconst hash1 = `${start.x},${start.y},${start.z}-${end.x},${end.y},${end.z}`;\n\tconst hash2 = `${end.x},${end.y},${end.z}-${start.x},${start.y},${start.z}`; // coincident edge\n\n\tif ( edges.has( hash1 ) === true || edges.has( hash2 ) === true ) {\n\n\t\treturn false;\n\n\t} else {\n\n\t\tedges.add( hash1 );\n\t\tedges.add( hash2 );\n\t\treturn true;\n\n\t}\n\n}\n\nvar Geometries = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tBoxGeometry: BoxGeometry,\n\tCapsuleGeometry: CapsuleGeometry,\n\tCircleGeometry: CircleGeometry,\n\tConeGeometry: ConeGeometry,\n\tCylinderGeometry: CylinderGeometry,\n\tDodecahedronGeometry: DodecahedronGeometry,\n\tEdgesGeometry: EdgesGeometry,\n\tExtrudeGeometry: ExtrudeGeometry,\n\tIcosahedronGeometry: IcosahedronGeometry,\n\tLatheGeometry: LatheGeometry,\n\tOctahedronGeometry: OctahedronGeometry,\n\tPlaneGeometry: PlaneGeometry,\n\tPolyhedronGeometry: PolyhedronGeometry,\n\tRingGeometry: RingGeometry,\n\tShapeGeometry: ShapeGeometry,\n\tSphereGeometry: SphereGeometry,\n\tTetrahedronGeometry: TetrahedronGeometry,\n\tTorusGeometry: TorusGeometry,\n\tTorusKnotGeometry: TorusKnotGeometry,\n\tTubeGeometry: TubeGeometry,\n\tWireframeGeometry: WireframeGeometry\n});\n\nclass ShadowMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isShadowMaterial = true;\n\n\t\tthis.type = 'ShadowMaterial';\n\n\t\tthis.color = new Color( 0x000000 );\n\t\tthis.transparent = true;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass RawShaderMaterial extends ShaderMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tsuper( parameters );\n\n\t\tthis.isRawShaderMaterial = true;\n\n\t\tthis.type = 'RawShaderMaterial';\n\n\t}\n\n}\n\nclass MeshStandardMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshStandardMaterial = true;\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.type = 'MeshStandardMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\t\tthis.roughness = 1.0;\n\t\tthis.metalness = 0.0;\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.roughnessMap = null;\n\n\t\tthis.metalnessMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.envMapIntensity = 1.0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.flatShading = false;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.color.copy( source.color );\n\t\tthis.roughness = source.roughness;\n\t\tthis.metalness = source.metalness;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.roughnessMap = source.roughnessMap;\n\n\t\tthis.metalnessMap = source.metalnessMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapIntensity = source.envMapIntensity;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshPhysicalMaterial extends MeshStandardMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshPhysicalMaterial = true;\n\n\t\tthis.defines = {\n\n\t\t\t'STANDARD': '',\n\t\t\t'PHYSICAL': ''\n\n\t\t};\n\n\t\tthis.type = 'MeshPhysicalMaterial';\n\n\t\tthis.clearcoatMap = null;\n\t\tthis.clearcoatRoughness = 0.0;\n\t\tthis.clearcoatRoughnessMap = null;\n\t\tthis.clearcoatNormalScale = new Vector2( 1, 1 );\n\t\tthis.clearcoatNormalMap = null;\n\n\t\tthis.ior = 1.5;\n\n\t\tObject.defineProperty( this, 'reflectivity', {\n\t\t\tget: function () {\n\n\t\t\t\treturn ( clamp( 2.5 * ( this.ior - 1 ) / ( this.ior + 1 ), 0, 1 ) );\n\n\t\t\t},\n\t\t\tset: function ( reflectivity ) {\n\n\t\t\t\tthis.ior = ( 1 + 0.4 * reflectivity ) / ( 1 - 0.4 * reflectivity );\n\n\t\t\t}\n\t\t} );\n\n\t\tthis.iridescenceMap = null;\n\t\tthis.iridescenceIOR = 1.3;\n\t\tthis.iridescenceThicknessRange = [ 100, 400 ];\n\t\tthis.iridescenceThicknessMap = null;\n\n\t\tthis.sheenColor = new Color( 0x000000 );\n\t\tthis.sheenColorMap = null;\n\t\tthis.sheenRoughness = 1.0;\n\t\tthis.sheenRoughnessMap = null;\n\n\t\tthis.transmissionMap = null;\n\n\t\tthis.thickness = 0;\n\t\tthis.thicknessMap = null;\n\t\tthis.attenuationDistance = Infinity;\n\t\tthis.attenuationColor = new Color( 1, 1, 1 );\n\n\t\tthis.specularIntensity = 1.0;\n\t\tthis.specularIntensityMap = null;\n\t\tthis.specularColor = new Color( 1, 1, 1 );\n\t\tthis.specularColorMap = null;\n\n\t\tthis._sheen = 0.0;\n\t\tthis._clearcoat = 0;\n\t\tthis._iridescence = 0;\n\t\tthis._transmission = 0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tget sheen() {\n\n\t\treturn this._sheen;\n\n\t}\n\n\tset sheen( value ) {\n\n\t\tif ( this._sheen > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._sheen = value;\n\n\t}\n\n\tget clearcoat() {\n\n\t\treturn this._clearcoat;\n\n\t}\n\n\tset clearcoat( value ) {\n\n\t\tif ( this._clearcoat > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._clearcoat = value;\n\n\t}\n\n\tget iridescence() {\n\n\t\treturn this._iridescence;\n\n\t}\n\n\tset iridescence( value ) {\n\n\t\tif ( this._iridescence > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._iridescence = value;\n\n\t}\n\n\tget transmission() {\n\n\t\treturn this._transmission;\n\n\t}\n\n\tset transmission( value ) {\n\n\t\tif ( this._transmission > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._transmission = value;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = {\n\n\t\t\t'STANDARD': '',\n\t\t\t'PHYSICAL': ''\n\n\t\t};\n\n\t\tthis.clearcoat = source.clearcoat;\n\t\tthis.clearcoatMap = source.clearcoatMap;\n\t\tthis.clearcoatRoughness = source.clearcoatRoughness;\n\t\tthis.clearcoatRoughnessMap = source.clearcoatRoughnessMap;\n\t\tthis.clearcoatNormalMap = source.clearcoatNormalMap;\n\t\tthis.clearcoatNormalScale.copy( source.clearcoatNormalScale );\n\n\t\tthis.ior = source.ior;\n\n\t\tthis.iridescence = source.iridescence;\n\t\tthis.iridescenceMap = source.iridescenceMap;\n\t\tthis.iridescenceIOR = source.iridescenceIOR;\n\t\tthis.iridescenceThicknessRange = [ ...source.iridescenceThicknessRange ];\n\t\tthis.iridescenceThicknessMap = source.iridescenceThicknessMap;\n\n\t\tthis.sheen = source.sheen;\n\t\tthis.sheenColor.copy( source.sheenColor );\n\t\tthis.sheenColorMap = source.sheenColorMap;\n\t\tthis.sheenRoughness = source.sheenRoughness;\n\t\tthis.sheenRoughnessMap = source.sheenRoughnessMap;\n\n\t\tthis.transmission = source.transmission;\n\t\tthis.transmissionMap = source.transmissionMap;\n\n\t\tthis.thickness = source.thickness;\n\t\tthis.thicknessMap = source.thicknessMap;\n\t\tthis.attenuationDistance = source.attenuationDistance;\n\t\tthis.attenuationColor.copy( source.attenuationColor );\n\n\t\tthis.specularIntensity = source.specularIntensity;\n\t\tthis.specularIntensityMap = source.specularIntensityMap;\n\t\tthis.specularColor.copy( source.specularColor );\n\t\tthis.specularColorMap = source.specularColorMap;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshPhongMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshPhongMaterial = true;\n\n\t\tthis.type = 'MeshPhongMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\t\tthis.specular = new Color( 0x111111 );\n\t\tthis.shininess = 30;\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.flatShading = false;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.specular.copy( source.specular );\n\t\tthis.shininess = source.shininess;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshToonMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshToonMaterial = true;\n\n\t\tthis.defines = { 'TOON': '' };\n\n\t\tthis.type = 'MeshToonMaterial';\n\n\t\tthis.color = new Color( 0xffffff );\n\n\t\tthis.map = null;\n\t\tthis.gradientMap = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\t\tthis.gradientMap = source.gradientMap;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshNormalMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshNormalMaterial = true;\n\n\t\tthis.type = 'MeshNormalMaterial';\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.flatShading = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshLambertMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshLambertMaterial = true;\n\n\t\tthis.type = 'MeshLambertMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\tthis.map = null;\n\n\t\tthis.lightMap = null;\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\tthis.aoMap = null;\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\tthis.emissive = new Color( 0x000000 );\n\t\tthis.emissiveIntensity = 1.0;\n\t\tthis.emissiveMap = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.specularMap = null;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.envMap = null;\n\t\tthis.combine = MultiplyOperation;\n\t\tthis.reflectivity = 1;\n\t\tthis.refractionRatio = 0.98;\n\n\t\tthis.wireframe = false;\n\t\tthis.wireframeLinewidth = 1;\n\t\tthis.wireframeLinecap = 'round';\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\tthis.flatShading = false;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass MeshMatcapMaterial extends Material {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isMeshMatcapMaterial = true;\n\n\t\tthis.defines = { 'MATCAP': '' };\n\n\t\tthis.type = 'MeshMatcapMaterial';\n\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\tthis.matcap = null;\n\n\t\tthis.map = null;\n\n\t\tthis.bumpMap = null;\n\t\tthis.bumpScale = 1;\n\n\t\tthis.normalMap = null;\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\tthis.displacementMap = null;\n\t\tthis.displacementScale = 1;\n\t\tthis.displacementBias = 0;\n\n\t\tthis.alphaMap = null;\n\n\t\tthis.flatShading = false;\n\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = { 'MATCAP': '' };\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.matcap = source.matcap;\n\n\t\tthis.map = source.map;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass LineDashedMaterial extends LineBasicMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tthis.isLineDashedMaterial = true;\n\n\t\tthis.type = 'LineDashedMaterial';\n\n\t\tthis.scale = 1;\n\t\tthis.dashSize = 3;\n\t\tthis.gapSize = 1;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.scale = source.scale;\n\t\tthis.dashSize = source.dashSize;\n\t\tthis.gapSize = source.gapSize;\n\n\t\treturn this;\n\n\t}\n\n}\n\n// same as Array.prototype.slice, but also works on typed arrays\nfunction arraySlice( array, from, to ) {\n\n\tif ( isTypedArray( array ) ) {\n\n\t\t// in ios9 array.subarray(from, undefined) will return empty array\n\t\t// but array.subarray(from) or array.subarray(from, len) is correct\n\t\treturn new array.constructor( array.subarray( from, to !== undefined ? to : array.length ) );\n\n\t}\n\n\treturn array.slice( from, to );\n\n}\n\n// converts an array to a specific type\nfunction convertArray( array, type, forceClone ) {\n\n\tif ( ! array || // let 'undefined' and 'null' pass\n\t\t! forceClone && array.constructor === type ) return array;\n\n\tif ( typeof type.BYTES_PER_ELEMENT === 'number' ) {\n\n\t\treturn new type( array ); // create typed array\n\n\t}\n\n\treturn Array.prototype.slice.call( array ); // create Array\n\n}\n\nfunction isTypedArray( object ) {\n\n\treturn ArrayBuffer.isView( object ) &&\n\t\t! ( object instanceof DataView );\n\n}\n\n// returns an array by which times and values can be sorted\nfunction getKeyframeOrder( times ) {\n\n\tfunction compareTime( i, j ) {\n\n\t\treturn times[ i ] - times[ j ];\n\n\t}\n\n\tconst n = times.length;\n\tconst result = new Array( n );\n\tfor ( let i = 0; i !== n; ++ i ) result[ i ] = i;\n\n\tresult.sort( compareTime );\n\n\treturn result;\n\n}\n\n// uses the array previously returned by 'getKeyframeOrder' to sort data\nfunction sortedArray( values, stride, order ) {\n\n\tconst nValues = values.length;\n\tconst result = new values.constructor( nValues );\n\n\tfor ( let i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {\n\n\t\tconst srcOffset = order[ i ] * stride;\n\n\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\tresult[ dstOffset ++ ] = values[ srcOffset + j ];\n\n\t\t}\n\n\t}\n\n\treturn result;\n\n}\n\n// function for parsing AOS keyframe formats\nfunction flattenJSON( jsonKeys, times, values, valuePropertyName ) {\n\n\tlet i = 1, key = jsonKeys[ 0 ];\n\n\twhile ( key !== undefined && key[ valuePropertyName ] === undefined ) {\n\n\t\tkey = jsonKeys[ i ++ ];\n\n\t}\n\n\tif ( key === undefined ) return; // no data\n\n\tlet value = key[ valuePropertyName ];\n\tif ( value === undefined ) return; // no data\n\n\tif ( Array.isArray( value ) ) {\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalues.push.apply( values, value ); // push all elements\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t} else if ( value.toArray !== undefined ) {\n\n\t\t// ...assume THREE.Math-ish\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalue.toArray( values, values.length );\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t} else {\n\n\t\t// otherwise push as-is\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalues.push( value );\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t}\n\n}\n\nfunction subclip( sourceClip, name, startFrame, endFrame, fps = 30 ) {\n\n\tconst clip = sourceClip.clone();\n\n\tclip.name = name;\n\n\tconst tracks = [];\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tconst track = clip.tracks[ i ];\n\t\tconst valueSize = track.getValueSize();\n\n\t\tconst times = [];\n\t\tconst values = [];\n\n\t\tfor ( let j = 0; j < track.times.length; ++ j ) {\n\n\t\t\tconst frame = track.times[ j ] * fps;\n\n\t\t\tif ( frame < startFrame || frame >= endFrame ) continue;\n\n\t\t\ttimes.push( track.times[ j ] );\n\n\t\t\tfor ( let k = 0; k < valueSize; ++ k ) {\n\n\t\t\t\tvalues.push( track.values[ j * valueSize + k ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( times.length === 0 ) continue;\n\n\t\ttrack.times = convertArray( times, track.times.constructor );\n\t\ttrack.values = convertArray( values, track.values.constructor );\n\n\t\ttracks.push( track );\n\n\t}\n\n\tclip.tracks = tracks;\n\n\t// find minimum .times value across all tracks in the trimmed clip\n\n\tlet minStartTime = Infinity;\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tif ( minStartTime > clip.tracks[ i ].times[ 0 ] ) {\n\n\t\t\tminStartTime = clip.tracks[ i ].times[ 0 ];\n\n\t\t}\n\n\t}\n\n\t// shift all tracks such that clip begins at t=0\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tclip.tracks[ i ].shift( - 1 * minStartTime );\n\n\t}\n\n\tclip.resetDuration();\n\n\treturn clip;\n\n}\n\nfunction makeClipAdditive( targetClip, referenceFrame = 0, referenceClip = targetClip, fps = 30 ) {\n\n\tif ( fps <= 0 ) fps = 30;\n\n\tconst numTracks = referenceClip.tracks.length;\n\tconst referenceTime = referenceFrame / fps;\n\n\t// Make each track's values relative to the values at the reference frame\n\tfor ( let i = 0; i < numTracks; ++ i ) {\n\n\t\tconst referenceTrack = referenceClip.tracks[ i ];\n\t\tconst referenceTrackType = referenceTrack.ValueTypeName;\n\n\t\t// Skip this track if it's non-numeric\n\t\tif ( referenceTrackType === 'bool' || referenceTrackType === 'string' ) continue;\n\n\t\t// Find the track in the target clip whose name and type matches the reference track\n\t\tconst targetTrack = targetClip.tracks.find( function ( track ) {\n\n\t\t\treturn track.name === referenceTrack.name\n\t\t\t\t&& track.ValueTypeName === referenceTrackType;\n\n\t\t} );\n\n\t\tif ( targetTrack === undefined ) continue;\n\n\t\tlet referenceOffset = 0;\n\t\tconst referenceValueSize = referenceTrack.getValueSize();\n\n\t\tif ( referenceTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\treferenceOffset = referenceValueSize / 3;\n\n\t\t}\n\n\t\tlet targetOffset = 0;\n\t\tconst targetValueSize = targetTrack.getValueSize();\n\n\t\tif ( targetTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\ttargetOffset = targetValueSize / 3;\n\n\t\t}\n\n\t\tconst lastIndex = referenceTrack.times.length - 1;\n\t\tlet referenceValue;\n\n\t\t// Find the value to subtract out of the track\n\t\tif ( referenceTime <= referenceTrack.times[ 0 ] ) {\n\n\t\t\t// Reference frame is earlier than the first keyframe, so just use the first keyframe\n\t\t\tconst startIndex = referenceOffset;\n\t\t\tconst endIndex = referenceValueSize - referenceOffset;\n\t\t\treferenceValue = arraySlice( referenceTrack.values, startIndex, endIndex );\n\n\t\t} else if ( referenceTime >= referenceTrack.times[ lastIndex ] ) {\n\n\t\t\t// Reference frame is after the last keyframe, so just use the last keyframe\n\t\t\tconst startIndex = lastIndex * referenceValueSize + referenceOffset;\n\t\t\tconst endIndex = startIndex + referenceValueSize - referenceOffset;\n\t\t\treferenceValue = arraySlice( referenceTrack.values, startIndex, endIndex );\n\n\t\t} else {\n\n\t\t\t// Interpolate to the reference value\n\t\t\tconst interpolant = referenceTrack.createInterpolant();\n\t\t\tconst startIndex = referenceOffset;\n\t\t\tconst endIndex = referenceValueSize - referenceOffset;\n\t\t\tinterpolant.evaluate( referenceTime );\n\t\t\treferenceValue = arraySlice( interpolant.resultBuffer, startIndex, endIndex );\n\n\t\t}\n\n\t\t// Conjugate the quaternion\n\t\tif ( referenceTrackType === 'quaternion' ) {\n\n\t\t\tconst referenceQuat = new Quaternion().fromArray( referenceValue ).normalize().conjugate();\n\t\t\treferenceQuat.toArray( referenceValue );\n\n\t\t}\n\n\t\t// Subtract the reference value from all of the track values\n\n\t\tconst numTimes = targetTrack.times.length;\n\t\tfor ( let j = 0; j < numTimes; ++ j ) {\n\n\t\t\tconst valueStart = j * targetValueSize + targetOffset;\n\n\t\t\tif ( referenceTrackType === 'quaternion' ) {\n\n\t\t\t\t// Multiply the conjugate for quaternion track types\n\t\t\t\tQuaternion.multiplyQuaternionsFlat(\n\t\t\t\t\ttargetTrack.values,\n\t\t\t\t\tvalueStart,\n\t\t\t\t\treferenceValue,\n\t\t\t\t\t0,\n\t\t\t\t\ttargetTrack.values,\n\t\t\t\t\tvalueStart\n\t\t\t\t);\n\n\t\t\t} else {\n\n\t\t\t\tconst valueEnd = targetValueSize - targetOffset * 2;\n\n\t\t\t\t// Subtract each value for all other numeric track types\n\t\t\t\tfor ( let k = 0; k < valueEnd; ++ k ) {\n\n\t\t\t\t\ttargetTrack.values[ valueStart + k ] -= referenceValue[ k ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttargetClip.blendMode = AdditiveAnimationBlendMode;\n\n\treturn targetClip;\n\n}\n\nvar AnimationUtils = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tarraySlice: arraySlice,\n\tconvertArray: convertArray,\n\tflattenJSON: flattenJSON,\n\tgetKeyframeOrder: getKeyframeOrder,\n\tisTypedArray: isTypedArray,\n\tmakeClipAdditive: makeClipAdditive,\n\tsortedArray: sortedArray,\n\tsubclip: subclip\n});\n\n/**\n * Abstract base class of interpolants over parametric samples.\n *\n * The parameter domain is one dimensional, typically the time or a path\n * along a curve defined by the data.\n *\n * The sample values can have any dimensionality and derived classes may\n * apply special interpretations to the data.\n *\n * This class provides the interval seek in a Template Method, deferring\n * the actual interpolation to derived classes.\n *\n * Time complexity is O(1) for linear access crossing at most two points\n * and O(log N) for random access, where N is the number of positions.\n *\n * References:\n *\n * \t\thttp://www.oodesign.com/template-method-pattern.html\n *\n */\n\nclass Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tthis.parameterPositions = parameterPositions;\n\t\tthis._cachedIndex = 0;\n\n\t\tthis.resultBuffer = resultBuffer !== undefined ?\n\t\t\tresultBuffer : new sampleValues.constructor( sampleSize );\n\t\tthis.sampleValues = sampleValues;\n\t\tthis.valueSize = sampleSize;\n\n\t\tthis.settings = null;\n\t\tthis.DefaultSettings_ = {};\n\n\t}\n\n\tevaluate( t ) {\n\n\t\tconst pp = this.parameterPositions;\n\t\tlet i1 = this._cachedIndex,\n\t\t\tt1 = pp[ i1 ],\n\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\tvalidate_interval: {\n\n\t\t\tseek: {\n\n\t\t\t\tlet right;\n\n\t\t\t\tlinear_scan: {\n\n\t\t\t\t\t//- See http://jsperf.com/comparison-to-undefined/3\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\n\t\t\t\t\t//- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\n\t\t\t\t\tforward_scan: if ( ! ( t < t1 ) ) {\n\n\t\t\t\t\t\tfor ( let giveUpAt = i1 + 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\t\t\tif ( t < t0 ) break forward_scan;\n\n\t\t\t\t\t\t\t\t// after end\n\n\t\t\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt0 = t1;\n\t\t\t\t\t\t\tt1 = pp[ ++ i1 ];\n\n\t\t\t\t\t\t\tif ( t < t1 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the right side of the index\n\t\t\t\t\t\tright = pp.length;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\n\t\t\t\t\tif ( ! ( t >= t0 ) ) {\n\n\t\t\t\t\t\t// looping?\n\n\t\t\t\t\t\tconst t1global = pp[ 1 ];\n\n\t\t\t\t\t\tif ( t < t1global ) {\n\n\t\t\t\t\t\t\ti1 = 2; // + 1, using the scan for the details\n\t\t\t\t\t\t\tt0 = t1global;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// linear reverse scan\n\n\t\t\t\t\t\tfor ( let giveUpAt = i1 - 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\t\t\t// before start\n\n\t\t\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\t\t\treturn this.copySampleValue_( 0 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt1 = t0;\n\t\t\t\t\t\t\tt0 = pp[ -- i1 - 1 ];\n\n\t\t\t\t\t\t\tif ( t >= t0 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the left side of the index\n\t\t\t\t\t\tright = i1;\n\t\t\t\t\t\ti1 = 0;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the interval is valid\n\n\t\t\t\t\tbreak validate_interval;\n\n\t\t\t\t} // linear scan\n\n\t\t\t\t// binary search\n\n\t\t\t\twhile ( i1 < right ) {\n\n\t\t\t\t\tconst mid = ( i1 + right ) >>> 1;\n\n\t\t\t\t\tif ( t < pp[ mid ] ) {\n\n\t\t\t\t\t\tright = mid;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ti1 = mid + 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tt1 = pp[ i1 ];\n\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\t\t// check boundary cases, again\n\n\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\treturn this.copySampleValue_( 0 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t\t\t}\n\n\t\t\t} // seek\n\n\t\t\tthis._cachedIndex = i1;\n\n\t\t\tthis.intervalChanged_( i1, t0, t1 );\n\n\t\t} // validate_interval\n\n\t\treturn this.interpolate_( i1, t0, t, t1 );\n\n\t}\n\n\tgetSettings_() {\n\n\t\treturn this.settings || this.DefaultSettings_;\n\n\t}\n\n\tcopySampleValue_( index ) {\n\n\t\t// copies a sample value to the result buffer\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = index * stride;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\t// Template methods for derived classes:\n\n\tinterpolate_( /* i1, t0, t, t1 */ ) {\n\n\t\tthrow new Error( 'call to abstract method' );\n\t\t// implementations shall return this.resultBuffer\n\n\t}\n\n\tintervalChanged_( /* i1, t0, t1 */ ) {\n\n\t\t// empty\n\n\t}\n\n}\n\n/**\n * Fast and simple cubic spline interpolant.\n *\n * It was derived from a Hermitian construction setting the first derivative\n * at each sample position to the linear slope between neighboring positions\n * over their parameter interval.\n */\n\nclass CubicInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t\tthis._weightPrev = - 0;\n\t\tthis._offsetPrev = - 0;\n\t\tthis._weightNext = - 0;\n\t\tthis._offsetNext = - 0;\n\n\t\tthis.DefaultSettings_ = {\n\n\t\t\tendingStart: ZeroCurvatureEnding,\n\t\t\tendingEnd: ZeroCurvatureEnding\n\n\t\t};\n\n\t}\n\n\tintervalChanged_( i1, t0, t1 ) {\n\n\t\tconst pp = this.parameterPositions;\n\t\tlet iPrev = i1 - 2,\n\t\t\tiNext = i1 + 1,\n\n\t\t\ttPrev = pp[ iPrev ],\n\t\t\ttNext = pp[ iNext ];\n\n\t\tif ( tPrev === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingStart ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(t0) = 0\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = 2 * t0 - t1;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiPrev = pp.length - 2;\n\t\t\t\t\ttPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(t0) = 0 a.k.a. Natural Spline\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = t1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tNext === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingEnd ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(tN) = 0\n\t\t\t\t\tiNext = i1;\n\t\t\t\t\ttNext = 2 * t1 - t0;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiNext = 1;\n\t\t\t\t\ttNext = t1 + pp[ 1 ] - pp[ 0 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(tN) = 0, a.k.a. Natural Spline\n\t\t\t\t\tiNext = i1 - 1;\n\t\t\t\t\ttNext = t0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst halfDt = ( t1 - t0 ) * 0.5,\n\t\t\tstride = this.valueSize;\n\n\t\tthis._weightPrev = halfDt / ( t0 - tPrev );\n\t\tthis._weightNext = halfDt / ( tNext - t1 );\n\t\tthis._offsetPrev = iPrev * stride;\n\t\tthis._offsetNext = iNext * stride;\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\to1 = i1 * stride,\t\to0 = o1 - stride,\n\t\t\toP = this._offsetPrev, \toN = this._offsetNext,\n\t\t\twP = this._weightPrev,\twN = this._weightNext,\n\n\t\t\tp = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tpp = p * p,\n\t\t\tppp = pp * p;\n\n\t\t// evaluate polynomials\n\n\t\tconst sP = - wP * ppp + 2 * wP * pp - wP * p;\n\t\tconst s0 = ( 1 + wP ) * ppp + ( - 1.5 - 2 * wP ) * pp + ( - 0.5 + wP ) * p + 1;\n\t\tconst s1 = ( - 1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;\n\t\tconst sN = wN * ppp - wN * pp;\n\n\t\t// combine data linearly\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tsP * values[ oP + i ] +\n\t\t\t\t\ts0 * values[ o0 + i ] +\n\t\t\t\t\ts1 * values[ o1 + i ] +\n\t\t\t\t\tsN * values[ oN + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\nclass LinearInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\toffset1 = i1 * stride,\n\t\t\toffset0 = offset1 - stride,\n\n\t\t\tweight1 = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tweight0 = 1 - weight1;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tvalues[ offset0 + i ] * weight0 +\n\t\t\t\t\tvalues[ offset1 + i ] * weight1;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n *\n * Interpolant that evaluates to the sample value at the position preceding\n * the parameter.\n */\n\nclass DiscreteInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1 /*, t0, t, t1 */ ) {\n\n\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t}\n\n}\n\nclass KeyframeTrack {\n\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tif ( name === undefined ) throw new Error( 'THREE.KeyframeTrack: track name is undefined' );\n\t\tif ( times === undefined || times.length === 0 ) throw new Error( 'THREE.KeyframeTrack: no keyframes in track named ' + name );\n\n\t\tthis.name = name;\n\n\t\tthis.times = convertArray( times, this.TimeBufferType );\n\t\tthis.values = convertArray( values, this.ValueBufferType );\n\n\t\tthis.setInterpolation( interpolation || this.DefaultInterpolation );\n\n\t}\n\n\t// Serialization (in static context, because of constructor invocation\n\t// and automatic invocation of .toJSON):\n\n\tstatic toJSON( track ) {\n\n\t\tconst trackType = track.constructor;\n\n\t\tlet json;\n\n\t\t// derived classes can define a static toJSON method\n\t\tif ( trackType.toJSON !== this.toJSON ) {\n\n\t\t\tjson = trackType.toJSON( track );\n\n\t\t} else {\n\n\t\t\t// by default, we assume the data can be serialized as-is\n\t\t\tjson = {\n\n\t\t\t\t'name': track.name,\n\t\t\t\t'times': convertArray( track.times, Array ),\n\t\t\t\t'values': convertArray( track.values, Array )\n\n\t\t\t};\n\n\t\t\tconst interpolation = track.getInterpolation();\n\n\t\t\tif ( interpolation !== track.DefaultInterpolation ) {\n\n\t\t\t\tjson.interpolation = interpolation;\n\n\t\t\t}\n\n\t\t}\n\n\t\tjson.type = track.ValueTypeName; // mandatory\n\n\t\treturn json;\n\n\t}\n\n\tInterpolantFactoryMethodDiscrete( result ) {\n\n\t\treturn new DiscreteInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\tInterpolantFactoryMethodLinear( result ) {\n\n\t\treturn new LinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\tInterpolantFactoryMethodSmooth( result ) {\n\n\t\treturn new CubicInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\tsetInterpolation( interpolation ) {\n\n\t\tlet factoryMethod;\n\n\t\tswitch ( interpolation ) {\n\n\t\t\tcase InterpolateDiscrete:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodDiscrete;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateLinear:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodLinear;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateSmooth:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodSmooth;\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tif ( factoryMethod === undefined ) {\n\n\t\t\tconst message = 'unsupported interpolation for ' +\n\t\t\t\tthis.ValueTypeName + ' keyframe track named ' + this.name;\n\n\t\t\tif ( this.createInterpolant === undefined ) {\n\n\t\t\t\t// fall back to default, unless the default itself is messed up\n\t\t\t\tif ( interpolation !== this.DefaultInterpolation ) {\n\n\t\t\t\t\tthis.setInterpolation( this.DefaultInterpolation );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( message ); // fatal, in this case\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconsole.warn( 'THREE.KeyframeTrack:', message );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis.createInterpolant = factoryMethod;\n\n\t\treturn this;\n\n\t}\n\n\tgetInterpolation() {\n\n\t\tswitch ( this.createInterpolant ) {\n\n\t\t\tcase this.InterpolantFactoryMethodDiscrete:\n\n\t\t\t\treturn InterpolateDiscrete;\n\n\t\t\tcase this.InterpolantFactoryMethodLinear:\n\n\t\t\t\treturn InterpolateLinear;\n\n\t\t\tcase this.InterpolantFactoryMethodSmooth:\n\n\t\t\t\treturn InterpolateSmooth;\n\n\t\t}\n\n\t}\n\n\tgetValueSize() {\n\n\t\treturn this.values.length / this.times.length;\n\n\t}\n\n\t// move all keyframes either forwards or backwards in time\n\tshift( timeOffset ) {\n\n\t\tif ( timeOffset !== 0.0 ) {\n\n\t\t\tconst times = this.times;\n\n\t\t\tfor ( let i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] += timeOffset;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// scale all keyframe times by a factor (useful for frame <-> seconds conversions)\n\tscale( timeScale ) {\n\n\t\tif ( timeScale !== 1.0 ) {\n\n\t\t\tconst times = this.times;\n\n\t\t\tfor ( let i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] *= timeScale;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// removes keyframes before and after animation without changing any values within the range [startTime, endTime].\n\t// IMPORTANT: We do not shift around keys to the start of the track time, because for interpolated keys this will change their values\n\ttrim( startTime, endTime ) {\n\n\t\tconst times = this.times,\n\t\t\tnKeys = times.length;\n\n\t\tlet from = 0,\n\t\t\tto = nKeys - 1;\n\n\t\twhile ( from !== nKeys && times[ from ] < startTime ) {\n\n\t\t\t++ from;\n\n\t\t}\n\n\t\twhile ( to !== - 1 && times[ to ] > endTime ) {\n\n\t\t\t-- to;\n\n\t\t}\n\n\t\t++ to; // inclusive -> exclusive bound\n\n\t\tif ( from !== 0 || to !== nKeys ) {\n\n\t\t\t// empty tracks are forbidden, so keep at least one keyframe\n\t\t\tif ( from >= to ) {\n\n\t\t\t\tto = Math.max( to, 1 );\n\t\t\t\tfrom = to - 1;\n\n\t\t\t}\n\n\t\t\tconst stride = this.getValueSize();\n\t\t\tthis.times = arraySlice( times, from, to );\n\t\t\tthis.values = arraySlice( this.values, from * stride, to * stride );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// ensure we do not get a GarbageInGarbageOut situation, make sure tracks are at least minimally viable\n\tvalidate() {\n\n\t\tlet valid = true;\n\n\t\tconst valueSize = this.getValueSize();\n\t\tif ( valueSize - Math.floor( valueSize ) !== 0 ) {\n\n\t\t\tconsole.error( 'THREE.KeyframeTrack: Invalid value size in track.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tconst times = this.times,\n\t\t\tvalues = this.values,\n\n\t\t\tnKeys = times.length;\n\n\t\tif ( nKeys === 0 ) {\n\n\t\t\tconsole.error( 'THREE.KeyframeTrack: Track is empty.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tlet prevTime = null;\n\n\t\tfor ( let i = 0; i !== nKeys; i ++ ) {\n\n\t\t\tconst currTime = times[ i ];\n\n\t\t\tif ( typeof currTime === 'number' && isNaN( currTime ) ) {\n\n\t\t\t\tconsole.error( 'THREE.KeyframeTrack: Time is not a valid number.', this, i, currTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( prevTime !== null && prevTime > currTime ) {\n\n\t\t\t\tconsole.error( 'THREE.KeyframeTrack: Out of order keys.', this, i, currTime, prevTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tprevTime = currTime;\n\n\t\t}\n\n\t\tif ( values !== undefined ) {\n\n\t\t\tif ( isTypedArray( values ) ) {\n\n\t\t\t\tfor ( let i = 0, n = values.length; i !== n; ++ i ) {\n\n\t\t\t\t\tconst value = values[ i ];\n\n\t\t\t\t\tif ( isNaN( value ) ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.KeyframeTrack: Value is not a valid number.', this, i, value );\n\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn valid;\n\n\t}\n\n\t// removes equivalent sequential keys as common in morph target sequences\n\t// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)\n\toptimize() {\n\n\t\t// times or values may be shared with other tracks, so overwriting is unsafe\n\t\tconst times = arraySlice( this.times ),\n\t\t\tvalues = arraySlice( this.values ),\n\t\t\tstride = this.getValueSize(),\n\n\t\t\tsmoothInterpolation = this.getInterpolation() === InterpolateSmooth,\n\n\t\t\tlastIndex = times.length - 1;\n\n\t\tlet writeIndex = 1;\n\n\t\tfor ( let i = 1; i < lastIndex; ++ i ) {\n\n\t\t\tlet keep = false;\n\n\t\t\tconst time = times[ i ];\n\t\t\tconst timeNext = times[ i + 1 ];\n\n\t\t\t// remove adjacent keyframes scheduled at the same time\n\n\t\t\tif ( time !== timeNext && ( i !== 1 || time !== times[ 0 ] ) ) {\n\n\t\t\t\tif ( ! smoothInterpolation ) {\n\n\t\t\t\t\t// remove unnecessary keyframes same as their neighbors\n\n\t\t\t\t\tconst offset = i * stride,\n\t\t\t\t\t\toffsetP = offset - stride,\n\t\t\t\t\t\toffsetN = offset + stride;\n\n\t\t\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tconst value = values[ offset + j ];\n\n\t\t\t\t\t\tif ( value !== values[ offsetP + j ] ||\n\t\t\t\t\t\t\tvalue !== values[ offsetN + j ] ) {\n\n\t\t\t\t\t\t\tkeep = true;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tkeep = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// in-place compaction\n\n\t\t\tif ( keep ) {\n\n\t\t\t\tif ( i !== writeIndex ) {\n\n\t\t\t\t\ttimes[ writeIndex ] = times[ i ];\n\n\t\t\t\t\tconst readOffset = i * stride,\n\t\t\t\t\t\twriteOffset = writeIndex * stride;\n\n\t\t\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t++ writeIndex;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// flush last keyframe (compaction looks ahead)\n\n\t\tif ( lastIndex > 0 ) {\n\n\t\t\ttimes[ writeIndex ] = times[ lastIndex ];\n\n\t\t\tfor ( let readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) {\n\n\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t}\n\n\t\t\t++ writeIndex;\n\n\t\t}\n\n\t\tif ( writeIndex !== times.length ) {\n\n\t\t\tthis.times = arraySlice( times, 0, writeIndex );\n\t\t\tthis.values = arraySlice( values, 0, writeIndex * stride );\n\n\t\t} else {\n\n\t\t\tthis.times = times;\n\t\t\tthis.values = values;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\tconst times = arraySlice( this.times, 0 );\n\t\tconst values = arraySlice( this.values, 0 );\n\n\t\tconst TypedKeyframeTrack = this.constructor;\n\t\tconst track = new TypedKeyframeTrack( this.name, times, values );\n\n\t\t// Interpolant argument to constructor is not saved, so copy the factory method directly.\n\t\ttrack.createInterpolant = this.createInterpolant;\n\n\t\treturn track;\n\n\t}\n\n}\n\nKeyframeTrack.prototype.TimeBufferType = Float32Array;\nKeyframeTrack.prototype.ValueBufferType = Float32Array;\nKeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear;\n\n/**\n * A Track of Boolean keyframe values.\n */\nclass BooleanKeyframeTrack extends KeyframeTrack {}\n\nBooleanKeyframeTrack.prototype.ValueTypeName = 'bool';\nBooleanKeyframeTrack.prototype.ValueBufferType = Array;\nBooleanKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;\nBooleanKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;\nBooleanKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A Track of keyframe values that represent color.\n */\nclass ColorKeyframeTrack extends KeyframeTrack {}\n\nColorKeyframeTrack.prototype.ValueTypeName = 'color';\n\n/**\n * A Track of numeric keyframe values.\n */\nclass NumberKeyframeTrack extends KeyframeTrack {}\n\nNumberKeyframeTrack.prototype.ValueTypeName = 'number';\n\n/**\n * Spherical linear unit quaternion interpolant.\n */\n\nclass QuaternionLinearInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\talpha = ( t - t0 ) / ( t1 - t0 );\n\n\t\tlet offset = i1 * stride;\n\n\t\tfor ( let end = offset + stride; offset !== end; offset += 4 ) {\n\n\t\t\tQuaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha );\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n * A Track of quaternion keyframe values.\n */\nclass QuaternionKeyframeTrack extends KeyframeTrack {\n\n\tInterpolantFactoryMethodLinear( result ) {\n\n\t\treturn new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n}\n\nQuaternionKeyframeTrack.prototype.ValueTypeName = 'quaternion';\n// ValueBufferType is inherited\nQuaternionKeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear;\nQuaternionKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A Track that interpolates Strings\n */\nclass StringKeyframeTrack extends KeyframeTrack {}\n\nStringKeyframeTrack.prototype.ValueTypeName = 'string';\nStringKeyframeTrack.prototype.ValueBufferType = Array;\nStringKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;\nStringKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;\nStringKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A Track of vectored keyframe values.\n */\nclass VectorKeyframeTrack extends KeyframeTrack {}\n\nVectorKeyframeTrack.prototype.ValueTypeName = 'vector';\n\nclass AnimationClip {\n\n\tconstructor( name, duration = - 1, tracks, blendMode = NormalAnimationBlendMode ) {\n\n\t\tthis.name = name;\n\t\tthis.tracks = tracks;\n\t\tthis.duration = duration;\n\t\tthis.blendMode = blendMode;\n\n\t\tthis.uuid = generateUUID();\n\n\t\t// this means it should figure out its duration by scanning the tracks\n\t\tif ( this.duration < 0 ) {\n\n\t\t\tthis.resetDuration();\n\n\t\t}\n\n\t}\n\n\n\tstatic parse( json ) {\n\n\t\tconst tracks = [],\n\t\t\tjsonTracks = json.tracks,\n\t\t\tframeTime = 1.0 / ( json.fps || 1.0 );\n\n\t\tfor ( let i = 0, n = jsonTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( parseKeyframeTrack( jsonTracks[ i ] ).scale( frameTime ) );\n\n\t\t}\n\n\t\tconst clip = new this( json.name, json.duration, tracks, json.blendMode );\n\t\tclip.uuid = json.uuid;\n\n\t\treturn clip;\n\n\t}\n\n\tstatic toJSON( clip ) {\n\n\t\tconst tracks = [],\n\t\t\tclipTracks = clip.tracks;\n\n\t\tconst json = {\n\n\t\t\t'name': clip.name,\n\t\t\t'duration': clip.duration,\n\t\t\t'tracks': tracks,\n\t\t\t'uuid': clip.uuid,\n\t\t\t'blendMode': clip.blendMode\n\n\t\t};\n\n\t\tfor ( let i = 0, n = clipTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );\n\n\t\t}\n\n\t\treturn json;\n\n\t}\n\n\tstatic CreateFromMorphTargetSequence( name, morphTargetSequence, fps, noLoop ) {\n\n\t\tconst numMorphTargets = morphTargetSequence.length;\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < numMorphTargets; i ++ ) {\n\n\t\t\tlet times = [];\n\t\t\tlet values = [];\n\n\t\t\ttimes.push(\n\t\t\t\t( i + numMorphTargets - 1 ) % numMorphTargets,\n\t\t\t\ti,\n\t\t\t\t( i + 1 ) % numMorphTargets );\n\n\t\t\tvalues.push( 0, 1, 0 );\n\n\t\t\tconst order = getKeyframeOrder( times );\n\t\t\ttimes = sortedArray( times, 1, order );\n\t\t\tvalues = sortedArray( values, 1, order );\n\n\t\t\t// if there is a key at the first frame, duplicate it as the\n\t\t\t// last frame as well for perfect loop.\n\t\t\tif ( ! noLoop && times[ 0 ] === 0 ) {\n\n\t\t\t\ttimes.push( numMorphTargets );\n\t\t\t\tvalues.push( values[ 0 ] );\n\n\t\t\t}\n\n\t\t\ttracks.push(\n\t\t\t\tnew NumberKeyframeTrack(\n\t\t\t\t\t'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',\n\t\t\t\t\ttimes, values\n\t\t\t\t).scale( 1.0 / fps ) );\n\n\t\t}\n\n\t\treturn new this( name, - 1, tracks );\n\n\t}\n\n\tstatic findByName( objectOrClipArray, name ) {\n\n\t\tlet clipArray = objectOrClipArray;\n\n\t\tif ( ! Array.isArray( objectOrClipArray ) ) {\n\n\t\t\tconst o = objectOrClipArray;\n\t\t\tclipArray = o.geometry && o.geometry.animations || o.animations;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < clipArray.length; i ++ ) {\n\n\t\t\tif ( clipArray[ i ].name === name ) {\n\n\t\t\t\treturn clipArray[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\tstatic CreateClipsFromMorphTargetSequences( morphTargets, fps, noLoop ) {\n\n\t\tconst animationToMorphTargets = {};\n\n\t\t// tested with https://regex101.com/ on trick sequences\n\t\t// such flamingo_flyA_003, flamingo_run1_003, crdeath0059\n\t\tconst pattern = /^([\\w-]*?)([\\d]+)$/;\n\n\t\t// sort morph target names into animation groups based\n\t\t// patterns like Walk_001, Walk_002, Run_001, Run_002\n\t\tfor ( let i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\tconst parts = morphTarget.name.match( pattern );\n\n\t\t\tif ( parts && parts.length > 1 ) {\n\n\t\t\t\tconst name = parts[ 1 ];\n\n\t\t\t\tlet animationMorphTargets = animationToMorphTargets[ name ];\n\n\t\t\t\tif ( ! animationMorphTargets ) {\n\n\t\t\t\t\tanimationToMorphTargets[ name ] = animationMorphTargets = [];\n\n\t\t\t\t}\n\n\t\t\t\tanimationMorphTargets.push( morphTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst clips = [];\n\n\t\tfor ( const name in animationToMorphTargets ) {\n\n\t\t\tclips.push( this.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );\n\n\t\t}\n\n\t\treturn clips;\n\n\t}\n\n\t// parse the animation.hierarchy format\n\tstatic parseAnimation( animation, bones ) {\n\n\t\tif ( ! animation ) {\n\n\t\t\tconsole.error( 'THREE.AnimationClip: No animation in JSONLoader data.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) {\n\n\t\t\t// only return track if there are actually keys.\n\t\t\tif ( animationKeys.length !== 0 ) {\n\n\t\t\t\tconst times = [];\n\t\t\t\tconst values = [];\n\n\t\t\t\tflattenJSON( animationKeys, times, values, propertyName );\n\n\t\t\t\t// empty keys are filtered out, so check again\n\t\t\t\tif ( times.length !== 0 ) {\n\n\t\t\t\t\tdestTracks.push( new trackType( trackName, times, values ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tconst tracks = [];\n\n\t\tconst clipName = animation.name || 'default';\n\t\tconst fps = animation.fps || 30;\n\t\tconst blendMode = animation.blendMode;\n\n\t\t// automatic length determination in AnimationClip.\n\t\tlet duration = animation.length || - 1;\n\n\t\tconst hierarchyTracks = animation.hierarchy || [];\n\n\t\tfor ( let h = 0; h < hierarchyTracks.length; h ++ ) {\n\n\t\t\tconst animationKeys = hierarchyTracks[ h ].keys;\n\n\t\t\t// skip empty tracks\n\t\t\tif ( ! animationKeys || animationKeys.length === 0 ) continue;\n\n\t\t\t// process morph targets\n\t\t\tif ( animationKeys[ 0 ].morphTargets ) {\n\n\t\t\t\t// figure out all morph targets used in this track\n\t\t\t\tconst morphTargetNames = {};\n\n\t\t\t\tlet k;\n\n\t\t\t\tfor ( k = 0; k < animationKeys.length; k ++ ) {\n\n\t\t\t\t\tif ( animationKeys[ k ].morphTargets ) {\n\n\t\t\t\t\t\tfor ( let m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) {\n\n\t\t\t\t\t\t\tmorphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = - 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// create a track for each morph target with all zero\n\t\t\t\t// morphTargetInfluences except for the keys in which\n\t\t\t\t// the morphTarget is named.\n\t\t\t\tfor ( const morphTargetName in morphTargetNames ) {\n\n\t\t\t\t\tconst times = [];\n\t\t\t\t\tconst values = [];\n\n\t\t\t\t\tfor ( let m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) {\n\n\t\t\t\t\t\tconst animationKey = animationKeys[ k ];\n\n\t\t\t\t\t\ttimes.push( animationKey.time );\n\t\t\t\t\t\tvalues.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) );\n\n\t\t\t\t}\n\n\t\t\t\tduration = morphTargetNames.length * fps;\n\n\t\t\t} else {\n\n\t\t\t\t// ...assume skeletal animation\n\n\t\t\t\tconst boneName = '.bones[' + bones[ h ].name + ']';\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.position',\n\t\t\t\t\tanimationKeys, 'pos', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tQuaternionKeyframeTrack, boneName + '.quaternion',\n\t\t\t\t\tanimationKeys, 'rot', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.scale',\n\t\t\t\t\tanimationKeys, 'scl', tracks );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tracks.length === 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst clip = new this( clipName, duration, tracks, blendMode );\n\n\t\treturn clip;\n\n\t}\n\n\tresetDuration() {\n\n\t\tconst tracks = this.tracks;\n\t\tlet duration = 0;\n\n\t\tfor ( let i = 0, n = tracks.length; i !== n; ++ i ) {\n\n\t\t\tconst track = this.tracks[ i ];\n\n\t\t\tduration = Math.max( duration, track.times[ track.times.length - 1 ] );\n\n\t\t}\n\n\t\tthis.duration = duration;\n\n\t\treturn this;\n\n\t}\n\n\ttrim() {\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].trim( 0, this.duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tvalidate() {\n\n\t\tlet valid = true;\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tvalid = valid && this.tracks[ i ].validate();\n\n\t\t}\n\n\t\treturn valid;\n\n\t}\n\n\toptimize() {\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].optimize();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\ttracks.push( this.tracks[ i ].clone() );\n\n\t\t}\n\n\t\treturn new this.constructor( this.name, this.duration, tracks, this.blendMode );\n\n\t}\n\n\ttoJSON() {\n\n\t\treturn this.constructor.toJSON( this );\n\n\t}\n\n}\n\nfunction getTrackTypeForValueTypeName( typeName ) {\n\n\tswitch ( typeName.toLowerCase() ) {\n\n\t\tcase 'scalar':\n\t\tcase 'double':\n\t\tcase 'float':\n\t\tcase 'number':\n\t\tcase 'integer':\n\n\t\t\treturn NumberKeyframeTrack;\n\n\t\tcase 'vector':\n\t\tcase 'vector2':\n\t\tcase 'vector3':\n\t\tcase 'vector4':\n\n\t\t\treturn VectorKeyframeTrack;\n\n\t\tcase 'color':\n\n\t\t\treturn ColorKeyframeTrack;\n\n\t\tcase 'quaternion':\n\n\t\t\treturn QuaternionKeyframeTrack;\n\n\t\tcase 'bool':\n\t\tcase 'boolean':\n\n\t\t\treturn BooleanKeyframeTrack;\n\n\t\tcase 'string':\n\n\t\t\treturn StringKeyframeTrack;\n\n\t}\n\n\tthrow new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName );\n\n}\n\nfunction parseKeyframeTrack( json ) {\n\n\tif ( json.type === undefined ) {\n\n\t\tthrow new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' );\n\n\t}\n\n\tconst trackType = getTrackTypeForValueTypeName( json.type );\n\n\tif ( json.times === undefined ) {\n\n\t\tconst times = [], values = [];\n\n\t\tflattenJSON( json.keys, times, values, 'value' );\n\n\t\tjson.times = times;\n\t\tjson.values = values;\n\n\t}\n\n\t// derived classes can define a static parse method\n\tif ( trackType.parse !== undefined ) {\n\n\t\treturn trackType.parse( json );\n\n\t} else {\n\n\t\t// by default, we assume a constructor compatible with the base\n\t\treturn new trackType( json.name, json.times, json.values, json.interpolation );\n\n\t}\n\n}\n\nconst Cache = {\n\n\tenabled: false,\n\n\tfiles: {},\n\n\tadd: function ( key, file ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// console.log( 'THREE.Cache', 'Adding key:', key );\n\n\t\tthis.files[ key ] = file;\n\n\t},\n\n\tget: function ( key ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// console.log( 'THREE.Cache', 'Checking key:', key );\n\n\t\treturn this.files[ key ];\n\n\t},\n\n\tremove: function ( key ) {\n\n\t\tdelete this.files[ key ];\n\n\t},\n\n\tclear: function () {\n\n\t\tthis.files = {};\n\n\t}\n\n};\n\nclass LoadingManager {\n\n\tconstructor( onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tlet isLoading = false;\n\t\tlet itemsLoaded = 0;\n\t\tlet itemsTotal = 0;\n\t\tlet urlModifier = undefined;\n\t\tconst handlers = [];\n\n\t\t// Refer to #5689 for the reason why we don't set .onStart\n\t\t// in the constructor\n\n\t\tthis.onStart = undefined;\n\t\tthis.onLoad = onLoad;\n\t\tthis.onProgress = onProgress;\n\t\tthis.onError = onError;\n\n\t\tthis.itemStart = function ( url ) {\n\n\t\t\titemsTotal ++;\n\n\t\t\tif ( isLoading === false ) {\n\n\t\t\t\tif ( scope.onStart !== undefined ) {\n\n\t\t\t\t\tscope.onStart( url, itemsLoaded, itemsTotal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tisLoading = true;\n\n\t\t};\n\n\t\tthis.itemEnd = function ( url ) {\n\n\t\t\titemsLoaded ++;\n\n\t\t\tif ( scope.onProgress !== undefined ) {\n\n\t\t\t\tscope.onProgress( url, itemsLoaded, itemsTotal );\n\n\t\t\t}\n\n\t\t\tif ( itemsLoaded === itemsTotal ) {\n\n\t\t\t\tisLoading = false;\n\n\t\t\t\tif ( scope.onLoad !== undefined ) {\n\n\t\t\t\t\tscope.onLoad();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.itemError = function ( url ) {\n\n\t\t\tif ( scope.onError !== undefined ) {\n\n\t\t\t\tscope.onError( url );\n\n\t\t\t}\n\n\t\t};\n\n\t\tthis.resolveURL = function ( url ) {\n\n\t\t\tif ( urlModifier ) {\n\n\t\t\t\treturn urlModifier( url );\n\n\t\t\t}\n\n\t\t\treturn url;\n\n\t\t};\n\n\t\tthis.setURLModifier = function ( transform ) {\n\n\t\t\turlModifier = transform;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\tthis.addHandler = function ( regex, loader ) {\n\n\t\t\thandlers.push( regex, loader );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\tthis.removeHandler = function ( regex ) {\n\n\t\t\tconst index = handlers.indexOf( regex );\n\n\t\t\tif ( index !== - 1 ) {\n\n\t\t\t\thandlers.splice( index, 2 );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\tthis.getHandler = function ( file ) {\n\n\t\t\tfor ( let i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\t\tconst regex = handlers[ i ];\n\t\t\t\tconst loader = handlers[ i + 1 ];\n\n\t\t\t\tif ( regex.global ) regex.lastIndex = 0; // see #17920\n\n\t\t\t\tif ( regex.test( file ) ) {\n\n\t\t\t\t\treturn loader;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t};\n\n\t}\n\n}\n\nconst DefaultLoadingManager = /*@__PURE__*/ new LoadingManager();\n\nclass Loader {\n\n\tconstructor( manager ) {\n\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\tthis.crossOrigin = 'anonymous';\n\t\tthis.withCredentials = false;\n\t\tthis.path = '';\n\t\tthis.resourcePath = '';\n\t\tthis.requestHeader = {};\n\n\t}\n\n\tload( /* url, onLoad, onProgress, onError */ ) {}\n\n\tloadAsync( url, onProgress ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.load( url, resolve, onProgress, reject );\n\n\t\t} );\n\n\t}\n\n\tparse( /* data */ ) {}\n\n\tsetCrossOrigin( crossOrigin ) {\n\n\t\tthis.crossOrigin = crossOrigin;\n\t\treturn this;\n\n\t}\n\n\tsetWithCredentials( value ) {\n\n\t\tthis.withCredentials = value;\n\t\treturn this;\n\n\t}\n\n\tsetPath( path ) {\n\n\t\tthis.path = path;\n\t\treturn this;\n\n\t}\n\n\tsetResourcePath( resourcePath ) {\n\n\t\tthis.resourcePath = resourcePath;\n\t\treturn this;\n\n\t}\n\n\tsetRequestHeader( requestHeader ) {\n\n\t\tthis.requestHeader = requestHeader;\n\t\treturn this;\n\n\t}\n\n}\n\nconst loading = {};\n\nclass HttpError extends Error {\n\n\tconstructor( message, response ) {\n\n\t\tsuper( message );\n\t\tthis.response = response;\n\n\t}\n\n}\n\nclass FileLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst cached = Cache.get( url );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tthis.manager.itemStart( url );\n\n\t\t\tsetTimeout( () => {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tthis.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\t// Check if request is duplicate\n\n\t\tif ( loading[ url ] !== undefined ) {\n\n\t\t\tloading[ url ].push( {\n\n\t\t\t\tonLoad: onLoad,\n\t\t\t\tonProgress: onProgress,\n\t\t\t\tonError: onError\n\n\t\t\t} );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// Initialise array for duplicate requests\n\t\tloading[ url ] = [];\n\n\t\tloading[ url ].push( {\n\t\t\tonLoad: onLoad,\n\t\t\tonProgress: onProgress,\n\t\t\tonError: onError,\n\t\t} );\n\n\t\t// create request\n\t\tconst req = new Request( url, {\n\t\t\theaders: new Headers( this.requestHeader ),\n\t\t\tcredentials: this.withCredentials ? 'include' : 'same-origin',\n\t\t\t// An abort controller could be added within a future PR\n\t\t} );\n\n\t\t// record states ( avoid data race )\n\t\tconst mimeType = this.mimeType;\n\t\tconst responseType = this.responseType;\n\n\t\t// start the fetch\n\t\tfetch( req )\n\t\t\t.then( response => {\n\n\t\t\t\tif ( response.status === 200 || response.status === 0 ) {\n\n\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\tif ( response.status === 0 ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.FileLoader: HTTP Status 0 received.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Workaround: Checking if response.body === undefined for Alipay browser #23548\n\n\t\t\t\t\tif ( typeof ReadableStream === 'undefined' || response.body === undefined || response.body.getReader === undefined ) {\n\n\t\t\t\t\t\treturn response;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst callbacks = loading[ url ];\n\t\t\t\t\tconst reader = response.body.getReader();\n\n\t\t\t\t\t// Nginx needs X-File-Size check\n\t\t\t\t\t// https://serverfault.com/questions/482875/why-does-nginx-remove-content-length-header-for-chunked-content\n\t\t\t\t\tconst contentLength = response.headers.get( 'Content-Length' ) || response.headers.get( 'X-File-Size' );\n\t\t\t\t\tconst total = contentLength ? parseInt( contentLength ) : 0;\n\t\t\t\t\tconst lengthComputable = total !== 0;\n\t\t\t\t\tlet loaded = 0;\n\n\t\t\t\t\t// periodically read data into the new stream tracking while download progress\n\t\t\t\t\tconst stream = new ReadableStream( {\n\t\t\t\t\t\tstart( controller ) {\n\n\t\t\t\t\t\t\treadData();\n\n\t\t\t\t\t\t\tfunction readData() {\n\n\t\t\t\t\t\t\t\treader.read().then( ( { done, value } ) => {\n\n\t\t\t\t\t\t\t\t\tif ( done ) {\n\n\t\t\t\t\t\t\t\t\t\tcontroller.close();\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tloaded += value.byteLength;\n\n\t\t\t\t\t\t\t\t\t\tconst event = new ProgressEvent( 'progress', { lengthComputable, loaded, total } );\n\t\t\t\t\t\t\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\t\t\t\t\t\t\tif ( callback.onProgress ) callback.onProgress( event );\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tcontroller.enqueue( value );\n\t\t\t\t\t\t\t\t\t\treadData();\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn new Response( stream );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new HttpError( `fetch for \"${response.url}\" responded with ${response.status}: ${response.statusText}`, response );\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.then( response => {\n\n\t\t\t\tswitch ( responseType ) {\n\n\t\t\t\t\tcase 'arraybuffer':\n\n\t\t\t\t\t\treturn response.arrayBuffer();\n\n\t\t\t\t\tcase 'blob':\n\n\t\t\t\t\t\treturn response.blob();\n\n\t\t\t\t\tcase 'document':\n\n\t\t\t\t\t\treturn response.text()\n\t\t\t\t\t\t\t.then( text => {\n\n\t\t\t\t\t\t\t\tconst parser = new DOMParser();\n\t\t\t\t\t\t\t\treturn parser.parseFromString( text, mimeType );\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\tcase 'json':\n\n\t\t\t\t\t\treturn response.json();\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( mimeType === undefined ) {\n\n\t\t\t\t\t\t\treturn response.text();\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// sniff encoding\n\t\t\t\t\t\t\tconst re = /charset=\"?([^;\"\\s]*)\"?/i;\n\t\t\t\t\t\t\tconst exec = re.exec( mimeType );\n\t\t\t\t\t\t\tconst label = exec && exec[ 1 ] ? exec[ 1 ].toLowerCase() : undefined;\n\t\t\t\t\t\t\tconst decoder = new TextDecoder( label );\n\t\t\t\t\t\t\treturn response.arrayBuffer().then( ab => decoder.decode( ab ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.then( data => {\n\n\t\t\t\t// Add to cache only on HTTP success, so that we do not cache\n\t\t\t\t// error response bodies as proper responses to requests.\n\t\t\t\tCache.add( url, data );\n\n\t\t\t\tconst callbacks = loading[ url ];\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onLoad ) callback.onLoad( data );\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.catch( err => {\n\n\t\t\t\t// Abort errors and other errors are handled the same\n\n\t\t\t\tconst callbacks = loading[ url ];\n\n\t\t\t\tif ( callbacks === undefined ) {\n\n\t\t\t\t\t// When onLoad was called and url was deleted in `loading`\n\t\t\t\t\tthis.manager.itemError( url );\n\t\t\t\t\tthrow err;\n\n\t\t\t\t}\n\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onError ) callback.onError( err );\n\n\t\t\t\t}\n\n\t\t\t\tthis.manager.itemError( url );\n\n\t\t\t} )\n\t\t\t.finally( () => {\n\n\t\t\t\tthis.manager.itemEnd( url );\n\n\t\t\t} );\n\n\t\tthis.manager.itemStart( url );\n\n\t}\n\n\tsetResponseType( value ) {\n\n\t\tthis.responseType = value;\n\t\treturn this;\n\n\t}\n\n\tsetMimeType( value ) {\n\n\t\tthis.mimeType = value;\n\t\treturn this;\n\n\t}\n\n}\n\nclass AnimationLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( json ) {\n\n\t\tconst animations = [];\n\n\t\tfor ( let i = 0; i < json.length; i ++ ) {\n\n\t\t\tconst clip = AnimationClip.parse( json[ i ] );\n\n\t\t\tanimations.push( clip );\n\n\t\t}\n\n\t\treturn animations;\n\n\t}\n\n}\n\n/**\n * Abstract Base class to block based textures loader (dds, pvr, ...)\n *\n * Sub classes have to implement the parse() method which will be used in load().\n */\n\nclass CompressedTextureLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst images = [];\n\n\t\tconst texture = new CompressedTexture();\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\n\t\tlet loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( url[ i ], function ( buffer ) {\n\n\t\t\t\tconst texDatas = scope.parse( buffer, true );\n\n\t\t\t\timages[ i ] = {\n\t\t\t\t\twidth: texDatas.width,\n\t\t\t\t\theight: texDatas.height,\n\t\t\t\t\tformat: texDatas.format,\n\t\t\t\t\tmipmaps: texDatas.mipmaps\n\t\t\t\t};\n\n\t\t\t\tloaded += 1;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\tif ( texDatas.mipmapCount === 1 ) texture.minFilter = LinearFilter;\n\n\t\t\t\t\ttexture.image = images;\n\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\tif ( Array.isArray( url ) ) {\n\n\t\t\tfor ( let i = 0, il = url.length; i < il; ++ i ) {\n\n\t\t\t\tloadTexture( i );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// compressed cubemap texture stored in a single DDS file\n\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tconst texDatas = scope.parse( buffer, true );\n\n\t\t\t\tif ( texDatas.isCubemap ) {\n\n\t\t\t\t\tconst faces = texDatas.mipmaps.length / texDatas.mipmapCount;\n\n\t\t\t\t\tfor ( let f = 0; f < faces; f ++ ) {\n\n\t\t\t\t\t\timages[ f ] = { mipmaps: [] };\n\n\t\t\t\t\t\tfor ( let i = 0; i < texDatas.mipmapCount; i ++ ) {\n\n\t\t\t\t\t\t\timages[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );\n\t\t\t\t\t\t\timages[ f ].format = texDatas.format;\n\t\t\t\t\t\t\timages[ f ].width = texDatas.width;\n\t\t\t\t\t\t\timages[ f ].height = texDatas.height;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.image = images;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttexture.image.width = texDatas.width;\n\t\t\t\t\ttexture.image.height = texDatas.height;\n\t\t\t\t\ttexture.mipmaps = texDatas.mipmaps;\n\n\t\t\t\t}\n\n\t\t\t\tif ( texDatas.mipmapCount === 1 ) {\n\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n}\n\nclass ImageLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst cached = Cache.get( url );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tconst image = createElementNS( 'img' );\n\n\t\tfunction onImageLoad() {\n\n\t\t\tremoveEventListeners();\n\n\t\t\tCache.add( url, this );\n\n\t\t\tif ( onLoad ) onLoad( this );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\tfunction onImageError( event ) {\n\n\t\t\tremoveEventListeners();\n\n\t\t\tif ( onError ) onError( event );\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\tfunction removeEventListeners() {\n\n\t\t\timage.removeEventListener( 'load', onImageLoad, false );\n\t\t\timage.removeEventListener( 'error', onImageError, false );\n\n\t\t}\n\n\t\timage.addEventListener( 'load', onImageLoad, false );\n\t\timage.addEventListener( 'error', onImageError, false );\n\n\t\tif ( url.slice( 0, 5 ) !== 'data:' ) {\n\n\t\t\tif ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;\n\n\t\t}\n\n\t\tscope.manager.itemStart( url );\n\n\t\timage.src = url;\n\n\t\treturn image;\n\n\t}\n\n}\n\nclass CubeTextureLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( urls, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new CubeTexture();\n\n\t\tconst loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tlet loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( urls[ i ], function ( image ) {\n\n\t\t\t\ttexture.images[ i ] = image;\n\n\t\t\t\tloaded ++;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, undefined, onError );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < urls.length; ++ i ) {\n\n\t\t\tloadTexture( i );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Abstract Base class to load generic binary textures formats (rgbe, hdr, ...)\n *\n * Sub classes have to implement the parse() method which will be used in load().\n */\n\nclass DataTextureLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst texture = new DataTexture();\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setPath( this.path );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\tconst texData = scope.parse( buffer );\n\n\t\t\tif ( ! texData ) return;\n\n\t\t\tif ( texData.image !== undefined ) {\n\n\t\t\t\ttexture.image = texData.image;\n\n\t\t\t} else if ( texData.data !== undefined ) {\n\n\t\t\t\ttexture.image.width = texData.width;\n\t\t\t\ttexture.image.height = texData.height;\n\t\t\t\ttexture.image.data = texData.data;\n\n\t\t\t}\n\n\t\t\ttexture.wrapS = texData.wrapS !== undefined ? texData.wrapS : ClampToEdgeWrapping;\n\t\t\ttexture.wrapT = texData.wrapT !== undefined ? texData.wrapT : ClampToEdgeWrapping;\n\n\t\t\ttexture.magFilter = texData.magFilter !== undefined ? texData.magFilter : LinearFilter;\n\t\t\ttexture.minFilter = texData.minFilter !== undefined ? texData.minFilter : LinearFilter;\n\n\t\t\ttexture.anisotropy = texData.anisotropy !== undefined ? texData.anisotropy : 1;\n\n\t\t\tif ( texData.encoding !== undefined ) {\n\n\t\t\t\ttexture.encoding = texData.encoding;\n\n\t\t\t}\n\n\t\t\tif ( texData.flipY !== undefined ) {\n\n\t\t\t\ttexture.flipY = texData.flipY;\n\n\t\t\t}\n\n\t\t\tif ( texData.format !== undefined ) {\n\n\t\t\t\ttexture.format = texData.format;\n\n\t\t\t}\n\n\t\t\tif ( texData.type !== undefined ) {\n\n\t\t\t\ttexture.type = texData.type;\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmaps !== undefined ) {\n\n\t\t\t\ttexture.mipmaps = texData.mipmaps;\n\t\t\t\ttexture.minFilter = LinearMipmapLinearFilter; // presumably...\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmapCount === 1 ) {\n\n\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t}\n\n\t\t\tif ( texData.generateMipmaps !== undefined ) {\n\n\t\t\t\ttexture.generateMipmaps = texData.generateMipmaps;\n\n\t\t\t}\n\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}, onProgress, onError );\n\n\n\t\treturn texture;\n\n\t}\n\n}\n\nclass TextureLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new Texture();\n\n\t\tconst loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tloader.load( url, function ( image ) {\n\n\t\t\ttexture.image = image;\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\tonLoad( texture );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t\treturn texture;\n\n\t}\n\n}\n\nclass Light extends Object3D {\n\n\tconstructor( color, intensity = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.isLight = true;\n\n\t\tthis.type = 'Light';\n\n\t\tthis.color = new Color( color );\n\t\tthis.intensity = intensity;\n\n\t}\n\n\tdispose() {\n\n\t\t// Empty here in base class; some subclasses override.\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.intensity = source.intensity;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.color = this.color.getHex();\n\t\tdata.object.intensity = this.intensity;\n\n\t\tif ( this.groundColor !== undefined ) data.object.groundColor = this.groundColor.getHex();\n\n\t\tif ( this.distance !== undefined ) data.object.distance = this.distance;\n\t\tif ( this.angle !== undefined ) data.object.angle = this.angle;\n\t\tif ( this.decay !== undefined ) data.object.decay = this.decay;\n\t\tif ( this.penumbra !== undefined ) data.object.penumbra = this.penumbra;\n\n\t\tif ( this.shadow !== undefined ) data.object.shadow = this.shadow.toJSON();\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass HemisphereLight extends Light {\n\n\tconstructor( skyColor, groundColor, intensity ) {\n\n\t\tsuper( skyColor, intensity );\n\n\t\tthis.isHemisphereLight = true;\n\n\t\tthis.type = 'HemisphereLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\tthis.groundColor = new Color( groundColor );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.groundColor.copy( source.groundColor );\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _projScreenMatrix$1 = /*@__PURE__*/ new Matrix4();\nconst _lightPositionWorld$1 = /*@__PURE__*/ new Vector3();\nconst _lookTarget$1 = /*@__PURE__*/ new Vector3();\n\nclass LightShadow {\n\n\tconstructor( camera ) {\n\n\t\tthis.camera = camera;\n\n\t\tthis.bias = 0;\n\t\tthis.normalBias = 0;\n\t\tthis.radius = 1;\n\t\tthis.blurSamples = 8;\n\n\t\tthis.mapSize = new Vector2( 512, 512 );\n\n\t\tthis.map = null;\n\t\tthis.mapPass = null;\n\t\tthis.matrix = new Matrix4();\n\n\t\tthis.autoUpdate = true;\n\t\tthis.needsUpdate = false;\n\n\t\tthis._frustum = new Frustum();\n\t\tthis._frameExtents = new Vector2( 1, 1 );\n\n\t\tthis._viewportCount = 1;\n\n\t\tthis._viewports = [\n\n\t\t\tnew Vector4( 0, 0, 1, 1 )\n\n\t\t];\n\n\t}\n\n\tgetViewportCount() {\n\n\t\treturn this._viewportCount;\n\n\t}\n\n\tgetFrustum() {\n\n\t\treturn this._frustum;\n\n\t}\n\n\tupdateMatrices( light ) {\n\n\t\tconst shadowCamera = this.camera;\n\t\tconst shadowMatrix = this.matrix;\n\n\t\t_lightPositionWorld$1.setFromMatrixPosition( light.matrixWorld );\n\t\tshadowCamera.position.copy( _lightPositionWorld$1 );\n\n\t\t_lookTarget$1.setFromMatrixPosition( light.target.matrixWorld );\n\t\tshadowCamera.lookAt( _lookTarget$1 );\n\t\tshadowCamera.updateMatrixWorld();\n\n\t\t_projScreenMatrix$1.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\n\t\tthis._frustum.setFromProjectionMatrix( _projScreenMatrix$1 );\n\n\t\tshadowMatrix.set(\n\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t);\n\n\t\tshadowMatrix.multiply( _projScreenMatrix$1 );\n\n\t}\n\n\tgetViewport( viewportIndex ) {\n\n\t\treturn this._viewports[ viewportIndex ];\n\n\t}\n\n\tgetFrameExtents() {\n\n\t\treturn this._frameExtents;\n\n\t}\n\n\tdispose() {\n\n\t\tif ( this.map ) {\n\n\t\t\tthis.map.dispose();\n\n\t\t}\n\n\t\tif ( this.mapPass ) {\n\n\t\t\tthis.mapPass.dispose();\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.camera = source.camera.clone();\n\n\t\tthis.bias = source.bias;\n\t\tthis.radius = source.radius;\n\n\t\tthis.mapSize.copy( source.mapSize );\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst object = {};\n\n\t\tif ( this.bias !== 0 ) object.bias = this.bias;\n\t\tif ( this.normalBias !== 0 ) object.normalBias = this.normalBias;\n\t\tif ( this.radius !== 1 ) object.radius = this.radius;\n\t\tif ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();\n\n\t\tobject.camera = this.camera.toJSON( false ).object;\n\t\tdelete object.camera.matrix;\n\n\t\treturn object;\n\n\t}\n\n}\n\nclass SpotLightShadow extends LightShadow {\n\n\tconstructor() {\n\n\t\tsuper( new PerspectiveCamera( 50, 1, 0.5, 500 ) );\n\n\t\tthis.isSpotLightShadow = true;\n\n\t\tthis.focus = 1;\n\n\t}\n\n\tupdateMatrices( light ) {\n\n\t\tconst camera = this.camera;\n\n\t\tconst fov = RAD2DEG * 2 * light.angle * this.focus;\n\t\tconst aspect = this.mapSize.width / this.mapSize.height;\n\t\tconst far = light.distance || camera.far;\n\n\t\tif ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {\n\n\t\t\tcamera.fov = fov;\n\t\t\tcamera.aspect = aspect;\n\t\t\tcamera.far = far;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t}\n\n\t\tsuper.updateMatrices( light );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.focus = source.focus;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass SpotLight extends Light {\n\n\tconstructor( color, intensity, distance = 0, angle = Math.PI / 3, penumbra = 0, decay = 2 ) {\n\n\t\tsuper( color, intensity );\n\n\t\tthis.isSpotLight = true;\n\n\t\tthis.type = 'SpotLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tthis.distance = distance;\n\t\tthis.angle = angle;\n\t\tthis.penumbra = penumbra;\n\t\tthis.decay = decay;\n\n\t\tthis.map = null;\n\n\t\tthis.shadow = new SpotLightShadow();\n\n\t}\n\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in candela)\n\t\t// by convention for a spotlight, luminous power (lm) = π * luminous intensity (cd)\n\t\treturn this.intensity * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in candela) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / Math.PI;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.distance = source.distance;\n\t\tthis.angle = source.angle;\n\t\tthis.penumbra = source.penumbra;\n\t\tthis.decay = source.decay;\n\n\t\tthis.target = source.target.clone();\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _projScreenMatrix = /*@__PURE__*/ new Matrix4();\nconst _lightPositionWorld = /*@__PURE__*/ new Vector3();\nconst _lookTarget = /*@__PURE__*/ new Vector3();\n\nclass PointLightShadow extends LightShadow {\n\n\tconstructor() {\n\n\t\tsuper( new PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t\tthis.isPointLightShadow = true;\n\n\t\tthis._frameExtents = new Vector2( 4, 2 );\n\n\t\tthis._viewportCount = 6;\n\n\t\tthis._viewports = [\n\t\t\t// These viewports map a cube-map onto a 2D texture with the\n\t\t\t// following orientation:\n\t\t\t//\n\t\t\t// xzXZ\n\t\t\t// y Y\n\t\t\t//\n\t\t\t// X - Positive x direction\n\t\t\t// x - Negative x direction\n\t\t\t// Y - Positive y direction\n\t\t\t// y - Negative y direction\n\t\t\t// Z - Positive z direction\n\t\t\t// z - Negative z direction\n\n\t\t\t// positive X\n\t\t\tnew Vector4( 2, 1, 1, 1 ),\n\t\t\t// negative X\n\t\t\tnew Vector4( 0, 1, 1, 1 ),\n\t\t\t// positive Z\n\t\t\tnew Vector4( 3, 1, 1, 1 ),\n\t\t\t// negative Z\n\t\t\tnew Vector4( 1, 1, 1, 1 ),\n\t\t\t// positive Y\n\t\t\tnew Vector4( 3, 0, 1, 1 ),\n\t\t\t// negative Y\n\t\t\tnew Vector4( 1, 0, 1, 1 )\n\t\t];\n\n\t\tthis._cubeDirections = [\n\t\t\tnew Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ),\n\t\t\tnew Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 )\n\t\t];\n\n\t\tthis._cubeUps = [\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ),\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ),\tnew Vector3( 0, 0, - 1 )\n\t\t];\n\n\t}\n\n\tupdateMatrices( light, viewportIndex = 0 ) {\n\n\t\tconst camera = this.camera;\n\t\tconst shadowMatrix = this.matrix;\n\n\t\tconst far = light.distance || camera.far;\n\n\t\tif ( far !== camera.far ) {\n\n\t\t\tcamera.far = far;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t}\n\n\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\tcamera.position.copy( _lightPositionWorld );\n\n\t\t_lookTarget.copy( camera.position );\n\t\t_lookTarget.add( this._cubeDirections[ viewportIndex ] );\n\t\tcamera.up.copy( this._cubeUps[ viewportIndex ] );\n\t\tcamera.lookAt( _lookTarget );\n\t\tcamera.updateMatrixWorld();\n\n\t\tshadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z );\n\n\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\tthis._frustum.setFromProjectionMatrix( _projScreenMatrix );\n\n\t}\n\n}\n\nclass PointLight extends Light {\n\n\tconstructor( color, intensity, distance = 0, decay = 2 ) {\n\n\t\tsuper( color, intensity );\n\n\t\tthis.isPointLight = true;\n\n\t\tthis.type = 'PointLight';\n\n\t\tthis.distance = distance;\n\t\tthis.decay = decay;\n\n\t\tthis.shadow = new PointLightShadow();\n\n\t}\n\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in candela)\n\t\t// for an isotropic light source, luminous power (lm) = 4 π luminous intensity (cd)\n\t\treturn this.intensity * 4 * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in candela) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / ( 4 * Math.PI );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.distance = source.distance;\n\t\tthis.decay = source.decay;\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass DirectionalLightShadow extends LightShadow {\n\n\tconstructor() {\n\n\t\tsuper( new OrthographicCamera( - 5, 5, 5, - 5, 0.5, 500 ) );\n\n\t\tthis.isDirectionalLightShadow = true;\n\n\t}\n\n}\n\nclass DirectionalLight extends Light {\n\n\tconstructor( color, intensity ) {\n\n\t\tsuper( color, intensity );\n\n\t\tthis.isDirectionalLight = true;\n\n\t\tthis.type = 'DirectionalLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\tthis.target = new Object3D();\n\n\t\tthis.shadow = new DirectionalLightShadow();\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.target = source.target.clone();\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass AmbientLight extends Light {\n\n\tconstructor( color, intensity ) {\n\n\t\tsuper( color, intensity );\n\n\t\tthis.isAmbientLight = true;\n\n\t\tthis.type = 'AmbientLight';\n\n\t}\n\n}\n\nclass RectAreaLight extends Light {\n\n\tconstructor( color, intensity, width = 10, height = 10 ) {\n\n\t\tsuper( color, intensity );\n\n\t\tthis.isRectAreaLight = true;\n\n\t\tthis.type = 'RectAreaLight';\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\n\t}\n\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in nits)\n\t\treturn this.intensity * this.width * this.height * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in nits) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / ( this.width * this.height * Math.PI );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.width = this.width;\n\t\tdata.object.height = this.height;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Primary reference:\n * https://graphics.stanford.edu/papers/envmap/envmap.pdf\n *\n * Secondary reference:\n * https://www.ppsloan.org/publications/StupidSH36.pdf\n */\n\n// 3-band SH defined by 9 coefficients\n\nclass SphericalHarmonics3 {\n\n\tconstructor() {\n\n\t\tthis.isSphericalHarmonics3 = true;\n\n\t\tthis.coefficients = [];\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients.push( new Vector3() );\n\n\t\t}\n\n\t}\n\n\tset( coefficients ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].copy( coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tzero() {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].set( 0, 0, 0 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// get the radiance in the direction of the normal\n\t// target is a Vector3\n\tgetAt( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.282095 );\n\n\t\t// band 1\n\t\ttarget.addScaledVector( coeff[ 1 ], 0.488603 * y );\n\t\ttarget.addScaledVector( coeff[ 2 ], 0.488603 * z );\n\t\ttarget.addScaledVector( coeff[ 3 ], 0.488603 * x );\n\n\t\t// band 2\n\t\ttarget.addScaledVector( coeff[ 4 ], 1.092548 * ( x * y ) );\n\t\ttarget.addScaledVector( coeff[ 5 ], 1.092548 * ( y * z ) );\n\t\ttarget.addScaledVector( coeff[ 6 ], 0.315392 * ( 3.0 * z * z - 1.0 ) );\n\t\ttarget.addScaledVector( coeff[ 7 ], 1.092548 * ( x * z ) );\n\t\ttarget.addScaledVector( coeff[ 8 ], 0.546274 * ( x * x - y * y ) );\n\n\t\treturn target;\n\n\t}\n\n\t// get the irradiance (radiance convolved with cosine lobe) in the direction of the normal\n\t// target is a Vector3\n\t// https://graphics.stanford.edu/papers/envmap/envmap.pdf\n\tgetIrradianceAt( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.886227 ); // π * 0.282095\n\n\t\t// band 1\n\t\ttarget.addScaledVector( coeff[ 1 ], 2.0 * 0.511664 * y ); // ( 2 * π / 3 ) * 0.488603\n\t\ttarget.addScaledVector( coeff[ 2 ], 2.0 * 0.511664 * z );\n\t\ttarget.addScaledVector( coeff[ 3 ], 2.0 * 0.511664 * x );\n\n\t\t// band 2\n\t\ttarget.addScaledVector( coeff[ 4 ], 2.0 * 0.429043 * x * y ); // ( π / 4 ) * 1.092548\n\t\ttarget.addScaledVector( coeff[ 5 ], 2.0 * 0.429043 * y * z );\n\t\ttarget.addScaledVector( coeff[ 6 ], 0.743125 * z * z - 0.247708 ); // ( π / 4 ) * 0.315392 * 3\n\t\ttarget.addScaledVector( coeff[ 7 ], 2.0 * 0.429043 * x * z );\n\t\ttarget.addScaledVector( coeff[ 8 ], 0.429043 * ( x * x - y * y ) ); // ( π / 4 ) * 0.546274\n\n\t\treturn target;\n\n\t}\n\n\tadd( sh ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].add( sh.coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\taddScaledSH( sh, s ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].addScaledVector( sh.coefficients[ i ], s );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tscale( s ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].multiplyScalar( s );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tlerp( sh, alpha ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].lerp( sh.coefficients[ i ], alpha );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tequals( sh ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( ! this.coefficients[ i ].equals( sh.coefficients[ i ] ) ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tcopy( sh ) {\n\n\t\treturn this.set( sh.coefficients );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].fromArray( array, offset + ( i * 3 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].toArray( array, offset + ( i * 3 ) );\n\n\t\t}\n\n\t\treturn array;\n\n\t}\n\n\t// evaluate the basis functions\n\t// shBasis is an Array[ 9 ]\n\tstatic getBasisAt( normal, shBasis ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\t// band 0\n\t\tshBasis[ 0 ] = 0.282095;\n\n\t\t// band 1\n\t\tshBasis[ 1 ] = 0.488603 * y;\n\t\tshBasis[ 2 ] = 0.488603 * z;\n\t\tshBasis[ 3 ] = 0.488603 * x;\n\n\t\t// band 2\n\t\tshBasis[ 4 ] = 1.092548 * x * y;\n\t\tshBasis[ 5 ] = 1.092548 * y * z;\n\t\tshBasis[ 6 ] = 0.315392 * ( 3 * z * z - 1 );\n\t\tshBasis[ 7 ] = 1.092548 * x * z;\n\t\tshBasis[ 8 ] = 0.546274 * ( x * x - y * y );\n\n\t}\n\n}\n\nclass LightProbe extends Light {\n\n\tconstructor( sh = new SphericalHarmonics3(), intensity = 1 ) {\n\n\t\tsuper( undefined, intensity );\n\n\t\tthis.isLightProbe = true;\n\n\t\tthis.sh = sh;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.sh.copy( source.sh );\n\n\t\treturn this;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tthis.intensity = json.intensity; // TODO: Move this bit to Light.fromJSON();\n\t\tthis.sh.fromArray( json.sh );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.sh = this.sh.toArray();\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass MaterialLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\t\tthis.textures = {};\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( json ) {\n\n\t\tconst textures = this.textures;\n\n\t\tfunction getTexture( name ) {\n\n\t\t\tif ( textures[ name ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.MaterialLoader: Undefined texture', name );\n\n\t\t\t}\n\n\t\t\treturn textures[ name ];\n\n\t\t}\n\n\t\tconst material = MaterialLoader.createMaterialFromType( json.type );\n\n\t\tif ( json.uuid !== undefined ) material.uuid = json.uuid;\n\t\tif ( json.name !== undefined ) material.name = json.name;\n\t\tif ( json.color !== undefined && material.color !== undefined ) material.color.setHex( json.color );\n\t\tif ( json.roughness !== undefined ) material.roughness = json.roughness;\n\t\tif ( json.metalness !== undefined ) material.metalness = json.metalness;\n\t\tif ( json.sheen !== undefined ) material.sheen = json.sheen;\n\t\tif ( json.sheenColor !== undefined ) material.sheenColor = new Color().setHex( json.sheenColor );\n\t\tif ( json.sheenRoughness !== undefined ) material.sheenRoughness = json.sheenRoughness;\n\t\tif ( json.emissive !== undefined && material.emissive !== undefined ) material.emissive.setHex( json.emissive );\n\t\tif ( json.specular !== undefined && material.specular !== undefined ) material.specular.setHex( json.specular );\n\t\tif ( json.specularIntensity !== undefined ) material.specularIntensity = json.specularIntensity;\n\t\tif ( json.specularColor !== undefined && material.specularColor !== undefined ) material.specularColor.setHex( json.specularColor );\n\t\tif ( json.shininess !== undefined ) material.shininess = json.shininess;\n\t\tif ( json.clearcoat !== undefined ) material.clearcoat = json.clearcoat;\n\t\tif ( json.clearcoatRoughness !== undefined ) material.clearcoatRoughness = json.clearcoatRoughness;\n\t\tif ( json.iridescence !== undefined ) material.iridescence = json.iridescence;\n\t\tif ( json.iridescenceIOR !== undefined ) material.iridescenceIOR = json.iridescenceIOR;\n\t\tif ( json.iridescenceThicknessRange !== undefined ) material.iridescenceThicknessRange = json.iridescenceThicknessRange;\n\t\tif ( json.transmission !== undefined ) material.transmission = json.transmission;\n\t\tif ( json.thickness !== undefined ) material.thickness = json.thickness;\n\t\tif ( json.attenuationDistance !== undefined ) material.attenuationDistance = json.attenuationDistance;\n\t\tif ( json.attenuationColor !== undefined && material.attenuationColor !== undefined ) material.attenuationColor.setHex( json.attenuationColor );\n\t\tif ( json.fog !== undefined ) material.fog = json.fog;\n\t\tif ( json.flatShading !== undefined ) material.flatShading = json.flatShading;\n\t\tif ( json.blending !== undefined ) material.blending = json.blending;\n\t\tif ( json.combine !== undefined ) material.combine = json.combine;\n\t\tif ( json.side !== undefined ) material.side = json.side;\n\t\tif ( json.shadowSide !== undefined ) material.shadowSide = json.shadowSide;\n\t\tif ( json.opacity !== undefined ) material.opacity = json.opacity;\n\t\tif ( json.transparent !== undefined ) material.transparent = json.transparent;\n\t\tif ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;\n\t\tif ( json.depthTest !== undefined ) material.depthTest = json.depthTest;\n\t\tif ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;\n\t\tif ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;\n\n\t\tif ( json.stencilWrite !== undefined ) material.stencilWrite = json.stencilWrite;\n\t\tif ( json.stencilWriteMask !== undefined ) material.stencilWriteMask = json.stencilWriteMask;\n\t\tif ( json.stencilFunc !== undefined ) material.stencilFunc = json.stencilFunc;\n\t\tif ( json.stencilRef !== undefined ) material.stencilRef = json.stencilRef;\n\t\tif ( json.stencilFuncMask !== undefined ) material.stencilFuncMask = json.stencilFuncMask;\n\t\tif ( json.stencilFail !== undefined ) material.stencilFail = json.stencilFail;\n\t\tif ( json.stencilZFail !== undefined ) material.stencilZFail = json.stencilZFail;\n\t\tif ( json.stencilZPass !== undefined ) material.stencilZPass = json.stencilZPass;\n\n\t\tif ( json.wireframe !== undefined ) material.wireframe = json.wireframe;\n\t\tif ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;\n\t\tif ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;\n\t\tif ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;\n\n\t\tif ( json.rotation !== undefined ) material.rotation = json.rotation;\n\n\t\tif ( json.linewidth !== 1 ) material.linewidth = json.linewidth;\n\t\tif ( json.dashSize !== undefined ) material.dashSize = json.dashSize;\n\t\tif ( json.gapSize !== undefined ) material.gapSize = json.gapSize;\n\t\tif ( json.scale !== undefined ) material.scale = json.scale;\n\n\t\tif ( json.polygonOffset !== undefined ) material.polygonOffset = json.polygonOffset;\n\t\tif ( json.polygonOffsetFactor !== undefined ) material.polygonOffsetFactor = json.polygonOffsetFactor;\n\t\tif ( json.polygonOffsetUnits !== undefined ) material.polygonOffsetUnits = json.polygonOffsetUnits;\n\n\t\tif ( json.dithering !== undefined ) material.dithering = json.dithering;\n\n\t\tif ( json.alphaToCoverage !== undefined ) material.alphaToCoverage = json.alphaToCoverage;\n\t\tif ( json.premultipliedAlpha !== undefined ) material.premultipliedAlpha = json.premultipliedAlpha;\n\t\tif ( json.forceSinglePass !== undefined ) material.forceSinglePass = json.forceSinglePass;\n\n\t\tif ( json.visible !== undefined ) material.visible = json.visible;\n\n\t\tif ( json.toneMapped !== undefined ) material.toneMapped = json.toneMapped;\n\n\t\tif ( json.userData !== undefined ) material.userData = json.userData;\n\n\t\tif ( json.vertexColors !== undefined ) {\n\n\t\t\tif ( typeof json.vertexColors === 'number' ) {\n\n\t\t\t\tmaterial.vertexColors = ( json.vertexColors > 0 ) ? true : false;\n\n\t\t\t} else {\n\n\t\t\t\tmaterial.vertexColors = json.vertexColors;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Shader Material\n\n\t\tif ( json.uniforms !== undefined ) {\n\n\t\t\tfor ( const name in json.uniforms ) {\n\n\t\t\t\tconst uniform = json.uniforms[ name ];\n\n\t\t\t\tmaterial.uniforms[ name ] = {};\n\n\t\t\t\tswitch ( uniform.type ) {\n\n\t\t\t\t\tcase 't':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = getTexture( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'c':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Color().setHex( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v2':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector2().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector3().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix3().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = uniform.value;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json.defines !== undefined ) material.defines = json.defines;\n\t\tif ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;\n\t\tif ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;\n\t\tif ( json.glslVersion !== undefined ) material.glslVersion = json.glslVersion;\n\n\t\tif ( json.extensions !== undefined ) {\n\n\t\t\tfor ( const key in json.extensions ) {\n\n\t\t\t\tmaterial.extensions[ key ] = json.extensions[ key ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// for PointsMaterial\n\n\t\tif ( json.size !== undefined ) material.size = json.size;\n\t\tif ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;\n\n\t\t// maps\n\n\t\tif ( json.map !== undefined ) material.map = getTexture( json.map );\n\t\tif ( json.matcap !== undefined ) material.matcap = getTexture( json.matcap );\n\n\t\tif ( json.alphaMap !== undefined ) material.alphaMap = getTexture( json.alphaMap );\n\n\t\tif ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );\n\t\tif ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;\n\n\t\tif ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );\n\t\tif ( json.normalMapType !== undefined ) material.normalMapType = json.normalMapType;\n\t\tif ( json.normalScale !== undefined ) {\n\n\t\t\tlet normalScale = json.normalScale;\n\n\t\t\tif ( Array.isArray( normalScale ) === false ) {\n\n\t\t\t\t// Blender exporter used to export a scalar. See #7459\n\n\t\t\t\tnormalScale = [ normalScale, normalScale ];\n\n\t\t\t}\n\n\t\t\tmaterial.normalScale = new Vector2().fromArray( normalScale );\n\n\t\t}\n\n\t\tif ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );\n\t\tif ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;\n\t\tif ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;\n\n\t\tif ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );\n\t\tif ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );\n\n\t\tif ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );\n\t\tif ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;\n\n\t\tif ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );\n\t\tif ( json.specularIntensityMap !== undefined ) material.specularIntensityMap = getTexture( json.specularIntensityMap );\n\t\tif ( json.specularColorMap !== undefined ) material.specularColorMap = getTexture( json.specularColorMap );\n\n\t\tif ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );\n\t\tif ( json.envMapIntensity !== undefined ) material.envMapIntensity = json.envMapIntensity;\n\n\t\tif ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;\n\t\tif ( json.refractionRatio !== undefined ) material.refractionRatio = json.refractionRatio;\n\n\t\tif ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );\n\t\tif ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;\n\n\t\tif ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );\n\t\tif ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;\n\n\t\tif ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap );\n\n\t\tif ( json.clearcoatMap !== undefined ) material.clearcoatMap = getTexture( json.clearcoatMap );\n\t\tif ( json.clearcoatRoughnessMap !== undefined ) material.clearcoatRoughnessMap = getTexture( json.clearcoatRoughnessMap );\n\t\tif ( json.clearcoatNormalMap !== undefined ) material.clearcoatNormalMap = getTexture( json.clearcoatNormalMap );\n\t\tif ( json.clearcoatNormalScale !== undefined ) material.clearcoatNormalScale = new Vector2().fromArray( json.clearcoatNormalScale );\n\n\t\tif ( json.iridescenceMap !== undefined ) material.iridescenceMap = getTexture( json.iridescenceMap );\n\t\tif ( json.iridescenceThicknessMap !== undefined ) material.iridescenceThicknessMap = getTexture( json.iridescenceThicknessMap );\n\n\t\tif ( json.transmissionMap !== undefined ) material.transmissionMap = getTexture( json.transmissionMap );\n\t\tif ( json.thicknessMap !== undefined ) material.thicknessMap = getTexture( json.thicknessMap );\n\n\t\tif ( json.sheenColorMap !== undefined ) material.sheenColorMap = getTexture( json.sheenColorMap );\n\t\tif ( json.sheenRoughnessMap !== undefined ) material.sheenRoughnessMap = getTexture( json.sheenRoughnessMap );\n\n\t\treturn material;\n\n\t}\n\n\tsetTextures( value ) {\n\n\t\tthis.textures = value;\n\t\treturn this;\n\n\t}\n\n\tstatic createMaterialFromType( type ) {\n\n\t\tconst materialLib = {\n\t\t\tShadowMaterial,\n\t\t\tSpriteMaterial,\n\t\t\tRawShaderMaterial,\n\t\t\tShaderMaterial,\n\t\t\tPointsMaterial,\n\t\t\tMeshPhysicalMaterial,\n\t\t\tMeshStandardMaterial,\n\t\t\tMeshPhongMaterial,\n\t\t\tMeshToonMaterial,\n\t\t\tMeshNormalMaterial,\n\t\t\tMeshLambertMaterial,\n\t\t\tMeshDepthMaterial,\n\t\t\tMeshDistanceMaterial,\n\t\t\tMeshBasicMaterial,\n\t\t\tMeshMatcapMaterial,\n\t\t\tLineDashedMaterial,\n\t\t\tLineBasicMaterial,\n\t\t\tMaterial\n\t\t};\n\n\t\treturn new materialLib[ type ]();\n\n\t}\n\n}\n\nclass LoaderUtils {\n\n\tstatic decodeText( array ) {\n\n\t\tif ( typeof TextDecoder !== 'undefined' ) {\n\n\t\t\treturn new TextDecoder().decode( array );\n\n\t\t}\n\n\t\t// Avoid the String.fromCharCode.apply(null, array) shortcut, which\n\t\t// throws a \"maximum call stack size exceeded\" error for large arrays.\n\n\t\tlet s = '';\n\n\t\tfor ( let i = 0, il = array.length; i < il; i ++ ) {\n\n\t\t\t// Implicitly assumes little-endian.\n\t\t\ts += String.fromCharCode( array[ i ] );\n\n\t\t}\n\n\t\ttry {\n\n\t\t\t// merges multi-byte utf-8 characters.\n\n\t\t\treturn decodeURIComponent( escape( s ) );\n\n\t\t} catch ( e ) { // see #16358\n\n\t\t\treturn s;\n\n\t\t}\n\n\t}\n\n\tstatic extractUrlBase( url ) {\n\n\t\tconst index = url.lastIndexOf( '/' );\n\n\t\tif ( index === - 1 ) return './';\n\n\t\treturn url.slice( 0, index + 1 );\n\n\t}\n\n\tstatic resolveURL( url, path ) {\n\n\t\t// Invalid URL\n\t\tif ( typeof url !== 'string' || url === '' ) return '';\n\n\t\t// Host Relative URL\n\t\tif ( /^https?:\\/\\//i.test( path ) && /^\\//.test( url ) ) {\n\n\t\t\tpath = path.replace( /(^https?:\\/\\/[^\\/]+).*/i, '$1' );\n\n\t\t}\n\n\t\t// Absolute URL http://,https://,//\n\t\tif ( /^(https?:)?\\/\\//i.test( url ) ) return url;\n\n\t\t// Data URI\n\t\tif ( /^data:.*,.*$/i.test( url ) ) return url;\n\n\t\t// Blob URL\n\t\tif ( /^blob:.*$/i.test( url ) ) return url;\n\n\t\t// Relative URL\n\t\treturn path + url;\n\n\t}\n\n}\n\nclass InstancedBufferGeometry extends BufferGeometry {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isInstancedBufferGeometry = true;\n\n\t\tthis.type = 'InstancedBufferGeometry';\n\t\tthis.instanceCount = Infinity;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.instanceCount = source.instanceCount;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.instanceCount = this.instanceCount;\n\n\t\tdata.isInstancedBufferGeometry = true;\n\n\t\treturn data;\n\n\t}\n\n}\n\nclass BufferGeometryLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tparse( json ) {\n\n\t\tconst interleavedBufferMap = {};\n\t\tconst arrayBufferMap = {};\n\n\t\tfunction getInterleavedBuffer( json, uuid ) {\n\n\t\t\tif ( interleavedBufferMap[ uuid ] !== undefined ) return interleavedBufferMap[ uuid ];\n\n\t\t\tconst interleavedBuffers = json.interleavedBuffers;\n\t\t\tconst interleavedBuffer = interleavedBuffers[ uuid ];\n\n\t\t\tconst buffer = getArrayBuffer( json, interleavedBuffer.buffer );\n\n\t\t\tconst array = getTypedArray( interleavedBuffer.type, buffer );\n\t\t\tconst ib = new InterleavedBuffer( array, interleavedBuffer.stride );\n\t\t\tib.uuid = interleavedBuffer.uuid;\n\n\t\t\tinterleavedBufferMap[ uuid ] = ib;\n\n\t\t\treturn ib;\n\n\t\t}\n\n\t\tfunction getArrayBuffer( json, uuid ) {\n\n\t\t\tif ( arrayBufferMap[ uuid ] !== undefined ) return arrayBufferMap[ uuid ];\n\n\t\t\tconst arrayBuffers = json.arrayBuffers;\n\t\t\tconst arrayBuffer = arrayBuffers[ uuid ];\n\n\t\t\tconst ab = new Uint32Array( arrayBuffer ).buffer;\n\n\t\t\tarrayBufferMap[ uuid ] = ab;\n\n\t\t\treturn ab;\n\n\t\t}\n\n\t\tconst geometry = json.isInstancedBufferGeometry ? new InstancedBufferGeometry() : new BufferGeometry();\n\n\t\tconst index = json.data.index;\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tconst typedArray = getTypedArray( index.type, index.array );\n\t\t\tgeometry.setIndex( new BufferAttribute( typedArray, 1 ) );\n\n\t\t}\n\n\t\tconst attributes = json.data.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\t\t\tlet bufferAttribute;\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\tconst interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );\n\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );\n\n\t\t\t} else {\n\n\t\t\t\tconst typedArray = getTypedArray( attribute.type, attribute.array );\n\t\t\t\tconst bufferAttributeConstr = attribute.isInstancedBufferAttribute ? InstancedBufferAttribute : BufferAttribute;\n\t\t\t\tbufferAttribute = new bufferAttributeConstr( typedArray, attribute.itemSize, attribute.normalized );\n\n\t\t\t}\n\n\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\tif ( attribute.usage !== undefined ) bufferAttribute.setUsage( attribute.usage );\n\n\t\t\tif ( attribute.updateRange !== undefined ) {\n\n\t\t\t\tbufferAttribute.updateRange.offset = attribute.updateRange.offset;\n\t\t\t\tbufferAttribute.updateRange.count = attribute.updateRange.count;\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( key, bufferAttribute );\n\n\t\t}\n\n\t\tconst morphAttributes = json.data.morphAttributes;\n\n\t\tif ( morphAttributes ) {\n\n\t\t\tfor ( const key in morphAttributes ) {\n\n\t\t\t\tconst attributeArray = morphAttributes[ key ];\n\n\t\t\t\tconst array = [];\n\n\t\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst attribute = attributeArray[ i ];\n\t\t\t\t\tlet bufferAttribute;\n\n\t\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );\n\t\t\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst typedArray = getTypedArray( attribute.type, attribute.array );\n\t\t\t\t\t\tbufferAttribute = new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\t\t\tarray.push( bufferAttribute );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.morphAttributes[ key ] = array;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst morphTargetsRelative = json.data.morphTargetsRelative;\n\n\t\tif ( morphTargetsRelative ) {\n\n\t\t\tgeometry.morphTargetsRelative = true;\n\n\t\t}\n\n\t\tconst groups = json.data.groups || json.data.drawcalls || json.data.offsets;\n\n\t\tif ( groups !== undefined ) {\n\n\t\t\tfor ( let i = 0, n = groups.length; i !== n; ++ i ) {\n\n\t\t\t\tconst group = groups[ i ];\n\n\t\t\t\tgeometry.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst boundingSphere = json.data.boundingSphere;\n\n\t\tif ( boundingSphere !== undefined ) {\n\n\t\t\tconst center = new Vector3();\n\n\t\t\tif ( boundingSphere.center !== undefined ) {\n\n\t\t\t\tcenter.fromArray( boundingSphere.center );\n\n\t\t\t}\n\n\t\t\tgeometry.boundingSphere = new Sphere( center, boundingSphere.radius );\n\n\t\t}\n\n\t\tif ( json.name ) geometry.name = json.name;\n\t\tif ( json.userData ) geometry.userData = json.userData;\n\n\t\treturn geometry;\n\n\t}\n\n}\n\nclass ObjectLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tlet json = null;\n\n\t\t\ttry {\n\n\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tif ( onError !== undefined ) onError( error );\n\n\t\t\t\tconsole.error( 'THREE:ObjectLoader: Can\\'t parse ' + url + '.', error.message );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst metadata = json.metadata;\n\n\t\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\t\tif ( onError !== undefined ) onError( new Error( 'THREE.ObjectLoader: Can\\'t load ' + url ) );\n\n\t\t\t\tconsole.error( 'THREE.ObjectLoader: Can\\'t load ' + url );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tscope.parse( json, onLoad );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\tasync loadAsync( url, onProgress ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tconst text = await loader.loadAsync( url, onProgress );\n\n\t\tconst json = JSON.parse( text );\n\n\t\tconst metadata = json.metadata;\n\n\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\tthrow new Error( 'THREE.ObjectLoader: Can\\'t load ' + url );\n\n\t\t}\n\n\t\treturn await scope.parseAsync( json );\n\n\t}\n\n\tparse( json, onLoad ) {\n\n\t\tconst animations = this.parseAnimations( json.animations );\n\t\tconst shapes = this.parseShapes( json.shapes );\n\t\tconst geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tconst images = this.parseImages( json.images, function () {\n\n\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t} );\n\n\t\tconst textures = this.parseTextures( json.textures, images );\n\t\tconst materials = this.parseMaterials( json.materials, textures );\n\n\t\tconst object = this.parseObject( json.object, geometries, materials, textures, animations );\n\t\tconst skeletons = this.parseSkeletons( json.skeletons, object );\n\n\t\tthis.bindSkeletons( object, skeletons );\n\n\t\t//\n\n\t\tif ( onLoad !== undefined ) {\n\n\t\t\tlet hasImages = false;\n\n\t\t\tfor ( const uuid in images ) {\n\n\t\t\t\tif ( images[ uuid ].data instanceof HTMLImageElement ) {\n\n\t\t\t\t\thasImages = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( hasImages === false ) onLoad( object );\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n\tasync parseAsync( json ) {\n\n\t\tconst animations = this.parseAnimations( json.animations );\n\t\tconst shapes = this.parseShapes( json.shapes );\n\t\tconst geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tconst images = await this.parseImagesAsync( json.images );\n\n\t\tconst textures = this.parseTextures( json.textures, images );\n\t\tconst materials = this.parseMaterials( json.materials, textures );\n\n\t\tconst object = this.parseObject( json.object, geometries, materials, textures, animations );\n\t\tconst skeletons = this.parseSkeletons( json.skeletons, object );\n\n\t\tthis.bindSkeletons( object, skeletons );\n\n\t\treturn object;\n\n\t}\n\n\tparseShapes( json ) {\n\n\t\tconst shapes = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst shape = new Shape().fromJSON( json[ i ] );\n\n\t\t\t\tshapes[ shape.uuid ] = shape;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn shapes;\n\n\t}\n\n\tparseSkeletons( json, object ) {\n\n\t\tconst skeletons = {};\n\t\tconst bones = {};\n\n\t\t// generate bone lookup table\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isBone ) bones[ child.uuid ] = child;\n\n\t\t} );\n\n\t\t// create skeletons\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst skeleton = new Skeleton().fromJSON( json[ i ], bones );\n\n\t\t\t\tskeletons[ skeleton.uuid ] = skeleton;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn skeletons;\n\n\t}\n\n\tparseGeometries( json, shapes ) {\n\n\t\tconst geometries = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst bufferGeometryLoader = new BufferGeometryLoader();\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tlet geometry;\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\tcase 'BufferGeometry':\n\t\t\t\t\tcase 'InstancedBufferGeometry':\n\n\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse( data );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( data.type in Geometries ) {\n\n\t\t\t\t\t\t\tgeometry = Geometries[ data.type ].fromJSON( data, shapes );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tconsole.warn( `THREE.ObjectLoader: Unsupported geometry type \"${ data.type }\"` );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) geometry.name = data.name;\n\t\t\t\tif ( geometry.isBufferGeometry === true && data.userData !== undefined ) geometry.userData = data.userData;\n\n\t\t\t\tgeometries[ data.uuid ] = geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn geometries;\n\n\t}\n\n\tparseMaterials( json, textures ) {\n\n\t\tconst cache = {}; // MultiMaterial\n\t\tconst materials = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst loader = new MaterialLoader();\n\t\t\tloader.setTextures( textures );\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tif ( cache[ data.uuid ] === undefined ) {\n\n\t\t\t\t\tcache[ data.uuid ] = loader.parse( data );\n\n\t\t\t\t}\n\n\t\t\t\tmaterials[ data.uuid ] = cache[ data.uuid ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn materials;\n\n\t}\n\n\tparseAnimations( json ) {\n\n\t\tconst animations = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0; i < json.length; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tconst clip = AnimationClip.parse( data );\n\n\t\t\t\tanimations[ clip.uuid ] = clip;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn animations;\n\n\t}\n\n\tparseImages( json, onLoad ) {\n\n\t\tconst scope = this;\n\t\tconst images = {};\n\n\t\tlet loader;\n\n\t\tfunction loadImage( url ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn loader.load( url, function () {\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, undefined, function () {\n\n\t\t\t\tscope.manager.itemError( url );\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tfunction deserializeImage( image ) {\n\n\t\t\tif ( typeof image === 'string' ) {\n\n\t\t\t\tconst url = image;\n\n\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( url ) ? url : scope.resourcePath + url;\n\n\t\t\t\treturn loadImage( path );\n\n\t\t\t} else {\n\n\t\t\t\tif ( image.data ) {\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: getTypedArray( image.type, image.data ),\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tconst manager = new LoadingManager( onLoad );\n\n\t\t\tloader = new ImageLoader( manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( let i = 0, il = json.length; i < il; i ++ ) {\n\n\t\t\t\tconst image = json[ i ];\n\t\t\t\tconst url = image.url;\n\n\t\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\tconst imageArray = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = url.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst currentUrl = url[ j ];\n\n\t\t\t\t\t\tconst deserializedImage = deserializeImage( currentUrl );\n\n\t\t\t\t\t\tif ( deserializedImage !== null ) {\n\n\t\t\t\t\t\t\tif ( deserializedImage instanceof HTMLImageElement ) {\n\n\t\t\t\t\t\t\t\timageArray.push( deserializedImage );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// special case: handle array of data textures for cube textures\n\n\t\t\t\t\t\t\t\timageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\timages[ image.uuid ] = new Source( imageArray );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tconst deserializedImage = deserializeImage( image.url );\n\t\t\t\t\timages[ image.uuid ] = new Source( deserializedImage );\n\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t}\n\n\tasync parseImagesAsync( json ) {\n\n\t\tconst scope = this;\n\t\tconst images = {};\n\n\t\tlet loader;\n\n\t\tasync function deserializeImage( image ) {\n\n\t\t\tif ( typeof image === 'string' ) {\n\n\t\t\t\tconst url = image;\n\n\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( url ) ? url : scope.resourcePath + url;\n\n\t\t\t\treturn await loader.loadAsync( path );\n\n\t\t\t} else {\n\n\t\t\t\tif ( image.data ) {\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: getTypedArray( image.type, image.data ),\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tloader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( let i = 0, il = json.length; i < il; i ++ ) {\n\n\t\t\t\tconst image = json[ i ];\n\t\t\t\tconst url = image.url;\n\n\t\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\tconst imageArray = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = url.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst currentUrl = url[ j ];\n\n\t\t\t\t\t\tconst deserializedImage = await deserializeImage( currentUrl );\n\n\t\t\t\t\t\tif ( deserializedImage !== null ) {\n\n\t\t\t\t\t\t\tif ( deserializedImage instanceof HTMLImageElement ) {\n\n\t\t\t\t\t\t\t\timageArray.push( deserializedImage );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// special case: handle array of data textures for cube textures\n\n\t\t\t\t\t\t\t\timageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\timages[ image.uuid ] = new Source( imageArray );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tconst deserializedImage = await deserializeImage( image.url );\n\t\t\t\t\timages[ image.uuid ] = new Source( deserializedImage );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t}\n\n\tparseTextures( json, images ) {\n\n\t\tfunction parseConstant( value, type ) {\n\n\t\t\tif ( typeof value === 'number' ) return value;\n\n\t\t\tconsole.warn( 'THREE.ObjectLoader.parseTexture: Constant should be in numeric form.', value );\n\n\t\t\treturn type[ value ];\n\n\t\t}\n\n\t\tconst textures = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tif ( data.image === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: No \"image\" specified for', data.uuid );\n\n\t\t\t\t}\n\n\t\t\t\tif ( images[ data.image ] === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined image', data.image );\n\n\t\t\t\t}\n\n\t\t\t\tconst source = images[ data.image ];\n\t\t\t\tconst image = source.data;\n\n\t\t\t\tlet texture;\n\n\t\t\t\tif ( Array.isArray( image ) ) {\n\n\t\t\t\t\ttexture = new CubeTexture();\n\n\t\t\t\t\tif ( image.length === 6 ) texture.needsUpdate = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( image && image.data ) {\n\n\t\t\t\t\t\ttexture = new DataTexture();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttexture = new Texture();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( image ) texture.needsUpdate = true; // textures can have undefined image data\n\n\t\t\t\t}\n\n\t\t\t\ttexture.source = source;\n\n\t\t\t\ttexture.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) texture.name = data.name;\n\n\t\t\t\tif ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING );\n\n\t\t\t\tif ( data.offset !== undefined ) texture.offset.fromArray( data.offset );\n\t\t\t\tif ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );\n\t\t\t\tif ( data.center !== undefined ) texture.center.fromArray( data.center );\n\t\t\t\tif ( data.rotation !== undefined ) texture.rotation = data.rotation;\n\n\t\t\t\tif ( data.wrap !== undefined ) {\n\n\t\t\t\t\ttexture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING );\n\t\t\t\t\ttexture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.format !== undefined ) texture.format = data.format;\n\t\t\t\tif ( data.type !== undefined ) texture.type = data.type;\n\t\t\t\tif ( data.encoding !== undefined ) texture.encoding = data.encoding;\n\n\t\t\t\tif ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;\n\n\t\t\t\tif ( data.flipY !== undefined ) texture.flipY = data.flipY;\n\n\t\t\t\tif ( data.generateMipmaps !== undefined ) texture.generateMipmaps = data.generateMipmaps;\n\t\t\t\tif ( data.premultiplyAlpha !== undefined ) texture.premultiplyAlpha = data.premultiplyAlpha;\n\t\t\t\tif ( data.unpackAlignment !== undefined ) texture.unpackAlignment = data.unpackAlignment;\n\n\t\t\t\tif ( data.userData !== undefined ) texture.userData = data.userData;\n\n\t\t\t\ttextures[ data.uuid ] = texture;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn textures;\n\n\t}\n\n\tparseObject( data, geometries, materials, textures, animations ) {\n\n\t\tlet object;\n\n\t\tfunction getGeometry( name ) {\n\n\t\t\tif ( geometries[ name ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined geometry', name );\n\n\t\t\t}\n\n\t\t\treturn geometries[ name ];\n\n\t\t}\n\n\t\tfunction getMaterial( name ) {\n\n\t\t\tif ( name === undefined ) return undefined;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\n\t\t\t\tconst array = [];\n\n\t\t\t\tfor ( let i = 0, l = name.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst uuid = name[ i ];\n\n\t\t\t\t\tif ( materials[ uuid ] === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', uuid );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tarray.push( materials[ uuid ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn array;\n\n\t\t\t}\n\n\t\t\tif ( materials[ name ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined material', name );\n\n\t\t\t}\n\n\t\t\treturn materials[ name ];\n\n\t\t}\n\n\t\tfunction getTexture( uuid ) {\n\n\t\t\tif ( textures[ uuid ] === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.ObjectLoader: Undefined texture', uuid );\n\n\t\t\t}\n\n\t\t\treturn textures[ uuid ];\n\n\t\t}\n\n\t\tlet geometry, material;\n\n\t\tswitch ( data.type ) {\n\n\t\t\tcase 'Scene':\n\n\t\t\t\tobject = new Scene();\n\n\t\t\t\tif ( data.background !== undefined ) {\n\n\t\t\t\t\tif ( Number.isInteger( data.background ) ) {\n\n\t\t\t\t\t\tobject.background = new Color( data.background );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tobject.background = getTexture( data.background );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.environment !== undefined ) {\n\n\t\t\t\t\tobject.environment = getTexture( data.environment );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.fog !== undefined ) {\n\n\t\t\t\t\tif ( data.fog.type === 'Fog' ) {\n\n\t\t\t\t\t\tobject.fog = new Fog( data.fog.color, data.fog.near, data.fog.far );\n\n\t\t\t\t\t} else if ( data.fog.type === 'FogExp2' ) {\n\n\t\t\t\t\t\tobject.fog = new FogExp2( data.fog.color, data.fog.density );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.backgroundBlurriness !== undefined ) object.backgroundBlurriness = data.backgroundBlurriness;\n\t\t\t\tif ( data.backgroundIntensity !== undefined ) object.backgroundIntensity = data.backgroundIntensity;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PerspectiveCamera':\n\n\t\t\t\tobject = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );\n\n\t\t\t\tif ( data.focus !== undefined ) object.focus = data.focus;\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;\n\t\t\t\tif ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'OrthographicCamera':\n\n\t\t\t\tobject = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );\n\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'AmbientLight':\n\n\t\t\t\tobject = new AmbientLight( data.color, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'DirectionalLight':\n\n\t\t\t\tobject = new DirectionalLight( data.color, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointLight':\n\n\t\t\t\tobject = new PointLight( data.color, data.intensity, data.distance, data.decay );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'RectAreaLight':\n\n\t\t\t\tobject = new RectAreaLight( data.color, data.intensity, data.width, data.height );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SpotLight':\n\n\t\t\t\tobject = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'HemisphereLight':\n\n\t\t\t\tobject = new HemisphereLight( data.color, data.groundColor, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LightProbe':\n\n\t\t\t\tobject = new LightProbe().fromJSON( data );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SkinnedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t \tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new SkinnedMesh( geometry, material );\n\n\t\t\t\tif ( data.bindMode !== undefined ) object.bindMode = data.bindMode;\n\t\t\t\tif ( data.bindMatrix !== undefined ) object.bindMatrix.fromArray( data.bindMatrix );\n\t\t\t\tif ( data.skeleton !== undefined ) object.skeleton = data.skeleton;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Mesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new Mesh( geometry, material );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'InstancedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\t\t\t\tconst count = data.count;\n\t\t\t\tconst instanceMatrix = data.instanceMatrix;\n\t\t\t\tconst instanceColor = data.instanceColor;\n\n\t\t\t\tobject = new InstancedMesh( geometry, material, count );\n\t\t\t\tobject.instanceMatrix = new InstancedBufferAttribute( new Float32Array( instanceMatrix.array ), 16 );\n\t\t\t\tif ( instanceColor !== undefined ) object.instanceColor = new InstancedBufferAttribute( new Float32Array( instanceColor.array ), instanceColor.itemSize );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LOD':\n\n\t\t\t\tobject = new LOD();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Line':\n\n\t\t\t\tobject = new Line( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineLoop':\n\n\t\t\t\tobject = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineSegments':\n\n\t\t\t\tobject = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointCloud':\n\t\t\tcase 'Points':\n\n\t\t\t\tobject = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Sprite':\n\n\t\t\t\tobject = new Sprite( getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Group':\n\n\t\t\t\tobject = new Group();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Bone':\n\n\t\t\t\tobject = new Bone();\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tobject = new Object3D();\n\n\t\t}\n\n\t\tobject.uuid = data.uuid;\n\n\t\tif ( data.name !== undefined ) object.name = data.name;\n\n\t\tif ( data.matrix !== undefined ) {\n\n\t\t\tobject.matrix.fromArray( data.matrix );\n\n\t\t\tif ( data.matrixAutoUpdate !== undefined ) object.matrixAutoUpdate = data.matrixAutoUpdate;\n\t\t\tif ( object.matrixAutoUpdate ) object.matrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t} else {\n\n\t\t\tif ( data.position !== undefined ) object.position.fromArray( data.position );\n\t\t\tif ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );\n\t\t\tif ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );\n\t\t\tif ( data.scale !== undefined ) object.scale.fromArray( data.scale );\n\n\t\t}\n\n\t\tif ( data.castShadow !== undefined ) object.castShadow = data.castShadow;\n\t\tif ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;\n\n\t\tif ( data.shadow ) {\n\n\t\t\tif ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;\n\t\t\tif ( data.shadow.normalBias !== undefined ) object.shadow.normalBias = data.shadow.normalBias;\n\t\t\tif ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;\n\t\t\tif ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );\n\t\t\tif ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );\n\n\t\t}\n\n\t\tif ( data.visible !== undefined ) object.visible = data.visible;\n\t\tif ( data.frustumCulled !== undefined ) object.frustumCulled = data.frustumCulled;\n\t\tif ( data.renderOrder !== undefined ) object.renderOrder = data.renderOrder;\n\t\tif ( data.userData !== undefined ) object.userData = data.userData;\n\t\tif ( data.layers !== undefined ) object.layers.mask = data.layers;\n\n\t\tif ( data.children !== undefined ) {\n\n\t\t\tconst children = data.children;\n\n\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\tobject.add( this.parseObject( children[ i ], geometries, materials, textures, animations ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.animations !== undefined ) {\n\n\t\t\tconst objectAnimations = data.animations;\n\n\t\t\tfor ( let i = 0; i < objectAnimations.length; i ++ ) {\n\n\t\t\t\tconst uuid = objectAnimations[ i ];\n\n\t\t\t\tobject.animations.push( animations[ uuid ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.type === 'LOD' ) {\n\n\t\t\tif ( data.autoUpdate !== undefined ) object.autoUpdate = data.autoUpdate;\n\n\t\t\tconst levels = data.levels;\n\n\t\t\tfor ( let l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\tconst level = levels[ l ];\n\t\t\t\tconst child = object.getObjectByProperty( 'uuid', level.object );\n\n\t\t\t\tif ( child !== undefined ) {\n\n\t\t\t\t\tobject.addLevel( child, level.distance, level.hysteresis );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n\tbindSkeletons( object, skeletons ) {\n\n\t\tif ( Object.keys( skeletons ).length === 0 ) return;\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isSkinnedMesh === true && child.skeleton !== undefined ) {\n\n\t\t\t\tconst skeleton = skeletons[ child.skeleton ];\n\n\t\t\t\tif ( skeleton === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.ObjectLoader: No skeleton found with UUID:', child.skeleton );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tchild.bind( skeleton, child.bindMatrix );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n}\n\nconst TEXTURE_MAPPING = {\n\tUVMapping: UVMapping,\n\tCubeReflectionMapping: CubeReflectionMapping,\n\tCubeRefractionMapping: CubeRefractionMapping,\n\tEquirectangularReflectionMapping: EquirectangularReflectionMapping,\n\tEquirectangularRefractionMapping: EquirectangularRefractionMapping,\n\tCubeUVReflectionMapping: CubeUVReflectionMapping\n};\n\nconst TEXTURE_WRAPPING = {\n\tRepeatWrapping: RepeatWrapping,\n\tClampToEdgeWrapping: ClampToEdgeWrapping,\n\tMirroredRepeatWrapping: MirroredRepeatWrapping\n};\n\nconst TEXTURE_FILTER = {\n\tNearestFilter: NearestFilter,\n\tNearestMipmapNearestFilter: NearestMipmapNearestFilter,\n\tNearestMipmapLinearFilter: NearestMipmapLinearFilter,\n\tLinearFilter: LinearFilter,\n\tLinearMipmapNearestFilter: LinearMipmapNearestFilter,\n\tLinearMipmapLinearFilter: LinearMipmapLinearFilter\n};\n\nclass ImageBitmapLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.isImageBitmapLoader = true;\n\n\t\tif ( typeof createImageBitmap === 'undefined' ) {\n\n\t\t\tconsole.warn( 'THREE.ImageBitmapLoader: createImageBitmap() not supported.' );\n\n\t\t}\n\n\t\tif ( typeof fetch === 'undefined' ) {\n\n\t\t\tconsole.warn( 'THREE.ImageBitmapLoader: fetch() not supported.' );\n\n\t\t}\n\n\t\tthis.options = { premultiplyAlpha: 'none' };\n\n\t}\n\n\tsetOptions( options ) {\n\n\t\tthis.options = options;\n\n\t\treturn this;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst cached = Cache.get( url );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tconst fetchOptions = {};\n\t\tfetchOptions.credentials = ( this.crossOrigin === 'anonymous' ) ? 'same-origin' : 'include';\n\t\tfetchOptions.headers = this.requestHeader;\n\n\t\tfetch( url, fetchOptions ).then( function ( res ) {\n\n\t\t\treturn res.blob();\n\n\t\t} ).then( function ( blob ) {\n\n\t\t\treturn createImageBitmap( blob, Object.assign( scope.options, { colorSpaceConversion: 'none' } ) );\n\n\t\t} ).then( function ( imageBitmap ) {\n\n\t\t\tCache.add( url, imageBitmap );\n\n\t\t\tif ( onLoad ) onLoad( imageBitmap );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t} ).catch( function ( e ) {\n\n\t\t\tif ( onError ) onError( e );\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t} );\n\n\t\tscope.manager.itemStart( url );\n\n\t}\n\n}\n\nlet _context;\n\nclass AudioContext {\n\n\tstatic getContext() {\n\n\t\tif ( _context === undefined ) {\n\n\t\t\t_context = new ( window.AudioContext || window.webkitAudioContext )();\n\n\t\t}\n\n\t\treturn _context;\n\n\t}\n\n\tstatic setContext( value ) {\n\n\t\t_context = value;\n\n\t}\n\n}\n\nclass AudioLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\ttry {\n\n\t\t\t\t// Create a copy of the buffer. The `decodeAudioData` method\n\t\t\t\t// detaches the buffer when complete, preventing reuse.\n\t\t\t\tconst bufferCopy = buffer.slice( 0 );\n\n\t\t\t\tconst context = AudioContext.getContext();\n\t\t\t\tcontext.decodeAudioData( bufferCopy, function ( audioBuffer ) {\n\n\t\t\t\t\tonLoad( audioBuffer );\n\n\t\t\t\t} );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n}\n\nclass HemisphereLightProbe extends LightProbe {\n\n\tconstructor( skyColor, groundColor, intensity = 1 ) {\n\n\t\tsuper( undefined, intensity );\n\n\t\tthis.isHemisphereLightProbe = true;\n\n\t\tconst color1 = new Color().set( skyColor );\n\t\tconst color2 = new Color().set( groundColor );\n\n\t\tconst sky = new Vector3( color1.r, color1.g, color1.b );\n\t\tconst ground = new Vector3( color2.r, color2.g, color2.b );\n\n\t\t// without extra factor of PI in the shader, should = 1 / Math.sqrt( Math.PI );\n\t\tconst c0 = Math.sqrt( Math.PI );\n\t\tconst c1 = c0 * Math.sqrt( 0.75 );\n\n\t\tthis.sh.coefficients[ 0 ].copy( sky ).add( ground ).multiplyScalar( c0 );\n\t\tthis.sh.coefficients[ 1 ].copy( sky ).sub( ground ).multiplyScalar( c1 );\n\n\t}\n\n}\n\nclass AmbientLightProbe extends LightProbe {\n\n\tconstructor( color, intensity = 1 ) {\n\n\t\tsuper( undefined, intensity );\n\n\t\tthis.isAmbientLightProbe = true;\n\n\t\tconst color1 = new Color().set( color );\n\n\t\t// without extra factor of PI in the shader, would be 2 / Math.sqrt( Math.PI );\n\t\tthis.sh.coefficients[ 0 ].set( color1.r, color1.g, color1.b ).multiplyScalar( 2 * Math.sqrt( Math.PI ) );\n\n\t}\n\n}\n\nconst _eyeRight = /*@__PURE__*/ new Matrix4();\nconst _eyeLeft = /*@__PURE__*/ new Matrix4();\nconst _projectionMatrix = /*@__PURE__*/ new Matrix4();\n\nclass StereoCamera {\n\n\tconstructor() {\n\n\t\tthis.type = 'StereoCamera';\n\n\t\tthis.aspect = 1;\n\n\t\tthis.eyeSep = 0.064;\n\n\t\tthis.cameraL = new PerspectiveCamera();\n\t\tthis.cameraL.layers.enable( 1 );\n\t\tthis.cameraL.matrixAutoUpdate = false;\n\n\t\tthis.cameraR = new PerspectiveCamera();\n\t\tthis.cameraR.layers.enable( 2 );\n\t\tthis.cameraR.matrixAutoUpdate = false;\n\n\t\tthis._cache = {\n\t\t\tfocus: null,\n\t\t\tfov: null,\n\t\t\taspect: null,\n\t\t\tnear: null,\n\t\t\tfar: null,\n\t\t\tzoom: null,\n\t\t\teyeSep: null\n\t\t};\n\n\t}\n\n\tupdate( camera ) {\n\n\t\tconst cache = this._cache;\n\n\t\tconst needsUpdate = cache.focus !== camera.focus || cache.fov !== camera.fov ||\n\t\t\tcache.aspect !== camera.aspect * this.aspect || cache.near !== camera.near ||\n\t\t\tcache.far !== camera.far || cache.zoom !== camera.zoom || cache.eyeSep !== this.eyeSep;\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tcache.focus = camera.focus;\n\t\t\tcache.fov = camera.fov;\n\t\t\tcache.aspect = camera.aspect * this.aspect;\n\t\t\tcache.near = camera.near;\n\t\t\tcache.far = camera.far;\n\t\t\tcache.zoom = camera.zoom;\n\t\t\tcache.eyeSep = this.eyeSep;\n\n\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\t_projectionMatrix.copy( camera.projectionMatrix );\n\t\t\tconst eyeSepHalf = cache.eyeSep / 2;\n\t\t\tconst eyeSepOnProjection = eyeSepHalf * cache.near / cache.focus;\n\t\t\tconst ymax = ( cache.near * Math.tan( DEG2RAD * cache.fov * 0.5 ) ) / cache.zoom;\n\t\t\tlet xmin, xmax;\n\n\t\t\t// translate xOffset\n\n\t\t\t_eyeLeft.elements[ 12 ] = - eyeSepHalf;\n\t\t\t_eyeRight.elements[ 12 ] = eyeSepHalf;\n\n\t\t\t// for left eye\n\n\t\t\txmin = - ymax * cache.aspect + eyeSepOnProjection;\n\t\t\txmax = ymax * cache.aspect + eyeSepOnProjection;\n\n\t\t\t_projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );\n\t\t\t_projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\tthis.cameraL.projectionMatrix.copy( _projectionMatrix );\n\n\t\t\t// for right eye\n\n\t\t\txmin = - ymax * cache.aspect - eyeSepOnProjection;\n\t\t\txmax = ymax * cache.aspect - eyeSepOnProjection;\n\n\t\t\t_projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );\n\t\t\t_projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\tthis.cameraR.projectionMatrix.copy( _projectionMatrix );\n\n\t\t}\n\n\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeLeft );\n\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeRight );\n\n\t}\n\n}\n\nclass Clock {\n\n\tconstructor( autoStart = true ) {\n\n\t\tthis.autoStart = autoStart;\n\n\t\tthis.startTime = 0;\n\t\tthis.oldTime = 0;\n\t\tthis.elapsedTime = 0;\n\n\t\tthis.running = false;\n\n\t}\n\n\tstart() {\n\n\t\tthis.startTime = now();\n\n\t\tthis.oldTime = this.startTime;\n\t\tthis.elapsedTime = 0;\n\t\tthis.running = true;\n\n\t}\n\n\tstop() {\n\n\t\tthis.getElapsedTime();\n\t\tthis.running = false;\n\t\tthis.autoStart = false;\n\n\t}\n\n\tgetElapsedTime() {\n\n\t\tthis.getDelta();\n\t\treturn this.elapsedTime;\n\n\t}\n\n\tgetDelta() {\n\n\t\tlet diff = 0;\n\n\t\tif ( this.autoStart && ! this.running ) {\n\n\t\t\tthis.start();\n\t\t\treturn 0;\n\n\t\t}\n\n\t\tif ( this.running ) {\n\n\t\t\tconst newTime = now();\n\n\t\t\tdiff = ( newTime - this.oldTime ) / 1000;\n\t\t\tthis.oldTime = newTime;\n\n\t\t\tthis.elapsedTime += diff;\n\n\t\t}\n\n\t\treturn diff;\n\n\t}\n\n}\n\nfunction now() {\n\n\treturn ( typeof performance === 'undefined' ? Date : performance ).now(); // see #10732\n\n}\n\nconst _position$1 = /*@__PURE__*/ new Vector3();\nconst _quaternion$1 = /*@__PURE__*/ new Quaternion();\nconst _scale$1 = /*@__PURE__*/ new Vector3();\nconst _orientation$1 = /*@__PURE__*/ new Vector3();\n\nclass AudioListener extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'AudioListener';\n\n\t\tthis.context = AudioContext.getContext();\n\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( this.context.destination );\n\n\t\tthis.filter = null;\n\n\t\tthis.timeDelta = 0;\n\n\t\t// private\n\n\t\tthis._clock = new Clock();\n\n\t}\n\n\tgetInput() {\n\n\t\treturn this.gain;\n\n\t}\n\n\tremoveFilter() {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\t\t\tthis.gain.connect( this.context.destination );\n\t\t\tthis.filter = null;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetFilter() {\n\n\t\treturn this.filter;\n\n\t}\n\n\tsetFilter( value ) {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\n\t\t} else {\n\n\t\t\tthis.gain.disconnect( this.context.destination );\n\n\t\t}\n\n\t\tthis.filter = value;\n\t\tthis.gain.connect( this.filter );\n\t\tthis.filter.connect( this.context.destination );\n\n\t\treturn this;\n\n\t}\n\n\tgetMasterVolume() {\n\n\t\treturn this.gain.gain.value;\n\n\t}\n\n\tsetMasterVolume( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tconst listener = this.context.listener;\n\t\tconst up = this.up;\n\n\t\tthis.timeDelta = this._clock.getDelta();\n\n\t\tthis.matrixWorld.decompose( _position$1, _quaternion$1, _scale$1 );\n\n\t\t_orientation$1.set( 0, 0, - 1 ).applyQuaternion( _quaternion$1 );\n\n\t\tif ( listener.positionX ) {\n\n\t\t\t// code path for Chrome (see #14393)\n\n\t\t\tconst endTime = this.context.currentTime + this.timeDelta;\n\n\t\t\tlistener.positionX.linearRampToValueAtTime( _position$1.x, endTime );\n\t\t\tlistener.positionY.linearRampToValueAtTime( _position$1.y, endTime );\n\t\t\tlistener.positionZ.linearRampToValueAtTime( _position$1.z, endTime );\n\t\t\tlistener.forwardX.linearRampToValueAtTime( _orientation$1.x, endTime );\n\t\t\tlistener.forwardY.linearRampToValueAtTime( _orientation$1.y, endTime );\n\t\t\tlistener.forwardZ.linearRampToValueAtTime( _orientation$1.z, endTime );\n\t\t\tlistener.upX.linearRampToValueAtTime( up.x, endTime );\n\t\t\tlistener.upY.linearRampToValueAtTime( up.y, endTime );\n\t\t\tlistener.upZ.linearRampToValueAtTime( up.z, endTime );\n\n\t\t} else {\n\n\t\t\tlistener.setPosition( _position$1.x, _position$1.y, _position$1.z );\n\t\t\tlistener.setOrientation( _orientation$1.x, _orientation$1.y, _orientation$1.z, up.x, up.y, up.z );\n\n\t\t}\n\n\t}\n\n}\n\nclass Audio extends Object3D {\n\n\tconstructor( listener ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Audio';\n\n\t\tthis.listener = listener;\n\t\tthis.context = listener.context;\n\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( listener.getInput() );\n\n\t\tthis.autoplay = false;\n\n\t\tthis.buffer = null;\n\t\tthis.detune = 0;\n\t\tthis.loop = false;\n\t\tthis.loopStart = 0;\n\t\tthis.loopEnd = 0;\n\t\tthis.offset = 0;\n\t\tthis.duration = undefined;\n\t\tthis.playbackRate = 1;\n\t\tthis.isPlaying = false;\n\t\tthis.hasPlaybackControl = true;\n\t\tthis.source = null;\n\t\tthis.sourceType = 'empty';\n\n\t\tthis._startedAt = 0;\n\t\tthis._progress = 0;\n\t\tthis._connected = false;\n\n\t\tthis.filters = [];\n\n\t}\n\n\tgetOutput() {\n\n\t\treturn this.gain;\n\n\t}\n\n\tsetNodeSource( audioNode ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'audioNode';\n\t\tthis.source = audioNode;\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\tsetMediaElementSource( mediaElement ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaNode';\n\t\tthis.source = this.context.createMediaElementSource( mediaElement );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\tsetMediaStreamSource( mediaStream ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaStreamNode';\n\t\tthis.source = this.context.createMediaStreamSource( mediaStream );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\tsetBuffer( audioBuffer ) {\n\n\t\tthis.buffer = audioBuffer;\n\t\tthis.sourceType = 'buffer';\n\n\t\tif ( this.autoplay ) this.play();\n\n\t\treturn this;\n\n\t}\n\n\tplay( delay = 0 ) {\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: Audio is already playing.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._startedAt = this.context.currentTime + delay;\n\n\t\tconst source = this.context.createBufferSource();\n\t\tsource.buffer = this.buffer;\n\t\tsource.loop = this.loop;\n\t\tsource.loopStart = this.loopStart;\n\t\tsource.loopEnd = this.loopEnd;\n\t\tsource.onended = this.onEnded.bind( this );\n\t\tsource.start( this._startedAt, this._progress + this.offset, this.duration );\n\n\t\tthis.isPlaying = true;\n\n\t\tthis.source = source;\n\n\t\tthis.setDetune( this.detune );\n\t\tthis.setPlaybackRate( this.playbackRate );\n\n\t\treturn this.connect();\n\n\t}\n\n\tpause() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\t// update current progress\n\n\t\t\tthis._progress += Math.max( this.context.currentTime - this._startedAt, 0 ) * this.playbackRate;\n\n\t\t\tif ( this.loop === true ) {\n\n\t\t\t\t// ensure _progress does not exceed duration with looped audios\n\n\t\t\t\tthis._progress = this._progress % ( this.duration || this.buffer.duration );\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.source.onended = null;\n\n\t\t\tthis.isPlaying = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tstop() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._progress = 0;\n\n\t\tthis.source.stop();\n\t\tthis.source.onended = null;\n\t\tthis.isPlaying = false;\n\n\t\treturn this;\n\n\t}\n\n\tconnect() {\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.connect( this.filters[ 0 ] );\n\n\t\t\tfor ( let i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].connect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].connect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.connect( this.getOutput() );\n\n\t\t}\n\n\t\tthis._connected = true;\n\n\t\treturn this;\n\n\t}\n\n\tdisconnect() {\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.disconnect( this.filters[ 0 ] );\n\n\t\t\tfor ( let i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].disconnect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.disconnect( this.getOutput() );\n\n\t\t}\n\n\t\tthis._connected = false;\n\n\t\treturn this;\n\n\t}\n\n\tgetFilters() {\n\n\t\treturn this.filters;\n\n\t}\n\n\tsetFilters( value ) {\n\n\t\tif ( ! value ) value = [];\n\n\t\tif ( this._connected === true ) {\n\n\t\t\tthis.disconnect();\n\t\t\tthis.filters = value.slice();\n\t\t\tthis.connect();\n\n\t\t} else {\n\n\t\t\tthis.filters = value.slice();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetDetune( value ) {\n\n\t\tthis.detune = value;\n\n\t\tif ( this.source.detune === undefined ) return; // only set detune when available\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.detune.setTargetAtTime( this.detune, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetDetune() {\n\n\t\treturn this.detune;\n\n\t}\n\n\tgetFilter() {\n\n\t\treturn this.getFilters()[ 0 ];\n\n\t}\n\n\tsetFilter( filter ) {\n\n\t\treturn this.setFilters( filter ? [ filter ] : [] );\n\n\t}\n\n\tsetPlaybackRate( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.playbackRate = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.playbackRate.setTargetAtTime( this.playbackRate, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetPlaybackRate() {\n\n\t\treturn this.playbackRate;\n\n\t}\n\n\tonEnded() {\n\n\t\tthis.isPlaying = false;\n\n\t}\n\n\tgetLoop() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn this.loop;\n\n\t}\n\n\tsetLoop( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\tconsole.warn( 'THREE.Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.loop = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.loop = this.loop;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetLoopStart( value ) {\n\n\t\tthis.loopStart = value;\n\n\t\treturn this;\n\n\t}\n\n\tsetLoopEnd( value ) {\n\n\t\tthis.loopEnd = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetVolume() {\n\n\t\treturn this.gain.gain.value;\n\n\t}\n\n\tsetVolume( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _position = /*@__PURE__*/ new Vector3();\nconst _quaternion = /*@__PURE__*/ new Quaternion();\nconst _scale = /*@__PURE__*/ new Vector3();\nconst _orientation = /*@__PURE__*/ new Vector3();\n\nclass PositionalAudio extends Audio {\n\n\tconstructor( listener ) {\n\n\t\tsuper( listener );\n\n\t\tthis.panner = this.context.createPanner();\n\t\tthis.panner.panningModel = 'HRTF';\n\t\tthis.panner.connect( this.gain );\n\n\t}\n\n\tdisconnect() {\n\n\t\tsuper.disconnect();\n\n\t\tthis.panner.disconnect( this.gain );\n\n\t}\n\n\tgetOutput() {\n\n\t\treturn this.panner;\n\n\t}\n\n\tgetRefDistance() {\n\n\t\treturn this.panner.refDistance;\n\n\t}\n\n\tsetRefDistance( value ) {\n\n\t\tthis.panner.refDistance = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetRolloffFactor() {\n\n\t\treturn this.panner.rolloffFactor;\n\n\t}\n\n\tsetRolloffFactor( value ) {\n\n\t\tthis.panner.rolloffFactor = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetDistanceModel() {\n\n\t\treturn this.panner.distanceModel;\n\n\t}\n\n\tsetDistanceModel( value ) {\n\n\t\tthis.panner.distanceModel = value;\n\n\t\treturn this;\n\n\t}\n\n\tgetMaxDistance() {\n\n\t\treturn this.panner.maxDistance;\n\n\t}\n\n\tsetMaxDistance( value ) {\n\n\t\tthis.panner.maxDistance = value;\n\n\t\treturn this;\n\n\t}\n\n\tsetDirectionalCone( coneInnerAngle, coneOuterAngle, coneOuterGain ) {\n\n\t\tthis.panner.coneInnerAngle = coneInnerAngle;\n\t\tthis.panner.coneOuterAngle = coneOuterAngle;\n\t\tthis.panner.coneOuterGain = coneOuterGain;\n\n\t\treturn this;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tif ( this.hasPlaybackControl === true && this.isPlaying === false ) return;\n\n\t\tthis.matrixWorld.decompose( _position, _quaternion, _scale );\n\n\t\t_orientation.set( 0, 0, 1 ).applyQuaternion( _quaternion );\n\n\t\tconst panner = this.panner;\n\n\t\tif ( panner.positionX ) {\n\n\t\t\t// code path for Chrome and Firefox (see #14393)\n\n\t\t\tconst endTime = this.context.currentTime + this.listener.timeDelta;\n\n\t\t\tpanner.positionX.linearRampToValueAtTime( _position.x, endTime );\n\t\t\tpanner.positionY.linearRampToValueAtTime( _position.y, endTime );\n\t\t\tpanner.positionZ.linearRampToValueAtTime( _position.z, endTime );\n\t\t\tpanner.orientationX.linearRampToValueAtTime( _orientation.x, endTime );\n\t\t\tpanner.orientationY.linearRampToValueAtTime( _orientation.y, endTime );\n\t\t\tpanner.orientationZ.linearRampToValueAtTime( _orientation.z, endTime );\n\n\t\t} else {\n\n\t\t\tpanner.setPosition( _position.x, _position.y, _position.z );\n\t\t\tpanner.setOrientation( _orientation.x, _orientation.y, _orientation.z );\n\n\t\t}\n\n\t}\n\n}\n\nclass AudioAnalyser {\n\n\tconstructor( audio, fftSize = 2048 ) {\n\n\t\tthis.analyser = audio.context.createAnalyser();\n\t\tthis.analyser.fftSize = fftSize;\n\n\t\tthis.data = new Uint8Array( this.analyser.frequencyBinCount );\n\n\t\taudio.getOutput().connect( this.analyser );\n\n\t}\n\n\n\tgetFrequencyData() {\n\n\t\tthis.analyser.getByteFrequencyData( this.data );\n\n\t\treturn this.data;\n\n\t}\n\n\tgetAverageFrequency() {\n\n\t\tlet value = 0;\n\t\tconst data = this.getFrequencyData();\n\n\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\tvalue += data[ i ];\n\n\t\t}\n\n\t\treturn value / data.length;\n\n\t}\n\n}\n\nclass PropertyMixer {\n\n\tconstructor( binding, typeName, valueSize ) {\n\n\t\tthis.binding = binding;\n\t\tthis.valueSize = valueSize;\n\n\t\tlet mixFunction,\n\t\t\tmixFunctionAdditive,\n\t\t\tsetIdentity;\n\n\t\t// buffer layout: [ incoming | accu0 | accu1 | orig | addAccu | (optional work) ]\n\t\t//\n\t\t// interpolators can use .buffer as their .result\n\t\t// the data then goes to 'incoming'\n\t\t//\n\t\t// 'accu0' and 'accu1' are used frame-interleaved for\n\t\t// the cumulative result and are compared to detect\n\t\t// changes\n\t\t//\n\t\t// 'orig' stores the original state of the property\n\t\t//\n\t\t// 'add' is used for additive cumulative results\n\t\t//\n\t\t// 'work' is optional and is only present for quaternion types. It is used\n\t\t// to store intermediate quaternion multiplication results\n\n\t\tswitch ( typeName ) {\n\n\t\t\tcase 'quaternion':\n\t\t\t\tmixFunction = this._slerp;\n\t\t\t\tmixFunctionAdditive = this._slerpAdditive;\n\t\t\t\tsetIdentity = this._setAdditiveIdentityQuaternion;\n\n\t\t\t\tthis.buffer = new Float64Array( valueSize * 6 );\n\t\t\t\tthis._workIndex = 5;\n\t\t\t\tbreak;\n\n\t\t\tcase 'string':\n\t\t\tcase 'bool':\n\t\t\t\tmixFunction = this._select;\n\n\t\t\t\t// Use the regular mix function and for additive on these types,\n\t\t\t\t// additive is not relevant for non-numeric types\n\t\t\t\tmixFunctionAdditive = this._select;\n\n\t\t\t\tsetIdentity = this._setAdditiveIdentityOther;\n\n\t\t\t\tthis.buffer = new Array( valueSize * 5 );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tmixFunction = this._lerp;\n\t\t\t\tmixFunctionAdditive = this._lerpAdditive;\n\t\t\t\tsetIdentity = this._setAdditiveIdentityNumeric;\n\n\t\t\t\tthis.buffer = new Float64Array( valueSize * 5 );\n\n\t\t}\n\n\t\tthis._mixBufferRegion = mixFunction;\n\t\tthis._mixBufferRegionAdditive = mixFunctionAdditive;\n\t\tthis._setIdentity = setIdentity;\n\t\tthis._origIndex = 3;\n\t\tthis._addIndex = 4;\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\tthis.useCount = 0;\n\t\tthis.referenceCount = 0;\n\n\t}\n\n\t// accumulate data in the 'incoming' region into 'accu<i>'\n\taccumulate( accuIndex, weight ) {\n\n\t\t// note: happily accumulating nothing when weight = 0, the caller knows\n\t\t// the weight and shouldn't have made the call in the first place\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = accuIndex * stride + stride;\n\n\t\tlet currentWeight = this.cumulativeWeight;\n\n\t\tif ( currentWeight === 0 ) {\n\n\t\t\t// accuN := incoming * weight\n\n\t\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ offset + i ] = buffer[ i ];\n\n\t\t\t}\n\n\t\t\tcurrentWeight = weight;\n\n\t\t} else {\n\n\t\t\t// accuN := accuN + incoming * weight\n\n\t\t\tcurrentWeight += weight;\n\t\t\tconst mix = weight / currentWeight;\n\t\t\tthis._mixBufferRegion( buffer, offset, 0, mix, stride );\n\n\t\t}\n\n\t\tthis.cumulativeWeight = currentWeight;\n\n\t}\n\n\t// accumulate data in the 'incoming' region into 'add'\n\taccumulateAdditive( weight ) {\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = stride * this._addIndex;\n\n\t\tif ( this.cumulativeWeightAdditive === 0 ) {\n\n\t\t\t// add = identity\n\n\t\t\tthis._setIdentity();\n\n\t\t}\n\n\t\t// add := add + incoming * weight\n\n\t\tthis._mixBufferRegionAdditive( buffer, offset, 0, weight, stride );\n\t\tthis.cumulativeWeightAdditive += weight;\n\n\t}\n\n\t// apply the state of 'accu<i>' to the binding when accus differ\n\tapply( accuIndex ) {\n\n\t\tconst stride = this.valueSize,\n\t\t\tbuffer = this.buffer,\n\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\tweight = this.cumulativeWeight,\n\t\t\tweightAdditive = this.cumulativeWeightAdditive,\n\n\t\t\tbinding = this.binding;\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\tif ( weight < 1 ) {\n\n\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\n\t\t\tconst originalValueOffset = stride * this._origIndex;\n\n\t\t\tthis._mixBufferRegion(\n\t\t\t\tbuffer, offset, originalValueOffset, 1 - weight, stride );\n\n\t\t}\n\n\t\tif ( weightAdditive > 0 ) {\n\n\t\t\t// accuN := accuN + additive accuN\n\n\t\t\tthis._mixBufferRegionAdditive( buffer, offset, this._addIndex * stride, 1, stride );\n\n\t\t}\n\n\t\tfor ( let i = stride, e = stride + stride; i !== e; ++ i ) {\n\n\t\t\tif ( buffer[ i ] !== buffer[ i + stride ] ) {\n\n\t\t\t\t// value has changed -> update scene graph\n\n\t\t\t\tbinding.setValue( buffer, offset );\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// remember the state of the bound property and copy it to both accus\n\tsaveOriginalState() {\n\n\t\tconst binding = this.binding;\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\n\t\t\toriginalValueOffset = stride * this._origIndex;\n\n\t\tbinding.getValue( buffer, originalValueOffset );\n\n\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\tfor ( let i = stride, e = originalValueOffset; i !== e; ++ i ) {\n\n\t\t\tbuffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];\n\n\t\t}\n\n\t\t// Add to identity for additive\n\t\tthis._setIdentity();\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t}\n\n\t// apply the state previously taken via 'saveOriginalState' to the binding\n\trestoreOriginalState() {\n\n\t\tconst originalValueOffset = this.valueSize * 3;\n\t\tthis.binding.setValue( this.buffer, originalValueOffset );\n\n\t}\n\n\t_setAdditiveIdentityNumeric() {\n\n\t\tconst startIndex = this._addIndex * this.valueSize;\n\t\tconst endIndex = startIndex + this.valueSize;\n\n\t\tfor ( let i = startIndex; i < endIndex; i ++ ) {\n\n\t\t\tthis.buffer[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\t_setAdditiveIdentityQuaternion() {\n\n\t\tthis._setAdditiveIdentityNumeric();\n\t\tthis.buffer[ this._addIndex * this.valueSize + 3 ] = 1;\n\n\t}\n\n\t_setAdditiveIdentityOther() {\n\n\t\tconst startIndex = this._origIndex * this.valueSize;\n\t\tconst targetIndex = this._addIndex * this.valueSize;\n\n\t\tfor ( let i = 0; i < this.valueSize; i ++ ) {\n\n\t\t\tthis.buffer[ targetIndex + i ] = this.buffer[ startIndex + i ];\n\n\t\t}\n\n\t}\n\n\n\t// mix functions\n\n\t_select( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tif ( t >= 0.5 ) {\n\n\t\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ dstOffset + i ] = buffer[ srcOffset + i ];\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_slerp( buffer, dstOffset, srcOffset, t ) {\n\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t );\n\n\t}\n\n\t_slerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tconst workOffset = this._workIndex * stride;\n\n\t\t// Store result in intermediate buffer offset\n\t\tQuaternion.multiplyQuaternionsFlat( buffer, workOffset, buffer, dstOffset, buffer, srcOffset );\n\n\t\t// Slerp to the intermediate result\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, workOffset, t );\n\n\t}\n\n\t_lerp( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tconst s = 1 - t;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tconst j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t}\n\n\t_lerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tconst j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t}\n\n}\n\n// Characters [].:/ are reserved for track binding syntax.\nconst _RESERVED_CHARS_RE = '\\\\[\\\\]\\\\.:\\\\/';\nconst _reservedRe = new RegExp( '[' + _RESERVED_CHARS_RE + ']', 'g' );\n\n// Attempts to allow node names from any language. ES5's `\\w` regexp matches\n// only latin characters, and the unicode \\p{L} is not yet supported. So\n// instead, we exclude reserved characters and match everything else.\nconst _wordChar = '[^' + _RESERVED_CHARS_RE + ']';\nconst _wordCharOrDot = '[^' + _RESERVED_CHARS_RE.replace( '\\\\.', '' ) + ']';\n\n// Parent directories, delimited by '/' or ':'. Currently unused, but must\n// be matched to parse the rest of the track name.\nconst _directoryRe = /*@__PURE__*/ /((?:WC+[\\/:])*)/.source.replace( 'WC', _wordChar );\n\n// Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'.\nconst _nodeRe = /*@__PURE__*/ /(WCOD+)?/.source.replace( 'WCOD', _wordCharOrDot );\n\n// Object on target node, and accessor. May not contain reserved\n// characters. Accessor may contain any character except closing bracket.\nconst _objectRe = /*@__PURE__*/ /(?:\\.(WC+)(?:\\[(.+)\\])?)?/.source.replace( 'WC', _wordChar );\n\n// Property and accessor. May not contain reserved characters. Accessor may\n// contain any non-bracket characters.\nconst _propertyRe = /*@__PURE__*/ /\\.(WC+)(?:\\[(.+)\\])?/.source.replace( 'WC', _wordChar );\n\nconst _trackRe = new RegExp( ''\n\t+ '^'\n\t+ _directoryRe\n\t+ _nodeRe\n\t+ _objectRe\n\t+ _propertyRe\n\t+ '$'\n);\n\nconst _supportedObjectNames = [ 'material', 'materials', 'bones', 'map' ];\n\nclass Composite {\n\n\tconstructor( targetGroup, path, optionalParsedPath ) {\n\n\t\tconst parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path );\n\n\t\tthis._targetGroup = targetGroup;\n\t\tthis._bindings = targetGroup.subscribe_( path, parsedPath );\n\n\t}\n\n\tgetValue( array, offset ) {\n\n\t\tthis.bind(); // bind all binding\n\n\t\tconst firstValidIndex = this._targetGroup.nCachedObjects_,\n\t\t\tbinding = this._bindings[ firstValidIndex ];\n\n\t\t// and only call .getValue on the first\n\t\tif ( binding !== undefined ) binding.getValue( array, offset );\n\n\t}\n\n\tsetValue( array, offset ) {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].setValue( array, offset );\n\n\t\t}\n\n\t}\n\n\tbind() {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].bind();\n\n\t\t}\n\n\t}\n\n\tunbind() {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].unbind();\n\n\t\t}\n\n\t}\n\n}\n\n// Note: This class uses a State pattern on a per-method basis:\n// 'bind' sets 'this.getValue' / 'setValue' and shadows the\n// prototype version of these methods with one that represents\n// the bound state. When the property is not found, the methods\n// become no-ops.\nclass PropertyBinding {\n\n\tconstructor( rootNode, path, parsedPath ) {\n\n\t\tthis.path = path;\n\t\tthis.parsedPath = parsedPath || PropertyBinding.parseTrackName( path );\n\n\t\tthis.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName ) || rootNode;\n\n\t\tthis.rootNode = rootNode;\n\n\t\t// initial state of these methods that calls 'bind'\n\t\tthis.getValue = this._getValue_unbound;\n\t\tthis.setValue = this._setValue_unbound;\n\n\t}\n\n\n\tstatic create( root, path, parsedPath ) {\n\n\t\tif ( ! ( root && root.isAnimationObjectGroup ) ) {\n\n\t\t\treturn new PropertyBinding( root, path, parsedPath );\n\n\t\t} else {\n\n\t\t\treturn new PropertyBinding.Composite( root, path, parsedPath );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Replaces spaces with underscores and removes unsupported characters from\n\t * node names, to ensure compatibility with parseTrackName().\n\t *\n\t * @param {string} name Node name to be sanitized.\n\t * @return {string}\n\t */\n\tstatic sanitizeNodeName( name ) {\n\n\t\treturn name.replace( /\\s/g, '_' ).replace( _reservedRe, '' );\n\n\t}\n\n\tstatic parseTrackName( trackName ) {\n\n\t\tconst matches = _trackRe.exec( trackName );\n\n\t\tif ( matches === null ) {\n\n\t\t\tthrow new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName );\n\n\t\t}\n\n\t\tconst results = {\n\t\t\t// directoryName: matches[ 1 ], // (tschw) currently unused\n\t\t\tnodeName: matches[ 2 ],\n\t\t\tobjectName: matches[ 3 ],\n\t\t\tobjectIndex: matches[ 4 ],\n\t\t\tpropertyName: matches[ 5 ], // required\n\t\t\tpropertyIndex: matches[ 6 ]\n\t\t};\n\n\t\tconst lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' );\n\n\t\tif ( lastDot !== undefined && lastDot !== - 1 ) {\n\n\t\t\tconst objectName = results.nodeName.substring( lastDot + 1 );\n\n\t\t\t// Object names must be checked against an allowlist. Otherwise, there\n\t\t\t// is no way to parse 'foo.bar.baz': 'baz' must be a property, but\n\t\t\t// 'bar' could be the objectName, or part of a nodeName (which can\n\t\t\t// include '.' characters).\n\t\t\tif ( _supportedObjectNames.indexOf( objectName ) !== - 1 ) {\n\n\t\t\t\tresults.nodeName = results.nodeName.substring( 0, lastDot );\n\t\t\t\tresults.objectName = objectName;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( results.propertyName === null || results.propertyName.length === 0 ) {\n\n\t\t\tthrow new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName );\n\n\t\t}\n\n\t\treturn results;\n\n\t}\n\n\tstatic findNode( root, nodeName ) {\n\n\t\tif ( nodeName === undefined || nodeName === '' || nodeName === '.' || nodeName === - 1 || nodeName === root.name || nodeName === root.uuid ) {\n\n\t\t\treturn root;\n\n\t\t}\n\n\t\t// search into skeleton bones.\n\t\tif ( root.skeleton ) {\n\n\t\t\tconst bone = root.skeleton.getBoneByName( nodeName );\n\n\t\t\tif ( bone !== undefined ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// search into node subtree.\n\t\tif ( root.children ) {\n\n\t\t\tconst searchNodeSubtree = function ( children ) {\n\n\t\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\t\tconst childNode = children[ i ];\n\n\t\t\t\t\tif ( childNode.name === nodeName || childNode.uuid === nodeName ) {\n\n\t\t\t\t\t\treturn childNode;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst result = searchNodeSubtree( childNode.children );\n\n\t\t\t\t\tif ( result ) return result;\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tconst subTreeNode = searchNodeSubtree( root.children );\n\n\t\t\tif ( subTreeNode ) {\n\n\t\t\t\treturn subTreeNode;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t// these are used to \"bind\" a nonexistent property\n\t_getValue_unavailable() {}\n\t_setValue_unavailable() {}\n\n\t// Getters\n\n\t_getValue_direct( buffer, offset ) {\n\n\t\tbuffer[ offset ] = this.targetObject[ this.propertyName ];\n\n\t}\n\n\t_getValue_array( buffer, offset ) {\n\n\t\tconst source = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = source.length; i !== n; ++ i ) {\n\n\t\t\tbuffer[ offset ++ ] = source[ i ];\n\n\t\t}\n\n\t}\n\n\t_getValue_arrayElement( buffer, offset ) {\n\n\t\tbuffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];\n\n\t}\n\n\t_getValue_toArray( buffer, offset ) {\n\n\t\tthis.resolvedProperty.toArray( buffer, offset );\n\n\t}\n\n\t// Direct\n\n\t_setValue_direct( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\n\t}\n\n\t_setValue_direct_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// EntireArray\n\n\t_setValue_array( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t}\n\n\t_setValue_array_setNeedsUpdate( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// ArrayElement\n\n\t_setValue_arrayElement( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\n\t}\n\n\t_setValue_arrayElement_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// HasToFromArray\n\n\t_setValue_fromArray( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\n\t}\n\n\t_setValue_fromArray_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t_getValue_unbound( targetArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.getValue( targetArray, offset );\n\n\t}\n\n\t_setValue_unbound( sourceArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.setValue( sourceArray, offset );\n\n\t}\n\n\t// create getter / setter pair for a property in the scene graph\n\tbind() {\n\n\t\tlet targetObject = this.node;\n\t\tconst parsedPath = this.parsedPath;\n\n\t\tconst objectName = parsedPath.objectName;\n\t\tconst propertyName = parsedPath.propertyName;\n\t\tlet propertyIndex = parsedPath.propertyIndex;\n\n\t\tif ( ! targetObject ) {\n\n\t\t\ttargetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName ) || this.rootNode;\n\n\t\t\tthis.node = targetObject;\n\n\t\t}\n\n\t\t// set fail state so we can just 'return' on error\n\t\tthis.getValue = this._getValue_unavailable;\n\t\tthis.setValue = this._setValue_unavailable;\n\n\t\t// ensure there is a value node\n\t\tif ( ! targetObject ) {\n\n\t\t\tconsole.error( 'THREE.PropertyBinding: Trying to update node for track: ' + this.path + ' but it wasn\\'t found.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( objectName ) {\n\n\t\t\tlet objectIndex = parsedPath.objectIndex;\n\n\t\t\t// special cases were we need to reach deeper into the hierarchy to get the face materials....\n\t\t\tswitch ( objectName ) {\n\n\t\t\t\tcase 'materials':\n\n\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material.materials ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject.material.materials;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bones':\n\n\t\t\t\t\tif ( ! targetObject.skeleton ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to bones as node does not have a skeleton.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// potential future optimization: skip this if propertyIndex is already an integer\n\t\t\t\t\t// and convert the integer string to a true integer.\n\n\t\t\t\t\ttargetObject = targetObject.skeleton.bones;\n\n\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\tfor ( let i = 0; i < targetObject.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject[ i ].name === objectIndex ) {\n\n\t\t\t\t\t\t\tobjectIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'map':\n\n\t\t\t\t\tif ( 'map' in targetObject ) {\n\n\t\t\t\t\t\ttargetObject = targetObject.map;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to material as node does not have a material.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material.map ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to material.map as node.material does not have a map.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject.material.map;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tif ( targetObject[ objectName ] === undefined ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to objectName of node undefined.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject[ objectName ];\n\n\t\t\t}\n\n\n\t\t\tif ( objectIndex !== undefined ) {\n\n\t\t\t\tif ( targetObject[ objectIndex ] === undefined ) {\n\n\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\ttargetObject = targetObject[ objectIndex ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// resolve property\n\t\tconst nodeProperty = targetObject[ propertyName ];\n\n\t\tif ( nodeProperty === undefined ) {\n\n\t\t\tconst nodeName = parsedPath.nodeName;\n\n\t\t\tconsole.error( 'THREE.PropertyBinding: Trying to update property for track: ' + nodeName +\n\t\t\t\t'.' + propertyName + ' but it wasn\\'t found.', targetObject );\n\t\t\treturn;\n\n\t\t}\n\n\t\t// determine versioning scheme\n\t\tlet versioning = this.Versioning.None;\n\n\t\tthis.targetObject = targetObject;\n\n\t\tif ( targetObject.needsUpdate !== undefined ) { // material\n\n\t\t\tversioning = this.Versioning.NeedsUpdate;\n\n\t\t} else if ( targetObject.matrixWorldNeedsUpdate !== undefined ) { // node transform\n\n\t\t\tversioning = this.Versioning.MatrixWorldNeedsUpdate;\n\n\t\t}\n\n\t\t// determine how the property gets bound\n\t\tlet bindingType = this.BindingType.Direct;\n\n\t\tif ( propertyIndex !== undefined ) {\n\n\t\t\t// access a sub element of the property array (only primitives are supported right now)\n\n\t\t\tif ( propertyName === 'morphTargetInfluences' ) {\n\n\t\t\t\t// potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer.\n\n\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\tif ( ! targetObject.geometry ) {\n\n\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! targetObject.geometry.morphAttributes ) {\n\n\t\t\t\t\tconsole.error( 'THREE.PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( targetObject.morphTargetDictionary[ propertyIndex ] !== undefined ) {\n\n\t\t\t\t\tpropertyIndex = targetObject.morphTargetDictionary[ propertyIndex ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tbindingType = this.BindingType.ArrayElement;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\t\t\tthis.propertyIndex = propertyIndex;\n\n\t\t} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {\n\n\t\t\t// must use copy for Object3D.Euler/Quaternion\n\n\t\t\tbindingType = this.BindingType.HasFromToArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else if ( Array.isArray( nodeProperty ) ) {\n\n\t\t\tbindingType = this.BindingType.EntireArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else {\n\n\t\t\tthis.propertyName = propertyName;\n\n\t\t}\n\n\t\t// select getter / setter\n\t\tthis.getValue = this.GetterByBindingType[ bindingType ];\n\t\tthis.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];\n\n\t}\n\n\tunbind() {\n\n\t\tthis.node = null;\n\n\t\t// back to the prototype version of getValue / setValue\n\t\t// note: avoiding to mutate the shape of 'this' via 'delete'\n\t\tthis.getValue = this._getValue_unbound;\n\t\tthis.setValue = this._setValue_unbound;\n\n\t}\n\n}\n\nPropertyBinding.Composite = Composite;\n\nPropertyBinding.prototype.BindingType = {\n\tDirect: 0,\n\tEntireArray: 1,\n\tArrayElement: 2,\n\tHasFromToArray: 3\n};\n\nPropertyBinding.prototype.Versioning = {\n\tNone: 0,\n\tNeedsUpdate: 1,\n\tMatrixWorldNeedsUpdate: 2\n};\n\nPropertyBinding.prototype.GetterByBindingType = [\n\n\tPropertyBinding.prototype._getValue_direct,\n\tPropertyBinding.prototype._getValue_array,\n\tPropertyBinding.prototype._getValue_arrayElement,\n\tPropertyBinding.prototype._getValue_toArray,\n\n];\n\nPropertyBinding.prototype.SetterByBindingTypeAndVersioning = [\n\n\t[\n\t\t// Direct\n\t\tPropertyBinding.prototype._setValue_direct,\n\t\tPropertyBinding.prototype._setValue_direct_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_direct_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// EntireArray\n\n\t\tPropertyBinding.prototype._setValue_array,\n\t\tPropertyBinding.prototype._setValue_array_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_array_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// ArrayElement\n\t\tPropertyBinding.prototype._setValue_arrayElement,\n\t\tPropertyBinding.prototype._setValue_arrayElement_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_arrayElement_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// HasToFromArray\n\t\tPropertyBinding.prototype._setValue_fromArray,\n\t\tPropertyBinding.prototype._setValue_fromArray_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate,\n\n\t]\n\n];\n\n/**\n *\n * A group of objects that receives a shared animation state.\n *\n * Usage:\n *\n * - Add objects you would otherwise pass as 'root' to the\n * constructor or the .clipAction method of AnimationMixer.\n *\n * - Instead pass this object as 'root'.\n *\n * - You can also add and remove objects later when the mixer\n * is running.\n *\n * Note:\n *\n * Objects of this class appear as one object to the mixer,\n * so cache control of the individual objects must be done\n * on the group.\n *\n * Limitation:\n *\n * - The animated properties must be compatible among the\n * all objects in the group.\n *\n * - A single property can either be controlled through a\n * target group or directly, but not both.\n */\n\nclass AnimationObjectGroup {\n\n\tconstructor() {\n\n\t\tthis.isAnimationObjectGroup = true;\n\n\t\tthis.uuid = generateUUID();\n\n\t\t// cached objects followed by the active ones\n\t\tthis._objects = Array.prototype.slice.call( arguments );\n\n\t\tthis.nCachedObjects_ = 0; // threshold\n\t\t// note: read by PropertyBinding.Composite\n\n\t\tconst indices = {};\n\t\tthis._indicesByUUID = indices; // for bookkeeping\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tindices[ arguments[ i ].uuid ] = i;\n\n\t\t}\n\n\t\tthis._paths = []; // inside: string\n\t\tthis._parsedPaths = []; // inside: { we don't care, here }\n\t\tthis._bindings = []; // inside: Array< PropertyBinding >\n\t\tthis._bindingsIndicesByPath = {}; // inside: indices in these arrays\n\n\t\tconst scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tobjects: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._objects.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn this.total - scope.nCachedObjects_;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tget bindingsPerObject() {\n\n\t\t\t\treturn scope._bindings.length;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tadd() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tpaths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet knownObject = undefined,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid;\n\t\t\tlet index = indicesByUUID[ uuid ];\n\n\t\t\tif ( index === undefined ) {\n\n\t\t\t\t// unknown object -> add it to the ACTIVE region\n\n\t\t\t\tindex = nObjects ++;\n\t\t\t\tindicesByUUID[ uuid ] = index;\n\t\t\t\tobjects.push( object );\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tbindings[ j ].push( new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ) );\n\n\t\t\t\t}\n\n\t\t\t} else if ( index < nCachedObjects ) {\n\n\t\t\t\tknownObject = objects[ index ];\n\n\t\t\t\t// move existing object to the ACTIVE region\n\n\t\t\t\tconst firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ];\n\n\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = firstActiveIndex;\n\t\t\t\tobjects[ firstActiveIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ];\n\n\t\t\t\t\tlet binding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\n\t\t\t\t\tif ( binding === undefined ) {\n\n\t\t\t\t\t\t// since we do not bother to create new bindings\n\t\t\t\t\t\t// for objects that are cached, the binding may\n\t\t\t\t\t\t// or may not exist\n\n\t\t\t\t\t\tbinding = new PropertyBinding( object, paths[ j ], parsedPaths[ j ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t} else if ( objects[ index ] !== knownObject ) {\n\n\t\t\t\tconsole.error( 'THREE.AnimationObjectGroup: Different objects with the same UUID ' +\n\t\t\t\t\t'detected. Clean the caches or recreate your infrastructure when reloading scenes.' );\n\n\t\t\t} // else the object is already where we want it to be\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\tremove() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet nCachedObjects = this.nCachedObjects_;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined && index >= nCachedObjects ) {\n\n\t\t\t\t// move existing object into the CACHED region\n\n\t\t\t\tconst lastCachedIndex = nCachedObjects ++,\n\t\t\t\t\tfirstActiveObject = objects[ lastCachedIndex ];\n\n\t\t\t\tindicesByUUID[ firstActiveObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = firstActiveObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = lastCachedIndex;\n\t\t\t\tobjects[ lastCachedIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tfirstActive = bindingsForPath[ lastCachedIndex ],\n\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = firstActive;\n\t\t\t\t\tbindingsForPath[ lastCachedIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t// remove & forget\n\tuncache() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet nCachedObjects = this.nCachedObjects_,\n\t\t\tnObjects = objects.length;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tdelete indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index < nCachedObjects ) {\n\n\t\t\t\t\t// object is cached, shrink the CACHED region\n\n\t\t\t\t\tconst firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ],\n\t\t\t\t\t\tlastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t// last cached object takes this object's place\n\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\t// last object goes to the activated slot and pop\n\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = firstActiveIndex;\n\t\t\t\t\tobjects[ firstActiveIndex ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\tlast = bindingsForPath[ lastIndex ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = last;\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// object is active, just swap with the last and pop\n\n\t\t\t\t\tconst lastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\tif ( lastIndex > 0 ) {\n\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = index;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobjects[ index ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tconst bindingsForPath = bindings[ j ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = bindingsForPath[ lastIndex ];\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} // cached or active\n\n\t\t\t} // if object is known\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t// Internal interface used by befriended PropertyBinding.Composite:\n\n\tsubscribe_( path, parsedPath ) {\n\n\t\t// returns an array of bindings for the given path that is changed\n\t\t// according to the contained objects in the group\n\n\t\tconst indicesByPath = this._bindingsIndicesByPath;\n\t\tlet index = indicesByPath[ path ];\n\t\tconst bindings = this._bindings;\n\n\t\tif ( index !== undefined ) return bindings[ index ];\n\n\t\tconst paths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tobjects = this._objects,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\tbindingsForPath = new Array( nObjects );\n\n\t\tindex = bindings.length;\n\n\t\tindicesByPath[ path ] = index;\n\n\t\tpaths.push( path );\n\t\tparsedPaths.push( parsedPath );\n\t\tbindings.push( bindingsForPath );\n\n\t\tfor ( let i = nCachedObjects, n = objects.length; i !== n; ++ i ) {\n\n\t\t\tconst object = objects[ i ];\n\t\t\tbindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath );\n\n\t\t}\n\n\t\treturn bindingsForPath;\n\n\t}\n\n\tunsubscribe_( path ) {\n\n\t\t// tells the group to forget about a property path and no longer\n\t\t// update the array previously obtained with 'subscribe_'\n\n\t\tconst indicesByPath = this._bindingsIndicesByPath,\n\t\t\tindex = indicesByPath[ path ];\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tconst paths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tlastBindingsIndex = bindings.length - 1,\n\t\t\t\tlastBindings = bindings[ lastBindingsIndex ],\n\t\t\t\tlastBindingsPath = path[ lastBindingsIndex ];\n\n\t\t\tindicesByPath[ lastBindingsPath ] = index;\n\n\t\t\tbindings[ index ] = lastBindings;\n\t\t\tbindings.pop();\n\n\t\t\tparsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];\n\t\t\tparsedPaths.pop();\n\n\t\t\tpaths[ index ] = paths[ lastBindingsIndex ];\n\t\t\tpaths.pop();\n\n\t\t}\n\n\t}\n\n}\n\nclass AnimationAction {\n\n\tconstructor( mixer, clip, localRoot = null, blendMode = clip.blendMode ) {\n\n\t\tthis._mixer = mixer;\n\t\tthis._clip = clip;\n\t\tthis._localRoot = localRoot;\n\t\tthis.blendMode = blendMode;\n\n\t\tconst tracks = clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tinterpolants = new Array( nTracks );\n\n\t\tconst interpolantSettings = {\n\t\t\tendingStart: ZeroCurvatureEnding,\n\t\t\tendingEnd: ZeroCurvatureEnding\n\t\t};\n\n\t\tfor ( let i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tconst interpolant = tracks[ i ].createInterpolant( null );\n\t\t\tinterpolants[ i ] = interpolant;\n\t\t\tinterpolant.settings = interpolantSettings;\n\n\t\t}\n\n\t\tthis._interpolantSettings = interpolantSettings;\n\n\t\tthis._interpolants = interpolants; // bound by the mixer\n\n\t\t// inside: PropertyMixer (managed by the mixer)\n\t\tthis._propertyBindings = new Array( nTracks );\n\n\t\tthis._cacheIndex = null; // for the memory manager\n\t\tthis._byClipCacheIndex = null; // for the memory manager\n\n\t\tthis._timeScaleInterpolant = null;\n\t\tthis._weightInterpolant = null;\n\n\t\tthis.loop = LoopRepeat;\n\t\tthis._loopCount = - 1;\n\n\t\t// global mixer time when the action is to be started\n\t\t// it's set back to 'null' upon start of the action\n\t\tthis._startTime = null;\n\n\t\t// scaled local time of the action\n\t\t// gets clamped or wrapped to 0..clip.duration according to loop\n\t\tthis.time = 0;\n\n\t\tthis.timeScale = 1;\n\t\tthis._effectiveTimeScale = 1;\n\n\t\tthis.weight = 1;\n\t\tthis._effectiveWeight = 1;\n\n\t\tthis.repetitions = Infinity; // no. of repetitions when looping\n\n\t\tthis.paused = false; // true -> zero effective time scale\n\t\tthis.enabled = true; // false -> zero effective weight\n\n\t\tthis.clampWhenFinished = false;// keep feeding the last frame?\n\n\t\tthis.zeroSlopeAtStart = true;// for smooth interpolation w/o separate\n\t\tthis.zeroSlopeAtEnd = true;// clips for start, loop and end\n\n\t}\n\n\t// State & Scheduling\n\n\tplay() {\n\n\t\tthis._mixer._activateAction( this );\n\n\t\treturn this;\n\n\t}\n\n\tstop() {\n\n\t\tthis._mixer._deactivateAction( this );\n\n\t\treturn this.reset();\n\n\t}\n\n\treset() {\n\n\t\tthis.paused = false;\n\t\tthis.enabled = true;\n\n\t\tthis.time = 0; // restart clip\n\t\tthis._loopCount = - 1;// forget previous loops\n\t\tthis._startTime = null;// forget scheduling\n\n\t\treturn this.stopFading().stopWarping();\n\n\t}\n\n\tisRunning() {\n\n\t\treturn this.enabled && ! this.paused && this.timeScale !== 0 &&\n\t\t\tthis._startTime === null && this._mixer._isActiveAction( this );\n\n\t}\n\n\t// return true when play has been called\n\tisScheduled() {\n\n\t\treturn this._mixer._isActiveAction( this );\n\n\t}\n\n\tstartAt( time ) {\n\n\t\tthis._startTime = time;\n\n\t\treturn this;\n\n\t}\n\n\tsetLoop( mode, repetitions ) {\n\n\t\tthis.loop = mode;\n\t\tthis.repetitions = repetitions;\n\n\t\treturn this;\n\n\t}\n\n\t// Weight\n\n\t// set the weight stopping any scheduled fading\n\t// although .enabled = false yields an effective weight of zero, this\n\t// method does *not* change .enabled, because it would be confusing\n\tsetEffectiveWeight( weight ) {\n\n\t\tthis.weight = weight;\n\n\t\t// note: same logic as when updated at runtime\n\t\tthis._effectiveWeight = this.enabled ? weight : 0;\n\n\t\treturn this.stopFading();\n\n\t}\n\n\t// return the weight considering fading and .enabled\n\tgetEffectiveWeight() {\n\n\t\treturn this._effectiveWeight;\n\n\t}\n\n\tfadeIn( duration ) {\n\n\t\treturn this._scheduleFading( duration, 0, 1 );\n\n\t}\n\n\tfadeOut( duration ) {\n\n\t\treturn this._scheduleFading( duration, 1, 0 );\n\n\t}\n\n\tcrossFadeFrom( fadeOutAction, duration, warp ) {\n\n\t\tfadeOutAction.fadeOut( duration );\n\t\tthis.fadeIn( duration );\n\n\t\tif ( warp ) {\n\n\t\t\tconst fadeInDuration = this._clip.duration,\n\t\t\t\tfadeOutDuration = fadeOutAction._clip.duration,\n\n\t\t\t\tstartEndRatio = fadeOutDuration / fadeInDuration,\n\t\t\t\tendStartRatio = fadeInDuration / fadeOutDuration;\n\n\t\t\tfadeOutAction.warp( 1.0, startEndRatio, duration );\n\t\t\tthis.warp( endStartRatio, 1.0, duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tcrossFadeTo( fadeInAction, duration, warp ) {\n\n\t\treturn fadeInAction.crossFadeFrom( this, duration, warp );\n\n\t}\n\n\tstopFading() {\n\n\t\tconst weightInterpolant = this._weightInterpolant;\n\n\t\tif ( weightInterpolant !== null ) {\n\n\t\t\tthis._weightInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( weightInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// Time Scale Control\n\n\t// set the time scale stopping any scheduled warping\n\t// although .paused = true yields an effective time scale of zero, this\n\t// method does *not* change .paused, because it would be confusing\n\tsetEffectiveTimeScale( timeScale ) {\n\n\t\tthis.timeScale = timeScale;\n\t\tthis._effectiveTimeScale = this.paused ? 0 : timeScale;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\t// return the time scale considering warping and .paused\n\tgetEffectiveTimeScale() {\n\n\t\treturn this._effectiveTimeScale;\n\n\t}\n\n\tsetDuration( duration ) {\n\n\t\tthis.timeScale = this._clip.duration / duration;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\tsyncWith( action ) {\n\n\t\tthis.time = action.time;\n\t\tthis.timeScale = action.timeScale;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\thalt( duration ) {\n\n\t\treturn this.warp( this._effectiveTimeScale, 0, duration );\n\n\t}\n\n\twarp( startTimeScale, endTimeScale, duration ) {\n\n\t\tconst mixer = this._mixer,\n\t\t\tnow = mixer.time,\n\t\t\ttimeScale = this.timeScale;\n\n\t\tlet interpolant = this._timeScaleInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._timeScaleInterpolant = interpolant;\n\n\t\t}\n\n\t\tconst times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\ttimes[ 1 ] = now + duration;\n\n\t\tvalues[ 0 ] = startTimeScale / timeScale;\n\t\tvalues[ 1 ] = endTimeScale / timeScale;\n\n\t\treturn this;\n\n\t}\n\n\tstopWarping() {\n\n\t\tconst timeScaleInterpolant = this._timeScaleInterpolant;\n\n\t\tif ( timeScaleInterpolant !== null ) {\n\n\t\t\tthis._timeScaleInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( timeScaleInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// Object Accessors\n\n\tgetMixer() {\n\n\t\treturn this._mixer;\n\n\t}\n\n\tgetClip() {\n\n\t\treturn this._clip;\n\n\t}\n\n\tgetRoot() {\n\n\t\treturn this._localRoot || this._mixer._root;\n\n\t}\n\n\t// Interna\n\n\t_update( time, deltaTime, timeDirection, accuIndex ) {\n\n\t\t// called by the mixer\n\n\t\tif ( ! this.enabled ) {\n\n\t\t\t// call ._updateWeight() to update ._effectiveWeight\n\n\t\t\tthis._updateWeight( time );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst startTime = this._startTime;\n\n\t\tif ( startTime !== null ) {\n\n\t\t\t// check for scheduled start of action\n\n\t\t\tconst timeRunning = ( time - startTime ) * timeDirection;\n\t\t\tif ( timeRunning < 0 || timeDirection === 0 ) {\n\n\t\t\t\tdeltaTime = 0;\n\n\t\t\t} else {\n\n\n\t\t\t\tthis._startTime = null; // unschedule\n\t\t\t\tdeltaTime = timeDirection * timeRunning;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// apply time scale and advance time\n\n\t\tdeltaTime *= this._updateTimeScale( time );\n\t\tconst clipTime = this._updateTime( deltaTime );\n\n\t\t// note: _updateTime may disable the action resulting in\n\t\t// an effective weight of 0\n\n\t\tconst weight = this._updateWeight( time );\n\n\t\tif ( weight > 0 ) {\n\n\t\t\tconst interpolants = this._interpolants;\n\t\t\tconst propertyMixers = this._propertyBindings;\n\n\t\t\tswitch ( this.blendMode ) {\n\n\t\t\t\tcase AdditiveAnimationBlendMode:\n\n\t\t\t\t\tfor ( let j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\t\tpropertyMixers[ j ].accumulateAdditive( weight );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase NormalAnimationBlendMode:\n\t\t\t\tdefault:\n\n\t\t\t\t\tfor ( let j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\t\tpropertyMixers[ j ].accumulate( accuIndex, weight );\n\n\t\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_updateWeight( time ) {\n\n\t\tlet weight = 0;\n\n\t\tif ( this.enabled ) {\n\n\t\t\tweight = this.weight;\n\t\t\tconst interpolant = this._weightInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tconst interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\tweight *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopFading();\n\n\t\t\t\t\tif ( interpolantValue === 0 ) {\n\n\t\t\t\t\t\t// faded out, disable\n\t\t\t\t\t\tthis.enabled = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveWeight = weight;\n\t\treturn weight;\n\n\t}\n\n\t_updateTimeScale( time ) {\n\n\t\tlet timeScale = 0;\n\n\t\tif ( ! this.paused ) {\n\n\t\t\ttimeScale = this.timeScale;\n\n\t\t\tconst interpolant = this._timeScaleInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tconst interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\ttimeScale *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopWarping();\n\n\t\t\t\t\tif ( timeScale === 0 ) {\n\n\t\t\t\t\t\t// motion has halted, pause\n\t\t\t\t\t\tthis.paused = true;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// warp done - apply final time scale\n\t\t\t\t\t\tthis.timeScale = timeScale;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveTimeScale = timeScale;\n\t\treturn timeScale;\n\n\t}\n\n\t_updateTime( deltaTime ) {\n\n\t\tconst duration = this._clip.duration;\n\t\tconst loop = this.loop;\n\n\t\tlet time = this.time + deltaTime;\n\t\tlet loopCount = this._loopCount;\n\n\t\tconst pingPong = ( loop === LoopPingPong );\n\n\t\tif ( deltaTime === 0 ) {\n\n\t\t\tif ( loopCount === - 1 ) return time;\n\n\t\t\treturn ( pingPong && ( loopCount & 1 ) === 1 ) ? duration - time : time;\n\n\t\t}\n\n\t\tif ( loop === LoopOnce ) {\n\n\t\t\tif ( loopCount === - 1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tthis._loopCount = 0;\n\t\t\t\tthis._setEndings( true, true, false );\n\n\t\t\t}\n\n\t\t\thandle_stop: {\n\n\t\t\t\tif ( time >= duration ) {\n\n\t\t\t\t\ttime = duration;\n\n\t\t\t\t} else if ( time < 0 ) {\n\n\t\t\t\t\ttime = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tbreak handle_stop;\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\telse this.enabled = false;\n\n\t\t\t\tthis.time = time;\n\n\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\tdirection: deltaTime < 0 ? - 1 : 1\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t} else { // repetitive Repeat or PingPong\n\n\t\t\tif ( loopCount === - 1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tif ( deltaTime >= 0 ) {\n\n\t\t\t\t\tloopCount = 0;\n\n\t\t\t\t\tthis._setEndings( true, this.repetitions === 0, pingPong );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// when looping in reverse direction, the initial\n\t\t\t\t\t// transition through zero counts as a repetition,\n\t\t\t\t\t// so leave loopCount at -1\n\n\t\t\t\t\tthis._setEndings( this.repetitions === 0, true, pingPong );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( time >= duration || time < 0 ) {\n\n\t\t\t\t// wrap around\n\n\t\t\t\tconst loopDelta = Math.floor( time / duration ); // signed\n\t\t\t\ttime -= duration * loopDelta;\n\n\t\t\t\tloopCount += Math.abs( loopDelta );\n\n\t\t\t\tconst pending = this.repetitions - loopCount;\n\n\t\t\t\tif ( pending <= 0 ) {\n\n\t\t\t\t\t// have to stop (switch state, clamp time, fire event)\n\n\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\ttime = deltaTime > 0 ? duration : 0;\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\tdirection: deltaTime > 0 ? 1 : - 1\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// keep running\n\n\t\t\t\t\tif ( pending === 1 ) {\n\n\t\t\t\t\t\t// entering the last round\n\n\t\t\t\t\t\tconst atStart = deltaTime < 0;\n\t\t\t\t\t\tthis._setEndings( atStart, ! atStart, pingPong );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis._setEndings( false, false, pingPong );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis._loopCount = loopCount;\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'loop', action: this, loopDelta: loopDelta\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.time = time;\n\n\t\t\t}\n\n\t\t\tif ( pingPong && ( loopCount & 1 ) === 1 ) {\n\n\t\t\t\t// invert time for the \"pong round\"\n\n\t\t\t\treturn duration - time;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn time;\n\n\t}\n\n\t_setEndings( atStart, atEnd, pingPong ) {\n\n\t\tconst settings = this._interpolantSettings;\n\n\t\tif ( pingPong ) {\n\n\t\t\tsettings.endingStart = ZeroSlopeEnding;\n\t\t\tsettings.endingEnd = ZeroSlopeEnding;\n\n\t\t} else {\n\n\t\t\t// assuming for LoopOnce atStart == atEnd == true\n\n\t\t\tif ( atStart ) {\n\n\t\t\t\tsettings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingStart = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t\tif ( atEnd ) {\n\n\t\t\t\tsettings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingEnd \t = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_scheduleFading( duration, weightNow, weightThen ) {\n\n\t\tconst mixer = this._mixer, now = mixer.time;\n\t\tlet interpolant = this._weightInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._weightInterpolant = interpolant;\n\n\t\t}\n\n\t\tconst times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\tvalues[ 0 ] = weightNow;\n\t\ttimes[ 1 ] = now + duration;\n\t\tvalues[ 1 ] = weightThen;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _controlInterpolantsResultBuffer = new Float32Array( 1 );\n\n\nclass AnimationMixer extends EventDispatcher {\n\n\tconstructor( root ) {\n\n\t\tsuper();\n\n\t\tthis._root = root;\n\t\tthis._initMemoryManager();\n\t\tthis._accuIndex = 0;\n\t\tthis.time = 0;\n\t\tthis.timeScale = 1.0;\n\n\t}\n\n\t_bindAction( action, prototypeAction ) {\n\n\t\tconst root = action._localRoot || this._root,\n\t\t\ttracks = action._clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tbindings = action._propertyBindings,\n\t\t\tinterpolants = action._interpolants,\n\t\t\trootUuid = root.uuid,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName;\n\n\t\tlet bindingsByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingsByName === undefined ) {\n\n\t\t\tbindingsByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingsByName;\n\n\t\t}\n\n\t\tfor ( let i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tconst track = tracks[ i ],\n\t\t\t\ttrackName = track.name;\n\n\t\t\tlet binding = bindingsByName[ trackName ];\n\n\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t++ binding.referenceCount;\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t} else {\n\n\t\t\t\tbinding = bindings[ i ];\n\n\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\t// existing binding, make sure the cache knows\n\n\t\t\t\t\tif ( binding._cacheIndex === null ) {\n\n\t\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tconst path = prototypeAction && prototypeAction.\n\t\t\t\t\t_propertyBindings[ i ].binding.parsedPath;\n\n\t\t\t\tbinding = new PropertyMixer(\n\t\t\t\t\tPropertyBinding.create( root, trackName, path ),\n\t\t\t\t\ttrack.ValueTypeName, track.getValueSize() );\n\n\t\t\t\t++ binding.referenceCount;\n\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t}\n\n\t\t\tinterpolants[ i ].resultBuffer = binding.buffer;\n\n\t\t}\n\n\t}\n\n\t_activateAction( action ) {\n\n\t\tif ( ! this._isActiveAction( action ) ) {\n\n\t\t\tif ( action._cacheIndex === null ) {\n\n\t\t\t\t// this action has been forgotten by the cache, but the user\n\t\t\t\t// appears to be still using it -> rebind\n\n\t\t\t\tconst rootUuid = ( action._localRoot || this._root ).uuid,\n\t\t\t\t\tclipUuid = action._clip.uuid,\n\t\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\t\tthis._bindAction( action,\n\t\t\t\t\tactionsForClip && actionsForClip.knownActions[ 0 ] );\n\n\t\t\t\tthis._addInactiveAction( action, clipUuid, rootUuid );\n\n\t\t\t}\n\n\t\t\tconst bindings = action._propertyBindings;\n\n\t\t\t// increment reference counts / sort out state\n\t\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tconst binding = bindings[ i ];\n\n\t\t\t\tif ( binding.useCount ++ === 0 ) {\n\n\t\t\t\t\tthis._lendBinding( binding );\n\t\t\t\t\tbinding.saveOriginalState();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._lendAction( action );\n\n\t\t}\n\n\t}\n\n\t_deactivateAction( action ) {\n\n\t\tif ( this._isActiveAction( action ) ) {\n\n\t\t\tconst bindings = action._propertyBindings;\n\n\t\t\t// decrement reference counts / sort out state\n\t\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tconst binding = bindings[ i ];\n\n\t\t\t\tif ( -- binding.useCount === 0 ) {\n\n\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\tthis._takeBackBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._takeBackAction( action );\n\n\t\t}\n\n\t}\n\n\t// Memory manager\n\n\t_initMemoryManager() {\n\n\t\tthis._actions = []; // 'nActiveActions' followed by inactive ones\n\t\tthis._nActiveActions = 0;\n\n\t\tthis._actionsByClip = {};\n\t\t// inside:\n\t\t// {\n\t\t// \tknownActions: Array< AnimationAction > - used as prototypes\n\t\t// \tactionByRoot: AnimationAction - lookup\n\t\t// }\n\n\n\t\tthis._bindings = []; // 'nActiveBindings' followed by inactive ones\n\t\tthis._nActiveBindings = 0;\n\n\t\tthis._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >\n\n\n\t\tthis._controlInterpolants = []; // same game as above\n\t\tthis._nActiveControlInterpolants = 0;\n\n\t\tconst scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tactions: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._actions.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveActions;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tbindings: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._bindings.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveBindings;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tcontrolInterpolants: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._controlInterpolants.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveControlInterpolants;\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t// Memory management for AnimationAction objects\n\n\t_isActiveAction( action ) {\n\n\t\tconst index = action._cacheIndex;\n\t\treturn index !== null && index < this._nActiveActions;\n\n\t}\n\n\t_addInactiveAction( action, clipUuid, rootUuid ) {\n\n\t\tconst actions = this._actions,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tlet actionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip === undefined ) {\n\n\t\t\tactionsForClip = {\n\n\t\t\t\tknownActions: [ action ],\n\t\t\t\tactionByRoot: {}\n\n\t\t\t};\n\n\t\t\taction._byClipCacheIndex = 0;\n\n\t\t\tactionsByClip[ clipUuid ] = actionsForClip;\n\n\t\t} else {\n\n\t\t\tconst knownActions = actionsForClip.knownActions;\n\n\t\t\taction._byClipCacheIndex = knownActions.length;\n\t\t\tknownActions.push( action );\n\n\t\t}\n\n\t\taction._cacheIndex = actions.length;\n\t\tactions.push( action );\n\n\t\tactionsForClip.actionByRoot[ rootUuid ] = action;\n\n\t}\n\n\t_removeInactiveAction( action ) {\n\n\t\tconst actions = this._actions,\n\t\t\tlastInactiveAction = actions[ actions.length - 1 ],\n\t\t\tcacheIndex = action._cacheIndex;\n\n\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\tactions.pop();\n\n\t\taction._cacheIndex = null;\n\n\n\t\tconst clipUuid = action._clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ],\n\t\t\tknownActionsForClip = actionsForClip.knownActions,\n\n\t\t\tlastKnownAction =\n\t\t\t\tknownActionsForClip[ knownActionsForClip.length - 1 ],\n\n\t\t\tbyClipCacheIndex = action._byClipCacheIndex;\n\n\t\tlastKnownAction._byClipCacheIndex = byClipCacheIndex;\n\t\tknownActionsForClip[ byClipCacheIndex ] = lastKnownAction;\n\t\tknownActionsForClip.pop();\n\n\t\taction._byClipCacheIndex = null;\n\n\n\t\tconst actionByRoot = actionsForClip.actionByRoot,\n\t\t\trootUuid = ( action._localRoot || this._root ).uuid;\n\n\t\tdelete actionByRoot[ rootUuid ];\n\n\t\tif ( knownActionsForClip.length === 0 ) {\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t\tthis._removeInactiveBindingsForAction( action );\n\n\t}\n\n\t_removeInactiveBindingsForAction( action ) {\n\n\t\tconst bindings = action._propertyBindings;\n\n\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tconst binding = bindings[ i ];\n\n\t\t\tif ( -- binding.referenceCount === 0 ) {\n\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_lendAction( action ) {\n\n\t\t// [ active actions | inactive actions ]\n\t\t// [ active actions >| inactive actions ]\n\t\t// s a\n\t\t// <-swap->\n\t\t// a s\n\n\t\tconst actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveActions ++,\n\n\t\t\tfirstInactiveAction = actions[ lastActiveIndex ];\n\n\t\taction._cacheIndex = lastActiveIndex;\n\t\tactions[ lastActiveIndex ] = action;\n\n\t\tfirstInactiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = firstInactiveAction;\n\n\t}\n\n\t_takeBackAction( action ) {\n\n\t\t// [ active actions | inactive actions ]\n\t\t// [ active actions |< inactive actions ]\n\t\t// a s\n\t\t// <-swap->\n\t\t// s a\n\n\t\tconst actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveActions,\n\n\t\t\tlastActiveAction = actions[ firstInactiveIndex ];\n\n\t\taction._cacheIndex = firstInactiveIndex;\n\t\tactions[ firstInactiveIndex ] = action;\n\n\t\tlastActiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = lastActiveAction;\n\n\t}\n\n\t// Memory management for PropertyMixer objects\n\n\t_addInactiveBinding( binding, rootUuid, trackName ) {\n\n\t\tconst bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindings = this._bindings;\n\n\t\tlet bindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName === undefined ) {\n\n\t\t\tbindingByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingByName;\n\n\t\t}\n\n\t\tbindingByName[ trackName ] = binding;\n\n\t\tbinding._cacheIndex = bindings.length;\n\t\tbindings.push( binding );\n\n\t}\n\n\t_removeInactiveBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tpropBinding = binding.binding,\n\t\t\trootUuid = propBinding.rootNode.uuid,\n\t\t\ttrackName = propBinding.path,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\tlastInactiveBinding = bindings[ bindings.length - 1 ],\n\t\t\tcacheIndex = binding._cacheIndex;\n\n\t\tlastInactiveBinding._cacheIndex = cacheIndex;\n\t\tbindings[ cacheIndex ] = lastInactiveBinding;\n\t\tbindings.pop();\n\n\t\tdelete bindingByName[ trackName ];\n\n\t\tif ( Object.keys( bindingByName ).length === 0 ) {\n\n\t\t\tdelete bindingsByRoot[ rootUuid ];\n\n\t\t}\n\n\t}\n\n\t_lendBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveBindings ++,\n\n\t\t\tfirstInactiveBinding = bindings[ lastActiveIndex ];\n\n\t\tbinding._cacheIndex = lastActiveIndex;\n\t\tbindings[ lastActiveIndex ] = binding;\n\n\t\tfirstInactiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = firstInactiveBinding;\n\n\t}\n\n\t_takeBackBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveBindings,\n\n\t\t\tlastActiveBinding = bindings[ firstInactiveIndex ];\n\n\t\tbinding._cacheIndex = firstInactiveIndex;\n\t\tbindings[ firstInactiveIndex ] = binding;\n\n\t\tlastActiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = lastActiveBinding;\n\n\t}\n\n\n\t// Memory management of Interpolants for weight and time scale\n\n\t_lendControlInterpolant() {\n\n\t\tconst interpolants = this._controlInterpolants,\n\t\t\tlastActiveIndex = this._nActiveControlInterpolants ++;\n\n\t\tlet interpolant = interpolants[ lastActiveIndex ];\n\n\t\tif ( interpolant === undefined ) {\n\n\t\t\tinterpolant = new LinearInterpolant(\n\t\t\t\tnew Float32Array( 2 ), new Float32Array( 2 ),\n\t\t\t\t1, _controlInterpolantsResultBuffer );\n\n\t\t\tinterpolant.__cacheIndex = lastActiveIndex;\n\t\t\tinterpolants[ lastActiveIndex ] = interpolant;\n\n\t\t}\n\n\t\treturn interpolant;\n\n\t}\n\n\t_takeBackControlInterpolant( interpolant ) {\n\n\t\tconst interpolants = this._controlInterpolants,\n\t\t\tprevIndex = interpolant.__cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveControlInterpolants,\n\n\t\t\tlastActiveInterpolant = interpolants[ firstInactiveIndex ];\n\n\t\tinterpolant.__cacheIndex = firstInactiveIndex;\n\t\tinterpolants[ firstInactiveIndex ] = interpolant;\n\n\t\tlastActiveInterpolant.__cacheIndex = prevIndex;\n\t\tinterpolants[ prevIndex ] = lastActiveInterpolant;\n\n\t}\n\n\t// return an action for a clip optionally using a custom root target\n\t// object (this method allocates a lot of dynamic memory in case a\n\t// previously unknown clip/root combination is specified)\n\tclipAction( clip, optionalRoot, blendMode ) {\n\n\t\tconst root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid;\n\n\t\tlet clipObject = typeof clip === 'string' ? AnimationClip.findByName( root, clip ) : clip;\n\n\t\tconst clipUuid = clipObject !== null ? clipObject.uuid : clip;\n\n\t\tconst actionsForClip = this._actionsByClip[ clipUuid ];\n\t\tlet prototypeAction = null;\n\n\t\tif ( blendMode === undefined ) {\n\n\t\t\tif ( clipObject !== null ) {\n\n\t\t\t\tblendMode = clipObject.blendMode;\n\n\t\t\t} else {\n\n\t\t\t\tblendMode = NormalAnimationBlendMode;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\tconst existingAction = actionsForClip.actionByRoot[ rootUuid ];\n\n\t\t\tif ( existingAction !== undefined && existingAction.blendMode === blendMode ) {\n\n\t\t\t\treturn existingAction;\n\n\t\t\t}\n\n\t\t\t// we know the clip, so we don't have to parse all\n\t\t\t// the bindings again but can just copy\n\t\t\tprototypeAction = actionsForClip.knownActions[ 0 ];\n\n\t\t\t// also, take the clip from the prototype action\n\t\t\tif ( clipObject === null )\n\t\t\t\tclipObject = prototypeAction._clip;\n\n\t\t}\n\n\t\t// clip must be known when specified via string\n\t\tif ( clipObject === null ) return null;\n\n\t\t// allocate all resources required to run it\n\t\tconst newAction = new AnimationAction( this, clipObject, optionalRoot, blendMode );\n\n\t\tthis._bindAction( newAction, prototypeAction );\n\n\t\t// and make the action known to the memory manager\n\t\tthis._addInactiveAction( newAction, clipUuid, rootUuid );\n\n\t\treturn newAction;\n\n\t}\n\n\t// get an existing action\n\texistingAction( clip, optionalRoot ) {\n\n\t\tconst root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid,\n\n\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\tclipUuid = clipObject ? clipObject.uuid : clip,\n\n\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\treturn actionsForClip.actionByRoot[ rootUuid ] || null;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t// deactivates all previously scheduled actions\n\tstopAllAction() {\n\n\t\tconst actions = this._actions,\n\t\t\tnActions = this._nActiveActions;\n\n\t\tfor ( let i = nActions - 1; i >= 0; -- i ) {\n\n\t\t\tactions[ i ].stop();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// advance the time and update apply the animation\n\tupdate( deltaTime ) {\n\n\t\tdeltaTime *= this.timeScale;\n\n\t\tconst actions = this._actions,\n\t\t\tnActions = this._nActiveActions,\n\n\t\t\ttime = this.time += deltaTime,\n\t\t\ttimeDirection = Math.sign( deltaTime ),\n\n\t\t\taccuIndex = this._accuIndex ^= 1;\n\n\t\t// run active actions\n\n\t\tfor ( let i = 0; i !== nActions; ++ i ) {\n\n\t\t\tconst action = actions[ i ];\n\n\t\t\taction._update( time, deltaTime, timeDirection, accuIndex );\n\n\t\t}\n\n\t\t// update scene graph\n\n\t\tconst bindings = this._bindings,\n\t\t\tnBindings = this._nActiveBindings;\n\n\t\tfor ( let i = 0; i !== nBindings; ++ i ) {\n\n\t\t\tbindings[ i ].apply( accuIndex );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// Allows you to seek to a specific time in an animation.\n\tsetTime( timeInSeconds ) {\n\n\t\tthis.time = 0; // Zero out time attribute for AnimationMixer object;\n\t\tfor ( let i = 0; i < this._actions.length; i ++ ) {\n\n\t\t\tthis._actions[ i ].time = 0; // Zero out time attribute for all associated AnimationAction objects.\n\n\t\t}\n\n\t\treturn this.update( timeInSeconds ); // Update used to set exact time. Returns \"this\" AnimationMixer object.\n\n\t}\n\n\t// return this mixer's root target object\n\tgetRoot() {\n\n\t\treturn this._root;\n\n\t}\n\n\t// free all resources specific to a particular clip\n\tuncacheClip( clip ) {\n\n\t\tconst actions = this._actions,\n\t\t\tclipUuid = clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t// note: just calling _removeInactiveAction would mess up the\n\t\t\t// iteration state and also require updating the state we can\n\t\t\t// just throw away\n\n\t\t\tconst actionsToRemove = actionsForClip.knownActions;\n\n\t\t\tfor ( let i = 0, n = actionsToRemove.length; i !== n; ++ i ) {\n\n\t\t\t\tconst action = actionsToRemove[ i ];\n\n\t\t\t\tthis._deactivateAction( action );\n\n\t\t\t\tconst cacheIndex = action._cacheIndex,\n\t\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ];\n\n\t\t\t\taction._cacheIndex = null;\n\t\t\t\taction._byClipCacheIndex = null;\n\n\t\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\t\tactions.pop();\n\n\t\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t\t}\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t}\n\n\t// free all resources specific to a particular root target object\n\tuncacheRoot( root ) {\n\n\t\tconst rootUuid = root.uuid,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tfor ( const clipUuid in actionsByClip ) {\n\n\t\t\tconst actionByRoot = actionsByClip[ clipUuid ].actionByRoot,\n\t\t\t\taction = actionByRoot[ rootUuid ];\n\n\t\t\tif ( action !== undefined ) {\n\n\t\t\t\tthis._deactivateAction( action );\n\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName !== undefined ) {\n\n\t\t\tfor ( const trackName in bindingByName ) {\n\n\t\t\t\tconst binding = bindingByName[ trackName ];\n\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// remove a targeted clip from the cache\n\tuncacheAction( clip, optionalRoot ) {\n\n\t\tconst action = this.existingAction( clip, optionalRoot );\n\n\t\tif ( action !== null ) {\n\n\t\t\tthis._deactivateAction( action );\n\t\t\tthis._removeInactiveAction( action );\n\n\t\t}\n\n\t}\n\n}\n\nclass Uniform {\n\n\tconstructor( value ) {\n\n\t\tthis.value = value;\n\n\t}\n\n\tclone() {\n\n\t\treturn new Uniform( this.value.clone === undefined ? this.value : this.value.clone() );\n\n\t}\n\n}\n\nlet id = 0;\n\nclass UniformsGroup extends EventDispatcher {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isUniformsGroup = true;\n\n\t\tObject.defineProperty( this, 'id', { value: id ++ } );\n\n\t\tthis.name = '';\n\n\t\tthis.usage = StaticDrawUsage;\n\t\tthis.uniforms = [];\n\n\t}\n\n\tadd( uniform ) {\n\n\t\tthis.uniforms.push( uniform );\n\n\t\treturn this;\n\n\t}\n\n\tremove( uniform ) {\n\n\t\tconst index = this.uniforms.indexOf( uniform );\n\n\t\tif ( index !== - 1 ) this.uniforms.splice( index, 1 );\n\n\t\treturn this;\n\n\t}\n\n\tsetName( name ) {\n\n\t\tthis.name = name;\n\n\t\treturn this;\n\n\t}\n\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.usage = source.usage;\n\n\t\tconst uniformsSource = source.uniforms;\n\n\t\tthis.uniforms.length = 0;\n\n\t\tfor ( let i = 0, l = uniformsSource.length; i < l; i ++ ) {\n\n\t\t\tthis.uniforms.push( uniformsSource[ i ].clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nclass InstancedInterleavedBuffer extends InterleavedBuffer {\n\n\tconstructor( array, stride, meshPerAttribute = 1 ) {\n\n\t\tsuper( array, stride );\n\n\t\tthis.isInstancedInterleavedBuffer = true;\n\n\t\tthis.meshPerAttribute = meshPerAttribute;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n\tclone( data ) {\n\n\t\tconst ib = super.clone( data );\n\n\t\tib.meshPerAttribute = this.meshPerAttribute;\n\n\t\treturn ib;\n\n\t}\n\n\ttoJSON( data ) {\n\n\t\tconst json = super.toJSON( data );\n\n\t\tjson.isInstancedInterleavedBuffer = true;\n\t\tjson.meshPerAttribute = this.meshPerAttribute;\n\n\t\treturn json;\n\n\t}\n\n}\n\nclass GLBufferAttribute {\n\n\tconstructor( buffer, type, itemSize, elementSize, count ) {\n\n\t\tthis.isGLBufferAttribute = true;\n\n\t\tthis.name = '';\n\n\t\tthis.buffer = buffer;\n\t\tthis.type = type;\n\t\tthis.itemSize = itemSize;\n\t\tthis.elementSize = elementSize;\n\t\tthis.count = count;\n\n\t\tthis.version = 0;\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\tsetBuffer( buffer ) {\n\n\t\tthis.buffer = buffer;\n\n\t\treturn this;\n\n\t}\n\n\tsetType( type, elementSize ) {\n\n\t\tthis.type = type;\n\t\tthis.elementSize = elementSize;\n\n\t\treturn this;\n\n\t}\n\n\tsetItemSize( itemSize ) {\n\n\t\tthis.itemSize = itemSize;\n\n\t\treturn this;\n\n\t}\n\n\tsetCount( count ) {\n\n\t\tthis.count = count;\n\n\t\treturn this;\n\n\t}\n\n}\n\nclass Raycaster {\n\n\tconstructor( origin, direction, near = 0, far = Infinity ) {\n\n\t\tthis.ray = new Ray( origin, direction );\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\tthis.near = near;\n\t\tthis.far = far;\n\t\tthis.camera = null;\n\t\tthis.layers = new Layers();\n\n\t\tthis.params = {\n\t\t\tMesh: {},\n\t\t\tLine: { threshold: 1 },\n\t\t\tLOD: {},\n\t\t\tPoints: { threshold: 1 },\n\t\t\tSprite: {}\n\t\t};\n\n\t}\n\n\tset( origin, direction ) {\n\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\tthis.ray.set( origin, direction );\n\n\t}\n\n\tsetFromCamera( coords, camera ) {\n\n\t\tif ( camera.isPerspectiveCamera ) {\n\n\t\t\tthis.ray.origin.setFromMatrixPosition( camera.matrixWorld );\n\t\t\tthis.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();\n\t\t\tthis.camera = camera;\n\n\t\t} else if ( camera.isOrthographicCamera ) {\n\n\t\t\tthis.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera\n\t\t\tthis.ray.direction.set( 0, 0, - 1 ).transformDirection( camera.matrixWorld );\n\t\t\tthis.camera = camera;\n\n\t\t} else {\n\n\t\t\tconsole.error( 'THREE.Raycaster: Unsupported camera type: ' + camera.type );\n\n\t\t}\n\n\t}\n\n\tintersectObject( object, recursive = true, intersects = [] ) {\n\n\t\tintersectObject( object, this, intersects, recursive );\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t}\n\n\tintersectObjects( objects, recursive = true, intersects = [] ) {\n\n\t\tfor ( let i = 0, l = objects.length; i < l; i ++ ) {\n\n\t\t\tintersectObject( objects[ i ], this, intersects, recursive );\n\n\t\t}\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t}\n\n}\n\nfunction ascSort( a, b ) {\n\n\treturn a.distance - b.distance;\n\n}\n\nfunction intersectObject( object, raycaster, intersects, recursive ) {\n\n\tif ( object.layers.test( raycaster.layers ) ) {\n\n\t\tobject.raycast( raycaster, intersects );\n\n\t}\n\n\tif ( recursive === true ) {\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tintersectObject( children[ i ], raycaster, intersects, true );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Ref: https://en.wikipedia.org/wiki/Spherical_coordinate_system\n *\n * The polar angle (phi) is measured from the positive y-axis. The positive y-axis is up.\n * The azimuthal angle (theta) is measured from the positive z-axis.\n */\n\nclass Spherical {\n\n\tconstructor( radius = 1, phi = 0, theta = 0 ) {\n\n\t\tthis.radius = radius;\n\t\tthis.phi = phi; // polar angle\n\t\tthis.theta = theta; // azimuthal angle\n\n\t\treturn this;\n\n\t}\n\n\tset( radius, phi, theta ) {\n\n\t\tthis.radius = radius;\n\t\tthis.phi = phi;\n\t\tthis.theta = theta;\n\n\t\treturn this;\n\n\t}\n\n\tcopy( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.phi = other.phi;\n\t\tthis.theta = other.theta;\n\n\t\treturn this;\n\n\t}\n\n\t// restrict phi to be between EPS and PI-EPS\n\tmakeSafe() {\n\n\t\tconst EPS = 0.000001;\n\t\tthis.phi = Math.max( EPS, Math.min( Math.PI - EPS, this.phi ) );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromVector3( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t}\n\n\tsetFromCartesianCoords( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + y * y + z * z );\n\n\t\tif ( this.radius === 0 ) {\n\n\t\t\tthis.theta = 0;\n\t\t\tthis.phi = 0;\n\n\t\t} else {\n\n\t\t\tthis.theta = Math.atan2( x, z );\n\t\t\tthis.phi = Math.acos( clamp( y / this.radius, - 1, 1 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * Ref: https://en.wikipedia.org/wiki/Cylindrical_coordinate_system\n */\n\nclass Cylindrical {\n\n\tconstructor( radius = 1, theta = 0, y = 0 ) {\n\n\t\tthis.radius = radius; // distance from the origin to a point in the x-z plane\n\t\tthis.theta = theta; // counterclockwise angle in the x-z plane measured in radians from the positive z-axis\n\t\tthis.y = y; // height above the x-z plane\n\n\t\treturn this;\n\n\t}\n\n\tset( radius, theta, y ) {\n\n\t\tthis.radius = radius;\n\t\tthis.theta = theta;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tcopy( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.theta = other.theta;\n\t\tthis.y = other.y;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromVector3( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t}\n\n\tsetFromCartesianCoords( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + z * z );\n\t\tthis.theta = Math.atan2( x, z );\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _vector$4 = /*@__PURE__*/ new Vector2();\n\nclass Box2 {\n\n\tconstructor( min = new Vector2( + Infinity, + Infinity ), max = new Vector2( - Infinity, - Infinity ) ) {\n\n\t\tthis.isBox2 = true;\n\n\t\tthis.min = min;\n\t\tthis.max = max;\n\n\t}\n\n\tset( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCenterAndSize( center, size ) {\n\n\t\tconst halfSize = _vector$4.copy( size ).multiplyScalar( 0.5 );\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\tcopy( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t}\n\n\tmakeEmpty() {\n\n\t\tthis.min.x = this.min.y = + Infinity;\n\t\tthis.max.x = this.max.y = - Infinity;\n\n\t\treturn this;\n\n\t}\n\n\tisEmpty() {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );\n\n\t}\n\n\tgetCenter( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t}\n\n\tgetSize( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\texpandByPoint( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t}\n\n\texpandByVector( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t}\n\n\texpandByScalar( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\treturn point.x < this.min.x || point.x > this.max.x ||\n\t\t\tpoint.y < this.min.y || point.y > this.max.y ? false : true;\n\n\t}\n\n\tcontainsBox( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y;\n\n\t}\n\n\tgetParameter( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y )\n\t\t);\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\t// using 4 splitting planes to rule out intersections\n\n\t\treturn box.max.x < this.min.x || box.min.x > this.max.x ||\n\t\t\tbox.max.y < this.min.y || box.min.y > this.max.y ? false : true;\n\n\t}\n\n\tclampPoint( point, target ) {\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\tconst clampedPoint = _vector$4.copy( point ).clamp( this.min, this.max );\n\t\treturn clampedPoint.sub( point ).length();\n\n\t}\n\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\treturn this;\n\n\t}\n\n\tunion( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\tequals( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n}\n\nconst _startP = /*@__PURE__*/ new Vector3();\nconst _startEnd = /*@__PURE__*/ new Vector3();\n\nclass Line3 {\n\n\tconstructor( start = new Vector3(), end = new Vector3() ) {\n\n\t\tthis.start = start;\n\t\tthis.end = end;\n\n\t}\n\n\tset( start, end ) {\n\n\t\tthis.start.copy( start );\n\t\tthis.end.copy( end );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( line ) {\n\n\t\tthis.start.copy( line.start );\n\t\tthis.end.copy( line.end );\n\n\t\treturn this;\n\n\t}\n\n\tgetCenter( target ) {\n\n\t\treturn target.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\n\n\t}\n\n\tdelta( target ) {\n\n\t\treturn target.subVectors( this.end, this.start );\n\n\t}\n\n\tdistanceSq() {\n\n\t\treturn this.start.distanceToSquared( this.end );\n\n\t}\n\n\tdistance() {\n\n\t\treturn this.start.distanceTo( this.end );\n\n\t}\n\n\tat( t, target ) {\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t}\n\n\tclosestPointToPointParameter( point, clampToLine ) {\n\n\t\t_startP.subVectors( point, this.start );\n\t\t_startEnd.subVectors( this.end, this.start );\n\n\t\tconst startEnd2 = _startEnd.dot( _startEnd );\n\t\tconst startEnd_startP = _startEnd.dot( _startP );\n\n\t\tlet t = startEnd_startP / startEnd2;\n\n\t\tif ( clampToLine ) {\n\n\t\t\tt = clamp( t, 0, 1 );\n\n\t\t}\n\n\t\treturn t;\n\n\t}\n\n\tclosestPointToPoint( point, clampToLine, target ) {\n\n\t\tconst t = this.closestPointToPointParameter( point, clampToLine );\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t}\n\n\tapplyMatrix4( matrix ) {\n\n\t\tthis.start.applyMatrix4( matrix );\n\t\tthis.end.applyMatrix4( matrix );\n\n\t\treturn this;\n\n\t}\n\n\tequals( line ) {\n\n\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _vector$3 = /*@__PURE__*/ new Vector3();\n\nclass SpotLightHelper extends Object3D {\n\n\tconstructor( light, color ) {\n\n\t\tsuper();\n\n\t\tthis.light = light;\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.color = color;\n\n\t\tthis.type = 'SpotLightHelper';\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst positions = [\n\t\t\t0, 0, 0, \t0, 0, 1,\n\t\t\t0, 0, 0, \t1, 0, 1,\n\t\t\t0, 0, 0,\t- 1, 0, 1,\n\t\t\t0, 0, 0, \t0, 1, 1,\n\t\t\t0, 0, 0, \t0, - 1, 1\n\t\t];\n\n\t\tfor ( let i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {\n\n\t\t\tconst p1 = ( i / l ) * Math.PI * 2;\n\t\t\tconst p2 = ( j / l ) * Math.PI * 2;\n\n\t\t\tpositions.push(\n\t\t\t\tMath.cos( p1 ), Math.sin( p1 ), 1,\n\t\t\t\tMath.cos( p2 ), Math.sin( p2 ), 1\n\t\t\t);\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { fog: false, toneMapped: false } );\n\n\t\tthis.cone = new LineSegments( geometry, material );\n\t\tthis.add( this.cone );\n\n\t\tthis.update();\n\n\t}\n\n\tdispose() {\n\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t}\n\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\t\tthis.light.target.updateWorldMatrix( true, false );\n\n\t\tconst coneLength = this.light.distance ? this.light.distance : 1000;\n\t\tconst coneWidth = coneLength * Math.tan( this.light.angle );\n\n\t\tthis.cone.scale.set( coneWidth, coneWidth, coneLength );\n\n\t\t_vector$3.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\tthis.cone.lookAt( _vector$3 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.cone.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.cone.material.color.copy( this.light.color );\n\n\t\t}\n\n\t}\n\n}\n\nconst _vector$2 = /*@__PURE__*/ new Vector3();\nconst _boneMatrix = /*@__PURE__*/ new Matrix4();\nconst _matrixWorldInv = /*@__PURE__*/ new Matrix4();\n\n\nclass SkeletonHelper extends LineSegments {\n\n\tconstructor( object ) {\n\n\t\tconst bones = getBoneList( object );\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\tconst color1 = new Color( 0, 0, 1 );\n\t\tconst color2 = new Color( 0, 1, 0 );\n\n\t\tfor ( let i = 0; i < bones.length; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tcolors.push( color1.r, color1.g, color1.b );\n\t\t\t\tcolors.push( color2.r, color2.g, color2.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, depthTest: false, depthWrite: false, toneMapped: false, transparent: true } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.isSkeletonHelper = true;\n\n\t\tthis.type = 'SkeletonHelper';\n\n\t\tthis.root = object;\n\t\tthis.bones = bones;\n\n\t\tthis.matrix = object.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst bones = this.bones;\n\n\t\tconst geometry = this.geometry;\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\t_matrixWorldInv.copy( this.root.matrixWorld ).invert();\n\n\t\tfor ( let i = 0, j = 0; i < bones.length; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t_boneMatrix.multiplyMatrices( _matrixWorldInv, bone.matrixWorld );\n\t\t\t\t_vector$2.setFromMatrixPosition( _boneMatrix );\n\t\t\t\tposition.setXYZ( j, _vector$2.x, _vector$2.y, _vector$2.z );\n\n\t\t\t\t_boneMatrix.multiplyMatrices( _matrixWorldInv, bone.parent.matrixWorld );\n\t\t\t\t_vector$2.setFromMatrixPosition( _boneMatrix );\n\t\t\t\tposition.setXYZ( j + 1, _vector$2.x, _vector$2.y, _vector$2.z );\n\n\t\t\t\tj += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n\nfunction getBoneList( object ) {\n\n\tconst boneList = [];\n\n\tif ( object.isBone === true ) {\n\n\t\tboneList.push( object );\n\n\t}\n\n\tfor ( let i = 0; i < object.children.length; i ++ ) {\n\n\t\tboneList.push.apply( boneList, getBoneList( object.children[ i ] ) );\n\n\t}\n\n\treturn boneList;\n\n}\n\nclass PointLightHelper extends Mesh {\n\n\tconstructor( light, sphereSize, color ) {\n\n\t\tconst geometry = new SphereGeometry( sphereSize, 4, 2 );\n\t\tconst material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.light = light;\n\n\t\tthis.color = color;\n\n\t\tthis.type = 'PointLightHelper';\n\n\t\tthis.matrix = this.light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\n\t\t/*\n\t// TODO: delete this comment?\n\tconst distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );\n\tconst distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );\n\n\tthis.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );\n\tthis.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );\n\n\tconst d = light.distance;\n\n\tif ( d === 0.0 ) {\n\n\t\tthis.lightDistance.visible = false;\n\n\t} else {\n\n\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t}\n\n\tthis.add( this.lightDistance );\n\t*/\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\t/*\n\t\tconst d = this.light.distance;\n\n\t\tif ( d === 0.0 ) {\n\n\t\t\tthis.lightDistance.visible = false;\n\n\t\t} else {\n\n\t\t\tthis.lightDistance.visible = true;\n\t\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t\t}\n\t\t*/\n\n\t}\n\n}\n\nconst _vector$1 = /*@__PURE__*/ new Vector3();\nconst _color1 = /*@__PURE__*/ new Color();\nconst _color2 = /*@__PURE__*/ new Color();\n\nclass HemisphereLightHelper extends Object3D {\n\n\tconstructor( light, size, color ) {\n\n\t\tsuper();\n\n\t\tthis.light = light;\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.color = color;\n\n\t\tthis.type = 'HemisphereLightHelper';\n\n\t\tconst geometry = new OctahedronGeometry( size );\n\t\tgeometry.rotateY( Math.PI * 0.5 );\n\n\t\tthis.material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );\n\t\tif ( this.color === undefined ) this.material.vertexColors = true;\n\n\t\tconst position = geometry.getAttribute( 'position' );\n\t\tconst colors = new Float32Array( position.count * 3 );\n\n\t\tgeometry.setAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\n\t\tthis.add( new Mesh( geometry, this.material ) );\n\n\t\tthis.update();\n\n\t}\n\n\tdispose() {\n\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t}\n\n\tupdate() {\n\n\t\tconst mesh = this.children[ 0 ];\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tconst colors = mesh.geometry.getAttribute( 'color' );\n\n\t\t\t_color1.copy( this.light.color );\n\t\t\t_color2.copy( this.light.groundColor );\n\n\t\t\tfor ( let i = 0, l = colors.count; i < l; i ++ ) {\n\n\t\t\t\tconst color = ( i < ( l / 2 ) ) ? _color1 : _color2;\n\n\t\t\t\tcolors.setXYZ( i, color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t\tcolors.needsUpdate = true;\n\n\t\t}\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\n\t\tmesh.lookAt( _vector$1.setFromMatrixPosition( this.light.matrixWorld ).negate() );\n\n\t}\n\n}\n\nclass GridHelper extends LineSegments {\n\n\tconstructor( size = 10, divisions = 10, color1 = 0x444444, color2 = 0x888888 ) {\n\n\t\tcolor1 = new Color( color1 );\n\t\tcolor2 = new Color( color2 );\n\n\t\tconst center = divisions / 2;\n\t\tconst step = size / divisions;\n\t\tconst halfSize = size / 2;\n\n\t\tconst vertices = [], colors = [];\n\n\t\tfor ( let i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) {\n\n\t\t\tvertices.push( - halfSize, 0, k, halfSize, 0, k );\n\t\t\tvertices.push( k, 0, - halfSize, k, 0, halfSize );\n\n\t\t\tconst color = i === center ? color1 : color2;\n\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'GridHelper';\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nclass PolarGridHelper extends LineSegments {\n\n\tconstructor( radius = 10, sectors = 16, rings = 8, divisions = 64, color1 = 0x444444, color2 = 0x888888 ) {\n\n\t\tcolor1 = new Color( color1 );\n\t\tcolor2 = new Color( color2 );\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\t// create the sectors\n\n\t\tif ( sectors > 1 ) {\n\n\t\t\tfor ( let i = 0; i < sectors; i ++ ) {\n\n\t\t\t\tconst v = ( i / sectors ) * ( Math.PI * 2 );\n\n\t\t\t\tconst x = Math.sin( v ) * radius;\n\t\t\t\tconst z = Math.cos( v ) * radius;\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( x, 0, z );\n\n\t\t\t\tconst color = ( i & 1 ) ? color1 : color2;\n\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// create the rings\n\n\t\tfor ( let i = 0; i < rings; i ++ ) {\n\n\t\t\tconst color = ( i & 1 ) ? color1 : color2;\n\n\t\t\tconst r = radius - ( radius / rings * i );\n\n\t\t\tfor ( let j = 0; j < divisions; j ++ ) {\n\n\t\t\t\t// first vertex\n\n\t\t\t\tlet v = ( j / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tlet x = Math.sin( v ) * r;\n\t\t\t\tlet z = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t\t// second vertex\n\n\t\t\t\tv = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tx = Math.sin( v ) * r;\n\t\t\t\tz = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'PolarGridHelper';\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _v2 = /*@__PURE__*/ new Vector3();\nconst _v3 = /*@__PURE__*/ new Vector3();\n\nclass DirectionalLightHelper extends Object3D {\n\n\tconstructor( light, size, color ) {\n\n\t\tsuper();\n\n\t\tthis.light = light;\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.color = color;\n\n\t\tthis.type = 'DirectionalLightHelper';\n\n\t\tif ( size === undefined ) size = 1;\n\n\t\tlet geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [\n\t\t\t- size, size, 0,\n\t\t\tsize, size, 0,\n\t\t\tsize, - size, 0,\n\t\t\t- size, - size, 0,\n\t\t\t- size, size, 0\n\t\t], 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { fog: false, toneMapped: false } );\n\n\t\tthis.lightPlane = new Line( geometry, material );\n\t\tthis.add( this.lightPlane );\n\n\t\tgeometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );\n\n\t\tthis.targetLine = new Line( geometry, material );\n\t\tthis.add( this.targetLine );\n\n\t\tthis.update();\n\n\t}\n\n\tdispose() {\n\n\t\tthis.lightPlane.geometry.dispose();\n\t\tthis.lightPlane.material.dispose();\n\t\tthis.targetLine.geometry.dispose();\n\t\tthis.targetLine.material.dispose();\n\n\t}\n\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\t\tthis.light.target.updateWorldMatrix( true, false );\n\n\t\t_v1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t_v2.setFromMatrixPosition( this.light.target.matrixWorld );\n\t\t_v3.subVectors( _v2, _v1 );\n\n\t\tthis.lightPlane.lookAt( _v2 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.lightPlane.material.color.set( this.color );\n\t\t\tthis.targetLine.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.lightPlane.material.color.copy( this.light.color );\n\t\t\tthis.targetLine.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\tthis.targetLine.lookAt( _v2 );\n\t\tthis.targetLine.scale.z = _v3.length();\n\n\t}\n\n}\n\nconst _vector = /*@__PURE__*/ new Vector3();\nconst _camera = /*@__PURE__*/ new Camera();\n\n/**\n *\t- shows frustum, line of sight and up of the camera\n *\t- suitable for fast updates\n * \t- based on frustum visualization in lightgl.js shadowmap example\n *\t\thttps://github.com/evanw/lightgl.js/blob/master/tests/shadowmap.html\n */\n\nclass CameraHelper extends LineSegments {\n\n\tconstructor( camera ) {\n\n\t\tconst geometry = new BufferGeometry();\n\t\tconst material = new LineBasicMaterial( { color: 0xffffff, vertexColors: true, toneMapped: false } );\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\tconst pointMap = {};\n\n\t\t// near\n\n\t\taddLine( 'n1', 'n2' );\n\t\taddLine( 'n2', 'n4' );\n\t\taddLine( 'n4', 'n3' );\n\t\taddLine( 'n3', 'n1' );\n\n\t\t// far\n\n\t\taddLine( 'f1', 'f2' );\n\t\taddLine( 'f2', 'f4' );\n\t\taddLine( 'f4', 'f3' );\n\t\taddLine( 'f3', 'f1' );\n\n\t\t// sides\n\n\t\taddLine( 'n1', 'f1' );\n\t\taddLine( 'n2', 'f2' );\n\t\taddLine( 'n3', 'f3' );\n\t\taddLine( 'n4', 'f4' );\n\n\t\t// cone\n\n\t\taddLine( 'p', 'n1' );\n\t\taddLine( 'p', 'n2' );\n\t\taddLine( 'p', 'n3' );\n\t\taddLine( 'p', 'n4' );\n\n\t\t// up\n\n\t\taddLine( 'u1', 'u2' );\n\t\taddLine( 'u2', 'u3' );\n\t\taddLine( 'u3', 'u1' );\n\n\t\t// target\n\n\t\taddLine( 'c', 't' );\n\t\taddLine( 'p', 'c' );\n\n\t\t// cross\n\n\t\taddLine( 'cn1', 'cn2' );\n\t\taddLine( 'cn3', 'cn4' );\n\n\t\taddLine( 'cf1', 'cf2' );\n\t\taddLine( 'cf3', 'cf4' );\n\n\t\tfunction addLine( a, b ) {\n\n\t\t\taddPoint( a );\n\t\t\taddPoint( b );\n\n\t\t}\n\n\t\tfunction addPoint( id ) {\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tcolors.push( 0, 0, 0 );\n\n\t\t\tif ( pointMap[ id ] === undefined ) {\n\n\t\t\t\tpointMap[ id ] = [];\n\n\t\t\t}\n\n\t\t\tpointMap[ id ].push( ( vertices.length / 3 ) - 1 );\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'CameraHelper';\n\n\t\tthis.camera = camera;\n\t\tif ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix();\n\n\t\tthis.matrix = camera.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.pointMap = pointMap;\n\n\t\tthis.update();\n\n\t\t// colors\n\n\t\tconst colorFrustum = new Color( 0xffaa00 );\n\t\tconst colorCone = new Color( 0xff0000 );\n\t\tconst colorUp = new Color( 0x00aaff );\n\t\tconst colorTarget = new Color( 0xffffff );\n\t\tconst colorCross = new Color( 0x333333 );\n\n\t\tthis.setColors( colorFrustum, colorCone, colorUp, colorTarget, colorCross );\n\n\t}\n\n\tsetColors( frustum, cone, up, target, cross ) {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst colorAttribute = geometry.getAttribute( 'color' );\n\n\t\t// near\n\n\t\tcolorAttribute.setXYZ( 0, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 1, frustum.r, frustum.g, frustum.b ); // n1, n2\n\t\tcolorAttribute.setXYZ( 2, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 3, frustum.r, frustum.g, frustum.b ); // n2, n4\n\t\tcolorAttribute.setXYZ( 4, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 5, frustum.r, frustum.g, frustum.b ); // n4, n3\n\t\tcolorAttribute.setXYZ( 6, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 7, frustum.r, frustum.g, frustum.b ); // n3, n1\n\n\t\t// far\n\n\t\tcolorAttribute.setXYZ( 8, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 9, frustum.r, frustum.g, frustum.b ); // f1, f2\n\t\tcolorAttribute.setXYZ( 10, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 11, frustum.r, frustum.g, frustum.b ); // f2, f4\n\t\tcolorAttribute.setXYZ( 12, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 13, frustum.r, frustum.g, frustum.b ); // f4, f3\n\t\tcolorAttribute.setXYZ( 14, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 15, frustum.r, frustum.g, frustum.b ); // f3, f1\n\n\t\t// sides\n\n\t\tcolorAttribute.setXYZ( 16, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 17, frustum.r, frustum.g, frustum.b ); // n1, f1\n\t\tcolorAttribute.setXYZ( 18, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 19, frustum.r, frustum.g, frustum.b ); // n2, f2\n\t\tcolorAttribute.setXYZ( 20, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 21, frustum.r, frustum.g, frustum.b ); // n3, f3\n\t\tcolorAttribute.setXYZ( 22, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 23, frustum.r, frustum.g, frustum.b ); // n4, f4\n\n\t\t// cone\n\n\t\tcolorAttribute.setXYZ( 24, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 25, cone.r, cone.g, cone.b ); // p, n1\n\t\tcolorAttribute.setXYZ( 26, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 27, cone.r, cone.g, cone.b ); // p, n2\n\t\tcolorAttribute.setXYZ( 28, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 29, cone.r, cone.g, cone.b ); // p, n3\n\t\tcolorAttribute.setXYZ( 30, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 31, cone.r, cone.g, cone.b ); // p, n4\n\n\t\t// up\n\n\t\tcolorAttribute.setXYZ( 32, up.r, up.g, up.b ); colorAttribute.setXYZ( 33, up.r, up.g, up.b ); // u1, u2\n\t\tcolorAttribute.setXYZ( 34, up.r, up.g, up.b ); colorAttribute.setXYZ( 35, up.r, up.g, up.b ); // u2, u3\n\t\tcolorAttribute.setXYZ( 36, up.r, up.g, up.b ); colorAttribute.setXYZ( 37, up.r, up.g, up.b ); // u3, u1\n\n\t\t// target\n\n\t\tcolorAttribute.setXYZ( 38, target.r, target.g, target.b ); colorAttribute.setXYZ( 39, target.r, target.g, target.b ); // c, t\n\t\tcolorAttribute.setXYZ( 40, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 41, cross.r, cross.g, cross.b ); // p, c\n\n\t\t// cross\n\n\t\tcolorAttribute.setXYZ( 42, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 43, cross.r, cross.g, cross.b ); // cn1, cn2\n\t\tcolorAttribute.setXYZ( 44, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 45, cross.r, cross.g, cross.b ); // cn3, cn4\n\n\t\tcolorAttribute.setXYZ( 46, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 47, cross.r, cross.g, cross.b ); // cf1, cf2\n\t\tcolorAttribute.setXYZ( 48, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 49, cross.r, cross.g, cross.b ); // cf3, cf4\n\n\t\tcolorAttribute.needsUpdate = true;\n\n\t}\n\n\tupdate() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst pointMap = this.pointMap;\n\n\t\tconst w = 1, h = 1;\n\n\t\t// we need just camera projection matrix inverse\n\t\t// world matrix must be identity\n\n\t\t_camera.projectionMatrixInverse.copy( this.camera.projectionMatrixInverse );\n\n\t\t// center / target\n\n\t\tsetPoint( 'c', pointMap, geometry, _camera, 0, 0, - 1 );\n\t\tsetPoint( 't', pointMap, geometry, _camera, 0, 0, 1 );\n\n\t\t// near\n\n\t\tsetPoint( 'n1', pointMap, geometry, _camera, - w, - h, - 1 );\n\t\tsetPoint( 'n2', pointMap, geometry, _camera, w, - h, - 1 );\n\t\tsetPoint( 'n3', pointMap, geometry, _camera, - w, h, - 1 );\n\t\tsetPoint( 'n4', pointMap, geometry, _camera, w, h, - 1 );\n\n\t\t// far\n\n\t\tsetPoint( 'f1', pointMap, geometry, _camera, - w, - h, 1 );\n\t\tsetPoint( 'f2', pointMap, geometry, _camera, w, - h, 1 );\n\t\tsetPoint( 'f3', pointMap, geometry, _camera, - w, h, 1 );\n\t\tsetPoint( 'f4', pointMap, geometry, _camera, w, h, 1 );\n\n\t\t// up\n\n\t\tsetPoint( 'u1', pointMap, geometry, _camera, w * 0.7, h * 1.1, - 1 );\n\t\tsetPoint( 'u2', pointMap, geometry, _camera, - w * 0.7, h * 1.1, - 1 );\n\t\tsetPoint( 'u3', pointMap, geometry, _camera, 0, h * 2, - 1 );\n\n\t\t// cross\n\n\t\tsetPoint( 'cf1', pointMap, geometry, _camera, - w, 0, 1 );\n\t\tsetPoint( 'cf2', pointMap, geometry, _camera, w, 0, 1 );\n\t\tsetPoint( 'cf3', pointMap, geometry, _camera, 0, - h, 1 );\n\t\tsetPoint( 'cf4', pointMap, geometry, _camera, 0, h, 1 );\n\n\t\tsetPoint( 'cn1', pointMap, geometry, _camera, - w, 0, - 1 );\n\t\tsetPoint( 'cn2', pointMap, geometry, _camera, w, 0, - 1 );\n\t\tsetPoint( 'cn3', pointMap, geometry, _camera, 0, - h, - 1 );\n\t\tsetPoint( 'cn4', pointMap, geometry, _camera, 0, h, - 1 );\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n\nfunction setPoint( point, pointMap, geometry, camera, x, y, z ) {\n\n\t_vector.set( x, y, z ).unproject( camera );\n\n\tconst points = pointMap[ point ];\n\n\tif ( points !== undefined ) {\n\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tposition.setXYZ( points[ i ], _vector.x, _vector.y, _vector.z );\n\n\t\t}\n\n\t}\n\n}\n\nconst _box = /*@__PURE__*/ new Box3();\n\nclass BoxHelper extends LineSegments {\n\n\tconstructor( object, color = 0xffff00 ) {\n\n\t\tconst indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\t\tconst positions = new Float32Array( 8 * 3 );\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tgeometry.setAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\tthis.object = object;\n\t\tthis.type = 'BoxHelper';\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\tupdate( object ) {\n\n\t\tif ( object !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.BoxHelper: .update() has no longer arguments.' );\n\n\t\t}\n\n\t\tif ( this.object !== undefined ) {\n\n\t\t\t_box.setFromObject( this.object );\n\n\t\t}\n\n\t\tif ( _box.isEmpty() ) return;\n\n\t\tconst min = _box.min;\n\t\tconst max = _box.max;\n\n\t\t/*\n\t\t\t5____4\n\t\t1/___0/|\n\t\t| 6__|_7\n\t\t2/___3/\n\n\t\t0: max.x, max.y, max.z\n\t\t1: min.x, max.y, max.z\n\t\t2: min.x, min.y, max.z\n\t\t3: max.x, min.y, max.z\n\t\t4: max.x, max.y, min.z\n\t\t5: min.x, max.y, min.z\n\t\t6: min.x, min.y, min.z\n\t\t7: max.x, min.y, min.z\n\t\t*/\n\n\t\tconst position = this.geometry.attributes.position;\n\t\tconst array = position.array;\n\n\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\tposition.needsUpdate = true;\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t}\n\n\tsetFromObject( object ) {\n\n\t\tthis.object = object;\n\t\tthis.update();\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.object = source.object;\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nclass Box3Helper extends LineSegments {\n\n\tconstructor( box, color = 0xffff00 ) {\n\n\t\tconst indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\n\t\tconst positions = [ 1, 1, 1, - 1, 1, 1, - 1, - 1, 1, 1, - 1, 1, 1, 1, - 1, - 1, 1, - 1, - 1, - 1, - 1, 1, - 1, - 1 ];\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\tthis.box = box;\n\n\t\tthis.type = 'Box3Helper';\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst box = this.box;\n\n\t\tif ( box.isEmpty() ) return;\n\n\t\tbox.getCenter( this.position );\n\n\t\tbox.getSize( this.scale );\n\n\t\tthis.scale.multiplyScalar( 0.5 );\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nclass PlaneHelper extends Line {\n\n\tconstructor( plane, size = 1, hex = 0xffff00 ) {\n\n\t\tconst color = hex;\n\n\t\tconst positions = [ 1, - 1, 0, - 1, 1, 0, - 1, - 1, 0, 1, 1, 0, - 1, 1, 0, - 1, - 1, 0, 1, - 1, 0, 1, 1, 0 ];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\t\tgeometry.computeBoundingSphere();\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\tthis.type = 'PlaneHelper';\n\n\t\tthis.plane = plane;\n\n\t\tthis.size = size;\n\n\t\tconst positions2 = [ 1, 1, 0, - 1, 1, 0, - 1, - 1, 0, 1, 1, 0, - 1, - 1, 0, 1, - 1, 0 ];\n\n\t\tconst geometry2 = new BufferGeometry();\n\t\tgeometry2.setAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) );\n\t\tgeometry2.computeBoundingSphere();\n\n\t\tthis.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false, toneMapped: false } ) ) );\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tthis.position.set( 0, 0, 0 );\n\n\t\tthis.scale.set( 0.5 * this.size, 0.5 * this.size, 1 );\n\n\t\tthis.lookAt( this.plane.normal );\n\n\t\tthis.translateZ( - this.plane.constant );\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t}\n\n}\n\nconst _axis = /*@__PURE__*/ new Vector3();\nlet _lineGeometry, _coneGeometry;\n\nclass ArrowHelper extends Object3D {\n\n\t// dir is assumed to be normalized\n\n\tconstructor( dir = new Vector3( 0, 0, 1 ), origin = new Vector3( 0, 0, 0 ), length = 1, color = 0xffff00, headLength = length * 0.2, headWidth = headLength * 0.2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ArrowHelper';\n\n\t\tif ( _lineGeometry === undefined ) {\n\n\t\t\t_lineGeometry = new BufferGeometry();\n\t\t\t_lineGeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );\n\n\t\t\t_coneGeometry = new CylinderGeometry( 0, 0.5, 1, 5, 1 );\n\t\t\t_coneGeometry.translate( 0, - 0.5, 0 );\n\n\t\t}\n\n\t\tthis.position.copy( origin );\n\n\t\tthis.line = new Line( _lineGeometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\t\tthis.line.matrixAutoUpdate = false;\n\t\tthis.add( this.line );\n\n\t\tthis.cone = new Mesh( _coneGeometry, new MeshBasicMaterial( { color: color, toneMapped: false } ) );\n\t\tthis.cone.matrixAutoUpdate = false;\n\t\tthis.add( this.cone );\n\n\t\tthis.setDirection( dir );\n\t\tthis.setLength( length, headLength, headWidth );\n\n\t}\n\n\tsetDirection( dir ) {\n\n\t\t// dir is assumed to be normalized\n\n\t\tif ( dir.y > 0.99999 ) {\n\n\t\t\tthis.quaternion.set( 0, 0, 0, 1 );\n\n\t\t} else if ( dir.y < - 0.99999 ) {\n\n\t\t\tthis.quaternion.set( 1, 0, 0, 0 );\n\n\t\t} else {\n\n\t\t\t_axis.set( dir.z, 0, - dir.x ).normalize();\n\n\t\t\tconst radians = Math.acos( dir.y );\n\n\t\t\tthis.quaternion.setFromAxisAngle( _axis, radians );\n\n\t\t}\n\n\t}\n\n\tsetLength( length, headLength = length * 0.2, headWidth = headLength * 0.2 ) {\n\n\t\tthis.line.scale.set( 1, Math.max( 0.0001, length - headLength ), 1 ); // see #17458\n\t\tthis.line.updateMatrix();\n\n\t\tthis.cone.scale.set( headWidth, headLength, headWidth );\n\t\tthis.cone.position.y = length;\n\t\tthis.cone.updateMatrix();\n\n\t}\n\n\tsetColor( color ) {\n\n\t\tthis.line.material.color.set( color );\n\t\tthis.cone.material.color.set( color );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source, false );\n\n\t\tthis.line.copy( source.line );\n\t\tthis.cone.copy( source.cone );\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.line.geometry.dispose();\n\t\tthis.line.material.dispose();\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t}\n\n}\n\nclass AxesHelper extends LineSegments {\n\n\tconstructor( size = 1 ) {\n\n\t\tconst vertices = [\n\t\t\t0, 0, 0,\tsize, 0, 0,\n\t\t\t0, 0, 0,\t0, size, 0,\n\t\t\t0, 0, 0,\t0, 0, size\n\t\t];\n\n\t\tconst colors = [\n\t\t\t1, 0, 0,\t1, 0.6, 0,\n\t\t\t0, 1, 0,\t0.6, 1, 0,\n\t\t\t0, 0, 1,\t0, 0.6, 1\n\t\t];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'AxesHelper';\n\n\t}\n\n\tsetColors( xAxisColor, yAxisColor, zAxisColor ) {\n\n\t\tconst color = new Color();\n\t\tconst array = this.geometry.attributes.color.array;\n\n\t\tcolor.set( xAxisColor );\n\t\tcolor.toArray( array, 0 );\n\t\tcolor.toArray( array, 3 );\n\n\t\tcolor.set( yAxisColor );\n\t\tcolor.toArray( array, 6 );\n\t\tcolor.toArray( array, 9 );\n\n\t\tcolor.set( zAxisColor );\n\t\tcolor.toArray( array, 12 );\n\t\tcolor.toArray( array, 15 );\n\n\t\tthis.geometry.attributes.color.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nclass ShapePath {\n\n\tconstructor() {\n\n\t\tthis.type = 'ShapePath';\n\n\t\tthis.color = new Color();\n\n\t\tthis.subPaths = [];\n\t\tthis.currentPath = null;\n\n\t}\n\n\tmoveTo( x, y ) {\n\n\t\tthis.currentPath = new Path();\n\t\tthis.subPaths.push( this.currentPath );\n\t\tthis.currentPath.moveTo( x, y );\n\n\t\treturn this;\n\n\t}\n\n\tlineTo( x, y ) {\n\n\t\tthis.currentPath.lineTo( x, y );\n\n\t\treturn this;\n\n\t}\n\n\tquadraticCurveTo( aCPx, aCPy, aX, aY ) {\n\n\t\tthis.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\tbezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tthis.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\tsplineThru( pts ) {\n\n\t\tthis.currentPath.splineThru( pts );\n\n\t\treturn this;\n\n\t}\n\n\ttoShapes( isCCW ) {\n\n\t\tfunction toShapesNoHoles( inSubpaths ) {\n\n\t\t\tconst shapes = [];\n\n\t\t\tfor ( let i = 0, l = inSubpaths.length; i < l; i ++ ) {\n\n\t\t\t\tconst tmpPath = inSubpaths[ i ];\n\n\t\t\t\tconst tmpShape = new Shape();\n\t\t\t\ttmpShape.curves = tmpPath.curves;\n\n\t\t\t\tshapes.push( tmpShape );\n\n\t\t\t}\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tfunction isPointInsidePolygon( inPt, inPolygon ) {\n\n\t\t\tconst polyLen = inPolygon.length;\n\n\t\t\t// inPt on polygon contour => immediate success or\n\t\t\t// toggling of inside/outside at every single! intersection point of an edge\n\t\t\t// with the horizontal line through inPt, left of inPt\n\t\t\t// not counting lowerY endpoints of edges and whole edges on that line\n\t\t\tlet inside = false;\n\t\t\tfor ( let p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {\n\n\t\t\t\tlet edgeLowPt = inPolygon[ p ];\n\t\t\t\tlet edgeHighPt = inPolygon[ q ];\n\n\t\t\t\tlet edgeDx = edgeHighPt.x - edgeLowPt.x;\n\t\t\t\tlet edgeDy = edgeHighPt.y - edgeLowPt.y;\n\n\t\t\t\tif ( Math.abs( edgeDy ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not parallel\n\t\t\t\t\tif ( edgeDy < 0 ) {\n\n\t\t\t\t\t\tedgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;\n\t\t\t\t\t\tedgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) \t\tcontinue;\n\n\t\t\t\t\tif ( inPt.y === edgeLowPt.y ) {\n\n\t\t\t\t\t\tif ( inPt.x === edgeLowPt.x )\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t// continue;\t\t\t\t// no intersection or edgeLowPt => doesn't count !!!\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );\n\t\t\t\t\t\tif ( perpEdge === 0 )\t\t\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\tif ( perpEdge < 0 ) \t\t\t\tcontinue;\n\t\t\t\t\t\tinside = ! inside;\t\t// true intersection left of inPt\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// parallel or collinear\n\t\t\t\t\tif ( inPt.y !== edgeLowPt.y ) \t\tcontinue;\t\t\t// parallel\n\t\t\t\t\t// edge lies on the same horizontal line as inPt\n\t\t\t\t\tif ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||\n\t\t\t\t\t\t ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) )\t\treturn\ttrue;\t// inPt: Point on contour !\n\t\t\t\t\t// continue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn\tinside;\n\n\t\t}\n\n\t\tconst isClockWise = ShapeUtils.isClockWise;\n\n\t\tconst subPaths = this.subPaths;\n\t\tif ( subPaths.length === 0 ) return [];\n\n\t\tlet solid, tmpPath, tmpShape;\n\t\tconst shapes = [];\n\n\t\tif ( subPaths.length === 1 ) {\n\n\t\t\ttmpPath = subPaths[ 0 ];\n\t\t\ttmpShape = new Shape();\n\t\t\ttmpShape.curves = tmpPath.curves;\n\t\t\tshapes.push( tmpShape );\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tlet holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );\n\t\tholesFirst = isCCW ? ! holesFirst : holesFirst;\n\n\t\t// console.log(\"Holes first\", holesFirst);\n\n\t\tconst betterShapeHoles = [];\n\t\tconst newShapes = [];\n\t\tlet newShapeHoles = [];\n\t\tlet mainIdx = 0;\n\t\tlet tmpPoints;\n\n\t\tnewShapes[ mainIdx ] = undefined;\n\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\tfor ( let i = 0, l = subPaths.length; i < l; i ++ ) {\n\n\t\t\ttmpPath = subPaths[ i ];\n\t\t\ttmpPoints = tmpPath.getPoints();\n\t\t\tsolid = isClockWise( tmpPoints );\n\t\t\tsolid = isCCW ? ! solid : solid;\n\n\t\t\tif ( solid ) {\n\n\t\t\t\tif ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) )\tmainIdx ++;\n\n\t\t\t\tnewShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };\n\t\t\t\tnewShapes[ mainIdx ].s.curves = tmpPath.curves;\n\n\t\t\t\tif ( holesFirst )\tmainIdx ++;\n\t\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\t\t//console.log('cw', i);\n\n\t\t\t} else {\n\n\t\t\t\tnewShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );\n\n\t\t\t\t//console.log('ccw', i);\n\n\t\t\t}\n\n\t\t}\n\n\t\t// only Holes? -> probably all Shapes with wrong orientation\n\t\tif ( ! newShapes[ 0 ] )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\tif ( newShapes.length > 1 ) {\n\n\t\t\tlet ambiguous = false;\n\t\t\tlet toChange = 0;\n\n\t\t\tfor ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tbetterShapeHoles[ sIdx ] = [];\n\n\t\t\t}\n\n\t\t\tfor ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tconst sho = newShapeHoles[ sIdx ];\n\n\t\t\t\tfor ( let hIdx = 0; hIdx < sho.length; hIdx ++ ) {\n\n\t\t\t\t\tconst ho = sho[ hIdx ];\n\t\t\t\t\tlet hole_unassigned = true;\n\n\t\t\t\t\tfor ( let s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {\n\n\t\t\t\t\t\tif ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {\n\n\t\t\t\t\t\t\tif ( sIdx !== s2Idx )\ttoChange ++;\n\n\t\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\t\thole_unassigned = false;\n\t\t\t\t\t\t\t\tbetterShapeHoles[ s2Idx ].push( ho );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tambiguous = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\tbetterShapeHoles[ sIdx ].push( ho );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( toChange > 0 && ambiguous === false ) {\n\n\t\t\t\tnewShapeHoles = betterShapeHoles;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet tmpHoles;\n\n\t\tfor ( let i = 0, il = newShapes.length; i < il; i ++ ) {\n\n\t\t\ttmpShape = newShapes[ i ].s;\n\t\t\tshapes.push( tmpShape );\n\t\t\ttmpHoles = newShapeHoles[ i ];\n\n\t\t\tfor ( let j = 0, jl = tmpHoles.length; j < jl; j ++ ) {\n\n\t\t\t\ttmpShape.holes.push( tmpHoles[ j ].h );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//console.log(\"shape\", shapes);\n\n\t\treturn shapes;\n\n\t}\n\n}\n\n// Fast Half Float Conversions, http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf\n\nconst _tables = /*@__PURE__*/ _generateTables();\n\nfunction _generateTables() {\n\n\t// float32 to float16 helpers\n\n\tconst buffer = new ArrayBuffer( 4 );\n\tconst floatView = new Float32Array( buffer );\n\tconst uint32View = new Uint32Array( buffer );\n\n\tconst baseTable = new Uint32Array( 512 );\n\tconst shiftTable = new Uint32Array( 512 );\n\n\tfor ( let i = 0; i < 256; ++ i ) {\n\n\t\tconst e = i - 127;\n\n\t\t// very small number (0, -0)\n\n\t\tif ( e < - 27 ) {\n\n\t\t\tbaseTable[ i ] = 0x0000;\n\t\t\tbaseTable[ i | 0x100 ] = 0x8000;\n\t\t\tshiftTable[ i ] = 24;\n\t\t\tshiftTable[ i | 0x100 ] = 24;\n\n\t\t\t// small number (denorm)\n\n\t\t} else if ( e < - 14 ) {\n\n\t\t\tbaseTable[ i ] = 0x0400 >> ( - e - 14 );\n\t\t\tbaseTable[ i | 0x100 ] = ( 0x0400 >> ( - e - 14 ) ) | 0x8000;\n\t\t\tshiftTable[ i ] = - e - 1;\n\t\t\tshiftTable[ i | 0x100 ] = - e - 1;\n\n\t\t\t// normal number\n\n\t\t} else if ( e <= 15 ) {\n\n\t\t\tbaseTable[ i ] = ( e + 15 ) << 10;\n\t\t\tbaseTable[ i | 0x100 ] = ( ( e + 15 ) << 10 ) | 0x8000;\n\t\t\tshiftTable[ i ] = 13;\n\t\t\tshiftTable[ i | 0x100 ] = 13;\n\n\t\t\t// large number (Infinity, -Infinity)\n\n\t\t} else if ( e < 128 ) {\n\n\t\t\tbaseTable[ i ] = 0x7c00;\n\t\t\tbaseTable[ i | 0x100 ] = 0xfc00;\n\t\t\tshiftTable[ i ] = 24;\n\t\t\tshiftTable[ i | 0x100 ] = 24;\n\n\t\t\t// stay (NaN, Infinity, -Infinity)\n\n\t\t} else {\n\n\t\t\tbaseTable[ i ] = 0x7c00;\n\t\t\tbaseTable[ i | 0x100 ] = 0xfc00;\n\t\t\tshiftTable[ i ] = 13;\n\t\t\tshiftTable[ i | 0x100 ] = 13;\n\n\t\t}\n\n\t}\n\n\t// float16 to float32 helpers\n\n\tconst mantissaTable = new Uint32Array( 2048 );\n\tconst exponentTable = new Uint32Array( 64 );\n\tconst offsetTable = new Uint32Array( 64 );\n\n\tfor ( let i = 1; i < 1024; ++ i ) {\n\n\t\tlet m = i << 13; // zero pad mantissa bits\n\t\tlet e = 0; // zero exponent\n\n\t\t// normalized\n\t\twhile ( ( m & 0x00800000 ) === 0 ) {\n\n\t\t\tm <<= 1;\n\t\t\te -= 0x00800000; // decrement exponent\n\n\t\t}\n\n\t\tm &= ~ 0x00800000; // clear leading 1 bit\n\t\te += 0x38800000; // adjust bias\n\n\t\tmantissaTable[ i ] = m | e;\n\n\t}\n\n\tfor ( let i = 1024; i < 2048; ++ i ) {\n\n\t\tmantissaTable[ i ] = 0x38000000 + ( ( i - 1024 ) << 13 );\n\n\t}\n\n\tfor ( let i = 1; i < 31; ++ i ) {\n\n\t\texponentTable[ i ] = i << 23;\n\n\t}\n\n\texponentTable[ 31 ] = 0x47800000;\n\texponentTable[ 32 ] = 0x80000000;\n\n\tfor ( let i = 33; i < 63; ++ i ) {\n\n\t\texponentTable[ i ] = 0x80000000 + ( ( i - 32 ) << 23 );\n\n\t}\n\n\texponentTable[ 63 ] = 0xc7800000;\n\n\tfor ( let i = 1; i < 64; ++ i ) {\n\n\t\tif ( i !== 32 ) {\n\n\t\t\toffsetTable[ i ] = 1024;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tfloatView: floatView,\n\t\tuint32View: uint32View,\n\t\tbaseTable: baseTable,\n\t\tshiftTable: shiftTable,\n\t\tmantissaTable: mantissaTable,\n\t\texponentTable: exponentTable,\n\t\toffsetTable: offsetTable\n\t};\n\n}\n\n// float32 to float16\n\nfunction toHalfFloat( val ) {\n\n\tif ( Math.abs( val ) > 65504 ) console.warn( 'THREE.DataUtils.toHalfFloat(): Value out of range.' );\n\n\tval = clamp( val, - 65504, 65504 );\n\n\t_tables.floatView[ 0 ] = val;\n\tconst f = _tables.uint32View[ 0 ];\n\tconst e = ( f >> 23 ) & 0x1ff;\n\treturn _tables.baseTable[ e ] + ( ( f & 0x007fffff ) >> _tables.shiftTable[ e ] );\n\n}\n\n// float16 to float32\n\nfunction fromHalfFloat( val ) {\n\n\tconst m = val >> 10;\n\t_tables.uint32View[ 0 ] = _tables.mantissaTable[ _tables.offsetTable[ m ] + ( val & 0x3ff ) ] + _tables.exponentTable[ m ];\n\treturn _tables.floatView[ 0 ];\n\n}\n\nvar DataUtils = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tfromHalfFloat: fromHalfFloat,\n\ttoHalfFloat: toHalfFloat\n});\n\n// r144\n\nclass BoxBufferGeometry extends BoxGeometry {\n\n\tconstructor( width, height, depth, widthSegments, heightSegments, depthSegments ) {\n\n\t\tconsole.warn( 'THREE.BoxBufferGeometry has been renamed to THREE.BoxGeometry.' );\n\t\tsuper( width, height, depth, widthSegments, heightSegments, depthSegments );\n\n\n\t}\n\n}\n\n// r144\n\nclass CapsuleBufferGeometry extends CapsuleGeometry {\n\n\tconstructor( radius, length, capSegments, radialSegments ) {\n\n\t\tconsole.warn( 'THREE.CapsuleBufferGeometry has been renamed to THREE.CapsuleGeometry.' );\n\t\tsuper( radius, length, capSegments, radialSegments );\n\n\t}\n\n}\n\n// r144\n\nclass CircleBufferGeometry extends CircleGeometry {\n\n\tconstructor( radius, segments, thetaStart, thetaLength ) {\n\n\t\tconsole.warn( 'THREE.CircleBufferGeometry has been renamed to THREE.CircleGeometry.' );\n\t\tsuper( radius, segments, thetaStart, thetaLength );\n\n\t}\n\n}\n\n// r144\n\nclass ConeBufferGeometry extends ConeGeometry {\n\n\tconstructor( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tconsole.warn( 'THREE.ConeBufferGeometry has been renamed to THREE.ConeGeometry.' );\n\t\tsuper( radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t}\n\n}\n\n// r144\n\nclass CylinderBufferGeometry extends CylinderGeometry {\n\n\tconstructor( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength ) {\n\n\t\tconsole.warn( 'THREE.CylinderBufferGeometry has been renamed to THREE.CylinderGeometry.' );\n\t\tsuper( radiusTop, radiusBottom, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t}\n\n}\n\n// r144\n\nclass DodecahedronBufferGeometry extends DodecahedronGeometry {\n\n\tconstructor( radius, detail ) {\n\n\t\tconsole.warn( 'THREE.DodecahedronBufferGeometry has been renamed to THREE.DodecahedronGeometry.' );\n\t\tsuper( radius, detail );\n\n\t}\n\n}\n\n// r144\n\nclass ExtrudeBufferGeometry extends ExtrudeGeometry {\n\n\tconstructor( shapes, options ) {\n\n\t\tconsole.warn( 'THREE.ExtrudeBufferGeometry has been renamed to THREE.ExtrudeGeometry.' );\n\t\tsuper( shapes, options );\n\n\t}\n\n}\n\n// r144\n\nclass IcosahedronBufferGeometry extends IcosahedronGeometry {\n\n\tconstructor( radius, detail ) {\n\n\t\tconsole.warn( 'THREE.IcosahedronBufferGeometry has been renamed to THREE.IcosahedronGeometry.' );\n\t\tsuper( radius, detail );\n\n\t}\n\n}\n\n// r144\n\nclass LatheBufferGeometry extends LatheGeometry {\n\n\tconstructor( points, segments, phiStart, phiLength ) {\n\n\t\tconsole.warn( 'THREE.LatheBufferGeometry has been renamed to THREE.LatheGeometry.' );\n\t\tsuper( points, segments, phiStart, phiLength );\n\n\t}\n\n}\n\n// r144\n\nclass OctahedronBufferGeometry extends OctahedronGeometry {\n\n\tconstructor( radius, detail ) {\n\n\t\tconsole.warn( 'THREE.OctahedronBufferGeometry has been renamed to THREE.OctahedronGeometry.' );\n\t\tsuper( radius, detail );\n\n\t}\n\n}\n\n// r144\n\nclass PlaneBufferGeometry extends PlaneGeometry {\n\n\tconstructor( width, height, widthSegments, heightSegments ) {\n\n\t\tconsole.warn( 'THREE.PlaneBufferGeometry has been renamed to THREE.PlaneGeometry.' );\n\t\tsuper( width, height, widthSegments, heightSegments );\n\n\t}\n\n}\n\n// r144\n\nclass PolyhedronBufferGeometry extends PolyhedronGeometry {\n\n\tconstructor( vertices, indices, radius, detail ) {\n\n\t\tconsole.warn( 'THREE.PolyhedronBufferGeometry has been renamed to THREE.PolyhedronGeometry.' );\n\t\tsuper( vertices, indices, radius, detail );\n\n\t}\n\n}\n\n// r144\n\nclass RingBufferGeometry extends RingGeometry {\n\n\tconstructor( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength ) {\n\n\t\tconsole.warn( 'THREE.RingBufferGeometry has been renamed to THREE.RingGeometry.' );\n\t\tsuper( innerRadius, outerRadius, thetaSegments, phiSegments, thetaStart, thetaLength );\n\n\t}\n\n}\n\n// r144\n\nclass ShapeBufferGeometry extends ShapeGeometry {\n\n\tconstructor( shapes, curveSegments ) {\n\n\t\tconsole.warn( 'THREE.ShapeBufferGeometry has been renamed to THREE.ShapeGeometry.' );\n\t\tsuper( shapes, curveSegments );\n\n\t}\n\n}\n\n// r144\n\nclass SphereBufferGeometry extends SphereGeometry {\n\n\tconstructor( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength ) {\n\n\t\tconsole.warn( 'THREE.SphereBufferGeometry has been renamed to THREE.SphereGeometry.' );\n\t\tsuper( radius, widthSegments, heightSegments, phiStart, phiLength, thetaStart, thetaLength );\n\n\t}\n\n}\n\n// r144\n\nclass TetrahedronBufferGeometry extends TetrahedronGeometry {\n\n\tconstructor( radius, detail ) {\n\n\t\tconsole.warn( 'THREE.TetrahedronBufferGeometry has been renamed to THREE.TetrahedronGeometry.' );\n\t\tsuper( radius, detail );\n\n\t}\n\n}\n\n// r144\n\nclass TorusBufferGeometry extends TorusGeometry {\n\n\tconstructor( radius, tube, radialSegments, tubularSegments, arc ) {\n\n\t\tconsole.warn( 'THREE.TorusBufferGeometry has been renamed to THREE.TorusGeometry.' );\n\t\tsuper( radius, tube, radialSegments, tubularSegments, arc );\n\n\t}\n\n}\n\n// r144\n\nclass TorusKnotBufferGeometry extends TorusKnotGeometry {\n\n\tconstructor( radius, tube, tubularSegments, radialSegments, p, q ) {\n\n\t\tconsole.warn( 'THREE.TorusKnotBufferGeometry has been renamed to THREE.TorusKnotGeometry.' );\n\t\tsuper( radius, tube, tubularSegments, radialSegments, p, q );\n\n\t}\n\n}\n\n// r144\n\nclass TubeBufferGeometry extends TubeGeometry {\n\n\tconstructor( path, tubularSegments, radius, radialSegments, closed ) {\n\n\t\tconsole.warn( 'THREE.TubeBufferGeometry has been renamed to THREE.TubeGeometry.' );\n\t\tsuper( path, tubularSegments, radius, radialSegments, closed );\n\n\t}\n\n}\n\nif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'register', { detail: {\n\t\trevision: REVISION,\n\t} } ) );\n\n}\n\nif ( typeof window !== 'undefined' ) {\n\n\tif ( window.__THREE__ ) {\n\n\t\tconsole.warn( 'WARNING: Multiple instances of Three.js being imported.' );\n\n\t} else {\n\n\t\twindow.__THREE__ = REVISION;\n\n\t}\n\n}\n\nexport { ACESFilmicToneMapping, AddEquation, AddOperation, AdditiveAnimationBlendMode, AdditiveBlending, AlphaFormat, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AmbientLightProbe, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrayCamera, ArrowHelper, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, BackSide, BasicDepthPacking, BasicShadowMap, Bone, BooleanKeyframeTrack, Box2, Box3, Box3Helper, BoxBufferGeometry, BoxGeometry, BoxHelper, BufferAttribute, BufferGeometry, BufferGeometryLoader, ByteType, Cache, Camera, CameraHelper, CanvasTexture, CapsuleBufferGeometry, CapsuleGeometry, CatmullRomCurve3, CineonToneMapping, CircleBufferGeometry, CircleGeometry, ClampToEdgeWrapping, Clock, Color, ColorKeyframeTrack, ColorManagement, CompressedArrayTexture, CompressedTexture, CompressedTextureLoader, ConeBufferGeometry, ConeGeometry, CubeCamera, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureLoader, CubeUVReflectionMapping, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceBack, CullFaceFront, CullFaceFrontBack, CullFaceNone, Curve, CurvePath, CustomBlending, CustomToneMapping, CylinderBufferGeometry, CylinderGeometry, Cylindrical, Data3DTexture, DataArrayTexture, DataTexture, DataTextureLoader, DataUtils, DecrementStencilOp, DecrementWrapStencilOp, DefaultLoadingManager, DepthFormat, DepthStencilFormat, DepthTexture, DirectionalLight, DirectionalLightHelper, DiscreteInterpolant, DodecahedronBufferGeometry, DodecahedronGeometry, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicCopyUsage, DynamicDrawUsage, DynamicReadUsage, EdgesGeometry, EllipseCurve, EqualDepth, EqualStencilFunc, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExtrudeBufferGeometry, ExtrudeGeometry, FileLoader, Float16BufferAttribute, Float32BufferAttribute, Float64BufferAttribute, FloatType, Fog, FogExp2, FramebufferTexture, FrontSide, Frustum, GLBufferAttribute, GLSL1, GLSL3, GreaterDepth, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, GridHelper, Group, HalfFloatType, HemisphereLight, HemisphereLightHelper, HemisphereLightProbe, IcosahedronBufferGeometry, IcosahedronGeometry, ImageBitmapLoader, ImageLoader, ImageUtils, IncrementStencilOp, IncrementWrapStencilOp, InstancedBufferAttribute, InstancedBufferGeometry, InstancedInterleavedBuffer, InstancedMesh, Int16BufferAttribute, Int32BufferAttribute, Int8BufferAttribute, IntType, InterleavedBuffer, InterleavedBufferAttribute, Interpolant, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, InvertStencilOp, KeepStencilOp, KeyframeTrack, LOD, LatheBufferGeometry, LatheGeometry, Layers, LessDepth, LessEqualDepth, LessEqualStencilFunc, LessStencilFunc, Light, LightProbe, Line, Line3, LineBasicMaterial, LineCurve, LineCurve3, LineDashedMaterial, LineLoop, LineSegments, LinearEncoding, LinearFilter, LinearInterpolant, LinearMipMapLinearFilter, LinearMipMapNearestFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, Loader, LoaderUtils, LoadingManager, LoopOnce, LoopPingPong, LoopRepeat, LuminanceAlphaFormat, LuminanceFormat, MOUSE, Material, MaterialLoader, MathUtils, Matrix3, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshDistanceMaterial, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeverDepth, NeverStencilFunc, NoBlending, NoColorSpace, NoToneMapping, NormalAnimationBlendMode, NormalBlending, NotEqualDepth, NotEqualStencilFunc, NumberKeyframeTrack, Object3D, ObjectLoader, ObjectSpaceNormalMap, OctahedronBufferGeometry, OctahedronGeometry, OneFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, PCFShadowMap, PCFSoftShadowMap, PMREMGenerator, Path, PerspectiveCamera, Plane, PlaneBufferGeometry, PlaneGeometry, PlaneHelper, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronBufferGeometry, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RGBADepthPacking, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGFormat, RGIntegerFormat, RawShaderMaterial, Ray, Raycaster, RectAreaLight, RedFormat, RedIntegerFormat, ReinhardToneMapping, RepeatWrapping, ReplaceStencilOp, ReverseSubtractEquation, RingBufferGeometry, RingGeometry, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SRGBColorSpace, Scene, ShaderChunk, ShaderLib, ShaderMaterial, ShadowMaterial, Shape, ShapeBufferGeometry, ShapeGeometry, ShapePath, ShapeUtils, ShortType, Skeleton, SkeletonHelper, SkinnedMesh, Source, Sphere, SphereBufferGeometry, SphereGeometry, Spherical, SphericalHarmonics3, SplineCurve, SpotLight, SpotLightHelper, Sprite, SpriteMaterial, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StaticCopyUsage, StaticDrawUsage, StaticReadUsage, StereoCamera, StreamCopyUsage, StreamDrawUsage, StreamReadUsage, StringKeyframeTrack, SubtractEquation, SubtractiveBlending, TOUCH, TangentSpaceNormalMap, TetrahedronBufferGeometry, TetrahedronGeometry, Texture, TextureLoader, TorusBufferGeometry, TorusGeometry, TorusKnotBufferGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeBufferGeometry, TubeGeometry, TwoPassDoubleSide, UVMapping, Uint16BufferAttribute, Uint32BufferAttribute, Uint8BufferAttribute, Uint8ClampedBufferAttribute, Uniform, UniformsGroup, UniformsLib, UniformsUtils, UnsignedByteType, UnsignedInt248Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, VSMShadowMap, Vector2, Vector3, Vector4, VectorKeyframeTrack, VideoTexture, WebGL1Renderer, WebGL3DRenderTarget, WebGLArrayRenderTarget, WebGLCubeRenderTarget, WebGLMultipleRenderTargets, WebGLRenderTarget, WebGLRenderer, WebGLUtils, WireframeGeometry, WrapAroundEnding, ZeroCurvatureEnding, ZeroFactor, ZeroSlopeEnding, ZeroStencilOp, _SRGBAFormat, sRGBEncoding };\n","import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tInstancedBufferAttribute,\n\tInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tTriangleFanDrawMode,\n\tTriangleStripDrawMode,\n\tTrianglesDrawMode,\n\tVector3,\n} from 'three';\n\nfunction computeTangents() {\n\n\tthrow new Error( 'BufferGeometryUtils: computeTangents renamed to computeMikkTSpaceTangents.' );\n\n}\n\nfunction computeMikkTSpaceTangents( geometry, MikkTSpace, negateSign = true ) {\n\n\tif ( ! MikkTSpace || ! MikkTSpace.isReady ) {\n\n\t\tthrow new Error( 'BufferGeometryUtils: Initialized MikkTSpace library required.' );\n\n\t}\n\n\tif ( ! geometry.hasAttribute( 'position' ) || ! geometry.hasAttribute( 'normal' ) || ! geometry.hasAttribute( 'uv' ) ) {\n\n\t\tthrow new Error( 'BufferGeometryUtils: Tangents require \"position\", \"normal\", and \"uv\" attributes.' );\n\n\t}\n\n\tfunction getAttributeArray( attribute ) {\n\n\t\tif ( attribute.normalized || attribute.isInterleavedBufferAttribute ) {\n\n\t\t\tconst dstArray = new Float32Array( attribute.getCount() * attribute.itemSize );\n\n\t\t\tfor ( let i = 0, j = 0; i < attribute.getCount(); i ++ ) {\n\n\t\t\t\tdstArray[ j ++ ] = attribute.getX( i );\n\t\t\t\tdstArray[ j ++ ] = attribute.getY( i );\n\n\t\t\t\tif ( attribute.itemSize > 2 ) {\n\n\t\t\t\t\tdstArray[ j ++ ] = attribute.getZ( i );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn dstArray;\n\n\t\t}\n\n\t\tif ( attribute.array instanceof Float32Array ) {\n\n\t\t\treturn attribute.array;\n\n\t\t}\n\n\t\treturn new Float32Array( attribute.array );\n\n\t}\n\n\t// MikkTSpace algorithm requires non-indexed input.\n\n\tconst _geometry = geometry.index ? geometry.toNonIndexed() : geometry;\n\n\t// Compute vertex tangents.\n\n\tconst tangents = MikkTSpace.generateTangents(\n\n\t\tgetAttributeArray( _geometry.attributes.position ),\n\t\tgetAttributeArray( _geometry.attributes.normal ),\n\t\tgetAttributeArray( _geometry.attributes.uv )\n\n\t);\n\n\t// Texture coordinate convention of glTF differs from the apparent\n\t// default of the MikkTSpace library; .w component must be flipped.\n\n\tif ( negateSign ) {\n\n\t\tfor ( let i = 3; i < tangents.length; i += 4 ) {\n\n\t\t\ttangents[ i ] *= - 1;\n\n\t\t}\n\n\t}\n\n\t//\n\n\t_geometry.setAttribute( 'tangent', new BufferAttribute( tangents, 4 ) );\n\n\tif ( geometry !== _geometry ) {\n\n\t\tgeometry.copy( _geometry );\n\n\t}\n\n\treturn geometry;\n\n}\n\n/**\n * @param {Array<BufferGeometry>} geometries\n * @param {Boolean} useGroups\n * @return {BufferGeometry}\n */\nfunction mergeBufferGeometries( geometries, useGroups = false ) {\n\n\tconst isIndexed = geometries[ 0 ].index !== null;\n\n\tconst attributesUsed = new Set( Object.keys( geometries[ 0 ].attributes ) );\n\tconst morphAttributesUsed = new Set( Object.keys( geometries[ 0 ].morphAttributes ) );\n\n\tconst attributes = {};\n\tconst morphAttributes = {};\n\n\tconst morphTargetsRelative = geometries[ 0 ].morphTargetsRelative;\n\n\tconst mergedGeometry = new BufferGeometry();\n\n\tlet offset = 0;\n\n\tfor ( let i = 0; i < geometries.length; ++ i ) {\n\n\t\tconst geometry = geometries[ i ];\n\t\tlet attributesCount = 0;\n\n\t\t// ensure that all geometries are indexed, or none\n\n\t\tif ( isIndexed !== ( geometry.index !== null ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// gather attributes, exit early if they're different\n\n\t\tfor ( const name in geometry.attributes ) {\n\n\t\t\tif ( ! attributesUsed.has( name ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure \"' + name + '\" attribute exists among all geometries, or in none of them.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tif ( attributes[ name ] === undefined ) attributes[ name ] = [];\n\n\t\t\tattributes[ name ].push( geometry.attributes[ name ] );\n\n\t\t\tattributesCount ++;\n\n\t\t}\n\n\t\t// ensure geometries have the same number of attributes\n\n\t\tif ( attributesCount !== attributesUsed.size ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index ' + i + '. Make sure all geometries have the same number of attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// gather morph attributes, exit early if they're different\n\n\t\tif ( morphTargetsRelative !== geometry.morphTargetsRelative ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index ' + i + '. .morphTargetsRelative must be consistent throughout all geometries.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tfor ( const name in geometry.morphAttributes ) {\n\n\t\t\tif ( ! morphAttributesUsed.has( name ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index ' + i + '. .morphAttributes must be consistent throughout all geometries.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tif ( morphAttributes[ name ] === undefined ) morphAttributes[ name ] = [];\n\n\t\t\tmorphAttributes[ name ].push( geometry.morphAttributes[ name ] );\n\n\t\t}\n\n\t\tif ( useGroups ) {\n\n\t\t\tlet count;\n\n\t\t\tif ( isIndexed ) {\n\n\t\t\t\tcount = geometry.index.count;\n\n\t\t\t} else if ( geometry.attributes.position !== undefined ) {\n\n\t\t\t\tcount = geometry.attributes.position.count;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeBufferGeometries() failed with geometry at index ' + i + '. The geometry must have either an index or a position attribute' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tmergedGeometry.addGroup( offset, count, i );\n\n\t\t\toffset += count;\n\n\t\t}\n\n\t}\n\n\t// merge indices\n\n\tif ( isIndexed ) {\n\n\t\tlet indexOffset = 0;\n\t\tconst mergedIndex = [];\n\n\t\tfor ( let i = 0; i < geometries.length; ++ i ) {\n\n\t\t\tconst index = geometries[ i ].index;\n\n\t\t\tfor ( let j = 0; j < index.count; ++ j ) {\n\n\t\t\t\tmergedIndex.push( index.getX( j ) + indexOffset );\n\n\t\t\t}\n\n\t\t\tindexOffset += geometries[ i ].attributes.position.count;\n\n\t\t}\n\n\t\tmergedGeometry.setIndex( mergedIndex );\n\n\t}\n\n\t// merge attributes\n\n\tfor ( const name in attributes ) {\n\n\t\tconst mergedAttribute = mergeBufferAttributes( attributes[ name ] );\n\n\t\tif ( ! mergedAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeBufferGeometries() failed while trying to merge the ' + name + ' attribute.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tmergedGeometry.setAttribute( name, mergedAttribute );\n\n\t}\n\n\t// merge morph attributes\n\n\tfor ( const name in morphAttributes ) {\n\n\t\tconst numMorphTargets = morphAttributes[ name ][ 0 ].length;\n\n\t\tif ( numMorphTargets === 0 ) break;\n\n\t\tmergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};\n\t\tmergedGeometry.morphAttributes[ name ] = [];\n\n\t\tfor ( let i = 0; i < numMorphTargets; ++ i ) {\n\n\t\t\tconst morphAttributesToMerge = [];\n\n\t\t\tfor ( let j = 0; j < morphAttributes[ name ].length; ++ j ) {\n\n\t\t\t\tmorphAttributesToMerge.push( morphAttributes[ name ][ j ][ i ] );\n\n\t\t\t}\n\n\t\t\tconst mergedMorphAttribute = mergeBufferAttributes( morphAttributesToMerge );\n\n\t\t\tif ( ! mergedMorphAttribute ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeBufferGeometries() failed while trying to merge the ' + name + ' morphAttribute.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tmergedGeometry.morphAttributes[ name ].push( mergedMorphAttribute );\n\n\t\t}\n\n\t}\n\n\treturn mergedGeometry;\n\n}\n\n/**\n * @param {Array<BufferAttribute>} attributes\n * @return {BufferAttribute}\n */\nfunction mergeBufferAttributes( attributes ) {\n\n\tlet TypedArray;\n\tlet itemSize;\n\tlet normalized;\n\tlet arrayLength = 0;\n\n\tfor ( let i = 0; i < attributes.length; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. InterleavedBufferAttributes are not supported.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( TypedArray === undefined ) TypedArray = attribute.array.constructor;\n\t\tif ( TypedArray !== attribute.array.constructor ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( itemSize === undefined ) itemSize = attribute.itemSize;\n\t\tif ( itemSize !== attribute.itemSize ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( normalized === undefined ) normalized = attribute.normalized;\n\t\tif ( normalized !== attribute.normalized ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeBufferAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tarrayLength += attribute.array.length;\n\n\t}\n\n\tconst array = new TypedArray( arrayLength );\n\tlet offset = 0;\n\n\tfor ( let i = 0; i < attributes.length; ++ i ) {\n\n\t\tarray.set( attributes[ i ].array, offset );\n\n\t\toffset += attributes[ i ].array.length;\n\n\t}\n\n\treturn new BufferAttribute( array, itemSize, normalized );\n\n}\n\n/**\n * @param {BufferAttribute}\n * @return {BufferAttribute}\n */\nexport function deepCloneAttribute( attribute ) {\n\n\tif ( attribute.isInstancedInterleavedBufferAttribute || attribute.isInterleavedBufferAttribute ) {\n\n\t\treturn deinterleaveAttribute( attribute );\n\n\t}\n\n\tif ( attribute.isInstancedBufferAttribute ) {\n\n\t\treturn new InstancedBufferAttribute().copy( attribute );\n\n\t}\n\n\treturn new BufferAttribute().copy( attribute );\n\n}\n\n/**\n * @param {Array<BufferAttribute>} attributes\n * @return {Array<InterleavedBufferAttribute>}\n */\nfunction interleaveAttributes( attributes ) {\n\n\t// Interleaves the provided attributes into an InterleavedBuffer and returns\n\t// a set of InterleavedBufferAttributes for each attribute\n\tlet TypedArray;\n\tlet arrayLength = 0;\n\tlet stride = 0;\n\n\t// calculate the length and type of the interleavedBuffer\n\tfor ( let i = 0, l = attributes.length; i < l; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\n\t\tif ( TypedArray === undefined ) TypedArray = attribute.array.constructor;\n\t\tif ( TypedArray !== attribute.array.constructor ) {\n\n\t\t\tconsole.error( 'AttributeBuffers of different types cannot be interleaved' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tarrayLength += attribute.array.length;\n\t\tstride += attribute.itemSize;\n\n\t}\n\n\t// Create the set of buffer attributes\n\tconst interleavedBuffer = new InterleavedBuffer( new TypedArray( arrayLength ), stride );\n\tlet offset = 0;\n\tconst res = [];\n\tconst getters = [ 'getX', 'getY', 'getZ', 'getW' ];\n\tconst setters = [ 'setX', 'setY', 'setZ', 'setW' ];\n\n\tfor ( let j = 0, l = attributes.length; j < l; j ++ ) {\n\n\t\tconst attribute = attributes[ j ];\n\t\tconst itemSize = attribute.itemSize;\n\t\tconst count = attribute.count;\n\t\tconst iba = new InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, attribute.normalized );\n\t\tres.push( iba );\n\n\t\toffset += itemSize;\n\n\t\t// Move the data for each attribute into the new interleavedBuffer\n\t\t// at the appropriate offset\n\t\tfor ( let c = 0; c < count; c ++ ) {\n\n\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\tiba[ setters[ k ] ]( c, attribute[ getters[ k ] ]( c ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn res;\n\n}\n\n// returns a new, non-interleaved version of the provided attribute\nexport function deinterleaveAttribute( attribute ) {\n\n\tconst cons = attribute.data.array.constructor;\n\tconst count = attribute.count;\n\tconst itemSize = attribute.itemSize;\n\tconst normalized = attribute.normalized;\n\n\tconst array = new cons( count * itemSize );\n\tlet newAttribute;\n\tif ( attribute.isInstancedInterleavedBufferAttribute ) {\n\n\t\tnewAttribute = new InstancedBufferAttribute( array, itemSize, normalized, attribute.meshPerAttribute );\n\n\t} else {\n\n\t\tnewAttribute = new BufferAttribute( array, itemSize, normalized );\n\n\t}\n\n\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\tnewAttribute.setX( i, attribute.getX( i ) );\n\n\t\tif ( itemSize >= 2 ) {\n\n\t\t\tnewAttribute.setY( i, attribute.getY( i ) );\n\n\t\t}\n\n\t\tif ( itemSize >= 3 ) {\n\n\t\t\tnewAttribute.setZ( i, attribute.getZ( i ) );\n\n\t\t}\n\n\t\tif ( itemSize >= 4 ) {\n\n\t\t\tnewAttribute.setW( i, attribute.getW( i ) );\n\n\t\t}\n\n\t}\n\n\treturn newAttribute;\n\n}\n\n// deinterleaves all attributes on the geometry\nexport function deinterleaveGeometry( geometry ) {\n\n\tconst attributes = geometry.attributes;\n\tconst morphTargets = geometry.morphTargets;\n\tconst attrMap = new Map();\n\n\tfor ( const key in attributes ) {\n\n\t\tconst attr = attributes[ key ];\n\t\tif ( attr.isInterleavedBufferAttribute ) {\n\n\t\t\tif ( ! attrMap.has( attr ) ) {\n\n\t\t\t\tattrMap.set( attr, deinterleaveAttribute( attr ) );\n\n\t\t\t}\n\n\t\t\tattributes[ key ] = attrMap.get( attr );\n\n\t\t}\n\n\t}\n\n\tfor ( const key in morphTargets ) {\n\n\t\tconst attr = morphTargets[ key ];\n\t\tif ( attr.isInterleavedBufferAttribute ) {\n\n\t\t\tif ( ! attrMap.has( attr ) ) {\n\n\t\t\t\tattrMap.set( attr, deinterleaveAttribute( attr ) );\n\n\t\t\t}\n\n\t\t\tmorphTargets[ key ] = attrMap.get( attr );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * @param {Array<BufferGeometry>} geometry\n * @return {number}\n */\nfunction estimateBytesUsed( geometry ) {\n\n\t// Return the estimated memory used by this geometry in bytes\n\t// Calculate using itemSize, count, and BYTES_PER_ELEMENT to account\n\t// for InterleavedBufferAttributes.\n\tlet mem = 0;\n\tfor ( const name in geometry.attributes ) {\n\n\t\tconst attr = geometry.getAttribute( name );\n\t\tmem += attr.count * attr.itemSize * attr.array.BYTES_PER_ELEMENT;\n\n\t}\n\n\tconst indices = geometry.getIndex();\n\tmem += indices ? indices.count * indices.itemSize * indices.array.BYTES_PER_ELEMENT : 0;\n\treturn mem;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {number} tolerance\n * @return {BufferGeometry}\n */\nfunction mergeVertices( geometry, tolerance = 1e-4 ) {\n\n\ttolerance = Math.max( tolerance, Number.EPSILON );\n\n\t// Generate an index buffer if the geometry doesn't have one, or optimize it\n\t// if it's already available.\n\tconst hashToIndex = {};\n\tconst indices = geometry.getIndex();\n\tconst positions = geometry.getAttribute( 'position' );\n\tconst vertexCount = indices ? indices.count : positions.count;\n\n\t// next value for triangle indices\n\tlet nextIndex = 0;\n\n\t// attributes and new attribute arrays\n\tconst attributeNames = Object.keys( geometry.attributes );\n\tconst tmpAttributes = {};\n\tconst tmpMorphAttributes = {};\n\tconst newIndices = [];\n\tconst getters = [ 'getX', 'getY', 'getZ', 'getW' ];\n\tconst setters = [ 'setX', 'setY', 'setZ', 'setW' ];\n\n\t// Initialize the arrays, allocating space conservatively. Extra\n\t// space will be trimmed in the last step.\n\tfor ( let i = 0, l = attributeNames.length; i < l; i ++ ) {\n\n\t\tconst name = attributeNames[ i ];\n\t\tconst attr = geometry.attributes[ name ];\n\n\t\ttmpAttributes[ name ] = new BufferAttribute(\n\t\t\tnew attr.array.constructor( attr.count * attr.itemSize ),\n\t\t\tattr.itemSize,\n\t\t\tattr.normalized\n\t\t);\n\n\t\tconst morphAttr = geometry.morphAttributes[ name ];\n\t\tif ( morphAttr ) {\n\n\t\t\ttmpMorphAttributes[ name ] = new BufferAttribute(\n\t\t\t\tnew morphAttr.array.constructor( morphAttr.count * morphAttr.itemSize ),\n\t\t\t\tmorphAttr.itemSize,\n\t\t\t\tmorphAttr.normalized\n\t\t\t);\n\n\t\t}\n\n\t}\n\n\t// convert the error tolerance to an amount of decimal places to truncate to\n\tconst decimalShift = Math.log10( 1 / tolerance );\n\tconst shiftMultiplier = Math.pow( 10, decimalShift );\n\tfor ( let i = 0; i < vertexCount; i ++ ) {\n\n\t\tconst index = indices ? indices.getX( i ) : i;\n\n\t\t// Generate a hash for the vertex attributes at the current index 'i'\n\t\tlet hash = '';\n\t\tfor ( let j = 0, l = attributeNames.length; j < l; j ++ ) {\n\n\t\t\tconst name = attributeNames[ j ];\n\t\t\tconst attribute = geometry.getAttribute( name );\n\t\t\tconst itemSize = attribute.itemSize;\n\n\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\t// double tilde truncates the decimal value\n\t\t\t\thash += `${ ~ ~ ( attribute[ getters[ k ] ]( index ) * shiftMultiplier ) },`;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Add another reference to the vertex if it's already\n\t\t// used by another index\n\t\tif ( hash in hashToIndex ) {\n\n\t\t\tnewIndices.push( hashToIndex[ hash ] );\n\n\t\t} else {\n\n\t\t\t// copy data to the new index in the temporary attributes\n\t\t\tfor ( let j = 0, l = attributeNames.length; j < l; j ++ ) {\n\n\t\t\t\tconst name = attributeNames[ j ];\n\t\t\t\tconst attribute = geometry.getAttribute( name );\n\t\t\t\tconst morphAttr = geometry.morphAttributes[ name ];\n\t\t\t\tconst itemSize = attribute.itemSize;\n\t\t\t\tconst newarray = tmpAttributes[ name ];\n\t\t\t\tconst newMorphArrays = tmpMorphAttributes[ name ];\n\n\t\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\t\tconst getterFunc = getters[ k ];\n\t\t\t\t\tconst setterFunc = setters[ k ];\n\t\t\t\t\tnewarray[ setterFunc ]( nextIndex, attribute[ getterFunc ]( index ) );\n\n\t\t\t\t\tif ( morphAttr ) {\n\n\t\t\t\t\t\tfor ( let m = 0, ml = morphAttr.length; m < ml; m ++ ) {\n\n\t\t\t\t\t\t\tnewMorphArrays[ m ][ setterFunc ]( nextIndex, morphAttr[ m ][ getterFunc ]( index ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\thashToIndex[ hash ] = nextIndex;\n\t\t\tnewIndices.push( nextIndex );\n\t\t\tnextIndex ++;\n\n\t\t}\n\n\t}\n\n\t// generate result BufferGeometry\n\tconst result = geometry.clone();\n\tfor ( const name in geometry.attributes ) {\n\n\t\tconst tmpAttribute = tmpAttributes[ name ];\n\n\t\tresult.setAttribute( name, new BufferAttribute(\n\t\t\ttmpAttribute.array.slice( 0, nextIndex * tmpAttribute.itemSize ),\n\t\t\ttmpAttribute.itemSize,\n\t\t\ttmpAttribute.normalized,\n\t\t) );\n\n\t\tif ( ! ( name in tmpMorphAttributes ) ) continue;\n\n\t\tfor ( let j = 0; j < tmpMorphAttributes[ name ].length; j ++ ) {\n\n\t\t\tconst tmpMorphAttribute = tmpMorphAttributes[ name ][ j ];\n\n\t\t\tresult.morphAttributes[ name ][ j ] = new BufferAttribute(\n\t\t\t\ttmpMorphAttribute.array.slice( 0, nextIndex * tmpMorphAttribute.itemSize ),\n\t\t\t\ttmpMorphAttribute.itemSize,\n\t\t\t\ttmpMorphAttribute.normalized,\n\t\t\t);\n\n\t\t}\n\n\t}\n\n\t// indices\n\n\tresult.setIndex( newIndices );\n\n\treturn result;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {number} drawMode\n * @return {BufferGeometry}\n */\nfunction toTrianglesDrawMode( geometry, drawMode ) {\n\n\tif ( drawMode === TrianglesDrawMode ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.' );\n\t\treturn geometry;\n\n\t}\n\n\tif ( drawMode === TriangleFanDrawMode || drawMode === TriangleStripDrawMode ) {\n\n\t\tlet index = geometry.getIndex();\n\n\t\t// generate index if not present\n\n\t\tif ( index === null ) {\n\n\t\t\tconst indices = [];\n\n\t\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tfor ( let i = 0; i < position.count; i ++ ) {\n\n\t\t\t\t\tindices.push( i );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.setIndex( indices );\n\t\t\t\tindex = geometry.getIndex();\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.' );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst numberOfTriangles = index.count - 2;\n\t\tconst newIndices = [];\n\n\t\tif ( drawMode === TriangleFanDrawMode ) {\n\n\t\t\t// gl.TRIANGLE_FAN\n\n\t\t\tfor ( let i = 1; i <= numberOfTriangles; i ++ ) {\n\n\t\t\t\tnewIndices.push( index.getX( 0 ) );\n\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// gl.TRIANGLE_STRIP\n\n\t\t\tfor ( let i = 0; i < numberOfTriangles; i ++ ) {\n\n\t\t\t\tif ( i % 2 === 0 ) {\n\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( ( newIndices.length / 3 ) !== numberOfTriangles ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.' );\n\n\t\t}\n\n\t\t// build final geometry\n\n\t\tconst newGeometry = geometry.clone();\n\t\tnewGeometry.setIndex( newIndices );\n\t\tnewGeometry.clearGroups();\n\n\t\treturn newGeometry;\n\n\t} else {\n\n\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:', drawMode );\n\t\treturn geometry;\n\n\t}\n\n}\n\n/**\n * Calculates the morphed attributes of a morphed/skinned BufferGeometry.\n * Helpful for Raytracing or Decals.\n * @param {Mesh | Line | Points} object An instance of Mesh, Line or Points.\n * @return {Object} An Object with original position/normal attributes and morphed ones.\n */\nfunction computeMorphedAttributes( object ) {\n\n\tif ( object.geometry.isBufferGeometry !== true ) {\n\n\t\tconsole.error( 'THREE.BufferGeometryUtils: Geometry is not of type BufferGeometry.' );\n\t\treturn null;\n\n\t}\n\n\tconst _vA = new Vector3();\n\tconst _vB = new Vector3();\n\tconst _vC = new Vector3();\n\n\tconst _tempA = new Vector3();\n\tconst _tempB = new Vector3();\n\tconst _tempC = new Vector3();\n\n\tconst _morphA = new Vector3();\n\tconst _morphB = new Vector3();\n\tconst _morphC = new Vector3();\n\n\tfunction _calculateMorphedAttributeData(\n\t\tobject,\n\t\tattribute,\n\t\tmorphAttribute,\n\t\tmorphTargetsRelative,\n\t\ta,\n\t\tb,\n\t\tc,\n\t\tmodifiedAttributeArray\n\t) {\n\n\t\t_vA.fromBufferAttribute( attribute, a );\n\t\t_vB.fromBufferAttribute( attribute, b );\n\t\t_vC.fromBufferAttribute( attribute, c );\n\n\t\tconst morphInfluences = object.morphTargetInfluences;\n\n\t\tif ( morphAttribute && morphInfluences ) {\n\n\t\t\t_morphA.set( 0, 0, 0 );\n\t\t\t_morphB.set( 0, 0, 0 );\n\t\t\t_morphC.set( 0, 0, 0 );\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst influence = morphInfluences[ i ];\n\t\t\t\tconst morph = morphAttribute[ i ];\n\n\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t_tempA.fromBufferAttribute( morph, a );\n\t\t\t\t_tempB.fromBufferAttribute( morph, b );\n\t\t\t\t_tempC.fromBufferAttribute( morph, c );\n\n\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\t\t\t\t\t_morphB.addScaledVector( _tempB, influence );\n\t\t\t\t\t_morphC.addScaledVector( _tempC, influence );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA.sub( _vA ), influence );\n\t\t\t\t\t_morphB.addScaledVector( _tempB.sub( _vB ), influence );\n\t\t\t\t\t_morphC.addScaledVector( _tempC.sub( _vC ), influence );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_vA.add( _morphA );\n\t\t\t_vB.add( _morphB );\n\t\t\t_vC.add( _morphC );\n\n\t\t}\n\n\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\tobject.boneTransform( a, _vA );\n\t\t\tobject.boneTransform( b, _vB );\n\t\t\tobject.boneTransform( c, _vC );\n\n\t\t}\n\n\t\tmodifiedAttributeArray[ a * 3 + 0 ] = _vA.x;\n\t\tmodifiedAttributeArray[ a * 3 + 1 ] = _vA.y;\n\t\tmodifiedAttributeArray[ a * 3 + 2 ] = _vA.z;\n\t\tmodifiedAttributeArray[ b * 3 + 0 ] = _vB.x;\n\t\tmodifiedAttributeArray[ b * 3 + 1 ] = _vB.y;\n\t\tmodifiedAttributeArray[ b * 3 + 2 ] = _vB.z;\n\t\tmodifiedAttributeArray[ c * 3 + 0 ] = _vC.x;\n\t\tmodifiedAttributeArray[ c * 3 + 1 ] = _vC.y;\n\t\tmodifiedAttributeArray[ c * 3 + 2 ] = _vC.z;\n\n\t}\n\n\tconst geometry = object.geometry;\n\tconst material = object.material;\n\n\tlet a, b, c;\n\tconst index = geometry.index;\n\tconst positionAttribute = geometry.attributes.position;\n\tconst morphPosition = geometry.morphAttributes.position;\n\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\tconst normalAttribute = geometry.attributes.normal;\n\tconst morphNormal = geometry.morphAttributes.position;\n\n\tconst groups = geometry.groups;\n\tconst drawRange = geometry.drawRange;\n\tlet i, j, il, jl;\n\tlet group;\n\tlet start, end;\n\n\tconst modifiedPosition = new Float32Array( positionAttribute.count * positionAttribute.itemSize );\n\tconst modifiedNormal = new Float32Array( normalAttribute.count * normalAttribute.itemSize );\n\n\tif ( index !== null ) {\n\n\t\t// indexed buffer geometry\n\n\t\tif ( Array.isArray( material ) ) {\n\n\t\t\tfor ( i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\tgroup = groups[ i ];\n\n\t\t\t\tstart = Math.max( group.start, drawRange.start );\n\t\t\t\tend = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\ta = index.getX( j );\n\t\t\t\t\tb = index.getX( j + 1 );\n\t\t\t\t\tc = index.getX( j + 2 );\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tpositionAttribute,\n\t\t\t\t\t\tmorphPosition,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedPosition\n\t\t\t\t\t);\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tnormalAttribute,\n\t\t\t\t\t\tmorphNormal,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedNormal\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tstart = Math.max( 0, drawRange.start );\n\t\t\tend = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\ta = index.getX( i );\n\t\t\t\tb = index.getX( i + 1 );\n\t\t\t\tc = index.getX( i + 2 );\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tpositionAttribute,\n\t\t\t\t\tmorphPosition,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedPosition\n\t\t\t\t);\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tnormalAttribute,\n\t\t\t\t\tmorphNormal,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedNormal\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t} else {\n\n\t\t// non-indexed buffer geometry\n\n\t\tif ( Array.isArray( material ) ) {\n\n\t\t\tfor ( i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\tgroup = groups[ i ];\n\n\t\t\t\tstart = Math.max( group.start, drawRange.start );\n\t\t\t\tend = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\ta = j;\n\t\t\t\t\tb = j + 1;\n\t\t\t\t\tc = j + 2;\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tpositionAttribute,\n\t\t\t\t\t\tmorphPosition,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedPosition\n\t\t\t\t\t);\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tnormalAttribute,\n\t\t\t\t\t\tmorphNormal,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedNormal\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tstart = Math.max( 0, drawRange.start );\n\t\t\tend = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\ta = i;\n\t\t\t\tb = i + 1;\n\t\t\t\tc = i + 2;\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tpositionAttribute,\n\t\t\t\t\tmorphPosition,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedPosition\n\t\t\t\t);\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tnormalAttribute,\n\t\t\t\t\tmorphNormal,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedNormal\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tconst morphedPositionAttribute = new Float32BufferAttribute( modifiedPosition, 3 );\n\tconst morphedNormalAttribute = new Float32BufferAttribute( modifiedNormal, 3 );\n\n\treturn {\n\n\t\tpositionAttribute: positionAttribute,\n\t\tnormalAttribute: normalAttribute,\n\t\tmorphedPositionAttribute: morphedPositionAttribute,\n\t\tmorphedNormalAttribute: morphedNormalAttribute\n\n\t};\n\n}\n\nfunction mergeGroups( geometry ) {\n\n\tif ( geometry.groups.length === 0 ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometryUtils.mergeGroups(): No groups are defined. Nothing to merge.' );\n\t\treturn geometry;\n\n\t}\n\n\tlet groups = geometry.groups;\n\n\t// sort groups by material index\n\n\tgroups = groups.sort( ( a, b ) => {\n\n\t\tif ( a.materialIndex !== b.materialIndex ) return a.materialIndex - b.materialIndex;\n\n\t\treturn a.start - b.start;\n\n\t} );\n\n\t// create index for non-indexed geometries\n\n\tif ( geometry.getIndex() === null ) {\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\t\tconst indices = [];\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i += 3 ) {\n\n\t\t\tindices.push( i, i + 1, i + 2 );\n\n\t\t}\n\n\t\tgeometry.setIndex( indices );\n\n\t}\n\n\t// sort index\n\n\tconst index = geometry.getIndex();\n\n\tconst newIndices = [];\n\n\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tconst groupStart = group.start;\n\t\tconst groupLength = groupStart + group.count;\n\n\t\tfor ( let j = groupStart; j < groupLength; j ++ ) {\n\n\t\t\tnewIndices.push( index.getX( j ) );\n\n\t\t}\n\n\t}\n\n\tgeometry.dispose(); // Required to force buffer recreation\n\tgeometry.setIndex( newIndices );\n\n\t// update groups indices\n\n\tlet start = 0;\n\n\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tgroup.start = start;\n\t\tstart += group.count;\n\n\t}\n\n\t// merge groups\n\n\tlet currentGroup = groups[ 0 ];\n\n\tgeometry.groups = [ currentGroup ];\n\n\tfor ( let i = 1; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tif ( currentGroup.materialIndex === group.materialIndex ) {\n\n\t\t\tcurrentGroup.count += group.count;\n\n\t\t} else {\n\n\t\t\tcurrentGroup = group;\n\t\t\tgeometry.groups.push( currentGroup );\n\n\t\t}\n\n\t}\n\n\treturn geometry;\n\n}\n\n\n// Creates a new, non-indexed geometry with smooth normals everywhere except faces that meet at\n// an angle greater than the crease angle.\nfunction toCreasedNormals( geometry, creaseAngle = Math.PI / 3 /* 60 degrees */ ) {\n\n\tconst creaseDot = Math.cos( creaseAngle );\n\tconst hashMultiplier = ( 1 + 1e-10 ) * 1e2;\n\n\t// reusable vertors\n\tconst verts = [ new Vector3(), new Vector3(), new Vector3() ];\n\tconst tempVec1 = new Vector3();\n\tconst tempVec2 = new Vector3();\n\tconst tempNorm = new Vector3();\n\tconst tempNorm2 = new Vector3();\n\n\t// hashes a vector\n\tfunction hashVertex( v ) {\n\n\t\tconst x = ~ ~ ( v.x * hashMultiplier );\n\t\tconst y = ~ ~ ( v.y * hashMultiplier );\n\t\tconst z = ~ ~ ( v.z * hashMultiplier );\n\t\treturn `${x},${y},${z}`;\n\n\t}\n\n\tconst resultGeometry = geometry.toNonIndexed();\n\tconst posAttr = resultGeometry.attributes.position;\n\tconst vertexMap = {};\n\n\t// find all the normals shared by commonly located vertices\n\tfor ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {\n\n\t\tconst i3 = 3 * i;\n\t\tconst a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );\n\t\tconst b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );\n\t\tconst c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );\n\n\t\ttempVec1.subVectors( c, b );\n\t\ttempVec2.subVectors( a, b );\n\n\t\t// add the normal to the map for all vertices\n\t\tconst normal = new Vector3().crossVectors( tempVec1, tempVec2 ).normalize();\n\t\tfor ( let n = 0; n < 3; n ++ ) {\n\n\t\t\tconst vert = verts[ n ];\n\t\t\tconst hash = hashVertex( vert );\n\t\t\tif ( ! ( hash in vertexMap ) ) {\n\n\t\t\t\tvertexMap[ hash ] = [];\n\n\t\t\t}\n\n\t\t\tvertexMap[ hash ].push( normal );\n\n\t\t}\n\n\t}\n\n\t// average normals from all vertices that share a common location if they are within the\n\t// provided crease threshold\n\tconst normalArray = new Float32Array( posAttr.count * 3 );\n\tconst normAttr = new BufferAttribute( normalArray, 3, false );\n\tfor ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {\n\n\t\t// get the face normal for this vertex\n\t\tconst i3 = 3 * i;\n\t\tconst a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );\n\t\tconst b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );\n\t\tconst c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );\n\n\t\ttempVec1.subVectors( c, b );\n\t\ttempVec2.subVectors( a, b );\n\n\t\ttempNorm.crossVectors( tempVec1, tempVec2 ).normalize();\n\n\t\t// average all normals that meet the threshold and set the normal value\n\t\tfor ( let n = 0; n < 3; n ++ ) {\n\n\t\t\tconst vert = verts[ n ];\n\t\t\tconst hash = hashVertex( vert );\n\t\t\tconst otherNormals = vertexMap[ hash ];\n\t\t\ttempNorm2.set( 0, 0, 0 );\n\n\t\t\tfor ( let k = 0, lk = otherNormals.length; k < lk; k ++ ) {\n\n\t\t\t\tconst otherNorm = otherNormals[ k ];\n\t\t\t\tif ( tempNorm.dot( otherNorm ) > creaseDot ) {\n\n\t\t\t\t\ttempNorm2.add( otherNorm );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttempNorm2.normalize();\n\t\t\tnormAttr.setXYZ( i3 + n, tempNorm2.x, tempNorm2.y, tempNorm2.z );\n\n\t\t}\n\n\t}\n\n\tresultGeometry.setAttribute( 'normal', normAttr );\n\treturn resultGeometry;\n\n}\n\nexport {\n\tcomputeTangents,\n\tcomputeMikkTSpaceTangents,\n\tmergeBufferGeometries,\n\tmergeBufferAttributes,\n\tinterleaveAttributes,\n\testimateBytesUsed,\n\tmergeVertices,\n\ttoTrianglesDrawMode,\n\tcomputeMorphedAttributes,\n\tmergeGroups,\n\ttoCreasedNormals\n};\n","import {\n\tAnimationClip,\n\tBone,\n\tBox3,\n\tBufferAttribute,\n\tBufferGeometry,\n\tClampToEdgeWrapping,\n\tColor,\n\tDirectionalLight,\n\tDoubleSide,\n\tFileLoader,\n\tFrontSide,\n\tGroup,\n\tImageBitmapLoader,\n\tInstancedMesh,\n\tInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tInterpolant,\n\tInterpolateDiscrete,\n\tInterpolateLinear,\n\tLine,\n\tLineBasicMaterial,\n\tLineLoop,\n\tLineSegments,\n\tLinearFilter,\n\tLinearMipmapLinearFilter,\n\tLinearMipmapNearestFilter,\n\tLoader,\n\tLoaderUtils,\n\tMaterial,\n\tMathUtils,\n\tMatrix4,\n\tMesh,\n\tMeshBasicMaterial,\n\tMeshPhysicalMaterial,\n\tMeshStandardMaterial,\n\tMirroredRepeatWrapping,\n\tNearestFilter,\n\tNearestMipmapLinearFilter,\n\tNearestMipmapNearestFilter,\n\tNumberKeyframeTrack,\n\tObject3D,\n\tOrthographicCamera,\n\tPerspectiveCamera,\n\tPointLight,\n\tPoints,\n\tPointsMaterial,\n\tPropertyBinding,\n\tQuaternion,\n\tQuaternionKeyframeTrack,\n\tRepeatWrapping,\n\tSkeleton,\n\tSkinnedMesh,\n\tSphere,\n\tSpotLight,\n\tTexture,\n\tTextureLoader,\n\tTriangleFanDrawMode,\n\tTriangleStripDrawMode,\n\tVector2,\n\tVector3,\n\tVectorKeyframeTrack,\n\tsRGBEncoding\n} from 'three';\nimport { toTrianglesDrawMode } from '../utils/BufferGeometryUtils.js';\n\nclass GLTFLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.dracoLoader = null;\n\t\tthis.ktx2Loader = null;\n\t\tthis.meshoptDecoder = null;\n\n\t\tthis.pluginCallbacks = [];\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsClearcoatExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureBasisUExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureWebPExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsSheenExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsTransmissionExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsVolumeExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsIorExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsEmissiveStrengthExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsSpecularExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsIridescenceExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFLightsExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMeshoptCompression( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMeshGpuInstancing( parser );\n\n\t\t} );\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tlet resourcePath;\n\n\t\tif ( this.resourcePath !== '' ) {\n\n\t\t\tresourcePath = this.resourcePath;\n\n\t\t} else if ( this.path !== '' ) {\n\n\t\t\tresourcePath = this.path;\n\n\t\t} else {\n\n\t\t\tresourcePath = LoaderUtils.extractUrlBase( url );\n\n\t\t}\n\n\t\t// Tells the LoadingManager to track an extra item, which resolves after\n\t\t// the model is fully loaded. This means the count of items loaded will\n\t\t// be incorrect, but ensures manager.onLoad() does not fire early.\n\t\tthis.manager.itemStart( url );\n\n\t\tconst _onError = function ( e ) {\n\n\t\t\tif ( onError ) {\n\n\t\t\t\tonError( e );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( e );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t};\n\n\t\tconst loader = new FileLoader( this.manager );\n\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tloader.load( url, function ( data ) {\n\n\t\t\ttry {\n\n\t\t\t\tscope.parse( data, resourcePath, function ( gltf ) {\n\n\t\t\t\t\tonLoad( gltf );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, _onError );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\t_onError( e );\n\n\t\t\t}\n\n\t\t}, onProgress, _onError );\n\n\t}\n\n\tsetDRACOLoader( dracoLoader ) {\n\n\t\tthis.dracoLoader = dracoLoader;\n\t\treturn this;\n\n\t}\n\n\tsetDDSLoader() {\n\n\t\tthrow new Error(\n\n\t\t\t'THREE.GLTFLoader: \"MSFT_texture_dds\" no longer supported. Please update to \"KHR_texture_basisu\".'\n\n\t\t);\n\n\t}\n\n\tsetKTX2Loader( ktx2Loader ) {\n\n\t\tthis.ktx2Loader = ktx2Loader;\n\t\treturn this;\n\n\t}\n\n\tsetMeshoptDecoder( meshoptDecoder ) {\n\n\t\tthis.meshoptDecoder = meshoptDecoder;\n\t\treturn this;\n\n\t}\n\n\tregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) === - 1 ) {\n\n\t\t\tthis.pluginCallbacks.push( callback );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tunregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) !== - 1 ) {\n\n\t\t\tthis.pluginCallbacks.splice( this.pluginCallbacks.indexOf( callback ), 1 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tparse( data, path, onLoad, onError ) {\n\n\t\tlet json;\n\t\tconst extensions = {};\n\t\tconst plugins = {};\n\t\tconst textDecoder = new TextDecoder();\n\n\t\tif ( typeof data === 'string' ) {\n\n\t\t\tjson = JSON.parse( data );\n\n\t\t} else if ( data instanceof ArrayBuffer ) {\n\n\t\t\tconst magic = textDecoder.decode( new Uint8Array( data, 0, 4 ) );\n\n\t\t\tif ( magic === BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\t\ttry {\n\n\t\t\t\t\textensions[ EXTENSIONS.KHR_BINARY_GLTF ] = new GLTFBinaryExtension( data );\n\n\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\tif ( onError ) onError( error );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tjson = JSON.parse( extensions[ EXTENSIONS.KHR_BINARY_GLTF ].content );\n\n\t\t\t} else {\n\n\t\t\t\tjson = JSON.parse( textDecoder.decode( data ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tjson = data;\n\n\t\t}\n\n\t\tif ( json.asset === undefined || json.asset.version[ 0 ] < 2 ) {\n\n\t\t\tif ( onError ) onError( new Error( 'THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.' ) );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst parser = new GLTFParser( json, {\n\n\t\t\tpath: path || this.resourcePath || '',\n\t\t\tcrossOrigin: this.crossOrigin,\n\t\t\trequestHeader: this.requestHeader,\n\t\t\tmanager: this.manager,\n\t\t\tktx2Loader: this.ktx2Loader,\n\t\t\tmeshoptDecoder: this.meshoptDecoder\n\n\t\t} );\n\n\t\tparser.fileLoader.setRequestHeader( this.requestHeader );\n\n\t\tfor ( let i = 0; i < this.pluginCallbacks.length; i ++ ) {\n\n\t\t\tconst plugin = this.pluginCallbacks[ i ]( parser );\n\t\t\tplugins[ plugin.name ] = plugin;\n\n\t\t\t// Workaround to avoid determining as unknown extension\n\t\t\t// in addUnknownExtensionsToUserData().\n\t\t\t// Remove this workaround if we move all the existing\n\t\t\t// extension handlers to plugin system\n\t\t\textensions[ plugin.name ] = true;\n\n\t\t}\n\n\t\tif ( json.extensionsUsed ) {\n\n\t\t\tfor ( let i = 0; i < json.extensionsUsed.length; ++ i ) {\n\n\t\t\t\tconst extensionName = json.extensionsUsed[ i ];\n\t\t\t\tconst extensionsRequired = json.extensionsRequired || [];\n\n\t\t\t\tswitch ( extensionName ) {\n\n\t\t\t\t\tcase EXTENSIONS.KHR_MATERIALS_UNLIT:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFMaterialsUnlitExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_DRACO_MESH_COMPRESSION:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFDracoMeshCompressionExtension( json, this.dracoLoader );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_TEXTURE_TRANSFORM:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFTextureTransformExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_MESH_QUANTIZATION:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFMeshQuantizationExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( extensionsRequired.indexOf( extensionName ) >= 0 && plugins[ extensionName ] === undefined ) {\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Unknown extension \"' + extensionName + '\".' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tparser.setExtensions( extensions );\n\t\tparser.setPlugins( plugins );\n\t\tparser.parse( onLoad, onError );\n\n\t}\n\n\tparseAsync( data, path ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.parse( data, path, resolve, reject );\n\n\t\t} );\n\n\t}\n\n}\n\n/* GLTFREGISTRY */\n\nfunction GLTFRegistry() {\n\n\tlet objects = {};\n\n\treturn\t{\n\n\t\tget: function ( key ) {\n\n\t\t\treturn objects[ key ];\n\n\t\t},\n\n\t\tadd: function ( key, object ) {\n\n\t\t\tobjects[ key ] = object;\n\n\t\t},\n\n\t\tremove: function ( key ) {\n\n\t\t\tdelete objects[ key ];\n\n\t\t},\n\n\t\tremoveAll: function () {\n\n\t\t\tobjects = {};\n\n\t\t}\n\n\t};\n\n}\n\n/*********************************/\n/********** EXTENSIONS ***********/\n/*********************************/\n\nconst EXTENSIONS = {\n\tKHR_BINARY_GLTF: 'KHR_binary_glTF',\n\tKHR_DRACO_MESH_COMPRESSION: 'KHR_draco_mesh_compression',\n\tKHR_LIGHTS_PUNCTUAL: 'KHR_lights_punctual',\n\tKHR_MATERIALS_CLEARCOAT: 'KHR_materials_clearcoat',\n\tKHR_MATERIALS_IOR: 'KHR_materials_ior',\n\tKHR_MATERIALS_SHEEN: 'KHR_materials_sheen',\n\tKHR_MATERIALS_SPECULAR: 'KHR_materials_specular',\n\tKHR_MATERIALS_TRANSMISSION: 'KHR_materials_transmission',\n\tKHR_MATERIALS_IRIDESCENCE: 'KHR_materials_iridescence',\n\tKHR_MATERIALS_UNLIT: 'KHR_materials_unlit',\n\tKHR_MATERIALS_VOLUME: 'KHR_materials_volume',\n\tKHR_TEXTURE_BASISU: 'KHR_texture_basisu',\n\tKHR_TEXTURE_TRANSFORM: 'KHR_texture_transform',\n\tKHR_MESH_QUANTIZATION: 'KHR_mesh_quantization',\n\tKHR_MATERIALS_EMISSIVE_STRENGTH: 'KHR_materials_emissive_strength',\n\tEXT_TEXTURE_WEBP: 'EXT_texture_webp',\n\tEXT_MESHOPT_COMPRESSION: 'EXT_meshopt_compression',\n\tEXT_MESH_GPU_INSTANCING: 'EXT_mesh_gpu_instancing'\n};\n\n/**\n * Punctual Lights Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual\n */\nclass GLTFLightsExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_LIGHTS_PUNCTUAL;\n\n\t\t// Object3D instance caches\n\t\tthis.cache = { refs: {}, uses: {} };\n\n\t}\n\n\t_markDefs() {\n\n\t\tconst parser = this.parser;\n\t\tconst nodeDefs = this.parser.json.nodes || [];\n\n\t\tfor ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\tconst nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\tif ( nodeDef.extensions\n\t\t\t\t\t&& nodeDef.extensions[ this.name ]\n\t\t\t\t\t&& nodeDef.extensions[ this.name ].light !== undefined ) {\n\n\t\t\t\tparser._addNodeRef( this.cache, nodeDef.extensions[ this.name ].light );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_loadLight( lightIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst cacheKey = 'light:' + lightIndex;\n\t\tlet dependency = parser.cache.get( cacheKey );\n\n\t\tif ( dependency ) return dependency;\n\n\t\tconst json = parser.json;\n\t\tconst extensions = ( json.extensions && json.extensions[ this.name ] ) || {};\n\t\tconst lightDefs = extensions.lights || [];\n\t\tconst lightDef = lightDefs[ lightIndex ];\n\t\tlet lightNode;\n\n\t\tconst color = new Color( 0xffffff );\n\n\t\tif ( lightDef.color !== undefined ) color.fromArray( lightDef.color );\n\n\t\tconst range = lightDef.range !== undefined ? lightDef.range : 0;\n\n\t\tswitch ( lightDef.type ) {\n\n\t\t\tcase 'directional':\n\t\t\t\tlightNode = new DirectionalLight( color );\n\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\tbreak;\n\n\t\t\tcase 'point':\n\t\t\t\tlightNode = new PointLight( color );\n\t\t\t\tlightNode.distance = range;\n\t\t\t\tbreak;\n\n\t\t\tcase 'spot':\n\t\t\t\tlightNode = new SpotLight( color );\n\t\t\t\tlightNode.distance = range;\n\t\t\t\t// Handle spotlight properties.\n\t\t\t\tlightDef.spot = lightDef.spot || {};\n\t\t\t\tlightDef.spot.innerConeAngle = lightDef.spot.innerConeAngle !== undefined ? lightDef.spot.innerConeAngle : 0;\n\t\t\t\tlightDef.spot.outerConeAngle = lightDef.spot.outerConeAngle !== undefined ? lightDef.spot.outerConeAngle : Math.PI / 4.0;\n\t\t\t\tlightNode.angle = lightDef.spot.outerConeAngle;\n\t\t\t\tlightNode.penumbra = 1.0 - lightDef.spot.innerConeAngle / lightDef.spot.outerConeAngle;\n\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Unexpected light type: ' + lightDef.type );\n\n\t\t}\n\n\t\t// Some lights (e.g. spot) default to a position other than the origin. Reset the position\n\t\t// here, because node-level parsing will only override position if explicitly specified.\n\t\tlightNode.position.set( 0, 0, 0 );\n\n\t\tlightNode.decay = 2;\n\n\t\tassignExtrasToUserData( lightNode, lightDef );\n\n\t\tif ( lightDef.intensity !== undefined ) lightNode.intensity = lightDef.intensity;\n\n\t\tlightNode.name = parser.createUniqueName( lightDef.name || ( 'light_' + lightIndex ) );\n\n\t\tdependency = Promise.resolve( lightNode );\n\n\t\tparser.cache.add( cacheKey, dependency );\n\n\t\treturn dependency;\n\n\t}\n\n\tgetDependency( type, index ) {\n\n\t\tif ( type !== 'light' ) return;\n\n\t\treturn this._loadLight( index );\n\n\t}\n\n\tcreateNodeAttachment( nodeIndex ) {\n\n\t\tconst self = this;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\t\tconst lightDef = ( nodeDef.extensions && nodeDef.extensions[ this.name ] ) || {};\n\t\tconst lightIndex = lightDef.light;\n\n\t\tif ( lightIndex === undefined ) return null;\n\n\t\treturn this._loadLight( lightIndex ).then( function ( light ) {\n\n\t\t\treturn parser._getNodeRef( self.cache, lightIndex, light );\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * Unlit Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit\n */\nclass GLTFMaterialsUnlitExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_UNLIT;\n\n\t}\n\n\tgetMaterialType() {\n\n\t\treturn MeshBasicMaterial;\n\n\t}\n\n\textendParams( materialParams, materialDef, parser ) {\n\n\t\tconst pending = [];\n\n\t\tmaterialParams.color = new Color( 1.0, 1.0, 1.0 );\n\t\tmaterialParams.opacity = 1.0;\n\n\t\tconst metallicRoughness = materialDef.pbrMetallicRoughness;\n\n\t\tif ( metallicRoughness ) {\n\n\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\tconst array = metallicRoughness.baseColorFactor;\n\n\t\t\t\tmaterialParams.color.fromArray( array );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture, sRGBEncoding ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials Emissive Strength Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/blob/5768b3ce0ef32bc39cdf1bef10b948586635ead3/extensions/2.0/Khronos/KHR_materials_emissive_strength/README.md\n */\nclass GLTFMaterialsEmissiveStrengthExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_EMISSIVE_STRENGTH;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst emissiveStrength = materialDef.extensions[ this.name ].emissiveStrength;\n\n\t\tif ( emissiveStrength !== undefined ) {\n\n\t\t\tmaterialParams.emissiveIntensity = emissiveStrength;\n\n\t\t}\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Clearcoat Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat\n */\nclass GLTFMaterialsClearcoatExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_CLEARCOAT;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.clearcoatFactor !== undefined ) {\n\n\t\t\tmaterialParams.clearcoat = extension.clearcoatFactor;\n\n\t\t}\n\n\t\tif ( extension.clearcoatTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatMap', extension.clearcoatTexture ) );\n\n\t\t}\n\n\t\tif ( extension.clearcoatRoughnessFactor !== undefined ) {\n\n\t\t\tmaterialParams.clearcoatRoughness = extension.clearcoatRoughnessFactor;\n\n\t\t}\n\n\t\tif ( extension.clearcoatRoughnessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatRoughnessMap', extension.clearcoatRoughnessTexture ) );\n\n\t\t}\n\n\t\tif ( extension.clearcoatNormalTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatNormalMap', extension.clearcoatNormalTexture ) );\n\n\t\t\tif ( extension.clearcoatNormalTexture.scale !== undefined ) {\n\n\t\t\t\tconst scale = extension.clearcoatNormalTexture.scale;\n\n\t\t\t\tmaterialParams.clearcoatNormalScale = new Vector2( scale, scale );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Iridescence Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_iridescence\n */\nclass GLTFMaterialsIridescenceExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_IRIDESCENCE;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.iridescenceFactor !== undefined ) {\n\n\t\t\tmaterialParams.iridescence = extension.iridescenceFactor;\n\n\t\t}\n\n\t\tif ( extension.iridescenceTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'iridescenceMap', extension.iridescenceTexture ) );\n\n\t\t}\n\n\t\tif ( extension.iridescenceIor !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceIOR = extension.iridescenceIor;\n\n\t\t}\n\n\t\tif ( materialParams.iridescenceThicknessRange === undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange = [ 100, 400 ];\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessMinimum !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange[ 0 ] = extension.iridescenceThicknessMinimum;\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessMaximum !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange[ 1 ] = extension.iridescenceThicknessMaximum;\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'iridescenceThicknessMap', extension.iridescenceThicknessTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Sheen Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_sheen\n */\nclass GLTFMaterialsSheenExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_SHEEN;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tmaterialParams.sheenColor = new Color( 0, 0, 0 );\n\t\tmaterialParams.sheenRoughness = 0;\n\t\tmaterialParams.sheen = 1;\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.sheenColorFactor !== undefined ) {\n\n\t\t\tmaterialParams.sheenColor.fromArray( extension.sheenColorFactor );\n\n\t\t}\n\n\t\tif ( extension.sheenRoughnessFactor !== undefined ) {\n\n\t\t\tmaterialParams.sheenRoughness = extension.sheenRoughnessFactor;\n\n\t\t}\n\n\t\tif ( extension.sheenColorTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'sheenColorMap', extension.sheenColorTexture, sRGBEncoding ) );\n\n\t\t}\n\n\t\tif ( extension.sheenRoughnessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'sheenRoughnessMap', extension.sheenRoughnessTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Transmission Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission\n * Draft: https://github.com/KhronosGroup/glTF/pull/1698\n */\nclass GLTFMaterialsTransmissionExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_TRANSMISSION;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.transmissionFactor !== undefined ) {\n\n\t\t\tmaterialParams.transmission = extension.transmissionFactor;\n\n\t\t}\n\n\t\tif ( extension.transmissionTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'transmissionMap', extension.transmissionTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials Volume Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume\n */\nclass GLTFMaterialsVolumeExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_VOLUME;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.thickness = extension.thicknessFactor !== undefined ? extension.thicknessFactor : 0;\n\n\t\tif ( extension.thicknessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'thicknessMap', extension.thicknessTexture ) );\n\n\t\t}\n\n\t\tmaterialParams.attenuationDistance = extension.attenuationDistance || Infinity;\n\n\t\tconst colorArray = extension.attenuationColor || [ 1, 1, 1 ];\n\t\tmaterialParams.attenuationColor = new Color( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ] );\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials ior Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_ior\n */\nclass GLTFMaterialsIorExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_IOR;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.ior = extension.ior !== undefined ? extension.ior : 1.5;\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Materials specular Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_specular\n */\nclass GLTFMaterialsSpecularExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_SPECULAR;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.specularIntensity = extension.specularFactor !== undefined ? extension.specularFactor : 1.0;\n\n\t\tif ( extension.specularTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'specularIntensityMap', extension.specularTexture ) );\n\n\t\t}\n\n\t\tconst colorArray = extension.specularColorFactor || [ 1, 1, 1 ];\n\t\tmaterialParams.specularColor = new Color( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ] );\n\n\t\tif ( extension.specularColorTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'specularColorMap', extension.specularColorTexture, sRGBEncoding ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * BasisU Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_basisu\n */\nclass GLTFTextureBasisUExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_TEXTURE_BASISU;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ this.name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ this.name ];\n\t\tconst loader = parser.options.ktx2Loader;\n\n\t\tif ( ! loader ) {\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures' );\n\n\t\t\t} else {\n\n\t\t\t\t// Assumes that the extension is optional and that a fallback texture is present\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t}\n\n}\n\n/**\n * WebP Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_webp\n */\nclass GLTFTextureWebPExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_TEXTURE_WEBP;\n\t\tthis.isSupported = null;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst name = this.name;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ name ];\n\t\tconst source = json.images[ extension.source ];\n\n\t\tlet loader = parser.textureLoader;\n\t\tif ( source.uri ) {\n\n\t\t\tconst handler = parser.options.manager.getHandler( source.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn this.detectSupport().then( function ( isSupported ) {\n\n\t\t\tif ( isSupported ) return parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: WebP required by asset but unsupported.' );\n\n\t\t\t}\n\n\t\t\t// Fall back to PNG or JPEG.\n\t\t\treturn parser.loadTexture( textureIndex );\n\n\t\t} );\n\n\t}\n\n\tdetectSupport() {\n\n\t\tif ( ! this.isSupported ) {\n\n\t\t\tthis.isSupported = new Promise( function ( resolve ) {\n\n\t\t\t\tconst image = new Image();\n\n\t\t\t\t// Lossy test image. Support for lossy images doesn't guarantee support for all\n\t\t\t\t// WebP images, unfortunately.\n\t\t\t\timage.src = 'data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA';\n\n\t\t\t\timage.onload = image.onerror = function () {\n\n\t\t\t\t\tresolve( image.height === 1 );\n\n\t\t\t\t};\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn this.isSupported;\n\n\t}\n\n}\n\n/**\n * meshopt BufferView Compression Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_meshopt_compression\n */\nclass GLTFMeshoptCompression {\n\n\tconstructor( parser ) {\n\n\t\tthis.name = EXTENSIONS.EXT_MESHOPT_COMPRESSION;\n\t\tthis.parser = parser;\n\n\t}\n\n\tloadBufferView( index ) {\n\n\t\tconst json = this.parser.json;\n\t\tconst bufferView = json.bufferViews[ index ];\n\n\t\tif ( bufferView.extensions && bufferView.extensions[ this.name ] ) {\n\n\t\t\tconst extensionDef = bufferView.extensions[ this.name ];\n\n\t\t\tconst buffer = this.parser.getDependency( 'buffer', extensionDef.buffer );\n\t\t\tconst decoder = this.parser.options.meshoptDecoder;\n\n\t\t\tif ( ! decoder || ! decoder.supported ) {\n\n\t\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files' );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Assumes that the extension is optional and that fallback buffer data is present\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn buffer.then( function ( res ) {\n\n\t\t\t\tconst byteOffset = extensionDef.byteOffset || 0;\n\t\t\t\tconst byteLength = extensionDef.byteLength || 0;\n\n\t\t\t\tconst count = extensionDef.count;\n\t\t\t\tconst stride = extensionDef.byteStride;\n\n\t\t\t\tconst source = new Uint8Array( res, byteOffset, byteLength );\n\n\t\t\t\tif ( decoder.decodeGltfBufferAsync ) {\n\n\t\t\t\t\treturn decoder.decodeGltfBufferAsync( count, stride, source, extensionDef.mode, extensionDef.filter ).then( function ( res ) {\n\n\t\t\t\t\t\treturn res.buffer;\n\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Support for MeshoptDecoder 0.18 or earlier, without decodeGltfBufferAsync\n\t\t\t\t\treturn decoder.ready.then( function () {\n\n\t\t\t\t\t\tconst result = new ArrayBuffer( count * stride );\n\t\t\t\t\t\tdecoder.decodeGltfBuffer( new Uint8Array( result ), count, stride, source, extensionDef.mode, extensionDef.filter );\n\t\t\t\t\t\treturn result;\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * GPU Instancing Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_mesh_gpu_instancing\n *\n */\nclass GLTFMeshGpuInstancing {\n\n\tconstructor( parser ) {\n\n\t\tthis.name = EXTENSIONS.EXT_MESH_GPU_INSTANCING;\n\t\tthis.parser = parser;\n\n\t}\n\n\tcreateNodeMesh( nodeIndex ) {\n\n\t\tconst json = this.parser.json;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tif ( ! nodeDef.extensions || ! nodeDef.extensions[ this.name ] ||\n\t\t\tnodeDef.mesh === undefined ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst meshDef = json.meshes[ nodeDef.mesh ];\n\n\t\t// No Points or Lines + Instancing support yet\n\n\t\tfor ( const primitive of meshDef.primitives ) {\n\n\t\t\tif ( primitive.mode !== WEBGL_CONSTANTS.TRIANGLES &&\n\t\t\t\t primitive.mode !== WEBGL_CONSTANTS.TRIANGLE_STRIP &&\n\t\t\t\t primitive.mode !== WEBGL_CONSTANTS.TRIANGLE_FAN &&\n\t\t\t\t primitive.mode !== undefined ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst extensionDef = nodeDef.extensions[ this.name ];\n\t\tconst attributesDef = extensionDef.attributes;\n\n\t\t// @TODO: Can we support InstancedMesh + SkinnedMesh?\n\n\t\tconst pending = [];\n\t\tconst attributes = {};\n\n\t\tfor ( const key in attributesDef ) {\n\n\t\t\tpending.push( this.parser.getDependency( 'accessor', attributesDef[ key ] ).then( accessor => {\n\n\t\t\t\tattributes[ key ] = accessor;\n\t\t\t\treturn attributes[ key ];\n\n\t\t\t} ) );\n\n\t\t}\n\n\t\tif ( pending.length < 1 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tpending.push( this.parser.createNodeMesh( nodeIndex ) );\n\n\t\treturn Promise.all( pending ).then( results => {\n\n\t\t\tconst nodeObject = results.pop();\n\t\t\tconst meshes = nodeObject.isGroup ? nodeObject.children : [ nodeObject ];\n\t\t\tconst count = results[ 0 ].count; // All attribute counts should be same\n\t\t\tconst instancedMeshes = [];\n\n\t\t\tfor ( const mesh of meshes ) {\n\n\t\t\t\t// Temporal variables\n\t\t\t\tconst m = new Matrix4();\n\t\t\t\tconst p = new Vector3();\n\t\t\t\tconst q = new Quaternion();\n\t\t\t\tconst s = new Vector3( 1, 1, 1 );\n\n\t\t\t\tconst instancedMesh = new InstancedMesh( mesh.geometry, mesh.material, count );\n\n\t\t\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\t\t\tif ( attributes.TRANSLATION ) {\n\n\t\t\t\t\t\tp.fromBufferAttribute( attributes.TRANSLATION, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attributes.ROTATION ) {\n\n\t\t\t\t\t\tq.fromBufferAttribute( attributes.ROTATION, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attributes.SCALE ) {\n\n\t\t\t\t\t\ts.fromBufferAttribute( attributes.SCALE, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tinstancedMesh.setMatrixAt( i, m.compose( p, q, s ) );\n\n\t\t\t\t}\n\n\t\t\t\t// Add instance attributes to the geometry, excluding TRS.\n\t\t\t\tfor ( const attributeName in attributes ) {\n\n\t\t\t\t\tif ( attributeName !== 'TRANSLATION' &&\n\t\t\t\t\t\t attributeName !== 'ROTATION' &&\n\t\t\t\t\t\t attributeName !== 'SCALE' ) {\n\n\t\t\t\t\t\tmesh.geometry.setAttribute( attributeName, attributes[ attributeName ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// Just in case\n\t\t\t\tObject3D.prototype.copy.call( instancedMesh, mesh );\n\n\t\t\t\t// https://github.com/mrdoob/three.js/issues/18334\n\t\t\t\tinstancedMesh.frustumCulled = false;\n\t\t\t\tthis.parser.assignFinalMaterial( instancedMesh );\n\n\t\t\t\tinstancedMeshes.push( instancedMesh );\n\n\t\t\t}\n\n\t\t\tif ( nodeObject.isGroup ) {\n\n\t\t\t\tnodeObject.clear();\n\n\t\t\t\tnodeObject.add( ... instancedMeshes );\n\n\t\t\t\treturn nodeObject;\n\n\t\t\t}\n\n\t\t\treturn instancedMeshes[ 0 ];\n\n\t\t} );\n\n\t}\n\n}\n\n/* BINARY EXTENSION */\nconst BINARY_EXTENSION_HEADER_MAGIC = 'glTF';\nconst BINARY_EXTENSION_HEADER_LENGTH = 12;\nconst BINARY_EXTENSION_CHUNK_TYPES = { JSON: 0x4E4F534A, BIN: 0x004E4942 };\n\nclass GLTFBinaryExtension {\n\n\tconstructor( data ) {\n\n\t\tthis.name = EXTENSIONS.KHR_BINARY_GLTF;\n\t\tthis.content = null;\n\t\tthis.body = null;\n\n\t\tconst headerView = new DataView( data, 0, BINARY_EXTENSION_HEADER_LENGTH );\n\t\tconst textDecoder = new TextDecoder();\n\n\t\tthis.header = {\n\t\t\tmagic: textDecoder.decode( new Uint8Array( data.slice( 0, 4 ) ) ),\n\t\t\tversion: headerView.getUint32( 4, true ),\n\t\t\tlength: headerView.getUint32( 8, true )\n\t\t};\n\n\t\tif ( this.header.magic !== BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported glTF-Binary header.' );\n\n\t\t} else if ( this.header.version < 2.0 ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Legacy binary file detected.' );\n\n\t\t}\n\n\t\tconst chunkContentsLength = this.header.length - BINARY_EXTENSION_HEADER_LENGTH;\n\t\tconst chunkView = new DataView( data, BINARY_EXTENSION_HEADER_LENGTH );\n\t\tlet chunkIndex = 0;\n\n\t\twhile ( chunkIndex < chunkContentsLength ) {\n\n\t\t\tconst chunkLength = chunkView.getUint32( chunkIndex, true );\n\t\t\tchunkIndex += 4;\n\n\t\t\tconst chunkType = chunkView.getUint32( chunkIndex, true );\n\t\t\tchunkIndex += 4;\n\n\t\t\tif ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON ) {\n\n\t\t\t\tconst contentArray = new Uint8Array( data, BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength );\n\t\t\t\tthis.content = textDecoder.decode( contentArray );\n\n\t\t\t} else if ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN ) {\n\n\t\t\t\tconst byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex;\n\t\t\t\tthis.body = data.slice( byteOffset, byteOffset + chunkLength );\n\n\t\t\t}\n\n\t\t\t// Clients must ignore chunks with unknown types.\n\n\t\t\tchunkIndex += chunkLength;\n\n\t\t}\n\n\t\tif ( this.content === null ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: JSON content not found.' );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * DRACO Mesh Compression Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression\n */\nclass GLTFDracoMeshCompressionExtension {\n\n\tconstructor( json, dracoLoader ) {\n\n\t\tif ( ! dracoLoader ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: No DRACOLoader instance provided.' );\n\n\t\t}\n\n\t\tthis.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION;\n\t\tthis.json = json;\n\t\tthis.dracoLoader = dracoLoader;\n\t\tthis.dracoLoader.preload();\n\n\t}\n\n\tdecodePrimitive( primitive, parser ) {\n\n\t\tconst json = this.json;\n\t\tconst dracoLoader = this.dracoLoader;\n\t\tconst bufferViewIndex = primitive.extensions[ this.name ].bufferView;\n\t\tconst gltfAttributeMap = primitive.extensions[ this.name ].attributes;\n\t\tconst threeAttributeMap = {};\n\t\tconst attributeNormalizedMap = {};\n\t\tconst attributeTypeMap = {};\n\n\t\tfor ( const attributeName in gltfAttributeMap ) {\n\n\t\t\tconst threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\tthreeAttributeMap[ threeAttributeName ] = gltfAttributeMap[ attributeName ];\n\n\t\t}\n\n\t\tfor ( const attributeName in primitive.attributes ) {\n\n\t\t\tconst threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\tif ( gltfAttributeMap[ attributeName ] !== undefined ) {\n\n\t\t\t\tconst accessorDef = json.accessors[ primitive.attributes[ attributeName ] ];\n\t\t\t\tconst componentType = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\n\t\t\t\tattributeTypeMap[ threeAttributeName ] = componentType.name;\n\t\t\t\tattributeNormalizedMap[ threeAttributeName ] = accessorDef.normalized === true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn parser.getDependency( 'bufferView', bufferViewIndex ).then( function ( bufferView ) {\n\n\t\t\treturn new Promise( function ( resolve ) {\n\n\t\t\t\tdracoLoader.decodeDracoFile( bufferView, function ( geometry ) {\n\n\t\t\t\t\tfor ( const attributeName in geometry.attributes ) {\n\n\t\t\t\t\t\tconst attribute = geometry.attributes[ attributeName ];\n\t\t\t\t\t\tconst normalized = attributeNormalizedMap[ attributeName ];\n\n\t\t\t\t\t\tif ( normalized !== undefined ) attribute.normalized = normalized;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve( geometry );\n\n\t\t\t\t}, threeAttributeMap, attributeTypeMap );\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * Texture Transform Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_transform\n */\nclass GLTFTextureTransformExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_TEXTURE_TRANSFORM;\n\n\t}\n\n\textendTexture( texture, transform ) {\n\n\t\tif ( transform.texCoord !== undefined ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Custom UV sets in \"' + this.name + '\" extension not yet supported.' );\n\n\t\t}\n\n\t\tif ( transform.offset === undefined && transform.rotation === undefined && transform.scale === undefined ) {\n\n\t\t\t// See https://github.com/mrdoob/three.js/issues/21819.\n\t\t\treturn texture;\n\n\t\t}\n\n\t\ttexture = texture.clone();\n\n\t\tif ( transform.offset !== undefined ) {\n\n\t\t\ttexture.offset.fromArray( transform.offset );\n\n\t\t}\n\n\t\tif ( transform.rotation !== undefined ) {\n\n\t\t\ttexture.rotation = transform.rotation;\n\n\t\t}\n\n\t\tif ( transform.scale !== undefined ) {\n\n\t\t\ttexture.repeat.fromArray( transform.scale );\n\n\t\t}\n\n\t\ttexture.needsUpdate = true;\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Mesh Quantization Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization\n */\nclass GLTFMeshQuantizationExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_MESH_QUANTIZATION;\n\n\t}\n\n}\n\n/*********************************/\n/********** INTERPOLATION ********/\n/*********************************/\n\n// Spline Interpolation\n// Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#appendix-c-spline-interpolation\nclass GLTFCubicSplineInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tcopySampleValue_( index ) {\n\n\t\t// Copies a sample value to the result buffer. See description of glTF\n\t\t// CUBICSPLINE values layout in interpolate_() function below.\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tvalueSize = this.valueSize,\n\t\t\toffset = index * valueSize * 3 + valueSize;\n\n\t\tfor ( let i = 0; i !== valueSize; i ++ ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer;\n\t\tconst values = this.sampleValues;\n\t\tconst stride = this.valueSize;\n\n\t\tconst stride2 = stride * 2;\n\t\tconst stride3 = stride * 3;\n\n\t\tconst td = t1 - t0;\n\n\t\tconst p = ( t - t0 ) / td;\n\t\tconst pp = p * p;\n\t\tconst ppp = pp * p;\n\n\t\tconst offset1 = i1 * stride3;\n\t\tconst offset0 = offset1 - stride3;\n\n\t\tconst s2 = - 2 * ppp + 3 * pp;\n\t\tconst s3 = ppp - pp;\n\t\tconst s0 = 1 - s2;\n\t\tconst s1 = s3 - pp + p;\n\n\t\t// Layout of keyframe output values for CUBICSPLINE animations:\n\t\t// [ inTangent_1, splineVertex_1, outTangent_1, inTangent_2, splineVertex_2, ... ]\n\t\tfor ( let i = 0; i !== stride; i ++ ) {\n\n\t\t\tconst p0 = values[ offset0 + i + stride ]; // splineVertex_k\n\t\t\tconst m0 = values[ offset0 + i + stride2 ] * td; // outTangent_k * (t_k+1 - t_k)\n\t\t\tconst p1 = values[ offset1 + i + stride ]; // splineVertex_k+1\n\t\t\tconst m1 = values[ offset1 + i ] * td; // inTangent_k+1 * (t_k+1 - t_k)\n\n\t\t\tresult[ i ] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\nconst _q = new Quaternion();\n\nclass GLTFCubicSplineQuaternionInterpolant extends GLTFCubicSplineInterpolant {\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = super.interpolate_( i1, t0, t, t1 );\n\n\t\t_q.fromArray( result ).normalize().toArray( result );\n\n\t\treturn result;\n\n\t}\n\n}\n\n\n/*********************************/\n/********** INTERNALS ************/\n/*********************************/\n\n/* CONSTANTS */\n\nconst WEBGL_CONSTANTS = {\n\tFLOAT: 5126,\n\t//FLOAT_MAT2: 35674,\n\tFLOAT_MAT3: 35675,\n\tFLOAT_MAT4: 35676,\n\tFLOAT_VEC2: 35664,\n\tFLOAT_VEC3: 35665,\n\tFLOAT_VEC4: 35666,\n\tLINEAR: 9729,\n\tREPEAT: 10497,\n\tSAMPLER_2D: 35678,\n\tPOINTS: 0,\n\tLINES: 1,\n\tLINE_LOOP: 2,\n\tLINE_STRIP: 3,\n\tTRIANGLES: 4,\n\tTRIANGLE_STRIP: 5,\n\tTRIANGLE_FAN: 6,\n\tUNSIGNED_BYTE: 5121,\n\tUNSIGNED_SHORT: 5123\n};\n\nconst WEBGL_COMPONENT_TYPES = {\n\t5120: Int8Array,\n\t5121: Uint8Array,\n\t5122: Int16Array,\n\t5123: Uint16Array,\n\t5125: Uint32Array,\n\t5126: Float32Array\n};\n\nconst WEBGL_FILTERS = {\n\t9728: NearestFilter,\n\t9729: LinearFilter,\n\t9984: NearestMipmapNearestFilter,\n\t9985: LinearMipmapNearestFilter,\n\t9986: NearestMipmapLinearFilter,\n\t9987: LinearMipmapLinearFilter\n};\n\nconst WEBGL_WRAPPINGS = {\n\t33071: ClampToEdgeWrapping,\n\t33648: MirroredRepeatWrapping,\n\t10497: RepeatWrapping\n};\n\nconst WEBGL_TYPE_SIZES = {\n\t'SCALAR': 1,\n\t'VEC2': 2,\n\t'VEC3': 3,\n\t'VEC4': 4,\n\t'MAT2': 4,\n\t'MAT3': 9,\n\t'MAT4': 16\n};\n\nconst ATTRIBUTES = {\n\tPOSITION: 'position',\n\tNORMAL: 'normal',\n\tTANGENT: 'tangent',\n\tTEXCOORD_0: 'uv',\n\tTEXCOORD_1: 'uv2',\n\tCOLOR_0: 'color',\n\tWEIGHTS_0: 'skinWeight',\n\tJOINTS_0: 'skinIndex',\n};\n\nconst PATH_PROPERTIES = {\n\tscale: 'scale',\n\ttranslation: 'position',\n\trotation: 'quaternion',\n\tweights: 'morphTargetInfluences'\n};\n\nconst INTERPOLATION = {\n\tCUBICSPLINE: undefined, // We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each\n\t\t // keyframe track will be initialized with a default interpolation type, then modified.\n\tLINEAR: InterpolateLinear,\n\tSTEP: InterpolateDiscrete\n};\n\nconst ALPHA_MODES = {\n\tOPAQUE: 'OPAQUE',\n\tMASK: 'MASK',\n\tBLEND: 'BLEND'\n};\n\n/**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#default-material\n */\nfunction createDefaultMaterial( cache ) {\n\n\tif ( cache[ 'DefaultMaterial' ] === undefined ) {\n\n\t\tcache[ 'DefaultMaterial' ] = new MeshStandardMaterial( {\n\t\t\tcolor: 0xFFFFFF,\n\t\t\temissive: 0x000000,\n\t\t\tmetalness: 1,\n\t\t\troughness: 1,\n\t\t\ttransparent: false,\n\t\t\tdepthTest: true,\n\t\t\tside: FrontSide\n\t\t} );\n\n\t}\n\n\treturn cache[ 'DefaultMaterial' ];\n\n}\n\nfunction addUnknownExtensionsToUserData( knownExtensions, object, objectDef ) {\n\n\t// Add unknown glTF extensions to an object's userData.\n\n\tfor ( const name in objectDef.extensions ) {\n\n\t\tif ( knownExtensions[ name ] === undefined ) {\n\n\t\t\tobject.userData.gltfExtensions = object.userData.gltfExtensions || {};\n\t\t\tobject.userData.gltfExtensions[ name ] = objectDef.extensions[ name ];\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * @param {Object3D|Material|BufferGeometry} object\n * @param {GLTF.definition} gltfDef\n */\nfunction assignExtrasToUserData( object, gltfDef ) {\n\n\tif ( gltfDef.extras !== undefined ) {\n\n\t\tif ( typeof gltfDef.extras === 'object' ) {\n\n\t\t\tObject.assign( object.userData, gltfDef.extras );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Ignoring primitive type .extras, ' + gltfDef.extras );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#morph-targets\n *\n * @param {BufferGeometry} geometry\n * @param {Array<GLTF.Target>} targets\n * @param {GLTFParser} parser\n * @return {Promise<BufferGeometry>}\n */\nfunction addMorphTargets( geometry, targets, parser ) {\n\n\tlet hasMorphPosition = false;\n\tlet hasMorphNormal = false;\n\tlet hasMorphColor = false;\n\n\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\tconst target = targets[ i ];\n\n\t\tif ( target.POSITION !== undefined ) hasMorphPosition = true;\n\t\tif ( target.NORMAL !== undefined ) hasMorphNormal = true;\n\t\tif ( target.COLOR_0 !== undefined ) hasMorphColor = true;\n\n\t\tif ( hasMorphPosition && hasMorphNormal && hasMorphColor ) break;\n\n\t}\n\n\tif ( ! hasMorphPosition && ! hasMorphNormal && ! hasMorphColor ) return Promise.resolve( geometry );\n\n\tconst pendingPositionAccessors = [];\n\tconst pendingNormalAccessors = [];\n\tconst pendingColorAccessors = [];\n\n\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\tconst target = targets[ i ];\n\n\t\tif ( hasMorphPosition ) {\n\n\t\t\tconst pendingAccessor = target.POSITION !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.POSITION )\n\t\t\t\t: geometry.attributes.position;\n\n\t\t\tpendingPositionAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t\tif ( hasMorphNormal ) {\n\n\t\t\tconst pendingAccessor = target.NORMAL !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.NORMAL )\n\t\t\t\t: geometry.attributes.normal;\n\n\t\t\tpendingNormalAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t\tif ( hasMorphColor ) {\n\n\t\t\tconst pendingAccessor = target.COLOR_0 !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.COLOR_0 )\n\t\t\t\t: geometry.attributes.color;\n\n\t\t\tpendingColorAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t}\n\n\treturn Promise.all( [\n\t\tPromise.all( pendingPositionAccessors ),\n\t\tPromise.all( pendingNormalAccessors ),\n\t\tPromise.all( pendingColorAccessors )\n\t] ).then( function ( accessors ) {\n\n\t\tconst morphPositions = accessors[ 0 ];\n\t\tconst morphNormals = accessors[ 1 ];\n\t\tconst morphColors = accessors[ 2 ];\n\n\t\tif ( hasMorphPosition ) geometry.morphAttributes.position = morphPositions;\n\t\tif ( hasMorphNormal ) geometry.morphAttributes.normal = morphNormals;\n\t\tif ( hasMorphColor ) geometry.morphAttributes.color = morphColors;\n\t\tgeometry.morphTargetsRelative = true;\n\n\t\treturn geometry;\n\n\t} );\n\n}\n\n/**\n * @param {Mesh} mesh\n * @param {GLTF.Mesh} meshDef\n */\nfunction updateMorphTargets( mesh, meshDef ) {\n\n\tmesh.updateMorphTargets();\n\n\tif ( meshDef.weights !== undefined ) {\n\n\t\tfor ( let i = 0, il = meshDef.weights.length; i < il; i ++ ) {\n\n\t\t\tmesh.morphTargetInfluences[ i ] = meshDef.weights[ i ];\n\n\t\t}\n\n\t}\n\n\t// .extras has user-defined data, so check that .extras.targetNames is an array.\n\tif ( meshDef.extras && Array.isArray( meshDef.extras.targetNames ) ) {\n\n\t\tconst targetNames = meshDef.extras.targetNames;\n\n\t\tif ( mesh.morphTargetInfluences.length === targetNames.length ) {\n\n\t\t\tmesh.morphTargetDictionary = {};\n\n\t\t\tfor ( let i = 0, il = targetNames.length; i < il; i ++ ) {\n\n\t\t\t\tmesh.morphTargetDictionary[ targetNames[ i ] ] = i;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.' );\n\n\t\t}\n\n\t}\n\n}\n\nfunction createPrimitiveKey( primitiveDef ) {\n\n\tconst dracoExtension = primitiveDef.extensions && primitiveDef.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ];\n\tlet geometryKey;\n\n\tif ( dracoExtension ) {\n\n\t\tgeometryKey = 'draco:' + dracoExtension.bufferView\n\t\t\t\t+ ':' + dracoExtension.indices\n\t\t\t\t+ ':' + createAttributesKey( dracoExtension.attributes );\n\n\t} else {\n\n\t\tgeometryKey = primitiveDef.indices + ':' + createAttributesKey( primitiveDef.attributes ) + ':' + primitiveDef.mode;\n\n\t}\n\n\treturn geometryKey;\n\n}\n\nfunction createAttributesKey( attributes ) {\n\n\tlet attributesKey = '';\n\n\tconst keys = Object.keys( attributes ).sort();\n\n\tfor ( let i = 0, il = keys.length; i < il; i ++ ) {\n\n\t\tattributesKey += keys[ i ] + ':' + attributes[ keys[ i ] ] + ';';\n\n\t}\n\n\treturn attributesKey;\n\n}\n\nfunction getNormalizedComponentScale( constructor ) {\n\n\t// Reference:\n\t// https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization#encoding-quantized-data\n\n\tswitch ( constructor ) {\n\n\t\tcase Int8Array:\n\t\t\treturn 1 / 127;\n\n\t\tcase Uint8Array:\n\t\t\treturn 1 / 255;\n\n\t\tcase Int16Array:\n\t\t\treturn 1 / 32767;\n\n\t\tcase Uint16Array:\n\t\t\treturn 1 / 65535;\n\n\t\tdefault:\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported normalized accessor component type.' );\n\n\t}\n\n}\n\nfunction getImageURIMimeType( uri ) {\n\n\tif ( uri.search( /\\.jpe?g($|\\?)/i ) > 0 || uri.search( /^data\\:image\\/jpeg/ ) === 0 ) return 'image/jpeg';\n\tif ( uri.search( /\\.webp($|\\?)/i ) > 0 || uri.search( /^data\\:image\\/webp/ ) === 0 ) return 'image/webp';\n\n\treturn 'image/png';\n\n}\n\nconst _identityMatrix = new Matrix4();\n\n/* GLTF PARSER */\n\nclass GLTFParser {\n\n\tconstructor( json = {}, options = {} ) {\n\n\t\tthis.json = json;\n\t\tthis.extensions = {};\n\t\tthis.plugins = {};\n\t\tthis.options = options;\n\n\t\t// loader object cache\n\t\tthis.cache = new GLTFRegistry();\n\n\t\t// associations between Three.js objects and glTF elements\n\t\tthis.associations = new Map();\n\n\t\t// BufferGeometry caching\n\t\tthis.primitiveCache = {};\n\n\t\t// Object3D instance caches\n\t\tthis.meshCache = { refs: {}, uses: {} };\n\t\tthis.cameraCache = { refs: {}, uses: {} };\n\t\tthis.lightCache = { refs: {}, uses: {} };\n\n\t\tthis.sourceCache = {};\n\t\tthis.textureCache = {};\n\n\t\t// Track node names, to ensure no duplicates\n\t\tthis.nodeNamesUsed = {};\n\n\t\t// Use an ImageBitmapLoader if imageBitmaps are supported. Moves much of the\n\t\t// expensive work of uploading a texture to the GPU off the main thread.\n\n\t\tlet isSafari = false;\n\t\tlet isFirefox = false;\n\t\tlet firefoxVersion = - 1;\n\n\t\tif ( typeof navigator !== 'undefined' ) {\n\n\t\t\tisSafari = /^((?!chrome|android).)*safari/i.test( navigator.userAgent ) === true;\n\t\t\tisFirefox = navigator.userAgent.indexOf( 'Firefox' ) > - 1;\n\t\t\tfirefoxVersion = isFirefox ? navigator.userAgent.match( /Firefox\\/([0-9]+)\\./ )[ 1 ] : - 1;\n\n\t\t}\n\n\t\tif ( typeof createImageBitmap === 'undefined' || isSafari || ( isFirefox && firefoxVersion < 98 ) ) {\n\n\t\t\tthis.textureLoader = new TextureLoader( this.options.manager );\n\n\t\t} else {\n\n\t\t\tthis.textureLoader = new ImageBitmapLoader( this.options.manager );\n\n\t\t}\n\n\t\tthis.textureLoader.setCrossOrigin( this.options.crossOrigin );\n\t\tthis.textureLoader.setRequestHeader( this.options.requestHeader );\n\n\t\tthis.fileLoader = new FileLoader( this.options.manager );\n\t\tthis.fileLoader.setResponseType( 'arraybuffer' );\n\n\t\tif ( this.options.crossOrigin === 'use-credentials' ) {\n\n\t\t\tthis.fileLoader.setWithCredentials( true );\n\n\t\t}\n\n\t}\n\n\tsetExtensions( extensions ) {\n\n\t\tthis.extensions = extensions;\n\n\t}\n\n\tsetPlugins( plugins ) {\n\n\t\tthis.plugins = plugins;\n\n\t}\n\n\tparse( onLoad, onError ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\n\t\t// Clear the loader cache\n\t\tthis.cache.removeAll();\n\n\t\t// Mark the special nodes/meshes in json for efficient parse\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\treturn ext._markDefs && ext._markDefs();\n\n\t\t} );\n\n\t\tPromise.all( this._invokeAll( function ( ext ) {\n\n\t\t\treturn ext.beforeRoot && ext.beforeRoot();\n\n\t\t} ) ).then( function () {\n\n\t\t\treturn Promise.all( [\n\n\t\t\t\tparser.getDependencies( 'scene' ),\n\t\t\t\tparser.getDependencies( 'animation' ),\n\t\t\t\tparser.getDependencies( 'camera' ),\n\n\t\t\t] );\n\n\t\t} ).then( function ( dependencies ) {\n\n\t\t\tconst result = {\n\t\t\t\tscene: dependencies[ 0 ][ json.scene || 0 ],\n\t\t\t\tscenes: dependencies[ 0 ],\n\t\t\t\tanimations: dependencies[ 1 ],\n\t\t\t\tcameras: dependencies[ 2 ],\n\t\t\t\tasset: json.asset,\n\t\t\t\tparser: parser,\n\t\t\t\tuserData: {}\n\t\t\t};\n\n\t\t\taddUnknownExtensionsToUserData( extensions, result, json );\n\n\t\t\tassignExtrasToUserData( result, json );\n\n\t\t\tPromise.all( parser._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext.afterRoot && ext.afterRoot( result );\n\n\t\t\t} ) ).then( function () {\n\n\t\t\t\tonLoad( result );\n\n\t\t\t} );\n\n\t\t} ).catch( onError );\n\n\t}\n\n\t/**\n\t * Marks the special nodes/meshes in json for efficient parse.\n\t */\n\t_markDefs() {\n\n\t\tconst nodeDefs = this.json.nodes || [];\n\t\tconst skinDefs = this.json.skins || [];\n\t\tconst meshDefs = this.json.meshes || [];\n\n\t\t// Nothing in the node definition indicates whether it is a Bone or an\n\t\t// Object3D. Use the skins' joint references to mark bones.\n\t\tfor ( let skinIndex = 0, skinLength = skinDefs.length; skinIndex < skinLength; skinIndex ++ ) {\n\n\t\t\tconst joints = skinDefs[ skinIndex ].joints;\n\n\t\t\tfor ( let i = 0, il = joints.length; i < il; i ++ ) {\n\n\t\t\t\tnodeDefs[ joints[ i ] ].isBone = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Iterate over all nodes, marking references to shared resources,\n\t\t// as well as skeleton joints.\n\t\tfor ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\tconst nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\tif ( nodeDef.mesh !== undefined ) {\n\n\t\t\t\tthis._addNodeRef( this.meshCache, nodeDef.mesh );\n\n\t\t\t\t// Nothing in the mesh definition indicates whether it is\n\t\t\t\t// a SkinnedMesh or Mesh. Use the node's mesh reference\n\t\t\t\t// to mark SkinnedMesh if node has skin.\n\t\t\t\tif ( nodeDef.skin !== undefined ) {\n\n\t\t\t\t\tmeshDefs[ nodeDef.mesh ].isSkinnedMesh = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\t\tthis._addNodeRef( this.cameraCache, nodeDef.camera );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Counts references to shared node / Object3D resources. These resources\n\t * can be reused, or \"instantiated\", at multiple nodes in the scene\n\t * hierarchy. Mesh, Camera, and Light instances are instantiated and must\n\t * be marked. Non-scenegraph resources (like Materials, Geometries, and\n\t * Textures) can be reused directly and are not marked here.\n\t *\n\t * Example: CesiumMilkTruck sample model reuses \"Wheel\" meshes.\n\t */\n\t_addNodeRef( cache, index ) {\n\n\t\tif ( index === undefined ) return;\n\n\t\tif ( cache.refs[ index ] === undefined ) {\n\n\t\t\tcache.refs[ index ] = cache.uses[ index ] = 0;\n\n\t\t}\n\n\t\tcache.refs[ index ] ++;\n\n\t}\n\n\t/** Returns a reference to a shared resource, cloning it if necessary. */\n\t_getNodeRef( cache, index, object ) {\n\n\t\tif ( cache.refs[ index ] <= 1 ) return object;\n\n\t\tconst ref = object.clone();\n\n\t\t// Propagates mappings to the cloned object, prevents mappings on the\n\t\t// original object from being lost.\n\t\tconst updateMappings = ( original, clone ) => {\n\n\t\t\tconst mappings = this.associations.get( original );\n\t\t\tif ( mappings != null ) {\n\n\t\t\t\tthis.associations.set( clone, mappings );\n\n\t\t\t}\n\n\t\t\tfor ( const [ i, child ] of original.children.entries() ) {\n\n\t\t\t\tupdateMappings( child, clone.children[ i ] );\n\n\t\t\t}\n\n\t\t};\n\n\t\tupdateMappings( object, ref );\n\n\t\tref.name += '_instance_' + ( cache.uses[ index ] ++ );\n\n\t\treturn ref;\n\n\t}\n\n\t_invokeOne( func ) {\n\n\t\tconst extensions = Object.values( this.plugins );\n\t\textensions.push( this );\n\n\t\tfor ( let i = 0; i < extensions.length; i ++ ) {\n\n\t\t\tconst result = func( extensions[ i ] );\n\n\t\t\tif ( result ) return result;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t_invokeAll( func ) {\n\n\t\tconst extensions = Object.values( this.plugins );\n\t\textensions.unshift( this );\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0; i < extensions.length; i ++ ) {\n\n\t\t\tconst result = func( extensions[ i ] );\n\n\t\t\tif ( result ) pending.push( result );\n\n\t\t}\n\n\t\treturn pending;\n\n\t}\n\n\t/**\n\t * Requests the specified dependency asynchronously, with caching.\n\t * @param {string} type\n\t * @param {number} index\n\t * @return {Promise<Object3D|Material|THREE.Texture|AnimationClip|ArrayBuffer|Object>}\n\t */\n\tgetDependency( type, index ) {\n\n\t\tconst cacheKey = type + ':' + index;\n\t\tlet dependency = this.cache.get( cacheKey );\n\n\t\tif ( ! dependency ) {\n\n\t\t\tswitch ( type ) {\n\n\t\t\t\tcase 'scene':\n\t\t\t\t\tdependency = this.loadScene( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'node':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadNode && ext.loadNode( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'mesh':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadMesh && ext.loadMesh( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'accessor':\n\t\t\t\t\tdependency = this.loadAccessor( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bufferView':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadBufferView && ext.loadBufferView( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'buffer':\n\t\t\t\t\tdependency = this.loadBuffer( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'material':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadMaterial && ext.loadMaterial( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'texture':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadTexture && ext.loadTexture( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'skin':\n\t\t\t\t\tdependency = this.loadSkin( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'animation':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadAnimation && ext.loadAnimation( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'camera':\n\t\t\t\t\tdependency = this.loadCamera( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext != this && ext.getDependency && ext.getDependency( type, index );\n\n\t\t\t\t\t} );\n\n\t\t\t\t\tif ( ! dependency ) {\n\n\t\t\t\t\t\tthrow new Error( 'Unknown type: ' + type );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tthis.cache.add( cacheKey, dependency );\n\n\t\t}\n\n\t\treturn dependency;\n\n\t}\n\n\t/**\n\t * Requests all dependencies of the specified type asynchronously, with caching.\n\t * @param {string} type\n\t * @return {Promise<Array<Object>>}\n\t */\n\tgetDependencies( type ) {\n\n\t\tlet dependencies = this.cache.get( type );\n\n\t\tif ( ! dependencies ) {\n\n\t\t\tconst parser = this;\n\t\t\tconst defs = this.json[ type + ( type === 'mesh' ? 'es' : 's' ) ] || [];\n\n\t\t\tdependencies = Promise.all( defs.map( function ( def, index ) {\n\n\t\t\t\treturn parser.getDependency( type, index );\n\n\t\t\t} ) );\n\n\t\t\tthis.cache.add( type, dependencies );\n\n\t\t}\n\n\t\treturn dependencies;\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n\t * @param {number} bufferIndex\n\t * @return {Promise<ArrayBuffer>}\n\t */\n\tloadBuffer( bufferIndex ) {\n\n\t\tconst bufferDef = this.json.buffers[ bufferIndex ];\n\t\tconst loader = this.fileLoader;\n\n\t\tif ( bufferDef.type && bufferDef.type !== 'arraybuffer' ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: ' + bufferDef.type + ' buffer type is not supported.' );\n\n\t\t}\n\n\t\t// If present, GLB container is required to be the first buffer.\n\t\tif ( bufferDef.uri === undefined && bufferIndex === 0 ) {\n\n\t\t\treturn Promise.resolve( this.extensions[ EXTENSIONS.KHR_BINARY_GLTF ].body );\n\n\t\t}\n\n\t\tconst options = this.options;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tloader.load( LoaderUtils.resolveURL( bufferDef.uri, options.path ), resolve, undefined, function () {\n\n\t\t\t\treject( new Error( 'THREE.GLTFLoader: Failed to load buffer \"' + bufferDef.uri + '\".' ) );\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n\t * @param {number} bufferViewIndex\n\t * @return {Promise<ArrayBuffer>}\n\t */\n\tloadBufferView( bufferViewIndex ) {\n\n\t\tconst bufferViewDef = this.json.bufferViews[ bufferViewIndex ];\n\n\t\treturn this.getDependency( 'buffer', bufferViewDef.buffer ).then( function ( buffer ) {\n\n\t\t\tconst byteLength = bufferViewDef.byteLength || 0;\n\t\t\tconst byteOffset = bufferViewDef.byteOffset || 0;\n\t\t\treturn buffer.slice( byteOffset, byteOffset + byteLength );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors\n\t * @param {number} accessorIndex\n\t * @return {Promise<BufferAttribute|InterleavedBufferAttribute>}\n\t */\n\tloadAccessor( accessorIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\n\t\tconst accessorDef = this.json.accessors[ accessorIndex ];\n\n\t\tif ( accessorDef.bufferView === undefined && accessorDef.sparse === undefined ) {\n\n\t\t\tconst itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ];\n\t\t\tconst TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\t\t\tconst normalized = accessorDef.normalized === true;\n\n\t\t\tconst array = new TypedArray( accessorDef.count * itemSize );\n\t\t\treturn Promise.resolve( new BufferAttribute( array, itemSize, normalized ) );\n\n\t\t}\n\n\t\tconst pendingBufferViews = [];\n\n\t\tif ( accessorDef.bufferView !== undefined ) {\n\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.bufferView ) );\n\n\t\t} else {\n\n\t\t\tpendingBufferViews.push( null );\n\n\t\t}\n\n\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.indices.bufferView ) );\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.values.bufferView ) );\n\n\t\t}\n\n\t\treturn Promise.all( pendingBufferViews ).then( function ( bufferViews ) {\n\n\t\t\tconst bufferView = bufferViews[ 0 ];\n\n\t\t\tconst itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ];\n\t\t\tconst TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\n\t\t\t// For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12.\n\t\t\tconst elementBytes = TypedArray.BYTES_PER_ELEMENT;\n\t\t\tconst itemBytes = elementBytes * itemSize;\n\t\t\tconst byteOffset = accessorDef.byteOffset || 0;\n\t\t\tconst byteStride = accessorDef.bufferView !== undefined ? json.bufferViews[ accessorDef.bufferView ].byteStride : undefined;\n\t\t\tconst normalized = accessorDef.normalized === true;\n\t\t\tlet array, bufferAttribute;\n\n\t\t\t// The buffer is not interleaved if the stride is the item size in bytes.\n\t\t\tif ( byteStride && byteStride !== itemBytes ) {\n\n\t\t\t\t// Each \"slice\" of the buffer, as defined by 'count' elements of 'byteStride' bytes, gets its own InterleavedBuffer\n\t\t\t\t// This makes sure that IBA.count reflects accessor.count properly\n\t\t\t\tconst ibSlice = Math.floor( byteOffset / byteStride );\n\t\t\t\tconst ibCacheKey = 'InterleavedBuffer:' + accessorDef.bufferView + ':' + accessorDef.componentType + ':' + ibSlice + ':' + accessorDef.count;\n\t\t\t\tlet ib = parser.cache.get( ibCacheKey );\n\n\t\t\t\tif ( ! ib ) {\n\n\t\t\t\t\tarray = new TypedArray( bufferView, ibSlice * byteStride, accessorDef.count * byteStride / elementBytes );\n\n\t\t\t\t\t// Integer parameters to IB/IBA are in array elements, not bytes.\n\t\t\t\t\tib = new InterleavedBuffer( array, byteStride / elementBytes );\n\n\t\t\t\t\tparser.cache.add( ibCacheKey, ib );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( ib, itemSize, ( byteOffset % byteStride ) / elementBytes, normalized );\n\n\t\t\t} else {\n\n\t\t\t\tif ( bufferView === null ) {\n\n\t\t\t\t\tarray = new TypedArray( accessorDef.count * itemSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tarray = new TypedArray( bufferView, byteOffset, accessorDef.count * itemSize );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute = new BufferAttribute( array, itemSize, normalized );\n\n\t\t\t}\n\n\t\t\t// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#sparse-accessors\n\t\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\t\tconst itemSizeIndices = WEBGL_TYPE_SIZES.SCALAR;\n\t\t\t\tconst TypedArrayIndices = WEBGL_COMPONENT_TYPES[ accessorDef.sparse.indices.componentType ];\n\n\t\t\t\tconst byteOffsetIndices = accessorDef.sparse.indices.byteOffset || 0;\n\t\t\t\tconst byteOffsetValues = accessorDef.sparse.values.byteOffset || 0;\n\n\t\t\t\tconst sparseIndices = new TypedArrayIndices( bufferViews[ 1 ], byteOffsetIndices, accessorDef.sparse.count * itemSizeIndices );\n\t\t\t\tconst sparseValues = new TypedArray( bufferViews[ 2 ], byteOffsetValues, accessorDef.sparse.count * itemSize );\n\n\t\t\t\tif ( bufferView !== null ) {\n\n\t\t\t\t\t// Avoid modifying the original ArrayBuffer, if the bufferView wasn't initialized with zeroes.\n\t\t\t\t\tbufferAttribute = new BufferAttribute( bufferAttribute.array.slice(), bufferAttribute.itemSize, bufferAttribute.normalized );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, il = sparseIndices.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst index = sparseIndices[ i ];\n\n\t\t\t\t\tbufferAttribute.setX( index, sparseValues[ i * itemSize ] );\n\t\t\t\t\tif ( itemSize >= 2 ) bufferAttribute.setY( index, sparseValues[ i * itemSize + 1 ] );\n\t\t\t\t\tif ( itemSize >= 3 ) bufferAttribute.setZ( index, sparseValues[ i * itemSize + 2 ] );\n\t\t\t\t\tif ( itemSize >= 4 ) bufferAttribute.setW( index, sparseValues[ i * itemSize + 3 ] );\n\t\t\t\t\tif ( itemSize >= 5 ) throw new Error( 'THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn bufferAttribute;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures\n\t * @param {number} textureIndex\n\t * @return {Promise<THREE.Texture|null>}\n\t */\n\tloadTexture( textureIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\t\tconst textureDef = json.textures[ textureIndex ];\n\t\tconst sourceIndex = textureDef.source;\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tlet loader = this.textureLoader;\n\n\t\tif ( sourceDef.uri ) {\n\n\t\t\tconst handler = options.manager.getHandler( sourceDef.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn this.loadTextureImage( textureIndex, sourceIndex, loader );\n\n\t}\n\n\tloadTextureImage( textureIndex, sourceIndex, loader ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tconst cacheKey = ( sourceDef.uri || sourceDef.bufferView ) + ':' + textureDef.sampler;\n\n\t\tif ( this.textureCache[ cacheKey ] ) {\n\n\t\t\t// See https://github.com/mrdoob/three.js/issues/21559.\n\t\t\treturn this.textureCache[ cacheKey ];\n\n\t\t}\n\n\t\tconst promise = this.loadImageSource( sourceIndex, loader ).then( function ( texture ) {\n\n\t\t\ttexture.flipY = false;\n\n\t\t\ttexture.name = textureDef.name || sourceDef.name || '';\n\n\t\t\tconst samplers = json.samplers || {};\n\t\t\tconst sampler = samplers[ textureDef.sampler ] || {};\n\n\t\t\ttexture.magFilter = WEBGL_FILTERS[ sampler.magFilter ] || LinearFilter;\n\t\t\ttexture.minFilter = WEBGL_FILTERS[ sampler.minFilter ] || LinearMipmapLinearFilter;\n\t\t\ttexture.wrapS = WEBGL_WRAPPINGS[ sampler.wrapS ] || RepeatWrapping;\n\t\t\ttexture.wrapT = WEBGL_WRAPPINGS[ sampler.wrapT ] || RepeatWrapping;\n\n\t\t\tparser.associations.set( texture, { textures: textureIndex } );\n\n\t\t\treturn texture;\n\n\t\t} ).catch( function () {\n\n\t\t\treturn null;\n\n\t\t} );\n\n\t\tthis.textureCache[ cacheKey ] = promise;\n\n\t\treturn promise;\n\n\t}\n\n\tloadImageSource( sourceIndex, loader ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\n\t\tif ( this.sourceCache[ sourceIndex ] !== undefined ) {\n\n\t\t\treturn this.sourceCache[ sourceIndex ].then( ( texture ) => texture.clone() );\n\n\t\t}\n\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tconst URL = self.URL || self.webkitURL;\n\n\t\tlet sourceURI = sourceDef.uri || '';\n\t\tlet isObjectURL = false;\n\n\t\tif ( sourceDef.bufferView !== undefined ) {\n\n\t\t\t// Load binary image data from bufferView, if provided.\n\n\t\t\tsourceURI = parser.getDependency( 'bufferView', sourceDef.bufferView ).then( function ( bufferView ) {\n\n\t\t\t\tisObjectURL = true;\n\t\t\t\tconst blob = new Blob( [ bufferView ], { type: sourceDef.mimeType } );\n\t\t\t\tsourceURI = URL.createObjectURL( blob );\n\t\t\t\treturn sourceURI;\n\n\t\t\t} );\n\n\t\t} else if ( sourceDef.uri === undefined ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Image ' + sourceIndex + ' is missing URI and bufferView' );\n\n\t\t}\n\n\t\tconst promise = Promise.resolve( sourceURI ).then( function ( sourceURI ) {\n\n\t\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\t\tlet onLoad = resolve;\n\n\t\t\t\tif ( loader.isImageBitmapLoader === true ) {\n\n\t\t\t\t\tonLoad = function ( imageBitmap ) {\n\n\t\t\t\t\t\tconst texture = new Texture( imageBitmap );\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tresolve( texture );\n\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\tloader.load( LoaderUtils.resolveURL( sourceURI, options.path ), onLoad, undefined, reject );\n\n\t\t\t} );\n\n\t\t} ).then( function ( texture ) {\n\n\t\t\t// Clean up resources and configure Texture.\n\n\t\t\tif ( isObjectURL === true ) {\n\n\t\t\t\tURL.revokeObjectURL( sourceURI );\n\n\t\t\t}\n\n\t\t\ttexture.userData.mimeType = sourceDef.mimeType || getImageURIMimeType( sourceDef.uri );\n\n\t\t\treturn texture;\n\n\t\t} ).catch( function ( error ) {\n\n\t\t\tconsole.error( 'THREE.GLTFLoader: Couldn\\'t load texture', sourceURI );\n\t\t\tthrow error;\n\n\t\t} );\n\n\t\tthis.sourceCache[ sourceIndex ] = promise;\n\t\treturn promise;\n\n\t}\n\n\t/**\n\t * Asynchronously assigns a texture to the given material parameters.\n\t * @param {Object} materialParams\n\t * @param {string} mapName\n\t * @param {Object} mapDef\n\t * @return {Promise<Texture>}\n\t */\n\tassignTexture( materialParams, mapName, mapDef, encoding ) {\n\n\t\tconst parser = this;\n\n\t\treturn this.getDependency( 'texture', mapDef.index ).then( function ( texture ) {\n\n\t\t\tif ( ! texture ) return null;\n\n\t\t\t// Materials sample aoMap from UV set 1 and other maps from UV set 0 - this can't be configured\n\t\t\t// However, we will copy UV set 0 to UV set 1 on demand for aoMap\n\t\t\tif ( mapDef.texCoord !== undefined && mapDef.texCoord != 0 && ! ( mapName === 'aoMap' && mapDef.texCoord == 1 ) ) {\n\n\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Custom UV set ' + mapDef.texCoord + ' for texture ' + mapName + ' not yet supported.' );\n\n\t\t\t}\n\n\t\t\tif ( parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] ) {\n\n\t\t\t\tconst transform = mapDef.extensions !== undefined ? mapDef.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] : undefined;\n\n\t\t\t\tif ( transform ) {\n\n\t\t\t\t\tconst gltfReference = parser.associations.get( texture );\n\t\t\t\t\ttexture = parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ].extendTexture( texture, transform );\n\t\t\t\t\tparser.associations.set( texture, gltfReference );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( encoding !== undefined ) {\n\n\t\t\t\ttexture.encoding = encoding;\n\n\t\t\t}\n\n\t\t\tmaterialParams[ mapName ] = texture;\n\n\t\t\treturn texture;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Assigns final material to a Mesh, Line, or Points instance. The instance\n\t * already has a material (generated from the glTF material options alone)\n\t * but reuse of the same glTF material may require multiple threejs materials\n\t * to accommodate different primitive types, defines, etc. New materials will\n\t * be created if necessary, and reused from a cache.\n\t * @param {Object3D} mesh Mesh, Line, or Points instance.\n\t */\n\tassignFinalMaterial( mesh ) {\n\n\t\tconst geometry = mesh.geometry;\n\t\tlet material = mesh.material;\n\n\t\tconst useDerivativeTangents = geometry.attributes.tangent === undefined;\n\t\tconst useVertexColors = geometry.attributes.color !== undefined;\n\t\tconst useFlatShading = geometry.attributes.normal === undefined;\n\n\t\tif ( mesh.isPoints ) {\n\n\t\t\tconst cacheKey = 'PointsMaterial:' + material.uuid;\n\n\t\t\tlet pointsMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! pointsMaterial ) {\n\n\t\t\t\tpointsMaterial = new PointsMaterial();\n\t\t\t\tMaterial.prototype.copy.call( pointsMaterial, material );\n\t\t\t\tpointsMaterial.color.copy( material.color );\n\t\t\t\tpointsMaterial.map = material.map;\n\t\t\t\tpointsMaterial.sizeAttenuation = false; // glTF spec says points should be 1px\n\n\t\t\t\tthis.cache.add( cacheKey, pointsMaterial );\n\n\t\t\t}\n\n\t\t\tmaterial = pointsMaterial;\n\n\t\t} else if ( mesh.isLine ) {\n\n\t\t\tconst cacheKey = 'LineBasicMaterial:' + material.uuid;\n\n\t\t\tlet lineMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! lineMaterial ) {\n\n\t\t\t\tlineMaterial = new LineBasicMaterial();\n\t\t\t\tMaterial.prototype.copy.call( lineMaterial, material );\n\t\t\t\tlineMaterial.color.copy( material.color );\n\n\t\t\t\tthis.cache.add( cacheKey, lineMaterial );\n\n\t\t\t}\n\n\t\t\tmaterial = lineMaterial;\n\n\t\t}\n\n\t\t// Clone the material if it will be modified\n\t\tif ( useDerivativeTangents || useVertexColors || useFlatShading ) {\n\n\t\t\tlet cacheKey = 'ClonedMaterial:' + material.uuid + ':';\n\n\t\t\tif ( useDerivativeTangents ) cacheKey += 'derivative-tangents:';\n\t\t\tif ( useVertexColors ) cacheKey += 'vertex-colors:';\n\t\t\tif ( useFlatShading ) cacheKey += 'flat-shading:';\n\n\t\t\tlet cachedMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! cachedMaterial ) {\n\n\t\t\t\tcachedMaterial = material.clone();\n\n\t\t\t\tif ( useVertexColors ) cachedMaterial.vertexColors = true;\n\t\t\t\tif ( useFlatShading ) cachedMaterial.flatShading = true;\n\n\t\t\t\tif ( useDerivativeTangents ) {\n\n\t\t\t\t\t// https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995\n\t\t\t\t\tif ( cachedMaterial.normalScale ) cachedMaterial.normalScale.y *= - 1;\n\t\t\t\t\tif ( cachedMaterial.clearcoatNormalScale ) cachedMaterial.clearcoatNormalScale.y *= - 1;\n\n\t\t\t\t}\n\n\t\t\t\tthis.cache.add( cacheKey, cachedMaterial );\n\n\t\t\t\tthis.associations.set( cachedMaterial, this.associations.get( material ) );\n\n\t\t\t}\n\n\t\t\tmaterial = cachedMaterial;\n\n\t\t}\n\n\t\t// workarounds for mesh and geometry\n\n\t\tif ( material.aoMap && geometry.attributes.uv2 === undefined && geometry.attributes.uv !== undefined ) {\n\n\t\t\tgeometry.setAttribute( 'uv2', geometry.attributes.uv );\n\n\t\t}\n\n\t\tmesh.material = material;\n\n\t}\n\n\tgetMaterialType( /* materialIndex */ ) {\n\n\t\treturn MeshStandardMaterial;\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials\n\t * @param {number} materialIndex\n\t * @return {Promise<Material>}\n\t */\n\tloadMaterial( materialIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\t\tconst materialDef = json.materials[ materialIndex ];\n\n\t\tlet materialType;\n\t\tconst materialParams = {};\n\t\tconst materialExtensions = materialDef.extensions || {};\n\n\t\tconst pending = [];\n\n\t\tif ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ] ) {\n\n\t\t\tconst kmuExtension = extensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ];\n\t\t\tmaterialType = kmuExtension.getMaterialType();\n\t\t\tpending.push( kmuExtension.extendParams( materialParams, materialDef, parser ) );\n\n\t\t} else {\n\n\t\t\t// Specification:\n\t\t\t// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#metallic-roughness-material\n\n\t\t\tconst metallicRoughness = materialDef.pbrMetallicRoughness || {};\n\n\t\t\tmaterialParams.color = new Color( 1.0, 1.0, 1.0 );\n\t\t\tmaterialParams.opacity = 1.0;\n\n\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\tconst array = metallicRoughness.baseColorFactor;\n\n\t\t\t\tmaterialParams.color.fromArray( array );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture, sRGBEncoding ) );\n\n\t\t\t}\n\n\t\t\tmaterialParams.metalness = metallicRoughness.metallicFactor !== undefined ? metallicRoughness.metallicFactor : 1.0;\n\t\t\tmaterialParams.roughness = metallicRoughness.roughnessFactor !== undefined ? metallicRoughness.roughnessFactor : 1.0;\n\n\t\t\tif ( metallicRoughness.metallicRoughnessTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'metalnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'roughnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\n\t\t\t}\n\n\t\t\tmaterialType = this._invokeOne( function ( ext ) {\n\n\t\t\t\treturn ext.getMaterialType && ext.getMaterialType( materialIndex );\n\n\t\t\t} );\n\n\t\t\tpending.push( Promise.all( this._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext.extendMaterialParams && ext.extendMaterialParams( materialIndex, materialParams );\n\n\t\t\t} ) ) );\n\n\t\t}\n\n\t\tif ( materialDef.doubleSided === true ) {\n\n\t\t\tmaterialParams.side = DoubleSide;\n\n\t\t}\n\n\t\tconst alphaMode = materialDef.alphaMode || ALPHA_MODES.OPAQUE;\n\n\t\tif ( alphaMode === ALPHA_MODES.BLEND ) {\n\n\t\t\tmaterialParams.transparent = true;\n\n\t\t\t// See: https://github.com/mrdoob/three.js/issues/17706\n\t\t\tmaterialParams.depthWrite = false;\n\n\t\t} else {\n\n\t\t\tmaterialParams.transparent = false;\n\n\t\t\tif ( alphaMode === ALPHA_MODES.MASK ) {\n\n\t\t\t\tmaterialParams.alphaTest = materialDef.alphaCutoff !== undefined ? materialDef.alphaCutoff : 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.normalTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'normalMap', materialDef.normalTexture ) );\n\n\t\t\tmaterialParams.normalScale = new Vector2( 1, 1 );\n\n\t\t\tif ( materialDef.normalTexture.scale !== undefined ) {\n\n\t\t\t\tconst scale = materialDef.normalTexture.scale;\n\n\t\t\t\tmaterialParams.normalScale.set( scale, scale );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.occlusionTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'aoMap', materialDef.occlusionTexture ) );\n\n\t\t\tif ( materialDef.occlusionTexture.strength !== undefined ) {\n\n\t\t\t\tmaterialParams.aoMapIntensity = materialDef.occlusionTexture.strength;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.emissiveFactor !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tmaterialParams.emissive = new Color().fromArray( materialDef.emissiveFactor );\n\n\t\t}\n\n\t\tif ( materialDef.emissiveTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'emissiveMap', materialDef.emissiveTexture, sRGBEncoding ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function () {\n\n\t\t\tconst material = new materialType( materialParams );\n\n\t\t\tif ( materialDef.name ) material.name = materialDef.name;\n\n\t\t\tassignExtrasToUserData( material, materialDef );\n\n\t\t\tparser.associations.set( material, { materials: materialIndex } );\n\n\t\t\tif ( materialDef.extensions ) addUnknownExtensionsToUserData( extensions, material, materialDef );\n\n\t\t\treturn material;\n\n\t\t} );\n\n\t}\n\n\t/** When Object3D instances are targeted by animation, they need unique names. */\n\tcreateUniqueName( originalName ) {\n\n\t\tconst sanitizedName = PropertyBinding.sanitizeNodeName( originalName || '' );\n\n\t\tlet name = sanitizedName;\n\n\t\tfor ( let i = 1; this.nodeNamesUsed[ name ]; ++ i ) {\n\n\t\t\tname = sanitizedName + '_' + i;\n\n\t\t}\n\n\t\tthis.nodeNamesUsed[ name ] = true;\n\n\t\treturn name;\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry\n\t *\n\t * Creates BufferGeometries from primitives.\n\t *\n\t * @param {Array<GLTF.Primitive>} primitives\n\t * @return {Promise<Array<BufferGeometry>>}\n\t */\n\tloadGeometries( primitives ) {\n\n\t\tconst parser = this;\n\t\tconst extensions = this.extensions;\n\t\tconst cache = this.primitiveCache;\n\n\t\tfunction createDracoPrimitive( primitive ) {\n\n\t\t\treturn extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ]\n\t\t\t\t.decodePrimitive( primitive, parser )\n\t\t\t\t.then( function ( geometry ) {\n\n\t\t\t\t\treturn addPrimitiveAttributes( geometry, primitive, parser );\n\n\t\t\t\t} );\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\tconst primitive = primitives[ i ];\n\t\t\tconst cacheKey = createPrimitiveKey( primitive );\n\n\t\t\t// See if we've already created this geometry\n\t\t\tconst cached = cache[ cacheKey ];\n\n\t\t\tif ( cached ) {\n\n\t\t\t\t// Use the cached geometry if it exists\n\t\t\t\tpending.push( cached.promise );\n\n\t\t\t} else {\n\n\t\t\t\tlet geometryPromise;\n\n\t\t\t\tif ( primitive.extensions && primitive.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] ) {\n\n\t\t\t\t\t// Use DRACO geometry if available\n\t\t\t\t\tgeometryPromise = createDracoPrimitive( primitive );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Otherwise create a new geometry\n\t\t\t\t\tgeometryPromise = addPrimitiveAttributes( new BufferGeometry(), primitive, parser );\n\n\t\t\t\t}\n\n\t\t\t\t// Cache this geometry\n\t\t\t\tcache[ cacheKey ] = { primitive: primitive, promise: geometryPromise };\n\n\t\t\t\tpending.push( geometryPromise );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes\n\t * @param {number} meshIndex\n\t * @return {Promise<Group|Mesh|SkinnedMesh>}\n\t */\n\tloadMesh( meshIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\n\t\tconst meshDef = json.meshes[ meshIndex ];\n\t\tconst primitives = meshDef.primitives;\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\tconst material = primitives[ i ].material === undefined\n\t\t\t\t? createDefaultMaterial( this.cache )\n\t\t\t\t: this.getDependency( 'material', primitives[ i ].material );\n\n\t\t\tpending.push( material );\n\n\t\t}\n\n\t\tpending.push( parser.loadGeometries( primitives ) );\n\n\t\treturn Promise.all( pending ).then( function ( results ) {\n\n\t\t\tconst materials = results.slice( 0, results.length - 1 );\n\t\t\tconst geometries = results[ results.length - 1 ];\n\n\t\t\tconst meshes = [];\n\n\t\t\tfor ( let i = 0, il = geometries.length; i < il; i ++ ) {\n\n\t\t\t\tconst geometry = geometries[ i ];\n\t\t\t\tconst primitive = primitives[ i ];\n\n\t\t\t\t// 1. create Mesh\n\n\t\t\t\tlet mesh;\n\n\t\t\t\tconst material = materials[ i ];\n\n\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLES ||\n\t\t\t\t\t\tprimitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ||\n\t\t\t\t\t\tprimitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ||\n\t\t\t\t\t\tprimitive.mode === undefined ) {\n\n\t\t\t\t\t// .isSkinnedMesh isn't in glTF spec. See ._markDefs()\n\t\t\t\t\tmesh = meshDef.isSkinnedMesh === true\n\t\t\t\t\t\t? new SkinnedMesh( geometry, material )\n\t\t\t\t\t\t: new Mesh( geometry, material );\n\n\t\t\t\t\tif ( mesh.isSkinnedMesh === true && ! mesh.geometry.attributes.skinWeight.normalized ) {\n\n\t\t\t\t\t\t// we normalize floating point skin weight array to fix malformed assets (see #15319)\n\t\t\t\t\t\t// it's important to skip this for non-float32 data since normalizeSkinWeights assumes non-normalized inputs\n\t\t\t\t\t\tmesh.normalizeSkinWeights();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ) {\n\n\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleStripDrawMode );\n\n\t\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ) {\n\n\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleFanDrawMode );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINES ) {\n\n\t\t\t\t\tmesh = new LineSegments( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_STRIP ) {\n\n\t\t\t\t\tmesh = new Line( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_LOOP ) {\n\n\t\t\t\t\tmesh = new LineLoop( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.POINTS ) {\n\n\t\t\t\t\tmesh = new Points( geometry, material );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Primitive mode unsupported: ' + primitive.mode );\n\n\t\t\t\t}\n\n\t\t\t\tif ( Object.keys( mesh.geometry.morphAttributes ).length > 0 ) {\n\n\t\t\t\t\tupdateMorphTargets( mesh, meshDef );\n\n\t\t\t\t}\n\n\t\t\t\tmesh.name = parser.createUniqueName( meshDef.name || ( 'mesh_' + meshIndex ) );\n\n\t\t\t\tassignExtrasToUserData( mesh, meshDef );\n\n\t\t\t\tif ( primitive.extensions ) addUnknownExtensionsToUserData( extensions, mesh, primitive );\n\n\t\t\t\tparser.assignFinalMaterial( mesh );\n\n\t\t\t\tmeshes.push( mesh );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, il = meshes.length; i < il; i ++ ) {\n\n\t\t\t\tparser.associations.set( meshes[ i ], {\n\t\t\t\t\tmeshes: meshIndex,\n\t\t\t\t\tprimitives: i\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tif ( meshes.length === 1 ) {\n\n\t\t\t\treturn meshes[ 0 ];\n\n\t\t\t}\n\n\t\t\tconst group = new Group();\n\n\t\t\tparser.associations.set( group, { meshes: meshIndex } );\n\n\t\t\tfor ( let i = 0, il = meshes.length; i < il; i ++ ) {\n\n\t\t\t\tgroup.add( meshes[ i ] );\n\n\t\t\t}\n\n\t\t\treturn group;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras\n\t * @param {number} cameraIndex\n\t * @return {Promise<THREE.Camera>}\n\t */\n\tloadCamera( cameraIndex ) {\n\n\t\tlet camera;\n\t\tconst cameraDef = this.json.cameras[ cameraIndex ];\n\t\tconst params = cameraDef[ cameraDef.type ];\n\n\t\tif ( ! params ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing camera parameters.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( cameraDef.type === 'perspective' ) {\n\n\t\t\tcamera = new PerspectiveCamera( MathUtils.radToDeg( params.yfov ), params.aspectRatio || 1, params.znear || 1, params.zfar || 2e6 );\n\n\t\t} else if ( cameraDef.type === 'orthographic' ) {\n\n\t\t\tcamera = new OrthographicCamera( - params.xmag, params.xmag, params.ymag, - params.ymag, params.znear, params.zfar );\n\n\t\t}\n\n\t\tif ( cameraDef.name ) camera.name = this.createUniqueName( cameraDef.name );\n\n\t\tassignExtrasToUserData( camera, cameraDef );\n\n\t\treturn Promise.resolve( camera );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins\n\t * @param {number} skinIndex\n\t * @return {Promise<Skeleton>}\n\t */\n\tloadSkin( skinIndex ) {\n\n\t\tconst skinDef = this.json.skins[ skinIndex ];\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = skinDef.joints.length; i < il; i ++ ) {\n\n\t\t\tpending.push( this.getDependency( 'node', skinDef.joints[ i ] ) );\n\n\t\t}\n\n\t\tif ( skinDef.inverseBindMatrices !== undefined ) {\n\n\t\t\tpending.push( this.getDependency( 'accessor', skinDef.inverseBindMatrices ) );\n\n\t\t} else {\n\n\t\t\tpending.push( null );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function ( results ) {\n\n\t\t\tconst inverseBindMatrices = results.pop();\n\t\t\tconst jointNodes = results;\n\n\t\t\tconst bones = [];\n\t\t\tconst boneInverses = [];\n\n\t\t\tfor ( let i = 0, il = jointNodes.length; i < il; i ++ ) {\n\n\t\t\t\tconst jointNode = jointNodes[ i ];\n\n\t\t\t\tif ( jointNode ) {\n\n\t\t\t\t\tbones.push( jointNode );\n\n\t\t\t\t\tconst mat = new Matrix4();\n\n\t\t\t\t\tif ( inverseBindMatrices !== null ) {\n\n\t\t\t\t\t\tmat.fromArray( inverseBindMatrices.array, i * 16 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tboneInverses.push( mat );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Joint \"%s\" could not be found.', skinDef.joints[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new Skeleton( bones, boneInverses );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations\n\t * @param {number} animationIndex\n\t * @return {Promise<AnimationClip>}\n\t */\n\tloadAnimation( animationIndex ) {\n\n\t\tconst json = this.json;\n\n\t\tconst animationDef = json.animations[ animationIndex ];\n\n\t\tconst pendingNodes = [];\n\t\tconst pendingInputAccessors = [];\n\t\tconst pendingOutputAccessors = [];\n\t\tconst pendingSamplers = [];\n\t\tconst pendingTargets = [];\n\n\t\tfor ( let i = 0, il = animationDef.channels.length; i < il; i ++ ) {\n\n\t\t\tconst channel = animationDef.channels[ i ];\n\t\t\tconst sampler = animationDef.samplers[ channel.sampler ];\n\t\t\tconst target = channel.target;\n\t\t\tconst name = target.node;\n\t\t\tconst input = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.input ] : sampler.input;\n\t\t\tconst output = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.output ] : sampler.output;\n\n\t\t\tpendingNodes.push( this.getDependency( 'node', name ) );\n\t\t\tpendingInputAccessors.push( this.getDependency( 'accessor', input ) );\n\t\t\tpendingOutputAccessors.push( this.getDependency( 'accessor', output ) );\n\t\t\tpendingSamplers.push( sampler );\n\t\t\tpendingTargets.push( target );\n\n\t\t}\n\n\t\treturn Promise.all( [\n\n\t\t\tPromise.all( pendingNodes ),\n\t\t\tPromise.all( pendingInputAccessors ),\n\t\t\tPromise.all( pendingOutputAccessors ),\n\t\t\tPromise.all( pendingSamplers ),\n\t\t\tPromise.all( pendingTargets )\n\n\t\t] ).then( function ( dependencies ) {\n\n\t\t\tconst nodes = dependencies[ 0 ];\n\t\t\tconst inputAccessors = dependencies[ 1 ];\n\t\t\tconst outputAccessors = dependencies[ 2 ];\n\t\t\tconst samplers = dependencies[ 3 ];\n\t\t\tconst targets = dependencies[ 4 ];\n\n\t\t\tconst tracks = [];\n\n\t\t\tfor ( let i = 0, il = nodes.length; i < il; i ++ ) {\n\n\t\t\t\tconst node = nodes[ i ];\n\t\t\t\tconst inputAccessor = inputAccessors[ i ];\n\t\t\t\tconst outputAccessor = outputAccessors[ i ];\n\t\t\t\tconst sampler = samplers[ i ];\n\t\t\t\tconst target = targets[ i ];\n\n\t\t\t\tif ( node === undefined ) continue;\n\n\t\t\t\tnode.updateMatrix();\n\n\t\t\t\tlet TypedKeyframeTrack;\n\n\t\t\t\tswitch ( PATH_PROPERTIES[ target.path ] ) {\n\n\t\t\t\t\tcase PATH_PROPERTIES.weights:\n\n\t\t\t\t\t\tTypedKeyframeTrack = NumberKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase PATH_PROPERTIES.rotation:\n\n\t\t\t\t\t\tTypedKeyframeTrack = QuaternionKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase PATH_PROPERTIES.position:\n\t\t\t\t\tcase PATH_PROPERTIES.scale:\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tTypedKeyframeTrack = VectorKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tconst targetName = node.name ? node.name : node.uuid;\n\n\t\t\t\tconst interpolation = sampler.interpolation !== undefined ? INTERPOLATION[ sampler.interpolation ] : InterpolateLinear;\n\n\t\t\t\tconst targetNames = [];\n\n\t\t\t\tif ( PATH_PROPERTIES[ target.path ] === PATH_PROPERTIES.weights ) {\n\n\t\t\t\t\tnode.traverse( function ( object ) {\n\n\t\t\t\t\t\tif ( object.morphTargetInfluences ) {\n\n\t\t\t\t\t\t\ttargetNames.push( object.name ? object.name : object.uuid );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttargetNames.push( targetName );\n\n\t\t\t\t}\n\n\t\t\t\tlet outputArray = outputAccessor.array;\n\n\t\t\t\tif ( outputAccessor.normalized ) {\n\n\t\t\t\t\tconst scale = getNormalizedComponentScale( outputArray.constructor );\n\t\t\t\t\tconst scaled = new Float32Array( outputArray.length );\n\n\t\t\t\t\tfor ( let j = 0, jl = outputArray.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tscaled[ j ] = outputArray[ j ] * scale;\n\n\t\t\t\t\t}\n\n\t\t\t\t\toutputArray = scaled;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let j = 0, jl = targetNames.length; j < jl; j ++ ) {\n\n\t\t\t\t\tconst track = new TypedKeyframeTrack(\n\t\t\t\t\t\ttargetNames[ j ] + '.' + PATH_PROPERTIES[ target.path ],\n\t\t\t\t\t\tinputAccessor.array,\n\t\t\t\t\t\toutputArray,\n\t\t\t\t\t\tinterpolation\n\t\t\t\t\t);\n\n\t\t\t\t\t// Override interpolation with custom factory method.\n\t\t\t\t\tif ( sampler.interpolation === 'CUBICSPLINE' ) {\n\n\t\t\t\t\t\ttrack.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline( result ) {\n\n\t\t\t\t\t\t\t// A CUBICSPLINE keyframe in glTF has three output values for each input value,\n\t\t\t\t\t\t\t// representing inTangent, splineVertex, and outTangent. As a result, track.getValueSize()\n\t\t\t\t\t\t\t// must be divided by three to get the interpolant's sampleSize argument.\n\n\t\t\t\t\t\t\tconst interpolantType = ( this instanceof QuaternionKeyframeTrack ) ? GLTFCubicSplineQuaternionInterpolant : GLTFCubicSplineInterpolant;\n\n\t\t\t\t\t\t\treturn new interpolantType( this.times, this.values, this.getValueSize() / 3, result );\n\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\t// Mark as CUBICSPLINE. `track.getInterpolation()` doesn't support custom interpolants.\n\t\t\t\t\t\ttrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttracks.push( track );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst name = animationDef.name ? animationDef.name : 'animation_' + animationIndex;\n\n\t\t\treturn new AnimationClip( name, undefined, tracks );\n\n\t\t} );\n\n\t}\n\n\tcreateNodeMesh( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tif ( nodeDef.mesh === undefined ) return null;\n\n\t\treturn parser.getDependency( 'mesh', nodeDef.mesh ).then( function ( mesh ) {\n\n\t\t\tconst node = parser._getNodeRef( parser.meshCache, nodeDef.mesh, mesh );\n\n\t\t\t// if weights are provided on the node, override weights on the mesh.\n\t\t\tif ( nodeDef.weights !== undefined ) {\n\n\t\t\t\tnode.traverse( function ( o ) {\n\n\t\t\t\t\tif ( ! o.isMesh ) return;\n\n\t\t\t\t\tfor ( let i = 0, il = nodeDef.weights.length; i < il; i ++ ) {\n\n\t\t\t\t\t\to.morphTargetInfluences[ i ] = nodeDef.weights[ i ];\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy\n\t * @param {number} nodeIndex\n\t * @return {Promise<Object3D>}\n\t */\n\tloadNode( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\t\tconst parser = this;\n\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\t// reserve node's name before its dependencies, so the root has the intended name.\n\t\tconst nodeName = nodeDef.name ? parser.createUniqueName( nodeDef.name ) : '';\n\n\t\treturn ( function () {\n\n\t\t\tconst objectPending = [];\n\n\t\t\tconst meshPromise = parser._invokeOne( function ( ext ) {\n\n\t\t\t\treturn ext.createNodeMesh && ext.createNodeMesh( nodeIndex );\n\n\t\t\t} );\n\n\t\t\tif ( meshPromise ) {\n\n\t\t\t\tobjectPending.push( meshPromise );\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\t\tobjectPending.push( parser.getDependency( 'camera', nodeDef.camera ).then( function ( camera ) {\n\n\t\t\t\t\treturn parser._getNodeRef( parser.cameraCache, nodeDef.camera, camera );\n\n\t\t\t\t} ) );\n\n\t\t\t}\n\n\t\t\tparser._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext.createNodeAttachment && ext.createNodeAttachment( nodeIndex );\n\n\t\t\t} ).forEach( function ( promise ) {\n\n\t\t\t\tobjectPending.push( promise );\n\n\t\t\t} );\n\n\t\t\tconst childPending = [];\n\t\t\tconst childrenDef = nodeDef.children || [];\n\n\t\t\tfor ( let i = 0, il = childrenDef.length; i < il; i ++ ) {\n\n\t\t\t\tchildPending.push( parser.getDependency( 'node', childrenDef[ i ] ) );\n\n\t\t\t}\n\n\t\t\tconst skeletonPending = nodeDef.skin === undefined\n\t\t\t\t? Promise.resolve( null )\n\t\t\t\t: parser.getDependency( 'skin', nodeDef.skin );\n\n\t\t\treturn Promise.all( [\n\t\t\t\tPromise.all( objectPending ),\n\t\t\t\tPromise.all( childPending ),\n\t\t\t\tskeletonPending\n\t\t\t] );\n\n\t\t}() ).then( function ( results ) {\n\n\t\t\tconst objects = results[ 0 ];\n\t\t\tconst children = results[ 1 ];\n\t\t\tconst skeleton = results[ 2 ];\n\n\t\t\tlet node;\n\n\t\t\t// .isBone isn't in glTF spec. See ._markDefs\n\t\t\tif ( nodeDef.isBone === true ) {\n\n\t\t\t\tnode = new Bone();\n\n\t\t\t} else if ( objects.length > 1 ) {\n\n\t\t\t\tnode = new Group();\n\n\t\t\t} else if ( objects.length === 1 ) {\n\n\t\t\t\tnode = objects[ 0 ];\n\n\t\t\t} else {\n\n\t\t\t\tnode = new Object3D();\n\n\t\t\t}\n\n\t\t\tif ( node !== objects[ 0 ] ) {\n\n\t\t\t\tfor ( let i = 0, il = objects.length; i < il; i ++ ) {\n\n\t\t\t\t\tnode.add( objects[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.name ) {\n\n\t\t\t\tnode.userData.name = nodeDef.name;\n\t\t\t\tnode.name = nodeName;\n\n\t\t\t}\n\n\t\t\tassignExtrasToUserData( node, nodeDef );\n\n\t\t\tif ( nodeDef.extensions ) addUnknownExtensionsToUserData( extensions, node, nodeDef );\n\n\t\t\tif ( nodeDef.matrix !== undefined ) {\n\n\t\t\t\tconst matrix = new Matrix4();\n\t\t\t\tmatrix.fromArray( nodeDef.matrix );\n\t\t\t\tnode.applyMatrix4( matrix );\n\n\t\t\t} else {\n\n\t\t\t\tif ( nodeDef.translation !== undefined ) {\n\n\t\t\t\t\tnode.position.fromArray( nodeDef.translation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.rotation !== undefined ) {\n\n\t\t\t\t\tnode.quaternion.fromArray( nodeDef.rotation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.scale !== undefined ) {\n\n\t\t\t\t\tnode.scale.fromArray( nodeDef.scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ! parser.associations.has( node ) ) {\n\n\t\t\t\tparser.associations.set( node, {} );\n\n\t\t\t}\n\n\t\t\tparser.associations.get( node ).nodes = nodeIndex;\n\n\t\t\tif ( skeleton !== null ) {\n\n\t\t\t\t// This full traverse should be fine because\n\t\t\t\t// child glTF nodes have not been added to this node yet.\n\t\t\t\tnode.traverse( function ( mesh ) {\n\n\t\t\t\t\tif ( ! mesh.isSkinnedMesh ) return;\n\n\t\t\t\t\tmesh.bind( skeleton, _identityMatrix );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, il = children.length; i < il; i ++ ) {\n\n\t\t\t\tnode.add( children[ i ] );\n\n\t\t\t}\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes\n\t * @param {number} sceneIndex\n\t * @return {Promise<Group>}\n\t */\n\tloadScene( sceneIndex ) {\n\n\t\tconst extensions = this.extensions;\n\t\tconst sceneDef = this.json.scenes[ sceneIndex ];\n\t\tconst parser = this;\n\n\t\t// Loader returns Group, not Scene.\n\t\t// See: https://github.com/mrdoob/three.js/issues/18342#issuecomment-578981172\n\t\tconst scene = new Group();\n\t\tif ( sceneDef.name ) scene.name = parser.createUniqueName( sceneDef.name );\n\n\t\tassignExtrasToUserData( scene, sceneDef );\n\n\t\tif ( sceneDef.extensions ) addUnknownExtensionsToUserData( extensions, scene, sceneDef );\n\n\t\tconst nodeIds = sceneDef.nodes || [];\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = nodeIds.length; i < il; i ++ ) {\n\n\t\t\tpending.push( parser.getDependency( 'node', nodeIds[ i ] ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function ( nodes ) {\n\n\t\t\tfor ( let i = 0, il = nodes.length; i < il; i ++ ) {\n\n\t\t\t\tscene.add( nodes[ i ] );\n\n\t\t\t}\n\n\t\t\t// Removes dangling associations, associations that reference a node that\n\t\t\t// didn't make it into the scene.\n\t\t\tconst reduceAssociations = ( node ) => {\n\n\t\t\t\tconst reducedAssociations = new Map();\n\n\t\t\t\tfor ( const [ key, value ] of parser.associations ) {\n\n\t\t\t\t\tif ( key instanceof Material || key instanceof Texture ) {\n\n\t\t\t\t\t\treducedAssociations.set( key, value );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tnode.traverse( ( node ) => {\n\n\t\t\t\t\tconst mappings = parser.associations.get( node );\n\n\t\t\t\t\tif ( mappings != null ) {\n\n\t\t\t\t\t\treducedAssociations.set( node, mappings );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\treturn reducedAssociations;\n\n\t\t\t};\n\n\t\t\tparser.associations = reduceAssociations( scene );\n\n\t\t\treturn scene;\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {GLTF.Primitive} primitiveDef\n * @param {GLTFParser} parser\n */\nfunction computeBounds( geometry, primitiveDef, parser ) {\n\n\tconst attributes = primitiveDef.attributes;\n\n\tconst box = new Box3();\n\n\tif ( attributes.POSITION !== undefined ) {\n\n\t\tconst accessor = parser.json.accessors[ attributes.POSITION ];\n\n\t\tconst min = accessor.min;\n\t\tconst max = accessor.max;\n\n\t\t// glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\tbox.set(\n\t\t\t\tnew Vector3( min[ 0 ], min[ 1 ], min[ 2 ] ),\n\t\t\t\tnew Vector3( max[ 0 ], max[ 1 ], max[ 2 ] )\n\t\t\t);\n\n\t\t\tif ( accessor.normalized ) {\n\n\t\t\t\tconst boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] );\n\t\t\t\tbox.min.multiplyScalar( boxScale );\n\t\t\t\tbox.max.multiplyScalar( boxScale );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\n\t\t\treturn;\n\n\t\t}\n\n\t} else {\n\n\t\treturn;\n\n\t}\n\n\tconst targets = primitiveDef.targets;\n\n\tif ( targets !== undefined ) {\n\n\t\tconst maxDisplacement = new Vector3();\n\t\tconst vector = new Vector3();\n\n\t\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\t\tconst target = targets[ i ];\n\n\t\t\tif ( target.POSITION !== undefined ) {\n\n\t\t\t\tconst accessor = parser.json.accessors[ target.POSITION ];\n\t\t\t\tconst min = accessor.min;\n\t\t\t\tconst max = accessor.max;\n\n\t\t\t\t// glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\t\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\t\t\t// we need to get max of absolute components because target weight is [-1,1]\n\t\t\t\t\tvector.setX( Math.max( Math.abs( min[ 0 ] ), Math.abs( max[ 0 ] ) ) );\n\t\t\t\t\tvector.setY( Math.max( Math.abs( min[ 1 ] ), Math.abs( max[ 1 ] ) ) );\n\t\t\t\t\tvector.setZ( Math.max( Math.abs( min[ 2 ] ), Math.abs( max[ 2 ] ) ) );\n\n\n\t\t\t\t\tif ( accessor.normalized ) {\n\n\t\t\t\t\t\tconst boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] );\n\t\t\t\t\t\tvector.multiplyScalar( boxScale );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Note: this assumes that the sum of all weights is at most 1. This isn't quite correct - it's more conservative\n\t\t\t\t\t// to assume that each target can have a max weight of 1. However, for some use cases - notably, when morph targets\n\t\t\t\t\t// are used to implement key-frame animations and as such only two are active at a time - this results in very large\n\t\t\t\t\t// boxes. So for now we make a box that's sometimes a touch too small but is hopefully mostly of reasonable size.\n\t\t\t\t\tmaxDisplacement.max( vector );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// As per comment above this box isn't conservative, but has a reasonable size for a very large number of morph targets.\n\t\tbox.expandByVector( maxDisplacement );\n\n\t}\n\n\tgeometry.boundingBox = box;\n\n\tconst sphere = new Sphere();\n\n\tbox.getCenter( sphere.center );\n\tsphere.radius = box.min.distanceTo( box.max ) / 2;\n\n\tgeometry.boundingSphere = sphere;\n\n}\n\n/**\n * @param {BufferGeometry} geometry\n * @param {GLTF.Primitive} primitiveDef\n * @param {GLTFParser} parser\n * @return {Promise<BufferGeometry>}\n */\nfunction addPrimitiveAttributes( geometry, primitiveDef, parser ) {\n\n\tconst attributes = primitiveDef.attributes;\n\n\tconst pending = [];\n\n\tfunction assignAttributeAccessor( accessorIndex, attributeName ) {\n\n\t\treturn parser.getDependency( 'accessor', accessorIndex )\n\t\t\t.then( function ( accessor ) {\n\n\t\t\t\tgeometry.setAttribute( attributeName, accessor );\n\n\t\t\t} );\n\n\t}\n\n\tfor ( const gltfAttributeName in attributes ) {\n\n\t\tconst threeAttributeName = ATTRIBUTES[ gltfAttributeName ] || gltfAttributeName.toLowerCase();\n\n\t\t// Skip attributes already provided by e.g. Draco extension.\n\t\tif ( threeAttributeName in geometry.attributes ) continue;\n\n\t\tpending.push( assignAttributeAccessor( attributes[ gltfAttributeName ], threeAttributeName ) );\n\n\t}\n\n\tif ( primitiveDef.indices !== undefined && ! geometry.index ) {\n\n\t\tconst accessor = parser.getDependency( 'accessor', primitiveDef.indices ).then( function ( accessor ) {\n\n\t\t\tgeometry.setIndex( accessor );\n\n\t\t} );\n\n\t\tpending.push( accessor );\n\n\t}\n\n\tassignExtrasToUserData( geometry, primitiveDef );\n\n\tcomputeBounds( geometry, primitiveDef, parser );\n\n\treturn Promise.all( pending ).then( function () {\n\n\t\treturn primitiveDef.targets !== undefined\n\t\t\t? addMorphTargets( geometry, primitiveDef.targets, parser )\n\t\t\t: geometry;\n\n\t} );\n\n}\n\nexport { GLTFLoader };\n","import {DicePreset} from './DicePreset.js';\nimport {BASE_PRESETS_LIST, EXTRA_PRESETS_LIST} from './DiceDefaultPresets.js';\nimport {DiceColors, DICE_SCALE, COLORSETS} from './DiceColors.js';\nimport {DICE_MODELS} from './DiceModels.js';\nimport * as THREE from 'three';\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\nimport { ShaderUtils } from './ShaderUtils';\nexport class DiceFactory {\n\n\tconstructor() {\n\t\tthis.geometries = {};\n\n\t\tthis.baseScale = 50;\n\n\t\tthis.preferredSystem = \"standard\";\n\t\tthis.preferredColorset = \"custom\";\n\n\t\tthis.cache_hits = 0;\n\t\tthis.cache_misses = 0;\n\n\t\tthis.realisticLighting = true;\n\n\t\tthis.loaderGLTF = new GLTFLoader();\n\t\tthis.fontLoadingPromises = [];\n\n\t\tthis.baseTextureCache = {};\n\n\t\tthis.systems = {\n\t\t\t'standard': {id: 'standard', name: game.i18n.localize(\"DICESONICE.System.Standard\"), dice:[], mode:\"default\"},\n\t\t\t'spectrum': {id: 'spectrum', name: game.i18n.localize(\"DICESONICE.System.SpectrumDice\"), dice:[], mode:\"default\"},\n\t\t\t'foundry_vtt': {id: 'foundry_vtt', name: game.i18n.localize(\"DICESONICE.System.FoundryVTT\"), dice:[], mode:\"default\"},\n\t\t\t'dot': {id: 'dot', name: game.i18n.localize(\"DICESONICE.System.Dot\"), dice:[], mode:\"default\"},\n\t\t\t'dot_b': {id: 'dot_b', name: game.i18n.localize(\"DICESONICE.System.DotBlack\"), dice:[], mode:\"default\"}\n\t\t};\n\t\t\n\t\tBASE_PRESETS_LIST.forEach((preset) => {\n\t\t\tthis.register(preset);\n\t\t});\n\t\t\n\t\tEXTRA_PRESETS_LIST.forEach((data) => {\n\t\t\tthis.addDicePreset(data);\n\t\t});\n\n\t\tfor(let i in CONFIG.Dice.terms){\n\t\t\tlet term = CONFIG.Dice.terms[i];\n\t\t\t//If this is not a core dice type\n\t\t\tif(![Coin, FateDie, Die].includes(term)){\n\t\t\t\tlet objTerm = new term({});\n\t\t\t\tif([2, 3, 4, 6, 8, 10, 12, 14, 16, 20, 24, 30].includes(objTerm.faces)){\n\t\t\t\t\tthis.internalAddDicePreset(objTerm);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tinitializeMaterials(){\n\t\tif(this.realisticLighting){\n\t\t\tthis.material_options = {\n\t\t\t\t'plastic': {\n\t\t\t\t\t'type':\"standard\",\n\t\t\t\t\t'options':{\n\t\t\t\t\t\tmetalness: 0,\n\t\t\t\t\t\troughness: 0.6,\n\t\t\t\t\t\tenvMapIntensity:1\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\troughnessMap : \"roughnessMap_fingerprint\",\n\t\t\t\t\t\tenvMap : true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'metal': {\n\t\t\t\t\t'type':'standard',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\troughness: 0.6,\n\t\t\t\t\t\tmetalness: 1\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\troughnessMap : \"roughnessMap_metal\",\n\t\t\t\t\t\tenvMap : true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'wood': {\n\t\t\t\t\t'type':'standard',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\troughness:1,\n\t\t\t\t\t\tmetalness:0\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\troughnessMap : \"roughnessMap_wood\",\n\t\t\t\t\t\tenvMap : true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'glass': {\n\t\t\t\t\t'type':'standard',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\troughness: 0.3,\n\t\t\t\t\t\tmetalness: 0\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\troughnessMap : \"roughnessMap_fingerprint\",\n\t\t\t\t\t\tenvMap : true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'chrome': {\n\t\t\t\t\t'type':'standard',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\tmetalness: 1,\n\t\t\t\t\t\troughness: 0.1\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\troughnessMap : \"roughnessMap_fingerprint\",\n\t\t\t\t\t\tenvMap : true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'pristine': {\n\t\t\t\t\t'type':'physical',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\tmetalness: 0,\n\t\t\t\t\t\troughness: 0.8,\n\t\t\t\t\t\tenvMapIntensity:1,\n\t\t\t\t\t\tclearcoat: 1,\n\t\t\t\t\t\tclearcoatRoughness: 0.9\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\tenvMap : true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'iridescent': {\n\t\t\t\t\t'type':'physical',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\tmetalness: 1,\n\t\t\t\t\t\troughness: 0.2,\n\t\t\t\t\t\tiridescence: 1,\n\t\t\t\t\t\tiridescenceIOR: 1.8,\n\t\t\t\t\t\tiridescenceThicknessRange: [485,515]\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\tenvMap : true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'stone': {\n\t\t\t\t\t'type':'standard',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\tmetalness: 0,\n\t\t\t\t\t\troughness: 1\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\troughnessMap : \"roughnessMap_stone\",\n\t\t\t\t\t\tenvMap : true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthis.material_options = {\n\t\t\t\t'plastic': {\n\t\t\t\t\t'type':\"phong\",\n\t\t\t\t\t'options':{\n\t\t\t\t\t\tspecular: 0xffffff,\n\t\t\t\t\t\tcolor: 0xb5b5b5,\n\t\t\t\t\t\tshininess: 3,\n\t\t\t\t\t\tflatShading: true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'metal': {\n\t\t\t\t\t'type':'standard',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\tcolor: 0xdddddd,\n\t\t\t\t\t\temissive:0x111111,\n\t\t\t\t\t\troughness: 0.6,\n\t\t\t\t\t\tmetalness: 1,\n\t\t\t\t\t\tenvMapIntensity:2\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\tenvMap:true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'wood': {\n\t\t\t\t\t'type':'phong',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\tspecular: 0xffffff,\n\t\t\t\t\t\tcolor: 0xb5b5b5,\n\t\t\t\t\t\tshininess: 1,\n\t\t\t\t\t\tflatShading: true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'glass': {\n\t\t\t\t\t'type':'phong',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\tspecular: 0xffffff,\n\t\t\t\t\t\tcolor: 0xb5b5b5,\n\t\t\t\t\t\tshininess: 0.3,\n\t\t\t\t\t\treflectivity:0.1,\n\t\t\t\t\t\tcombine:THREE.MixOperation\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\tenvMap:true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'chrome': {\n\t\t\t\t\t'type':'phong',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\tspecular: 0xffffff,\n\t\t\t\t\t\tcolor: 0xb5b5b5,\n\t\t\t\t\t\tshininess: 1,\n\t\t\t\t\t\treflectivity:0.7,\n\t\t\t\t\t\tcombine:THREE.AddOperation\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\tenvMap:true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t//no difference with plastic without advanced ligthing\n\t\t\t\t'pristine': {\n\t\t\t\t\t'type':'phong',\n\t\t\t\t\t'options':{\n\t\t\t\t\t\tspecular: 0xffffff,\n\t\t\t\t\t\tcolor: 0xb5b5b5,\n\t\t\t\t\t\tshininess: 3,\n\t\t\t\t\t\tflatShading: true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'iridescent': {\n\t\t\t\t\t'type':'standard',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\tcolor: 0xdddddd,\n\t\t\t\t\t\temissive:0x111111,\n\t\t\t\t\t\troughness: 0.2,\n\t\t\t\t\t\tmetalness: 1,\n\t\t\t\t\t\tenvMapIntensity:2,\n\t\t\t\t\t\tuserData:{\n\t\t\t\t\t\t\tiridescent:true\n\t\t\t\t\t\t}\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\tenvMap:true\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t'stone': {\n\t\t\t\t\t'type':'lambert',\n\t\t\t\t\t'options': {\n\t\t\t\t\t\tcolor: 0xb5b5b5,\n\t\t\t\t\t\treflectivity:0.01\n\t\t\t\t\t},\n\t\t\t\t\t'scopedOptions':{\n\t\t\t\t\t\tenvMap:true\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tsetScale(scale){\n\t\tthis.baseScale = scale;\n\t}\n\n\tsetQualitySettings(config){\n\t\tthis.realisticLighting = config.bumpMapping;\n\t\tthis.aa = config.antialiasing;\n\t\tthis.glow = config.glow;\n\t\tthis.useHighDPI = config.useHighDPI;\n\t\tthis.shadows = config.shadowQuality != \"none\";\n\t\tthis.shadowQuality = config.shadowQuality;\n\t}\n\n\tregister(diceobj) {\n\t\t//If it is added to standard, it can be from automated system detecting DiceTerm, or the basic dice list. In those case, the internalAdd preorperty is set to true\n\t\t//Everything should exist in the standard system\n\t\t//We check to see if there's already this Dice DONOMINATOR in the standard system\n\t\tlet index = this.systems.standard.dice.findIndex(el => el.type == diceobj.type);\n\n\t\t//If it exists in the standard system, and it was added there by the automated system, we want to override and load it\n\t\tif(index>=0 && (this.systems.standard.dice[index].internalAdd || diceobj.internalAdd)){\n\t\t\tthis.systems.standard.dice[index] = diceobj;\n\t\t\tif(diceobj.modelFile){\n\t\t\t\tdiceobj.loadModel(this.loaderGLTF);\n\t\t\t} else {\n\t\t\t\tdiceobj.loadTextures();\n\t\t\t}\n\t\t}\n\t\tif(diceobj.system == \"standard\"){\n\t\t\t//If we're adding to the standard system directly, we only do it if it didn't exist previously\n\t\t\tif(index < 0){\n\t\t\t\tthis.systems[diceobj.system].dice.push(diceobj);\n\t\t\t}\t\n\t\t} else {\n\t\t\t//If for some reasons, we try to register a dice type that doesnt exist on the standard system, we add it there first.\n\t\t\t//This should not happen because of internalAddDicePreset but I'm only 95% sure.\n\t\t\tif(index<0){\n\t\t\t\tthis.systems.standard.dice.push(diceobj);\n\t\t\t\tif(diceobj.modelFile){\n\t\t\t\t\tdiceobj.loadModel(this.loaderGLTF);\n\t\t\t\t} else {\n\t\t\t\t\tdiceobj.loadTextures();\n\t\t\t\t}\n\t\t\t}\n\t\t\t//Then we add it to its own system. No need to load it, that will be taken care of automatically\n\t\t\tthis.systems[diceobj.system].dice.push(diceobj);\n\t\t}\n\t}\n\n\tasync preloadPresets(waitForLoad = true, userID = null, config = {}){\n\t\tlet activePresets = [];\n\t\tconst preloadPresetsByUser = (user) => {\n\t\t\tlet appearance = user.getFlag(\"dice-so-nice\", \"appearance\") ? duplicate(user.getFlag(\"dice-so-nice\", \"appearance\")) : null;\n\t\t\tif(!appearance){\n\t\t\t\tappearance = {global:{}};\n\t\t\t\tif(this.preferredSystem != \"standard\")\n\t\t\t\t\tappearance.global.system = this.preferredSystem;\n\t\t\t\tif(this.preferredColorset != \"custom\")\n\t\t\t\t\tappearance.global.colorset = this.preferredColorset;\n\t\t\t}\n\t\t\t//load basic model\n\t\t\tthis.systems[\"standard\"].dice.forEach((obj) =>{\n\t\t\t\tactivePresets.push(obj);\n\t\t\t});\n\t\t\tmergeObject(appearance, config,{performDeletions:true});\n\t\t\tif(!isEmpty(appearance)){\n\t\t\t\tfor (let scope in appearance) {\n\t\t\t\t\tif (appearance.hasOwnProperty(scope)) {\n\t\t\t\t\t\tif(scope != \"global\")\n\t\t\t\t\t\t\tactivePresets.push(this.getPresetBySystem(scope, appearance[scope].system));\n\t\t\t\t\t\telse if(this.systems.hasOwnProperty(appearance[scope].system)){\n\t\t\t\t\t\t\tthis.systems[appearance[scope].system].dice.forEach((obj) =>{\n\t\t\t\t\t\t\t\tactivePresets.push(obj);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\tif(userID)\n\t\t\tpreloadPresetsByUser(game.users.get(userID));\n\t\telse\n \tgame.users.forEach((user) =>{\n\t\t\t\tpreloadPresetsByUser(user);\n\t\t\t});\n //remove duplicate\n activePresets = activePresets.filter((v, i, a) => a.indexOf(v) === i);\n\t\tlet promiseArray = [];\n\t\tactivePresets.forEach((preset)=>{\n\t\t\tif(preset){\n\t\t\t\tif(preset.modelFile){\n\t\t\t\t\t//Custom 3D model\n\t\t\t\t\tpromiseArray.push(preset.loadModel(this.loaderGLTF));\n\t\t\t\t} else {\n\t\t\t\t\t//Classic 3D model\n\t\t\t\t\tpromiseArray.push(preset.loadTextures());\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tif(waitForLoad)\n\t\t\tawait Promise.all(promiseArray);\n\t}\n\n\t//{id: 'standard', name: game.i18n.localize(\"DICESONICE.System.Standard\")}\n\taddSystem(system, mode=\"default\"){\n\t\tsystem.dice = [];\n\t\tsystem.mode = mode;\n\t\tif(mode != \"default\" && this.preferredSystem == \"standard\")\n\t\t\tthis.preferredSystem = system.id;\n\t\tthis.systems[system.id] = system;\n\t}\n\t//{type:\"\",labels:[],system:\"\"}\n\t//Should have been called \"addDicePresetFromModel\" but ¯\\_(ツ)_/¯\n\taddDicePreset(dice, shape = null){\n\t\tlet model = this.systems[\"standard\"].dice.find(el => el.type == dice.type);\n\t\tif(!model || !model.internalAdd){\n\t\t\tif(!shape)\n\t\t\t\tshape = dice.type;\n\t\t\tmodel = this.systems[\"standard\"].dice.find(el => el.type == shape);\n\t\t}\n\t\tlet preset = new DicePreset(dice.type, model.shape);\n\t\tlet denominator = dice.type.substr(1);\n\n\t\tpreset.term = isNaN(denominator) ? CONFIG.Dice.terms[denominator].name : \"Die\";\n\t\t\n\t\tpreset.setLabels(dice.labels);\n\t\tpreset.setModel(dice.modelFile);\n\t\tif(dice.values){\n\t\t\tif(dice.values.min == undefined)\n\t\t\t\tdice.values.min = 1;\n\t\t\tif(dice.values.max == undefined)\n\t\t\t\tdice.values.max = model.values.length;\n\t\t\tif(dice.values.step == undefined)\n\t\t\t\tdice.values.step = 1;\n\t\t\tpreset.setValues(dice.values.min,dice.values.max,dice.values.step);\n\t\t} else {\n\t\t\tpreset.values = model.values;\n\t\t\tpreset.valueMap = model.valueMap;\n\t\t}\n\t\tif(dice.valueMap){\n\t\t\tpreset.valueMap = dice.valueMap;\n\t\t}\n\t\tpreset.mass = model.mass;\n\t\tpreset.scale = model.scale;\n\t\tpreset.inertia = model.inertia;\n\t\tpreset.system = dice.system;\n\t\tpreset.font = dice.font;\n\t\tpreset.fontScale = dice.fontScale || null;\n\t\tpreset.colorset = dice.colorset || null;\n\t\t//If it overrides an existing model that isn't a numbered die, set a font scale to prevent undesired fontScale from previous model\n\t\tif(!preset.fontScale && ![\"d2\",\"d4\",\"d6\",\"d8\",\"d10\",\"d12\",\"d14\",\"d16\",\"d20\",\"d24\",\"d30\",\"d100\"].includes(dice.type) && this.systems[\"standard\"].dice.find(el => el.type == dice.type))\n\t\t\tpreset.fontScale = DICE_SCALE[shape];\n\t\t\n\t\tif(dice.bumpMaps && dice.bumpMaps.length)\n\t\t\tpreset.setBumpMaps(dice.bumpMaps);\n\n\t\tif(dice.emissiveMaps && dice.emissiveMaps.length)\n\t\t\tpreset.setEmissiveMaps(dice.emissiveMaps);\n\n\t\tif(dice.emissive)\n\t\t\tpreset.emissive = dice.emissive;\n\n\t\tif(dice.emissiveIntensity)\n\t\t\tpreset.emissiveIntensity = dice.emissiveIntensity;\n\n\t\tthis.register(preset);\n\n\t\tif(dice.font && !FontConfig.getAvailableFonts().includes(dice.font)){\n\t\t\tthis.fontLoadingPromises.push(FontConfig.loadFont(dice.font,{editor:false,fonts:[]}));\n\t\t}\n\t}\n\n\t//Is called when trying to create a DicePreset by guessing its faces from the CONFIG entries\n\tinternalAddDicePreset(diceobj){\n\t\tlet shape = \"d\";\n\t\tlet fakeShape = [3,5,7];\n\t\tif(fakeShape.includes(diceobj.faces))\n\t\t\tshape += (diceobj.faces*2);\n\t\telse\n\t\t\tshape += diceobj.faces;\n\t\tlet type = \"d\" + diceobj.constructor.DENOMINATION;\n\t\tlet model = this.systems[\"standard\"].dice.find(el => el.type == shape);\n\t\tlet preset = new DicePreset(type, model.shape);\n\t\tpreset.term = diceobj.constructor.name;\n\t\tlet labels = [];\n\t\tfor(let i = 1;i<= diceobj.faces;i++){\n\t\t\tlabels.push(diceobj.getResultLabel({result:i}));\n\t\t}\n\t\tpreset.setLabels(labels);\n\t\tpreset.setValues(1,diceobj.faces);\n\t\tpreset.mass = model.mass;\n\t\tpreset.inertia = model.inertia;\n\t\tpreset.scale = model.scale;\n\t\tpreset.internalAdd = true;\n\t\tthis.register(preset);\n\t}\n\n\tdisposeCachedMaterials(type = null){\n\t\tfor (const material in this.baseTextureCache) {\n\t\t\tif(type == null || material.substr(0,type.length) == type){\n\t\t\t\tthis.baseTextureCache[material].map.dispose();\n\t\t\t\tif(this.baseTextureCache[material].bumpMap)\n\t\t\t\t\tthis.baseTextureCache[material].bumpMap.dispose();\n\t\t\t\tif(this.baseTextureCache[material].emissiveMap)\n\t\t\t\t\tthis.baseTextureCache[material].emissiveMap.dispose();\n\t\t\t\tthis.baseTextureCache[material].dispose();\n\t\t\t\tdelete this.baseTextureCache[material];\n\t\t\t}\n\t\t}\n\t}\n\n\t//Stripped version from the Foundry Core library to avoid reloading fonts\n\tasync _loadFonts(){\n\t\tconst timeout = new Promise(resolve => setTimeout(resolve, 4500));\n\t\tconst ready = Promise.all(this.fontLoadingPromises).then(() => document.fonts.ready);\n\t\tthis.fontLoadingPromises = [];\n\t\tawait Promise.race([ready, timeout]);\n\t}\n\n\tget(type) {\n\t\treturn this.getPresetBySystem(type);\n\t}\n\n\tgetPresetBySystem(type, system = \"standard\"){\n\t\tlet model = this.systems[\"standard\"].dice.find(obj => obj.type == type);\n\t\tif(!model)\n\t\t\treturn null;\n\t\tlet diceobj = null;\n\t\tif(system != \"standard\"){\n\t\t\tif(this.systems.hasOwnProperty(system)){\n\t\t\t\tdiceobj = this.systems[system].dice.find(obj => obj.type == type && obj.shape == model.shape);\n\t\t\t\tif(!diceobj && !['Coin', 'FateDie', 'Die'].includes(model.term)){\n\t\t\t\t\t//If it doesn't exist and is not a core DiceTerm, we look for a similar shape and values\n\t\t\t\t\tdiceobj = this.systems[system].dice.find(obj => obj.shape == model.shape && obj.values.length == model.values.length && !model.colorset);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif(!diceobj){\n\t\t\tdiceobj = this.systems.standard.dice.find(obj => obj.type == type);\n\t\t}\n\t\treturn diceobj;\n\t}\n\n\t// returns a dicemesh (THREE.Mesh) object\n\tcreate(scopedTextureCache, type, appearance) {\n\t\tlet diceobj = this.getPresetBySystem(type, appearance.system);\n\t\tif(diceobj.model && appearance.isGhost){\n\t\t\tdiceobj = this.getPresetBySystem(type, \"standard\");\n\t\t}\n\t\tlet scopedScale = scopedTextureCache.type == \"board\" ? this.baseScale : 60;\n\t\tif (!diceobj) return null;\n\t\tlet dicemesh;\n\n\t\tlet geom = this.geometries[type+scopedScale];\n\t\tif(!geom) {\n\t\t\tgeom = this.createGeometry(diceobj.shape, diceobj.scale, scopedScale);\n\t\t\tthis.geometries[type+scopedScale] = geom;\n\t\t}\n\t\tif (!geom) return null;\n\n\n\t\tif(diceobj.model){\n\t\t\tdicemesh = diceobj.model.scene.children[0].clone();\n\t\t\tlet scale = scopedScale/100;\n\t\t\tdicemesh.scale.set(scale,scale,scale);\n\t\t\tif(!dicemesh.geometry)\n\t\t\t\tdicemesh.geometry = {};\n\t\t\tdicemesh.geometry.cannon_shape = geom.cannon_shape;\n\t\t\tif(diceobj.model.animations.length>0){\n\t\t\t\tdicemesh.mixer = new THREE.AnimationMixer(dicemesh);\n\t\t\t\tdicemesh.mixer.clipAction(diceobj.model.animations[0]).play();\n\t\t\t}\n\t\t}else{\n\t\t\tlet materialData = this.generateMaterialData(diceobj, appearance);\n\n\t\t\tlet baseTextureCacheString = scopedTextureCache.type+type+materialData.cacheString;\n\t\t\tlet materials;\n\t\t\tif(this.baseTextureCache[baseTextureCacheString])\n\t\t\t\tmaterials = this.baseTextureCache[baseTextureCacheString];\n\t\t\telse\n\t\t\t\tmaterials = this.createMaterials(scopedTextureCache, baseTextureCacheString, diceobj, materialData);\n\t\t\t\n\t\t\tdicemesh = new THREE.Mesh(geom, materials);\n\n\t\t\t//TODO: Find if this entire block is still needed\n\t\t\t//I think not\n\t\t\tif (diceobj.color) {\n\t\t\t\tdicemesh.material[0].color = new THREE.Color(diceobj.color);\n\t\t\t\tif(this.realisticLighting)\n\t\t\t\t\tdicemesh.material[0].color.convertLinearToSRGB();\n\t\t\t\t//dicemesh.material[0].emissive = new THREE.Color(diceobj.color);\n\t\t\t\tdicemesh.material[0].emissiveIntensity = diceobj.emissiveIntensity ? diceobj.emissiveIntensity : 1;\n\t\t\t\tdicemesh.material[0].needsUpdate = true;\n\t\t\t}\n\t\t}\n\t\t\n\t\tdicemesh.result = [];\n\t\tdicemesh.shape = diceobj.shape;\n\t\tdicemesh.rerolls = 0;\n\t\tdicemesh.resultReason = 'natural';\n\n\t\tlet factory = this;\n\t\tdicemesh.getFaceValue = function() {\n\t\t\tlet reason = this.resultReason;\n\t\t\tlet vector = new THREE.Vector3(0, 0, this.shape == 'd4' ? -1 : 1);\n\t\t\tlet faceCannon = new THREE.Vector3();\n\t\t\tlet closest_face, closest_angle = Math.PI * 2;\n\t\t\tfor (let i = 0, l = this.body_sim.shapes[0].faceNormals.length; i < l; ++i) {\n\t\t\t\tif(DICE_MODELS[this.shape].faceValues[i] == 0)\n\t\t\t\t\tcontinue;\n\t\t\t\tfaceCannon.copy(this.body_sim.shapes[0].faceNormals[i]);\n\t\t\t\t\n\t\t\t\tlet angle = faceCannon.applyQuaternion(this.body_sim.quaternion).angleTo(vector);\n\t\t\t\tif (angle < closest_angle) {\n\t\t\t\t\tclosest_angle = angle;\n\t\t\t\t\tclosest_face = i;\n\t\t\t\t}\n\t\t\t}\n\t\t\tconst diceobj = factory.get(this.notation.type);\n\t\t\tlet dieValue = DICE_MODELS[this.shape].faceValues[closest_face];\n\n\t\t\tif (this.shape == 'd4') {\n\t\t\t\treturn {value: dieValue, label: diceobj.labels[dieValue-1], reason: reason};\n\t\t\t}\n\t\t\tlet labelIndex = dieValue;\n\t\t\tif (['d10','d2'].includes(this.shape)) labelIndex += 1;\n\t\t\tlet label = diceobj.labels[labelIndex+1];\n\n\t\t\t//console.log('Face Value', closest_face, dieValue, label)\n\n\t\t\treturn {value: dieValue, label: label, reason: reason};\n\t\t};\n\n\t\tdicemesh.storeRolledValue = function() {\n\t\t\tthis.result.push(this.getFaceValue());\n\t\t};\n\n\t\tdicemesh.getLastValue = function() {\n\t\t\tif (!this.result || this.result.length < 1) return {value: undefined, label: '', reason: ''};\n\n\t\t\treturn this.result[this.result.length-1];\n\t\t};\n\n\t\tdicemesh.setLastValue = function(result) {\n\t\t\tif (!this.result || this.result.length < 1) return;\n\t\t\tif (!result || result.length < 1) return;\n\n\t\t\treturn this.result[this.result.length-1] = result;\n\t\t};\n\n\t\treturn dicemesh;\n\t}\n\n\tcreateMaterials(scopedTextureCache, baseTextureCacheString, diceobj, materialData) {\n\t\tif(this.baseTextureCache[baseTextureCacheString])\n\t\t\treturn this.baseTextureCache[baseTextureCacheString];\n\n\t\tlet labels = diceobj.labels;\n\t\tif (diceobj.shape == 'd4') {\n\t\t\tlabels = diceobj.labels[0];\n\t\t}\n\t\t//If the texture is an array of texture (for random face texture), we look at the first element to determine the faces material and the edge texture\n\t\tlet dice_texture = Array.isArray(materialData.texture) ? materialData.texture[0] : materialData.texture;\n\n\t\tvar mat;\n\t\tlet materialSelected = this.material_options[materialData.material] ? this.material_options[materialData.material] : this.material_options[\"plastic\"];\n\t\tif(!this.realisticLighting){\n\t\t\tdelete materialSelected.roughnessMap;\n\t\t}\n\t\tswitch(materialSelected.type){\n\t\t\tcase \"phong\":\n\t\t\t\tmat = new THREE.MeshPhongMaterial(materialSelected.options);\n\t\t\t\tbreak;\n\t\t\tcase \"standard\":\n\t\t\t\tmat = new THREE.MeshStandardMaterial(materialSelected.options);\n\t\t\t\tbreak;\n\t\t\tcase \"lambert\":\n\t\t\t\tmat = new THREE.MeshLambertMaterial(materialSelected.options);\n\t\t\t\tbreak;\n\t\t\tcase \"physical\":\n\t\t\t\tmat = new THREE.MeshPhysicalMaterial(materialSelected.options);\n\t\t\t\tbreak;\n\t\t\tdefault: //plastic\n\t\t\t\tmat = new THREE.MeshPhongMaterial(this.material_options.plastic.options);\n\t\t}\n\t\tif(materialSelected.scopedOptions){\n\t\t\tif(materialSelected.scopedOptions.envMap)\n\t\t\t\tmat.envMap = scopedTextureCache.textureCube;\n\t\t\tif(materialSelected.scopedOptions.roughnessMap)\n\t\t\t\tmat.roughnessMap = scopedTextureCache[materialSelected.scopedOptions.roughnessMap];\n\t\t}\n\t\tlet font = {\n\t\t\t\"type\":diceobj.font,\n\t\t\t\"scale\": diceobj.fontScale ? diceobj.fontScale:null\n\t\t};\n\t\t\n\t\tif(!font.type){\n\t\t\tfont.type = materialData.font;\n\t\t}\n\t\tif(!font.scale){\n\t\t\tif(materialData.fontScale[diceobj.type])\n\t\t\t\tfont.scale = materialData.fontScale[diceobj.type];\n\t\t\telse{\n\t\t\t\tfont.scale = DICE_SCALE[diceobj.shape];\n\t\t\t}\t\n\t\t}\n\n\t\tlet canvas = document.createElement(\"canvas\");\n\t\tlet context = canvas.getContext(\"2d\", {alpha: true});\n\t\tcontext.globalAlpha = 0;\n\n\t\tlet canvasBump = document.createElement(\"canvas\");\n\t\tlet contextBump = canvasBump.getContext(\"2d\", {alpha: true});\n\t\tcontextBump.globalAlpha = 0;\n\n\t\tlet canvasEmissive = document.createElement(\"canvas\");\n\t\tlet contextEmissive = canvasEmissive.getContext(\"2d\");\n\t\t\n\t\tlet labelsTotal = labels.length;\n\t\tlet isHeritedFromShape = [\"d3\",\"d5\",\"d7\"].includes(diceobj.type) || (diceobj.type == \"df\"&&diceobj.shape == \"d6\");\n\t\tif(isHeritedFromShape){\n\t\t\tlabelsTotal = labelsTotal*2 -2;\n\t\t\tif(diceobj.shape == \"d2\" || diceobj.shape == \"d10\")\n\t\t\t\tlabelsTotal += 1;\n\t\t}\n\n\t\tlet texturesPerLine = Math.ceil(Math.sqrt(labelsTotal));\n\t\tlet sizeTexture = 256;\n\t\tlet ts = this.calc_texture_size(Math.sqrt(labelsTotal)*sizeTexture, true);\n\t\t\n\t\tcanvas.width = canvas.height = canvasBump.width = canvasBump.height = canvasEmissive.width = canvasEmissive.height = ts;\n\t\tlet x = 0;\n\t\tlet y = 0;\n\t\tlet texturesOnThisLine = 0;\n\t\tfor (var i = 0; i < labels.length; ++i) {\n\t\t\tif(texturesOnThisLine == texturesPerLine){\n\t\t\t\ty += sizeTexture;\n\t\t\t\tx = 0;\n\t\t\t\ttexturesOnThisLine = 0;\n\t\t\t}\n\t\t\tif(i==0)//edge\n\t\t\t{\n\t\t\t\t//if the texture is fully opaque, we do not use it for edge\n\t\t\t\tlet texture = {name:\"none\"};\n\t\t\t\tif(dice_texture.composite != \"source-over\")\n\t\t\t\t\ttexture = dice_texture;\n\t\t\t\tthis.createTextMaterial(context, contextBump, contextEmissive, x, y, sizeTexture, diceobj, labels, font, i, texture, materialData);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis.createTextMaterial(context, contextBump, contextEmissive, x, y, sizeTexture, diceobj, labels, font, i, materialData.texture, materialData);\n\t\t\t}\n\t\t\ttexturesOnThisLine++;\n\t\t\tx += sizeTexture;\n\t\t}\n\n\t\t//Special dice from shape divided by 2\n\t\t//D3\n\t\tif(isHeritedFromShape){\n\t\t\tlet startI = 2;\n\t\t\t//for some reason, there's an extra empty cell for all shape except d2 and d10. Should fix that at some point.\n\t\t\tif(diceobj.shape == \"d2\" || diceobj.shape == \"d10\")\n\t\t\t\tstartI = 1;\n\t\t\tfor(i=startI;i<labels.length;i++){\n\t\t\t\tif(texturesOnThisLine == texturesPerLine){\n\t\t\t\t\ty += sizeTexture;\n\t\t\t\t\tx = 0;\n\t\t\t\t\ttexturesOnThisLine = 0;\n\t\t\t\t}\n\t\t\t\tthis.createTextMaterial(context, contextBump, contextEmissive, x, y, sizeTexture, diceobj, labels, font, i, materialData.texture, materialData);\n\t\t\t\ttexturesOnThisLine++;\n\t\t\t\tx += sizeTexture;\n\t\t\t}\n\t\t}\n\n\n\t\t//var img = canvas.toDataURL(\"image/png\");\n\t\t//document.write('<img src=\"'+img+'\"/>');\n\t\t//generate basetexture for caching\n\t\tif(!this.baseTextureCache[baseTextureCacheString]){\n\t\t\tlet texture = new THREE.CanvasTexture(canvas);\n\t\t\tif(this.realisticLighting)\n\t\t\t\ttexture.encoding = THREE.sRGBEncoding;\n\t\t\ttexture.flipY = false;\n\t\t\tmat.map = texture;\n\t\t\tmat.map.anisotropy = game.dice3d.box.anisotropy;\n\n\t\t\tif(this.realisticLighting){\n\t\t\t\tlet bumpMap = new THREE.CanvasTexture(canvasBump);\n\t\t\t\tbumpMap.flipY = false;\n\t\t\t\tmat.bumpMap = bumpMap;\n\n\t\t\t\tlet emissiveMap = new THREE.CanvasTexture(canvasEmissive);\n\t\t\t\tif(this.realisticLighting)\n\t\t\t\t\temissiveMap.encoding = THREE.sRGBEncoding;\n\t\t\t\temissiveMap.flipY = false;\n\t\t\t\tmat.emissiveMap = emissiveMap;\n\t\t\t\tmat.emissiveIntensity = diceobj.emissiveIntensity ? diceobj.emissiveIntensity:1;\n\t\t\t\tmat.emissive = new THREE.Color(diceobj.emissive);\n\t\t\t\tif(this.realisticLighting)\n\t\t\t\t\tmat.emissive.convertLinearToSRGB();\n\t\t\t}\n\t\t}\n\n\t\t//mat.displacementMap = mat.bumpMap;\n\n\t\tswitch(materialData.material){\n\t\t\tcase \"chrome\":\n\t\t\t\tif(this.realisticLighting)\n\t\t\t\t\tmat.metalnessMap = mat.bumpMap;\n\t\t\t\tbreak;\n\t\t\tcase \"iridescent\":\n\t\t\t\tif(this.realisticLighting)\n\t\t\t\t\tmat.metalnessMap = mat.bumpMap;\n\t\t\t\tbreak;\n\t\t}\n\t\t\n\t\tmat.opacity = 1;\n\t\tmat.transparent = true;\n\t\tmat.depthTest = true;\n\t\tmat.needUpdate = true;\n\n\t\tmat.onBeforeCompile = ShaderUtils.applyDiceSoNiceShader;\n\n\t\tthis.baseTextureCache[baseTextureCacheString] = mat;\n\t\treturn mat;\n\t}\n\tcreateTextMaterial(context, contextBump, contextEmissive, x, y, ts, diceobj, labels, font, index, texture, materialData) {\n\t\tif (labels[index] === undefined) return null;\n\n\t\tlet forecolor = materialData.foreground;\n\t\tlet outlinecolor = materialData.outline;\n\t\tlet backcolor = index > 0 ? materialData.background : materialData.edge != \"\" ? materialData.edge:materialData.background;\n\n\t\tif(Array.isArray(texture))\n\t\t\ttexture = texture[Math.floor(Math.random() * texture.length)];\n\t\t\n\t\tlet text = labels[index];\n\t\tlet bump = diceobj.bumps[index];\n\t\tlet emissive = diceobj.emissiveMaps[index];\n\t\tlet isTexture = false;\n\t\tlet margin = 1.0;\n\n\t\t// create color\n\t\tcontext.fillStyle = backcolor;\n\t\tcontext.fillRect(x, y, ts, ts);\n\n\t\tcontextBump.fillStyle = \"#FFFFFF\";\n\t\tcontextBump.fillRect(x, y, ts, ts);\n\n\t\tcontextEmissive.fillStyle = \"#000000\";\n\t\tcontextEmissive.fillRect(x, y, ts, ts);\n\n\t\t//context.rect(x, y, ts, ts);\n\t\t//context.stroke();\n\n\t\t//create underlying texture\n\t\tif (texture.name != '' && texture.name != 'none') {\n\t\t\tcontext.save();\n\t\t\tcontext.beginPath();\n\t\t\tcontext.rect(x,y,ts,ts);\n\t\t\tcontext.clip();\n\t\t\tcontext.globalCompositeOperation = texture.composite || 'source-over';\n\t\t\tcontext.drawImage(texture.texture, x, y, ts, ts);\n\t\t\tcontext.restore();\n\t\t\t\n\t\t\tif (texture.bump != '') {\n\t\t\t\tcontextBump.drawImage(texture.bump, x, y, ts, ts);\n\t\t\t}\n\t\t}\n\n\t\t// create text\n\t\tcontext.globalCompositeOperation = 'source-over';\n\t\tcontext.textAlign = \"center\";\n\t\tcontext.textBaseline = \"middle\";\n\n\t\tcontextBump.textAlign = \"center\";\n\t\tcontextBump.textBaseline = \"middle\";\n\t\tcontextBump.shadowColor = \"#000000\";\n\t\tcontextBump.shadowOffsetX = 1;\n\t\tcontextBump.shadowOffsetY = 1;\n\t\tcontextBump.shadowBlur = 3;\n\n\t\tcontextEmissive.textAlign = \"center\";\n\t\tcontextEmissive.textBaseline = \"middle\";\n\t\t\n\t\tif (diceobj.shape != 'd4') {\n\t\t\tif(materialData.isGhost && labels[index] != \"\")\n\t\t\t\ttext = \"?\";\n\t\t\t//custom texture face\n\t\t\tif(text instanceof HTMLImageElement){\n\t\t\t\tisTexture = true;\n\t\t\t\tcontext.drawImage(text, 0,0,text.width,text.height,x,y,ts,ts);\n\t\t\t\tif(bump)\n\t\t\t\t\tcontextBump.drawImage(bump, 0,0,text.width,text.height,x,y,ts,ts);\n\t\t\t\tif(emissive)\n\t\t\t\t\tcontextEmissive.drawImage(emissive, 0,0,text.width,text.height,x,y,ts,ts);\n\t\t\t}\n\t\t\telse{\n\t\t\t\tlet fontsize = ts / (1 + 2 * margin);\n\t\t\t\tlet textstarty = (ts / 2);\n\t\t\t\tlet textstartx = (ts / 2);\n\n\t\t\t\tif(font.scale)\n\t\t\t\t\tfontsize *= font.scale;\n\n\t\t\t\t//Needed for every fonts\n\t\t\t\tswitch(diceobj.shape){\n\t\t\t\t\tcase 'd10':\n\t\t\t\t\t\ttextstarty = textstartx*1.3;\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'd14':\n\t\t\t\t\t\ttextstarty = textstartx*1.4;\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'd16':\n\t\t\t\t\t\ttextstarty = textstartx*1.4;\n\t\t\t\t\t\tbreak\n\t\t\t\t\tcase 'd8':\n\t\t\t\t\t\ttextstarty = textstarty*1.1;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'd12':\n\t\t\t\t\t\ttextstarty = textstarty*1.08;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'd20':\n\t\t\t\t\t\ttextstarty = textstartx*1.2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'd6':\n\t\t\t\t\t\ttextstarty = textstarty*1.1;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tcontext.font = fontsize+ 'pt '+font.type;\n\t\t\t\tcontextBump.font = fontsize+ 'pt '+font.type;\n\t\t\t\tcontextEmissive.font = fontsize+ 'pt '+font.type;\n\n\t\t\t\tvar lineHeight = fontsize;\n\t\t\t\t\n\t\t\t\tlet textlines = text.split(\"\\n\");\n\n\t\t\t\tif (textlines.length > 1) {\n\t\t\t\t\tfontsize = fontsize / textlines.length;\n\t\t\t\t\tcontext.font = fontsize+ 'pt '+font.type;\n\t\t\t\t\tcontextBump.font = fontsize+ 'pt '+font.type;\n\t\t\t\t\tcontextEmissive.font = fontsize+ 'pt '+font.type;\n\n\t\t\t\t\t//to find the correct text height for every possible fonts, we have no choice but to use the great (and complex) pixi method\n\t\t\t\t\t//First we create a PIXI.TextStyle object, to pass later to the measure method\n\t\t\t\t\tlet pixiStyle = new PIXI.TextStyle({\n\t\t\t\t\t\tfontFamily: font.type,\n\t\t\t\t\t\tfontSize: fontsize,\n\t\t\t\t\t\tstroke: \"#0000FF\",\n\t\t\t\t\t\tstrokeThickness: (outlinecolor != 'none' && outlinecolor != backcolor) ? 1:0\n\t\t\t\t\t});\n\t\t\t\t\t//Then we call the PIXI measureText method\n\t\t\t\t\tlet textMetrics = PIXI.TextMetrics.measureText(textlines.join(\"\"),pixiStyle);\n\n\t\t\t\t\tlineHeight = textMetrics.lineHeight;\n\t\t\t\t\tif(textlines[0]!=\"\"){\n\t\t\t\t\t\ttextstarty -= (lineHeight * textlines.length) / 2;\n\t\t\t\t\t\t//On a D12, we add a little padding because it looks better to human eyes even tho it's not really the center anymore\n\t\t\t\t\t\tif(diceobj.shape == \"d12\")\n\t\t\t\t\t\t\ttextstarty = textstarty *1.08;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\ttextlines.shift();\n\t\t\t\t}\n\n\t\t\t\tfor(let i = 0, l = textlines.length; i < l; i++){\n\t\t\t\t\tlet textline = textlines[i].trim();\n\n\t\t\t\t\t// attempt to outline the text with a meaningful color\n\t\t\t\t\tif (outlinecolor != 'none' && outlinecolor != backcolor) {\n\t\t\t\t\t\tcontext.strokeStyle = outlinecolor;\n\t\t\t\t\t\tcontext.lineWidth = 5;\n\t\t\t\t\t\tcontext.strokeText(textlines[i], textstartx+x, textstarty+y);\n\n\t\t\t\t\t\tcontextBump.strokeStyle = \"#555555\";\n\t\t\t\t\t\tcontextBump.lineWidth = 5;\n\t\t\t\t\t\tcontextBump.strokeText(textlines[i], textstartx+x, textstarty+y);\n\n\t\t\t\t\t\tcontextEmissive.strokeStyle = \"#999999\";\n\t\t\t\t\t\tcontextEmissive.lineWidth = 5;\n\t\t\t\t\t\tcontextEmissive.strokeText(textlines[i], textstartx+x, textstarty+y);\n\n\t\t\t\t\t\tif (textline == '6' || textline == '9') {\n\t\t\t\t\t\t\tcontext.strokeText(' .', textstartx+x, textstarty+y);\n\t\t\t\t\t\t\tcontextBump.strokeText(' .', textstartx+x, textstarty+y);\n\t\t\t\t\t\t\tcontextEmissive.strokeText(' .', textstartx+x, textstarty+y);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tcontext.fillStyle = forecolor;\n\t\t\t\t\tcontext.fillText(textlines[i], textstartx+x, textstarty+y);\n\n\t\t\t\t\tcontextBump.fillStyle = \"#555555\";\n\t\t\t\t\tcontextBump.fillText(textlines[i], textstartx+x, textstarty+y);\n\n\t\t\t\t\tcontextEmissive.fillStyle = \"#999999\";\n\t\t\t\t\tcontextEmissive.fillText(textlines[i], textstartx+x, textstarty+y);\n\n\t\t\t\t\tif (textline == '6' || textline == '9') {\n\t\t\t\t\t\tcontext.fillText(' .', textstartx+x, textstarty+y);\n\t\t\t\t\t\tcontextBump.fillText(' .', textstartx+x, textstarty+y);\n\t\t\t\t\t\tcontextEmissive.fillText(' .', textstartx+x, textstarty+y);\n\t\t\t\t\t}\n\t\t\t\t\ttextstarty += (lineHeight * 1.5);\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tvar hw = (ts / 2);\n\t\t\tvar hh = (ts / 2);\n\t\t\tlet fontsize = (ts / 128 * 24);\n\t\t\tif(font.scale)\n\t\t\t\tfontsize *= font.scale;\n\t\t\tcontext.font = fontsize+'pt '+font.type;\n\t\t\tcontextBump.font = fontsize+'pt '+font.type;\n\t\t\tcontextEmissive.font = fontsize+'pt '+font.type;\n\n\t\t\t//draw the numbers\n\t\t\tlet wShift = 1;\n\t\t\tlet hShift = 1;\n\t\t\tfor (let i=0;i<text.length;i++) {\n\t\t\t\tif(materialData.isGhost)\n\t\t\t\t\ttext[i] = \"?\";\n\t\t\t\tswitch(i){\n\t\t\t\t\tcase 0:\n\t\t\t\t\t\thShift = 1.13;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\thShift=0.87;\n\t\t\t\t\t\twShift=1.13;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\twShift = 0.87;\n\t\t\t\t}\n\t\t\t\tlet destX = hw*wShift+x;\n\t\t\t\tlet destY = (hh - ts * 0.3)*hShift+y;\n\t\t\t\t//custom texture face\n\t\t\t\tif(text[i] instanceof HTMLImageElement){\n\t\t\t\t\tisTexture = true;\n\t\t\t\t\tlet textureSize = 60 / (text[i].width / ts);\n\t\t\t\t\tcontext.drawImage(text[i],0,0,text[i].width,text[i].height,destX-(textureSize/2),destY-(textureSize/2),textureSize,textureSize);\n\t\t\t\t\t//There's an issue with bump texture because they are smaller than the dice face so it causes visual glitches\n\t\t\t\t\t/*if(bump)\n\t\t\t\t\t\tcontextBump.drawImage(text[i],0,0,text[i].width,text[i].height,destX-(textureSize/2),destY-(textureSize/2),textureSize,textureSize);*/\n\t\t\t\t\tif(emissive)\n\t\t\t\t\t\tcontextEmissive.drawImage(text[i],0,0,text[i].width,text[i].height,destX-(textureSize/2),destY-(textureSize/2),textureSize,textureSize);\n\t\t\t\t}\n\t\t\t\telse{\n\t\t\t\t\t// attempt to outline the text with a meaningful color\n\t\t\t\t\tif (outlinecolor != 'none' && outlinecolor != backcolor) {\n\t\t\t\t\t\tcontext.strokeStyle = outlinecolor;\n\t\t\t\t\t\t\n\t\t\t\t\t\tcontext.lineWidth = 5;\n\t\t\t\t\t\tcontext.strokeText(text[i], destX, destY);\n\n\t\t\t\t\t\tcontextBump.strokeStyle = \"#555555\";\n\t\t\t\t\t\tcontextBump.lineWidth = 5;\n\t\t\t\t\t\tcontextBump.strokeText(text[i], destX, destY);\n\n\t\t\t\t\t\tcontextEmissive.strokeStyle = \"#999999\";\n\t\t\t\t\t\tcontextEmissive.lineWidth = 5;\n\t\t\t\t\t\tcontextEmissive.strokeText(text[i], destX, destY);\n\t\t\t\t\t}\n\n\t\t\t\t\t//draw label in top middle section\n\t\t\t\t\tcontext.fillStyle = forecolor;\n\t\t\t\t\tcontext.fillText(text[i], destX, destY);\n\t\t\t\t\tcontextBump.fillStyle = \"#555555\";\n\t\t\t\t\tcontextBump.fillText(text[i], destX, destY);\n\t\t\t\t\tcontextEmissive.fillStyle = \"#999999\";\n\t\t\t\t\tcontextEmissive.fillText(text[i], destX, destY);\n\t\t\t\t\t//var img = canvas.toDataURL(\"image/png\");\n\t\t\t\t\t//document.write('<img src=\"'+img+'\"/>');\n\t\t\t\t}\n\n\t\t\t\t//rotate 1/3 for next label\n\t\t\t\tcontext.translate(hw+x, hh+y);\n\t\t\t\tcontext.rotate(Math.PI * 2 / 3);\n\t\t\t\tcontext.translate(-hw-x, -hh-y);\n\n\t\t\t\tcontextBump.translate(hw+x, hh+y);\n\t\t\t\tcontextBump.rotate(Math.PI * 2 / 3);\n\t\t\t\tcontextBump.translate(-hw-x, -hh-y);\n\n\t\t\t\tcontextEmissive.translate(hw+x, hh+y);\n\t\t\t\tcontextEmissive.rotate(Math.PI * 2 / 3);\n\t\t\t\tcontextEmissive.translate(-hw-x, -hh-y);\n\t\t\t}\n\t\t}\n\t}\n\n\tgetAppearanceForDice(appearances, dicetype, dicenotation = null){\n\t\t/*\n\t\t\tWe use either (by order of priority): \n\t\t\t1) A notation appearance\n\t\t\t2) A flavor/notation colorset\n\t\t\t3) The colorset of the diceobj\n\t\t\t4) The colorset configured by the player for this dice type\n\t\t\t5) A preferred system set by a module/system (done in main.js)\n\t\t\t6) The global colorset of the player\n\t\t*/\n\t\t\n\t\tlet settings;\n\t\tif(appearances[dicetype])\n\t\t\tsettings = appearances[dicetype];\n\t\telse\n\t\t\tsettings = appearances.global;\n\n\t\t//To keep compatibility with both older integrations and user settings, we use the DiceColor naming convention from there\n\t\tlet appearance = {\n\t\t\tcolorset: settings.colorset ? settings.colorset : appearances.global.colorset ? appearances.global.colorset : \"custom\",\n\t\t\tforeground: settings.labelColor ? settings.labelColor:appearances.global.labelColor ? appearances.global.labelColor : \"#FFFFFF\",\n\t\t\tbackground: settings.diceColor ? settings.diceColor:appearances.global.diceColor ? appearances.global.diceColor : \"#000000\",\n\t\t\t//outline: settings.outlineColor ? settings.outlineColor: appearances.global.outlineColor ? appearances.global.outlineColor : \"\",\n\t\t\t//edge: settings.edgeColor ? settings.edgeColor:appearances.global.edgeColor ? appearances.global.edgeColor:\"\",\n\t\t\ttexture: settings.texture ? settings.texture:appearances.global.texture ? appearances.global.texture : \"none\",\n\t\t\tmaterial: settings.material ? settings.material:appearances.global.material ? appearances.global.material : \"auto\",\n\t\t\tfont: settings.font ? settings.font:appearances.global.font ? appearances.global.font : \"Arial\",\n\t\t\tsystem: settings.system ? settings.system:appearances.global.system ? appearances.global.system : \"standard\"\n\t\t};\n\n\t\tif(appearance.colorset == \"custom\"){\n\t\t\tappearance.outline = settings.outlineColor ? settings.outlineColor:\"\";\n\t\t\tappearance.edge = settings.edgeColor ? settings.edgeColor:\"\";\n\t\t} else {\n\t\t\tappearance.outline = settings.outlineColor ? settings.outlineColor: appearances.global.outlineColor ? appearances.global.outlineColor : \"\";\n\t\t\tappearance.edge = settings.edgeColor ? settings.edgeColor:appearances.global.edgeColor ? appearances.global.edgeColor:\"\";\n\t\t}\n\n\t\tif(appearance.colorset && appearance.colorset != \"custom\"){\n\t\t\tlet colorsetData = DiceColors.getColorSet(appearance.colorset);\n\t\t\tappearance.foreground = colorsetData.foreground;\n\t\t\tappearance.background = colorsetData.background;\n\t\t\tappearance.outline = colorsetData.outline;\n\t\t\tappearance.edge = colorsetData.edge ? colorsetData.edge : \"\";\n\t\t}\n\t\tlet diceobj = this.getPresetBySystem(dicetype,appearance.system);\n\t\tif(diceobj.colorset){\n\t\t\tlet colorsetData = {...DiceColors.getColorSet(diceobj.colorset)};\n\t\t\tObject.entries(colorsetData).forEach((opt) => {\n\t\t\t\tif(opt[1] == \"custom\")\n\t\t\t\t\tdelete colorsetData[opt[0]];\n\t\t\t});\n\t\t\tmergeObject(appearance, colorsetData,{performDeletions:true});\n\t\t\tappearance.colorset = diceobj.colorset;\n\t\t}\n\t\t\n\t\tif(dicenotation){\n\t\t\tlet colorset = null;\n\t\t\tif (dicenotation.options.colorset)\n\t\t\t\tcolorset = dicenotation.options.colorset;\n\t\t\telse if (dicenotation.options.flavor && COLORSETS[dicenotation.options.flavor]) {\n\t\t\t\tcolorset = dicenotation.options.flavor;\n\t\t\t}\n\t\t\tif(colorset){\n\t\t\t\tlet colorsetData = DiceColors.getColorSet(colorset);\n\t\t\t\tcolorsetData.edge = colorsetData.edge ? colorsetData.edge : \"\";\n\t\t\t\tappearance = colorsetData;\n\t\t\t}\n\t\t\tif(dicenotation.options.appearance){\n\t\t\t\tmergeObject(appearance, dicenotation.options.appearance,{performDeletions:true});\n\t\t\t}\n\t\t\tif(dicenotation.options.ghost){\n\t\t\t\tappearance.isGhost = true;\n\t\t\t}\n\t\t}\n\t\treturn appearance;\n\t}\n\n\tgenerateMaterialData(diceobj, appearance) {\n\t\tlet materialData = {};\n\t\tlet colorindex;\n\n\t\tif(appearance.texture && !appearance.texture.id)\n\t\t\tappearance.texture = DiceColors.getTexture(appearance.texture);\n\n\t\tlet colorsetData = DiceColors.getColorSet(appearance.colorset);\n\n\t\t// ignore custom colorset with unset properties\n\t\tif(colorsetData.foreground == \"custom\")\n\t\t\tcolorsetData.foreground = appearance.foreground;\n\t\tif(colorsetData.background == \"custom\")\n\t\t\tcolorsetData.background = appearance.background;\n\t\tif(colorsetData.texture == \"custom\")\n\t\t\tcolorsetData.texture = appearance.texture;\n\t\tif(colorsetData.material == \"custom\")\n\t\t\tcolorsetData.material = appearance.material;\n\t\tif(colorsetData.font == \"custom\")\n\t\t\tcolorsetData.font = appearance.font;\n\n\n\t\t// set base color first\n\t\tif (Array.isArray(appearance.background)) {\n\n\t\t\tcolorindex = Math.floor(Math.random() * appearance.background.length);\n\n\t\t\t// if color list and label list are same length, treat them as a parallel list\n\t\t\tif (Array.isArray(appearance.foreground) && appearance.foreground.length == appearance.background.length) {\n\t\t\t\tmaterialData.foreground = appearance.foreground[colorindex];\n\n\t\t\t\t// if label list and outline list are same length, treat them as a parallel list\n\t\t\t\tif (Array.isArray(appearance.outline) && appearance.outline.length == appearance.foreground.length) {\n\t\t\t\t\tmaterialData.outline = appearance.outline[colorindex];\n\t\t\t\t}\n\t\t\t}\n\t\t\t// if texture list is same length do the same\n\t\t\tif (Array.isArray(appearance.texture) && appearance.texture.length == appearance.background.length) {\n\t\t\t\tmaterialData.texture = appearance.texture[colorindex];\n\t\t\t}\n\n\t\t\t//if edge list and color list are same length, treat them as a parallel list\n\t\t\tif (Array.isArray(appearance.edge) && appearance.edge.length == appearance.background.length) {\n\t\t\t\tmaterialData.edge = appearance.edge[colorindex];\n\t\t\t}\n\n\t\t\tmaterialData.background = appearance.background[colorindex];\n\t\t} else {\n\t\t\tmaterialData.background = appearance.background;\n\t\t}\n\n\t\tif(!materialData.edge){\n\t\t\tif (Array.isArray(appearance.edge)) {\n\t\t\t\tcolorindex = Math.floor(Math.random() * appearance.edge.length);\n\t\t\t\tmaterialData.edge = appearance.edge[colorindex];\n\t\t\t}\n\t\t\telse\n\t\t\t\tmaterialData.edge = appearance.edge;\n\t\t}\n\n\t\t// if selected label color is still not set, pick one\n\t\tif(!materialData.foreground){\n\t\t\tif(Array.isArray(appearance.foreground)){\n\t\t\t\tcolorindex = appearance.foreground[Math.floor(Math.random() * appearance.foreground.length)];\n\n\t\t\t\t// if label list and outline list are same length, treat them as a parallel list\n\t\t\t\tif (Array.isArray(appearance.outline) && appearance.outline.length == appearance.foreground.length) {\n\t\t\t\t\tmaterialData.outline = appearance.outline[colorindex];\n\t\t\t\t}\n\n\t\t\t\tmaterialData.foreground = appearance.foreground[colorindex];\n\t\t\t}\n\t\t\telse\n\t\t\t\tmaterialData.foreground = appearance.foreground;\n\t\t}\n\n\t\t// if selected label outline is still not set, pick one\n\t\tif (!materialData.outline){\n\t\t\tif(Array.isArray(appearance.outline)) {\n\t\t\t\tcolorindex = appearance.outline[Math.floor(Math.random() * appearance.outline.length)];\n\n\t\t\t\tmaterialData.outline = appearance.outline[colorindex];\n\t\t\t} else {\n\t\t\t\tmaterialData.outline = appearance.outline;\n\t\t\t}\n\t\t}\n\n\t\t// same for textures list\n\t\tif(!materialData.texture){\n\t\t\tif (Array.isArray(appearance.texture)) {\n\t\t\t\tmaterialData.texture = appearance.texture[Math.floor(Math.random() * appearance.texture.length)];\n\t\t\t} else if(appearance.texture.name == \"none\"){\n\t\t\t\t//set to none/theme\n\t\t\t\tif (Array.isArray(colorsetData.texture)){\n\t\t\t\t\tmaterialData.texture = colorsetData.texture[Math.floor(Math.random() * colorsetData.texture.length)];\n\t\t\t\t} else {\n\t\t\t\t\tmaterialData.texture = colorsetData.texture;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tmaterialData.texture = appearance.texture;\n\t\t\t}\n\t\t}\n\n\t\t//Same for material\n\t\tlet baseTexture = Array.isArray(materialData.texture) ? materialData.texture[0]:materialData.texture;\n\n\t\tif(appearance.material == \"auto\" || appearance.material == \"\"){\n\t\t\tif(colorsetData.material)\n\t\t\t\tmaterialData.material = colorsetData.material;\n\t\t\telse\n\t\t\t\tmaterialData.material = baseTexture.material;\n\t\t} else {\n\t\t\tmaterialData.material = appearance.material;\n\t\t}\n\n\t\t//for font, we priorize the dicepreset font, then custom, then coloret\n\t\tif(appearance.font == \"auto\"){\n\t\t\tif(diceobj.font){\n\t\t\t\tmaterialData.font = diceobj.font;\n\t\t\t} else {\n\t\t\t\tmaterialData.font = colorsetData.font;\n\t\t\t}\n\t\t} else {\n\t\t\tmaterialData.font = appearance.font;\n\t\t}\n\n\t\tif(appearance.fontScale)\n\t\t\tmaterialData.fontScale = appearance.fontScale;\n\t\telse if(diceobj.fontScale){\n\t\t\tmaterialData.fontScale = diceobj.fontScale;\n\t\t} else {\n\t\t\tmaterialData.fontScale = colorsetData.fontScale;\n\t\t}\n\n\t\tmaterialData.isGhost = appearance.isGhost?appearance.isGhost:false;\n\n\t\tmaterialData.cacheString = appearance.system+materialData.background+materialData.foreground+materialData.outline+materialData.texture.name+materialData.edge+materialData.material+materialData.font+materialData.isGhost;\n\t\treturn materialData;\n\t}\n\n\tcalc_texture_size(approx, ceil = false) {\n\t\tlet size = 0;\n\t\tif(!ceil)\n\t\t\tsize = Math.pow(2, Math.floor(Math.log(approx) / Math.log(2)));\n\t\telse\n\t\t\tsize = Math.pow(2, Math.ceil(Math.log(approx) / Math.log(2)));\n\t\treturn size;\n\t}\n\n\tcreateGeometry(type, typeScale, scopedScale) {\n\t\tlet radius = typeScale * scopedScale;\n\t\tlet geom = null;\n\t\tswitch (type) {\n\t\t\tcase 'd2':\n\t\t\t\tgeom = this.create_d2_geometry(radius, scopedScale);\n\t\t\t\tbreak;\n\t\t\tcase 'd4':\n\t\t\t\tgeom = this.create_d4_geometry(radius, scopedScale);\n\t\t\t\tbreak;\n\t\t\tcase 'd6':\n\t\t\t\tgeom = this.create_d6_geometry(radius, scopedScale);\n\t\t\t\tbreak;\n\t\t\tcase 'd8':\n\t\t\t\tgeom = this.create_d8_geometry(radius, scopedScale);\n\t\t\t\tbreak;\n\t\t\tcase 'd10':\n\t\t\t\tgeom = this.create_d10_geometry(radius, scopedScale);\n\t\t\t\tbreak;\n\t\t\tcase 'd12':\n\t\t\t\tgeom = this.create_d12_geometry(radius, scopedScale);\n\t\t\t\tbreak;\n\t\t\tcase 'd14':\n\t\t\t\tgeom = this.create_d14_geometry(radius, scopedScale);\n\t\t\t\tbreak;\n\t\t\tcase 'd16':\n\t\t\t\tgeom = this.create_d16_geometry(radius, scopedScale);\n\t\t\t\tbreak;\n\t\t\tcase 'd20':\n\t\t\t\tgeom = this.create_d20_geometry(radius, scopedScale);\n\t\t\t\tbreak;\n\t\t\tcase 'd24':\n\t\t\t\tgeom = this.create_d24_geometry(radius, scopedScale);\n\t\t\t\tbreak;\n\t\t\tcase 'd30':\n\t\t\t\tgeom = this.create_d30_geometry(radius, scopedScale);\n\t\t\t\tbreak;\n\t\t}\n\t\treturn geom;\n\t}\n\n\tload_geometry(type, scopedScale){\n\t\tvar loader = new THREE.BufferGeometryLoader();\n\t\tlet bufferGeometry = loader.parse(DICE_MODELS[type]);\n\t\tbufferGeometry.scale(scopedScale/100,scopedScale/100,scopedScale/100);\n\t\treturn bufferGeometry;\n\t}\n\n\tcreate_d2_geometry(radius, scopedScale){\n\t\tlet geom = this.load_geometry(\"d2\",scopedScale);\n\t\tgeom.cannon_shape = new CANNON.Cylinder(1*radius,1*radius,0.1*radius,8);\n\t\treturn geom;\n\t}\n\n\tcreate_d4_geometry(radius, scopedScale) {\n\t\tlet geom = this.load_geometry(\"d4\",scopedScale);\n\t\tvar vertices = [[1, 1, 1], [-1, -1, 1], [-1, 1, -1], [1, -1, -1]];\n\t\tvar faces = [[1, 0, 2, 1], [0, 1, 3, 2], [0, 3, 2, 3], [1, 2, 3, 4]];\n\t\tgeom.cannon_shape = this.create_geom(vertices, faces, radius);\n\t\treturn geom;\n\t}\n\n\tcreate_d6_geometry(radius, scopedScale) {\n\t\tlet geom = this.load_geometry(\"d6\",scopedScale);\n\t\tvar vertices = [[-1, -1, -1], [1, -1, -1], [1, 1, -1], [-1, 1, -1],\n\t\t\t\t[-1, -1, 1], [1, -1, 1], [1, 1, 1], [-1, 1, 1]];\n\t\tvar faces = [[0, 3, 2, 1, 1], [1, 2, 6, 5, 2], [0, 1, 5, 4, 3],\n\t\t\t\t[3, 7, 6, 2, 4], [0, 4, 7, 3, 5], [4, 5, 6, 7, 6]];\n\t\tgeom.cannon_shape = this.create_geom(vertices, faces, radius);\n\t\treturn geom;\n\t}\n\n\tcreate_d8_geometry(radius, scopedScale) {\n\t\tlet geometry = this.load_geometry(\"d8\",scopedScale);\n\t\t\n\t\tvar vertices = [[1, 0, 0], [-1, 0, 0], [0, 1, 0], [0, -1, 0], [0, 0, 1], [0, 0, -1]];\n\t\tvar faces = [[0, 2, 4, 1], [0, 4, 3, 2], [0, 3, 5, 3], [0, 5, 2, 4], [1, 3, 4, 5],\n\t\t\t\t[1, 4, 2, 6], [1, 2, 5, 7], [1, 5, 3, 8]];\n\t\tgeometry.cannon_shape = this.create_geom(vertices, faces, radius);\n\t\treturn geometry;\n\t}\n\n\tcreate_d10_geometry(radius, scopedScale) {\n\t\tlet geom = this.load_geometry(\"d10\",scopedScale);\n\t\t//geom.scale(1.38,1.38,1.38);\n\t\t\n\t\tvar a = Math.PI * 2 / 10, h = 0.105, v = -1;\n\t\tvar vertices = [];\n\t\tfor (var i = 0, b = 0; i < 10; ++i, b += a) {\n\t\t\tvertices.push([Math.cos(b), Math.sin(b), h * (i % 2 ? 1 : -1)]);\n\t\t}\n\t\tvertices.push([0, 0, -1]);\n\t\tvertices.push([0, 0, 1]);\n\n\t\tvar faces = [\n [5, 6, 7, 11, 0],\n [4, 3, 2, 10, 1],\n [1, 2, 3, 11, 2],\n [0, 9, 8, 10, 3],\n [7, 8, 9, 11, 4],\n [8, 7, 6, 10, 5],\n [9, 0, 1, 11, 6],\n [2, 1, 0, 10, 7],\n [3, 4, 5, 11, 8],\n [6, 5, 4, 10, 9]\n ];\n\t\tgeom.cannon_shape = this.create_geom(vertices, faces, radius);\n\t\t//geom = this.scaleGeometryToShape(geom);\n\t\treturn geom;\n\t}\n\n\tcreate_d12_geometry(radius, scopedScale) {\n\t\tlet geom = this.load_geometry(\"d12\",scopedScale);\n\t\tvar p = (1 + Math.sqrt(5)) / 2, q = 1 / p;\n\t\tvar vertices = [[0, q, p], [0, q, -p], [0, -q, p], [0, -q, -p], [p, 0, q],\n\t\t\t\t[p, 0, -q], [-p, 0, q], [-p, 0, -q], [q, p, 0], [q, -p, 0], [-q, p, 0],\n\t\t\t\t[-q, -p, 0], [1, 1, 1], [1, 1, -1], [1, -1, 1], [1, -1, -1], [-1, 1, 1],\n\t\t\t\t[-1, 1, -1], [-1, -1, 1], [-1, -1, -1]];\n\t\tvar faces = [[2, 14, 4, 12, 0, 1], [15, 9, 11, 19, 3, 2], [16, 10, 17, 7, 6, 3], [6, 7, 19, 11, 18, 4],\n\t\t\t\t[6, 18, 2, 0, 16, 5], [18, 11, 9, 14, 2, 6], [1, 17, 10, 8, 13, 7], [1, 13, 5, 15, 3, 8],\n\t\t\t\t[13, 8, 12, 4, 5, 9], [5, 4, 14, 9, 15, 10], [0, 12, 8, 10, 16, 11], [3, 19, 7, 17, 1, 12]];\n\n\t\tgeom.cannon_shape = this.create_geom(vertices, faces, radius);\n\t\treturn geom;\n\t}\n\n\tcreate_d14_geometry(radius, scopedScale) {\n\t\tlet geom = this.load_geometry(\"d14\",scopedScale);\n\n\t\tvar vertices = [[-0.005093127489089966, 1.177548885345459, 0.002782404189929366], [-0.9908595681190491, 0.061759304255247116, 0.22585006058216095], [-0.9924551844596863, -0.06095181778073311, -0.23028047382831573], [-0.7984917163848877, 0.061637163162231445, -0.6402497291564941], [-0.4453684985637665, -0.06121010705828667, -0.9239609241485596], [-0.00504341721534729, 0.06129471957683563, -1.0241185426712036], [0.437289297580719, -0.06156954541802406, -0.9219886660575867], [0.7920035719871521, 0.06098949536681175, -0.6366959810256958], [0.9908595681190491, -0.06175928935408592, -0.22585000097751617], [0.9924551844596863, 0.0609518401324749, 0.23028059303760529], [0.7984917163848877, -0.061637137085199356, 0.6402497291564941], [0.4453684985637665, 0.061210136860609055, 0.9239609241485596], [0.00504341721534729, -0.06129469349980354, 1.0241185426712036], [-0.4372892379760742, 0.061569564044475555, 0.9219887852668762], [-0.7920035719871521, -0.060989461839199066, 0.6366960406303406], [0.005093127489089966, -1.177548885345459, -0.002782404189929366]];\n\t\tvar faces = [[0, 3, 2, 1], [1, 14, 13, 0], [12, 11, 0, 13], [10, 9, 0, 11], [8, 7, 0, 9], [6, 5, 0, 7], [4, 3, 0, 5], [10, 11, 12, 15], [14, 15, 12, 13], [2, 15, 14, 1], [2, 3, 4, 15], [4, 5, 6, 15], [6, 7, 8, 15], [8, 9, 10, 15]];\n\t\tgeom.cannon_shape = this.create_geom_dcc(vertices, faces, radius * 0.85);\n\t\treturn geom;\n\t}\n\n\tcreate_d16_geometry(radius, scopedScale) {\n\t\tlet geom = this.load_geometry(\"d16\",scopedScale);\n\n\t\tvar vertices = [[-1.0301814079284668, 0.002833150327205658, 1.0244150161743164], [-0.0018179342150688171, -0.006610371172428131, -1.4427297115325928], [1.4587815999984741, 0.0028328225016593933, -0.006545569747686386], [1.031739592552185, 0.0028328821063041687, -1.0375059843063354], [-1.4572231769561768, 0.0028332099318504333, -0.006545361131429672], [-1.0301814079284668, 0.002833150327205658, -1.0375059843063354], [1.031739592552185, 0.0028328821063041687, 1.0244150161743164], [-0.0018179342150688171, -0.006610371172428131, 1.4732751846313477], [0.0007793977856636047, 1.4608354568481445, -0.006545450538396835], [-0.0018181726336479187, -1.4646127223968506, 0.015272742137312889]];\n\t\tvar faces = [[5, 8, 1], [5, 4, 8], [4, 0, 8], [0, 7, 8], [8, 7, 6], [8, 6, 2], [2, 3, 8], [3, 1, 8], [3, 9, 1], [2, 9, 3], [6, 9, 2], [6, 7, 9], [0, 9, 7], [4, 9, 0], [5, 9, 4], [5, 1, 9]];\n\t\tgeom.cannon_shape = this.create_geom_dcc(vertices, faces, radius * 0.83);\n\t\treturn geom;\n\t}\n\n\tcreate_d20_geometry(radius, scopedScale) {\n\t\tlet geom = this.load_geometry(\"d20\",scopedScale);\n\n\t\tvar t = (1 + Math.sqrt(5)) / 2;\n\t\tvar vertices = [[-1, t, 0], [1, t, 0 ], [-1, -t, 0], [1, -t, 0],\n\t\t\t\t[0, -1, t], [0, 1, t], [0, -1, -t], [0, 1, -t],\n\t\t\t\t[t, 0, -1], [t, 0, 1], [-t, 0, -1], [-t, 0, 1]];\n\t\tvar faces = [[0, 11, 5, 1], [0, 5, 1, 2], [0, 1, 7, 3], [0, 7, 10, 4], [0, 10, 11, 5],\n\t\t\t\t[1, 5, 9, 6], [5, 11, 4, 7], [11, 10, 2, 8], [10, 7, 6, 9], [7, 1, 8, 10],\n\t\t\t\t[3, 9, 4, 11], [3, 4, 2, 12], [3, 2, 6, 13], [3, 6, 8, 14], [3, 8, 9, 15],\n\t\t\t\t[4, 9, 5, 16], [2, 4, 11, 17], [6, 2, 10, 18], [8, 6, 7, 19], [9, 8, 1, 20]];\n\t\tgeom.cannon_shape = this.create_geom(vertices, faces, radius);\n\t\treturn geom;\n\t}\n\n\tcreate_d24_geometry(radius, scopedScale) {\n\t\tlet geom = this.load_geometry(\"d24\",scopedScale);\n\n\t\tvar vertices = [[0.7070000171661377, -0.0, -0.7070000171661377], [0.7070000171661377, 0.7070000171661377, -0.0], [0.5468999743461609, 0.5468999743461609, -0.5468999743461609], [-0.0, -0.7070000171661377, -0.7070000171661377], [-0.0, 0.7070000171661377, -0.7070000171661377], [-0.5468999743461609, 0.5468999743461609, -0.5468999743461609], [-0.5468999743461609, -0.5468999743461609, -0.5468999743461609], [0.5468999743461609, 0.5468999743461609, 0.5468999743461609], [-0.0, -0.0, -1.0], [1.0, -0.0, -0.0], [0.5468999743461609, -0.5468999743461609, -0.5468999743461609], [-0.5468999743461609, 0.5468999743461609, 0.5468999743461609], [-0.0, -0.0, 1.0], [-0.0, 0.7070000171661377, 0.7070000171661377], [-0.0, 1.0, -0.0], [-0.7070000171661377, 0.7070000171661377, -0.0], [-0.7070000171661377, -0.0, -0.7070000171661377], [-0.7070000171661377, -0.7070000171661377, -0.0], [-0.0, -0.7070000171661377, 0.7070000171661377], [-0.5468999743461609, -0.5468999743461609, 0.5468999743461609], [-1.0, 0.0, -0.0], [0.5468999743461609, -0.5468999743461609, 0.5468999743461609], [0.7070000171661377, -0.0, 0.7070000171661377], [-0.0, -1.0, -0.0], [0.7070000171661377, -0.7070000171661377, -0.0], [-0.7070000171661377, -0.0, 0.7070000171661377]];\n\t\tvar faces = [[4, 5, 15, 14], [3, 10, 24, 23], [11, 15, 20, 25], [10, 3, 8, 0], [19, 18, 12, 25], [7, 22, 9, 1], [22, 21, 24, 9], [7, 13, 12, 22], [5, 4, 8, 16], [20, 17, 19, 25], [6, 3, 23, 17], [2, 4, 14, 1], [18, 19, 17, 23], [13, 7, 1, 14], [0, 2, 1, 9], [18, 21, 22, 12], [3, 6, 16, 8], [15, 5, 16, 20], [6, 17, 20, 16], [4, 2, 0, 8], [13, 11, 25, 12], [24, 10, 0, 9], [11, 13, 14, 15], [21, 18, 23, 24]];\n\t\tgeom.cannon_shape = this.create_geom(vertices, faces, radius);\n\t\treturn geom;\n\t}\n\n\tcreate_d30_geometry(radius, scopedScale) {\n\t\tlet geom = this.load_geometry(\"d30\",scopedScale);\n\n\t\tvar vertices = [[-1.6180000305175781, 0.0, 1.0], [-1.6180000305175781, 0.6179999709129333, -0.0], [-0.0, 1.6180000305175781, 0.6179999709129333], [0.6179999709129333, 0.0, 1.6180000305175781], [-1.0, -1.6180000305175781, -0.0], [1.6180000305175781, 0.0, 1.0], [-1.6180000305175781, -0.6179999709129333, -0.0], [-0.6179999709129333, 0.0, 1.6180000305175781], [-0.0, 1.0, -1.6180000305175781], [-1.0, 1.0, -1.0], [1.6180000305175781, 0.6179999709129333, -0.0], [1.0, -1.6180000305175781, -0.0], [-1.0, -1.0, -1.0], [1.6180000305175781, -0.6179999709129333, -0.0], [-1.0, 1.6180000305175781, -0.0], [1.0, 1.0, -1.0], [1.0, 1.6180000305175781, -0.0], [-0.0, 1.0, 1.6180000305175781], [1.0, -1.0, -1.0], [-0.6179999709129333, 0.0, -1.6180000305175781], [-0.0, -1.0, -1.6180000305175781], [-1.0, 1.0, 1.0], [0.6179999709129333, 0.0, -1.6180000305175781], [-0.0, -1.0, 1.6180000305175781], [-1.0, -1.0, 1.0], [-0.0, 1.6180000305175781, 0.6179999709129333], [-1.6180000305175781, 0.0, -1.0], [1.0, 1.0, 1.0], [-0.0, -1.6180000305175781, -0.6179999709129333], [1.6180000305175781, 0.0, -1.0], [1.0, -1.0, 1.0], [-0.0, 1.6180000305175781, -0.6179999709129333], [-0.0, -1.6180000305175781, 0.6179999709129333]];\n\t\tvar faces = [[25, 16, 31, 14], [7, 0, 24, 23], [19, 20, 12, 26], [13, 5, 30, 11], [1, 0, 21, 14], [10, 29, 15, 16], [6, 0, 1, 26], [22, 29, 18, 20], [9, 14, 31, 8], [28, 4, 12, 20], [30, 5, 3, 23], [12, 4, 6, 26], [31, 16, 15, 8], [21, 17, 25, 14], [22, 20, 19, 8], [3, 17, 7, 23], [18, 11, 28, 20], [32, 23, 24, 4], [27, 5, 10, 16], [9, 8, 19, 26], [25, 17, 27, 16], [30, 23, 32, 11], [7, 17, 21, 0], [10, 5, 13, 29], [24, 0, 6, 4], [13, 11, 18, 29], [9, 26, 1, 14], [3, 5, 27, 17], [15, 29, 22, 8], [28, 11, 32, 4]];\n\t\tgeom.cannon_shape = this.create_geom_dcc(vertices, faces, radius);\n\t\treturn geom;\n\t}\n\n\tcreate_shape(vertices, faces, radius) {\n\t\tvar cv = new Array(vertices.length), cf = new Array(faces.length);\n\t\tfor (var i = 0; i < vertices.length; ++i) {\n\t\t\tvar v = vertices[i];\n\t\t\tcv[i] = new CANNON.Vec3(v.x * radius, v.y * radius, v.z * radius);\n\t\t}\n\t\tfor (var i = 0; i < faces.length; ++i) {\n\t\t\tcf[i] = faces[i].slice(0, faces[i].length - 1);\n\t\t}\n\t\treturn new CANNON.ConvexPolyhedron(cv, cf);\n\t}\n\n\tcreate_geom(vertices, faces, radius) {\n\t\tvar vectors = new Array(vertices.length);\n\t\tfor (var i = 0; i < vertices.length; ++i) {\n\t\t\tvectors[i] = (new THREE.Vector3).fromArray(vertices[i]).normalize();\n\t\t}\n\t\tlet cannon_shape = this.create_shape(vectors, faces, radius);\n\t\treturn cannon_shape;\n\t}\n\n\tcreate_shape_dcc(vertices, faces, radius) {\n\t\tvar cv = new Array(vertices.length), cf = new Array(faces.length);\n\t\tfor (var i = 0; i < vertices.length; ++i) {\n\t\t\tvar v = vertices[i];\n\t\t\tcv[i] = new CANNON.Vec3(v.x * radius, v.y * radius, v.z * radius);\n\t\t}\n\t\tfor (var i = 0; i < faces.length; ++i) {\n\t\t\tcf[i] = faces[i];//.slice(0, faces[i].length - 1);\n\t\t}\n\t\treturn new CANNON.ConvexPolyhedron(cv, cf);\n\t}\n\n\tcreate_geom_dcc(vertices, faces, radius) {\n\t\tvar vectors = new Array(vertices.length);\n\t\tfor (var i = 0; i < vertices.length; ++i) {\n\t\t\tvectors[i] = (new THREE.Vector3).fromArray(vertices[i]).normalize();\n\t\t}\n\t\tlet cannon_shape = this.create_shape_dcc(vectors, faces, radius);\n\t\treturn cannon_shape;\n\t}\n}\n","export class DiceSFX {\n get nameLocalized(){\n return game.i18n.localize(this._name);\n }\n \n constructor(box, dicemesh, options){\n const defaultOptions = {\n isGlobal : false,\n muteSound : false\n };\n\n this.options = mergeObject(defaultOptions, options);\n\n this.dicemesh = dicemesh;\n this.box = box;\n this.destroyed = false;\n this.enableGC = false;\n this.renderReady = false;\n this.volume = (dicemesh.body_sim.secretRoll && box.muteSoundSecretRolls) || this.options.muteSound ? 0 : this.box.volume;\n }\n\n static async init(){\n return true;\n }\n\n async play(){\n return Promise.resolve();\n }\n\n static async loadAsset(loader,url) {\n return new Promise((resolve, reject) => {\n loader.load(url, data=> resolve(data), null, reject);\n });\n }\n\n static getDialogContent(sfxLine,id){\n let dialogContent = {};\n let disabled = game.user.isGM ? '':'disabled=\"disabled\"';\n dialogContent.content = `<div class=\"form-group\">\n <label>{{localize \"DICESONICE.sfxOptionsIsGlobal\"}}</label>\n <div class=\"form-fields\">\n <input type=\"checkbox\" name=\"sfxLine[{{id}}][options][isGlobal]\" data-dtype=\"Boolean\" ${disabled} {{checked isGlobal}} />\n </div>\n </div>\n <div class=\"form-group\">\n <label>{{localize \"DICESONICE.sfxOptionsMuteSound\"}}</label>\n <div class=\"form-fields\">\n <input type=\"checkbox\" name=\"sfxLine[{{id}}][options][muteSound]\" data-dtype=\"Boolean\" ${disabled} {{checked muteSound}} />\n </div>\n </div>`;\n\n dialogContent.data = {\n isGlobal : sfxLine.options ? sfxLine.options.isGlobal:false,\n muteSound : sfxLine.options ? sfxLine.options.muteSound:false,\n id:id\n };\n\n return dialogContent;\n }\n}","import { DiceSFX } from '../DiceSFX.js';\n\nexport class PlaySoundEpicFail extends DiceSFX {\n static id = \"PlaySoundEpicFail\";\n static specialEffectName = \"DICESONICE.PlaySoundEpicFail\";\n static path = 'modules/dice-so-nice/sfx/sounds/epic_fail.mp3';\n /**@override init */\n static async init(){\n game.audio.pending.push(function(){\n AudioHelper.preloadSound(PlaySoundEpicFail.path);\n }.bind(this));\n return true;\n }\n\n /**@override play */\n async play(){\n AudioHelper.play({\n src: PlaySoundEpicFail.path,\n volume: this.volume\n\t\t}, false);\n }\n}","import { DiceSFX } from '../DiceSFX.js';\n\nexport class PlaySoundEpicWin extends DiceSFX {\n static id = \"PlaySoundEpicWin\";\n static specialEffectName = \"DICESONICE.PlaySoundEpicWin\";\n static path = 'modules/dice-so-nice/sfx/sounds/epic_win.mp3';\n /**@override init */\n static async init(){\n game.audio.pending.push(function(){\n AudioHelper.preloadSound(PlaySoundEpicWin.path);\n }.bind(this));\n return true;\n }\n\n /**@override play */\n async play(){\n AudioHelper.play({\n src: PlaySoundEpicWin.path,\n volume: this.volume\n\t\t}, false);\n }\n}","/*!\n * three.proton v0.2.0\n * https://github.com/drawcall/three.proton\n *\n * Copyright 2011-2020, ajiemath\n * Licensed under the MIT license\n * http://www.opensource.org/licenses/mit-license\n *\n */\nimport * as THREE from 'three';\n //the max particle number in pool\n Proton.POOL_MAX = 500;\n Proton.TIME_STEP = 60;\n Proton.PI = 3.142;\n Proton.DR = Proton.PI / 180;\n\n //1:100\n Proton.MEASURE = 100;\n Proton.EULER = 'euler';\n Proton.RK2 = 'runge-kutta2';\n Proton.RK4 = 'runge-kutta4';\n Proton.VERLET = 'verlet';\n\n Proton.PARTICLE_CREATED = 'partilcleCreated';\n Proton.PARTICLE_UPDATE = 'partilcleUpdate';\n Proton.PARTICLE_SLEEP = 'particleSleep';\n Proton.PARTICLE_DEAD = 'partilcleDead';\n Proton.PROTON_UPDATE = 'protonUpdate';\n Proton.PROTON_UPDATE_AFTER = 'protonUpdateAfter';\n Proton.EMITTER_ADDED = 'emitterAdded';\n Proton.EMITTER_REMOVED = 'emitterRemoved';\n\n Proton.bindEmtterEvent = false;\n\n /**\n * @name Proton is a particle engine for three.js\n *\n * @class Proton\n * @param {number} preParticles input any number\n * @param {number} integrationType input any number\n * @example var proton = new Proton(200);\n */\n\n function Proton(preParticles, integrationType) {\n this.preParticles = Proton.Util.initValue(preParticles, Proton.POOL_MAX);\n this.integrationType = Proton.Util.initValue(integrationType, Proton.EULER);\n\n this.emitters = [];\n this.renderers = [];\n\n this.pool = new Proton.Pool();\n Proton.integrator = new Proton.Integration(this.integrationType);\n }\n\n\n Proton.prototype = {\n /**\n * @name add a type of Renderer\n *\n * @method addRender\n * @param {Renderer} render\n */\n addRender: function(renderer) {\n this.renderers.push(renderer);\n renderer.init(this);\n },\n\n /**\n * @name add a type of Renderer\n *\n * @method addRender\n * @param {Renderer} render\n */\n removeRender: function(renderer) {\n this.renderers.splice(this.renderers.indexOf(renderer), 1);\n renderer.remove(this);\n },\n\n /**\n * add the Emitter\n *\n * @method addEmitter\n * @param {Emitter} emitter\n */\n addEmitter: function(emitter) {\n this.emitters.push(emitter);\n emitter.parent = this;\n this.dispatchEvent(\"EMITTER_ADDED\", emitter);\n },\n\n removeEmitter: function(emitter) {\n if (emitter.parent != this) return;\n\n this.emitters.splice(this.emitters.indexOf(emitter), 1);\n emitter.parent = null;\n this.dispatchEvent(\"EMITTER_REMOVED\", emitter);\n },\n\n update: function($delta) {\n this.dispatchEvent(\"PROTON_UPDATE\", this);\n\n var delta = $delta || 0.0167;\n if (delta > 0) {\n var i = this.emitters.length;\n while (i--) this.emitters[i].update(delta);\n }\n\n this.dispatchEvent(\"PROTON_UPDATE_AFTER\", this);\n },\n\n /**\n * getCount\n * @name get the count of particle\n * @return (number) particles count\n */\n getCount: function() {\n var total = 0;\n var i, length = this.emitters.length;\n for (i = 0; i < length; i++) total += this.emitters[i].particles.length;\n return total;\n },\n\n /**\n * destroy\n * @name destroy the proton\n */\n destroy: function() {\n var i = this.emitters.length;\n\n while(i--){\n this.emitters[i].destroy();\n }\n\n this.emitters.length = 0;\n this.pool.destroy();\n }\n };\n\n \n\n\n/*\n * EventDispatcher\n * Visit http://createjs.com/ for documentation, updates and examples.\n *\n **/\n\n\n function EventDispatcher() {\n this.initialize();\n };\n\n EventDispatcher.initialize = function(target) {\n target.addEventListener = p.addEventListener;\n target.removeEventListener = p.removeEventListener;\n target.removeAllEventListeners = p.removeAllEventListeners;\n target.hasEventListener = p.hasEventListener;\n target.dispatchEvent = p.dispatchEvent;\n };\n\n var p = EventDispatcher.prototype;\n\n p._listeners = null;\n\n p.initialize = function() {};\n p.addEventListener = function(type, listener) {\n if (!this._listeners) {\n this._listeners = {};\n } else {\n this.removeEventListener(type, listener);\n }\n\n if (!this._listeners[type]) this._listeners[type] = []\n this._listeners[type].push(listener);\n\n return listener;\n };\n\n p.removeEventListener = function(type, listener) {\n if (!this._listeners) return;\n if (!this._listeners[type]) return;\n\n var arr = this._listeners[type];\n for (var i = 0, l = arr.length; i < l; i++) {\n if (arr[i] == listener) {\n if (l == 1) {\n delete(this._listeners[type]);\n }\n // allows for faster checks.\n else {\n arr.splice(i, 1);\n }\n break;\n }\n }\n };\n\n p.removeAllEventListeners = function(type) {\n if (!type)\n this._listeners = null;\n else if (this._listeners)\n delete(this._listeners[type]);\n };\n\n p.dispatchEvent = function(eventName, eventTarget) {\n var ret = false,\n listeners = this._listeners;\n\n if (eventName && listeners) {\n var arr = listeners[eventName];\n if (!arr) return ret;\n\n arr = arr.slice();\n // to avoid issues with items being removed or added during the dispatch\n\n var handler, i = arr.length;\n while (i--) {\n var handler = arr[i];\n ret = ret || handler(eventTarget);\n }\n \n }\n\n return !!ret;\n };\n\n p.hasEventListener = function(type) {\n var listeners = this._listeners;\n return !!(listeners && listeners[type]);\n };\n\n EventDispatcher.initialize(Proton.prototype);\n Proton.EventDispatcher = EventDispatcher;\n\n\n\n var Util = Util || {\n initValue: function(value, defaults) {\n var value = (value != null && value != undefined) ? value : defaults;\n return value;\n },\n\n isArray: function(value) {\n return Object.prototype.toString.call(value) === '[object Array]';\n },\n\n destroyArray: function(array) {\n array.length = 0;\n },\n\n destroyObject: function(obj) {\n for (var o in obj) delete obj[o];\n },\n\n isUndefined: function() {\n for (var id in arguments) {\n var arg = arguments[id];\n if (arg !== undefined)\n return false;\n }\n\n return true;\n },\n\n setVectorByObj: function(target, pOBJ) {\n if (pOBJ[\"x\"] !== undefined) target.p.x = pOBJ[\"x\"];\n if (pOBJ[\"y\"] !== undefined) target.p.y = pOBJ[\"y\"];\n if (pOBJ[\"z\"] !== undefined) target.p.z = pOBJ[\"z\"];\n\n if (pOBJ[\"vx\"] !== undefined) target.v.x = pOBJ[\"vx\"];\n if (pOBJ[\"vy\"] !== undefined) target.v.y = pOBJ[\"vy\"];\n if (pOBJ[\"vz\"] !== undefined) target.v.z = pOBJ[\"vz\"];\n\n if (pOBJ[\"ax\"] !== undefined) target.a.x = pOBJ[\"ax\"];\n if (pOBJ[\"ay\"] !== undefined) target.a.y = pOBJ[\"ay\"];\n if (pOBJ[\"az\"] !== undefined) target.a.z = pOBJ[\"az\"];\n\n if (pOBJ[\"p\"] !== undefined) target.p.copy(pOBJ[\"p\"]);\n if (pOBJ[\"v\"] !== undefined) target.v.copy(pOBJ[\"v\"]);\n if (pOBJ[\"a\"] !== undefined) target.a.copy(pOBJ[\"a\"]);\n\n if (pOBJ[\"position\"] !== undefined) target.p.copy(pOBJ[\"position\"]);\n if (pOBJ[\"velocity\"] !== undefined) target.v.copy(pOBJ[\"velocity\"]);\n if (pOBJ[\"accelerate\"] !== undefined) target.a.copy(pOBJ[\"accelerate\"]);\n },\n\n //set prototype\n setPrototypeByObj: function(target, proObj, filters) {\n for (var key in proObj) {\n if (target.hasOwnProperty(key)) {\n if (filters) {\n if (filters.indexOf(key) < 0) target[key] = Util._getValue(proObj[key]);\n } else {\n target[key] = Util._getValue(proObj[key]);\n }\n }\n }\n\n return target;\n },\n\n _getValue: function(pan) {\n if (pan instanceof Span)\n return pan.getValue();\n else\n return pan;\n },\n\n inherits: function(subClass, superClass) {\n subClass._super_ = superClass;\n if (Object['create']) {\n subClass.prototype = Object.create(superClass.prototype, {\n constructor: { value: subClass }\n });\n } else {\n var F = function() {};\n F.prototype = superClass.prototype;\n subClass.prototype = new F();\n subClass.prototype.constructor = subClass;\n }\n }\n };\n\n Proton.Util = Util;\n\n\n\n var ColorUtil = ColorUtil || {\n getRGB: function(color) {\n var rgb = {};\n if (typeof color === 'number') {\n hex = Math.floor(color);\n rgb.r = (color >> 16 & 255) / 255;\n rgb.g = (color >> 8 & 255) / 255;\n rgb.b = (color & 255) / 255;\n } else if (typeof color === 'string') {\n var m;\n if (m = /^(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(,\\s*([0-9]*\\.?[0-9]+)\\s*)?$/.exec(color)) {\n rgb.r = Math.min(255, parseInt(m[1], 10)) / 255;\n rgb.g = Math.min(255, parseInt(m[2], 10)) / 255;\n rgb.b = Math.min(255, parseInt(m[3], 10)) / 255;\n } else if (m = /^\\#([A-Fa-f0-9]+)$/.exec(color)) {\n var hex = m[1];\n rgb.r = parseInt(hex.charAt(0) + hex.charAt(1), 16) / 255;\n rgb.g = parseInt(hex.charAt(2) + hex.charAt(3), 16) / 255;\n rgb.b = parseInt(hex.charAt(4) + hex.charAt(5), 16) / 255;\n }\n } else if (color instanceof THREE.Color) {\n rgb.r = color.r;\n rgb.g = color.g;\n rgb.b = color.b;\n }\n\n return rgb;\n }\n };\n\n\n Proton.ColorUtil = ColorUtil;\n\n\n\n var THREEUtil = {\n toScreenPos: function() {\n var vector = new THREE.Vector3();\n\n return function(pos, camera, canvas) {\n vector.copy(pos);\n // map to normalized device coordinate (NDC) space\n vector.project(camera);\n // map to 2D screen space\n vector.x = Math.round((vector.x + 1) * canvas.width / 2);\n vector.y = Math.round((-vector.y + 1) * canvas.height / 2);\n vector.z = 0;\n\n return vector;\n }\n }(),\n\n toSpacePos: function() {\n var vector = new THREE.Vector3(),\n dir = new THREE.Vector3(),\n distance;\n\n return function(pos, camera, canvas) {\n vector.set((pos.x / canvas.width) * 2 - 1, -(pos.y / canvas.height) * 2 + 1, 0.5);\n vector.unproject(camera);\n\n dir.copy(vector.sub(camera.position).normalize());\n distance = -camera.position.z / dir.z;\n vector.copy(camera.position);\n vector.add(dir.multiplyScalar(distance));\n\n return vector;\n }\n }(),\n\n getTexture: function() {\n var store = {};\n\n return function(img) {\n if (img instanceof THREE.Texture) {\n return img;\n } else if (typeof img == \"string\") {\n var id = Proton.PUID.hash(img);\n if (!store[id]) store[id] = new THREE.Texture(img);;\n return store[id];\n } else if (img instanceof Image) {\n var id = Proton.PUID.hash(img.src);\n if (!store[id]) store[id] = new THREE.Texture(img);;\n return store[id];\n }\n }\n }()\n };\n\n Proton.THREEUtil = THREEUtil;\n\n\n\n var PUID = PUID || {\n _id: 0,\n _uids: {},\n id: function(obj) {\n for (var id in this._uids) {\n if (this._uids[id] == obj) return id;\n }\n\n var nid = \"PUID_\" + (this._id++);\n this._uids[nid] = obj;\n return nid;\n },\n\n hash: function(str) {\n return;\n }\n }\n\n Proton.PUID = PUID;\n\n\n\n\n Particle.ID = 0;\n\n /**\n * the Particle class\n * @param {Number} pObj - the parameters of particle config;\n * @example \n * var p = new Proton.Particle({life:3,dead:false});\n * or\n * var p = new Proton.Particle({mass:1,radius:100});\n * @constructor\n */\n function Particle(pOBJ) {\n /**\n * @property {Number} id - The particle's id\n */\n this.id = 'particle_' + Particle.ID++;\n this.name = 'Particle';\n this.reset(\"init\");\n Proton.Util.setPrototypeByObj(this, pOBJ);\n }\n\n Particle.prototype = {\n getDirection: function() {\n return Math.atan2(this.v.x, -this.v.y) * (180 / Proton.PI);\n },\n\n /**\n * @property {Number} life - The particle's life\n * @property {Number} age - The particle's age\n * @property {Number} energy - The particle's energy loss\n * @property {Boolean} dead - The particle is dead?\n * @property {Boolean} sleep - The particle is sleep?\n * @property {Object} target - The particle's target\n * @property {Object} body - The particle's body\n * @property {Number} mass - The particle's mass\n * @property {Number} radius - The particle's radius\n * @property {Number} alpha - The particle's alpha\n * @property {Number} scale - The particle's scale\n * @property {Number} rotation - The particle's rotation\n * @property {String|Number} color - The particle's color\n * @property {Function} easing - The particle's easing\n * @property {Proton.Vector3D} p - The particle's position\n * @property {Proton.Vector3D} v - The particle's velocity\n * @property {Proton.Vector3D} a - The particle's acceleration\n * @property {Array} behaviours - The particle's behaviours array\n * @property {Object} transform - The particle's transform collection\n */\n reset: function(init) {\n this.life = Infinity;\n this.age = 0;\n //energy loss\n this.energy = 1;\n this.dead = false;\n this.sleep = false;\n this.body = null;\n this.parent = null;\n this.mass = 1;\n this.radius = 10;\n\n this.alpha = 1;\n this.scale = 1;\n\n this.useColor = false;\n this.useAlpha = false;\n\n this.easing = Proton.ease.setEasingByName(Proton.ease.easeLinear);\n\n if (init) {\n this.p = new Proton.Vector3D();\n this.v = new Proton.Vector3D();\n this.a = new Proton.Vector3D();\n this.old = {};\n this.old.p = this.p.clone();\n this.old.v = this.v.clone();\n this.old.a = this.a.clone();\n\n this.behaviours = [];\n this.transform = {};\n this.color = { r: 0, g: 0, b: 0 };\n this.rotation = new Proton.Vector3D;\n } else {\n this.p.set(0, 0, 0);\n this.v.set(0, 0, 0);\n this.a.set(0, 0, 0);\n this.old.p.set(0, 0, 0);\n this.old.v.set(0, 0, 0);\n this.old.a.set(0, 0, 0);\n\n this.color.r = 0;\n this.color.g = 0;\n this.color.b = 0;\n\n this.rotation.clear();\n\n Proton.Util.destroyObject(this.transform);\n this.removeAllBehaviours();\n }\n\n return this;\n },\n\n update: function(time, index) {\n if (!this.sleep) {\n this.age += time;\n\n var i = this.behaviours.length;\n while (i--) {\n this.behaviours[i] && this.behaviours[i].applyBehaviour(this, time, index)\n }\n } else {\n //sleep\n }\n\n if (this.age >= this.life) {\n this.destroy();\n } else {\n var scale = this.easing(this.age / this.life);\n this.energy = Math.max(1 - scale, 0);\n }\n\n },\n\n addBehaviour: function(behaviour) {\n this.behaviours.push(behaviour);\n behaviour.initialize(this);\n },\n\n addBehaviours: function(behaviours) {\n var i = behaviours.length;\n while (i--) {\n this.addBehaviour(behaviours[i]);\n }\n },\n\n removeBehaviour: function(behaviour) {\n var index = this.behaviours.indexOf(behaviour);\n if (index > -1) {\n this.behaviours.splice(index, 1);\n }\n },\n\n removeAllBehaviours: function() {\n Proton.Util.destroyArray(this.behaviours);\n },\n\n /**\n * Destory this particle\n * @method destroy\n */\n destroy: function() {\n this.removeAllBehaviours();\n this.energy = 0;\n this.dead = true;\n this.parent = null;\n }\n };\n\n Proton.Particle = Particle;\n\n\n\n\n function Pool() {\n this.cID = 0;\n this.list = {};\n }\n\n Pool.prototype = {\n create: function(obj) {\n this.cID++;\n\n if (typeof obj == \"function\")\n return new obj;\n else\n return obj.clone();\n },\n\n getCount: function() {\n var count = 0;\n for (var id in this.list)\n count += this.list[id].length;\n\n return count++;;\n },\n\n get: function(obj) {\n var p, puid = obj.__puid || Proton.PUID.id(obj);\n if (this.list[puid] && this.list[puid].length > 0)\n p = this.list[puid].pop();\n else\n p = this.create(obj);\n\n p.__puid = obj.__puid || puid;\n return p;\n },\n\n expire: function(obj) {\n return this._getList(obj.__puid).push(obj);\n },\n\n destroy: function() {\n for (var id in this.list) {\n this.list[id].length = 0;\n delete this.list[id];\n }\n },\n\n _getList: function(uid) {\n uid = uid || \"default\";\n if (!this.list[uid]) this.list[uid] = [];\n return this.list[uid];\n }\n }\n\n Proton.Pool = Pool;\n\n\n\n\n var MathUtils = {\n randomAToB: function(a, b, INT) {\n if (!INT)\n return a + Math.random() * (b - a);\n else\n return ((Math.random() * (b - a)) >> 0) + a;\n },\n randomFloating: function(center, f, INT) {\n return MathUtils.randomAToB(center - f, center + f, INT);\n },\n\n randomZone: function(display) {\n\n },\n\n degreeTransform: function(a) {\n return a * Proton.PI / 180;\n },\n\n toColor16: function getRGB(num) {\n return \"#\" + num.toString(16);\n },\n\n randomColor: function() {\n return '#' + ('00000' + (Math.random() * 0x1000000 << 0).toString(16)).slice(-6);\n },\n\n lerp: function(a, b, energy) {\n return b + (a - b) * energy\n },\n\n getNormal: function(v, n) {\n if (v.x == 0 && v.y == 0) {\n if (v.z == 0)\n n.set(1, 0, 1);\n else\n n.set(1, 1, -v.y / v.z);\n } else {\n if (v.x == 0)\n n.set(1, 0, 1);\n else\n n.set(-v.y / v.x, 1, 1);\n }\n\n return n.normalize();\n },\n\n /** \n * Rodrigues' Rotation Formula \n * https://en.wikipedia.org/wiki/Rodrigues%27_rotation_formula\n * v′ = vcos(θ) + k(k⋅v)(1−cos(θ)) + (k*v)sin(θ)\n */\n axisRotate: function(v0, v, k, tha) {\n var cos = Math.cos(tha);\n var sin = Math.sin(tha);\n var p = k.dot(v) * (1 - cos);\n\n v0.copy(k);\n v0.cross(v).scalar(sin);\n v0.addValue(v.x * cos, v.y * cos, v.z * cos);\n v0.addValue(k.x * p, k.y * p, k.z * p);\n }\n }\n\n Proton.MathUtils = MathUtils;\n\n\n//数值积分\n\n var Integration = function(type) {\n this.type = Proton.Util.initValue(type, Proton.EULER);\n }\n\n Integration.prototype = {\n integrate: function(particles, time, damping) {\n this.euler(particles, time, damping);\n },\n\n euler: function(particle, time, damping) {\n if (!particle.sleep) {\n particle.old.p.copy(particle.p);\n particle.old.v.copy(particle.v);\n particle.a.scalar(1 / particle.mass);\n particle.v.add(particle.a.scalar(time));\n particle.p.add(particle.old.v.scalar(time));\n damping && particle.v.scalar(damping);\n particle.a.clear();\n }\n }\n }\n\n Proton.Integration = Integration;\n\n\n//@author mrdoob / http://mrdoob.com/\n\n var Vector3D = function(x, y, z) {\n this.x = x || 0;\n this.y = y || 0;\n this.z = z || 0;\n }\n\n Vector3D.prototype = {\n set: function(x, y, z) {\n this.x = x;\n this.y = y;\n this.z = z;\n return this;\n },\n\n setX: function(x) {\n this.x = x;\n return this;\n },\n\n setY: function(y) {\n this.y = y;\n return this;\n },\n\n setZ: function(z) {\n this.z = z;\n return this;\n },\n\n getGradient: function() {\n if (this.x != 0)\n return Math.atan2(this.y, this.x);\n else if (this.y > 0)\n return Proton.PI / 2;\n else if (this.y < 0)\n return -Proton.PI / 2;\n },\n\n copy: function(v) {\n this.x = v.x;\n this.y = v.y;\n this.z = v.z;\n return this;\n },\n\n add: function(v, w) {\n if (w !== undefined) return this.addVectors(v, w);\n\n this.x += v.x;\n this.y += v.y;\n this.z += v.z;\n\n return this;\n\n },\n\n addValue: function(a, b, c) {\n this.x += a;\n this.y += b;\n this.z += c;\n\n return this;\n\n },\n\n addVectors: function(a, b) {\n this.x = a.x + b.x;\n this.y = a.y + b.y;\n this.z = a.z + b.z;\n\n return this;\n },\n\n addScalar: function(s) {\n this.x += s;\n this.y += s;\n this.z += s;\n\n return this;\n },\n\n sub: function(v, w) {\n if (w !== undefined) return this.subVectors(v, w);\n\n this.x -= v.x;\n this.y -= v.y;\n this.z -= v.z;\n\n return this;\n },\n\n subVectors: function(a, b) {\n this.x = a.x - b.x;\n this.y = a.y - b.y;\n this.z = a.z - b.z;\n return this;\n },\n\n scalar: function(s) {\n this.x *= s;\n this.y *= s;\n this.z *= s;\n\n return this;\n },\n\n divideScalar: function(s) {\n if (s !== 0) {\n this.x /= s;\n this.y /= s;\n this.z /= s;\n } else {\n this.set(0, 0, 0);\n }\n\n return this;\n },\n\n negate: function() {\n return this.scalar(-1);\n },\n\n dot: function(v) {\n return this.x * v.x + this.y * v.y + this.z * v.z;\n },\n\n cross: function(v) {\n var x = this.x,\n y = this.y,\n z = this.z;\n\n this.x = y * v.z - z * v.y;\n this.y = z * v.x - x * v.z;\n this.z = x * v.y - y * v.x;\n\n return this;\n },\n\n lengthSq: function() {\n return this.x * this.x + this.y * this.y + this.z * this.z;\n },\n\n length: function() {\n return Math.sqrt(this.lengthSq());\n },\n\n normalize: function() {\n return this.divideScalar(this.length());\n },\n\n distanceTo: function(v) {\n return Math.sqrt(this.distanceToSquared(v));\n },\n\n crossVectors: function(a, b) {\n\n var ax = a.x,\n ay = a.y,\n az = a.z;\n var bx = b.x,\n by = b.y,\n bz = b.z;\n\n this.x = ay * bz - az * by;\n this.y = az * bx - ax * bz;\n this.z = ax * by - ay * bx;\n\n return this;\n\n },\n\n // eulerFromDir: function() {\n // var quaternion, dir, up;\n\n // return function rotateFromDir(direction) {\n // if (quaternion === undefined) quaternion = new Proton.Quaternion();\n // if (dir === undefined) dir = new Proton.Vector3D;\n // if (up === undefined) up = new Proton.Vector3D(0, 0, 1);\n\n // //quaternion.setFromUnitVectors(up, dir.copy(direction).normalize());\n // console.log(quaternion.setFromUnitVectors(up, dir.copy(direction).normalize()));\n\n // this.applyQuaternion(quaternion.setFromUnitVectors(up, dir.copy(direction).normalize()));\n // console.log(this);\n // return this;\n // };\n // }(),\n\n eulerFromDir: function(dir) {\n \n },\n\n applyEuler: function() {\n var quaternion;\n\n return function applyEuler(euler) {\n if (quaternion === undefined) quaternion = new Proton.Quaternion();\n this.applyQuaternion(quaternion.setFromEuler(euler));\n return this;\n };\n }(),\n\n applyAxisAngle: function() {\n var quaternion;\n return function applyAxisAngle(axis, angle) {\n if (quaternion === undefined) quaternion = new Proton.Quaternion();\n this.applyQuaternion(quaternion.setFromAxisAngle(axis, angle));\n return this;\n };\n }(),\n\n applyQuaternion: function(q) {\n var x = this.x;\n var y = this.y;\n var z = this.z;\n\n var qx = q.x;\n var qy = q.y;\n var qz = q.z;\n var qw = q.w;\n\n // calculate quat * vector\n\n var ix = qw * x + qy * z - qz * y;\n var iy = qw * y + qz * x - qx * z;\n var iz = qw * z + qx * y - qy * x;\n var iw = -qx * x - qy * y - qz * z;\n\n // calculate result * inverse quat\n this.x = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n this.y = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n this.z = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n return this;\n },\n\n distanceToSquared: function(v) {\n var dx = this.x - v.x,\n dy = this.y - v.y,\n dz = this.z - v.z;\n\n return dx * dx + dy * dy + dz * dz;\n },\n\n lerp: function(v, alpha) {\n this.x += (v.x - this.x) * alpha;\n this.y += (v.y - this.y) * alpha;\n this.z += (v.z - this.z) * alpha;\n return this;\n },\n\n equals: function(v) {\n return ((v.x === this.x) && (v.y === this.y) && (v.z === this.z));\n },\n\n clear: function() {\n this.x = 0.0;\n this.y = 0.0;\n this.z = 0.0;\n return this;\n },\n\n clone: function() {\n return new Proton.Vector3D(this.x, this.y, this.z);\n },\n\n toString: function() {\n return \"x:\" + this.x + \"y:\" + this.y + \"z:\" + this.z;\n }\n };\n\n Proton.Vector3D = Vector3D;\n\n\n\n var Polar3D = function(radius, theta, phi) {\n this.radius = radius || 1;\n this.phi = phi || 0;\n this.theta = theta || 0;\n }\n\n Polar3D.prototype = {\n set: function(radius, theta, phi) {\n this.radius = radius || 1;\n this.phi = phi || 0;\n this.theta = theta || 0;\n\n return this;\n },\n\n setRadius: function(radius) {\n this.radius = radius;\n return this;\n },\n\n setPhi: function(phi) {\n this.phi = phi;\n return this;\n },\n\n setTheta: function(theta) {\n this.theta = theta;\n return this;\n },\n\n copy: function(p) {\n this.radius = p.radius;\n this.phi = p.phi;\n this.theta = p.theta;\n return this;\n },\n\n toVector3D: function() {\n return new Proton.Vector3D(this.getX(), this.getY(), this.getZ());\n },\n\n getX: function() {\n return this.radius * Math.sin(this.theta) * Math.cos(this.phi);\n },\n\n getY: function() {\n return -this.radius * Math.sin(this.theta) * Math.sin(this.phi);\n },\n\n getZ: function() {\n return this.radius * Math.cos(this.theta);\n },\n\n normalize: function() {\n this.radius = 1;\n return this;\n },\n\n equals: function(v) {\n return ((v.radius === this.radius) && (v.phi === this.phi) && (v.theta === this.theta));\n },\n\n clear: function() {\n this.radius = 0.0;\n this.phi = 0.0;\n this.theta = 0.0;\n return this;\n },\n\n clone: function() {\n return new Polar3D(this.radius, this.phi, this.theta);\n }\n };\n\n\n Proton.Polar3D = Polar3D;\n\n\n\n /**\n * Span Class. Get a random Number from a to b. Or from c-a to c+b\n * @param {Number|Array} a - min number\n * @param {Number} b - max number\n * @param {Number} center - the center's z value \n * @example \n * var span = new Proton.Span(0,30);\n * or\n * var span = new Proton.Span([\"#fff\",\"#ff0\",\"#000\"]);\n * or\n * var span = new Proton.Span(5,1,\"center\");\n * @extends {Zone}\n * @constructor\n */\n function Span(a, b, center) {\n this._isArray = false;\n\n if (Proton.Util.isArray(a)) {\n this._isArray = true;\n this.a = a;\n } else {\n this.a = Proton.Util.initValue(a, 1);\n this.b = Proton.Util.initValue(b, this.a);\n this._center = Proton.Util.initValue(center, false);\n }\n }\n\n /**\n * Span.getValue function\n * @name get a random Number from a to b. Or get a random Number from c-a to c+b\n * @param {number} INT or int\n * @return {number} a random Number\n */\n Span.prototype = {\n getValue: function(INT) {\n if (this._isArray) {\n return this.a[(this.a.length * Math.random()) >> 0];\n } else {\n if (!this._center)\n return Proton.MathUtils.randomAToB(this.a, this.b, INT);\n else\n return Proton.MathUtils.randomFloating(this.a, this.b, INT);\n }\n }\n }\n\n /**\n * Proton.createSpan function\n * @name get a instance of Span\n * @param {number} a min number\n * @param {number} b max number\n * @param {number} c center number\n * @return {number} return a instance of Span\n */\n Proton.createSpan = function(a, b, c) {\n if (a instanceof Span) return a;\n\n if (b === undefined) {\n return new Span(a);\n } else {\n if (c === undefined)\n return new Span(a, b);\n else\n return new Span(a, b, c);\n }\n }\n\n Proton.Span = Span;\n\n\n\n /**\n * ArraySpan name get a random Color from a colors array\n * @param {String|Array} colors - colors array\n * @example \n * var span = new Proton.ArraySpan([\"#fff\",\"#ff0\",\"#000\"]);\n * or\n * var span = new Proton.ArraySpan(\"#ff0\");\n * @extends {Proton.Span}\n * @constructor\n */\n\n function ArraySpan(colors) {\n this._arr = Proton.Util.isArray(colors) ? colors : [colors];\n }\n\n Proton.Util.inherits(ArraySpan, Proton.Span);\n\n /**\n * getValue function\n * @name get a random Color\n * @return {string} a hex color\n */\n ArraySpan.prototype.getValue = function() {\n var color = this._arr[(this._arr.length * Math.random()) >> 0];\n \n if (color == 'random' || color == 'Random')\n return Proton.MathUtils.randomColor();\n else\n return color;\n }\n\n /**\n * Proton.createArraySpan function\n * @name get a instance of Span\n * @param {number} a min number\n * @param {number} b max number\n * @param {number} c center number\n * @return {number} return a instance of Span\n */\n Proton.createArraySpan = function(arr) {\n if (!arr) return null;\n if (arr instanceof Proton.ArraySpan)\n return arr;\n else \n return new Proton.ArraySpan(arr);\n }\n\n Proton.ArraySpan = ArraySpan;\n\n\n\n\n\n var Quaternion = function(x, y, z, w) {\n this.x = x || 0;\n this.y = y || 0;\n this.z = z || 0;\n this.w = (w !== undefined) ? w : 1;\n };\n\n Quaternion.prototype = {\n set: function(x, y, z, w) {\n this.x = x;\n this.y = y;\n this.z = z;\n this.w = w;\n return this;\n },\n\n clone: function() {\n return new Proton.Quaternion(this.x, this.y, this.z, this.w);\n },\n\n copy: function(quaternion) {\n this.x = quaternion.x;\n this.y = quaternion.y;\n this.z = quaternion.z;\n this.w = quaternion.w;\n return this;\n },\n\n setFromEuler: function(euler) {\n // http://www.mathworks.com/matlabcentral/fileexchange/\n // 20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n // content/SpinCalc.m\n\n var c1 = Math.cos(euler.x / 2);\n var c2 = Math.cos(euler.y / 2);\n var c3 = Math.cos(euler.z / 2);\n var s1 = Math.sin(euler.x / 2);\n var s2 = Math.sin(euler.y / 2);\n var s3 = Math.sin(euler.z / 2);\n\n this.x = s1 * c2 * c3 + c1 * s2 * s3;\n this.y = c1 * s2 * c3 - s1 * c2 * s3;\n this.z = c1 * c2 * s3 + s1 * s2 * c3;\n this.w = c1 * c2 * c3 - s1 * s2 * s3;\n\n return this;\n\n },\n\n setFromAxisAngle: function(axis, angle) {\n // http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n // assumes axis is normalized\n var halfAngle = angle / 2,\n s = Math.sin(halfAngle);\n this.x = axis.x * s;\n this.y = axis.y * s;\n this.z = axis.z * s;\n this.w = Math.cos(halfAngle);\n\n return this;\n },\n\n // setFromUnitVectors: function() {\n // var v1, r;\n // var EPS = 0.000001;\n\n // return function(vFrom, vTo) {\n // if (v1 === undefined) v1 = new Proton.Vector3D();\n\n // r = vFrom.dot(vTo) + 1;\n // if (r < EPS) {\n // r = 0;\n // if (Math.abs(vFrom.x) > Math.abs(vFrom.z)) {\n // v1.set(-vFrom.y, vFrom.x, 0);\n // } else {\n // v1.set(0, -vFrom.z, vFrom.y);\n // }\n // } else {\n // v1.crossVectors(vFrom, vTo);\n // }\n\n // this.x = v1.x;\n // this.y = v1.y;\n // this.z = v1.z;\n // this.w = r;\n // return this.normalize();\n // };\n // }(),\n\n normalize: function() {\n\n var l = this.length();\n\n if (l === 0) {\n\n this.x = 0;\n this.y = 0;\n this.z = 0;\n this.w = 1;\n\n } else {\n l = 1 / l;\n this.x *= l;\n this.y *= l;\n this.z *= l;\n this.w *= l;\n\n }\n return this;\n },\n\n length: function() {\n\n return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w);\n\n },\n\n dot: function(v) {\n return this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n }\n };\n\n Proton.Quaternion = Quaternion;\n\n\n\n function Box(x, y, z, w, h, d) {\n this.x = x;\n this.y = y;\n this.z = z;\n this.width = w;\n this.height = h;\n this.depth = d;\n this.bottom = this.y + this.height;\n this.right = this.x + this.width;\n this.right = this.x + this.width;\n }\n\n\n Box.prototype = {\n contains: function(x, y, z) {\n if (\n x <= this.right &&\n x >= this.x &&\n y <= this.bottom &&\n y >= this.y &&\n z <= this.depth &&\n z >= this.z\n )\n return true\n else\n return false\n }\n }\n\n Proton.Box = Box;\n\n\n\n /**\n * The Behaviour class is the base for the other Behaviour\n *\n * @class Behaviour\n * @constructor\n */\n function Behaviour(life, easing) {\n /**\n * The behaviour's id;\n * @property id\n * @type {String} id\n */\n this.id = 'Behaviour_' + Behaviour.id++;\n this.life = Proton.Util.initValue(life, Infinity);\n\n /**\n * The behaviour's decaying trend, for example Proton.easeOutQuart;\n * @property easing\n * @type {String}\n * @default Proton.easeLinear\n */\n this.easing = Proton.Util.initValue(easing, Proton.ease.setEasingByName(Proton.ease.easeLinear));\n this.age = 0;\n this.energy = 1;\n /**\n * The behaviour is Dead;\n * @property dead\n * @type {Boolean}\n */\n this.dead = false;\n\n /**\n * The behaviour name;\n * @property name\n * @type {string}\n */\n\n this.name = 'Behaviour';\n }\n\n Behaviour.id = 0;\n\n\n Behaviour.prototype = {\n /**\n * Reset this behaviour's parameters\n *\n * @method reset\n * @param {Number} this behaviour's life\n * @param {String} this behaviour's easing\n */\n reset: function(life, easing) {\n this.life = Proton.Util.initValue(life, Infinity);\n this.easing = Proton.Util.initValue(easing, Proton.ease.setEasingByName(Proton.ease.easeLinear));\n },\n /**\n * Normalize a force by 1:100;\n *\n * @method normalizeForce\n * @param {Proton.Vector2D} force \n */\n normalizeForce: function(force) {\n return force.scalar(Proton.MEASURE);\n },\n\n /**\n * Normalize a value by 1:100;\n *\n * @method normalizeValue\n * @param {Number} value\n */\n normalizeValue: function(value) {\n return value * Proton.MEASURE;\n },\n\n /**\n * Initialize the behaviour's parameters for all particles\n *\n * @method initialize\n * @param {Proton.Particle} particle\n */\n initialize: function(particle) {},\n\n /**\n * Apply this behaviour for all particles every time\n *\n * @method applyBehaviour\n * @param {Proton.Particle} particle\n * @param {Number} the integrate time 1/ms\n * @param {Int} the particle index\n */\n applyBehaviour: function(particle, time, index) {\n if (this.dead) return;\n\n this.age += time;\n if (this.age >= this.life) {\n this.energy = 0;\n this.dead = true;\n return;\n }\n\n var scale = this.easing(particle.age / particle.life);\n this.energy = Math.max(1 - scale, 0);\n },\n\n /**\n * Destory this behaviour\n * @method destroy\n */\n destroy: function() {\n\n }\n };\n\n Proton.Behaviour = Behaviour;\n\n\n\n /**\n * The number of particles per second emission (a [particle]/b [s]);\n * @class Proton.Rate\n * @constructor\n * @param {Array or Number or Proton.Span} numPan the number of each emission;\n * @param {Array or Number or Proton.Span} timePan the time of each emission;\n * for example: new Proton.Rate(new Proton.Span(10, 20), new Proton.Span(.1, .25));\n */\n \n function Rate(numPan, timePan) {\n this.numPan = Proton.createSpan(Proton.Util.initValue(numPan, 1));\n this.timePan = Proton.createSpan(Proton.Util.initValue(timePan, 1));\n\n this.startTime = 0;\n this.nextTime = 0;\n this.init();\n }\n\n Rate.prototype = {\n init: function() {\n this.startTime = 0;\n this.nextTime = this.timePan.getValue();\n },\n\n getValue: function(time) {\n this.startTime += time;\n\n if (this.startTime >= this.nextTime) {\n this.init();\n\n if (this.numPan.b == 1) {\n if (this.numPan.getValue(\"Float\") > 0.5)\n return 1;\n else\n return 0;\n } else {\n return this.numPan.getValue(\"Int\");\n }\n }\n\n return 0;\n }\n }\n\n Proton.Rate = Rate;\n\n\n\n function Initialize() {\n this.name = \"Initialize\";\n }\n\n\n Initialize.prototype.reset = function() {\n\n }\n\n Initialize.prototype.init = function(emitter, particle) {\n if (particle) {\n this.initialize(particle);\n } else {\n this.initialize(emitter);\n }\n };\n\n ///sub class init\n Initialize.prototype.initialize = function(target) {};\n Proton.Initialize = Initialize;\n\n\n\n var InitializeUtil = {\n\n initialize: function(emitter, particle, initializes) {\n var i = initializes.length;\n while (i--) {\n var initialize = initializes[i];\n if (initialize instanceof Proton.Initialize)\n initialize.init(emitter, particle);\n else\n InitializeUtil.init(emitter, particle, initialize);\n }\n\n InitializeUtil.bindEmitter(emitter, particle);\n },\n\n //////////////////////init//////////////////////\n init: function(emitter, particle, initialize) {\n Proton.Util.setPrototypeByObj(particle, initialize);\n Proton.Util.setVectorByObj(particle, initialize);\n },\n\n bindEmitter: function(emitter, particle) {\n if (emitter.bindEmitter) {\n particle.p.add(emitter.p);\n particle.v.add(emitter.v);\n particle.a.add(emitter.a);\n particle.v.applyEuler(emitter.rotation);\n }\n }\n }\n\n Proton.InitializeUtil = InitializeUtil;\n\n\n\n /**\n * Life is init particle's Life\n * @param {Number} a - the Life's start point\n * @param {Number} b - the Life's end point \n * @param {String} c - span's center \n * @example \n * var life = new Proton.Life(3,5);\n * or\n * var life = new Proton.Life(Infinity);\n * @extends {Initialize}\n * @constructor\n */\n function Life(a, b, c) {\n Life._super_.call(this);\n this.lifePan = Proton.createSpan(a, b, c);\n }\n\n\n Proton.Util.inherits(Life, Proton.Initialize);\n Life.prototype.initialize = function(target) {\n if (this.lifePan.a == Infinity || this.lifePan.a == \"infi\")\n target.life = Infinity;\n else\n target.life = this.lifePan.getValue();\n };\n\n\n Proton.Life = Life;\n\n\n\n /**\n * Position is init particle's Position\n * @param {Zone} zone - the Position zone\n * @example \n * var Position = new Proton.Position(new Proton.PointZone(30,100,0));\n * or\n * var Position = new Proton.Position(Infinity);\n * @extends {Proton.Initialize}\n * @constructor\n */\n function Position() {\n Position._super_.call(this);\n this.reset.apply(this, arguments);\n }\n\n\n Proton.Util.inherits(Position, Proton.Initialize);\n Position.prototype.reset = function() {\n if (!this.zones) this.zones = [];\n else this.zones.length = 0;\n\n var args = Array.prototype.slice.call(arguments);\n this.zones = this.zones.concat(args);\n };\n\n Position.prototype.addZone = function() {\n var args = Array.prototype.slice.call(arguments);\n this.zones = this.zones.concat(args);\n };\n\n Position.prototype.initialize = function() {\n var zone;\n return function(target) {\n var zone = this.zones[(Math.random() * this.zones.length) >> 0];\n zone.getPosition();\n\n target.p.x = zone.vector.x;\n target.p.y = zone.vector.y;\n target.p.z = zone.vector.z;\n }\n }();\n\n\n Proton.Position = Position;\n Proton.P = Position;\n\n\n\n\n /**\n * Velocity is init particle's Velocity\n * @param {Number} a - the Life's start point\n * @param {Number} b - the Life's end point \n * @param {String} c - span's center \n * @example \n * var life = new Proton.Life(3,5);\n * or\n * var life = new Proton.Life(Infinity);\n * @extends {Initialize}\n * @constructor\n */\n //radius and tha\n function Velocity(a, b, c) {\n Velocity._super_.call(this);\n this.reset(a, b, c);\n this.dirVec = new Proton.Vector3D(0, 0, 0);\n\n this.name = \"Velocity\";\n }\n\n Proton.Util.inherits(Velocity, Proton.Initialize);\n\n Velocity.prototype.reset = function(a, b, c) {\n //[vector,tha]\n if (a instanceof Proton.Vector3D) {\n this.radiusPan = Proton.createSpan(1);\n this.dir = a.clone();\n this.tha = b * Proton.DR;\n this._useV = true;\n }\n\n //[polar,tha]\n else if (a instanceof Proton.Polar3D) {\n this.tha = b * Proton.DR;\n this.dirVec = a.toVector3D();\n this._useV = false;\n }\n\n //[radius,vector,tha]\n else {\n this.radiusPan = Proton.createSpan(a);\n this.dir = b.clone().normalize();\n this.tha = c * Proton.DR;\n this._useV = true;\n }\n };\n\n Velocity.prototype.normalize = function(vr) {\n return vr * Proton.MEASURE;\n }\n\n Velocity.prototype.initialize = function() {\n var tha;\n var normal = new Proton.Vector3D(0, 0, 1);\n var v = new Proton.Vector3D(0, 0, 0);\n\n return function initialize(target) {\n tha = this.tha * Math.random();\n this._useV && this.dirVec.copy(this.dir).scalar(this.radiusPan.getValue());\n\n Proton.MathUtils.getNormal(this.dirVec, normal);\n v.copy(this.dirVec).applyAxisAngle(normal, tha);\n v.applyAxisAngle(this.dirVec.normalize(), Math.random() * Proton.PI * 2);\n\n //use axisRotate methods\n //Proton.MathUtils.axisRotate(this.v1, this.dirVec, normal, tha);\n //Proton.MathUtils.axisRotate(this.v2, this.v1, this.dirVec.normalize(), Math.random() * Proton.PI * 2);\n target.v.copy(v);\n return this;\n };\n }()\n\n Proton.Velocity = Velocity;\n Proton.V = Velocity;\n\n\n\n /**\n * Mass is init particle's Mass\n * @param {Number} a - the Mass's start point\n * @param {Number} b - the Mass's end point \n * @param {String} c - span's center \n * @example \n * var Mass = new Proton.Mass(3,5);\n * or\n * var Mass = new Proton.Mass(Infinity);\n * @extends {Initialize}\n * @constructor\n */\n function Mass(a, b, c) {\n Mass._super_.call(this);\n this.massPan = Proton.createSpan(a, b, c);\n }\n\n\n Proton.Util.inherits(Mass, Proton.Initialize);\n Mass.prototype.initialize = function(target) {\n target.mass = this.massPan.getValue();\n };\n\n Proton.Mass = Mass;\n\n\n\n\n /**\n * Radius is init particle's Radius\n * @param {Number} a - the Radius's start point\n * @param {Number} b - the Radius's end point \n * @param {String} c - span's center \n * @example \n * var Radius = new Proton.Radius(3,5);\n * or\n * var Radius = new Proton.Radius(3,1,\"center\");\n * @extends {Initialize}\n * @constructor\n */\n function Radius(a, b, c) {\n Radius._super_.call(this);\n this.radius = Proton.createSpan(a, b, c);\n }\n\n\n Proton.Util.inherits(Radius, Proton.Initialize);\n Radius.prototype.reset = function(a, b, c) {\n this.radius = Proton.createSpan(a, b, c);\n };\n\n Radius.prototype.initialize = function(particle) {\n particle.radius = this.radius.getValue();\n particle.transform.oldRadius = particle.radius;\n };\n\n Proton.Radius = Radius;\n\n\n\n function Body(body, w, h) {\n Body._super_.call(this);\n this.body = Proton.createArraySpan(body);\n this.w = w;\n this.h = Proton.Util.initValue(h, this.w);\n }\n\n Proton.Util.inherits(Body, Proton.Initialize);\n\n Body.prototype.initialize = function(particle) {\n var body = this.body.getValue();\n if (!!this.w) {\n particle.body = {\n width: this.w,\n height: this.h,\n body: body\n };\n } else {\n particle.body = body;\n }\n };\n\n Proton.Body = Body;\n\n\n\n\n /**\n * The Behaviour class is the base for the other Behaviour\n *\n * @class Behaviour\n * @constructor\n */\n function Force(fx, fy, fz, life, easing) {\n Force._super_.call(this, life, easing);\n Force.prototype.reset.call(this, fx, fy, fz);\n this.name = \"Force\";\n }\n\n Proton.Util.inherits(Force, Proton.Behaviour);\n Force.prototype.reset = function(fx, fy, fz) {\n this.force = this.normalizeForce(new Proton.Vector3D(fx, fy, fz));\n this.force.id = Math.random();\n }\n\n Force.prototype.applyBehaviour = function(particle, time, index) {\n Force._super_.prototype.applyBehaviour.call(this, particle, time, index);\n particle.a.add(this.force);\n };\n\n Proton.F = Proton.Force = Force;\n\n\n\n\tfunction Attraction(targetPosition, force, radius, life, easing) {\n\t\tAttraction._super_.call(this, life, easing);\n\t\tthis.targetPosition = Proton.Util.initValue(targetPosition, new Proton.Vector3D);\n\t\tthis.radius = Proton.Util.initValue(radius, 1000);\n\t\tthis.force = Proton.Util.initValue(this.normalizeValue(force), 100);\n\t\tthis.radiusSq = this.radius * this.radius\n\t\tthis.attractionForce = new Proton.Vector3D();\n\t\tthis.lengthSq = 0;\n\t\tthis.name = \"Attraction\";\n\t}\n\n\n\tProton.Util.inherits(Attraction, Proton.Behaviour);\n\tAttraction.prototype.reset = function(targetPosition, force, radius, life, easing) {\n\t\tthis.targetPosition = Proton.Util.initValue(targetPosition, new Proton.Vector3D);\n\t\tthis.radius = Proton.Util.initValue(radius, 1000);\n\t\tthis.force = Proton.Util.initValue(this.normalizeValue(force), 100);\n\t\tthis.radiusSq = this.radius * this.radius\n\t\tthis.attractionForce = new Proton.Vector3D();\n\t\tthis.lengthSq = 0;\n\t\tif (life)\n\t\t\tAttraction._super_.prototype.reset.call(this, life, easing);\n\t}\n\n\tAttraction.prototype.applyBehaviour = function(particle, time, index) {\n\t\tAttraction._super_.prototype.applyBehaviour.call(this, particle, time, index);\n\t\tthis.attractionForce.copy(this.targetPosition);\n\t\tthis.attractionForce.sub(particle.p);\n\t\tthis.lengthSq = this.attractionForce.lengthSq();\n\t\tif (this.lengthSq > 0.000004 && this.lengthSq < this.radiusSq) {\n\t\t\tthis.attractionForce.normalize();\n\t\t\tthis.attractionForce.scalar(1 - this.lengthSq / this.radiusSq);\n\t\t\tthis.attractionForce.scalar(this.force);\n\t\t\tparticle.a.add(this.attractionForce);\n\t\t}\n\t};\n\n\tProton.Attraction = Attraction;\n\n\n\n\n /**\n * The Behaviour class is the base for the other Behaviour\n *\n * @class Behaviour\n * @constructor\n */\n function RandomDrift(driftX, driftY, driftZ, delay, life, easing) {\n RandomDrift._super_.call(this, life, easing);\n this.reset(driftX, driftY, driftZ, delay);\n this.time = 0;\n this.name = \"RandomDrift\";\n }\n\n\n Proton.Util.inherits(RandomDrift, Proton.Behaviour);\n RandomDrift.prototype.reset = function(driftX, driftY, driftZ, delay, life, easing) {\n this.randomFoce = this.normalizeForce(new Proton.Vector3D(driftX, driftY, driftZ));\n this.delayPan = Proton.createSpan(delay || .03);\n this.time = 0;\n life && RandomDrift._super_.prototype.reset.call(this, life, easing);\n }\n\n RandomDrift.prototype.applyBehaviour = function(particle, time, index) {\n RandomDrift._super_.prototype.applyBehaviour.call(this, particle, time, index);\n\n this.time += time;\n if (this.time >= this.delayPan.getValue()) {\n var ax = Proton.MathUtils.randomAToB(-this.randomFoce.x, this.randomFoce.x);\n var ay = Proton.MathUtils.randomAToB(-this.randomFoce.y, this.randomFoce.y);\n var az = Proton.MathUtils.randomAToB(-this.randomFoce.z, this.randomFoce.z);\n particle.a.addValue(ax, ay, az);\n this.time = 0;\n };\n };\n\n Proton.RandomDrift = RandomDrift;\n\n\n\n\tfunction Repulsion(targetPosition, force, radius, life, easing) {\n\t\tRepulsion._super_.call(this, targetPosition, force, radius, life, easing);\n\t\tthis.force *= -1;\n\t\tthis.name = \"Repulsion\";\n\t}\n\n\n\tProton.Util.inherits(Repulsion, Proton.Attraction);\n\tRepulsion.prototype.reset = function(targetPosition, force, radius, life, easing) {\n\t\tRepulsion._super_.prototype.reset.call(this, targetPosition, force, radius, life, easing);\n\t\tthis.force *= -1;\n\t}\n\tProton.Repulsion = Repulsion;\n\n\n\n\n function Gravity(g, life, easing) {\n Gravity._super_.call(this, 0, -g, 0, life, easing);\n this.name = \"Gravity\";\n }\n\n Proton.Util.inherits(Gravity, Proton.Force);\n\n Gravity.prototype.reset = function(g, life, easing) {\n Gravity._super_.prototype.reset.call(this, 0, -g, 0, life, easing);\n }\n\n Proton.Gravity = Gravity;\n Proton.G = Gravity;\n\n\n\n /**\n * The Scale class is the base for the other Proton.Behaviour\n *\n * @class Proton.Behaviour\n * @constructor\n */\n //can use Collision(emitter,true,function(){}) or Collision();\n function Collision(emitter, useMass, callback, life, easing) {\n Collision._super_.call(this, life, easing);\n this.reset(emitter, useMass, callback);\n this.name = \"Collision\";\n }\n\n Proton.Util.inherits(Collision, Proton.Behaviour);\n Collision.prototype.reset = function(emitter, useMass, callback, life, easing) {\n this.emitter = emitter;\n this.useMass = useMass;\n this.callback = callback;\n this.particles = [];\n this.delta = new Proton.Vector3D();\n life && Collision._super_.prototype.reset.call(this, life, easing);\n }\n\n Collision.prototype.applyBehaviour = function(particle, time, index) {\n var particles = this.emitter ? this.emitter.particles.slice(index) : this.particles.slice(index);\n var otherParticle, lengthSq, overlap, distance;\n var averageMass1, averageMass2;\n \n var i = particles.length;\n while (i--) {\n otherParticle = particles[i];\n if (otherParticle == particle) continue;\n \n this.delta.copy(otherParticle.p).sub(particle.p);\n lengthSq = this.delta.lengthSq();\n distance = particle.radius + otherParticle.radius;\n\n if (lengthSq <= distance * distance) {\n overlap = distance - Math.sqrt(lengthSq);\n overlap += 0.5;\n\n averageMass1 = this._getAverageMass(particle, otherParticle);\n averageMass2 = this._getAverageMass(otherParticle, particle);\n\n particle.p.add(this.delta.clone().normalize().scalar(overlap * -averageMass1));\n otherParticle.p.add(this.delta.normalize().scalar(overlap * averageMass2));\n\n this.callback && this.callback(particle, otherParticle);\n }\n }\n };\n\n Collision.prototype._getAverageMass = function(aPartcile, bParticle) {\n return this.useMass ? bParticle.mass / (aPartcile.mass + bParticle.mass) : 0.5;\n }\n\n Proton.Collision = Collision;\n\n\n\n\n function CrossZone(a, b, life, easing) {\n CrossZone._super_.call(this, life, easing);\n this.reset(a, b);\n ///dead /bound /cross\n this.name = \"CrossZone\";\n }\n\n\n Proton.Util.inherits(CrossZone, Proton.Behaviour);\n CrossZone.prototype.reset = function(a, b, life, easing) {\n var zone, crossType;\n if (typeof a == \"string\") {\n crossType = a;\n zone = b;\n } else {\n crossType = b;\n zone = a;\n }\n \n this.zone = zone;\n this.zone.crossType = Proton.Util.initValue(crossType, \"dead\");\n if (life)\n CrossZone._super_.prototype.reset.call(this, life, easing);\n }\n\n CrossZone.prototype.applyBehaviour = function(particle, time, index) {\n CrossZone._super_.prototype.applyBehaviour.call(this, particle, time, index);\n this.zone.crossing.call(this.zone, particle);\n };\n\n Proton.CrossZone = CrossZone;\n\n\n\n\n /**\n * The Alpha class is the base for the other Proton.Behaviour\n *\n * @class Proton.Behaviour\n * @constructor\n */\n\n function Alpha(a, b, life, easing) {\n Alpha._super_.call(this, life, easing);\n this.reset(a, b);\n /**\n * The Proton.Behaviour name;\n * @property name\n * @type {string}\n */\n this.name = \"Alpha\";\n }\n\n\n Proton.Util.inherits(Alpha, Proton.Behaviour);\n Alpha.prototype.reset = function(a, b, life, easing) {\n if (b == null || b == undefined)\n this._same = true;\n else\n this._same = false;\n\n this.a = Proton.createSpan(Proton.Util.initValue(a, 1));\n this.b = Proton.createSpan(b);\n life && Alpha._super_.prototype.reset.call(this, life, easing);\n }\n\n Alpha.prototype.initialize = function(particle) {\n particle.useAlpha = true;\n particle.transform.alphaA = this.a.getValue();\n if (this._same)\n particle.transform.alphaB = particle.transform.alphaA;\n else\n particle.transform.alphaB = this.b.getValue();\n };\n\n Alpha.prototype.applyBehaviour = function(particle, time, index) {\n Alpha._super_.prototype.applyBehaviour.call(this, particle, time, index);\n\n particle.alpha = Proton.MathUtils.lerp(particle.transform.alphaA, particle.transform.alphaB, this.energy);\n if (particle.alpha < 0.002) particle.alpha = 0;\n };\n\n Proton.Alpha = Alpha;\n\n\n\n /**\n * The Scale class is the base for the other Behaviour\n *\n * @class Behaviour\n * @constructor\n */\n\n function Scale(a, b, life, easing) {\n Scale._super_.call(this, life, easing);\n this.reset(a, b);\n this.name = \"Scale\";\n }\n\n\n Proton.Util.inherits(Scale, Proton.Behaviour);\n Scale.prototype.reset = function(a, b, life, easing) {\n if (b == null || b == undefined)\n this._same = true;\n else\n this._same = false;\n\n this.a = Proton.createSpan(Proton.Util.initValue(a, 1));\n this.b = Proton.createSpan(b);\n\n life && Scale._super_.prototype.reset.call(this, life, easing);\n }\n\n Scale.prototype.initialize = function(particle) {\n particle.transform.scaleA = this.a.getValue();\n particle.transform.oldRadius = particle.radius;\n if (this._same)\n particle.transform.scaleB = particle.transform.scaleA;\n else\n particle.transform.scaleB = this.b.getValue();\n\n };\n\n Scale.prototype.applyBehaviour = function(particle, time, index) {\n Scale._super_.prototype.applyBehaviour.call(this, particle, time, index);\n particle.scale = Proton.MathUtils.lerp(particle.transform.scaleA, particle.transform.scaleB, this.energy);\n\n if (particle.scale < 0.0005) particle.scale = 0;\n particle.radius = particle.transform.oldRadius * particle.scale;\n };\n\n Proton.Scale = Scale;\n\n\n\n\n /* The Rotate class is the base\n * for the other Behaviour\n *\n * @class Behaviour * @constructor \n * @example new Proton.Rotate(Proton.createSpan(-1,1),Proton.createSpan(-1,1),Proton.createSpan(-1,1)); \n * @example new Proton.Rotate(); \n * @example new Proton.Rotate(\"random\"); \n */\n\n function Rotate(x, y, z, life, easing) {\n Rotate._super_.call(this, life, easing);\n this.reset(x, y, z);\n this.name = \"Rotate\";\n }\n\n Proton.Util.inherits(Rotate, Proton.Behaviour);\n Rotate.prototype.reset = function(a, b, c, life, easing) {\n this.a = a || 0;\n this.b = b || 0;\n this.c = c || 0;\n\n if (a === undefined || a == \"same\") {\n this._type = \"same\";\n } else if (b == undefined) {\n this._type = \"set\";\n } else if (c === undefined) {\n this._type = \"to\";\n } else {\n this._type = \"add\";\n this.a = Proton.createSpan(this.a * Proton.DR);\n this.b = Proton.createSpan(this.b * Proton.DR);\n this.c = Proton.createSpan(this.c * Proton.DR);\n }\n\n life && Rotate._super_.prototype.reset.call(this, life, easing);\n }\n\n Rotate.prototype.initialize = function(particle) {\n switch (this._type) {\n case \"same\":\n break;\n\n case \"set\":\n this._setRotation(particle.rotation, this.a);\n break;\n\n case \"to\":\n particle.transform.fR = particle.transform.fR || new Proton.Vector3D;\n particle.transform.tR = particle.transform.tR || new Proton.Vector3D;\n this._setRotation(particle.transform.fR, this.a);\n this._setRotation(particle.transform.tR, this.b);\n break;\n\n case \"add\":\n this._setRotation(particle.rotation, new Proton.Vector3D(0,0,Proton.MathUtils.randomAToB(-Proton.PI, Proton.PI)));\n particle.transform.addR = new Proton.Vector3D(this.a.getValue(), this.b.getValue(), this.c.getValue());\n break;\n }\n };\n\n Rotate.prototype._setRotation = function(vec3, value) {\n vec3 = vec3 || new Proton.Vector3D;\n if (value == \"random\") {\n var x = Proton.MathUtils.randomAToB(-Proton.PI, Proton.PI);\n var y = Proton.MathUtils.randomAToB(-Proton.PI, Proton.PI);\n var z = Proton.MathUtils.randomAToB(-Proton.PI, Proton.PI);\n vec3.set(x, y, z);\n } else if (value instanceof Proton.Vector3D) {\n vec3.copy(value);\n }\n };\n\n Rotate.prototype.applyBehaviour = function(particle, time, index) {\n Rotate._super_.prototype.applyBehaviour.call(this, particle, time, index);\n\n switch (this._type) {\n case \"same\":\n if (!particle.rotation) particle.rotation = new Proton.Vector3D;\n particle.rotation.eulerFromDir(particle.v);\n //http://stackoverflow.com/questions/21622956/how-to-convert-direction-vector-to-euler-angles\n //console.log(particle.rotation);\n break;\n\n case \"set\":\n //\n break;\n\n case \"to\":\n particle.rotation.x = Proton.MathUtils.lerp(particle.transform.fR.x, particle.transform.tR.x, this.energy);\n particle.rotation.y = Proton.MathUtils.lerp(particle.transform.fR.y, particle.transform.tR.y, this.energy);\n particle.rotation.z = Proton.MathUtils.lerp(particle.transform.fR.z, particle.transform.tR.z, this.energy);\n break;\n\n case \"add\":\n particle.rotation.add(particle.transform.addR);\n break;\n }\n };\n\n Proton.Rotate = Rotate;\n\n\n\n /**\n * The Scale class is the base for the other Proton.Behaviour\n *\n * @class Proton.Behaviour\n * @constructor\n */\n function Color(a, b, life, easing) {\n Color._super_.call(this, life, easing);\n this.reset(a, b);\n this.name = \"Color\";\n }\n\n\n Proton.Util.inherits(Color, Proton.Behaviour);\n Color.prototype.reset = function(a, b, life, easing) {\n if (b == null || b == undefined)\n this._same = true;\n else\n this._same = false;\n\n this.a = Proton.createArraySpan(a);\n this.b = Proton.createArraySpan(b);\n life && Color._super_.prototype.reset.call(this, life, easing);\n }\n\n Color.prototype.initialize = function(particle) {\n particle.transform.colorA = Proton.ColorUtil.getRGB(this.a.getValue());\n\n particle.useColor = true;\n if (this._same)\n particle.transform.colorB = particle.transform.colorA;\n else\n particle.transform.colorB = Proton.ColorUtil.getRGB(this.b.getValue());\n };\n\n Color.prototype.applyBehaviour = function(particle, time, index) {\n Color._super_.prototype.applyBehaviour.call(this, particle, time, index);\n\n if (!this._same) {\n particle.color.r = Proton.MathUtils.lerp(particle.transform.colorA.r, particle.transform.colorB.r, this.energy) ;\n particle.color.g = Proton.MathUtils.lerp(particle.transform.colorA.g, particle.transform.colorB.g, this.energy) ;\n particle.color.b = Proton.MathUtils.lerp(particle.transform.colorA.b, particle.transform.colorB.b, this.energy) ;\n } else {\n particle.color.r = particle.transform.colorA.r;\n particle.color.g = particle.transform.colorA.g;\n particle.color.b = particle.transform.colorA.b;\n }\n };\n\n\n Proton.Color = Color;\n\n\n\n /**\n * The Behaviour class is the base for the other Behaviour\n *\n * @class Behaviour\n * @constructor\n */\n function Spring(x, y, z, spring, friction, life, easing) {\n Spring._super_.call(this, life, easing);\n Spring.prototype.reset(x, y, z, spring, friction);\n this.name = \"Spring\";\n }\n\n Proton.Util.inherits(Spring, Proton.Behaviour);\n Spring.prototype.reset = function(x, y, z, spring, friction) {\n if (!this.pos)\n this.pos = new Proton.Vector3D(x, y, z);\n else\n this.pos.set(x, y, z);\n this.spring = spring || .1;\n this.friction = friction || .98;\n }\n\n Spring.prototype.applyBehaviour = function(particle, time, index) {\n Spring._super_.prototype.applyBehaviour.call(this, particle, time, index);\n\n particle.v.x += (this.pos.x - particle.p.x) * this.spring;\n particle.v.y += (this.pos.y - particle.p.y) * this.spring;\n particle.v.z += (this.pos.z - particle.p.z) * this.spring;\n\n };\n\n\n Proton.Spring = Spring;\n\n\n\n function Emitter(pObj) {\n this.initializes = [];\n this.particles = [];\n this.behaviours = [];\n this.currentEmitTime = 0;\n this.totalEmitTimes = -1;\n\n /**\n * @property {Number} damping -The friction coefficient for all particle emit by This;\n * @default 0.006\n */\n this.damping = .006;\n /**\n * If bindEmitter the particles can bind this emitter's property;\n * @property bindEmitter\n * @type {Boolean}\n * @default true\n */\n this.bindEmitter = true;\n /**\n * The number of particles per second emit (a [particle]/b [s]);\n * @property rate\n * @type {Rate}\n * @default Rate(1, .1)\n */\n this.rate = new Proton.Rate(1, .1);\n Emitter._super_.call(this, pObj);\n /**\n * The emitter's id;\n * @property id\n * @type {String} id\n */\n this.id = 'emitter_' + Emitter.ID++;\n this.cID = 0;\n this.name = 'Emitter';\n };\n Emitter.ID = 0;\n\n Proton.Util.inherits(Emitter, Proton.Particle);\n Proton.EventDispatcher.initialize(Emitter.prototype);\n\n /**\n * start emit particle\n * @method emit\n * @param {Number} totalEmitTimes total emit times;\n * @param {String} life the life of this emitter\n */\n Emitter.prototype.emit = function(totalEmitTimes, life) {\n this.currentEmitTime = 0;\n this.totalEmitTimes = Proton.Util.initValue(totalEmitTimes, Infinity);\n\n if (life == true || life == 'life' || life == 'destroy') {\n this.life = totalEmitTimes == 'once' ? 1 : this.totalEmitTimes;\n } else if (!isNaN(life)) {\n this.life = life;\n }\n\n this.rate.init();\n };\n\n /**\n * stop emiting\n * @method stopEmit\n */\n Emitter.prototype.stopEmit = function() {\n this.totalEmitTimes = -1;\n this.currentEmitTime = 0;\n };\n\n /**\n * remove current all particles\n * @method removeAllParticles\n */\n Emitter.prototype.removeAllParticles = function() {\n var i = this.particles.length;\n while (i--){\n this.particles[i].dead = true;\n this.particles[i].target.parent.remove(this.particles[i].target);\n }\n };\n\n /**\n * create single particle;\n * \n * can use emit({x:10},new Gravity(10),{'particleUpdate',fun}) or emit([{x:10},new Initialize],new Gravity(10),{'particleUpdate',fun})\n * @method createParticle\n */\n Emitter.prototype.createParticle = function(initialize, behaviour) {\n var particle = this.parent.pool.get(Proton.Particle);\n this.setupParticle(particle, initialize, behaviour);\n this.parent && this.parent.dispatchEvent(\"PARTICLE_CREATED\", particle);\n Proton.bindEmtterEvent && this.dispatchEvent(\"PARTICLE_CREATED\", particle);\n\n return particle;\n };\n /**\n * add initialize to this emitter\n * @method addSelfInitialize\n */\n Emitter.prototype.addSelfInitialize = function(pObj) {\n if (pObj['init']) {\n pObj.init(this);\n } else {\n this.initAll();\n }\n };\n\n\n /**\n * add the Initialize to particles;\n * \n * you can use initializes array:for example emitter.addInitialize(initialize1,initialize2,initialize3);\n * @method addInitialize\n * @param {Initialize} initialize like this new Radius(1, 12)\n */\n Emitter.prototype.addInitialize = function() {\n var i = arguments.length;\n while (i--) this.initializes.push(arguments[i]);\n };\n\n\n /**\n * remove the Initialize\n * @method removeInitialize\n * @param {Initialize} initialize a initialize\n */\n Emitter.prototype.removeInitialize = function(initializer) {\n var index = this.initializes.indexOf(initializer);\n if (index > -1) this.initializes.splice(index, 1);\n };\n\n /**\n * remove all Initializes\n * @method removeInitializers\n */\n Emitter.prototype.removeInitializers = function() {\n Proton.Util.destroyArray(this.initializes);\n };\n /**\n * add the Behaviour to particles;\n * \n * you can use Behaviours array:emitter.addBehaviour(Behaviour1,Behaviour2,Behaviour3);\n * @method addBehaviour\n * @param {Behaviour} behaviour like this new Color('random')\n */\n Emitter.prototype.addBehaviour = function() {\n var i = arguments.length;\n while (i--) this.behaviours.push(arguments[i]);\n };\n /**\n * remove the Behaviour\n * @method removeBehaviour\n * @param {Behaviour} behaviour a behaviour\n */\n Emitter.prototype.removeBehaviour = function(behaviour) {\n var index = this.behaviours.indexOf(behaviour);\n if (index > -1) this.behaviours.splice(index, 1);\n };\n /**\n * remove all behaviours\n * @method removeAllBehaviours\n */\n Emitter.prototype.removeAllBehaviours = function() {\n Proton.Util.destroyArray(this.behaviours);\n };\n\n Emitter.prototype.integrate = function(time) {\n var damping = 1 - this.damping;\n Proton.integrator.integrate(this, time, damping);\n\n var i = this.particles.length;\n while (i--) {\n var particle = this.particles[i];\n particle.update(time, i);\n Proton.integrator.integrate(particle, time, damping);\n\n this.parent && this.parent.dispatchEvent(\"PARTICLE_UPDATE\", particle);\n Proton.bindEmtterEvent && this.dispatchEvent(\"PARTICLE_UPDATE\", particle);\n }\n };\n\n Emitter.prototype.emitting = function(time) {\n if (this.totalEmitTimes == 'once') {\n var i = this.rate.getValue(99999);\n if (i > 0) this.cID = i;\n while (i--) this.createParticle();\n this.totalEmitTimes = 'none';\n\n } else if (!isNaN(this.totalEmitTimes)) {\n this.currentEmitTime += time;\n if (this.currentEmitTime < this.totalEmitTimes) {\n var i = this.rate.getValue(time);\n if (i > 0) this.cID = i;\n while (i--) this.createParticle();\n }\n }\n }\n\n Emitter.prototype.update = function(time) {\n this.age += time;\n if (this.dead || this.age >= this.life) {\n this.destroy();\n }\n\n this.emitting(time);\n this.integrate(time);\n\n var particle, i = this.particles.length;\n while (i--) {\n particle = this.particles[i];\n if (particle.dead) {\n this.parent && this.parent.dispatchEvent(\"PARTICLE_DEAD\", particle);\n Proton.bindEmtterEvent && this.dispatchEvent(\"PARTICLE_DEAD\", particle);\n\n this.parent.pool.expire(particle.reset());\n this.particles.splice(i, 1);\n }\n }\n };\n\n Emitter.prototype.setupParticle = function(particle, initialize, behaviour) {\n var initializes = this.initializes;\n var behaviours = this.behaviours;\n\n if (initialize) {\n if (Proton.Util.isArray(initialize))\n initializes = initialize;\n else\n initializes = [initialize];\n }\n\n if (behaviour) {\n if (Proton.Util.isArray(behaviour))\n behaviours = behaviour;\n else\n behaviours = [behaviour];\n }\n\n Proton.InitializeUtil.initialize(this, particle, initializes);\n particle.addBehaviours(behaviours);\n particle.parent = this;\n this.particles.push(particle);\n };\n\n /**\n * Destory this Emitter\n * @method destroy\n */\n Emitter.prototype.destroy = function() {\n this.dead = true;\n this.energy = 0;\n this.totalEmitTimes = -1;\n\n if (this.particles.length == 0) {\n this.removeInitializers();\n this.removeAllBehaviours();\n\n this.parent && this.parent.removeEmitter(this);\n }\n }\n\n\n Proton.Emitter = Emitter;\n\n\n\n /**\n * The BehaviourEmitter class inherits from Proton.Emitter\n *\n * use the BehaviourEmitter you can add behaviours to self;\n * @class Proton.BehaviourEmitter\n * @constructor\n * @param {Object} pObj the parameters object;\n */\n function BehaviourEmitter(pObj) {\n this.selfBehaviours = [];\n BehaviourEmitter._super_.call(this, pObj);\n };\n\n Proton.Util.inherits(BehaviourEmitter, Proton.Emitter);\n /**\n * add the Behaviour to emitter;\n *\n * you can use Behaviours array:emitter.addSelfBehaviour(Behaviour1,Behaviour2,Behaviour3);\n * @method addSelfBehaviour\n * @param {Proton.Behaviour} behaviour like this new Proton.Color('random')\n */\n BehaviourEmitter.prototype.addSelfBehaviour = function() {\n var length = arguments.length,\n i;\n for (i = 0; i < length; i++) {\n this.selfBehaviours.push(arguments[i]);\n }\n };\n /**\n * remove the Behaviour for self\n * @method removeSelfBehaviour\n * @param {Proton.Behaviour} behaviour a behaviour\n */\n BehaviourEmitter.prototype.removeSelfBehaviour = function(behaviour) {\n var index = this.selfBehaviours.indexOf(behaviour);\n if (index > -1) this.selfBehaviours.splice(index, 1);\n };\n\n BehaviourEmitter.prototype.update = function(time) {\n BehaviourEmitter._super_.prototype.update.call(this, time);\n\n if (!this.sleep) {\n var length = this.selfBehaviours.length,\n i;\n for (i = 0; i < length; i++) {\n this.selfBehaviours[i].applyBehaviour(this, time, i)\n }\n }\n }\n\n Proton.BehaviourEmitter = BehaviourEmitter;\n\n\n\n /**\n * The FollowEmitter class inherits from Proton.Emitter\n *\n * use the FollowEmitter will emit particle when mousemoving\n *\n * @class Proton.FollowEmitter\n * @constructor\n * @param {Element} mouseTarget mouseevent's target;\n * @param {Number} ease the easing of following speed;\n * @default 0.7\n * @param {Object} pObj the parameters object;\n */\n function FollowEmitter(mouseTarget, ease, pObj) {\n this.mouseTarget = Proton.Util.initValue(mouseTarget, window);\n this.ease = Proton.Util.initValue(ease, .7);\n this._allowEmitting = false;\n this.mouse = new Proton.Vector3D();\n this.initEventHandler();\n\n FollowEmitter._super_.call(this, pObj);\n };\n\n Proton.Util.inherits(FollowEmitter, Proton.Emitter);\n FollowEmitter.prototype.initEventHandler = function() {\n var self = this;\n this.mousemoveHandler = function(e) {\n self.mousemove.call(self, e);\n };\n\n this.mousedownHandler = function(e) {\n self.mousedown.call(self, e);\n };\n\n this.mouseupHandler = function(e) {\n self.mouseup.call(self, e);\n };\n \n this.mouseTarget.addEventListener('mousemove', this.mousemoveHandler, false);\n }\n\n /**\n * start emit particle\n * @method emit\n */\n FollowEmitter.prototype.emit = function() {\n this._allowEmitting = true;\n }\n\n /**\n * stop emiting\n * @method stopEmit\n */\n FollowEmitter.prototype.stopEmit = function() {\n this._allowEmitting = false;\n }\n\n FollowEmitter.prototype.setCameraAndCanvas = function(camera, canvas) {\n this.camera = camera;\n this.canvas = canvas;\n }\n\n FollowEmitter.prototype.setCameraAndRenderer = function(camera, renderer) {\n this.camera = camera;\n this.renderer = renderer;\n this.canvas = renderer.domElement;\n }\n\n FollowEmitter.prototype.mousemove = function(e) {\n var rect = this.canvas.getBoundingClientRect();\n var x = e.clientX - rect.left;\n var y = e.clientY - rect.top;\n var ratio = this.renderer? this.renderer.getPixelRatio() : 1;\n x *= ratio;\n y *= ratio;\n\n this.mouse.x += (x - this.mouse.x) * this.ease;\n this.mouse.y += (y - this.mouse.y) * this.ease;\n \n this.p.copy(Proton.THREEUtil.toSpacePos(this.mouse, this.camera, this.canvas, this.renderer));\n\n if (this._allowEmitting){\n FollowEmitter._super_.prototype.emit.call(this, 'once');\n }\n };\n\n /**\n * Destory this Emitter\n * @method destroy\n */\n FollowEmitter.prototype.destroy = function() {\n FollowEmitter._super_.prototype.destroy.call(this);\n this.mouseTarget.removeEventListener('mousemove', this.mousemoveHandler, false);\n }\n\n Proton.FollowEmitter = FollowEmitter;\n\n\n\n /**\n * The Ease class provides a collection of easing functions for use with Proton\n */\n var ease = ease || {\n easeLinear: function(value) {\n return value;\n },\n\n easeInQuad: function(value) {\n return Math.pow(value, 2);\n },\n\n easeOutQuad: function(value) {\n return -(Math.pow((value - 1), 2) - 1);\n },\n\n easeInOutQuad: function(value) {\n if ((value /= 0.5) < 1)\n return 0.5 * Math.pow(value, 2);\n return -0.5 * ((value -= 2) * value - 2);\n },\n\n easeInCubic: function(value) {\n return Math.pow(value, 3);\n },\n\n easeOutCubic: function(value) {\n return (Math.pow((value - 1), 3) + 1);\n },\n\n easeInOutCubic: function(value) {\n if ((value /= 0.5) < 1)\n return 0.5 * Math.pow(value, 3);\n return 0.5 * (Math.pow((value - 2), 3) + 2);\n },\n\n easeInQuart: function(value) {\n return Math.pow(value, 4);\n },\n\n easeOutQuart: function(value) {\n return -(Math.pow((value - 1), 4) - 1);\n },\n\n easeInOutQuart: function(value) {\n if ((value /= 0.5) < 1)\n return 0.5 * Math.pow(value, 4);\n return -0.5 * ((value -= 2) * Math.pow(value, 3) - 2);\n },\n\n easeInSine: function(value) {\n return -Math.cos(value * (Proton.PI / 2)) + 1;\n },\n\n easeOutSine: function(value) {\n return Math.sin(value * (Proton.PI / 2));\n },\n\n easeInOutSine: function(value) {\n return (-0.5 * (Math.cos(Proton.PI * value) - 1));\n },\n\n easeInExpo: function(value) {\n return (value === 0) ? 0 : Math.pow(2, 10 * (value - 1));\n },\n\n easeOutExpo: function(value) {\n return (value === 1) ? 1 : -Math.pow(2, -10 * value) + 1;\n },\n\n easeInOutExpo: function(value) {\n if (value === 0)\n return 0;\n if (value === 1)\n return 1;\n if ((value /= 0.5) < 1)\n return 0.5 * Math.pow(2, 10 * (value - 1));\n return 0.5 * (-Math.pow(2, -10 * --value) + 2);\n },\n\n easeInCirc: function(value) {\n return -(Math.sqrt(1 - (value * value)) - 1);\n },\n\n easeOutCirc: function(value) {\n return Math.sqrt(1 - Math.pow((value - 1), 2));\n },\n\n easeInOutCirc: function(value) {\n if ((value /= 0.5) < 1)\n return -0.5 * (Math.sqrt(1 - value * value) - 1);\n return 0.5 * (Math.sqrt(1 - (value -= 2) * value) + 1);\n },\n\n easeInBack: function(value) {\n var s = 1.70158;\n return (value) * value * ((s + 1) * value - s);\n },\n\n easeOutBack: function(value) {\n var s = 1.70158;\n return (value = value - 1) * value * ((s + 1) * value + s) + 1;\n },\n\n easeInOutBack: function(value) {\n var s = 1.70158;\n if ((value /= 0.5) < 1)\n return 0.5 * (value * value * (((s *= (1.525)) + 1) * value - s));\n return 0.5 * ((value -= 2) * value * (((s *= (1.525)) + 1) * value + s) + 2);\n },\n\n setEasingByName: function(easeName) {\n if (!!ease[easeName])\n return ease[easeName];\n else\n return ease.easeLinear;\n }\n }\n\n\n for (var id in ease) {\n if (id != \"setEasingByName\") Proton[id] = ease[id];\n }\n\n Proton.ease = ease;\n\n\n\n\n\n function BaseRender() { this.name = \"BaseRender\"; }\n\n BaseRender.prototype = {\n init: function(proton) {\n var self = this;\n this.proton = proton;\n \n this.proton.addEventListener(\"PROTON_UPDATE\", function(proton) {\n self.onProtonUpdate.call(self, proton);\n });\n\n this.proton.addEventListener(\"PARTICLE_CREATED\", function(particle) {\n self.onParticleCreated.call(self, particle);\n });\n\n this.proton.addEventListener(\"PARTICLE_UPDATE\", function(particle) {\n self.onParticleUpdate.call(self, particle);\n });\n\n this.proton.addEventListener(\"PARTICLE_DEAD\", function(particle) {\n self.onParticleDead.call(self, particle);\n });\n },\n\n remove: function(proton) {\n // this.proton.removeEventListener(\"PROTON_UPDATE\", this.onProtonUpdate);\n // this.proton.removeEventListener(\"PARTICLE_CREATED\", this.onParticleCreated);\n // this.proton.removeEventListener(\"PARTICLE_UPDATE\", this.onParticleUpdate);\n // this.proton.removeEventListener(\"PARTICLE_DEAD\", this.onParticleDead);\n this.proton = null;\n },\n\n onParticleCreated: function(particle) {\n\n },\n\n onParticleUpdate: function(particle) {\n\n },\n\n onParticleDead: function(particle) {\n\n },\n\n onProtonUpdate: function(proton) {\n\n }\n }\n\n Proton.BaseRender = BaseRender;\n\n\n\n\n function MeshRender(container) {\n MeshRender._super_.call(this);\n this.container = container;\n\n this._targetPool = new Proton.Pool();\n this._materialPool = new Proton.Pool();\n this._body = new THREE.Mesh(\n new THREE.BoxGeometry(50, 50, 50),\n new THREE.MeshLambertMaterial({ color: \"#ff0000\" })\n );\n \n this.name = \"MeshRender\";\n }\n\n Proton.Util.inherits(MeshRender, Proton.BaseRender);\n\n MeshRender.prototype.onProtonUpdate = function() {};\n\n MeshRender.prototype.onParticleCreated = function(particle) {\n if (!particle.target) {\n //set target\n if (!particle.body) particle.body = this._body;\n particle.target = this._targetPool.get(particle.body);\n \n //set material\n if (particle.useAlpha || particle.useColor) {\n particle.target.material.__puid = Proton.PUID.id(particle.body.material);;\n particle.target.material = this._materialPool.get(particle.target.material);\n }\n }\n\n if (particle.target) {\n particle.target.position.copy(particle.p);\n this.container.add(particle.target);\n }\n };\n\n MeshRender.prototype.onParticleUpdate = function(particle) {\n if (particle.target) {\n particle.target.position.copy(particle.p);\n particle.target.rotation.set(particle.rotation.x, particle.rotation.y, particle.rotation.z);\n this.scale(particle);\n\n if (particle.useAlpha) {\n particle.target.material.opacity = particle.alpha;\n particle.target.material.transparent = true;\n }\n\n if (particle.useColor) {\n particle.target.material.color.copy(particle.color);\n }\n }\n };\n\n MeshRender.prototype.scale = function(particle) {\n particle.target.scale.set(particle.scale*particle.radius, particle.scale*particle.radius, particle.scale*particle.radius);\n }\n\n MeshRender.prototype.onParticleDead = function(particle) {\n if (particle.target) {\n if (particle.useAlpha || particle.useColor)\n this._materialPool.expire(particle.target.material);\n\n this._targetPool.expire(particle.target);\n this.container.remove(particle.target);\n particle.target = null;\n }\n };\n\n Proton.MeshRender = MeshRender;\n\n\n\n\n function PointsRender(ps) {\n PointsRender._super_.call(this);\n this.points = ps;\n this.name = \"PointsRender\";\n }\n\n Proton.Util.inherits(PointsRender, Proton.BaseRender);\n\n PointsRender.prototype.onProtonUpdate = function() {\n \n };\n\n PointsRender.prototype.onParticleCreated = function(particle) {\n if (!particle.target) {\n particle.target = new THREE.Vector3();\n }\n\n particle.target.copy(particle.p);\n this.points.geometry.vertices.push(particle.target);\n };\n\n PointsRender.prototype.onParticleUpdate = function(particle) {\n if (particle.target) {\n particle.target.copy(particle.p);\n }\n };\n\n PointsRender.prototype.onParticleDead = function(particle) {\n if (particle.target) {\n var index = this.points.geometry.vertices.indexOf(particle.target);\n if (index > -1)\n this.points.geometry.vertices.splice(index, 1);\n \n particle.target = null;\n }\n };\n\n Proton.PointsRender = PointsRender;\n\n\n\n\n function SpriteRender(container) {\n SpriteRender._super_.call(this, container);\n\n this._body = new THREE.Sprite(new THREE.SpriteMaterial({ color: 0xffffff }));\n this.name = \"SpriteRender\";\n }\n\n Proton.Util.inherits(SpriteRender, Proton.MeshRender);\n\n SpriteRender.prototype.scale = function(particle) {\n particle.target.scale.set(particle.scale * particle.radius, particle.scale * particle.radius, 1);\n };\n\n Proton.SpriteRender = SpriteRender;\n\n\n\n\n function CustomRender() {\n CustomRender._super_.call(this);\n this.targetPool = new Proton.Pool();\n this.materialPool = new Proton.Pool();\n \n this.name = \"CustomRender\";\n }\n\n Proton.Util.inherits(CustomRender, Proton.BaseRender);\n\n CustomRender.prototype.onProtonUpdate = function() {};\n\n CustomRender.prototype.onParticleCreated = function(particle) {\n \n };\n\n CustomRender.prototype.onParticleUpdate = function(particle) {\n \n };\n\n CustomRender.prototype.onParticleDead = function(particle) {\n \n };\n\n Proton.CustomRender = CustomRender;\n\n\n\n /**\n * Zone is a base class.\n * @constructor\n */\n function Zone() {\n this.vector = new Proton.Vector3D(0, 0, 0);\n this.random = 0;\n this.crossType = \"dead\";\n this.log = true;\n }\n\n Zone.prototype = {\n getPosition: function() {\n return null;\n },\n\n crossing: function(particle) {\n switch (this.crossType) {\n case \"bound\":\n this._bound(particle);\n break;\n\n case \"cross\":\n this._cross(particle);\n break;\n\n case \"dead\":\n this._dead(particle);\n break;\n }\n },\n\n _dead: function(particle) {},\n _bound: function(particle) {},\n _cross: function(particle) {},\n };\n\n Proton.Zone = Zone;\n\n\n\n /**\n * LineZone is a 3d line zone\n * @param {Number|Vector3D} x1 - the line's start point of x value or a Vector3D Object\n * @param {Number|Vector3D} y1 - the line's start point of y value or a Vector3D Object\n * @param {Number} z1 - the line's start point of z value \n * @param {Number} x2 - the line's end point of x value \n * @param {Number} y2 - the line's end point of y value \n * @param {Number} z2 - the line's end point of z value \n * @example \n * var lineZone = new Proton.LineZone(0,0,0,100,100,0);\n * or\n * var lineZone = new Proton.LineZone(new Proton.Vector3D(0,0,0),new Proton.Vector3D(100,100,0));\n * @extends {Zone}\n * @constructor\n */\n function LineZone(x1, y1, z1, x2, y2, z2) {\n LineZone._super_.call(this);\n if (x1 instanceof Proton.Vector3D) {\n this.x1 = x1.x;\n this.y1 = x1.y;\n this.z1 = x1.z;\n\n this.x2 = x2.x;\n this.y2 = x2.y;\n this.z2 = x2.z;\n } else {\n this.x1 = x1;\n this.y1 = y1;\n this.z1 = z1;\n\n this.x2 = x2;\n this.y2 = y2;\n this.z2 = z2;\n }\n }\n\n\n Proton.Util.inherits(LineZone, Proton.Zone);\n LineZone.prototype.getPosition = function() {\n this.random = Math.random();\n this.vector.x = this.x1 + this.random * (this.x2 - this.x1);\n this.vector.y = this.y1 + this.random * (this.y2 - this.y1);\n this.vector.z = this.z1 + this.random * (this.z2 - this.z1);\n return this.vector;\n }\n\n LineZone.prototype.crossing = function(particle) {\n if (this.log) {\n console.error('Sorry LineZone does not support crossing method');\n this.log = false;\n }\n }\n\n Proton.LineZone = LineZone;\n\n\n\n /**\n * SphereZone is a sphere zone\n * @param {Number|Vector3D} x - the center's x value or a Vector3D Object\n * @param {Number} y - the center's y value or the Sphere's radius \n * @param {Number} z - the center's z value \n * @param {Number} r - the Sphere's radius \n * @example \n * var sphereZone = new Proton.SphereZone(0,0,0,100);\n * var sphereZone = new Proton.SphereZone(new Proton.Vector3D(0,0,0),100);\n * @extends {Proton.Zone}\n * @constructor\n */\n function SphereZone(a, b, c, d) {\n var x, y, z, r;\n SphereZone._super_.call(this);\n if (Proton.Util.isUndefined(b, c, d)) {\n x = y = z = 0;\n r = (a || 100);\n } else {\n x = a;\n y = b;\n z = c;\n r = d;\n }\n\n this.x = x;\n this.y = x;\n this.z = x;\n this.radius = r;\n this.tha = this.phi = 0;\n }\n\n Proton.Util.inherits(SphereZone, Proton.Zone);\n SphereZone.prototype.getPosition = function() {\n var tha, phi, r;\n return function() {\n this.random = Math.random();\n\n r = this.random * this.radius;\n tha = Proton.PI * Math.random(); //[0-pi]\n phi = Proton.PI * 2 * Math.random(); //[0-2pi]\n\n this.vector.x = this.x + r * Math.sin(tha) * Math.cos(phi);\n this.vector.y = this.y + r * Math.sin(phi) * Math.sin(tha);\n this.vector.z = this.z + r * Math.cos(tha);\n\n return this.vector;\n }\n }();\n\n SphereZone.prototype._dead = function(particle) {\n var d = particle.p.distanceTo(this);\n if (d - particle.radius > this.radius) particle.dead = true;\n }\n\n SphereZone.prototype._bound = function() {\n var normal = new Proton.Vector3D,\n v = new Proton.Vector3D,\n k;\n\n return function(particle) {\n var d = particle.p.distanceTo(this);\n if (d + particle.radius >= this.radius) {\n normal.copy(particle.p).sub(this).normalize();\n v.copy(particle.v);\n k = 2 * v.dot(normal);\n particle.v.sub(normal.scalar(k));\n }\n }\n }();\n\n SphereZone.prototype._cross = function(particle) {\n if (this.log) {\n console.error('Sorry SphereZone does not support _cross method');\n this.log = false;\n }\n }\n\n Proton.SphereZone = SphereZone;\n\n\n\n\n /**\n * MeshZone is a threejs mesh zone\n * @param {Mesh} geometry - a THREE.Mesh object\n * @example \n * var geometry = new THREE.CylinderGeometry( 5, 5, 20, 32 );\n * var cylinder = new THREE.Mesh( geometry, material );\n * var meshZone = new Proton.MeshZone(geometry);\n * or\n * var meshZone = new Proton.MeshZone(cylinder);\n * @extends {Proton.Zone}\n * @constructor\n */\n\n function MeshZone(geometry, scale) {\n MeshZone._super_.call(this);\n \n this.geometry = geometry.geometry.toBufferGeometry();\n\n this.scale = scale || 1;\n }\n\n Proton.Util.inherits(MeshZone, Proton.Zone);\n MeshZone.prototype.getPosition = function() {\n var vertices = this.geometry.vertices;\n var rVector = vertices[(vertices.length * Math.random()) >> 0];\n this.vector.x = rVector.x * this.scale;\n this.vector.y = rVector.y * this.scale;\n this.vector.z = rVector.z * this.scale;\n return this.vector;\n }\n\n MeshZone.prototype.crossing = function(particle) {\n if (this.log) {\n console.error('Sorry MeshZone does not support crossing method');\n this.log = false;\n }\n }\n\n Proton.MeshZone = MeshZone;\n\n\n\n /**\n * PointZone is a point zone\n * @param {Number|Vector3D} x - the center's x value or a Vector3D Object\n * @param {Number} y - the center's y value\n * @param {Number} z - the center's z value \n * @example \n * var pointZone = new Proton.PointZone(0,30,10);\n * or\n * var pointZone = new Proton.PointZone(new Proton.Vector3D(0,30,10));\n * @extends {Zone}\n * @constructor\n */\n function PointZone(a, b, c) {\n var x, y, z;\n PointZone._super_.call(this);\n\n if (Proton.Util.isUndefined(a, b, c)) {\n x = y = z = 0;\n } else {\n x = a;\n y = b;\n z = c;\n }\n\n this.x = x;\n this.y = y;\n this.z = z;\n }\n\n Proton.Util.inherits(PointZone, Proton.Zone);\n PointZone.prototype.getPosition = function() {\n this.vector.x = this.x;\n this.vector.y = this.y;\n this.vector.z = this.z;\n return this.vector;\n }\n\n PointZone.prototype.crossing = function(particle) {\n if (this.log) {\n console.error('Sorry PointZone does not support crossing method');\n this.log = false;\n }\n }\n\n Proton.PointZone = PointZone;\n\n\n\n /**\n * BoxZone is a box zone\n * @param {Number|Proton.Vector3D} x - the position's x value or a Proton.Vector3D Object\n * @param {Number} y - the position's y value \n * @param {Number} z - the position's z value \n * @param {Number} w - the Box's width \n * @param {Number} h - the Box's height \n * @param {Number} d - the Box's depth \n * @example \n * var boxZone = new Proton.BoxZone(0,0,0,50,50,50);\n * or\n * var boxZone = new Proton.BoxZone(new Proton.Proton.Vector3D(0,0,0), 50, 50, 50);\n * @extends {Proton.Zone}\n * @constructor\n */\n function BoxZone(a, b, c, d, e, f) {\n var x, y, z, w, h, d;\n BoxZone._super_.call(this);\n\n if (Proton.Util.isUndefined(b, c, d, e, f)) {\n x = y = z = 0;\n w = h = d = (a || 100);\n } else if (Proton.Util.isUndefined(d, e, f)) {\n x = y = z = 0;\n w = a;\n h = b;\n d = c;\n } else {\n x = a;\n y = b;\n z = c;\n w = d;\n h = e;\n d = f;\n }\n\n this.x = x;\n this.y = y;\n this.z = z;\n this.width = w;\n this.height = h;\n this.depth = d;\n\n //\n this.friction = 0.85;\n this.max = 6;\n }\n\n Proton.Util.inherits(BoxZone, Proton.Zone);\n BoxZone.prototype.getPosition = function() {\n this.vector.x = this.x + Proton.MathUtils.randomAToB(-.5, .5) * this.width;\n this.vector.y = this.y + Proton.MathUtils.randomAToB(-.5, .5) * this.height;\n this.vector.z = this.z + Proton.MathUtils.randomAToB(-.5, .5) * this.depth;\n return this.vector;\n }\n\n BoxZone.prototype._dead = function(particle) {\n if (particle.p.x + particle.radius < this.x - this.width / 2)\n particle.dead = true;\n else if (particle.p.x - particle.radius > this.x + this.width / 2)\n particle.dead = true;\n\n if (particle.p.y + particle.radius < this.y - this.height / 2)\n particle.dead = true;\n else if (particle.p.y - particle.radius > this.y + this.height / 2)\n particle.dead = true;\n\n if (particle.p.z + particle.radius < this.z - this.depth / 2)\n particle.dead = true;\n else if (particle.p.z - particle.radius > this.z + this.depth / 2)\n particle.dead = true;\n }\n\n BoxZone.prototype._bound = function(particle) {\n if (particle.p.x - particle.radius < this.x - this.width / 2) {\n particle.p.x = this.x - this.width / 2 + particle.radius;\n particle.v.x *= -this.friction;\n this._static(particle, \"x\");\n } else if (particle.p.x + particle.radius > this.x + this.width / 2) {\n particle.p.x = this.x + this.width / 2 - particle.radius;\n particle.v.x *= -this.friction;\n this._static(particle, \"x\");\n }\n\n if (particle.p.y - particle.radius < this.y - this.height / 2) {\n particle.p.y = this.y - this.height / 2 + particle.radius;\n particle.v.y *= -this.friction;\n this._static(particle, \"y\");\n } else if (particle.p.y + particle.radius > this.y + this.height / 2) {\n particle.p.y = this.y + this.height / 2 - particle.radius;\n particle.v.y *= -this.friction;\n this._static(particle, \"y\");\n }\n\n if (particle.p.z - particle.radius < this.z - this.depth / 2) {\n particle.p.z = this.z - this.depth / 2 + particle.radius;\n particle.v.z *= -this.friction;\n this._static(particle, \"z\");\n } else if (particle.p.z + particle.radius > this.z + this.depth / 2) {\n particle.p.z = this.z + this.depth / 2 - particle.radius;\n particle.v.z *= -this.friction;\n this._static(particle, \"z\");\n }\n }\n\n BoxZone.prototype._static = function(particle, axis) {\n if (particle.v[axis] * particle.a[axis] > 0) return;\n if (Math.abs(particle.v[axis]) < Math.abs(particle.a[axis]) * 0.0167 * this.max) {\n particle.v[axis] = 0;\n particle.a[axis] = 0;\n }\n }\n\n BoxZone.prototype._cross = function(particle) {\n if (particle.p.x + particle.radius < this.x - this.width / 2 && particle.v.x <= 0)\n particle.p.x = this.x + this.width / 2 + particle.radius;\n else if (particle.p.x - particle.radius > this.x + this.width / 2 && particle.v.x >= 0)\n particle.p.x = this.x - this.width / 2 - particle.radius;\n\n if (particle.p.y + particle.radius < this.y - this.height / 2 && particle.v.y <= 0)\n particle.p.y = this.y + this.height / 2 + particle.radius;\n else if (particle.p.y - particle.radius > this.y + this.height / 2 && particle.v.y >= 0)\n particle.p.y = this.y - this.height / 2 - particle.radius;\n\n if (particle.p.z + particle.radius < this.z - this.depth / 2 && particle.v.z <= 0)\n particle.p.z = this.z + this.depth / 2 + particle.radius;\n else if (particle.p.z - particle.radius > this.z + this.depth / 2 && particle.v.z >= 0)\n particle.p.z = this.z - this.depth / 2 - particle.radius;\n }\n\n Proton.BoxZone = BoxZone;\n\n\n\n /**\n * ScreenZone is a 3d line zone\n * @param {Number|Vector3D} x1 - the line's start point of x value or a Vector3D Object\n * @param {Number|Vector3D} y1 - the line's start point of y value or a Vector3D Object\n * @param {Number} z1 - the line's start point of z value \n * @param {Number} x2 - the line's end point of x value \n * @param {Number} y2 - the line's end point of y value \n * @param {Number} z2 - the line's end point of z value \n * @example \n * var lineZone = new Proton.ScreenZone(0,0,0,100,100,0);\n * or\n * var lineZone = new Proton.ScreenZone(new Proton.Vector3D(0,0,0),new Proton.Vector3D(100,100,0));\n * @extends {Zone}\n * @constructor\n */\n function ScreenZone(camera, renderer, dis, dir) {\n ScreenZone._super_.call(this);\n\n this.camera = camera;\n this.renderer = renderer;\n this.dis = dis || 20;\n dir = dir || \"1234\";\n for (var i = 1; i < 5; i++)\n this[\"d\" + i] = dir.indexOf(i + \"\") >= 0;\n\n this.name = \"ScreenZone\";\n }\n\n\n Proton.Util.inherits(ScreenZone, Proton.Zone);\n ScreenZone.prototype.getPosition = function() {\n var vec2 = new Proton.Vector3D,\n canvas;\n\n return function() {\n canvas = this.renderer.domElement;\n vec2.x = Math.random() * canvas.width;\n vec2.y = Math.random() * canvas.height;\n this.vector.copy(Proton.THREEUtil.toSpacePos(vec2, this.camera, canvas));\n return this.vector;\n }\n }();\n\n ScreenZone.prototype._dead = function(particle) {\n var pos = Proton.THREEUtil.toScreenPos(particle.p, this.camera, this.renderer.domElement);\n var canvas = this.renderer.domElement;\n\n if ((pos.y + particle.radius < -this.dis) && this.d1) {\n particle.dead = true;\n } else if ((pos.y - particle.radius > canvas.height + this.dis) && this.d3) {\n particle.dead = true;\n }\n\n if ((pos.x + particle.radius < -this.dis) && this.d4) {\n particle.dead = true;\n } else if ((pos.x - particle.radius > canvas.width + this.dis) && this.d2) {\n particle.dead = true;\n }\n }\n\n ScreenZone.prototype._cross = function() {\n var vec2 = new Proton.Vector3D;\n return function(particle) {\n var pos = Proton.THREEUtil.toScreenPos(particle.p, this.camera, this.renderer.domElement);\n var canvas = this.renderer.domElement;\n\n if (pos.y + particle.radius < -this.dis) {\n vec2.x = pos.x;\n vec2.y = canvas.height + this.dis + particle.radius;\n particle.p.y = Proton.THREEUtil.toSpacePos(vec2, this.camera, canvas).y;\n } else if (pos.y - particle.radius > canvas.height + this.dis) {\n vec2.x = pos.x;\n vec2.y = -this.dis - particle.radius;\n particle.p.y = Proton.THREEUtil.toSpacePos(vec2, this.camera, canvas).y;\n }\n\n if (pos.x + particle.radius < -this.dis) {\n vec2.y = pos.y;\n vec2.x = canvas.width + this.dis + particle.radius;\n particle.p.x = Proton.THREEUtil.toSpacePos(vec2, this.camera, canvas).x;\n } else if (pos.x - particle.radius > canvas.width + this.dis) {\n vec2.y = pos.y;\n vec2.x = -this.dis - particle.radius;\n particle.p.x = Proton.THREEUtil.toSpacePos(vec2, this.camera, canvas).x;\n }\n }\n }();\n\n ScreenZone.prototype._bound = function(particle) {\n var pos = Proton.THREEUtil.toScreenPos(particle.p, this.camera, this.renderer.domElement);\n var canvas = this.renderer.domElement;\n\n if (pos.y + particle.radius < -this.dis) {\n particle.v.y *= -1;\n } else if (pos.y - particle.radius > canvas.height + this.dis) {\n particle.v.y *= -1;\n }\n\n if (pos.x + particle.radius < -this.dis) {\n particle.v.y *= -1;\n } else if (pos.x - particle.radius > canvas.width + this.dis) {\n particle.v.y *= -1;\n }\n }\n\n Proton.ScreenZone = ScreenZone;\n\n\n/**\n * You can use this emit particles.\n *\n * This method will console.log the fixed number of your info in updata or requestAnimationFrame\n * \n * use like this Proton.log('+12',mc); log 12 times\n *\n * @class Proton.log\n * @constructor\n * @param {*} logInfo;\n */\n\n var log = function() {\n if (window.console && window.console.trace) {\n var arg = Array.prototype.slice.call(arguments);\n var s1 = arguments[0] + \"\";\n if (s1.indexOf('+') == 0) {\n var n = parseInt(arguments[0]);\n if (log.once < n) {\n arg.shift();\n console.trace.apply(console, arg);\n log.once++;\n }\n } else {\n arg.unshift(\"+15\");\n log.apply(console, arg);\n }\n }\n }\n\n log.once = 0;\n Proton.log = log;\n\n\n\n var Debug = Debug || {\n addEventListener: function(proton, fun) {\n proton.addEventListener(\"PROTON_UPDATE\", function(e) {\n fun(e);\n });\n },\n\n drawZone: function(proton, container, zone) {\n var geometry, material, mesh;\n\n if (zone instanceof Proton.PointZone) {\n geometry = new THREE.SphereGeometry(15);\n } else if (zone instanceof Proton.LineZone) {\n\n } else if (zone instanceof Proton.BoxZone) {\n geometry = new THREE.BoxGeometry(zone.width, zone.height, zone.depth);\n } else if (zone instanceof Proton.SphereZone) {\n geometry = new THREE.SphereGeometry(zone.radius, 10, 10);\n } else if (zone instanceof Proton.MeshZone) {\n //There's an error here but not sure what should be done. Leaving it for now.\n geometry = zone.geometry.geometry.toBufferGeometry();\n\n geometry = new THREE.SphereGeometry(zone.radius, 10, 10);\n }\n\n material = new THREE.MeshBasicMaterial({ color: \"#2194ce\", wireframe: true });\n mesh = new THREE.Mesh(geometry, material);\n container.add(mesh);\n\n this.addEventListener(proton, function(e) {\n mesh.position.set(zone.x, zone.y, zone.z);\n });\n },\n\n drawEmitter: function(proton, container, emitter, color) {\n var geometry = new THREE.OctahedronGeometry(15);\n var material = new THREE.MeshBasicMaterial({ color: color || \"#aaa\", wireframe: true });\n var mesh = new THREE.Mesh(geometry, material);\n container.add(mesh);\n\n this.addEventListener(proton, function() {\n mesh.position.copy(emitter.p);\n mesh.rotation.set(emitter.rotation.x, emitter.rotation.y, emitter.rotation.z);\n });\n },\n\n renderInfo: function() {\n function getCreatedNumber(proton, type) {\n var pool = type == \"material\" ? \"_materialPool\" : \"_targetPool\";\n var renderer = proton.renderers[0];\n return renderer[pool].cID;\n }\n\n function getEmitterPos(proton) {\n var e = proton.emitters[0];\n return Math.round(e.p.x) + \",\" + Math.round(e.p.y) + \",\" + Math.round(e.p.z);\n }\n\n return function(proton, style) {\n this.addInfo(style);\n var str = \"\";\n switch (this._infoType) {\n case 2:\n str += \"emitter:\" + proton.emitters.length + \"<br>\";\n str += \"em speed:\" + proton.emitters[0].cID + \"<br>\";\n str += \"pos:\" + getEmitterPos(proton);\n break;\n\n case 3:\n str += proton.renderers[0].name + \"<br>\";\n str += \"target:\" + getCreatedNumber(proton, \"target\") + \"<br>\";\n str += \"material:\" + getCreatedNumber(proton, \"material\");\n break;\n\n default:\n str += \"particles:\" + proton.getCount() + \"<br>\";\n str += \"pool:\" + proton.pool.getCount() + \"<br>\";\n str += \"total:\" + (proton.getCount() + proton.pool.getCount());\n }\n this._infoCon.innerHTML = str;\n }\n }(),\n\n addInfo: function() {\n return function(style) {\n var self = this;\n if (!this._infoCon) {\n this._infoCon = document.createElement('div');\n this._infoCon.style.cssText = [\n 'position:fixed;bottom:0px;left:0;cursor:pointer;',\n 'opacity:0.9;z-index:10000;padding:10px;font-size:12px;',\n 'width:120px;height:50px;background-color:#002;color:#0ff;'\n ].join('');\n\n this._infoType = 1;\n this._infoCon.addEventListener('click', function(event) {\n self._infoType++;\n if (self._infoType > 3) self._infoType = 1;\n }, false);\n\n var bg, color;\n switch (style) {\n case 2:\n bg = \"#201\";\n color = \"#f08\";\n break;\n\n case 3:\n bg = \"#020\";\n color = \"#0f0\";\n break;\n\n default:\n bg = \"#002\";\n color = \"#0ff\";\n }\n\n this._infoCon.style[\"background-color\"] = bg;\n this._infoCon.style[\"color\"] = color;\n }\n\n if (!this._infoCon.parentNode) document.body.appendChild(this._infoCon);\n }\n }()\n }\n\n Proton.Debug = Debug;\n\nexport { Proton };","import { DiceSFX } from '../DiceSFX.js';\nimport * as THREE from 'three';\nimport { Proton } from '../libs/three.proton.js';\nimport { DiceSFXManager } from './../DiceSFXManager';\n\nexport class PlayAnimationParticleSpiral extends DiceSFX {\n static id = \"PlayAnimationParticleSpiral\";\n static specialEffectName = \"DICESONICE.PlayAnimationParticleSpiral\";\n static sprite = null;\n static dot = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAKQWlDQ1BJQ0MgUHJvZmlsZQAAeAGdlndUU9kWh8+9N73QEiIgJfQaegkg0jtIFQRRiUmAUAKGhCZ2RAVGFBEpVmRUwAFHhyJjRRQLg4Ji1wnyEFDGwVFEReXdjGsJ7601896a/cdZ39nnt9fZZ+9917oAUPyCBMJ0WAGANKFYFO7rwVwSE8vE9wIYEAEOWAHA4WZmBEf4RALU/L09mZmoSMaz9u4ugGS72yy/UCZz1v9/kSI3QyQGAApF1TY8fiYX5QKUU7PFGTL/BMr0lSkyhjEyFqEJoqwi48SvbPan5iu7yZiXJuShGlnOGbw0noy7UN6aJeGjjAShXJgl4GejfAdlvVRJmgDl9yjT0/icTAAwFJlfzOcmoWyJMkUUGe6J8gIACJTEObxyDov5OWieAHimZ+SKBIlJYqYR15hp5ejIZvrxs1P5YjErlMNN4Yh4TM/0tAyOMBeAr2+WRQElWW2ZaJHtrRzt7VnW5mj5v9nfHn5T/T3IevtV8Sbsz55BjJ5Z32zsrC+9FgD2JFqbHbO+lVUAtG0GQOXhrE/vIADyBQC03pzzHoZsXpLE4gwnC4vs7GxzAZ9rLivoN/ufgm/Kv4Y595nL7vtWO6YXP4EjSRUzZUXlpqemS0TMzAwOl89k/fcQ/+PAOWnNycMsnJ/AF/GF6FVR6JQJhIlou4U8gViQLmQKhH/V4X8YNicHGX6daxRodV8AfYU5ULhJB8hvPQBDIwMkbj96An3rWxAxCsi+vGitka9zjzJ6/uf6Hwtcim7hTEEiU+b2DI9kciWiLBmj34RswQISkAd0oAo0gS4wAixgDRyAM3AD3iAAhIBIEAOWAy5IAmlABLJBPtgACkEx2AF2g2pwANSBetAEToI2cAZcBFfADXALDIBHQAqGwUswAd6BaQiC8BAVokGqkBakD5lC1hAbWgh5Q0FQOBQDxUOJkBCSQPnQJqgYKoOqoUNQPfQjdBq6CF2D+qAH0CA0Bv0BfYQRmALTYQ3YALaA2bA7HAhHwsvgRHgVnAcXwNvhSrgWPg63whfhG/AALIVfwpMIQMgIA9FGWAgb8URCkFgkAREha5EipAKpRZqQDqQbuY1IkXHkAwaHoWGYGBbGGeOHWYzhYlZh1mJKMNWYY5hWTBfmNmYQM4H5gqVi1bGmWCesP3YJNhGbjS3EVmCPYFuwl7ED2GHsOxwOx8AZ4hxwfrgYXDJuNa4Etw/XjLuA68MN4SbxeLwq3hTvgg/Bc/BifCG+Cn8cfx7fjx/GvyeQCVoEa4IPIZYgJGwkVBAaCOcI/YQRwjRRgahPdCKGEHnEXGIpsY7YQbxJHCZOkxRJhiQXUiQpmbSBVElqIl0mPSa9IZPJOmRHchhZQF5PriSfIF8lD5I/UJQoJhRPShxFQtlOOUq5QHlAeUOlUg2obtRYqpi6nVpPvUR9Sn0vR5Mzl/OX48mtk6uRa5Xrl3slT5TXl3eXXy6fJ18hf0r+pvy4AlHBQMFTgaOwVqFG4bTCPYVJRZqilWKIYppiiWKD4jXFUSW8koGStxJPqUDpsNIlpSEaQtOledK4tE20Otpl2jAdRzek+9OT6cX0H+i99AllJWVb5SjlHOUa5bPKUgbCMGD4M1IZpYyTjLuMj/M05rnP48/bNq9pXv+8KZX5Km4qfJUilWaVAZWPqkxVb9UU1Z2qbapP1DBqJmphatlq+9Uuq43Pp893ns+dXzT/5PyH6rC6iXq4+mr1w+o96pMamhq+GhkaVRqXNMY1GZpumsma5ZrnNMe0aFoLtQRa5VrntV4wlZnuzFRmJbOLOaGtru2nLdE+pN2rPa1jqLNYZ6NOs84TXZIuWzdBt1y3U3dCT0svWC9fr1HvoT5Rn62fpL9Hv1t/ysDQINpgi0GbwaihiqG/YZ5ho+FjI6qRq9Eqo1qjO8Y4Y7ZxivE+41smsImdSZJJjclNU9jU3lRgus+0zwxr5mgmNKs1u8eisNxZWaxG1qA5wzzIfKN5m/krCz2LWIudFt0WXyztLFMt6ywfWSlZBVhttOqw+sPaxJprXWN9x4Zq42Ozzqbd5rWtqS3fdr/tfTuaXbDdFrtOu8/2DvYi+yb7MQc9h3iHvQ732HR2KLuEfdUR6+jhuM7xjOMHJ3snsdNJp9+dWc4pzg3OowsMF/AX1C0YctFx4bgccpEuZC6MX3hwodRV25XjWuv6zE3Xjed2xG3E3dg92f24+ysPSw+RR4vHlKeT5xrPC16Il69XkVevt5L3Yu9q76c+Oj6JPo0+E752vqt9L/hh/QL9dvrd89fw5/rX+08EOASsCegKpARGBFYHPgsyCRIFdQTDwQHBu4IfL9JfJFzUFgJC/EN2hTwJNQxdFfpzGC4sNKwm7Hm4VXh+eHcELWJFREPEu0iPyNLIR4uNFksWd0bJR8VF1UdNRXtFl0VLl1gsWbPkRoxajCCmPRYfGxV7JHZyqffS3UuH4+ziCuPuLjNclrPs2nK15anLz66QX8FZcSoeGx8d3xD/iRPCqeVMrvRfuXflBNeTu4f7kufGK+eN8V34ZfyRBJeEsoTRRJfEXYljSa5JFUnjAk9BteB1sl/ygeSplJCUoykzqdGpzWmEtPi000IlYYqwK10zPSe9L8M0ozBDuspp1e5VE6JA0ZFMKHNZZruYjv5M9UiMJJslg1kLs2qy3mdHZZ/KUcwR5vTkmuRuyx3J88n7fjVmNXd1Z752/ob8wTXuaw6thdauXNu5Tnddwbrh9b7rj20gbUjZ8MtGy41lG99uit7UUaBRsL5gaLPv5sZCuUJR4b0tzlsObMVsFWzt3WazrWrblyJe0fViy+KK4k8l3JLr31l9V/ndzPaE7b2l9qX7d+B2CHfc3em681iZYlle2dCu4F2t5czyovK3u1fsvlZhW3FgD2mPZI+0MqiyvUqvakfVp+qk6oEaj5rmvep7t+2d2sfb17/fbX/TAY0DxQc+HhQcvH/I91BrrUFtxWHc4azDz+ui6rq/Z39ff0TtSPGRz0eFR6XHwo911TvU1zeoN5Q2wo2SxrHjccdv/eD1Q3sTq+lQM6O5+AQ4ITnx4sf4H++eDDzZeYp9qukn/Z/2ttBailqh1tzWibakNml7THvf6YDTnR3OHS0/m/989Iz2mZqzymdLz5HOFZybOZ93fvJCxoXxi4kXhzpXdD66tOTSna6wrt7LgZevXvG5cqnbvfv8VZerZ645XTt9nX297Yb9jdYeu56WX+x+aem172296XCz/ZbjrY6+BX3n+l37L972un3ljv+dGwOLBvruLr57/17cPel93v3RB6kPXj/Mejj9aP1j7OOiJwpPKp6qP6391fjXZqm99Oyg12DPs4hnj4a4Qy//lfmvT8MFz6nPK0a0RupHrUfPjPmM3Xqx9MXwy4yX0+OFvyn+tveV0auffnf7vWdiycTwa9HrmT9K3qi+OfrW9m3nZOjk03dp76anit6rvj/2gf2h+2P0x5Hp7E/4T5WfjT93fAn88ngmbWbm3/eE8/ul8iYiAAAJwUlEQVR4AeWb2Xbktg5F7ZvOzfj/f5p5cLApbfURilKpyu68BGvRAElM55AsD528vvwL8vb29vpImdfX17dH/J/1rb5eHmrsaqETwPfqTYF/KUI+lIAJ6BnY2VryOiNgt/aRZHwIAQ14AjyyAZx7zHcg2zz3NvsjiHgXAQfABXZPA3omAryqX95DBAR8mnVxtnYBOOCTgD43vT6CZV0b7XDdPeZKtbN8wD5LxEMEWKyq23xqgV7RAkgt4Cs647AHEc+QIICe8GZ+AL6D/V8FstZ19+t1j0D/XbnY67r7l8tyex4hoTDdfwIBnCIC0e5AmR8NY1OTp4MRMKD7INZ9NTmUcROYXCXi9AkEeAoj2Tx2B/vVutZ1+pmDfIokdMB/lQNrXZODdcTYZbZ8HURcIeGUgDUjxRAbRycgbADPBvndzxhz1fYGIMEL+M/ax3aQQ9scxtXWEAhhD31XDgmI0yeJxdAC6YDJxRo6R/cjnjwpNOtJCxANATlcSyLM441gPsCD4d4tmBIQ4BO44AFEA4JFf12DXOi0Z0RIoCQIPglI0H9UTuZoBvFo48vc7CSB9btP4YaAi+CJ68D/X2uA71pCjLlHgOAF/HvlxKYegzng8UPSZv4QCTcEkKGks2vTaIF42gB2fLPaaslIEsxljbwBM/AA/m2ti+7xtTSE2HH1S0OCNnW0y9zLjoA4fbwIdFDUE/DkBY0GMOPbsF3rJBBPvk6A7ztPHsCCp9cEb2+1PCRBYmd+3sL082BHwJrIxGgLSgD+efKCBDjju1U7d98Y4gWSDXJi/fQF/2vteYPsxx5r6+Z0AS8Z+RxcI2aTjYB2+jhYxKLeAGI8fQACejaSBP2J9QaQF6FJhjeAK++1T/AZl+QJmBzYamz8NuCzW7ARUI6IoNUdvCfptffUv69YB2Rg521IAqhJ3gRB094ACQA8cdSU/B7XwXcCJKFSDNnIcGEQcHL6NElRGsCXIRhOPwn4oeaMJEISjDFHBzIjQPDESEAnjbiz4UFuwPstILmis5omBW8D3oAE74lLQCcBkvA3llwzAngCfgDy/vEX/Mw/gRPrIL97AD+9BUlA+Q6RAHSSgC9NeZpHJPxYPnkLniGgg6cPBDACRfts0M7dJwYixLPdglrb5FO7/jp38LAKAZIA+CRAwGpvgU/AG0C8t4kaSIICCLdAvzx5T1WA+qqNY04N/KYk5DOgECLwZfZ5TgKGBMxugJ8DPgVJQEvAvfecoGbgIQkC8EvAfGACnPw+H3q17xmu2v78nUECWEQMQJtE8PgyJCFvQZIA6Bz4dQLITQ2kgxPA0T5A/U5BbmyfjD1Ckv0npptn0AmouCkJJJMIih2RABE5aJC5MdTLxmq6EcAJCx4fpJMjeD4kk1gJyHhyJHjy3UgSkM7aNktiCSBGQBKRH4w0ZnOevDobpAYiSAiwadbzzXvtAW6t7IGeGPZp3+JIPW7B+tn3lgRU/CYZYDKTW8wGbEiQrndtg+bbipUh2E6Kb95cs1r2Y3/mTwxZa2cTrCMb2qlNaAG0Rbu20b6eseQzPzU5kT4nHvDmOcrrfs+fNcyNRtTjJpBgJhmELQmpJUJNrmxEO2O0zU9tGhnNrFof41MnYOvpn9r8aupMJQnAOcXg1FnkzLbp7pO5ZvW6/1Ge7ue855/VkOyBNQkQfAZpp8bOQfGcH9nkzz3mCGtI6vSb2Uc1e56ROHI73zSJ/tMyIyCviHZq7Bx8guf8yIbo3GOO9LWcH9lHNc2XutvMN8knQLGUWXG/Xd3T/mjb/bjOZ3W6/1Ge7ud81nPHlPPxbWa3sE56Iguk9nu0mh9WbDh1xvR3TjlrpR925tCmhnXUPY65OdW1NBduAE6Ip2OQ2gI2gbaRrv2FJNf5JPdDizrk7U+v18h47Fne9MnezGX/qa3P2pB8Aq6hM8iEFrGwTfmLib+ZuU7uI/CdkKxh/EzPatmP/ZkrMSS2nZ0EZIC2yUxusWwum5r9JcfTJif1mB8RQH5zm5ecDtfQ+qHtyz7tWxypy72ue/2XaCXTz4B0NhGa5L1BG8s/YM5O3jzkmN2Knh+A5CbvbFg3iaA38lsLnVhqeit5A9jNABMJXJZh3AZt0l+EZuDJKUD3IcEPRPapYR3zA/yXyZCQToL9dSISU6XbiwTghGRTNm7zJLY5CaCZ/EXl3uleJUBiIeDnGBKSJNCLN+EIfLkMkQznL5/Wt9CBd/CejiTQIGAAn6B83xQwh7ESdUYSBDOOCJAMiIAEbwEx9CYB1PQGCxo9JP/J3BvgHjoDTCIICgGAOAdzh0TO4t5LwE9VBwLyFkDAlRuwgS//nSQB6YQNCAABnpNFSwCFPW214I1N0vDnc0LSiOn+nqCAOGHBevJHJNAXg5oOD4F+ctT0swwC2jNgNwNIJBgap0FBqxOMDfhc8PcvOY8SIAmevETkE5AwCaQ+PSeGmi6S15+VvAHMCVKw+y2AZcB6gtgJXrJoAl+a8/S9AX4GkAMhxjhACIg4P+y8Can9DMC/3wBzJgmJrUIW2Qg4uQUkAySg0DQp8A4+gUgAfyD1/V+5AYKBgCTB2yAp7EkWPXnzOvjaWqSfPqsbAasPKpkiGSIBy2z5muC9LfjTTIL3Z4T8juENIpOxADDWeElQe+oJXsIkQQLQ5HaUeSs7AtotIBCxwWW2kKFtcn0kQCCc0Oz0ZwT0WEkgh4DVnrzgPX30FPjs9AGxI4CFVQCUJ0xShDXApST4PMV+8tTK99/zU8N4CZSEmdbHGOId9KSk7dqmbwiIW9ADJYFgirvPOjaaZhieDPkd/qzA6R/dAOPJ7yCXYNMWONra9kI/jtP/bPaGgAr0NyVOSJAsIxRAct1CNkGz5KVZtMDVCb62h5DDeEkQoESgXUsfbGIZ9qI+BV/+h08gScCPhAqFFBu3AUDaJDYEABjbk5eAfAI9j6AE3QG7b90OvsotBzmMky/TG9D8aa7fhl4wAdCcgAGQwDt4SxGfOQQm0K7dn/VBTnJdEk/h0Hn9R0T38TcGLaDUHbBzY1OTV/CpE2C3JSp15sG+e/VHwCP/21wQkQQkGOwkIufdj3lKgk/bE+46fbCRoY++3S0u+6/8Rag3svdoswMS8JoBPFtrmce0g7o3J+hp8CP4UQLWoCRNO7XAcdfOfdYR1wTBmnaCd90156kvXXkCUh6+AS1YACxrX9WZKu0kgPV786eAW/BdBEQSQbN0xe5+zAWKjeR8aj/y1peUt18/hADTxueDS0nG2Zp76ATr+m7tI4BviZ/5DDD4TE/I0H1GinvoHVg3PhK0OUexL0VAFlkL3QO+C/lSgHdFasIT+AcDVfh0vBU3zQAAAABJRU5ErkJggg==\";\n static sound = \"modules/dice-so-nice/sfx/sounds/doublespiral.mp3\";\n\n /**@override init */\n static async init() {\n let map = await this.loadAsset(DiceSFXManager.TextureLoader, PlayAnimationParticleSpiral.dot);\n let material = new THREE.SpriteMaterial({\n map: map,\n color: 0xff0000,\n blending: THREE.CustomBlending,\n blendSrc: THREE.SrcAlphaFactor,\n blendDst: THREE.OneFactor,\n blendEquation: THREE.AddEquation,\n fog: true\n });\n PlayAnimationParticleSpiral.sprite = new THREE.Sprite(material);\n game.audio.pending.push(function(){\n AudioHelper.preloadSound(PlayAnimationParticleSpiral.sound);\n }.bind(this));\n }\n\n /**@override play */\n async play() {\n this.proton = new Proton();\n this.R = 70;\n this.tha = 0;\n this.emitter1 = this.createEmitter(this.R, this.R, '#4F1500', '#0029FF');\n this.emitter2 = this.createEmitter(-this.R, -this.R, '#004CFE', '#6600FF');\n this.proton.addEmitter(this.emitter1);\n this.proton.addEmitter(this.emitter2);\n this.proton.addRender(new Proton.SpriteRender(this.box.scene));\n\n AudioHelper.play({\n src: PlayAnimationParticleSpiral.sound,\n volume: this.volume\n\t\t}, false);\n this.renderReady = true;\n //Proton.Debug.drawZone(proton,scene,zone2);\n //Proton.Debug.drawEmitter(this.proton,this.box.scene,this.emitter);\n }\n\n createEmitter(x, y, color1, color2) {\n var emitter = new Proton.Emitter();\n emitter.rate = new Proton.Rate(new Proton.Span(5, 7), new Proton.Span(.01, .02));\n emitter.addInitialize(new Proton.Mass(1));\n emitter.addInitialize(new Proton.Life(1));\n emitter.addInitialize(new Proton.Body(PlayAnimationParticleSpiral.sprite));\n emitter.addInitialize(new Proton.Radius(30));\n emitter.addInitialize(new Proton.V(200, new Proton.Vector3D(0, 0, -1), 0));\n\n\n emitter.addBehaviour(new Proton.Alpha(1, 0));\n emitter.addBehaviour(new Proton.Color(color1, color2));\n emitter.addBehaviour(new Proton.Scale(1.5, 0.1));\n //emitter.addBehaviour(new Proton.CrossZone(new Proton.ScreenZone(this.box.camera, this.box.renderer), 'dead'));\n\n emitter.addBehaviour(new Proton.Force(0, 0, 17));\n emitter.p.x = this.dicemesh.parent.position.x + x;\n emitter.p.y = this.dicemesh.parent.position.y + y;\n emitter.p.z = 50;\n emitter.emit(0.7,true);\n return emitter;\n }\n\n animateEmitter() {\n this.tha += .2;\n this.emitter1.p.x = this.dicemesh.parent.position.x + this.R * Math.cos(this.tha);\n this.emitter1.p.y = this.dicemesh.parent.position.y + this.R * Math.sin(this.tha);\n\n this.emitter2.p.x = this.dicemesh.parent.position.x - this.R * Math.cos(this.tha);\n this.emitter2.p.y = this.dicemesh.parent.position.y - this.R * Math.sin(this.tha);\n }\n\n render() {\n if(!this.renderReady)\n return;\n this.animateEmitter();\n this.proton.update();\n if(this.proton.emitters.length == 0){\n this.destroy();\n }\n }\n\n destroy(){\n if(this.emitter1){\n this.emitter1.stopEmit();\n this.emitter1.removeAllParticles();\n } \n \n if(this.emitter2){\n this.emitter2.stopEmit();\n this.emitter2.removeAllParticles();\n }\n this.proton.update();\n this.proton.destroy();\n this.destroyed = true;\n }\n}","import { DiceSFX } from '../DiceSFX.js';\nimport * as THREE from 'three';\nimport { Proton } from '../libs/three.proton.js';\nimport { DiceSFXManager } from './../DiceSFXManager';\n\nexport class PlayAnimationParticleSparkles extends DiceSFX {\n static id = \"PlayAnimationParticleSparkles\";\n static specialEffectName = \"DICESONICE.PlayAnimationParticleSparkles\";\n static sprite = null;\n static sound = \"modules/dice-so-nice/sfx/sounds/sparkles.mp3\";\n /**@override init */\n static async init() {\n let map = await this.loadAsset(DiceSFXManager.TextureLoader, \"modules/dice-so-nice/sfx/textures/glow_point_red_gold.webp\");\n let material = new THREE.SpriteMaterial({\n map: map,\n fog: true,\n blending:THREE.AdditiveBlending,\n depthWrite:false,\n depthTest:true\n });\n PlayAnimationParticleSparkles.sprite = new THREE.Sprite(material);\n game.audio.pending.push(function(){\n AudioHelper.preloadSound(PlayAnimationParticleSparkles.sound);\n }.bind(this));\n }\n\n /**@override play */\n async play() {\n this.proton = new Proton();\n this.emitter = new Proton.Emitter();\n this.emitter.rate = new Proton.Rate(new Proton.Span(350, 450), 0.3);\n this.emitter.addInitialize(new Proton.Mass(1,0.3));\n this.emitter.addInitialize(new Proton.Life(1,3));\n this.emitter.addInitialize(new Proton.Body(PlayAnimationParticleSparkles.sprite));\n this.emitter.addInitialize(new Proton.Radius(100,60));\n this.emitter.addInitialize(new Proton.Position(new Proton.SphereZone(0,0,0,30)));\n this.emitter.addInitialize(new Proton.Velocity(200, new Proton.Vector3D(0, 0, 0), 0));\n\n this.emitter.addBehaviour(new Proton.RandomDrift(10,10,5,0.1,Infinity,Proton.easeOutQuart));\n this.emitter.addBehaviour(new Proton.Alpha(1, 0));\n this.emitter.addBehaviour(new Proton.Scale(1, 0.5));\n\n this.emitter.addBehaviour(new Proton.Force(0, 0, 1));\n\n let parent = null;\n if(this.dicemesh.isMesh){\n parent = this.dicemesh.parent;\n } else {\n parent = this.dicemesh.parent.clone();\n delete parent.children[0].geometry;\n }\n\n this.emitter.p.x = parent.position.x;\n this.emitter.p.y = parent.position.y;\n\n let boundingBox = new THREE.Vector3();\n new THREE.Box3().setFromObject(parent).getSize(boundingBox);\n\n this.emitter.p.z = boundingBox.z/2;\n this.emitter.emit('once',true);\n this.proton.addEmitter(this.emitter);\n this.proton.addRender(new Proton.SpriteRender(this.box.scene));\n\n AudioHelper.play({\n src: PlayAnimationParticleSparkles.sound,\n volume: this.volume\n\t\t}, false);\n this.renderReady = true;\n }\n\n render() {\n if(!this.renderReady)\n return;\n this.proton.update();\n if(this.proton.emitters.length == 0){\n this.destroy();\n }\n }\n\n destroy(){\n if(this.emitter){\n this.emitter.stopEmit();\n this.emitter.removeAllParticles();\n }\n this.proton.update();\n this.proton.destroy();\n this.destroyed = true;\n }\n}","import { DiceSFX } from '../DiceSFX.js';\nimport * as THREE from 'three';\nimport { Proton } from '../libs/three.proton.js';\nimport { DiceSFXManager } from './../DiceSFXManager';\n\nexport class PlayAnimationParticleVortex extends DiceSFX {\n static id = \"PlayAnimationParticleVortex\";\n static specialEffectName = \"DICESONICE.PlayAnimationParticleVortex\";\n static sprite = null;\n static sound = \"modules/dice-so-nice/sfx/sounds/vortex.mp3\";\n /**@override init */\n static async init() {\n let map = await this.loadAsset(DiceSFXManager.TextureLoader, \"modules/dice-so-nice/sfx/textures/magic01.webp\");\n let material = new THREE.MeshBasicMaterial({\n map: map,\n blending:THREE.NormalBlending,\n depthWrite:false,\n depthTest:true,\n transparent:true\n });\n let geometry = new THREE.PlaneGeometry(140,140);\n PlayAnimationParticleVortex.sprite = new THREE.Mesh(geometry,material);\n \n game.audio.pending.push(function(){\n AudioHelper.preloadSound(PlayAnimationParticleVortex.sound);\n }.bind(this));\n }\n\n /**@override play */\n async play() {\n this.proton = new Proton();\n this.emitter = new Proton.Emitter();\n this.emitter.rate = new Proton.Rate(new Proton.Span(6, 8), new Proton.Span(.1, .25));\n this.emitter.addInitialize(new Proton.Mass(1));\n this.emitter.addInitialize(new Proton.Life(0.8,2.4));\n this.emitter.addInitialize(new Proton.Body(PlayAnimationParticleVortex.sprite));\n this.emitter.addInitialize(new Proton.Velocity(50, new Proton.Vector3D(0,0,1), 0));\n let scale = this.box.dicefactory.baseScale/100;\n switch (this.dicemesh.shape) {\n case \"d2\":\n scale *= 1.3;\n break;\n case \"d4\":\n scale *= 1.2;\n break;\n case \"d6\":\n break;\n case \"d8\":\n scale *= 1.2;\n break;\n case \"d10\":\n break;\n case \"d12\":\n scale *= 1.3;\n break;\n case \"d20\":\n scale *= 1.4;\n break;\n }\n this.emitter.addInitialize(new Proton.Radius(scale));\n\n this.emitter.addBehaviour(new Proton.Color(['#1f0e26','#462634','#290088'],'#060206'));\n this.emitter.addBehaviour(new Proton.Alpha(0.7, 0, Infinity, Proton.easeInQuart));\n this.emitter.addBehaviour(new Proton.Scale(0.7, 1.3, Infinity, Proton.easeInSine));\n this.emitter.addBehaviour(new Proton.Rotate(0,0,-3));\n\n this.emitter.p.x = this.dicemesh.parent.position.x;\n this.emitter.p.y = this.dicemesh.parent.position.y;\n\n this.emitter.p.z = -5;\n this.emitter.emit(1.25,true);\n\n this.proton.addEmitter(this.emitter);\n this.proton.addRender(new Proton.MeshRender(this.box.scene));\n\n AudioHelper.play({\n src: PlayAnimationParticleVortex.sound,\n volume: this.volume\n\t\t}, false);\n this.renderReady = true;\n }\n\n render() {\n if(!this.renderReady)\n return;\n this.proton.update();\n if(this.proton.emitters.length == 0){\n this.destroy();\n }\n }\n\n destroy(){\n if(this.emitter){\n this.emitter.stopEmit();\n this.emitter.removeAllParticles();\n }\n this.proton.update();\n this.proton.destroy();\n this.destroyed = true;\n }\n}","import { DiceSFX } from '../DiceSFX.js';\nimport * as THREE from 'three';\nimport { ShaderUtils } from './../ShaderUtils';\n\nexport class PlayAnimationBright extends DiceSFX {\n static id = \"PlayAnimationBright\";\n static specialEffectName = \"DICESONICE.PlayAnimationBright\";\n static brightColor = null;\n static duration = 0.6;\n static sound = \"modules/dice-so-nice/sfx/sounds/bright.mp3\";\n /**@override init */\n static async init() {\n PlayAnimationBright.brightColor = new THREE.Color(0.3,0.3,0.3);\n this.glowingMesh=null;\n game.audio.pending.push(function(){\n AudioHelper.preloadSound(PlayAnimationBright.sound);\n }.bind(this));\n }\n\n /**@override play */\n async play() {\n \n if(!this.dicemesh.material && this.dicemesh.userData.glow){\n //We check if there's a glow target specified\n this.dicemesh.traverse(object => {\n if (object.userData && object.userData.name && object.userData.name === this.dicemesh.userData.glow) this.glowingMesh=object;\n });\n } else if(this.dicemesh.material){\n this.glowingMesh=this.dicemesh;\n } else {\n return false;\n }\n if(!this.glowingMesh.material.emissiveMap)\n return false;\n this.clock = new THREE.Clock();\n this.baseColor = this.glowingMesh.material.emissive.clone();\n this.baseMaterial = this.glowingMesh.material;\n this.glowingMesh.material = this.baseMaterial.clone();\n this.glowingMesh.material.onBeforeCompile = ShaderUtils.applyDiceSoNiceShader;\n AudioHelper.play({\n src: PlayAnimationBright.sound,\n volume: this.volume\n\t\t}, false);\n this.renderReady = true;\n }\n\n render() {\n if(!this.renderReady)\n return;\n let x = 1-((PlayAnimationBright.duration - this.clock.getElapsedTime())/PlayAnimationBright.duration);\n if(x>1){\n this.destroy();\n } else {\n let val = (Math.sin(2 * Math.PI * (x - 1/4)) + 1) / 2;\n this.glowingMesh.material.emissive.copy(this.baseColor);\n this.glowingMesh.material.emissive.lerp(PlayAnimationBright.brightColor, val);\n }\n }\n\n destroy(){\n let sfxMaterial = this.glowingMesh.material;\n this.glowingMesh.material = this.baseMaterial;\n sfxMaterial.dispose();\n this.destroyed = true;\n }\n}","import { DiceSFX } from '../DiceSFX.js';\nimport * as THREE from 'three';\nimport { ShaderUtils } from './../ShaderUtils';\n\nexport class PlayAnimationDark extends DiceSFX {\n static id = \"PlayAnimationDark\";\n static specialEffectName = \"DICESONICE.PlayAnimationDark\";\n static darkColor = null;\n static duration = 1.5;\n static sound = \"modules/dice-so-nice/sfx/sounds/darkness.mp3\";\n /**@override init */\n static async init() {\n PlayAnimationDark.darkColor = new THREE.Color(0.1,0.1,0.1);\n game.audio.pending.push(function(){\n AudioHelper.preloadSound(PlayAnimationDark.sound);\n }.bind(this));\n }\n\n /**@override play */\n async play() {\n if(!this.dicemesh.material && this.dicemesh.userData.glow){\n //We check if there's a glow target specified\n this.dicemesh.traverse(object => {\n if (object.userData && object.userData.name && object.userData.name === this.dicemesh.userData.glow) this.glowingMesh=object;\n });\n } else if(this.dicemesh.material){\n this.glowingMesh=this.dicemesh;\n } else {\n return false;\n }\n this.clock = new THREE.Clock();\n this.baseColor = this.glowingMesh.material.color.clone();\n this.baseMaterial = this.glowingMesh.material;\n this.glowingMesh.material = this.baseMaterial.clone();\n this.glowingMesh.material.onBeforeCompile = ShaderUtils.applyDiceSoNiceShader;\n AudioHelper.play({\n\t\t\tsrc: PlayAnimationDark.sound,\n volume: this.volume\n\t\t}, false);\n this.renderReady = true;\n }\n\n render() {\n if(!this.renderReady)\n return;\n let x = 1-((PlayAnimationDark.duration - this.clock.getElapsedTime())/PlayAnimationDark.duration);\n if(x>1){\n this.destroy();\n } else {\n let val = 0.05172144 + 9.269017*x - 26.55545*x**2 + 26.19969*x**3 - 8.977907*x**4;\n val = Math.min(Math.max(val, 0), 1);\n this.glowingMesh.material.color.copy(this.baseColor);\n this.glowingMesh.material.color.lerp(PlayAnimationDark.darkColor, val);\n }\n }\n\n destroy(){\n let sfxMaterial = this.glowingMesh.material;\n this.glowingMesh.material = this.baseMaterial;\n sfxMaterial.dispose();\n this.destroyed = true;\n }\n}","import { DiceSFX } from '../DiceSFX.js';\nimport * as THREE from 'three';\nimport { DiceSFXManager } from './../DiceSFXManager';\nimport { ShaderUtils } from './../ShaderUtils';\n\n\nexport class PlayAnimationThormund extends DiceSFX {\n static id = \"PlayAnimationThormund\";\n static specialEffectName = \"DICESONICE.PlayAnimationThormund\";\n static file = \"modules/dice-so-nice/sfx/models/thormund.glb\";\n static sound = \"modules/dice-so-nice/sfx/sounds/thormund.mp3\";\n static model = null;\n static curve = null;\n static duration1 = 2.5;\n static duration2 = 2.5;\n static up = new THREE.Vector3(0,0,1);\n /**@override init */\n static async init() {\n game.audio.pending.push(function(){\n AudioHelper.preloadSound(PlayAnimationThormund.sound);\n }.bind(this));\n\n let gltf = await this.loadAsset(DiceSFXManager.GLTFLoader, PlayAnimationThormund.file);\n gltf.scene.traverse(function (node) {\n if (node.isMesh) {\n node.castShadow = true; \n node.material.onBeforeCompile = ShaderUtils.applyDiceSoNiceShader;\n }\n });\n PlayAnimationThormund.model = gltf.scene.children[0];\n }\n\n /**@override play */\n async play() {\n this.step = 1;\n this.clock = new THREE.Clock();\n this.thormund = PlayAnimationThormund.model.clone();\n let scale = this.box.dicefactory.baseScale/100;\n\n let boundingBox = new THREE.Vector3();\n let parent = null;\n if(this.dicemesh.isMesh){\n parent = this.dicemesh.parent;\n } else {\n parent = this.dicemesh.parent.clone();\n delete parent.children[0].geometry;\n }\n new THREE.Box3().setFromObject(parent).getSize(boundingBox);\n \n\t\tthis.thormund.scale.set(scale,scale,scale);\n this.thormund.rotation.x = Math.PI/2;\n this.thormund.position.x = parent.position.x;\n this.thormund.position.y = parent.position.y;\n this.thormund.position.z = parent.position.z + (boundingBox.z/2);\n\n this.curve = new THREE.CatmullRomCurve3( [\n new THREE.Vector3( this.thormund.position.x, this.thormund.position.y,-50),\n new THREE.Vector3( this.thormund.position.x +0, this.thormund.position.y -100, this.thormund.position.z +0 ),\n new THREE.Vector3( this.thormund.position.x +100, this.thormund.position.y -30, this.thormund.position.z +0 ),\n new THREE.Vector3( this.thormund.position.x +100, this.thormund.position.y +30, this.thormund.position.z +0 ),\n new THREE.Vector3( this.thormund.position.x +30, this.thormund.position.y +100, this.thormund.position.z +0 ),\n new THREE.Vector3( this.thormund.position.x -30, this.thormund.position.y +100, this.thormund.position.z +0 ),\n new THREE.Vector3( this.thormund.position.x -100, this.thormund.position.y +30, this.thormund.position.z +80 ),\n new THREE.Vector3( this.thormund.position.x /2, this.thormund.position.y /2, this.thormund.position.z +100 )\n ],false,\"chordal\");\n\n this.curve2 = new THREE.CatmullRomCurve3([\n new THREE.Vector3( this.thormund.position.x /2, this.thormund.position.y /2, this.thormund.position.z +100 ),\n new THREE.Vector3( 100, 50, this.box.camera.position.z/4 ),\n new THREE.Vector3( -100, -50, this.box.camera.position.z/4*2 ),\n new THREE.Vector3( 0, -50, this.box.camera.position.z/4*3 ),\n new THREE.Vector3( 0, 0, this.box.camera.position.z )\n ],false,\"chordal\");\n\n this.axis = new THREE.Vector3();\n this.box.scene.add(this.thormund);\n AudioHelper.play({\n src: PlayAnimationThormund.sound,\n volume: this.volume\n\t\t}, false);\n this.renderReady = true;\n }\n\n render() {\n if(!this.renderReady)\n return;\n let duration = this.step == 1? PlayAnimationThormund.duration1:PlayAnimationThormund.duration2;\n let x = 1-((duration - this.clock.getElapsedTime())/duration);\n if(x>1){\n if(this.step == 1){\n this.step++;\n x = 0;\n this.clock.start();\n this.render();\n }\n else\n this.destroy();\n } else {\n let curve = this.step==1?this.curve:this.curve2;\n let p = curve.getPointAt(x);\n let t = curve.getTangentAt(x).normalize();\n this.axis.crossVectors(PlayAnimationThormund.up, t).normalize();\n let radians = Math.acos(PlayAnimationThormund.up.dot(t));\n\n this.thormund.position.copy(p);\n this.thormund.quaternion.setFromAxisAngle(this.axis,radians);\n }\n }\n\n destroy(){\n this.box.scene.remove(this.thormund);\n this.destroyed = true;\n }\n}","import { DiceSFX } from '../DiceSFX.js';\nimport * as THREE from 'three';\nimport { DiceSFXManager } from './../DiceSFXManager';\n\nexport class PlayAnimationImpact extends DiceSFX {\n static id = \"PlayAnimationImpact\";\n static specialEffectName = \"DICESONICE.PlayAnimationImpact\";\n static sound = \"modules/dice-so-nice/sfx/sounds/hit_glass.mp3\";\n static planeImpact = null;\n static duration = 0.1;\n /**@override constructor */\n constructor(box, dicemesh){\n super(box, dicemesh);\n this.enableGC = true;\n }\n /**@override init */\n static async init() {\n game.audio.pending.push(function () {\n AudioHelper.preloadSound(PlayAnimationImpact.sound);\n }.bind(this));\n \n let data = await this.loadAsset(DiceSFXManager.TextureLoader, \"modules/dice-so-nice/sfx/textures/glassimpact_color.webp\");\n const geometry = new THREE.PlaneGeometry(730, 730);\n const material = new THREE.MeshStandardMaterial({\n map: data,\n transparent: true,\n opacity: 2\n });\n PlayAnimationImpact.planeImpact = new THREE.Mesh(geometry, material);\n }\n\n /**@override play */\n async play() {\n this.clock = new THREE.Clock();\n this.plane = PlayAnimationImpact.planeImpact.clone();\n this.plane.receiveShadow = this.box.shadows;\n\n let scale = this.box.dicefactory.baseScale / 100;\n switch (this.dicemesh.shape) {\n case \"d2\":\n scale *= 1.3;\n break;\n case \"d4\":\n scale *= 1.1;\n break;\n case \"d6\":\n break;\n case \"d8\":\n scale *= 1.1;\n break;\n case \"d10\":\n break;\n case \"d12\":\n scale *= 1.2;\n break;\n case \"d20\":\n scale *= 1.3;\n break;\n }\n this.plane.scale.set(scale, scale, scale);\n\n this.plane.position.x = this.dicemesh.parent.position.x;\n this.plane.position.y = this.dicemesh.parent.position.y;\n this.plane.rotation.z = Math.random() * Math.PI * 2;\n this.box.scene.add(this.plane);\n AudioHelper.play({\n src: PlayAnimationImpact.sound,\n volume: this.volume\n }, false);\n this.dicemesh.position.z -= 1;\n\n }\n\n destroy() {\n this.box.scene.remove(this.plane);\n this.destroyed = true;\n }\n}","import * as THREE from 'three';\nimport { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';\n\nimport { PlaySoundEpicFail } from './sfx/PlaySoundEpicFail.js';\nimport { PlaySoundEpicWin } from './sfx/PlaySoundEpicWin.js';\nimport { PlaySoundCustom } from './sfx/PlaySoundCustom.js';\nimport { PlayConfettiStrength1 } from './sfx/PlayConfettiStrength1.js';\nimport { PlayConfettiStrength2 } from './sfx/PlayConfettiStrength2.js';\nimport { PlayConfettiStrength3 } from './sfx/PlayConfettiStrength3.js';\nimport { PlayAnimationParticleSpiral } from './sfx/PlayAnimationParticleSpiral.js';\nimport { PlayAnimationParticleSparkles } from './sfx/PlayAnimationParticleSparkles.js';\nimport { PlayAnimationParticleVortex } from './sfx/PlayAnimationParticleVortex.js';\nimport { PlayAnimationBright } from './sfx/PlayAnimationBright.js';\nimport { PlayAnimationDark } from './sfx/PlayAnimationDark.js';\nimport { PlayAnimationThormund } from './sfx/PlayAnimationThormund.js';\nimport { PlayAnimationImpact } from './sfx/PlayAnimationImpact.js';\nimport { PlayMacro } from './sfx/PlayMacro.js';\nimport { PlayAnimationOutline } from './sfx/PlayAnimationOutline.js';\n\nexport const DiceSFXManager = {\n SFX_MODE_CLASS : {\n \"PlayAnimationBright\": PlayAnimationBright,\n \"PlayAnimationDark\": PlayAnimationDark,\n \"PlayAnimationOutline\": PlayAnimationOutline,\n \"PlayAnimationImpact\": PlayAnimationImpact,\n \"PlayConfettiStrength1\": PlayConfettiStrength1,\n \"PlayConfettiStrength2\": PlayConfettiStrength2,\n \"PlayConfettiStrength3\": PlayConfettiStrength3,\n \"PlayAnimationThormund\": PlayAnimationThormund,\n \"PlayAnimationParticleSpiral\": PlayAnimationParticleSpiral,\n \"PlayAnimationParticleSparkles\": PlayAnimationParticleSparkles,\n \"PlayAnimationParticleVortex\": PlayAnimationParticleVortex,\n \"PlaySoundEpicWin\": PlaySoundEpicWin,\n \"PlaySoundEpicFail\": PlaySoundEpicFail,\n \"PlaySoundCustom\": PlaySoundCustom,\n \"PlayMacro\": PlayMacro\n },\n SFX_MODE_LIST : null,\n SFX_CLASS : {},\n EXTRA_TRIGGER_TYPE : [],\n EXTRA_TRIGGER_RESULTS : {},\n renderQueue : [],\n garbageCollector : [],\n GLTFLoader : null,\n TextureLoader: null,\n init : function(){\n if(!DiceSFXManager.SFX_MODE_LIST){\n DiceSFXManager.SFX_MODE_LIST = {};\n Object.values(DiceSFXManager.SFX_MODE_CLASS).forEach((sfx)=>{\n if(sfx.id.startsWith(\"PlayConfettiStrength\") && (!game.modules.get(\"confetti\") || !game.modules.get(\"confetti\").active))\n return;\n DiceSFXManager.SFX_MODE_LIST[sfx.id] = sfx.specialEffectName;\n });\n }\n\n DiceSFXManager.GLTFLoader = new GLTFLoader();\n DiceSFXManager.TextureLoader = new THREE.TextureLoader();\n\n let sfxUniqueList = [];\n game.users.forEach((user) => {\n let sfxList = user.getFlag(\"dice-so-nice\", \"sfxList\");\n if(sfxList){\n Object.values(sfxList).forEach((line) => {\n if(line.specialEffect && !Array.isArray(line.specialEffect)){\n sfxUniqueList.push(line.specialEffect);\n } \n });\n }\n });\n //remove duplicate\n sfxUniqueList = sfxUniqueList.filter((v, i, a) => a.indexOf(v) === i);\n\n //for each possible sfx, initialize\n sfxUniqueList.forEach((sfxClassName) => {\n if(sfxClassName.startsWith(\"PlayConfettiStrength\") && (!game.modules.get(\"confetti\") || !game.modules.get(\"confetti\").active))\n return;\n DiceSFXManager.addSFXMode(DiceSFXManager.SFX_MODE_CLASS[sfxClassName]);\n });\n },\n addSFXMode : async function(sfx){\n if(sfx.id && sfx.specialEffectName && !sfx.initialized){\n DiceSFXManager.SFX_CLASS[sfx.id] = sfx;\n sfx.initialized = true;\n await sfx.init();\n }\n },\n playSFX : async function(sfx, box, dicemesh){\n let id = sfx.specialEffect;\n return new Promise(async (resolve)=>{\n if(!DiceSFXManager.SFX_CLASS[id]){\n if(DiceSFXManager.SFX_MODE_CLASS[id]){\n await DiceSFXManager.addSFXMode(DiceSFXManager.SFX_MODE_CLASS[id]);\n } else {\n return;\n }\n }\n \n let sfxInstance = new DiceSFXManager.SFX_CLASS[id](box, dicemesh, sfx.options);\n\n sfxInstance.play(sfx.options).then(result => {\n if(result !== false){\n if(typeof sfxInstance.render === 'function')\n DiceSFXManager.renderQueue.push(sfxInstance);\n if(sfxInstance.enableGC)\n DiceSFXManager.garbageCollector.push(sfxInstance);\n }\n resolve();\n });\n });\n },\n renderSFX : function(){\n let queue = [...DiceSFXManager.renderQueue];\n for(let i =0;i<queue.length;i++){\n let sfxInstance = queue[i];\n if(sfxInstance.destroyed){\n DiceSFXManager.endSFX(sfxInstance);\n } else {\n if(typeof sfxInstance.render === 'function')\n sfxInstance.render();\n }\n }\n },\n endSFX : function(sfxInstance){\n let index = DiceSFXManager.renderQueue.indexOf(sfxInstance);\n if(index !== -1)\n DiceSFXManager.renderQueue.splice(index, 1);\n if(DiceSFXManager.renderQueue.length == 0)\n game.dice3d._afterShow();\n },\n clearQueue : function(){\n let queue = [...DiceSFXManager.renderQueue];\n for(let i =0;i<queue.length;i++){\n let sfxInstance = queue[i];\n if(typeof sfxInstance.destroy === 'function')\n sfxInstance.destroy();\n DiceSFXManager.endSFX(sfxInstance);\n }\n //For animations that do not have a render loop but still require some cleaning\n for(let i = 0;i<DiceSFXManager.garbageCollector.length;i++){\n DiceSFXManager.garbageCollector[i].destroy();\n }\n DiceSFXManager.garbageCollector = [];\n }\n}","import { DiceSFX } from '../DiceSFX.js';\n\nexport class PlayAnimationOutline extends DiceSFX {\n static id = \"PlayAnimationOutline\";\n static specialEffectName = \"DICESONICE.PlayAnimationOutline\";\n\n /**@override play */\n async play() {\n this.box.outlinePass.selectedObjects.push(this.dicemesh);\n }\n\n destroy(){\n this.box.outlinePass.selectedObjects = this.box.outlinePass.selectedObjects.filter(obj => obj != this.dicemesh);\n this.destroyed = true;\n }\n}","import { DiceSFX } from '../DiceSFX.js';\n\nexport class PlayConfettiStrength1 extends DiceSFX {\n static id = \"PlayConfettiStrength1\";\n static specialEffectName = \"DICESONICE.PlayConfettiStrength1\";\n\n /**@override play */\n async play(){\n const strength = window.confetti.confettiStrength.low;\n const shootConfettiProps = window.confetti.getShootConfettiProps(strength);\n\n window.confetti.handleShootConfetti(shootConfettiProps);\n }\n}","import { DiceSFX } from '../DiceSFX.js';\n\nexport class PlayConfettiStrength2 extends DiceSFX {\n static id = \"PlayConfettiStrength2\";\n static specialEffectName = \"DICESONICE.PlayConfettiStrength2\";\n\n /**@override play */\n async play(){\n const strength = window.confetti.confettiStrength.med;\n const shootConfettiProps = window.confetti.getShootConfettiProps(strength);\n\n window.confetti.handleShootConfetti(shootConfettiProps);\n }\n}","import { DiceSFX } from '../DiceSFX.js';\n\nexport class PlayConfettiStrength3 extends DiceSFX {\n static id = \"PlayConfettiStrength3\";\n static specialEffectName = \"DICESONICE.PlayConfettiStrength3\";\n\n /**@override play */\n async play(){\n const strength = window.confetti.confettiStrength.high;\n const shootConfettiProps = window.confetti.getShootConfettiProps(strength);\n\n window.confetti.handleShootConfetti(shootConfettiProps);\n }\n}","import { DiceSFX } from '../DiceSFX.js';\n\n/**\n * Options needed: path\n */\nexport class PlaySoundCustom extends DiceSFX {\n static id = \"PlaySoundCustom\";\n static specialEffectName = \"DICESONICE.PlaySoundCustom\";\n\n /**@override play */\n async play(options){\n if(options && options.path){\n AudioHelper.play({\n src: options.path,\n volume: this.volume\n }, false);\n }\n }\n\n static getDialogContent(sfxLine,id){\n let dialogContent = super.getDialogContent(sfxLine,id);\n\n dialogContent.content = dialogContent.content.concat(`<div class=\"form-group\">\n <label>{{localize \"DICESONICE.sfxOptionsCustomSound\"}}</label>\n <div class=\"form-fields\">\n <button type=\"button\" class=\"file-picker\" data-type=\"audio\" data-target=\"sfxLine[{{id}}][options][path]\" title=\"Browse Files\" tabindex=\"-1\">\n <i class=\"fas fa-file-import fa-fw\"></i>\n </button>\n <input class=\"image\" type=\"text\" name=\"sfxLine[{{id}}][options][path]\" placeholder=\"path/audio.mp3\" value=\"{{path}}\">\n </div>\n </div>`);\n\n dialogContent.data.path = sfxLine.options ? sfxLine.options.path:\"\";\n return dialogContent;\n }\n}","import { DiceSFX } from '../DiceSFX.js';\n\n/**\n * Options needed: macro ID\n */\nexport class PlayMacro extends DiceSFX {\n static id = \"PlayMacro\";\n static specialEffectName = \"DICESONICE.PlayMacro\";\n\n /**@override play */\n async play(options){\n let macro = game.macros.get(options.macroId);\n if(macro)\n macro.execute();\n }\n\n static getDialogContent(sfxLine,id){\n let dialogContent = super.getDialogContent(sfxLine,id);\n\n dialogContent.content = dialogContent.content.concat(`<div class=\"form-group\">\n <label>{{localize \"DICESONICE.sfxOptionsMacro\"}}</label>\n <div class=\"form-fields\">\n <select name=\"sfxLine[{{id}}][options][macroId]\">\n {{selectOptions macroList nameAttr=\"id\" labelAttr=\"name\" selected=macroId}}\n </select>\n </div>\n </div>`);\n\n let permissionLevel = CONST.DOCUMENT_PERMISSION_LEVELS ? CONST.DOCUMENT_PERMISSION_LEVELS.OBSERVER : CONST.ENTITY_PERMISSIONS.OBSERVER;\n \n dialogContent.data.macroList = game.macros.filter(macro => macro.testUserPermission(game.user, permissionLevel)).map(macro => {return {id:macro.id,name:macro.name}});\n \n dialogContent.data.macroList.sort((a, b) => a.name > b.name && 1 || -1);\n dialogContent.data.macroId = sfxLine.options?sfxLine.options.macroId:null;\n return dialogContent;\n }\n}","import {\n\tDataTextureLoader,\n\tDataUtils,\n\tFloatType,\n\tHalfFloatType,\n\tLinearEncoding,\n\tLinearFilter\n} from 'three';\n\n// https://github.com/mrdoob/three.js/issues/5552\n// http://en.wikipedia.org/wiki/RGBE_image_format\n\nclass RGBELoader extends DataTextureLoader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.type = HalfFloatType;\n\n\t}\n\n\t// adapted from http://www.graphics.cornell.edu/~bjw/rgbe.html\n\n\tparse( buffer ) {\n\n\t\tconst\n\t\t\t/* return codes for rgbe routines */\n\t\t\t//RGBE_RETURN_SUCCESS = 0,\n\t\t\tRGBE_RETURN_FAILURE = - 1,\n\n\t\t\t/* default error routine. change this to change error handling */\n\t\t\trgbe_read_error = 1,\n\t\t\trgbe_write_error = 2,\n\t\t\trgbe_format_error = 3,\n\t\t\trgbe_memory_error = 4,\n\t\t\trgbe_error = function ( rgbe_error_code, msg ) {\n\n\t\t\t\tswitch ( rgbe_error_code ) {\n\n\t\t\t\t\tcase rgbe_read_error: console.error( 'THREE.RGBELoader Read Error: ' + ( msg || '' ) );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase rgbe_write_error: console.error( 'THREE.RGBELoader Write Error: ' + ( msg || '' ) );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase rgbe_format_error: console.error( 'THREE.RGBELoader Bad File Format: ' + ( msg || '' ) );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\tcase rgbe_memory_error: console.error( 'THREE.RGBELoader: Error: ' + ( msg || '' ) );\n\n\t\t\t\t}\n\n\t\t\t\treturn RGBE_RETURN_FAILURE;\n\n\t\t\t},\n\n\t\t\t/* offsets to red, green, and blue components in a data (float) pixel */\n\t\t\t//RGBE_DATA_RED = 0,\n\t\t\t//RGBE_DATA_GREEN = 1,\n\t\t\t//RGBE_DATA_BLUE = 2,\n\n\t\t\t/* number of floats per pixel, use 4 since stored in rgba image format */\n\t\t\t//RGBE_DATA_SIZE = 4,\n\n\t\t\t/* flags indicating which fields in an rgbe_header_info are valid */\n\t\t\tRGBE_VALID_PROGRAMTYPE = 1,\n\t\t\tRGBE_VALID_FORMAT = 2,\n\t\t\tRGBE_VALID_DIMENSIONS = 4,\n\n\t\t\tNEWLINE = '\\n',\n\n\t\t\tfgets = function ( buffer, lineLimit, consume ) {\n\n\t\t\t\tconst chunkSize = 128;\n\n\t\t\t\tlineLimit = ! lineLimit ? 1024 : lineLimit;\n\t\t\t\tlet p = buffer.pos,\n\t\t\t\t\ti = - 1, len = 0, s = '',\n\t\t\t\t\tchunk = String.fromCharCode.apply( null, new Uint16Array( buffer.subarray( p, p + chunkSize ) ) );\n\n\t\t\t\twhile ( ( 0 > ( i = chunk.indexOf( NEWLINE ) ) ) && ( len < lineLimit ) && ( p < buffer.byteLength ) ) {\n\n\t\t\t\t\ts += chunk; len += chunk.length;\n\t\t\t\t\tp += chunkSize;\n\t\t\t\t\tchunk += String.fromCharCode.apply( null, new Uint16Array( buffer.subarray( p, p + chunkSize ) ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( - 1 < i ) {\n\n\t\t\t\t\t/*for (i=l-1; i>=0; i--) {\n\t\t\t\t\t\tbyteCode = m.charCodeAt(i);\n\t\t\t\t\t\tif (byteCode > 0x7f && byteCode <= 0x7ff) byteLen++;\n\t\t\t\t\t\telse if (byteCode > 0x7ff && byteCode <= 0xffff) byteLen += 2;\n\t\t\t\t\t\tif (byteCode >= 0xDC00 && byteCode <= 0xDFFF) i--; //trail surrogate\n\t\t\t\t\t}*/\n\t\t\t\t\tif ( false !== consume ) buffer.pos += len + i + 1;\n\t\t\t\t\treturn s + chunk.slice( 0, i );\n\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\n\t\t\t},\n\n\t\t\t/* minimal header reading. modify if you want to parse more information */\n\t\t\tRGBE_ReadHeader = function ( buffer ) {\n\n\n\t\t\t\t// regexes to parse header info fields\n\t\t\t\tconst magic_token_re = /^#\\?(\\S+)/,\n\t\t\t\t\tgamma_re = /^\\s*GAMMA\\s*=\\s*(\\d+(\\.\\d+)?)\\s*$/,\n\t\t\t\t\texposure_re = /^\\s*EXPOSURE\\s*=\\s*(\\d+(\\.\\d+)?)\\s*$/,\n\t\t\t\t\tformat_re = /^\\s*FORMAT=(\\S+)\\s*$/,\n\t\t\t\t\tdimensions_re = /^\\s*\\-Y\\s+(\\d+)\\s+\\+X\\s+(\\d+)\\s*$/,\n\n\t\t\t\t\t// RGBE format header struct\n\t\t\t\t\theader = {\n\n\t\t\t\t\t\tvalid: 0, /* indicate which fields are valid */\n\n\t\t\t\t\t\tstring: '', /* the actual header string */\n\n\t\t\t\t\t\tcomments: '', /* comments found in header */\n\n\t\t\t\t\t\tprogramtype: 'RGBE', /* listed at beginning of file to identify it after \"#?\". defaults to \"RGBE\" */\n\n\t\t\t\t\t\tformat: '', /* RGBE format, default 32-bit_rle_rgbe */\n\n\t\t\t\t\t\tgamma: 1.0, /* image has already been gamma corrected with given gamma. defaults to 1.0 (no correction) */\n\n\t\t\t\t\t\texposure: 1.0, /* a value of 1.0 in an image corresponds to <exposure> watts/steradian/m^2. defaults to 1.0 */\n\n\t\t\t\t\t\twidth: 0, height: 0 /* image dimensions, width/height */\n\n\t\t\t\t\t};\n\n\t\t\t\tlet line, match;\n\n\t\t\t\tif ( buffer.pos >= buffer.byteLength || ! ( line = fgets( buffer ) ) ) {\n\n\t\t\t\t\treturn rgbe_error( rgbe_read_error, 'no header found' );\n\n\t\t\t\t}\n\n\t\t\t\t/* if you want to require the magic token then uncomment the next line */\n\t\t\t\tif ( ! ( match = line.match( magic_token_re ) ) ) {\n\n\t\t\t\t\treturn rgbe_error( rgbe_format_error, 'bad initial token' );\n\n\t\t\t\t}\n\n\t\t\t\theader.valid |= RGBE_VALID_PROGRAMTYPE;\n\t\t\t\theader.programtype = match[ 1 ];\n\t\t\t\theader.string += line + '\\n';\n\n\t\t\t\twhile ( true ) {\n\n\t\t\t\t\tline = fgets( buffer );\n\t\t\t\t\tif ( false === line ) break;\n\t\t\t\t\theader.string += line + '\\n';\n\n\t\t\t\t\tif ( '#' === line.charAt( 0 ) ) {\n\n\t\t\t\t\t\theader.comments += line + '\\n';\n\t\t\t\t\t\tcontinue; // comment line\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( gamma_re ) ) {\n\n\t\t\t\t\t\theader.gamma = parseFloat( match[ 1 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( exposure_re ) ) {\n\n\t\t\t\t\t\theader.exposure = parseFloat( match[ 1 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( format_re ) ) {\n\n\t\t\t\t\t\theader.valid |= RGBE_VALID_FORMAT;\n\t\t\t\t\t\theader.format = match[ 1 ];//'32-bit_rle_rgbe';\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( dimensions_re ) ) {\n\n\t\t\t\t\t\theader.valid |= RGBE_VALID_DIMENSIONS;\n\t\t\t\t\t\theader.height = parseInt( match[ 1 ], 10 );\n\t\t\t\t\t\theader.width = parseInt( match[ 2 ], 10 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ( header.valid & RGBE_VALID_FORMAT ) && ( header.valid & RGBE_VALID_DIMENSIONS ) ) break;\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! ( header.valid & RGBE_VALID_FORMAT ) ) {\n\n\t\t\t\t\treturn rgbe_error( rgbe_format_error, 'missing format specifier' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! ( header.valid & RGBE_VALID_DIMENSIONS ) ) {\n\n\t\t\t\t\treturn rgbe_error( rgbe_format_error, 'missing image size specifier' );\n\n\t\t\t\t}\n\n\t\t\t\treturn header;\n\n\t\t\t},\n\n\t\t\tRGBE_ReadPixels_RLE = function ( buffer, w, h ) {\n\n\t\t\t\tconst scanline_width = w;\n\n\t\t\t\tif (\n\t\t\t\t\t// run length encoding is not allowed so read flat\n\t\t\t\t\t( ( scanline_width < 8 ) || ( scanline_width > 0x7fff ) ) ||\n\t\t\t\t\t// this file is not run length encoded\n\t\t\t\t\t( ( 2 !== buffer[ 0 ] ) || ( 2 !== buffer[ 1 ] ) || ( buffer[ 2 ] & 0x80 ) )\n\t\t\t\t) {\n\n\t\t\t\t\t// return the flat buffer\n\t\t\t\t\treturn new Uint8Array( buffer );\n\n\t\t\t\t}\n\n\t\t\t\tif ( scanline_width !== ( ( buffer[ 2 ] << 8 ) | buffer[ 3 ] ) ) {\n\n\t\t\t\t\treturn rgbe_error( rgbe_format_error, 'wrong scanline width' );\n\n\t\t\t\t}\n\n\t\t\t\tconst data_rgba = new Uint8Array( 4 * w * h );\n\n\t\t\t\tif ( ! data_rgba.length ) {\n\n\t\t\t\t\treturn rgbe_error( rgbe_memory_error, 'unable to allocate buffer space' );\n\n\t\t\t\t}\n\n\t\t\t\tlet offset = 0, pos = 0;\n\n\t\t\t\tconst ptr_end = 4 * scanline_width;\n\t\t\t\tconst rgbeStart = new Uint8Array( 4 );\n\t\t\t\tconst scanline_buffer = new Uint8Array( ptr_end );\n\t\t\t\tlet num_scanlines = h;\n\n\t\t\t\t// read in each successive scanline\n\t\t\t\twhile ( ( num_scanlines > 0 ) && ( pos < buffer.byteLength ) ) {\n\n\t\t\t\t\tif ( pos + 4 > buffer.byteLength ) {\n\n\t\t\t\t\t\treturn rgbe_error( rgbe_read_error );\n\n\t\t\t\t\t}\n\n\t\t\t\t\trgbeStart[ 0 ] = buffer[ pos ++ ];\n\t\t\t\t\trgbeStart[ 1 ] = buffer[ pos ++ ];\n\t\t\t\t\trgbeStart[ 2 ] = buffer[ pos ++ ];\n\t\t\t\t\trgbeStart[ 3 ] = buffer[ pos ++ ];\n\n\t\t\t\t\tif ( ( 2 != rgbeStart[ 0 ] ) || ( 2 != rgbeStart[ 1 ] ) || ( ( ( rgbeStart[ 2 ] << 8 ) | rgbeStart[ 3 ] ) != scanline_width ) ) {\n\n\t\t\t\t\t\treturn rgbe_error( rgbe_format_error, 'bad rgbe scanline format' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// read each of the four channels for the scanline into the buffer\n\t\t\t\t\t// first red, then green, then blue, then exponent\n\t\t\t\t\tlet ptr = 0, count;\n\n\t\t\t\t\twhile ( ( ptr < ptr_end ) && ( pos < buffer.byteLength ) ) {\n\n\t\t\t\t\t\tcount = buffer[ pos ++ ];\n\t\t\t\t\t\tconst isEncodedRun = count > 128;\n\t\t\t\t\t\tif ( isEncodedRun ) count -= 128;\n\n\t\t\t\t\t\tif ( ( 0 === count ) || ( ptr + count > ptr_end ) ) {\n\n\t\t\t\t\t\t\treturn rgbe_error( rgbe_format_error, 'bad scanline data' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( isEncodedRun ) {\n\n\t\t\t\t\t\t\t// a (encoded) run of the same value\n\t\t\t\t\t\t\tconst byteValue = buffer[ pos ++ ];\n\t\t\t\t\t\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\t\t\t\t\t\tscanline_buffer[ ptr ++ ] = byteValue;\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t//ptr += count;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// a literal-run\n\t\t\t\t\t\t\tscanline_buffer.set( buffer.subarray( pos, pos + count ), ptr );\n\t\t\t\t\t\t\tptr += count; pos += count;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\n\t\t\t\t\t// now convert data from buffer into rgba\n\t\t\t\t\t// first red, then green, then blue, then exponent (alpha)\n\t\t\t\t\tconst l = scanline_width; //scanline_buffer.byteLength;\n\t\t\t\t\tfor ( let i = 0; i < l; i ++ ) {\n\n\t\t\t\t\t\tlet off = 0;\n\t\t\t\t\t\tdata_rgba[ offset ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toff += scanline_width; //1;\n\t\t\t\t\t\tdata_rgba[ offset + 1 ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toff += scanline_width; //1;\n\t\t\t\t\t\tdata_rgba[ offset + 2 ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toff += scanline_width; //1;\n\t\t\t\t\t\tdata_rgba[ offset + 3 ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toffset += 4;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tnum_scanlines --;\n\n\t\t\t\t}\n\n\t\t\t\treturn data_rgba;\n\n\t\t\t};\n\n\t\tconst RGBEByteToRGBFloat = function ( sourceArray, sourceOffset, destArray, destOffset ) {\n\n\t\t\tconst e = sourceArray[ sourceOffset + 3 ];\n\t\t\tconst scale = Math.pow( 2.0, e - 128.0 ) / 255.0;\n\n\t\t\tdestArray[ destOffset + 0 ] = sourceArray[ sourceOffset + 0 ] * scale;\n\t\t\tdestArray[ destOffset + 1 ] = sourceArray[ sourceOffset + 1 ] * scale;\n\t\t\tdestArray[ destOffset + 2 ] = sourceArray[ sourceOffset + 2 ] * scale;\n\t\t\tdestArray[ destOffset + 3 ] = 1;\n\n\t\t};\n\n\t\tconst RGBEByteToRGBHalf = function ( sourceArray, sourceOffset, destArray, destOffset ) {\n\n\t\t\tconst e = sourceArray[ sourceOffset + 3 ];\n\t\t\tconst scale = Math.pow( 2.0, e - 128.0 ) / 255.0;\n\n\t\t\t// clamping to 65504, the maximum representable value in float16\n\t\t\tdestArray[ destOffset + 0 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 0 ] * scale, 65504 ) );\n\t\t\tdestArray[ destOffset + 1 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 1 ] * scale, 65504 ) );\n\t\t\tdestArray[ destOffset + 2 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 2 ] * scale, 65504 ) );\n\t\t\tdestArray[ destOffset + 3 ] = DataUtils.toHalfFloat( 1 );\n\n\t\t};\n\n\t\tconst byteArray = new Uint8Array( buffer );\n\t\tbyteArray.pos = 0;\n\t\tconst rgbe_header_info = RGBE_ReadHeader( byteArray );\n\n\t\tif ( RGBE_RETURN_FAILURE !== rgbe_header_info ) {\n\n\t\t\tconst w = rgbe_header_info.width,\n\t\t\t\th = rgbe_header_info.height,\n\t\t\t\timage_rgba_data = RGBE_ReadPixels_RLE( byteArray.subarray( byteArray.pos ), w, h );\n\n\t\t\tif ( RGBE_RETURN_FAILURE !== image_rgba_data ) {\n\n\t\t\t\tlet data, type;\n\t\t\t\tlet numElements;\n\n\t\t\t\tswitch ( this.type ) {\n\n\t\t\t\t\tcase FloatType:\n\n\t\t\t\t\t\tnumElements = image_rgba_data.length / 4;\n\t\t\t\t\t\tconst floatArray = new Float32Array( numElements * 4 );\n\n\t\t\t\t\t\tfor ( let j = 0; j < numElements; j ++ ) {\n\n\t\t\t\t\t\t\tRGBEByteToRGBFloat( image_rgba_data, j * 4, floatArray, j * 4 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdata = floatArray;\n\t\t\t\t\t\ttype = FloatType;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase HalfFloatType:\n\n\t\t\t\t\t\tnumElements = image_rgba_data.length / 4;\n\t\t\t\t\t\tconst halfArray = new Uint16Array( numElements * 4 );\n\n\t\t\t\t\t\tfor ( let j = 0; j < numElements; j ++ ) {\n\n\t\t\t\t\t\t\tRGBEByteToRGBHalf( image_rgba_data, j * 4, halfArray, j * 4 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdata = halfArray;\n\t\t\t\t\t\ttype = HalfFloatType;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tconsole.error( 'THREE.RGBELoader: unsupported type: ', this.type );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\twidth: w, height: h,\n\t\t\t\t\tdata: data,\n\t\t\t\t\theader: rgbe_header_info.string,\n\t\t\t\t\tgamma: rgbe_header_info.gamma,\n\t\t\t\t\texposure: rgbe_header_info.exposure,\n\t\t\t\t\ttype: type\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\tsetDataType( value ) {\n\n\t\tthis.type = value;\n\t\treturn this;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tfunction onLoadCallback( texture, texData ) {\n\n\t\t\tswitch ( texture.type ) {\n\n\t\t\t\tcase FloatType:\n\t\t\t\tcase HalfFloatType:\n\n\t\t\t\t\ttexture.encoding = LinearEncoding;\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\t\t\t\t\ttexture.magFilter = LinearFilter;\n\t\t\t\t\ttexture.generateMipmaps = false;\n\t\t\t\t\ttexture.flipY = true;\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}\n\n\t\treturn super.load( url, onLoadCallback, onProgress, onError );\n\n\t}\n\n}\n\nexport { RGBELoader };\n","/**\n * Full-screen textured quad shader\n */\n\nconst CopyShader = {\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'opacity': { value: 1.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform float opacity;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tgl_FragColor = texture2D( tDiffuse, vUv );\n\t\t\tgl_FragColor.a *= opacity;\n\n\n\t\t}`\n\n};\n\nexport { CopyShader };\n","import {\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tOrthographicCamera,\n\tMesh\n} from 'three';\n\nclass Pass {\n\n\tconstructor() {\n\n\t\t// if set to true, the pass is processed by the composer\n\t\tthis.enabled = true;\n\n\t\t// if set to true, the pass indicates to swap read and write buffer after rendering\n\t\tthis.needsSwap = true;\n\n\t\t// if set to true, the pass clears its buffer before rendering\n\t\tthis.clear = false;\n\n\t\t// if set to true, the result of the pass is rendered to screen. This is set automatically by EffectComposer.\n\t\tthis.renderToScreen = false;\n\n\t}\n\n\tsetSize( /* width, height */ ) {}\n\n\trender( /* renderer, writeBuffer, readBuffer, deltaTime, maskActive */ ) {\n\n\t\tconsole.error( 'THREE.Pass: .render() must be implemented in derived pass.' );\n\n\t}\n\n\tdispose() {}\n\n}\n\n// Helper for passes that need to fill the viewport with a single quad.\n\nconst _camera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\n// https://github.com/mrdoob/three.js/pull/21358\n\nconst _geometry = new BufferGeometry();\n_geometry.setAttribute( 'position', new Float32BufferAttribute( [ - 1, 3, 0, - 1, - 1, 0, 3, - 1, 0 ], 3 ) );\n_geometry.setAttribute( 'uv', new Float32BufferAttribute( [ 0, 2, 0, 0, 2, 0 ], 2 ) );\n\nclass FullScreenQuad {\n\n\tconstructor( material ) {\n\n\t\tthis._mesh = new Mesh( _geometry, material );\n\n\t}\n\n\tdispose() {\n\n\t\tthis._mesh.geometry.dispose();\n\n\t}\n\n\trender( renderer ) {\n\n\t\trenderer.render( this._mesh, _camera );\n\n\t}\n\n\tget material() {\n\n\t\treturn this._mesh.material;\n\n\t}\n\n\tset material( value ) {\n\n\t\tthis._mesh.material = value;\n\n\t}\n\n}\n\nexport { Pass, FullScreenQuad };\n","import {\n\tShaderMaterial,\n\tUniformsUtils\n} from 'three';\nimport { Pass, FullScreenQuad } from './Pass.js';\n\nclass ShaderPass extends Pass {\n\n\tconstructor( shader, textureID ) {\n\n\t\tsuper();\n\n\t\tthis.textureID = ( textureID !== undefined ) ? textureID : 'tDiffuse';\n\n\t\tif ( shader instanceof ShaderMaterial ) {\n\n\t\t\tthis.uniforms = shader.uniforms;\n\n\t\t\tthis.material = shader;\n\n\t\t} else if ( shader ) {\n\n\t\t\tthis.uniforms = UniformsUtils.clone( shader.uniforms );\n\n\t\t\tthis.material = new ShaderMaterial( {\n\n\t\t\t\tdefines: Object.assign( {}, shader.defines ),\n\t\t\t\tuniforms: this.uniforms,\n\t\t\t\tvertexShader: shader.vertexShader,\n\t\t\t\tfragmentShader: shader.fragmentShader\n\n\t\t\t} );\n\n\t\t}\n\n\t\tthis.fsQuad = new FullScreenQuad( this.material );\n\n\t}\n\n\trender( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {\n\n\t\tif ( this.uniforms[ this.textureID ] ) {\n\n\t\t\tthis.uniforms[ this.textureID ].value = readBuffer.texture;\n\n\t\t}\n\n\t\tthis.fsQuad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.setRenderTarget( null );\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t} else {\n\n\t\t\trenderer.setRenderTarget( writeBuffer );\n\t\t\t// TODO: Avoid using autoClear properties, see https://github.com/mrdoob/three.js/pull/15571#issuecomment-465669600\n\t\t\tif ( this.clear ) renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t}\n\n\t}\n\n\tdispose() {\n\n\t\tthis.material.dispose();\n\n\t\tthis.fsQuad.dispose();\n\n\t}\n\n}\n\nexport { ShaderPass };\n","import { Pass } from './Pass.js';\n\nclass MaskPass extends Pass {\n\n\tconstructor( scene, camera ) {\n\n\t\tsuper();\n\n\t\tthis.scene = scene;\n\t\tthis.camera = camera;\n\n\t\tthis.clear = true;\n\t\tthis.needsSwap = false;\n\n\t\tthis.inverse = false;\n\n\t}\n\n\trender( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {\n\n\t\tconst context = renderer.getContext();\n\t\tconst state = renderer.state;\n\n\t\t// don't update color or depth\n\n\t\tstate.buffers.color.setMask( false );\n\t\tstate.buffers.depth.setMask( false );\n\n\t\t// lock buffers\n\n\t\tstate.buffers.color.setLocked( true );\n\t\tstate.buffers.depth.setLocked( true );\n\n\t\t// set up stencil\n\n\t\tlet writeValue, clearValue;\n\n\t\tif ( this.inverse ) {\n\n\t\t\twriteValue = 0;\n\t\t\tclearValue = 1;\n\n\t\t} else {\n\n\t\t\twriteValue = 1;\n\t\t\tclearValue = 0;\n\n\t\t}\n\n\t\tstate.buffers.stencil.setTest( true );\n\t\tstate.buffers.stencil.setOp( context.REPLACE, context.REPLACE, context.REPLACE );\n\t\tstate.buffers.stencil.setFunc( context.ALWAYS, writeValue, 0xffffffff );\n\t\tstate.buffers.stencil.setClear( clearValue );\n\t\tstate.buffers.stencil.setLocked( true );\n\n\t\t// draw into the stencil buffer\n\n\t\trenderer.setRenderTarget( readBuffer );\n\t\tif ( this.clear ) renderer.clear();\n\t\trenderer.render( this.scene, this.camera );\n\n\t\trenderer.setRenderTarget( writeBuffer );\n\t\tif ( this.clear ) renderer.clear();\n\t\trenderer.render( this.scene, this.camera );\n\n\t\t// unlock color and depth buffer for subsequent rendering\n\n\t\tstate.buffers.color.setLocked( false );\n\t\tstate.buffers.depth.setLocked( false );\n\n\t\t// only render where stencil is set to 1\n\n\t\tstate.buffers.stencil.setLocked( false );\n\t\tstate.buffers.stencil.setFunc( context.EQUAL, 1, 0xffffffff ); // draw if == 1\n\t\tstate.buffers.stencil.setOp( context.KEEP, context.KEEP, context.KEEP );\n\t\tstate.buffers.stencil.setLocked( true );\n\n\t}\n\n}\n\nclass ClearMaskPass extends Pass {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.needsSwap = false;\n\n\t}\n\n\trender( renderer /*, writeBuffer, readBuffer, deltaTime, maskActive */ ) {\n\n\t\trenderer.state.buffers.stencil.setLocked( false );\n\t\trenderer.state.buffers.stencil.setTest( false );\n\n\t}\n\n}\n\nexport { MaskPass, ClearMaskPass };\n","import {\n\tClock,\n\tVector2,\n\tWebGLRenderTarget\n} from 'three';\nimport { CopyShader } from '../shaders/CopyShader.js';\nimport { ShaderPass } from './ShaderPass.js';\nimport { MaskPass } from './MaskPass.js';\nimport { ClearMaskPass } from './MaskPass.js';\n\nclass EffectComposer {\n\n\tconstructor( renderer, renderTarget ) {\n\n\t\tthis.renderer = renderer;\n\n\t\tif ( renderTarget === undefined ) {\n\n\t\t\tconst size = renderer.getSize( new Vector2() );\n\t\t\tthis._pixelRatio = renderer.getPixelRatio();\n\t\t\tthis._width = size.width;\n\t\t\tthis._height = size.height;\n\n\t\t\trenderTarget = new WebGLRenderTarget( this._width * this._pixelRatio, this._height * this._pixelRatio );\n\t\t\trenderTarget.texture.name = 'EffectComposer.rt1';\n\n\t\t} else {\n\n\t\t\tthis._pixelRatio = 1;\n\t\t\tthis._width = renderTarget.width;\n\t\t\tthis._height = renderTarget.height;\n\n\t\t}\n\n\t\tthis.renderTarget1 = renderTarget;\n\t\tthis.renderTarget2 = renderTarget.clone();\n\t\tthis.renderTarget2.texture.name = 'EffectComposer.rt2';\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t\tthis.renderToScreen = true;\n\n\t\tthis.passes = [];\n\n\t\tthis.copyPass = new ShaderPass( CopyShader );\n\n\t\tthis.clock = new Clock();\n\n\t}\n\n\tswapBuffers() {\n\n\t\tconst tmp = this.readBuffer;\n\t\tthis.readBuffer = this.writeBuffer;\n\t\tthis.writeBuffer = tmp;\n\n\t}\n\n\taddPass( pass ) {\n\n\t\tthis.passes.push( pass );\n\t\tpass.setSize( this._width * this._pixelRatio, this._height * this._pixelRatio );\n\n\t}\n\n\tinsertPass( pass, index ) {\n\n\t\tthis.passes.splice( index, 0, pass );\n\t\tpass.setSize( this._width * this._pixelRatio, this._height * this._pixelRatio );\n\n\t}\n\n\tremovePass( pass ) {\n\n\t\tconst index = this.passes.indexOf( pass );\n\n\t\tif ( index !== - 1 ) {\n\n\t\t\tthis.passes.splice( index, 1 );\n\n\t\t}\n\n\t}\n\n\tisLastEnabledPass( passIndex ) {\n\n\t\tfor ( let i = passIndex + 1; i < this.passes.length; i ++ ) {\n\n\t\t\tif ( this.passes[ i ].enabled ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\trender( deltaTime ) {\n\n\t\t// deltaTime value is in seconds\n\n\t\tif ( deltaTime === undefined ) {\n\n\t\t\tdeltaTime = this.clock.getDelta();\n\n\t\t}\n\n\t\tconst currentRenderTarget = this.renderer.getRenderTarget();\n\n\t\tlet maskActive = false;\n\n\t\tfor ( let i = 0, il = this.passes.length; i < il; i ++ ) {\n\n\t\t\tconst pass = this.passes[ i ];\n\n\t\t\tif ( pass.enabled === false ) continue;\n\n\t\t\tpass.renderToScreen = ( this.renderToScreen && this.isLastEnabledPass( i ) );\n\t\t\tpass.render( this.renderer, this.writeBuffer, this.readBuffer, deltaTime, maskActive );\n\n\t\t\tif ( pass.needsSwap ) {\n\n\t\t\t\tif ( maskActive ) {\n\n\t\t\t\t\tconst context = this.renderer.getContext();\n\t\t\t\t\tconst stencil = this.renderer.state.buffers.stencil;\n\n\t\t\t\t\t//context.stencilFunc( context.NOTEQUAL, 1, 0xffffffff );\n\t\t\t\t\tstencil.setFunc( context.NOTEQUAL, 1, 0xffffffff );\n\n\t\t\t\t\tthis.copyPass.render( this.renderer, this.writeBuffer, this.readBuffer, deltaTime );\n\n\t\t\t\t\t//context.stencilFunc( context.EQUAL, 1, 0xffffffff );\n\t\t\t\t\tstencil.setFunc( context.EQUAL, 1, 0xffffffff );\n\n\t\t\t\t}\n\n\t\t\t\tthis.swapBuffers();\n\n\t\t\t}\n\n\t\t\tif ( MaskPass !== undefined ) {\n\n\t\t\t\tif ( pass instanceof MaskPass ) {\n\n\t\t\t\t\tmaskActive = true;\n\n\t\t\t\t} else if ( pass instanceof ClearMaskPass ) {\n\n\t\t\t\t\tmaskActive = false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.renderer.setRenderTarget( currentRenderTarget );\n\n\t}\n\n\treset( renderTarget ) {\n\n\t\tif ( renderTarget === undefined ) {\n\n\t\t\tconst size = this.renderer.getSize( new Vector2() );\n\t\t\tthis._pixelRatio = this.renderer.getPixelRatio();\n\t\t\tthis._width = size.width;\n\t\t\tthis._height = size.height;\n\n\t\t\trenderTarget = this.renderTarget1.clone();\n\t\t\trenderTarget.setSize( this._width * this._pixelRatio, this._height * this._pixelRatio );\n\n\t\t}\n\n\t\tthis.renderTarget1.dispose();\n\t\tthis.renderTarget2.dispose();\n\t\tthis.renderTarget1 = renderTarget;\n\t\tthis.renderTarget2 = renderTarget.clone();\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t}\n\n\tsetSize( width, height ) {\n\n\t\tthis._width = width;\n\t\tthis._height = height;\n\n\t\tconst effectiveWidth = this._width * this._pixelRatio;\n\t\tconst effectiveHeight = this._height * this._pixelRatio;\n\n\t\tthis.renderTarget1.setSize( effectiveWidth, effectiveHeight );\n\t\tthis.renderTarget2.setSize( effectiveWidth, effectiveHeight );\n\n\t\tfor ( let i = 0; i < this.passes.length; i ++ ) {\n\n\t\t\tthis.passes[ i ].setSize( effectiveWidth, effectiveHeight );\n\n\t\t}\n\n\t}\n\n\tsetPixelRatio( pixelRatio ) {\n\n\t\tthis._pixelRatio = pixelRatio;\n\n\t\tthis.setSize( this._width, this._height );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.renderTarget1.dispose();\n\t\tthis.renderTarget2.dispose();\n\n\t\tthis.copyPass.dispose();\n\n\t}\n\n}\n\nexport { EffectComposer };\n","import {\n\tColor\n} from 'three';\nimport { Pass } from './Pass.js';\n\nclass RenderPass extends Pass {\n\n\tconstructor( scene, camera, overrideMaterial, clearColor, clearAlpha ) {\n\n\t\tsuper();\n\n\t\tthis.scene = scene;\n\t\tthis.camera = camera;\n\n\t\tthis.overrideMaterial = overrideMaterial;\n\n\t\tthis.clearColor = clearColor;\n\t\tthis.clearAlpha = ( clearAlpha !== undefined ) ? clearAlpha : 0;\n\n\t\tthis.clear = true;\n\t\tthis.clearDepth = false;\n\t\tthis.needsSwap = false;\n\t\tthis._oldClearColor = new Color();\n\n\t}\n\n\trender( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {\n\n\t\tconst oldAutoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\tlet oldClearAlpha, oldOverrideMaterial;\n\n\t\tif ( this.overrideMaterial !== undefined ) {\n\n\t\t\toldOverrideMaterial = this.scene.overrideMaterial;\n\n\t\t\tthis.scene.overrideMaterial = this.overrideMaterial;\n\n\t\t}\n\n\t\tif ( this.clearColor ) {\n\n\t\t\trenderer.getClearColor( this._oldClearColor );\n\t\t\toldClearAlpha = renderer.getClearAlpha();\n\n\t\t\trenderer.setClearColor( this.clearColor, this.clearAlpha );\n\n\t\t}\n\n\t\tif ( this.clearDepth ) {\n\n\t\t\trenderer.clearDepth();\n\n\t\t}\n\n\t\trenderer.setRenderTarget( this.renderToScreen ? null : readBuffer );\n\n\t\t// TODO: Avoid using autoClear properties, see https://github.com/mrdoob/three.js/pull/15571#issuecomment-465669600\n\t\tif ( this.clear ) renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\t\trenderer.render( this.scene, this.camera );\n\n\t\tif ( this.clearColor ) {\n\n\t\t\trenderer.setClearColor( this._oldClearColor, oldClearAlpha );\n\n\t\t}\n\n\t\tif ( this.overrideMaterial !== undefined ) {\n\n\t\t\tthis.scene.overrideMaterial = oldOverrideMaterial;\n\n\t\t}\n\n\t\trenderer.autoClear = oldAutoClear;\n\n\t}\n\n}\n\nexport { RenderPass };\n","import {\n\tAdditiveBlending,\n\tColor,\n\tDoubleSide,\n\tMatrix4,\n\tMeshDepthMaterial,\n\tNoBlending,\n\tRGBADepthPacking,\n\tShaderMaterial,\n\tUniformsUtils,\n\tVector2,\n\tVector3,\n\tWebGLRenderTarget\n} from 'three';\nimport { Pass, FullScreenQuad } from './Pass.js';\nimport { CopyShader } from '../shaders/CopyShader.js';\n\nclass OutlinePass extends Pass {\n\n\tconstructor( resolution, scene, camera, selectedObjects ) {\n\n\t\tsuper();\n\n\t\tthis.renderScene = scene;\n\t\tthis.renderCamera = camera;\n\t\tthis.selectedObjects = selectedObjects !== undefined ? selectedObjects : [];\n\t\tthis.visibleEdgeColor = new Color( 1, 1, 1 );\n\t\tthis.hiddenEdgeColor = new Color( 0.1, 0.04, 0.02 );\n\t\tthis.edgeGlow = 0.0;\n\t\tthis.usePatternTexture = false;\n\t\tthis.edgeThickness = 1.0;\n\t\tthis.edgeStrength = 3.0;\n\t\tthis.downSampleRatio = 2;\n\t\tthis.pulsePeriod = 0;\n\n\t\tthis._visibilityCache = new Map();\n\n\n\t\tthis.resolution = ( resolution !== undefined ) ? new Vector2( resolution.x, resolution.y ) : new Vector2( 256, 256 );\n\n\t\tconst resx = Math.round( this.resolution.x / this.downSampleRatio );\n\t\tconst resy = Math.round( this.resolution.y / this.downSampleRatio );\n\n\t\tthis.renderTargetMaskBuffer = new WebGLRenderTarget( this.resolution.x, this.resolution.y );\n\t\tthis.renderTargetMaskBuffer.texture.name = 'OutlinePass.mask';\n\t\tthis.renderTargetMaskBuffer.texture.generateMipmaps = false;\n\n\t\tthis.depthMaterial = new MeshDepthMaterial();\n\t\tthis.depthMaterial.side = DoubleSide;\n\t\tthis.depthMaterial.depthPacking = RGBADepthPacking;\n\t\tthis.depthMaterial.blending = NoBlending;\n\n\t\tthis.prepareMaskMaterial = this.getPrepareMaskMaterial();\n\t\tthis.prepareMaskMaterial.side = DoubleSide;\n\t\tthis.prepareMaskMaterial.fragmentShader = replaceDepthToViewZ( this.prepareMaskMaterial.fragmentShader, this.renderCamera );\n\n\t\tthis.renderTargetDepthBuffer = new WebGLRenderTarget( this.resolution.x, this.resolution.y );\n\t\tthis.renderTargetDepthBuffer.texture.name = 'OutlinePass.depth';\n\t\tthis.renderTargetDepthBuffer.texture.generateMipmaps = false;\n\n\t\tthis.renderTargetMaskDownSampleBuffer = new WebGLRenderTarget( resx, resy );\n\t\tthis.renderTargetMaskDownSampleBuffer.texture.name = 'OutlinePass.depthDownSample';\n\t\tthis.renderTargetMaskDownSampleBuffer.texture.generateMipmaps = false;\n\n\t\tthis.renderTargetBlurBuffer1 = new WebGLRenderTarget( resx, resy );\n\t\tthis.renderTargetBlurBuffer1.texture.name = 'OutlinePass.blur1';\n\t\tthis.renderTargetBlurBuffer1.texture.generateMipmaps = false;\n\t\tthis.renderTargetBlurBuffer2 = new WebGLRenderTarget( Math.round( resx / 2 ), Math.round( resy / 2 ) );\n\t\tthis.renderTargetBlurBuffer2.texture.name = 'OutlinePass.blur2';\n\t\tthis.renderTargetBlurBuffer2.texture.generateMipmaps = false;\n\n\t\tthis.edgeDetectionMaterial = this.getEdgeDetectionMaterial();\n\t\tthis.renderTargetEdgeBuffer1 = new WebGLRenderTarget( resx, resy );\n\t\tthis.renderTargetEdgeBuffer1.texture.name = 'OutlinePass.edge1';\n\t\tthis.renderTargetEdgeBuffer1.texture.generateMipmaps = false;\n\t\tthis.renderTargetEdgeBuffer2 = new WebGLRenderTarget( Math.round( resx / 2 ), Math.round( resy / 2 ) );\n\t\tthis.renderTargetEdgeBuffer2.texture.name = 'OutlinePass.edge2';\n\t\tthis.renderTargetEdgeBuffer2.texture.generateMipmaps = false;\n\n\t\tconst MAX_EDGE_THICKNESS = 4;\n\t\tconst MAX_EDGE_GLOW = 4;\n\n\t\tthis.separableBlurMaterial1 = this.getSeperableBlurMaterial( MAX_EDGE_THICKNESS );\n\t\tthis.separableBlurMaterial1.uniforms[ 'texSize' ].value.set( resx, resy );\n\t\tthis.separableBlurMaterial1.uniforms[ 'kernelRadius' ].value = 1;\n\t\tthis.separableBlurMaterial2 = this.getSeperableBlurMaterial( MAX_EDGE_GLOW );\n\t\tthis.separableBlurMaterial2.uniforms[ 'texSize' ].value.set( Math.round( resx / 2 ), Math.round( resy / 2 ) );\n\t\tthis.separableBlurMaterial2.uniforms[ 'kernelRadius' ].value = MAX_EDGE_GLOW;\n\n\t\t// Overlay material\n\t\tthis.overlayMaterial = this.getOverlayMaterial();\n\n\t\t// copy material\n\n\t\tconst copyShader = CopyShader;\n\n\t\tthis.copyUniforms = UniformsUtils.clone( copyShader.uniforms );\n\t\tthis.copyUniforms[ 'opacity' ].value = 1.0;\n\n\t\tthis.materialCopy = new ShaderMaterial( {\n\t\t\tuniforms: this.copyUniforms,\n\t\t\tvertexShader: copyShader.vertexShader,\n\t\t\tfragmentShader: copyShader.fragmentShader,\n\t\t\tblending: NoBlending,\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\ttransparent: true\n\t\t} );\n\n\t\tthis.enabled = true;\n\t\tthis.needsSwap = false;\n\n\t\tthis._oldClearColor = new Color();\n\t\tthis.oldClearAlpha = 1;\n\n\t\tthis.fsQuad = new FullScreenQuad( null );\n\n\t\tthis.tempPulseColor1 = new Color();\n\t\tthis.tempPulseColor2 = new Color();\n\t\tthis.textureMatrix = new Matrix4();\n\n\t\tfunction replaceDepthToViewZ( string, camera ) {\n\n\t\t\tconst type = camera.isPerspectiveCamera ? 'perspective' : 'orthographic';\n\n\t\t\treturn string.replace( /DEPTH_TO_VIEW_Z/g, type + 'DepthToViewZ' );\n\n\t\t}\n\n\t}\n\n\tdispose() {\n\n\t\tthis.renderTargetMaskBuffer.dispose();\n\t\tthis.renderTargetDepthBuffer.dispose();\n\t\tthis.renderTargetMaskDownSampleBuffer.dispose();\n\t\tthis.renderTargetBlurBuffer1.dispose();\n\t\tthis.renderTargetBlurBuffer2.dispose();\n\t\tthis.renderTargetEdgeBuffer1.dispose();\n\t\tthis.renderTargetEdgeBuffer2.dispose();\n\n\t\tthis.depthMaterial.dispose();\n\t\tthis.prepareMaskMaterial.dispose();\n\t\tthis.edgeDetectionMaterial.dispose();\n\t\tthis.separableBlurMaterial1.dispose();\n\t\tthis.separableBlurMaterial2.dispose();\n\t\tthis.overlayMaterial.dispose();\n\t\tthis.materialCopy.dispose();\n\n\t\tthis.fsQuad.dispose();\n\n\t}\n\n\tsetSize( width, height ) {\n\n\t\tthis.renderTargetMaskBuffer.setSize( width, height );\n\t\tthis.renderTargetDepthBuffer.setSize( width, height );\n\n\t\tlet resx = Math.round( width / this.downSampleRatio );\n\t\tlet resy = Math.round( height / this.downSampleRatio );\n\t\tthis.renderTargetMaskDownSampleBuffer.setSize( resx, resy );\n\t\tthis.renderTargetBlurBuffer1.setSize( resx, resy );\n\t\tthis.renderTargetEdgeBuffer1.setSize( resx, resy );\n\t\tthis.separableBlurMaterial1.uniforms[ 'texSize' ].value.set( resx, resy );\n\n\t\tresx = Math.round( resx / 2 );\n\t\tresy = Math.round( resy / 2 );\n\n\t\tthis.renderTargetBlurBuffer2.setSize( resx, resy );\n\t\tthis.renderTargetEdgeBuffer2.setSize( resx, resy );\n\n\t\tthis.separableBlurMaterial2.uniforms[ 'texSize' ].value.set( resx, resy );\n\n\t}\n\n\tchangeVisibilityOfSelectedObjects( bVisible ) {\n\n\t\tconst cache = this._visibilityCache;\n\n\t\tfunction gatherSelectedMeshesCallBack( object ) {\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tif ( bVisible === true ) {\n\n\t\t\t\t\tobject.visible = cache.get( object );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcache.set( object, object.visible );\n\t\t\t\t\tobject.visible = bVisible;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let i = 0; i < this.selectedObjects.length; i ++ ) {\n\n\t\t\tconst selectedObject = this.selectedObjects[ i ];\n\t\t\tselectedObject.traverse( gatherSelectedMeshesCallBack );\n\n\t\t}\n\n\t}\n\n\tchangeVisibilityOfNonSelectedObjects( bVisible ) {\n\n\t\tconst cache = this._visibilityCache;\n\t\tconst selectedMeshes = [];\n\n\t\tfunction gatherSelectedMeshesCallBack( object ) {\n\n\t\t\tif ( object.isMesh ) selectedMeshes.push( object );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < this.selectedObjects.length; i ++ ) {\n\n\t\t\tconst selectedObject = this.selectedObjects[ i ];\n\t\t\tselectedObject.traverse( gatherSelectedMeshesCallBack );\n\n\t\t}\n\n\t\tfunction VisibilityChangeCallBack( object ) {\n\n\t\t\tif ( object.isMesh || object.isSprite ) {\n\n\t\t\t\t// only meshes and sprites are supported by OutlinePass\n\n\t\t\t\tlet bFound = false;\n\n\t\t\t\tfor ( let i = 0; i < selectedMeshes.length; i ++ ) {\n\n\t\t\t\t\tconst selectedObjectId = selectedMeshes[ i ].id;\n\n\t\t\t\t\tif ( selectedObjectId === object.id ) {\n\n\t\t\t\t\t\tbFound = true;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( bFound === false ) {\n\n\t\t\t\t\tconst visibility = object.visible;\n\n\t\t\t\t\tif ( bVisible === false || cache.get( object ) === true ) {\n\n\t\t\t\t\t\tobject.visible = bVisible;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcache.set( object, visibility );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isPoints || object.isLine ) {\n\n\t\t\t\t// the visibilty of points and lines is always set to false in order to\n\t\t\t\t// not affect the outline computation\n\n\t\t\t\tif ( bVisible === true ) {\n\n\t\t\t\t\tobject.visible = cache.get( object ); // restore\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcache.set( object, object.visible );\n\t\t\t\t\tobject.visible = bVisible;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.renderScene.traverse( VisibilityChangeCallBack );\n\n\t}\n\n\tupdateTextureMatrix() {\n\n\t\tthis.textureMatrix.set( 0.5, 0.0, 0.0, 0.5,\n\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t0.0, 0.0, 0.0, 1.0 );\n\t\tthis.textureMatrix.multiply( this.renderCamera.projectionMatrix );\n\t\tthis.textureMatrix.multiply( this.renderCamera.matrixWorldInverse );\n\n\t}\n\n\trender( renderer, writeBuffer, readBuffer, deltaTime, maskActive ) {\n\n\t\tif ( this.selectedObjects.length > 0 ) {\n\n\t\t\trenderer.getClearColor( this._oldClearColor );\n\t\t\tthis.oldClearAlpha = renderer.getClearAlpha();\n\t\t\tconst oldAutoClear = renderer.autoClear;\n\n\t\t\trenderer.autoClear = false;\n\n\t\t\tif ( maskActive ) renderer.state.buffers.stencil.setTest( false );\n\n\t\t\trenderer.setClearColor( 0xffffff, 1 );\n\n\t\t\t// Make selected objects invisible\n\t\t\tthis.changeVisibilityOfSelectedObjects( false );\n\n\t\t\tconst currentBackground = this.renderScene.background;\n\t\t\tthis.renderScene.background = null;\n\n\t\t\t// 1. Draw Non Selected objects in the depth buffer\n\t\t\tthis.renderScene.overrideMaterial = this.depthMaterial;\n\t\t\trenderer.setRenderTarget( this.renderTargetDepthBuffer );\n\t\t\trenderer.clear();\n\t\t\trenderer.render( this.renderScene, this.renderCamera );\n\n\t\t\t// Make selected objects visible\n\t\t\tthis.changeVisibilityOfSelectedObjects( true );\n\t\t\tthis._visibilityCache.clear();\n\n\t\t\t// Update Texture Matrix for Depth compare\n\t\t\tthis.updateTextureMatrix();\n\n\t\t\t// Make non selected objects invisible, and draw only the selected objects, by comparing the depth buffer of non selected objects\n\t\t\tthis.changeVisibilityOfNonSelectedObjects( false );\n\t\t\tthis.renderScene.overrideMaterial = this.prepareMaskMaterial;\n\t\t\tthis.prepareMaskMaterial.uniforms[ 'cameraNearFar' ].value.set( this.renderCamera.near, this.renderCamera.far );\n\t\t\tthis.prepareMaskMaterial.uniforms[ 'depthTexture' ].value = this.renderTargetDepthBuffer.texture;\n\t\t\tthis.prepareMaskMaterial.uniforms[ 'textureMatrix' ].value = this.textureMatrix;\n\t\t\trenderer.setRenderTarget( this.renderTargetMaskBuffer );\n\t\t\trenderer.clear();\n\t\t\trenderer.render( this.renderScene, this.renderCamera );\n\t\t\tthis.renderScene.overrideMaterial = null;\n\t\t\tthis.changeVisibilityOfNonSelectedObjects( true );\n\t\t\tthis._visibilityCache.clear();\n\n\t\t\tthis.renderScene.background = currentBackground;\n\n\t\t\t// 2. Downsample to Half resolution\n\t\t\tthis.fsQuad.material = this.materialCopy;\n\t\t\tthis.copyUniforms[ 'tDiffuse' ].value = this.renderTargetMaskBuffer.texture;\n\t\t\trenderer.setRenderTarget( this.renderTargetMaskDownSampleBuffer );\n\t\t\trenderer.clear();\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t\tthis.tempPulseColor1.copy( this.visibleEdgeColor );\n\t\t\tthis.tempPulseColor2.copy( this.hiddenEdgeColor );\n\n\t\t\tif ( this.pulsePeriod > 0 ) {\n\n\t\t\t\tconst scalar = ( 1 + 0.25 ) / 2 + Math.cos( performance.now() * 0.01 / this.pulsePeriod ) * ( 1.0 - 0.25 ) / 2;\n\t\t\t\tthis.tempPulseColor1.multiplyScalar( scalar );\n\t\t\t\tthis.tempPulseColor2.multiplyScalar( scalar );\n\n\t\t\t}\n\n\t\t\t// 3. Apply Edge Detection Pass\n\t\t\tthis.fsQuad.material = this.edgeDetectionMaterial;\n\t\t\tthis.edgeDetectionMaterial.uniforms[ 'maskTexture' ].value = this.renderTargetMaskDownSampleBuffer.texture;\n\t\t\tthis.edgeDetectionMaterial.uniforms[ 'texSize' ].value.set( this.renderTargetMaskDownSampleBuffer.width, this.renderTargetMaskDownSampleBuffer.height );\n\t\t\tthis.edgeDetectionMaterial.uniforms[ 'visibleEdgeColor' ].value = this.tempPulseColor1;\n\t\t\tthis.edgeDetectionMaterial.uniforms[ 'hiddenEdgeColor' ].value = this.tempPulseColor2;\n\t\t\trenderer.setRenderTarget( this.renderTargetEdgeBuffer1 );\n\t\t\trenderer.clear();\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t\t// 4. Apply Blur on Half res\n\t\t\tthis.fsQuad.material = this.separableBlurMaterial1;\n\t\t\tthis.separableBlurMaterial1.uniforms[ 'colorTexture' ].value = this.renderTargetEdgeBuffer1.texture;\n\t\t\tthis.separableBlurMaterial1.uniforms[ 'direction' ].value = OutlinePass.BlurDirectionX;\n\t\t\tthis.separableBlurMaterial1.uniforms[ 'kernelRadius' ].value = this.edgeThickness;\n\t\t\trenderer.setRenderTarget( this.renderTargetBlurBuffer1 );\n\t\t\trenderer.clear();\n\t\t\tthis.fsQuad.render( renderer );\n\t\t\tthis.separableBlurMaterial1.uniforms[ 'colorTexture' ].value = this.renderTargetBlurBuffer1.texture;\n\t\t\tthis.separableBlurMaterial1.uniforms[ 'direction' ].value = OutlinePass.BlurDirectionY;\n\t\t\trenderer.setRenderTarget( this.renderTargetEdgeBuffer1 );\n\t\t\trenderer.clear();\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t\t// Apply Blur on quarter res\n\t\t\tthis.fsQuad.material = this.separableBlurMaterial2;\n\t\t\tthis.separableBlurMaterial2.uniforms[ 'colorTexture' ].value = this.renderTargetEdgeBuffer1.texture;\n\t\t\tthis.separableBlurMaterial2.uniforms[ 'direction' ].value = OutlinePass.BlurDirectionX;\n\t\t\trenderer.setRenderTarget( this.renderTargetBlurBuffer2 );\n\t\t\trenderer.clear();\n\t\t\tthis.fsQuad.render( renderer );\n\t\t\tthis.separableBlurMaterial2.uniforms[ 'colorTexture' ].value = this.renderTargetBlurBuffer2.texture;\n\t\t\tthis.separableBlurMaterial2.uniforms[ 'direction' ].value = OutlinePass.BlurDirectionY;\n\t\t\trenderer.setRenderTarget( this.renderTargetEdgeBuffer2 );\n\t\t\trenderer.clear();\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t\t// Blend it additively over the input texture\n\t\t\tthis.fsQuad.material = this.overlayMaterial;\n\t\t\tthis.overlayMaterial.uniforms[ 'maskTexture' ].value = this.renderTargetMaskBuffer.texture;\n\t\t\tthis.overlayMaterial.uniforms[ 'edgeTexture1' ].value = this.renderTargetEdgeBuffer1.texture;\n\t\t\tthis.overlayMaterial.uniforms[ 'edgeTexture2' ].value = this.renderTargetEdgeBuffer2.texture;\n\t\t\tthis.overlayMaterial.uniforms[ 'patternTexture' ].value = this.patternTexture;\n\t\t\tthis.overlayMaterial.uniforms[ 'edgeStrength' ].value = this.edgeStrength;\n\t\t\tthis.overlayMaterial.uniforms[ 'edgeGlow' ].value = this.edgeGlow;\n\t\t\tthis.overlayMaterial.uniforms[ 'usePatternTexture' ].value = this.usePatternTexture;\n\n\n\t\t\tif ( maskActive ) renderer.state.buffers.stencil.setTest( true );\n\n\t\t\trenderer.setRenderTarget( readBuffer );\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t\trenderer.setClearColor( this._oldClearColor, this.oldClearAlpha );\n\t\t\trenderer.autoClear = oldAutoClear;\n\n\t\t}\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\tthis.fsQuad.material = this.materialCopy;\n\t\t\tthis.copyUniforms[ 'tDiffuse' ].value = readBuffer.texture;\n\t\t\trenderer.setRenderTarget( null );\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t}\n\n\t}\n\n\tgetPrepareMaskMaterial() {\n\n\t\treturn new ShaderMaterial( {\n\n\t\t\tuniforms: {\n\t\t\t\t'depthTexture': { value: null },\n\t\t\t\t'cameraNearFar': { value: new Vector2( 0.5, 0.5 ) },\n\t\t\t\t'textureMatrix': { value: null }\n\t\t\t},\n\n\t\t\tvertexShader:\n\t\t\t\t`#include <morphtarget_pars_vertex>\n\t\t\t\t#include <skinning_pars_vertex>\n\n\t\t\t\tvarying vec4 projTexCoord;\n\t\t\t\tvarying vec4 vPosition;\n\t\t\t\tuniform mat4 textureMatrix;\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\t#include <skinbase_vertex>\n\t\t\t\t\t#include <begin_vertex>\n\t\t\t\t\t#include <morphtarget_vertex>\n\t\t\t\t\t#include <skinning_vertex>\n\t\t\t\t\t#include <project_vertex>\n\n\t\t\t\t\tvPosition = mvPosition;\n\n\t\t\t\t\tvec4 worldPosition = vec4( transformed, 1.0 );\n\n\t\t\t\t\t#ifdef USE_INSTANCING\n\n\t\t\t\t\t\tworldPosition = instanceMatrix * worldPosition;\n\n\t\t\t\t\t#endif\n\t\t\t\t\t\n\t\t\t\t\tworldPosition = modelMatrix * worldPosition;\n\n\t\t\t\t\tprojTexCoord = textureMatrix * worldPosition;\n\n\t\t\t\t}`,\n\n\t\t\tfragmentShader:\n\t\t\t\t`#include <packing>\n\t\t\t\tvarying vec4 vPosition;\n\t\t\t\tvarying vec4 projTexCoord;\n\t\t\t\tuniform sampler2D depthTexture;\n\t\t\t\tuniform vec2 cameraNearFar;\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tfloat depth = unpackRGBAToDepth(texture2DProj( depthTexture, projTexCoord ));\n\t\t\t\t\tfloat viewZ = - DEPTH_TO_VIEW_Z( depth, cameraNearFar.x, cameraNearFar.y );\n\t\t\t\t\tfloat depthTest = (-vPosition.z > viewZ) ? 1.0 : 0.0;\n\t\t\t\t\tgl_FragColor = vec4(0.0, depthTest, 1.0, 1.0);\n\n\t\t\t\t}`\n\n\t\t} );\n\n\t}\n\n\tgetEdgeDetectionMaterial() {\n\n\t\treturn new ShaderMaterial( {\n\n\t\t\tuniforms: {\n\t\t\t\t'maskTexture': { value: null },\n\t\t\t\t'texSize': { value: new Vector2( 0.5, 0.5 ) },\n\t\t\t\t'visibleEdgeColor': { value: new Vector3( 1.0, 1.0, 1.0 ) },\n\t\t\t\t'hiddenEdgeColor': { value: new Vector3( 1.0, 1.0, 1.0 ) },\n\t\t\t},\n\n\t\t\tvertexShader:\n\t\t\t\t`varying vec2 vUv;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}`,\n\n\t\t\tfragmentShader:\n\t\t\t\t`varying vec2 vUv;\n\n\t\t\t\tuniform sampler2D maskTexture;\n\t\t\t\tuniform vec2 texSize;\n\t\t\t\tuniform vec3 visibleEdgeColor;\n\t\t\t\tuniform vec3 hiddenEdgeColor;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvec2 invSize = 1.0 / texSize;\n\t\t\t\t\tvec4 uvOffset = vec4(1.0, 0.0, 0.0, 1.0) * vec4(invSize, invSize);\n\t\t\t\t\tvec4 c1 = texture2D( maskTexture, vUv + uvOffset.xy);\n\t\t\t\t\tvec4 c2 = texture2D( maskTexture, vUv - uvOffset.xy);\n\t\t\t\t\tvec4 c3 = texture2D( maskTexture, vUv + uvOffset.yw);\n\t\t\t\t\tvec4 c4 = texture2D( maskTexture, vUv - uvOffset.yw);\n\t\t\t\t\tfloat diff1 = (c1.r - c2.r)*0.5;\n\t\t\t\t\tfloat diff2 = (c3.r - c4.r)*0.5;\n\t\t\t\t\tfloat d = length( vec2(diff1, diff2) );\n\t\t\t\t\tfloat a1 = min(c1.g, c2.g);\n\t\t\t\t\tfloat a2 = min(c3.g, c4.g);\n\t\t\t\t\tfloat visibilityFactor = min(a1, a2);\n\t\t\t\t\tvec3 edgeColor = 1.0 - visibilityFactor > 0.001 ? visibleEdgeColor : hiddenEdgeColor;\n\t\t\t\t\tgl_FragColor = vec4(edgeColor, 1.0) * vec4(d);\n\t\t\t\t}`\n\t\t} );\n\n\t}\n\n\tgetSeperableBlurMaterial( maxRadius ) {\n\n\t\treturn new ShaderMaterial( {\n\n\t\t\tdefines: {\n\t\t\t\t'MAX_RADIUS': maxRadius,\n\t\t\t},\n\n\t\t\tuniforms: {\n\t\t\t\t'colorTexture': { value: null },\n\t\t\t\t'texSize': { value: new Vector2( 0.5, 0.5 ) },\n\t\t\t\t'direction': { value: new Vector2( 0.5, 0.5 ) },\n\t\t\t\t'kernelRadius': { value: 1.0 }\n\t\t\t},\n\n\t\t\tvertexShader:\n\t\t\t\t`varying vec2 vUv;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}`,\n\n\t\t\tfragmentShader:\n\t\t\t\t`#include <common>\n\t\t\t\tvarying vec2 vUv;\n\t\t\t\tuniform sampler2D colorTexture;\n\t\t\t\tuniform vec2 texSize;\n\t\t\t\tuniform vec2 direction;\n\t\t\t\tuniform float kernelRadius;\n\n\t\t\t\tfloat gaussianPdf(in float x, in float sigma) {\n\t\t\t\t\treturn 0.39894 * exp( -0.5 * x * x/( sigma * sigma))/sigma;\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvec2 invSize = 1.0 / texSize;\n\t\t\t\t\tfloat sigma = kernelRadius/2.0;\n\t\t\t\t\tfloat weightSum = gaussianPdf(0.0, sigma);\n\t\t\t\t\tvec4 diffuseSum = texture2D( colorTexture, vUv) * weightSum;\n\t\t\t\t\tvec2 delta = direction * invSize * kernelRadius/float(MAX_RADIUS);\n\t\t\t\t\tvec2 uvOffset = delta;\n\t\t\t\t\tfor( int i = 1; i <= MAX_RADIUS; i ++ ) {\n\t\t\t\t\t\tfloat x = kernelRadius * float(i) / float(MAX_RADIUS);\n\t\t\t\t\t\tfloat w = gaussianPdf(x, sigma);\n\t\t\t\t\t\tvec4 sample1 = texture2D( colorTexture, vUv + uvOffset);\n\t\t\t\t\t\tvec4 sample2 = texture2D( colorTexture, vUv - uvOffset);\n\t\t\t\t\t\tdiffuseSum += ((sample1 + sample2) * w);\n\t\t\t\t\t\tweightSum += (2.0 * w);\n\t\t\t\t\t\tuvOffset += delta;\n\t\t\t\t\t}\n\t\t\t\t\tgl_FragColor = diffuseSum/weightSum;\n\t\t\t\t}`\n\t\t} );\n\n\t}\n\n\tgetOverlayMaterial() {\n\n\t\treturn new ShaderMaterial( {\n\n\t\t\tuniforms: {\n\t\t\t\t'maskTexture': { value: null },\n\t\t\t\t'edgeTexture1': { value: null },\n\t\t\t\t'edgeTexture2': { value: null },\n\t\t\t\t'patternTexture': { value: null },\n\t\t\t\t'edgeStrength': { value: 1.0 },\n\t\t\t\t'edgeGlow': { value: 1.0 },\n\t\t\t\t'usePatternTexture': { value: 0.0 }\n\t\t\t},\n\n\t\t\tvertexShader:\n\t\t\t\t`varying vec2 vUv;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}`,\n\n\t\t\tfragmentShader:\n\t\t\t\t`varying vec2 vUv;\n\n\t\t\t\tuniform sampler2D maskTexture;\n\t\t\t\tuniform sampler2D edgeTexture1;\n\t\t\t\tuniform sampler2D edgeTexture2;\n\t\t\t\tuniform sampler2D patternTexture;\n\t\t\t\tuniform float edgeStrength;\n\t\t\t\tuniform float edgeGlow;\n\t\t\t\tuniform bool usePatternTexture;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvec4 edgeValue1 = texture2D(edgeTexture1, vUv);\n\t\t\t\t\tvec4 edgeValue2 = texture2D(edgeTexture2, vUv);\n\t\t\t\t\tvec4 maskColor = texture2D(maskTexture, vUv);\n\t\t\t\t\tvec4 patternColor = texture2D(patternTexture, 6.0 * vUv);\n\t\t\t\t\tfloat visibilityFactor = 1.0 - maskColor.g > 0.0 ? 1.0 : 0.5;\n\t\t\t\t\tvec4 edgeValue = edgeValue1 + edgeValue2 * edgeGlow;\n\t\t\t\t\tvec4 finalColor = edgeStrength * maskColor.r * edgeValue;\n\t\t\t\t\tif(usePatternTexture)\n\t\t\t\t\t\tfinalColor += + visibilityFactor * (1.0 - maskColor.r) * (1.0 - patternColor.r);\n\t\t\t\t\tgl_FragColor = finalColor;\n\t\t\t\t}`,\n\t\t\tblending: AdditiveBlending,\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\ttransparent: true\n\t\t} );\n\n\t}\n\n}\n\nOutlinePass.BlurDirectionX = new Vector2( 1.0, 0.0 );\nOutlinePass.BlurDirectionY = new Vector2( 0.0, 1.0 );\n\nexport { OutlinePass };\n","import {\n\tVector2\n} from 'three';\n\n/**\n * WebGL port of Subpixel Morphological Antialiasing (SMAA) v2.8\n * Preset: SMAA 1x Medium (with color edge detection)\n * https://github.com/iryoku/smaa/releases/tag/v2.8\n */\n\nconst SMAAEdgesShader = {\n\n\tdefines: {\n\n\t\t'SMAA_THRESHOLD': '0.1'\n\n\t},\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'resolution': { value: new Vector2( 1 / 1024, 1 / 512 ) }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tuniform vec2 resolution;\n\n\t\tvarying vec2 vUv;\n\t\tvarying vec4 vOffset[ 3 ];\n\n\t\tvoid SMAAEdgeDetectionVS( vec2 texcoord ) {\n\t\t\tvOffset[ 0 ] = texcoord.xyxy + resolution.xyxy * vec4( -1.0, 0.0, 0.0, 1.0 ); // WebGL port note: Changed sign in W component\n\t\t\tvOffset[ 1 ] = texcoord.xyxy + resolution.xyxy * vec4( 1.0, 0.0, 0.0, -1.0 ); // WebGL port note: Changed sign in W component\n\t\t\tvOffset[ 2 ] = texcoord.xyxy + resolution.xyxy * vec4( -2.0, 0.0, 0.0, 2.0 ); // WebGL port note: Changed sign in W component\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\n\t\t\tSMAAEdgeDetectionVS( vUv );\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\t\tvarying vec4 vOffset[ 3 ];\n\n\t\tvec4 SMAAColorEdgeDetectionPS( vec2 texcoord, vec4 offset[3], sampler2D colorTex ) {\n\t\t\tvec2 threshold = vec2( SMAA_THRESHOLD, SMAA_THRESHOLD );\n\n\t\t\t// Calculate color deltas:\n\t\t\tvec4 delta;\n\t\t\tvec3 C = texture2D( colorTex, texcoord ).rgb;\n\n\t\t\tvec3 Cleft = texture2D( colorTex, offset[0].xy ).rgb;\n\t\t\tvec3 t = abs( C - Cleft );\n\t\t\tdelta.x = max( max( t.r, t.g ), t.b );\n\n\t\t\tvec3 Ctop = texture2D( colorTex, offset[0].zw ).rgb;\n\t\t\tt = abs( C - Ctop );\n\t\t\tdelta.y = max( max( t.r, t.g ), t.b );\n\n\t\t\t// We do the usual threshold:\n\t\t\tvec2 edges = step( threshold, delta.xy );\n\n\t\t\t// Then discard if there is no edge:\n\t\t\tif ( dot( edges, vec2( 1.0, 1.0 ) ) == 0.0 )\n\t\t\t\tdiscard;\n\n\t\t\t// Calculate right and bottom deltas:\n\t\t\tvec3 Cright = texture2D( colorTex, offset[1].xy ).rgb;\n\t\t\tt = abs( C - Cright );\n\t\t\tdelta.z = max( max( t.r, t.g ), t.b );\n\n\t\t\tvec3 Cbottom = texture2D( colorTex, offset[1].zw ).rgb;\n\t\t\tt = abs( C - Cbottom );\n\t\t\tdelta.w = max( max( t.r, t.g ), t.b );\n\n\t\t\t// Calculate the maximum delta in the direct neighborhood:\n\t\t\tfloat maxDelta = max( max( max( delta.x, delta.y ), delta.z ), delta.w );\n\n\t\t\t// Calculate left-left and top-top deltas:\n\t\t\tvec3 Cleftleft = texture2D( colorTex, offset[2].xy ).rgb;\n\t\t\tt = abs( C - Cleftleft );\n\t\t\tdelta.z = max( max( t.r, t.g ), t.b );\n\n\t\t\tvec3 Ctoptop = texture2D( colorTex, offset[2].zw ).rgb;\n\t\t\tt = abs( C - Ctoptop );\n\t\t\tdelta.w = max( max( t.r, t.g ), t.b );\n\n\t\t\t// Calculate the final maximum delta:\n\t\t\tmaxDelta = max( max( maxDelta, delta.z ), delta.w );\n\n\t\t\t// Local contrast adaptation in action:\n\t\t\tedges.xy *= step( 0.5 * maxDelta, delta.xy );\n\n\t\t\treturn vec4( edges, 0.0, 0.0 );\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tgl_FragColor = SMAAColorEdgeDetectionPS( vUv, vOffset, tDiffuse );\n\n\t\t}`\n\n};\n\nconst SMAAWeightsShader = {\n\n\tdefines: {\n\n\t\t'SMAA_MAX_SEARCH_STEPS': '8',\n\t\t'SMAA_AREATEX_MAX_DISTANCE': '16',\n\t\t'SMAA_AREATEX_PIXEL_SIZE': '( 1.0 / vec2( 160.0, 560.0 ) )',\n\t\t'SMAA_AREATEX_SUBTEX_SIZE': '( 1.0 / 7.0 )'\n\n\t},\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'tArea': { value: null },\n\t\t'tSearch': { value: null },\n\t\t'resolution': { value: new Vector2( 1 / 1024, 1 / 512 ) }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tuniform vec2 resolution;\n\n\t\tvarying vec2 vUv;\n\t\tvarying vec4 vOffset[ 3 ];\n\t\tvarying vec2 vPixcoord;\n\n\t\tvoid SMAABlendingWeightCalculationVS( vec2 texcoord ) {\n\t\t\tvPixcoord = texcoord / resolution;\n\n\t\t\t// We will use these offsets for the searches later on (see @PSEUDO_GATHER4):\n\t\t\tvOffset[ 0 ] = texcoord.xyxy + resolution.xyxy * vec4( -0.25, 0.125, 1.25, 0.125 ); // WebGL port note: Changed sign in Y and W components\n\t\t\tvOffset[ 1 ] = texcoord.xyxy + resolution.xyxy * vec4( -0.125, 0.25, -0.125, -1.25 ); // WebGL port note: Changed sign in Y and W components\n\n\t\t\t// And these for the searches, they indicate the ends of the loops:\n\t\t\tvOffset[ 2 ] = vec4( vOffset[ 0 ].xz, vOffset[ 1 ].yw ) + vec4( -2.0, 2.0, -2.0, 2.0 ) * resolution.xxyy * float( SMAA_MAX_SEARCH_STEPS );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\n\t\t\tSMAABlendingWeightCalculationVS( vUv );\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\t#define SMAASampleLevelZeroOffset( tex, coord, offset ) texture2D( tex, coord + float( offset ) * resolution, 0.0 )\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform sampler2D tArea;\n\t\tuniform sampler2D tSearch;\n\t\tuniform vec2 resolution;\n\n\t\tvarying vec2 vUv;\n\t\tvarying vec4 vOffset[3];\n\t\tvarying vec2 vPixcoord;\n\n\t\t#if __VERSION__ == 100\n\t\tvec2 round( vec2 x ) {\n\t\t\treturn sign( x ) * floor( abs( x ) + 0.5 );\n\t\t}\n\t\t#endif\n\n\t\tfloat SMAASearchLength( sampler2D searchTex, vec2 e, float bias, float scale ) {\n\t\t\t// Not required if searchTex accesses are set to point:\n\t\t\t// float2 SEARCH_TEX_PIXEL_SIZE = 1.0 / float2(66.0, 33.0);\n\t\t\t// e = float2(bias, 0.0) + 0.5 * SEARCH_TEX_PIXEL_SIZE +\n\t\t\t// e * float2(scale, 1.0) * float2(64.0, 32.0) * SEARCH_TEX_PIXEL_SIZE;\n\t\t\te.r = bias + e.r * scale;\n\t\t\treturn 255.0 * texture2D( searchTex, e, 0.0 ).r;\n\t\t}\n\n\t\tfloat SMAASearchXLeft( sampler2D edgesTex, sampler2D searchTex, vec2 texcoord, float end ) {\n\t\t\t/**\n\t\t\t\t* @PSEUDO_GATHER4\n\t\t\t\t* This texcoord has been offset by (-0.25, -0.125) in the vertex shader to\n\t\t\t\t* sample between edge, thus fetching four edges in a row.\n\t\t\t\t* Sampling with different offsets in each direction allows to disambiguate\n\t\t\t\t* which edges are active from the four fetched ones.\n\t\t\t\t*/\n\t\t\tvec2 e = vec2( 0.0, 1.0 );\n\n\t\t\tfor ( int i = 0; i < SMAA_MAX_SEARCH_STEPS; i ++ ) { // WebGL port note: Changed while to for\n\t\t\t\te = texture2D( edgesTex, texcoord, 0.0 ).rg;\n\t\t\t\ttexcoord -= vec2( 2.0, 0.0 ) * resolution;\n\t\t\t\tif ( ! ( texcoord.x > end && e.g > 0.8281 && e.r == 0.0 ) ) break;\n\t\t\t}\n\n\t\t\t// We correct the previous (-0.25, -0.125) offset we applied:\n\t\t\ttexcoord.x += 0.25 * resolution.x;\n\n\t\t\t// The searches are bias by 1, so adjust the coords accordingly:\n\t\t\ttexcoord.x += resolution.x;\n\n\t\t\t// Disambiguate the length added by the last step:\n\t\t\ttexcoord.x += 2.0 * resolution.x; // Undo last step\n\t\t\ttexcoord.x -= resolution.x * SMAASearchLength(searchTex, e, 0.0, 0.5);\n\n\t\t\treturn texcoord.x;\n\t\t}\n\n\t\tfloat SMAASearchXRight( sampler2D edgesTex, sampler2D searchTex, vec2 texcoord, float end ) {\n\t\t\tvec2 e = vec2( 0.0, 1.0 );\n\n\t\t\tfor ( int i = 0; i < SMAA_MAX_SEARCH_STEPS; i ++ ) { // WebGL port note: Changed while to for\n\t\t\t\te = texture2D( edgesTex, texcoord, 0.0 ).rg;\n\t\t\t\ttexcoord += vec2( 2.0, 0.0 ) * resolution;\n\t\t\t\tif ( ! ( texcoord.x < end && e.g > 0.8281 && e.r == 0.0 ) ) break;\n\t\t\t}\n\n\t\t\ttexcoord.x -= 0.25 * resolution.x;\n\t\t\ttexcoord.x -= resolution.x;\n\t\t\ttexcoord.x -= 2.0 * resolution.x;\n\t\t\ttexcoord.x += resolution.x * SMAASearchLength( searchTex, e, 0.5, 0.5 );\n\n\t\t\treturn texcoord.x;\n\t\t}\n\n\t\tfloat SMAASearchYUp( sampler2D edgesTex, sampler2D searchTex, vec2 texcoord, float end ) {\n\t\t\tvec2 e = vec2( 1.0, 0.0 );\n\n\t\t\tfor ( int i = 0; i < SMAA_MAX_SEARCH_STEPS; i ++ ) { // WebGL port note: Changed while to for\n\t\t\t\te = texture2D( edgesTex, texcoord, 0.0 ).rg;\n\t\t\t\ttexcoord += vec2( 0.0, 2.0 ) * resolution; // WebGL port note: Changed sign\n\t\t\t\tif ( ! ( texcoord.y > end && e.r > 0.8281 && e.g == 0.0 ) ) break;\n\t\t\t}\n\n\t\t\ttexcoord.y -= 0.25 * resolution.y; // WebGL port note: Changed sign\n\t\t\ttexcoord.y -= resolution.y; // WebGL port note: Changed sign\n\t\t\ttexcoord.y -= 2.0 * resolution.y; // WebGL port note: Changed sign\n\t\t\ttexcoord.y += resolution.y * SMAASearchLength( searchTex, e.gr, 0.0, 0.5 ); // WebGL port note: Changed sign\n\n\t\t\treturn texcoord.y;\n\t\t}\n\n\t\tfloat SMAASearchYDown( sampler2D edgesTex, sampler2D searchTex, vec2 texcoord, float end ) {\n\t\t\tvec2 e = vec2( 1.0, 0.0 );\n\n\t\t\tfor ( int i = 0; i < SMAA_MAX_SEARCH_STEPS; i ++ ) { // WebGL port note: Changed while to for\n\t\t\t\te = texture2D( edgesTex, texcoord, 0.0 ).rg;\n\t\t\t\ttexcoord -= vec2( 0.0, 2.0 ) * resolution; // WebGL port note: Changed sign\n\t\t\t\tif ( ! ( texcoord.y < end && e.r > 0.8281 && e.g == 0.0 ) ) break;\n\t\t\t}\n\n\t\t\ttexcoord.y += 0.25 * resolution.y; // WebGL port note: Changed sign\n\t\t\ttexcoord.y += resolution.y; // WebGL port note: Changed sign\n\t\t\ttexcoord.y += 2.0 * resolution.y; // WebGL port note: Changed sign\n\t\t\ttexcoord.y -= resolution.y * SMAASearchLength( searchTex, e.gr, 0.5, 0.5 ); // WebGL port note: Changed sign\n\n\t\t\treturn texcoord.y;\n\t\t}\n\n\t\tvec2 SMAAArea( sampler2D areaTex, vec2 dist, float e1, float e2, float offset ) {\n\t\t\t// Rounding prevents precision errors of bilinear filtering:\n\t\t\tvec2 texcoord = float( SMAA_AREATEX_MAX_DISTANCE ) * round( 4.0 * vec2( e1, e2 ) ) + dist;\n\n\t\t\t// We do a scale and bias for mapping to texel space:\n\t\t\ttexcoord = SMAA_AREATEX_PIXEL_SIZE * texcoord + ( 0.5 * SMAA_AREATEX_PIXEL_SIZE );\n\n\t\t\t// Move to proper place, according to the subpixel offset:\n\t\t\ttexcoord.y += SMAA_AREATEX_SUBTEX_SIZE * offset;\n\n\t\t\treturn texture2D( areaTex, texcoord, 0.0 ).rg;\n\t\t}\n\n\t\tvec4 SMAABlendingWeightCalculationPS( vec2 texcoord, vec2 pixcoord, vec4 offset[ 3 ], sampler2D edgesTex, sampler2D areaTex, sampler2D searchTex, ivec4 subsampleIndices ) {\n\t\t\tvec4 weights = vec4( 0.0, 0.0, 0.0, 0.0 );\n\n\t\t\tvec2 e = texture2D( edgesTex, texcoord ).rg;\n\n\t\t\tif ( e.g > 0.0 ) { // Edge at north\n\t\t\t\tvec2 d;\n\n\t\t\t\t// Find the distance to the left:\n\t\t\t\tvec2 coords;\n\t\t\t\tcoords.x = SMAASearchXLeft( edgesTex, searchTex, offset[ 0 ].xy, offset[ 2 ].x );\n\t\t\t\tcoords.y = offset[ 1 ].y; // offset[1].y = texcoord.y - 0.25 * resolution.y (@CROSSING_OFFSET)\n\t\t\t\td.x = coords.x;\n\n\t\t\t\t// Now fetch the left crossing edges, two at a time using bilinear\n\t\t\t\t// filtering. Sampling at -0.25 (see @CROSSING_OFFSET) enables to\n\t\t\t\t// discern what value each edge has:\n\t\t\t\tfloat e1 = texture2D( edgesTex, coords, 0.0 ).r;\n\n\t\t\t\t// Find the distance to the right:\n\t\t\t\tcoords.x = SMAASearchXRight( edgesTex, searchTex, offset[ 0 ].zw, offset[ 2 ].y );\n\t\t\t\td.y = coords.x;\n\n\t\t\t\t// We want the distances to be in pixel units (doing this here allow to\n\t\t\t\t// better interleave arithmetic and memory accesses):\n\t\t\t\td = d / resolution.x - pixcoord.x;\n\n\t\t\t\t// SMAAArea below needs a sqrt, as the areas texture is compressed\n\t\t\t\t// quadratically:\n\t\t\t\tvec2 sqrt_d = sqrt( abs( d ) );\n\n\t\t\t\t// Fetch the right crossing edges:\n\t\t\t\tcoords.y -= 1.0 * resolution.y; // WebGL port note: Added\n\t\t\t\tfloat e2 = SMAASampleLevelZeroOffset( edgesTex, coords, ivec2( 1, 0 ) ).r;\n\n\t\t\t\t// Ok, we know how this pattern looks like, now it is time for getting\n\t\t\t\t// the actual area:\n\t\t\t\tweights.rg = SMAAArea( areaTex, sqrt_d, e1, e2, float( subsampleIndices.y ) );\n\t\t\t}\n\n\t\t\tif ( e.r > 0.0 ) { // Edge at west\n\t\t\t\tvec2 d;\n\n\t\t\t\t// Find the distance to the top:\n\t\t\t\tvec2 coords;\n\n\t\t\t\tcoords.y = SMAASearchYUp( edgesTex, searchTex, offset[ 1 ].xy, offset[ 2 ].z );\n\t\t\t\tcoords.x = offset[ 0 ].x; // offset[1].x = texcoord.x - 0.25 * resolution.x;\n\t\t\t\td.x = coords.y;\n\n\t\t\t\t// Fetch the top crossing edges:\n\t\t\t\tfloat e1 = texture2D( edgesTex, coords, 0.0 ).g;\n\n\t\t\t\t// Find the distance to the bottom:\n\t\t\t\tcoords.y = SMAASearchYDown( edgesTex, searchTex, offset[ 1 ].zw, offset[ 2 ].w );\n\t\t\t\td.y = coords.y;\n\n\t\t\t\t// We want the distances to be in pixel units:\n\t\t\t\td = d / resolution.y - pixcoord.y;\n\n\t\t\t\t// SMAAArea below needs a sqrt, as the areas texture is compressed\n\t\t\t\t// quadratically:\n\t\t\t\tvec2 sqrt_d = sqrt( abs( d ) );\n\n\t\t\t\t// Fetch the bottom crossing edges:\n\t\t\t\tcoords.y -= 1.0 * resolution.y; // WebGL port note: Added\n\t\t\t\tfloat e2 = SMAASampleLevelZeroOffset( edgesTex, coords, ivec2( 0, 1 ) ).g;\n\n\t\t\t\t// Get the area for this direction:\n\t\t\t\tweights.ba = SMAAArea( areaTex, sqrt_d, e1, e2, float( subsampleIndices.x ) );\n\t\t\t}\n\n\t\t\treturn weights;\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tgl_FragColor = SMAABlendingWeightCalculationPS( vUv, vPixcoord, vOffset, tDiffuse, tArea, tSearch, ivec4( 0.0 ) );\n\n\t\t}`\n\n};\n\nconst SMAABlendShader = {\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'tColor': { value: null },\n\t\t'resolution': { value: new Vector2( 1 / 1024, 1 / 512 ) }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tuniform vec2 resolution;\n\n\t\tvarying vec2 vUv;\n\t\tvarying vec4 vOffset[ 2 ];\n\n\t\tvoid SMAANeighborhoodBlendingVS( vec2 texcoord ) {\n\t\t\tvOffset[ 0 ] = texcoord.xyxy + resolution.xyxy * vec4( -1.0, 0.0, 0.0, 1.0 ); // WebGL port note: Changed sign in W component\n\t\t\tvOffset[ 1 ] = texcoord.xyxy + resolution.xyxy * vec4( 1.0, 0.0, 0.0, -1.0 ); // WebGL port note: Changed sign in W component\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\n\t\t\tSMAANeighborhoodBlendingVS( vUv );\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform sampler2D tColor;\n\t\tuniform vec2 resolution;\n\n\t\tvarying vec2 vUv;\n\t\tvarying vec4 vOffset[ 2 ];\n\n\t\tvec4 SMAANeighborhoodBlendingPS( vec2 texcoord, vec4 offset[ 2 ], sampler2D colorTex, sampler2D blendTex ) {\n\t\t\t// Fetch the blending weights for current pixel:\n\t\t\tvec4 a;\n\t\t\ta.xz = texture2D( blendTex, texcoord ).xz;\n\t\t\ta.y = texture2D( blendTex, offset[ 1 ].zw ).g;\n\t\t\ta.w = texture2D( blendTex, offset[ 1 ].xy ).a;\n\n\t\t\t// Is there any blending weight with a value greater than 0.0?\n\t\t\tif ( dot(a, vec4( 1.0, 1.0, 1.0, 1.0 )) < 1e-5 ) {\n\t\t\t\treturn texture2D( colorTex, texcoord, 0.0 );\n\t\t\t} else {\n\t\t\t\t// Up to 4 lines can be crossing a pixel (one through each edge). We\n\t\t\t\t// favor blending by choosing the line with the maximum weight for each\n\t\t\t\t// direction:\n\t\t\t\tvec2 offset;\n\t\t\t\toffset.x = a.a > a.b ? a.a : -a.b; // left vs. right\n\t\t\t\toffset.y = a.g > a.r ? -a.g : a.r; // top vs. bottom // WebGL port note: Changed signs\n\n\t\t\t\t// Then we go in the direction that has the maximum weight:\n\t\t\t\tif ( abs( offset.x ) > abs( offset.y )) { // horizontal vs. vertical\n\t\t\t\t\toffset.y = 0.0;\n\t\t\t\t} else {\n\t\t\t\t\toffset.x = 0.0;\n\t\t\t\t}\n\n\t\t\t\t// Fetch the opposite color and lerp by hand:\n\t\t\t\tvec4 C = texture2D( colorTex, texcoord, 0.0 );\n\t\t\t\ttexcoord += sign( offset ) * resolution;\n\t\t\t\tvec4 Cop = texture2D( colorTex, texcoord, 0.0 );\n\t\t\t\tfloat s = abs( offset.x ) > abs( offset.y ) ? abs( offset.x ) : abs( offset.y );\n\n\t\t\t\t// WebGL port note: Added gamma correction\n\t\t\t\tC.xyz = pow(C.xyz, vec3(2.2));\n\t\t\t\tCop.xyz = pow(Cop.xyz, vec3(2.2));\n\t\t\t\tvec4 mixed = mix(C, Cop, s);\n\t\t\t\tmixed.xyz = pow(mixed.xyz, vec3(1.0 / 2.2));\n\n\t\t\t\treturn mixed;\n\t\t\t}\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tgl_FragColor = SMAANeighborhoodBlendingPS( vUv, vOffset, tColor, tDiffuse );\n\n\t\t}`\n\n};\n\nexport { SMAAEdgesShader, SMAAWeightsShader, SMAABlendShader };\n","import {\n\tLinearFilter,\n\tNearestFilter,\n\tShaderMaterial,\n\tTexture,\n\tUniformsUtils,\n\tWebGLRenderTarget\n} from 'three';\nimport { Pass, FullScreenQuad } from 'three/examples/jsm/postprocessing/Pass.js';\nimport { SMAAEdgesShader } from 'three/examples/jsm/shaders/SMAAShader.js';\nimport { SMAAWeightsShader } from 'three/examples/jsm/shaders/SMAAShader.js';\nimport { SMAABlendShader } from 'three/examples/jsm/shaders/SMAAShader.js';\n\nclass SMAAPass extends Pass {\n\n\tconstructor( width, height ) {\n\n\t\tsuper();\n\n\t\t// render targets\n\n\t\tthis.edgesRT = new WebGLRenderTarget( width, height, {\n\t\t\tdepthBuffer: false\n\t\t} );\n\t\tthis.edgesRT.texture.name = 'SMAAPass.edges';\n\n\t\tthis.weightsRT = new WebGLRenderTarget( width, height, {\n\t\t\tdepthBuffer: false\n\t\t} );\n\t\tthis.weightsRT.texture.name = 'SMAAPass.weights';\n\n\t\t// textures\n\t\tconst scope = this;\n\n\t\tconst areaTextureImage = new Image();\n\t\tareaTextureImage.crossOrigin = \"Anonymous\";\n\t\tareaTextureImage.src = this.getAreaTexture();\n\t\tareaTextureImage.onload = function () {\n\n\t\t\t// assigning data to HTMLImageElement.src is asynchronous (see #15162)\n\t\t\tscope.areaTexture.needsUpdate = true;\n\n\t\t};\n\n\t\tthis.areaTexture = new Texture();\n\t\tthis.areaTexture.name = 'SMAAPass.area';\n\t\tthis.areaTexture.image = areaTextureImage;\n\t\tthis.areaTexture.minFilter = LinearFilter;\n\t\tthis.areaTexture.generateMipmaps = false;\n\t\tthis.areaTexture.flipY = false;\n\n\t\tconst searchTextureImage = new Image();\n\t\tsearchTextureImage.crossOrigin = \"Anonymous\";\n\t\tsearchTextureImage.src = this.getSearchTexture();\n\t\tsearchTextureImage.onload = function () {\n\n\t\t\t// assigning data to HTMLImageElement.src is asynchronous (see #15162)\n\t\t\tscope.searchTexture.needsUpdate = true;\n\n\t\t};\n\n\t\tthis.searchTexture = new Texture();\n\t\tthis.searchTexture.name = 'SMAAPass.search';\n\t\tthis.searchTexture.image = searchTextureImage;\n\t\tthis.searchTexture.magFilter = NearestFilter;\n\t\tthis.searchTexture.minFilter = NearestFilter;\n\t\tthis.searchTexture.generateMipmaps = false;\n\t\tthis.searchTexture.flipY = false;\n\n\t\t// materials - pass 1\n\n\t\tif ( SMAAEdgesShader === undefined ) {\n\n\t\t\tconsole.error( 'THREE.SMAAPass relies on SMAAShader' );\n\n\t\t}\n\n\t\tthis.uniformsEdges = UniformsUtils.clone( SMAAEdgesShader.uniforms );\n\n\t\tthis.uniformsEdges[ 'resolution' ].value.set( 1 / width, 1 / height );\n\n\t\tthis.materialEdges = new ShaderMaterial( {\n\t\t\tdefines: Object.assign( {}, SMAAEdgesShader.defines ),\n\t\t\tuniforms: this.uniformsEdges,\n\t\t\tvertexShader: SMAAEdgesShader.vertexShader,\n\t\t\tfragmentShader: SMAAEdgesShader.fragmentShader\n\t\t} );\n\n\t\t// materials - pass 2\n\n\t\tthis.uniformsWeights = UniformsUtils.clone( SMAAWeightsShader.uniforms );\n\n\t\tthis.uniformsWeights[ 'resolution' ].value.set( 1 / width, 1 / height );\n\t\tthis.uniformsWeights[ 'tDiffuse' ].value = this.edgesRT.texture;\n\t\tthis.uniformsWeights[ 'tArea' ].value = this.areaTexture;\n\t\tthis.uniformsWeights[ 'tSearch' ].value = this.searchTexture;\n\n\t\tthis.materialWeights = new ShaderMaterial( {\n\t\t\tdefines: Object.assign( {}, SMAAWeightsShader.defines ),\n\t\t\tuniforms: this.uniformsWeights,\n\t\t\tvertexShader: SMAAWeightsShader.vertexShader,\n\t\t\tfragmentShader: SMAAWeightsShader.fragmentShader\n\t\t} );\n\n\t\t// materials - pass 3\n\n\t\tthis.uniformsBlend = UniformsUtils.clone( SMAABlendShader.uniforms );\n\n\t\tthis.uniformsBlend[ 'resolution' ].value.set( 1 / width, 1 / height );\n\t\tthis.uniformsBlend[ 'tDiffuse' ].value = this.weightsRT.texture;\n\n\t\tthis.materialBlend = new ShaderMaterial( {\n\t\t\tuniforms: this.uniformsBlend,\n\t\t\tvertexShader: SMAABlendShader.vertexShader,\n\t\t\tfragmentShader: SMAABlendShader.fragmentShader\n\t\t} );\n\n\t\tthis.needsSwap = false;\n\n\t\tthis.fsQuad = new FullScreenQuad( null );\n\n\t}\n\n\trender( renderer, writeBuffer, readBuffer/*, deltaTime, maskActive*/ ) {\n\n\t\t// pass 1\n\n\t\tthis.uniformsEdges[ 'tDiffuse' ].value = readBuffer.texture;\n\n\t\tthis.fsQuad.material = this.materialEdges;\n\n\t\trenderer.setRenderTarget( this.edgesRT );\n\t\tif ( this.clear ) renderer.clear();\n\t\tthis.fsQuad.render( renderer );\n\n\t\t// pass 2\n\n\t\tthis.fsQuad.material = this.materialWeights;\n\n\t\trenderer.setRenderTarget( this.weightsRT );\n\t\tif ( this.clear ) renderer.clear();\n\t\tthis.fsQuad.render( renderer );\n\n\t\t// pass 3\n\n\t\tthis.uniformsBlend[ 'tColor' ].value = readBuffer.texture;\n\n\t\tthis.fsQuad.material = this.materialBlend;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.setRenderTarget( null );\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t} else {\n\n\t\t\trenderer.setRenderTarget( writeBuffer );\n\t\t\tif ( this.clear ) renderer.clear();\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t}\n\n\t}\n\n\tsetSize( width, height ) {\n\n\t\tthis.edgesRT.setSize( width, height );\n\t\tthis.weightsRT.setSize( width, height );\n\n\t\tthis.materialEdges.uniforms[ 'resolution' ].value.set( 1 / width, 1 / height );\n\t\tthis.materialWeights.uniforms[ 'resolution' ].value.set( 1 / width, 1 / height );\n\t\tthis.materialBlend.uniforms[ 'resolution' ].value.set( 1 / width, 1 / height );\n\n\t}\n\n\tgetAreaTexture() {\n\n\t\treturn 'data:image/png;base64,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';\n\n\t}\n\n\tgetSearchTexture() {\n\n\t\treturn 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEIAAAAhCAAAAABIXyLAAAAAOElEQVRIx2NgGAWjYBSMglEwEICREYRgFBZBqDCSLA2MGPUIVQETE9iNUAqLR5gIeoQKRgwXjwAAGn4AtaFeYLEAAAAASUVORK5CYII=';\n\n\t}\n\n dispose(){\n this.edgesRT.dispose();\n this.weightsRT.dispose();\n }\n\n}\n\nexport { SMAAPass };\n","/**\n * Gamma Correction Shader\n * http://en.wikipedia.org/wiki/gamma_correction\n */\n\nconst GammaCorrectionShader = {\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 tex = texture2D( tDiffuse, vUv );\n\n\t\t\tgl_FragColor = LinearTosRGB( tex );\n\n\t\t}`\n\n};\n\nexport { GammaCorrectionShader };\n","import {\n\tColor\n} from 'three';\n\n/**\n * Luminosity\n * http://en.wikipedia.org/wiki/Luminosity\n */\n\nconst LuminosityHighPassShader = {\n\n\tshaderID: 'luminosityHighPass',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'luminosityThreshold': { value: 1.0 },\n\t\t'smoothWidth': { value: 1.0 },\n\t\t'defaultColor': { value: new Color( 0x000000 ) },\n\t\t'defaultOpacity': { value: 0.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform vec3 defaultColor;\n\t\tuniform float defaultOpacity;\n\t\tuniform float luminosityThreshold;\n\t\tuniform float smoothWidth;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 texel = texture2D( tDiffuse, vUv );\n\n\t\t\tvec3 luma = vec3( 0.299, 0.587, 0.114 );\n\n\t\t\tfloat v = dot( texel.xyz, luma );\n\n\t\t\tvec4 outputColor = vec4( defaultColor.rgb, defaultOpacity );\n\n\t\t\tfloat alpha = smoothstep( luminosityThreshold, luminosityThreshold + smoothWidth, v );\n\n\t\t\tgl_FragColor = mix( outputColor, texel, alpha );\n\n\t\t}`\n\n};\n\nexport { LuminosityHighPassShader };\n","import {\n\tAdditiveBlending,\n\tColor,\n\tFloatType,\n\tLinearFilter,\n\tMeshBasicMaterial,\n\tRGBAFormat,\n\tShaderMaterial,\n\tUniformsUtils,\n\tVector2,\n\tVector3,\n\tWebGLRenderTarget\n} from 'three';\nimport { Pass, FullScreenQuad } from 'three/examples/jsm/postprocessing/Pass.js';\nimport { CopyShader } from 'three/examples/jsm/shaders/CopyShader.js';\nimport { LuminosityHighPassShader } from 'three/examples/jsm/shaders/LuminosityHighPassShader.js';\n\n/**\n * UnrealBloomPass is inspired by the bloom pass of Unreal Engine. It creates a\n * mip map chain of bloom textures and blurs them with different radii. Because\n * of the weighted combination of mips, and because larger blurs are done on\n * higher mips, this effect provides good quality and performance.\n *\n * Reference:\n * - https://docs.unrealengine.com/latest/INT/Engine/Rendering/PostProcessEffects/Bloom/\n */\nclass TransparentUnrealBloomPass extends Pass {\n\n\tconstructor( resolution, strength, radius, threshold ) {\n\n\t\tsuper();\n\n\t\tthis.strength = ( strength !== undefined ) ? strength : 1;\n\t\tthis.radius = radius;\n\t\tthis.threshold = threshold;\n\t\tthis.resolution = ( resolution !== undefined ) ? new Vector2( resolution.x, resolution.y ) : new Vector2( 256, 256 );\n\n\t\t// create color only once here, reuse it later inside the render function\n\t\tthis.clearColor = new Color( 0, 0, 0);\n\n\t\t// render targets\n\t\tconst pars = { minFilter: LinearFilter, magFilter: LinearFilter, format: RGBAFormat, type: FloatType, stencilBuffer: false };\n\t\tthis.renderTargetsHorizontal = [];\n\t\tthis.renderTargetsVertical = [];\n\t\tthis.nMips = 5;\n\t\tlet resx = Math.round( this.resolution.x / 2 );\n\t\tlet resy = Math.round( this.resolution.y / 2 );\n\n\t\tthis.renderTargetBright = new WebGLRenderTarget( resx, resy, pars );\n\t\tthis.renderTargetBright.texture.name = 'UnrealBloomPass.bright';\n\t\tthis.renderTargetBright.texture.generateMipmaps = false;\n\n\t\tfor ( let i = 0; i < this.nMips; i ++ ) {\n\n\t\t\tconst renderTargetHorizonal = new WebGLRenderTarget( resx, resy, pars );\n\n\t\t\trenderTargetHorizonal.texture.name = 'UnrealBloomPass.h' + i;\n\t\t\trenderTargetHorizonal.texture.generateMipmaps = false;\n\n\t\t\tthis.renderTargetsHorizontal.push( renderTargetHorizonal );\n\n\t\t\tconst renderTargetVertical = new WebGLRenderTarget( resx, resy, pars );\n\n\t\t\trenderTargetVertical.texture.name = 'UnrealBloomPass.v' + i;\n\t\t\trenderTargetVertical.texture.generateMipmaps = false;\n\n\t\t\tthis.renderTargetsVertical.push( renderTargetVertical );\n\n\t\t\tresx = Math.round( resx / 2 );\n\n\t\t\tresy = Math.round( resy / 2 );\n\n\t\t}\n\n\t\t// luminosity high pass material\n\n\t\tif ( LuminosityHighPassShader === undefined )\n\t\t\tconsole.error( 'THREE.UnrealBloomPass relies on LuminosityHighPassShader' );\n\n\t\tconst highPassShader = LuminosityHighPassShader;\n\t\tthis.highPassUniforms = UniformsUtils.clone( highPassShader.uniforms );\n\n\t\tthis.highPassUniforms[ 'luminosityThreshold' ].value = threshold;\n\t\tthis.highPassUniforms[ 'smoothWidth' ].value = 0.01;\n\n\t\tthis.materialHighPassFilter = new ShaderMaterial( {\n\t\t\tuniforms: this.highPassUniforms,\n\t\t\tvertexShader: highPassShader.vertexShader,\n\t\t\tfragmentShader: highPassShader.fragmentShader,\n\t\t\tdefines: {}\n\t\t} );\n\n\t\t// Gaussian Blur Materials\n\t\tthis.separableBlurMaterials = [];\n\t\tconst kernelSizeArray = [ 3, 5, 7, 9, 11 ];\n\t\tresx = Math.round( this.resolution.x / 2 );\n\t\tresy = Math.round( this.resolution.y / 2 );\n\n\t\tfor ( let i = 0; i < this.nMips; i ++ ) {\n\n\t\t\tthis.separableBlurMaterials.push( this.getSeperableBlurMaterial( kernelSizeArray[ i ] ) );\n\n\t\t\tthis.separableBlurMaterials[ i ].uniforms[ 'texSize' ].value = new Vector2( resx, resy );\n\n\t\t\tresx = Math.round( resx / 2 );\n\n\t\t\tresy = Math.round( resy / 2 );\n\n\t\t}\n\n\t\t// Composite material\n\t\tthis.compositeMaterial = this.getCompositeMaterial( this.nMips );\n\t\tthis.compositeMaterial.uniforms[ 'blurTexture1' ].value = this.renderTargetsVertical[ 0 ].texture;\n\t\tthis.compositeMaterial.uniforms[ 'blurTexture2' ].value = this.renderTargetsVertical[ 1 ].texture;\n\t\tthis.compositeMaterial.uniforms[ 'blurTexture3' ].value = this.renderTargetsVertical[ 2 ].texture;\n\t\tthis.compositeMaterial.uniforms[ 'blurTexture4' ].value = this.renderTargetsVertical[ 3 ].texture;\n\t\tthis.compositeMaterial.uniforms[ 'blurTexture5' ].value = this.renderTargetsVertical[ 4 ].texture;\n\t\tthis.compositeMaterial.uniforms[ 'bloomStrength' ].value = strength;\n\t\tthis.compositeMaterial.uniforms[ 'bloomRadius' ].value = 0.1;\n\t\tthis.compositeMaterial.needsUpdate = true;\n\n\t\tconst bloomFactors = [ 1.0, 0.8, 0.6, 0.4, 0.2 ];\n\t\tthis.compositeMaterial.uniforms[ 'bloomFactors' ].value = bloomFactors;\n\t\tthis.bloomTintColors = [ new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ) ];\n\t\tthis.compositeMaterial.uniforms[ 'bloomTintColors' ].value = this.bloomTintColors;\n\n\t\t// copy material\n\t\tif ( CopyShader === undefined ) {\n\n\t\t\tconsole.error( 'THREE.UnrealBloomPass relies on CopyShader' );\n\n\t\t}\n\n\t\tconst copyShader = CopyShader;\n\n\t\tthis.copyUniforms = UniformsUtils.clone( copyShader.uniforms );\n\t\tthis.copyUniforms[ 'opacity' ].value = 1.0;\n\n\t\tthis.materialCopy = new ShaderMaterial( {\n\t\t\tuniforms: this.copyUniforms,\n\t\t\tvertexShader: copyShader.vertexShader,\n\t\t\tfragmentShader: copyShader.fragmentShader,\n\t\t\tblending: AdditiveBlending,\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\ttransparent: true\n\t\t} );\n\n\t\tthis.enabled = true;\n\t\tthis.needsSwap = false;\n\n\t\tthis._oldClearColor = new Color();\n\t\tthis.oldClearAlpha = 1;\n\n\t\tthis.basic = new MeshBasicMaterial();\n\n\t\tthis.fsQuad = new FullScreenQuad( null );\n\n\t}\n\n\tdispose() {\n\n\t\tfor ( let i = 0; i < this.renderTargetsHorizontal.length; i ++ ) {\n\n\t\t\tthis.renderTargetsHorizontal[ i ].dispose();\n\n\t\t}\n\n\t\tfor ( let i = 0; i < this.renderTargetsVertical.length; i ++ ) {\n\n\t\t\tthis.renderTargetsVertical[ i ].dispose();\n\n\t\t}\n\n\t\tthis.renderTargetBright.dispose();\n\n\t\tfor ( let i = 0; i < this.separableBlurMaterials.length; i ++ ) {\n\n\t\t\tthis.separableBlurMaterials[ i ].dispose();\n\n\t\t}\n\n\t\tthis.compositeMaterial.dispose();\n\t\tthis.materialCopy.dispose();\n\t\tthis.basic.dispose();\n\n\t\t//\n\n\t\tthis.fsQuad.dispose();\n\n\t}\n\n\tsetSize( width, height ) {\n\n\t\tlet resx = Math.round( width / 2 );\n\t\tlet resy = Math.round( height / 2 );\n\n\t\tthis.renderTargetBright.setSize( resx, resy );\n\n\t\tfor ( let i = 0; i < this.nMips; i ++ ) {\n\n\t\t\tthis.renderTargetsHorizontal[ i ].setSize( resx, resy );\n\t\t\tthis.renderTargetsVertical[ i ].setSize( resx, resy );\n\n\t\t\tthis.separableBlurMaterials[ i ].uniforms[ 'texSize' ].value = new Vector2( resx, resy );\n\n\t\t\tresx = Math.round( resx / 2 );\n\t\t\tresy = Math.round( resy / 2 );\n\n\t\t}\n\n\t}\n\n\trender( renderer, writeBuffer, readBuffer, deltaTime, maskActive ) {\n\t\trenderer.getClearColor( this._oldClearColor );\n\t\tthis.oldClearAlpha = renderer.getClearAlpha();\n\t\tconst oldAutoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\trenderer.setClearColor( this.clearColor, 0 );\n\n\t\tif ( maskActive ) renderer.state.buffers.stencil.setTest( false );\n\n\t\t// Render input to screen\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\tthis.fsQuad.material = this.basic;\n\t\t\tthis.basic.map = readBuffer.texture;\n\n\t\t\trenderer.setRenderTarget( null );\n\t\t\trenderer.clear();\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t}\n\n\t\t// 1. Extract Bright Areas\n\n\t\tthis.highPassUniforms[ 'tDiffuse' ].value = readBuffer.texture;\n\t\tthis.highPassUniforms[ 'luminosityThreshold' ].value = this.threshold;\n\t\tthis.fsQuad.material = this.materialHighPassFilter;\n\n\t\trenderer.setRenderTarget( this.renderTargetBright );\n\t\trenderer.clear();\n\t\tthis.fsQuad.render( renderer );\n\n\t\t// 2. Blur All the mips progressively\n\n\t\tlet inputRenderTarget = this.renderTargetBright;\n\n\t\tfor ( let i = 0; i < this.nMips; i ++ ) {\n\n\t\t\tthis.fsQuad.material = this.separableBlurMaterials[ i ];\n\n\t\t\tthis.separableBlurMaterials[ i ].uniforms[ 'colorTexture' ].value = inputRenderTarget.texture;\n\t\t\tthis.separableBlurMaterials[ i ].uniforms[ 'direction' ].value = TransparentUnrealBloomPass.BlurDirectionX;\n\t\t\trenderer.setRenderTarget( this.renderTargetsHorizontal[ i ] );\n\t\t\trenderer.clear();\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t\tthis.separableBlurMaterials[ i ].uniforms[ 'colorTexture' ].value = this.renderTargetsHorizontal[ i ].texture;\n\t\t\tthis.separableBlurMaterials[ i ].uniforms[ 'direction' ].value = TransparentUnrealBloomPass.BlurDirectionY;\n\t\t\trenderer.setRenderTarget( this.renderTargetsVertical[ i ] );\n\t\t\trenderer.clear();\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t\tinputRenderTarget = this.renderTargetsVertical[ i ];\n\n\t\t}\n\n\t\t// Composite All the mips\n\n\t\tthis.fsQuad.material = this.compositeMaterial;\n\t\tthis.compositeMaterial.uniforms[ 'bloomStrength' ].value = this.strength;\n\t\tthis.compositeMaterial.uniforms[ 'bloomRadius' ].value = this.radius;\n\t\tthis.compositeMaterial.uniforms[ 'bloomTintColors' ].value = this.bloomTintColors;\n\n\t\trenderer.setRenderTarget( this.renderTargetsHorizontal[ 0 ] );\n\t\trenderer.clear();\n\t\tthis.fsQuad.render( renderer );\n\n\t\t// Blend it additively over the input texture\n\n\t\tthis.fsQuad.material = this.materialCopy;\n\t\tthis.copyUniforms[ 'tDiffuse' ].value = this.renderTargetsHorizontal[ 0 ].texture;\n\n\t\tif ( maskActive ) renderer.state.buffers.stencil.setTest( true );\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.setRenderTarget( null );\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t} else {\n\n\t\t\trenderer.setRenderTarget( readBuffer );\n\t\t\tthis.fsQuad.render( renderer );\n\n\t\t}\n\n\t\t// Restore renderer settings\n\n\t\trenderer.setClearColor( this._oldClearColor, this.oldClearAlpha );\n\t\trenderer.autoClear = oldAutoClear;\n\n\t}\n\n\tgetSeperableBlurMaterial( kernelRadius ) {\n\n\t\treturn new ShaderMaterial( {\n\n\t\t\tdefines: {\n\t\t\t\t'KERNEL_RADIUS': kernelRadius,\n\t\t\t\t'SIGMA': kernelRadius\n\t\t\t},\n\n\t\t\tuniforms: {\n\t\t\t\t'colorTexture': { value: null },\n\t\t\t\t'texSize': { value: new Vector2( 0.5, 0.5 ) },\n\t\t\t\t'direction': { value: new Vector2( 0.5, 0.5 ) }\n\t\t\t},\n\n\t\t\tvertexShader:\n\t\t\t\t`varying vec2 vUv;\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}`,\n\n\t\t\tfragmentShader:\n\t\t\t\t`#include <common>\n\t\t\t\tvarying vec2 vUv;\n\t\t\t\tuniform sampler2D colorTexture;\n\t\t\t\tuniform vec2 texSize;\n\t\t\t\tuniform vec2 direction;\n\n\t\t\t\tfloat gaussianPdf(in float x, in float sigma) {\n\t\t\t\t\treturn 0.39894 * exp( -0.5 * x * x/( sigma * sigma))/sigma;\n\t\t\t\t}\n\t\t\t\tvoid main() {\n\t\t\t\t\tvec2 invSize = 1.0 / texSize;\n\t\t\t\t\tfloat fSigma = float(SIGMA);\n\t\t\t\t\tfloat weightSum = gaussianPdf(0.0, fSigma);\n float alphaSum = 0.0;\n\t\t\t\t\tvec3 diffuseSum = texture2D( colorTexture, vUv).rgb * weightSum;\n\t\t\t\t\tfor( int i = 1; i < KERNEL_RADIUS; i ++ ) {\n\t\t\t\t\t\tfloat x = float(i);\n\t\t\t\t\t\tfloat w = gaussianPdf(x, fSigma);\n\t\t\t\t\t\tvec2 uvOffset = direction * invSize * x;\n\t\t\t\t\t\tvec4 sample1 = texture2D( colorTexture, vUv + uvOffset);\n\t\t\t\t\t\tvec4 sample2 = texture2D( colorTexture, vUv - uvOffset);\n\t\t\t\t\t\tdiffuseSum += (sample1.rgb + sample2.rgb) * w;\n alphaSum += (sample1.a + sample2.a) * w;\n\t\t\t\t\t\tweightSum += 2.0 * w;\n\t\t\t\t\t}\n\t\t\t\t\tgl_FragColor = vec4(diffuseSum/weightSum, alphaSum/weightSum);\n\t\t\t\t}`\n\t\t} );\n\n\t}\n\n\tgetCompositeMaterial( nMips ) {\n\n\t\treturn new ShaderMaterial( {\n\n\t\t\tdefines: {\n\t\t\t\t'NUM_MIPS': nMips\n\t\t\t},\n\n\t\t\tuniforms: {\n\t\t\t\t'blurTexture1': { value: null },\n\t\t\t\t'blurTexture2': { value: null },\n\t\t\t\t'blurTexture3': { value: null },\n\t\t\t\t'blurTexture4': { value: null },\n\t\t\t\t'blurTexture5': { value: null },\n\t\t\t\t'dirtTexture': { value: null },\n\t\t\t\t'bloomStrength': { value: 1.0 },\n\t\t\t\t'bloomFactors': { value: null },\n\t\t\t\t'bloomTintColors': { value: null },\n\t\t\t\t'bloomRadius': { value: 0.0 }\n\t\t\t},\n\n\t\t\tvertexShader:\n\t\t\t\t`varying vec2 vUv;\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}`,\n\n\t\t\tfragmentShader:\n\t\t\t\t`varying vec2 vUv;\n\t\t\t\tuniform sampler2D blurTexture1;\n\t\t\t\tuniform sampler2D blurTexture2;\n\t\t\t\tuniform sampler2D blurTexture3;\n\t\t\t\tuniform sampler2D blurTexture4;\n\t\t\t\tuniform sampler2D blurTexture5;\n\t\t\t\tuniform sampler2D dirtTexture;\n\t\t\t\tuniform float bloomStrength;\n\t\t\t\tuniform float bloomRadius;\n\t\t\t\tuniform float bloomFactors[NUM_MIPS];\n\t\t\t\tuniform vec3 bloomTintColors[NUM_MIPS];\n\n\t\t\t\tfloat lerpBloomFactor(const in float factor) {\n\t\t\t\t\tfloat mirrorFactor = 1.2 - factor;\n\t\t\t\t\treturn mix(factor, mirrorFactor, bloomRadius);\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tgl_FragColor = bloomStrength * ( lerpBloomFactor(bloomFactors[0]) * vec4(bloomTintColors[0], 1.0) * texture2D(blurTexture1, vUv) +\n\t\t\t\t\t\tlerpBloomFactor(bloomFactors[1]) * vec4(bloomTintColors[1], 1.0) * texture2D(blurTexture2, vUv) +\n\t\t\t\t\t\tlerpBloomFactor(bloomFactors[2]) * vec4(bloomTintColors[2], 1.0) * texture2D(blurTexture3, vUv) +\n\t\t\t\t\t\tlerpBloomFactor(bloomFactors[3]) * vec4(bloomTintColors[3], 1.0) * texture2D(blurTexture4, vUv) +\n\t\t\t\t\t\tlerpBloomFactor(bloomFactors[4]) * vec4(bloomTintColors[4], 1.0) * texture2D(blurTexture5, vUv) );\n\t\t\t\t}`\n\t\t} );\n\n\t}\n\n}\n\nTransparentUnrealBloomPass.BlurDirectionX = new Vector2( 1.0, 0.0 );\nTransparentUnrealBloomPass.BlurDirectionY = new Vector2( 0.0, 1.0 );\n\nexport { TransparentUnrealBloomPass };\n","import { DICE_MODELS } from './DiceModels.js';\nimport { DiceSFXManager } from './DiceSFXManager.js';\nimport { RendererStats } from './libs/threex.rendererstats.js';\n//import {GLTFExporter} from 'three/examples/jsm/loaders/exporters/GLTFExporter.js';\nimport { RGBELoader } from 'three/examples/jsm/loaders/RGBELoader.js';\nimport { EffectComposer } from 'three/examples/jsm/postprocessing/EffectComposer.js';\nimport { RenderPass } from 'three/examples/jsm/postprocessing/RenderPass.js';\nimport { ShaderPass } from 'three/examples/jsm/postprocessing/ShaderPass.js';\nimport { OutlinePass } from 'three/examples/jsm/postprocessing/OutlinePass.js';\nimport { SMAAPass } from './libs/SMAAPass.js';\nimport { GammaCorrectionShader } from 'three/examples/jsm/shaders/GammaCorrectionShader.js';\nimport { TransparentUnrealBloomPass } from './libs/TransparentUnrealBloomPass.js';\n\nimport * as THREE from 'three';\n\n\nexport class DiceBox {\n\n\tconstructor(element_container, dice_factory, config) {\n\t\t//private variables\n\t\tthis.known_types = ['d4', 'd6', 'd8', 'd10', 'd12', 'd14', 'd16', 'd20', 'd24', 'd30', 'd100'];\n\t\tthis.container = element_container;\n\t\tthis.dimensions = config.dimensions;\n\t\tthis.dicefactory = dice_factory;\n\t\tthis.config = config;\n\t\tthis.speed = 1;\n\t\tthis.isVisible = false;\n\t\tthis.last_time = 0;\n\t\tthis.running = false;\n\t\tthis.allowInteractivity = false;\n\t\tthis.raycaster = new THREE.Raycaster();\n\t\tthis.blackColor = new THREE.Color(0, 0, 0);\n\t\tthis.nbIterationsBetweenRolls = 15;\n\n\t\tthis.display = {\n\t\t\tcurrentWidth: null,\n\t\t\tcurrentHeight: null,\n\t\t\tcontainerWidth: null,\n\t\t\tcontainerHeight: null,\n\t\t\taspect: null,\n\t\t\tscale: null\n\t\t};\n\n\t\tthis.mouse = {\n\t\t\tpos: new THREE.Vector2(),\n\t\t\tstartDrag: undefined,\n\t\t\tstartDragTime: undefined,\n\t\t\tconstraintDown: false,\n\t\t\tconstraint: null\n\t\t};\n\n\t\tthis.cameraHeight = {\n\t\t\tmax: null,\n\t\t\tclose: null,\n\t\t\tmedium: null,\n\t\t\tfar: null\n\t\t};\n\n\n\t\tthis.clock = new THREE.Clock();\n\t\tthis.world_sim = new CANNON.World();\n\t\tthis.dice_body_material = new CANNON.Material();\n\t\tthis.desk_body_material = new CANNON.Material();\n\t\tthis.barrier_body_material = new CANNON.Material();\n\t\tthis.sounds_table = {};\n\t\tthis.sounds_dice = {};\n\t\tthis.sounds_coins = [];\n\t\tthis.lastSoundType = '';\n\t\tthis.lastSoundStep = 0;\n\t\tthis.lastSound = 0;\n\t\tthis.iteration;\n\t\tthis.renderer;\n\t\tthis.barrier;\n\t\tthis.camera;\n\t\tthis.light;\n\t\tthis.light_amb;\n\t\tthis.desk;\n\t\tthis.pane;\n\n\t\t//public variables\n\t\tthis.public_interface = {};\n\t\tthis.diceList = []; //'private' variable\n\t\tthis.deadDiceList = [];\n\t\tthis.framerate = (1 / 60);\n\t\tthis.sounds = true;\n\t\tthis.volume = 1;\n\t\tthis.soundDelay = 1; // time between sound effects in worldstep\n\t\tthis.soundsSurface = \"felt\";\n\t\tthis.animstate = '';\n\t\tthis.throwingForce = \"medium\";\n\t\tthis.immersiveDarkness = true;\n\t\tthis.toneMappingExposureDefault = 1.0;\n\n\t\tthis.selector = {\n\t\t\tanimate: true,\n\t\t\trotate: true,\n\t\t\tintersected: null,\n\t\t\tdice: []\n\t\t};\n\t\tthis.showExtraDice = false;\n\t\tthis.muteSoundSecretRolls = false;\n\n\t\tthis.colors = {\n\t\t\tambient: 0xffeeb1,\n\t\t\tspotlight: 0x000000,\n\t\t\tground: 0x080820\n\t\t};\n\n\t\tthis.rethrowFunctions = {};\n\t\tthis.afterThrowFunctions = {};\n\n\t}\n\n\tpreloadSounds() {\n\t\t//Surfaces\n\t\tfetch(`modules/dice-so-nice/sounds/surfaces.json`).then(res => {\n\t\t\tres.json().then(json => {\n\t\t\t\tAudioHelper.preloadSound(`modules/dice-so-nice/sounds/${json.resources[0]}`).then(src => this.sounds_table.source = src);\n\t\t\t\tObject.entries(json.spritemap).forEach(sound => {\n\t\t\t\t\tlet type = sound[0].match(/surface\\_([a-z\\_]*)/)[1];\n\t\t\t\t\tif (!this.sounds_table[type])\n\t\t\t\t\t\tthis.sounds_table[type] = [];\n\t\t\t\t\tthis.sounds_table[type].push(sound[1]);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t//Hits\n\t\tfetch(`modules/dice-so-nice/sounds/dicehit.json`).then(res => {\n\t\t\tres.json().then(json => {\n\t\t\t\tthis.sounds_dice.source = AudioHelper.preloadSound(`modules/dice-so-nice/sounds/${json.resources[0]}`).then(src => this.sounds_dice.source = src);\n\t\t\t\tObject.entries(json.spritemap).forEach(sound => {\n\t\t\t\t\tlet type = sound[0].match(/dicehit\\_([a-z\\_]*)/)[1];\n\t\t\t\t\tif (!this.sounds_dice[type])\n\t\t\t\t\t\tthis.sounds_dice[type] = [];\n\t\t\t\t\tthis.sounds_dice[type].push(sound[1]);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\t}\n\n\tplayAudioSprite(source, sprite, selfVolume) {\n\t\tif (!source || !source.context)\n\t\t\treturn false;\n\t\tlet gainNode = source.context.createGain();\n\t\tgainNode.gain.value = selfVolume * this.volume * game.settings.get(\"core\", \"globalInterfaceVolume\");\n\t\tconst startTime = sprite.start;\n\t\tconst duration = sprite.end - sprite.start;\n\t\tconst sampleSource = source.context.createBufferSource();\n\t\tsampleSource.buffer = source.container.buffer;\n\t\tsampleSource.connect(gainNode).connect(source.context.destination);\n\t\tsampleSource.start(source.context.currentTime, startTime, duration);\n\t}\n\n\tinitialize() {\n\t\treturn new Promise(async resolve => {\n\t\t\tgame.audio.pending.push(this.preloadSounds.bind(this));\n\n\t\t\tawait this.dicefactory.preloadPresets();\n\n\t\t\tthis.sounds = this.config.sounds == '1';\n\t\t\tthis.volume = this.config.soundsVolume;\n\t\t\tthis.soundsSurface = this.config.soundsSurface;\n\t\t\tthis.showExtraDice = this.config.showExtraDice;\n\t\t\tthis.muteSoundSecretRolls = this.config.muteSoundSecretRolls;\n\n\t\t\tthis.allowInteractivity = this.config.boxType == \"board\" && game.settings.get(\"dice-so-nice\", \"allowInteractivity\");\n\n\t\t\tthis.dicefactory.setQualitySettings(this.config);\n\t\t\tlet globalAnimationSpeed = game.settings.get(\"dice-so-nice\", \"globalAnimationSpeed\");\n\t\t\tif (globalAnimationSpeed === \"0\")\n\t\t\t\tthis.speed = this.config.speed;\n\t\t\telse\n\t\t\t\tthis.speed = parseInt(globalAnimationSpeed, 10);\n\t\t\tthis.throwingForce = this.config.throwingForce;\n\t\t\tthis.immersiveDarkness = this.config.immersiveDarkness;\n\t\t\tthis.scene = new THREE.Scene();\n\t\t\tif (game.dice3d.dice3dRenderers[this.config.boxType] != null) {\n\t\t\t\tthis.renderer = game.dice3d.dice3dRenderers[this.config.boxType];\n\t\t\t\tthis.scene.environment = this.renderer.scopedTextureCache.textureCube;\n\t\t\t\tthis.scene.traverse(object => {\n\t\t\t\t\tif (object.type === 'Mesh') object.material.needsUpdate = true;\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tconst preserveDrawingBuffer = game.user.getFlag(\"dice-so-nice\", \"preserveDrawingBuffer\") || false;\n\t\t\t\tthis.renderer = new THREE.WebGLRenderer({ antialias: false, alpha: true, powerPreference: \"high-performance\", preserveDrawingBuffer: preserveDrawingBuffer});\n\t\t\t\tif (this.dicefactory.useHighDPI)\n\t\t\t\t\tthis.renderer.setPixelRatio(window.devicePixelRatio);\n\t\t\t\tif (this.dicefactory.realisticLighting) {\n\t\t\t\t\tthis.renderer.toneMapping = THREE.ACESFilmicToneMapping;\n\t\t\t\t\tthis.renderer.toneMappingExposure = this.toneMappingExposureDefault;\n\t\t\t\t}\n\t\t\t\tconst capabilities = this.renderer.capabilities;\n\t\t\t\tthis.anisotropy = capabilities.getMaxAnisotropy() < 16 ? capabilities.getMaxAnisotropy() : 16;\n\t\t\t\tawait this.loadContextScopedTextures(this.config.boxType);\n\t\t\t\tthis.dicefactory.initializeMaterials();\n\t\t\t\tgame.dice3d.dice3dRenderers[this.config.boxType] = this.renderer;\n\t\t\t}\n\n\t\t\tif (false && this.config.boxType == \"board\") {\n\t\t\t\tthis.rendererStats = new RendererStats()\n\n\t\t\t\tthis.rendererStats.domElement.style.position = 'absolute';\n\t\t\t\tthis.rendererStats.domElement.style.left = '44px';\n\t\t\t\tthis.rendererStats.domElement.style.bottom = '178px';\n\t\t\t\tthis.rendererStats.domElement.style.transform = 'scale(2)';\n\t\t\t\tdocument.body.appendChild(this.rendererStats.domElement);\n\t\t\t}\n\n\t\t\tthis.container.appendChild(this.renderer.domElement);\n\t\t\tthis.renderer.shadowMap.enabled = this.dicefactory.shadows;\n\t\t\tthis.renderer.shadowMap.type = this.dicefactory.shadowQuality == \"high\" ? THREE.PCFSoftShadowMap : THREE.PCFShadowMap;\n\t\t\tthis.renderer.setClearColor(0x000000, 0.0);\n\n\t\t\tthis.setScene(this.config.dimensions);\n\n\t\t\tthis.world_sim.gravity.set(0, 0, -9.8 * 800);\n\t\t\tthis.world_sim.broadphase = new CANNON.NaiveBroadphase();\n\t\t\tthis.world_sim.solver.iterations = 14;\n\t\t\tthis.world_sim.allowSleep = true;\n\n\t\t\tlet contactMaterial = new CANNON.ContactMaterial(this.desk_body_material, this.dice_body_material, { friction: 0.01, restitution: 0.5 });\n\t\t\tthis.world_sim.addContactMaterial(contactMaterial);\n\t\t\tcontactMaterial = new CANNON.ContactMaterial(this.barrier_body_material, this.dice_body_material, { friction: 0, restitution: 0.95 });\n\t\t\tthis.world_sim.addContactMaterial(contactMaterial);\n\t\t\tcontactMaterial = new CANNON.ContactMaterial(this.dice_body_material, this.dice_body_material, { friction: 0.01, restitution: 0.7 });\n\t\t\tthis.world_sim.addContactMaterial(contactMaterial);\n\t\t\tlet desk = new CANNON.Body({ allowSleep: false, mass: 0, shape: new CANNON.Plane(), material: this.desk_body_material });\n\t\t\tthis.world_sim.addBody(desk);\n\n\t\t\tlet barrier = new CANNON.Body({ allowSleep: false, mass: 0, shape: new CANNON.Plane(), material: this.barrier_body_material });\n\t\t\tbarrier.quaternion.setFromAxisAngle(new CANNON.Vec3(1, 0, 0), Math.PI / 2);\n\t\t\tbarrier.position.set(0, this.display.containerHeight * 0.93, 0);\n\t\t\tthis.world_sim.addBody(barrier);\n\n\t\t\tbarrier = new CANNON.Body({ allowSleep: false, mass: 0, shape: new CANNON.Plane(), material: this.barrier_body_material });\n\t\t\tbarrier.quaternion.setFromAxisAngle(new CANNON.Vec3(1, 0, 0), -Math.PI / 2);\n\t\t\tbarrier.position.set(0, -this.display.containerHeight * 0.93, 0);\n\t\t\tthis.world_sim.addBody(barrier);\n\n\t\t\tbarrier = new CANNON.Body({ allowSleep: false, mass: 0, shape: new CANNON.Plane(), material: this.barrier_body_material });\n\t\t\tbarrier.quaternion.setFromAxisAngle(new CANNON.Vec3(0, 1, 0), -Math.PI / 2);\n\t\t\tbarrier.position.set(this.display.containerWidth * 0.93, 0, 0);\n\t\t\tthis.world_sim.addBody(barrier);\n\n\t\t\tbarrier = new CANNON.Body({ allowSleep: false, mass: 0, shape: new CANNON.Plane(), material: this.barrier_body_material });\n\t\t\tbarrier.quaternion.setFromAxisAngle(new CANNON.Vec3(0, 1, 0), Math.PI / 2);\n\t\t\tbarrier.position.set(-this.display.containerWidth * 0.93, 0, 0);\n\t\t\tthis.world_sim.addBody(barrier);\n\n\t\t\tlet shape = new CANNON.Sphere(0.1);\n\t\t\tthis.jointBody = new CANNON.Body({ mass: 0 });\n\t\t\tthis.jointBody.addShape(shape);\n\t\t\tthis.jointBody.collisionFilterGroup = 0;\n\t\t\tthis.jointBody.collisionFilterMask = 0;\n\t\t\tthis.world_sim.addBody(this.jointBody)\n\n\t\t\t//this.renderer.render(this.scene, this.camera);\n\t\t\tresolve();\n\t\t});\n\t}\n\n\tloadContextScopedTextures(type) {\n\t\treturn new Promise(resolve => {\n\t\t\tthis.renderer.scopedTextureCache = { type: type };\n\t\t\tif (this.dicefactory.realisticLighting) {\n\t\t\t\tlet textureLoader = new THREE.TextureLoader();\n\t\t\t\tthis.renderer.scopedTextureCache.roughnessMap_fingerprint = textureLoader.load('modules/dice-so-nice/textures/roughnessMap_finger.webp');\n\t\t\t\tthis.renderer.scopedTextureCache.roughnessMap_wood = textureLoader.load('modules/dice-so-nice/textures/roughnessMap_wood.webp');\n\t\t\t\tthis.renderer.scopedTextureCache.roughnessMap_metal = textureLoader.load('modules/dice-so-nice/textures/roughnessMap_metal.webp');\n\t\t\t\tthis.renderer.scopedTextureCache.roughnessMap_stone = textureLoader.load('modules/dice-so-nice/textures/roughnessMap_stone.webp');\n\n\t\t\t\t//set anisotropy\n\t\t\t\tthis.renderer.scopedTextureCache.roughnessMap_fingerprint.anisotropy = this.anisotropy;\n\t\t\t\tthis.renderer.scopedTextureCache.roughnessMap_wood.anisotropy = this.anisotropy;\n\t\t\t\tthis.renderer.scopedTextureCache.roughnessMap_metal.anisotropy = this.anisotropy;\n\t\t\t\tthis.renderer.scopedTextureCache.roughnessMap_stone.anisotropy = this.anisotropy;\n\n\t\t\t\tthis.pmremGenerator = new THREE.PMREMGenerator(this.renderer);\n\t\t\t\tthis.pmremGenerator.compileEquirectangularShader();\n\n\t\t\t\tnew RGBELoader()\n\t\t\t\t\t.setDataType(THREE.HalfFloatType)\n\t\t\t\t\t.setPath('modules/dice-so-nice/textures/equirectangular/')\n\t\t\t\t\t.load('blouberg_sunrise_2_1k.hdr', function (texture) {\n\t\t\t\t\t\tthis.renderer.scopedTextureCache.textureCube = this.pmremGenerator.fromEquirectangular(texture).texture;\n\t\t\t\t\t\tthis.renderer.scopedTextureCache.textureCube.encoding = THREE.sRGBEncoding;\n\t\t\t\t\t\tthis.scene.environment = this.renderer.scopedTextureCache.textureCube;\n\t\t\t\t\t\t//this.scene.background = this.renderer.scopedTextureCache.textureCube;\n\t\t\t\t\t\ttexture.dispose();\n\t\t\t\t\t\tthis.pmremGenerator.dispose();\n\t\t\t\t\t\tresolve();\n\n\t\t\t\t\t}.bind(this));\n\t\t\t} else {\n\t\t\t\tlet loader = new THREE.CubeTextureLoader();\n\t\t\t\tloader.setPath('modules/dice-so-nice/textures/cubemap/');\n\n\t\t\t\tthis.renderer.scopedTextureCache.textureCube = loader.load([\n\t\t\t\t\t'px.webp', 'nx.webp',\n\t\t\t\t\t'py.webp', 'ny.webp',\n\t\t\t\t\t'pz.webp', 'nz.webp'\n\t\t\t\t]);\n\t\t\t\tresolve();\n\t\t\t}\n\t\t});\n\t}\n\n\tsetScene(dimensions) {\n\t\tthis.display.currentWidth = this.container.clientWidth > 0 ? this.container.clientWidth : parseInt(this.container.style.width);\n\t\tthis.display.currentHeight = this.container.clientHeight > 0 ? this.container.clientHeight : parseInt(this.container.style.height);\n\n\t\tthis.display.currentWidth /= 2;\n\t\tthis.display.currentHeight /= 2;\n\n\t\tif (dimensions) {\n\t\t\tthis.display.containerWidth = dimensions.w;\n\t\t\tthis.display.containerHeight = dimensions.h;\n\n\t\t\tif (!this.display.currentWidth || !this.display.currentHeight) {\n\t\t\t\tthis.display.currentWidth = dimensions.w / 2;\n\t\t\t\tthis.display.currentHeight = dimensions.h / 2;\n\t\t\t}\n\t\t} else {\n\t\t\tthis.display.containerWidth = this.display.currentWidth;\n\t\t\tthis.display.containerHeight = this.display.currentHeight;\n\t\t}\n\t\n\t\tthis.display.aspect = Math.min(this.display.currentWidth / this.display.containerWidth, this.display.currentHeight / this.display.containerHeight);\n\n\t\tif (this.config.autoscale)\n\t\t\tthis.display.scale = Math.sqrt(this.display.containerWidth * this.display.containerWidth + this.display.containerHeight * this.display.containerHeight) / 13;\n\t\telse\n\t\t\tthis.display.scale = this.config.scale;\n\t\tif (this.config.boxType == \"board\")\n\t\t\tthis.dicefactory.setScale(this.display.scale);\n\t\tthis.renderer.setSize(this.display.currentWidth * 2, this.display.currentHeight * 2);\n\n\t\tthis.cameraHeight.max = this.display.currentHeight / this.display.aspect / Math.tan(10 * Math.PI / 180);\n\n\t\tthis.cameraHeight.medium = this.cameraHeight.max / 1.5;\n\t\tthis.cameraHeight.far = this.cameraHeight.max;\n\t\tthis.cameraHeight.close = this.cameraHeight.max / 2;\n\n\t\tif (this.camera) this.scene.remove(this.camera);\n\t\tthis.camera = new THREE.PerspectiveCamera(20, this.display.currentWidth / this.display.currentHeight, 1, this.cameraHeight.max * 1.3);\n\n\t\tswitch (this.animstate) {\n\t\t\tcase 'selector':\n\t\t\t\tthis.camera.position.z = this.selector.dice.length > 9 ? this.cameraHeight.far : (this.selector.dice.length < 6 ? this.cameraHeight.close : this.cameraHeight.medium);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthis.camera.position.z = this.cameraHeight.far;\n\t\t}\n\t\tthis.camera.near = 10;\n\t\tthis.camera.lookAt(new THREE.Vector3(0, 0, 0));\n\n\t\tconst maxwidth = Math.max(this.display.containerWidth, this.display.containerHeight);\n\n\t\tif (this.light) this.scene.remove(this.light);\n\t\tif (this.light_amb) this.scene.remove(this.light_amb);\n\n\t\tlet intensity, intensity_amb;\n\t\tif (this.dicefactory.realisticLighting) { //advanced lighting\n\t\t\tintensity = 1.5;\n\t\t\tintensity_amb = 1.0;\n\t\t} else {\n\t\t\tif(this.config.boxType == \"board\") {\n\t\t\t\tintensity = 1.2;\n\t\t\t\tintensity_amb = 1.0;\n\t\t\t} else {\n\t\t\t\tintensity = 1.5;\n\t\t\t\tintensity_amb = 3;\n\t\t\t}\n\t\t}\n\n\t\t\n\t\tthis.light_amb = new THREE.HemisphereLight(this.colors.ambient, this.colors.ground, intensity_amb);\n\t\tthis.scene.add(this.light_amb);\n\n\t\tthis.light = new THREE.DirectionalLight(this.colors.spotlight, intensity);\n\t\tif (this.config.boxType == \"board\")\n\t\t\tthis.light.position.set(-this.display.containerWidth / 10, this.display.containerHeight / 10, maxwidth / 2);\n\t\telse\n\t\t\tthis.light.position.set(0, this.display.containerHeight / 10, maxwidth / 2);\n\t\tthis.light.target.position.set(0, 0, 0);\n\t\tthis.light.distance = 0;\n\t\tthis.light.castShadow = this.dicefactory.shadows;\n\t\tthis.light.shadow.camera.near = maxwidth / 10;\n\t\tthis.light.shadow.camera.far = maxwidth * 5;\n\t\tthis.light.shadow.camera.fov = 50;\n\t\tthis.light.shadow.bias = -0.0001;\n\t\tconst shadowMapSize = this.dicefactory.shadowQuality == \"high\" ? 2048 : 1024;\n\t\tthis.light.shadow.mapSize.width = shadowMapSize;\n\t\tthis.light.shadow.mapSize.height = shadowMapSize;\n\t\tconst d = 1000;\n\t\tthis.light.shadow.camera.left = - d;\n\t\tthis.light.shadow.camera.right = d;\n\t\tthis.light.shadow.camera.top = d;\n\t\tthis.light.shadow.camera.bottom = - d;\n\t\tthis.scene.add(this.light);\n\n\t\tif (this.desk)\n\t\t\tthis.scene.remove(this.desk);\n\n\t\tlet shadowplane = new THREE.ShadowMaterial();\n\t\tshadowplane.opacity = 0.5;\n\t\tthis.desk = new THREE.Mesh(new THREE.PlaneGeometry(this.display.containerWidth * 6, this.display.containerHeight * 6, 1, 1), shadowplane);\n\t\tthis.desk.receiveShadow = this.dicefactory.shadows;\n\t\tthis.desk.position.set(0, 0, -1);\n\t\tthis.scene.add(this.desk);\n\t\tif (this.dicefactory.realisticLighting) {\n\t\t\tlet renderScene = new RenderPass(this.scene, this.camera);\n\t\t\tconst canvasSize = new THREE.Vector2(this.display.currentWidth * 2, this.display.currentHeight * 2);\n\t\t\tthis.bloomPass = new TransparentUnrealBloomPass(canvasSize, game.dice3d.uniforms.bloomStrength.value, game.dice3d.uniforms.bloomRadius.value, game.dice3d.uniforms.bloomThreshold.value);\n\t\t\tthis.gammaPass = new ShaderPass(GammaCorrectionShader);\n\n\t\t\t// Add an outline pass for the outline sfx\n\t\t\tthis.outlinePass = new OutlinePass(canvasSize, this.scene, this.camera);\n\t\t\tthis.outlinePass.pulsePeriod = 1.5;\n\n\t\t\tlet size = canvasSize.multiplyScalar(this.renderer.getPixelRatio());\n\t\t\t//Create a RenderTarget with high precision\n\t\t\tlet options = {\n\t\t\t\ttype: THREE.FloatType,\n\t\t\t\tsamples: this.dicefactory.aa == \"msaa\" ? 4 : 0,\n\t\t\t\tanisotropy: this.anisotropy\n\t\t\t};\n\t\t\t//Workaround for a bug on Chrome on OSX\n\t\t\tif (navigator.userAgent.indexOf('Mac OS X') != -1 && navigator.userAgent.indexOf('Chrome') != -1) {\n\t\t\t\toptions.stencilBuffer = true;\n\t\t\t}\n\t\t\tthis.composerTarget = new THREE.WebGLRenderTarget(size.x, size.y, options);\n\n\t\t\t// This EffectComposer is in charge of rendering the Bloom/Glow effect\n\t\t\tthis.bloomComposer = new EffectComposer(this.renderer, this.composerTarget);\n\t\t\tthis.bloomComposer.renderToScreen = false;\n\t\t\tthis.bloomComposer.addPass(renderScene);\n\t\t\tthis.bloomComposer.addPass(this.bloomPass);\n\n\t\t\t//This shader will blend the bloom effect with the scene. Only the alpha from the bloom effect will be used.\n\t\t\tthis.blendingPass = new ShaderPass(\n\t\t\t\tnew THREE.ShaderMaterial({\n\t\t\t\t\tuniforms: {\n\t\t\t\t\t\tbaseTexture: { value: null },\n\t\t\t\t\t\tbloomTexture: { value: this.bloomComposer.renderTarget2.texture },\n\t\t\t\t\t},\n\t\t\t\t\tvertexShader: `\n\t\t\t\t\t\tvarying vec2 vUv;\n\t\t\t\t\t\tvoid main() {\n\t\t\t\t\t\t\tvUv = uv;\n\t\t\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t\t\t}\n\t\t\t\t\t`,\n\t\t\t\t\tfragmentShader: `\n\t\t\t\t\t\tuniform sampler2D baseTexture;\n\t\t\t\t\t\tuniform sampler2D bloomTexture;\n\t\t\t\t\t\tvarying vec2 vUv;\n\t\t\t\t\t\tvoid main() {\n\t\t\t\t\t\t\tvec4 base = texture2D( baseTexture, vUv );\n\t\t\t\t\t\t\tvec4 bloom = texture2D( bloomTexture, vUv );\n\t\t\t\t\t\t\tgl_FragColor = vec4(base.rgb + ( vec3( 1.0 ) * bloom.rgb ), bloom.a);\n\t\t\t\t\t\t}\n\t\t\t\t\t`,\n\t\t\t\t\tdefines: {}\n\t\t\t\t}), \"baseTexture\"\n\t\t\t);\n\t\t\tthis.blendingPass.needsSwap = true;\n\n\t\t\t// This EffectComposer is in charge of rendering the final image\n\t\t\t// The blendingPass won't be rendered if no emissive textures are found during the render loop\n\t\t\tthis.finalComposer = new EffectComposer(this.renderer, this.composerTarget);\n\t\t\tthis.finalComposer.addPass(renderScene);\n\t\t\tthis.finalComposer.addPass(this.outlinePass);\n\t\t\tthis.finalComposer.addPass(this.blendingPass);\n\n\t\t\t//Software Anti-aliasing pass. Should be rendered in a linear space.\n\t\t\tif (this.dicefactory.aa == \"smaa\") {\n\t\t\t\tthis.AAPass = new SMAAPass(size.x, size.y);\n\t\t\t\tthis.AAPass.renderToScreen = true;\n\t\t\t\tthis.finalComposer.addPass(this.AAPass);\n\t\t\t}\n\n\t\t\t//Gamma correction pass. Convert the image to a gamma space.\n\t\t\tthis.finalComposer.addPass(this.gammaPass);\n\t\t}\n\t\tthis.renderScene();\n\t}\n\n\tasync update(config) {\n\t\tthis.showExtraDice = config.showExtraDice;\n\t\tthis.muteSoundSecretRolls = config.muteSoundSecretRolls;\n\t\tif (this.config.boxType == \"board\") {\n\t\t\tif (config.autoscale) {\n\t\t\t\tthis.display.scale = Math.sqrt(this.display.containerWidth * this.display.containerWidth + this.display.containerHeight * this.display.containerHeight) / 13;\n\t\t\t} else {\n\t\t\t\tthis.display.scale = config.scale\n\t\t\t}\n\t\t\tthis.dicefactory.setScale(this.display.scale);\n\t\t}\n\t\tthis.dicefactory.setQualitySettings(config);\n\n\t\tlet globalAnimationSpeed = game.settings.get(\"dice-so-nice\", \"globalAnimationSpeed\");\n\t\tif (globalAnimationSpeed === \"0\")\n\t\t\tthis.speed = parseInt(config.speed, 10);\n\t\telse\n\t\t\tthis.speed = parseInt(globalAnimationSpeed, 10);\n\n\t\tthis.light.castShadow = this.dicefactory.shadows;\n\t\tthis.desk.receiveShadow = this.dicefactory.shadows;\n\t\tthis.renderer.shadowMap.enabled = this.dicefactory.shadows;\n\t\tthis.renderer.shadowMap.type = this.dicefactory.shadowQuality == \"high\" ? THREE.PCFSoftShadowMap : THREE.PCFShadowMap;\n\t\tthis.sounds = config.sounds;\n\t\tthis.volume = config.soundsVolume;\n\t\tthis.soundsSurface = config.soundsSurface;\n\n\t\tawait this.dicefactory.preloadPresets(true, null, config.appearance);\n\n\t\tthis.throwingForce = config.throwingForce;\n\t\tthis.immersiveDarkness = config.immersiveDarkness;\n\t\tthis.scene.traverse(object => {\n\t\t\tif (object.type === 'Mesh') object.material.needsUpdate = true;\n\t\t});\n\t}\n\n\n\tvectorRand({ x, y }) {\n\t\tlet angle = Math.random() * Math.PI / 5 - Math.PI / 5 / 2;\n\t\tlet vec = {\n\t\t\tx: x * Math.cos(angle) - y * Math.sin(angle),\n\t\t\ty: x * Math.sin(angle) + y * Math.cos(angle)\n\t\t};\n\t\tif (vec.x == 0) vec.x = 0.01;\n\t\tif (vec.y == 0) vec.y = 0.01;\n\t\treturn vec;\n\t}\n\n\t//returns an array of vectordata objects\n\tgetVectors(notationVectors, vector, boost, dist) {\n\n\t\tfor (let i = 0; i < notationVectors.dice.length; i++) {\n\n\t\t\tconst diceobj = this.dicefactory.get(notationVectors.dice[i].type);\n\n\t\t\tlet vec = this.vectorRand(vector);\n\n\t\t\tvec.x /= dist;\n\t\t\tvec.y /= dist;\n\n\t\t\tlet pos = {\n\t\t\t\tx: this.display.containerWidth * (vec.x > 0 ? -1 : 1) * 0.9 + Math.floor(Math.random() * 201) - 100,\n\t\t\t\ty: this.display.containerHeight * (vec.y > 0 ? -1 : 1) * 0.9 + Math.floor(Math.random() * 201) - 100,\n\t\t\t\tz: Math.random() * 200 + 200\n\t\t\t};\n\n\t\t\tlet projector = Math.abs(vec.x / vec.y);\n\t\t\tif (projector > 1.0) pos.y /= projector; else pos.x *= projector;\n\n\n\t\t\tlet velvec = this.vectorRand(vector);\n\n\t\t\tvelvec.x /= dist;\n\t\t\tvelvec.y /= dist;\n\t\t\tlet velocity, angle, axis;\n\n\t\t\tif (diceobj.shape != \"d2\") {\n\n\t\t\t\tvelocity = {\n\t\t\t\t\tx: velvec.x * boost,\n\t\t\t\t\ty: velvec.y * boost,\n\t\t\t\t\tz: -10\n\t\t\t\t};\n\n\t\t\t\tangle = {\n\t\t\t\t\tx: -(Math.random() * vec.y * 5 + diceobj.inertia * vec.y),\n\t\t\t\t\ty: Math.random() * vec.x * 5 + diceobj.inertia * vec.x,\n\t\t\t\t\tz: 0\n\t\t\t\t};\n\n\t\t\t\taxis = {\n\t\t\t\t\tx: Math.random(),\n\t\t\t\t\ty: Math.random(),\n\t\t\t\t\tz: Math.random(),\n\t\t\t\t\ta: Math.random()\n\t\t\t\t};\n\n\t\t\t\taxis = {\n\t\t\t\t\tx: 0,\n\t\t\t\t\ty: 0,\n\t\t\t\t\tz: 0,\n\t\t\t\t\ta: 0\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\t//coin flip\n\t\t\t\tvelocity = {\n\t\t\t\t\tx: velvec.x * boost / 10,\n\t\t\t\t\ty: velvec.y * boost / 10,\n\t\t\t\t\tz: 3000\n\t\t\t\t};\n\n\t\t\t\tangle = {\n\t\t\t\t\tx: 12 * diceobj.inertia,//-(Math.random() * velvec.y * 50 + diceobj.inertia * velvec.y ) ,\n\t\t\t\t\ty: 1 * diceobj.inertia,//Math.random() * velvec.x * 50 + diceobj.inertia * velvec.x ,\n\t\t\t\t\tz: 0\n\t\t\t\t};\n\n\t\t\t\taxis = {\n\t\t\t\t\tx: 1,//Math.random(), \n\t\t\t\t\ty: 1,//Math.random(), \n\t\t\t\t\tz: Math.random(),\n\t\t\t\t\ta: Math.random()\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tnotationVectors.dice[i].vectors = {\n\t\t\t\ttype: diceobj.type,\n\t\t\t\tpos,\n\t\t\t\tvelocity,\n\t\t\t\tangle,\n\t\t\t\taxis\n\t\t\t};\n\t\t}\n\t\treturn notationVectors;\n\t}\n\n\t// swaps dice faces to match desired result\n\tswapDiceFace(dicemesh) {\n\t\tconst diceobj = this.dicefactory.get(dicemesh.notation.type);\n\n\t\tlet value = parseInt(dicemesh.getLastValue().value);\n\t\tlet result = parseInt(dicemesh.forcedResult);\n\n\t\tif (diceobj.shape == 'd10' && result == 0) result = 10;\n\n\t\tif (diceobj.valueMap) { //die with special values\n\t\t\tresult = diceobj.valueMap[result];\n\t\t}\n\n\t\t// Make the last rolled dice and the DiceBox instance available for debugging\n\t\t//CONFIG.DiceSoNice = {\n\t\t//\tdicemesh,\n\t\t//\tdicebox: this\n\t\t//};\n\n\t\tif (value == result) return;\n\n\t\tlet rotIndex = value > result ? result + \",\" + value : value + \",\" + result;\n\t\t//console.log(`Needed ${result}, Rolled ${value}, Remap: ${rotIndex}`)\n\t\tlet rotationDegrees = DICE_MODELS[dicemesh.shape].rotationCombinations[rotIndex];\n\t\tif (!rotationDegrees) {\n\t\t\tconsole.error(`[Dice So Nice] No dice rotation found for ${dicemesh.shape} ${value} ${result}`);\n\t\t\treturn;\n\t\t}\n\t\tlet eulerAngle = new THREE.Euler(THREE.MathUtils.degToRad(rotationDegrees[0]), THREE.MathUtils.degToRad(rotationDegrees[1]), THREE.MathUtils.degToRad(rotationDegrees[2]));\n\t\tlet quaternion = new THREE.Quaternion().setFromEuler(eulerAngle);\n\t\tif (value > result)\n\t\t\tquaternion.invert();\n\n\t\tdicemesh.applyQuaternion(quaternion);\n\n\t\tdicemesh.resultReason = 'forced';\n\t}\n\n\t/*\n\t// Apply an euler angle from rotationCombinations for debugging\n\t swapTest(dicemesh, mapping, invert = false, revert = true) {\n \n\t\t let rotationDegrees = DICE_MODELS[dicemesh.shape].rotationCombinations[mapping];\n\t\t let eulerAngle = new THREE.Euler(THREE.MathUtils.degToRad(rotationDegrees[0]), THREE.MathUtils.degToRad(rotationDegrees[1]), THREE.MathUtils.degToRad(rotationDegrees[2]));\n\t\t let quaternion = new THREE.Quaternion().setFromEuler(eulerAngle);\n\t\t if (invert)\n\t\t\t quaternion.invert();\n \n\t\t dicemesh.applyQuaternion(quaternion);\n \n\t\t if (revert) {\n\t\t\t setTimeout(() => { this.swapTest(dicemesh, mapping, !invert, false) }, 2000 )\n\t\t }\n \n\t\t dicemesh.resultReason = 'forced';\n\t }\n \n\t// Apply an euler angle directly for debugging\n\t swapTest(dicemesh, mapping, invert = false, revert = true) {\n\t swapTestEuler(dicemesh, euler, invert = false, revert = true) {\n\t\t let eulerAngle = new THREE.Euler(THREE.MathUtils.degToRad(euler[0]), THREE.MathUtils.degToRad(euler[1]), THREE.MathUtils.degToRad(euler[2]));\n\t\t let quaternion = new THREE.Quaternion().setFromEuler(eulerAngle);\n\t\t if (invert)\n\t\t\t quaternion.invert();\n \n\t\t dicemesh.applyQuaternion(quaternion);\n \n\t\t if (revert) {\n\t\t\t setTimeout(() => { this.swapTestEuler(dicemesh, euler, !invert, false) }, 2000 )\n\t\t }\n \n\t\t dicemesh.resultReason = 'forced';\n\t }\n \n\t// Extract the euler angle from a mesh in degrees for debugging\n\t extractEuler(dicemesh) {\n\t\t let euler = dicemesh.rotation\n\t\t console.log(\"World Euler:\", THREE.MathUtils.radToDeg(euler.x), THREE.MathUtils.radToDeg(euler.y), THREE.MathUtils.radToDeg(euler.z), euler.order)\n\t }\n\t*/\n\n\t//spawns one dicemesh object from a single vectordata object\n\tspawnDice(dicedata, appearance) {\n\t\tlet vectordata = dicedata.vectors;\n\t\tconst diceobj = this.dicefactory.get(vectordata.type);\n\t\tif (!diceobj) return;\n\n\t\tlet dicemesh = this.dicefactory.create(this.renderer.scopedTextureCache, diceobj.type, appearance);\n\t\tif (!dicemesh) return;\n\n\t\tlet mass = diceobj.mass;\n\t\tswitch (appearance.material) {\n\t\t\tcase \"metal\":\n\t\t\t\tmass *= 7;\n\t\t\t\tbreak;\n\t\t\tcase \"wood\":\n\t\t\t\tmass *= 0.65;\n\t\t\t\tbreak;\n\t\t\tcase \"glass\":\n\t\t\t\tmass *= 2;\n\t\t\t\tbreak;\n\t\t\tcase \"stone\":\n\t\t\t\tmass *= 1.5;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tdicemesh.notation = vectordata;\n\t\tdicemesh.result = [];\n\t\tdicemesh.forcedResult = dicedata.result;\n\t\tdicemesh.startAtIteration = dicedata.startAtIteration;\n\t\tdicemesh.stopped = 0;\n\t\tdicemesh.castShadow = this.dicefactory.shadows;\n\t\tdicemesh.receiveShadow = this.dicefactory.shadows;\n\t\tdicemesh.specialEffects = dicedata.specialEffects;\n\n\t\tdicemesh.body_sim = new CANNON.Body({ allowSleep: true, sleepSpeedLimit: 75, sleepTimeLimit: 0.9, mass: mass, shape: dicemesh.geometry.cannon_shape, material: this.dice_body_material });\n\t\tdicemesh.body_sim.type = CANNON.Body.DYNAMIC;\n\t\tdicemesh.body_sim.position.set(vectordata.pos.x, vectordata.pos.y, vectordata.pos.z);\n\t\tdicemesh.body_sim.quaternion.setFromAxisAngle(new CANNON.Vec3(vectordata.axis.x, vectordata.axis.y, vectordata.axis.z), vectordata.axis.a * Math.PI * 2);\n\t\tdicemesh.body_sim.angularVelocity.set(vectordata.angle.x, vectordata.angle.y, vectordata.angle.z);\n\t\tdicemesh.body_sim.velocity.set(vectordata.velocity.x, vectordata.velocity.y, vectordata.velocity.z);\n\t\tdicemesh.body_sim.linearDamping = 0.1;\n\t\tdicemesh.body_sim.angularDamping = 0.1;\n\t\tdicemesh.body_sim.addEventListener('collide', this.eventCollide.bind(this));\n\t\tdicemesh.body_sim.stepQuaternions = new Array(1000);\n\t\tdicemesh.body_sim.stepPositions = new Array(1000);\n\n\t\t//We add some informations about the dice to the CANNON body to be used in the collide event\n\t\tdicemesh.body_sim.diceType = diceobj.type;\n\t\tdicemesh.body_sim.diceMaterial = appearance.material;\n\t\tdicemesh.body_sim.secretRoll = dicedata.options?.secret;\n\n\t\tif(dicemesh.userData.glowingInDarkness){\n\t\t\tif(canvas.darknessLevel > 0.5){\n\t\t\t\t//If the darkness level is less than 0.5, we activate the \"glowing in the dark\" mode\n\t\t\t\t//This mode is activated by setting the userData.glowingInDarkness to true on the mesh of the dice\n\t\t\t\tdicemesh.material.emissiveIntensity = 0.3;\n\t\t\t\tdicemesh.material.emissive = new THREE.Color(0xffffff);\n\t\t\t} else {\n\t\t\t\tdicemesh.material.emissiveIntensity = 0;\n\t\t\t\tdicemesh.material.emissive = new THREE.Color(0x000000);\n\t\t\t}\n\t\t}\n\n\t\t//dicemesh.meshCannon = this.body2mesh(dicemesh.body_sim,true);\n\n\t\t/*var gltfExporter = new GLTFExporter();\n\t\tgltfExporter.parse(dicemesh.meshCannon, function ( result ) {\n\t\t\tif ( result instanceof ArrayBuffer ) {\n\t\t\t\tsaveArrayBuffer( result, 'scene.glb' );\n\t\t\t} else {\n\t\t\t\tvar output = JSON.stringify( result, null, 2 );\n\t\t\t\tconsole.log( output );\n\t\t\t\tsaveString( output, 'scene.gltf' );\n\t\t\t}\n\t\t}, {});\n\n\t\tvar link = document.createElement( 'a' );\n\t\tlink.style.display = 'none';\n\t\tdocument.body.appendChild( link ); // Firefox workaround, see #6594\n\n\t\tfunction save( blob, filename ) {\n\t\t\tlink.href = URL.createObjectURL( blob );\n\t\t\tlink.download = filename;\n\t\t\tlink.click();\n\t\t\t// URL.revokeObjectURL( url ); breaks Firefox...\n\t\t}\n\n\t\tfunction saveString( text, filename ) {\n\t\t\tsave( new Blob( [ text ], { type: 'text/plain' } ), filename );\n\t\t}\n\n\t\tfunction saveArrayBuffer( buffer, filename ) {\n\t\t\tsave( new Blob( [ buffer ], { type: 'application/octet-stream' } ), filename );\n\t\t}*/\n\n\t\tlet objectContainer = new THREE.Group();\n\t\tobjectContainer.add(dicemesh);\n\n\t\tthis.diceList.push(dicemesh);\n\t\tif (dicemesh.startAtIteration == 0) {\n\t\t\tthis.scene.add(objectContainer);\n\t\t\t//this.scene.add(dicemesh.meshCannon);\n\t\t\tthis.world_sim.addBody(dicemesh.body_sim);\n\t\t}\n\t}\n\n\teventCollide({ body, target }) {\n\t\t// collision events happen simultaneously for both colliding bodies\n\t\t// all this sanity checking helps limits sounds being played\n\t\tif (!this.sounds || !body || !this.sounds_dice.source) return;\n\n\t\tlet now = body.world.stepnumber;\n\t\tlet currentSoundType = (body.mass > 0) ? 'dice' : 'table';\n\n\t\t// the idea here is that a dice clack should never be skipped in favor of a table sound\n\t\t// if ((don't play sounds if we played one this world step, or there hasn't been enough delay) AND 'this sound IS NOT a dice clack') then 'skip it'\n\t\tif ((this.lastSoundStep == body.world.stepnumber || this.lastSound > body.world.stepnumber) && currentSoundType != 'dice') return;\n\n\t\t// also skip if it's too early and both last sound and this sound are the same\n\t\tif ((this.lastSoundStep == body.world.stepnumber || this.lastSound > body.world.stepnumber) && currentSoundType == 'dice' && this.lastSoundType == 'dice') return;\n\n\t\tif (body.mass > 0) { // dice to dice collision\n\t\t\tlet speed = body.velocity.length();\n\t\t\t// also don't bother playing at low speeds\n\t\t\tif (speed < 250) return;\n\t\t\tlet strength = Math.max(Math.min(speed / (550), 1), 0.2);\n\t\t\tif (this.muteSoundSecretRolls && (body.secretRoll || target.secretRoll))\n\t\t\t\tstrength = 0;\n\t\t\tlet sound;\n\n\t\t\tif (body.diceType != \"dc\") {\n\t\t\t\tlet sounds_dice = this.sounds_dice['plastic'];\n\t\t\t\tif (this.sounds_dice[body.diceMaterial])\n\t\t\t\t\tsounds_dice = this.sounds_dice[body.diceMaterial];\n\t\t\t\tsound = sounds_dice[Math.floor(Math.random() * sounds_dice.length)];\n\t\t\t}\n\t\t\telse\n\t\t\t\tsound = this.sounds_dice['coin'][Math.floor(Math.random() * this.sounds_dice['coin'].length)];\n\t\t\tif (this.animstate == \"simulate\") {\n\t\t\t\tthis.detectedCollides[this.iteration] = [this.sounds_dice.source, sound, strength];\n\t\t\t} else {\n\t\t\t\tthis.playAudioSprite(this.sounds_dice.source, sound, strength);\n\t\t\t}\n\t\t\tthis.lastSoundType = 'dice';\n\n\n\t\t} else { // dice to table collision\n\t\t\tlet speed = target.velocity.length();\n\t\t\t// also don't bother playing at low speeds\n\t\t\tif (speed < 100) return;\n\n\t\t\tlet surface = this.soundsSurface;\n\t\t\tlet strength = Math.max(Math.min(speed / (500), 1), 0.2);\n\t\t\tif (this.muteSoundSecretRolls && (body.secretRoll || target.secretRoll))\n\t\t\t\tstrength = 0;\n\t\t\tlet soundlist = this.sounds_table[surface];\n\t\t\tlet sound = soundlist[Math.floor(Math.random() * soundlist.length)];\n\t\t\tif (this.animstate == \"simulate\") {\n\t\t\t\tthis.detectedCollides[this.iteration] = [this.sounds_table.source, sound, strength];\n\t\t\t} else {\n\t\t\t\tthis.playAudioSprite(this.sounds_table.source, sound, strength);\n\t\t\t}\n\n\t\t\tthis.lastSoundType = 'table';\n\t\t}\n\t\tthis.lastSoundStep = body.world.stepnumber;\n\t\tthis.lastSound = body.world.stepnumber + this.soundDelay;\n\t}\n\n\tthrowFinished(worldType = \"render\") {\n\n\t\tlet stopped = true;\n\t\tif (this.iteration > 1000) return true;\n\t\tif (this.iteration <= this.minIterations) return false;\n\t\tif (worldType == \"render\") {\n\t\t\tstopped = this.iteration >= this.iterationsNeeded;\n\t\t\tif (stopped) {\n\t\t\t\tfor (let i = 0, len = this.diceList.length; i < len; ++i) {\n\t\t\t\t\tthis.diceList[i].body_sim.stepPositions = new Array(1000);\n\t\t\t\t\tthis.diceList[i].body_sim.stepQuaternions = new Array(1000);\n\t\t\t\t\tthis.diceList[i].body_sim.detectedCollides = [];\n\t\t\t\t\tif (!this.diceList[i].body_sim.mass)\n\t\t\t\t\t\tthis.diceList[i].body_sim.dead = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tfor (let i = 0, len = this.diceList.length; i < len; ++i) {\n\t\t\t\tif (this.diceList[i].body_sim.sleepState < 2)\n\t\t\t\t\treturn false;\n\t\t\t\telse if (this.diceList[i].result.length == 0)\n\t\t\t\t\tthis.diceList[i].storeRolledValue();\n\t\t\t}\n\t\t\t//Throw is actually finished\n\t\t\tif (stopped) {\n\t\t\t\tthis.iterationsNeeded = this.iteration;\n\t\t\t\tlet canBeFlipped = game.settings.get(\"dice-so-nice\", \"diceCanBeFlipped\");\n\t\t\t\tif (!canBeFlipped) {\n\t\t\t\t\t//make the current dice on the board STATIC object so they can't be knocked\n\t\t\t\t\tfor (let i = 0, len = this.diceList.length; i < len; ++i) {\n\t\t\t\t\t\tthis.diceList[i].body_sim.mass = 0;\n\t\t\t\t\t\tthis.diceList[i].body_sim.updateMassProperties();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn stopped;\n\t}\n\n\tsimulateThrow() {\n\t\tthis.detectedCollides = new Array(1000);\n\t\tthis.iterationsNeeded = 0;\n\t\tthis.animstate = 'simulate';\n\t\tthis.rolling = true;\n\t\twhile (!this.throwFinished(\"sim\")) {\n\t\t\t//Before each step, we copy the quaternions of every die in an array\n\t\t\t++this.iteration;\n\n\t\t\tif (!(this.iteration % this.nbIterationsBetweenRolls)) {\n\t\t\t\tfor (let i = 0; i < this.diceList.length; i++) {\n\t\t\t\t\tif (this.diceList[i].startAtIteration == this.iteration)\n\t\t\t\t\t\tthis.world_sim.addBody(this.diceList[i].body_sim);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.world_sim.step(this.framerate);\n\n\t\t\tfor (let i = 0; i < this.world_sim.bodies.length; i++) {\n\t\t\t\tif (this.world_sim.bodies[i].stepPositions) {\n\t\t\t\t\tthis.world_sim.bodies[i].stepQuaternions[this.iteration] = {\n\t\t\t\t\t\t\"w\": this.world_sim.bodies[i].quaternion.w,\n\t\t\t\t\t\t\"x\": this.world_sim.bodies[i].quaternion.x,\n\t\t\t\t\t\t\"y\": this.world_sim.bodies[i].quaternion.y,\n\t\t\t\t\t\t\"z\": this.world_sim.bodies[i].quaternion.z\n\t\t\t\t\t};\n\t\t\t\t\tthis.world_sim.bodies[i].stepPositions[this.iteration] = {\n\t\t\t\t\t\t\"x\": this.world_sim.bodies[i].position.x,\n\t\t\t\t\t\t\"y\": this.world_sim.bodies[i].position.y,\n\t\t\t\t\t\t\"z\": this.world_sim.bodies[i].position.z\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t//This is the render loop\n\tanimateThrow() {\n\t\tthis.animstate = 'throw';\n\t\tlet time = (new Date()).getTime();\n\t\tthis.last_time = this.last_time || time - (this.framerate * 1000);\n\t\tlet time_diff = (time - this.last_time) / 1000;\n\n\t\tlet neededSteps = Math.floor(time_diff / this.framerate);\n\n\t\t//Update animated dice mixer\n\t\tif (this.animatedDiceDetected) {\n\t\t\tlet delta = this.clock.getDelta();\n\t\t\tfor (let i in this.scene.children) {\n\t\t\t\tlet container = this.scene.children[i];\n\t\t\t\tlet dicemesh = container.children && container.children.length && container.children[0].body_sim != undefined ? container.children[0] : null;\n\t\t\t\tif (dicemesh && dicemesh.mixer) {\n\t\t\t\t\tdicemesh.mixer.update(delta);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (neededSteps && this.rolling) {\n\t\t\tfor (let i = 0; i < neededSteps * this.speed; i++) {\n\t\t\t\t++this.iteration;\n\t\t\t\tif (!(this.iteration % this.nbIterationsBetweenRolls)) {\n\t\t\t\t\tfor (let i = 0; i < this.diceList.length; i++) {\n\t\t\t\t\t\tif (this.diceList[i].startAtIteration == this.iteration) {\n\t\t\t\t\t\t\tthis.scene.add(this.diceList[i].parent);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.iteration > this.iterationsNeeded)\n\t\t\t\tthis.iteration = this.iterationsNeeded;\n\n\t\t\t// update physics interactions visually\n\n\t\t\tfor (let i in this.scene.children) {\n\t\t\t\tlet container = this.scene.children[i];\n\t\t\t\tlet dicemesh = container.children && container.children.length && container.children[0].body_sim != undefined && !container.children[0].body_sim.dead ? container.children[0] : null;\n\t\t\t\tif (dicemesh && dicemesh.body_sim.stepPositions[this.iteration]) {\n\t\t\t\t\tcontainer.position.copy(dicemesh.body_sim.stepPositions[this.iteration]);\n\t\t\t\t\tcontainer.quaternion.copy(dicemesh.body_sim.stepQuaternions[this.iteration]);\n\n\t\t\t\t\tif (dicemesh.meshCannon) {\n\t\t\t\t\t\tdicemesh.meshCannon.position.copy(dicemesh.body_sim.stepPositions[this.iteration]);\n\t\t\t\t\t\tdicemesh.meshCannon.quaternion.copy(dicemesh.body_sim.stepQuaternions[this.iteration]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.detectedCollides[this.iteration]) {\n\t\t\t\tthis.playAudioSprite(...this.detectedCollides[this.iteration]);\n\t\t\t}\n\t\t} else if (!this.rolling) {\n\t\t\tlet worldAsleep = true;\n\t\t\tfor (let i = 0; i < this.world_sim.bodies.length; i++) {\n\t\t\t\tif (this.world_sim.bodies[i].allowSleep && this.world_sim.bodies[i].sleepState < 2) {\n\t\t\t\t\tworldAsleep = false;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!worldAsleep) {\n\t\t\t\tthis.world_sim.step(this.framerate, time_diff);\n\t\t\t\tfor (let i in this.scene.children) {\n\t\t\t\t\tlet container = this.scene.children[i];\n\t\t\t\t\tlet dicemesh = container.children && container.children.length && container.children[0].body_sim != undefined && !container.children[0].body_sim.dead ? container.children[0] : null;\n\t\t\t\t\tif (dicemesh) {\n\t\t\t\t\t\tcontainer.position.copy(dicemesh.body_sim.position);\n\t\t\t\t\t\tcontainer.quaternion.copy(dicemesh.body_sim.quaternion);\n\n\t\t\t\t\t\tif (dicemesh.meshCannon) {\n\t\t\t\t\t\t\tdicemesh.meshCannon.position.copy(dicemesh.body_sim.position);\n\t\t\t\t\t\t\tdicemesh.meshCannon.quaternion.copy(dicemesh.body_sim.quaternion);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (this.isVisible && (this.allowInteractivity || this.animatedDiceDetected || neededSteps || DiceSFXManager.renderQueue.length)) {\n\t\t\tDiceSFXManager.renderSFX();\n\t\t\t//use darknessLevel to change toneMapping\n\t\t\tif (this.dicefactory.realisticLighting && this.immersiveDarkness) {\n\t\t\t\t//If the darkness level is not defined, we set it to 0\n\t\t\t\tlet darknessLevel = canvas.darknessLevel || 0;\n\t\t\t\tthis.renderer.toneMappingExposure = this.toneMappingExposureDefault * 0.4 + (this.toneMappingExposureDefault * 0.6 - darknessLevel * 0.6);\n\t\t\t}\n\t\t\tthis.renderScene();\n\t\t}\n\t\tif (this.rendererStats)\n\t\t\tthis.rendererStats.update(this.renderer);\n\t\tthis.last_time = this.last_time + neededSteps * this.framerate * 1000;\n\n\t\t// roll finished\n\t\tif (this.throwFinished(\"render\")) {\n\t\t\t//if animated dice still on the table, keep animating\n\t\t\tthis.rolling = false;\n\t\t\tif (this.running) {\n\t\t\t\tthis.handleSpecialEffectsInit().then(() => {\n\t\t\t\t\tthis.callback(this.throws);\n\t\t\t\t\tthis.callback = null;\n\t\t\t\t\tthis.throws = null;\n\t\t\t\t\tif (!this.animatedDiceDetected && !(this.allowInteractivity && (this.deadDiceList.length + this.diceList.length) > 0) && !DiceSFXManager.renderQueue.length)\n\t\t\t\t\t\tthis.removeTicker(this.animateThrow);\n\t\t\t\t});\n\t\t\t}\n\t\t\tthis.running = false;\n\t\t}\n\t}\n\n\tstart_throw(throws, callback) {\n\t\tif (this.rolling) return;\n\t\tlet countNewDice = 0;\n\t\tthrows.forEach(notation => {\n\t\t\tlet vector = { x: (Math.random() * 2 - 0.5) * this.display.currentWidth, y: -(Math.random() * 2 - 0.5) * this.display.currentHeight };\n\t\t\tlet dist = Math.sqrt(vector.x * vector.x + vector.y * vector.y);\n\t\t\tlet throwingForceModifier = 0.8;\n\t\t\tswitch (this.throwingForce) {\n\t\t\t\tcase \"weak\":\n\t\t\t\t\tthrowingForceModifier = 0.5;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"strong\":\n\t\t\t\t\tthrowingForceModifier = 1.8;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tlet boost = ((Math.random() + 3) * throwingForceModifier) * dist;\n\n\t\t\tnotation = this.getVectors(notation, vector, boost, dist);\n\t\t\tcountNewDice += notation.dice.length;\n\t\t});\n\n\t\tlet maxDiceNumber = game.settings.get(\"dice-so-nice\", \"maxDiceNumber\");\n\t\tif (this.deadDiceList.length + this.diceList.length + countNewDice > maxDiceNumber) {\n\t\t\tthis.clearAll();\n\t\t}\n\t\tthis.isVisible = true;\n\t\tthis.rollDice(throws, callback);\n\t}\n\n\tclearDice() {\n\t\tthis.running = false;\n\t\tthis.deadDiceList = this.deadDiceList.concat(this.diceList);\n\t\tthis.diceList = [];\n\t}\n\n\tclearAll() {\n\t\tthis.clearDice();\n\t\tlet dice;\n\t\twhile (dice = this.deadDiceList.pop()) {\n\t\t\tthis.scene.remove(dice.parent.type == \"Scene\" ? dice : dice.parent);\n\t\t\tif (dice.body_sim) this.world_sim.remove(dice.body_sim);\n\t\t}\n\n\t\tif (this.pane) this.scene.remove(this.pane);\n\n\t\tif (this.config.boxType == \"board\") {\n\t\t\tDiceSFXManager.clearQueue();\n\t\t\tthis.removeTicker(this.animateThrow);\n\t\t} else {\n\t\t\tthis.removeTicker(this.animateSelector);\n\t\t}\n\n\t\tthis.renderScene();\n\n\t\tthis.isVisible = false;\n\t}\n\n\trenderScene() {\n\t\tif (this.dicefactory.realisticLighting) {\n\t\t\tgame.dice3d.uniforms.globalBloom.value = 1;\n\t\t\tif (!this.finalComposer)\n\t\t\t\treturn;\n\n\t\t\t//Check if there is any emissive materials before rendering the bloom pass\n\t\t\tlet hasEmissive = false;\n\t\t\tlet black = this.blackColor;\n\t\t\tthis.scene.traverseVisible(function (object) {\n\t\t\t\tif (object.material && object.material.emissive != undefined && !object.material.emissive.equals(black)) {\n\t\t\t\t\thasEmissive = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif (hasEmissive && this.dicefactory.glow) {\n\t\t\t\tthis.bloomComposer.render();\n\t\t\t\tthis.blendingPass.enabled = true;\n\t\t\t} else {\n\t\t\t\tthis.blendingPass.enabled = false;\n\t\t\t}\n\t\t\tgame.dice3d.uniforms.globalBloom.value = 0;\n\t\t\tthis.finalComposer.render();\n\t\t} else {\n\t\t\tthis.renderer.render(this.scene, this.camera);\n\t\t}\n\t}\n\n\tclearScene() {\n\t\twhile (this.scene.children.length > 0) {\n\t\t\tthis.scene.remove(this.scene.children[0]);\n\t\t}\n\t\tthis.desk.material.dispose();\n\t\tthis.desk.geometry.dispose();\n\t\tif(this.composerTarget)\n\t\t\tthis.composerTarget.dispose();\n\t\tif(this.bloomPass)\n\t\t\tthis.bloomPass.dispose();\n\t\tif(this.AAPass)\n\t\t\tthis.AAPass.dispose();\n\t\tif(this.bloomComposer){\n\t\t\tthis.bloomComposer.renderTarget1.dispose();\n\t\t\tthis.bloomComposer.renderTarget2.dispose();\n\t\t}\n\t\tif(this.finalComposer){\n\t\t\tthis.finalComposer.renderTarget1.dispose();\n\t\t\tthis.finalComposer.renderTarget2.dispose();\n\t\t}\n\t\tif (this.dicefactory.shadows) {\n\t\t\tthis.light.shadow.map.dispose();\n\t\t}\n\t\tif (this.config.boxType == \"board\")\n\t\t\tthis.removeTicker(this.animateThrow);\n\t\telse\n\t\t\tthis.removeTicker(this.animateSelector);\n\t}\n\n\t//Allow to remove an handler from a PIXI ticker even when the context changed.\n\tremoveTicker(fn) {\n\t\tlet ticker = canvas.app.ticker;\n\t\tlet listener = ticker._head.next;\n\n\t\twhile (listener) {\n\t\t\t// We found a match, lets remove it\n\t\t\t// no break to delete all possible matches\n\t\t\t// incase a listener was added 2+ times\n\t\t\tif (listener.fn === fn) {\n\t\t\t\tlistener = listener.destroy();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tlistener = listener.next;\n\t\t\t}\n\t\t}\n\n\t\tif (!ticker._head.next) {\n\t\t\tticker._cancelIfNeeded();\n\t\t}\n\t\treturn ticker;\n\t}\n\n\trollDice(throws, callback) {\n\n\t\tthis.camera.position.z = this.cameraHeight.far;\n\t\tthis.clearDice();\n\t\tthis.minIterations = (throws.length - 1) * this.nbIterationsBetweenRolls;\n\n\t\tfor (let j = 0; j < throws.length; j++) {\n\t\t\tlet notationVectors = throws[j];\n\n\t\t\tfor (let i = 0, len = notationVectors.dice.length; i < len; ++i) {\n\t\t\t\tnotationVectors.dice[i].startAtIteration = j * this.nbIterationsBetweenRolls;\n\t\t\t\tlet appearance = this.dicefactory.getAppearanceForDice(notationVectors.dsnConfig.appearance, notationVectors.dice[i].type, notationVectors.dice[i]);\n\t\t\t\tthis.spawnDice(notationVectors.dice[i], appearance);\n\t\t\t}\n\t\t}\n\t\tthis.iteration = 0;\n\n\t\tthis.simulateThrow();\n\t\tthis.iteration = 0;\n\n\n\t\t//check forced results, fix dice faces if necessary\n\t\t//Detect if there's an animated dice\n\t\tthis.animatedDiceDetected = false;\n\t\tfor (let i = 0, len = this.diceList.length; i < len; ++i) {\n\t\t\tlet dicemesh = this.diceList[i];\n\t\t\tif (!dicemesh) continue;\n\t\t\tthis.swapDiceFace(dicemesh);\n\t\t\tif (dicemesh.mixer)\n\t\t\t\tthis.animatedDiceDetected = true;\n\t\t}\n\n\t\t//reset the result\n\t\tfor (let i = 0, len = this.diceList.length; i < len; ++i) {\n\t\t\tif (!this.diceList[i]) continue;\n\n\t\t\tif (this.diceList[i].resultReason != 'forced') {\n\t\t\t\tthis.diceList[i].result = [];\n\t\t\t}\n\t\t}\n\n\t\t// animate the previously simulated roll\n\t\tthis.rolling = true;\n\t\tthis.running = (new Date()).getTime();\n\t\tthis.last_time = 0;\n\t\tthis.callback = callback;\n\t\tthis.throws = throws;\n\t\tthis.removeTicker(this.animateThrow);\n\t\tcanvas.app.ticker.add(this.animateThrow, this);\n\t}\n\n\tshowcase(config) {\n\t\tthis.clearAll();\n\n\t\tlet selectordice = this.dicefactory.systems.standard.dice.map(dice => dice.type);\n\t\tconst extraDiceTypes = [\"d3\", \"d5\", \"d7\", \"d14\", \"d16\", \"d24\", \"d30\"];\n\t\tif (!this.showExtraDice)\n\t\t\tselectordice = selectordice.filter((die) => !extraDiceTypes.includes(die));\n\n\t\tlet proportion = this.display.containerWidth / this.display.containerHeight;\n\t\tlet columns = Math.min(selectordice.length, Math.round(Math.sqrt(proportion * selectordice.length)));\n\t\tlet rows = Math.floor((selectordice.length + columns - 1) / columns);\n\n\t\tthis.camera.position.z = this.cameraHeight.medium;\n\t\tthis.camera.position.x = this.display.containerWidth / 2 - (this.display.containerWidth / columns / 2);\n\t\tthis.camera.position.y = -this.display.containerHeight / 2 + (this.display.containerHeight / rows / 2);\n\t\tthis.camera.fov = 2 * Math.atan(this.display.containerHeight / (2 * this.camera.position.z)) * (180 / Math.PI);\n\t\tthis.camera.updateProjectionMatrix();\n\n\t\tif (this.pane) this.scene.remove(this.pane);\n\t\tif (this.desk) this.scene.remove(this.desk);\n\t\tif (this.dicefactory.shadows) {\n\n\t\t\tlet shadowplane = new THREE.ShadowMaterial();\n\t\t\tshadowplane.opacity = 0.5;\n\n\t\t\tthis.pane = new THREE.Mesh(new THREE.PlaneGeometry(this.display.containerWidth * 2, this.display.containerHeight * 2, 1, 1), shadowplane);\n\t\t\tthis.pane.receiveShadow = this.dicefactory.shadows;\n\t\t\tthis.pane.position.set(0, 0, -70);\n\t\t\tthis.scene.add(this.pane);\n\t\t}\n\n\t\tlet z = 0;\n\t\tlet count = 0;\n\t\tfor (let y = 0; y < rows; y++) {\n\t\t\tfor (let x = 0; x < columns; x++) {\n\t\t\t\tif (count >= selectordice.length)\n\t\t\t\t\tbreak;\n\t\t\t\tlet appearance = this.dicefactory.getAppearanceForDice(config.appearance, selectordice[count]);\n\t\t\t\tlet dicemesh = this.dicefactory.create(this.renderer.scopedTextureCache, selectordice[count], appearance);\n\t\t\t\tdicemesh.scale.set(\n\t\t\t\t\tMath.min(dicemesh.scale.x * 5 / columns, dicemesh.scale.x * 2 / rows),\n\t\t\t\t\tMath.min(dicemesh.scale.y * 5 / columns, dicemesh.scale.y * 2 / rows),\n\t\t\t\t\tMath.min(dicemesh.scale.z * 5 / columns, dicemesh.scale.z * 2 / rows)\n\t\t\t\t);\n\n\t\t\t\tdicemesh.position.set(x * this.display.containerWidth / columns, -(y * this.display.containerHeight / rows), z);\n\n\t\t\t\tdicemesh.castShadow = this.dicefactory.shadows;\n\n\t\t\t\tdicemesh.userData = selectordice[count];\n\n\t\t\t\tthis.diceList.push(dicemesh);\n\t\t\t\tthis.scene.add(dicemesh);\n\t\t\t\tcount++;\n\t\t\t}\n\t\t}\n\n\t\tthis.last_time = 0;\n\t\tif (this.selector.animate) {\n\t\t\tthis.container.style.opacity = 0;\n\t\t\tthis.last_time = window.performance.now();\n\t\t\tthis.start_time = this.last_time;\n\t\t\tthis.framerate = 1000 / 60;\n\t\t\tthis.removeTicker(this.animateSelector);\n\t\t\tcanvas.app.ticker.add(this.animateSelector, this);\n\t\t}\n\t\telse this.renderScene();\n\t\tsetTimeout(() => {\n\t\t\tthis.scene.traverse(object => {\n\t\t\t\tif (object.type === 'Mesh') object.material.needsUpdate = true;\n\t\t\t});\n\t\t}, 2000);\n\t}\n\n\tanimateSelector() {\n\t\tthis.animstate = 'selector';\n\t\tlet now = window.performance.now();\n\t\tlet elapsed = now - this.last_time;\n\t\tif (elapsed > this.framerate) {\n\t\t\tthis.last_time = now - (elapsed % this.framerate);\n\n\t\t\tif (this.container.style.opacity != '1') this.container.style.opacity = Math.min(1, (parseFloat(this.container.style.opacity) + 0.05));\n\n\t\t\tif (this.selector.rotate) {\n\t\t\t\tlet angle_change = 0.005 * Math.PI;\n\t\t\t\tfor (let i = 0; i < this.diceList.length; i++) {\n\t\t\t\t\tthis.diceList[i].rotation.y += angle_change;\n\t\t\t\t\tthis.diceList[i].rotation.x += angle_change / 4;\n\t\t\t\t\tthis.diceList[i].rotation.z += angle_change / 10;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.renderScene();\n\t\t}\n\t}\n\n\t//used to debug cannon shape vs three shape\n\tbody2mesh(body) {\n\t\tvar obj = new THREE.Object3D();\n\t\tlet currentMaterial = new THREE.MeshBasicMaterial({ wireframe: true });\n\t\tfor (var l = 0; l < body.shapes.length; l++) {\n\t\t\tvar shape = body.shapes[l];\n\n\t\t\tvar mesh;\n\n\t\t\tswitch (shape.type) {\n\n\t\t\t\tcase CANNON.Shape.types.SPHERE:\n\t\t\t\t\tvar sphere_geometry = new THREE.SphereGeometry(shape.radius, 8, 8);\n\t\t\t\t\tmesh = new THREE.Mesh(sphere_geometry, currentMaterial);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase CANNON.Shape.types.PARTICLE:\n\t\t\t\t\tmesh = new THREE.Mesh(this.particleGeo, this.particleMaterial);\n\t\t\t\t\tvar s = this.settings;\n\t\t\t\t\tmesh.scale.set(s.particleSize, s.particleSize, s.particleSize);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase CANNON.Shape.types.PLANE:\n\t\t\t\t\tvar geometry = new THREE.PlaneGeometry(10, 10, 4, 4);\n\t\t\t\t\tmesh = new THREE.Object3D();\n\t\t\t\t\tvar submesh = new THREE.Object3D();\n\t\t\t\t\tvar ground = new THREE.Mesh(geometry, currentMaterial);\n\t\t\t\t\tground.scale.set(100, 100, 100);\n\t\t\t\t\tsubmesh.add(ground);\n\n\t\t\t\t\tground.castShadow = true;\n\t\t\t\t\tground.receiveShadow = true;\n\n\t\t\t\t\tmesh.add(submesh);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase CANNON.Shape.types.BOX:\n\t\t\t\t\tvar box_geometry = new THREE.BoxGeometry(shape.halfExtents.x * 2,\n\t\t\t\t\t\tshape.halfExtents.y * 2,\n\t\t\t\t\t\tshape.halfExtents.z * 2);\n\t\t\t\t\tmesh = new THREE.Mesh(box_geometry, currentMaterial);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase CANNON.Shape.types.CONVEXPOLYHEDRON:\n\t\t\t\t\tvar geo = new THREE.BufferGeometry()\n\t\t\t\t\tvar points = []\n\t\t\t\t\tfor (var i = 0; i < shape.faces.length; i++) {\n\t\t\t\t\t\tvar face = shape.faces[i];\n\n\t\t\t\t\t\tfor (var j = 0; j < face.length - 1; j++) {\n\t\t\t\t\t\t\tvar a = shape.vertices[face[j]];\n\t\t\t\t\t\t\tvar b = shape.vertices[face[j + 1]];\n\t\t\t\t\t\t\tpoints.push(a);\n\t\t\t\t\t\t\tpoints.push(b);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tgeo.setFromPoints(points);\n\t\t\t\t\tgeo.computeVertexNormals();\n\t\t\t\t\tmesh = new THREE.Mesh(geo, currentMaterial);\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow \"Visual type not recognized: \" + shape.type;\n\t\t\t}\n\n\t\t\t//mesh.receiveShadow = this.dicefactory.shadows;\n\t\t\tmesh.castShadow = this.dicefactory.shadows;\n\t\t\tif (mesh.children) {\n\t\t\t\tfor (var i = 0; i < mesh.children.length; i++) {\n\t\t\t\t\tmesh.children[i].castShadow = true;\n\t\t\t\t\tmesh.children[i].receiveShadow = true;\n\t\t\t\t\tif (mesh.children[i]) {\n\t\t\t\t\t\tfor (var j = 0; j < mesh.children[i].length; j++) {\n\t\t\t\t\t\t\tmesh.children[i].children[j].castShadow = true;\n\t\t\t\t\t\t\tmesh.children[i].children[j].receiveShadow = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar o = body.shapeOffsets[l];\n\t\t\tvar q = body.shapeOrientations[l];\n\t\t\tmesh.position.set(o.x, o.y, o.z);\n\t\t\tmesh.quaternion.set(q.x, q.y, q.z, q.w);\n\n\t\t\tobj.add(mesh);\n\t\t}\n\n\t\treturn obj;\n\t}\n\n\tfindRootObject(object) {\n\t\tif (object.hasOwnProperty(\"shape\"))\n\t\t\treturn object;\n\t\telse if (object.parent)\n\t\t\treturn this.findRootObject(object.parent);\n\t\telse\n\t\t\treturn null;\n\t}\n\n\tfindShowcaseDie(pos) {\n\t\tthis.raycaster.setFromCamera(pos, this.camera);\n\t\tconst intersects = this.raycaster.intersectObjects([...this.diceList, ...this.deadDiceList], true);\n\t\tif (intersects.length) {\n\n\t\t\treturn intersects[0];\n\t\t}\n\t\telse\n\t\t\treturn null;\n\t}\n\n\tfindHoveredDie() {\n\t\tif (this.isVisible && !this.running && !this.mouse.constraintDown) {\n\t\t\tthis.raycaster.setFromCamera(this.mouse.pos, this.camera);\n\t\t\tconst intersects = this.raycaster.intersectObjects([...this.diceList, ...this.deadDiceList], true);\n\t\t\tif (intersects.length) {\n\t\t\t\tthis.hoveredDie = intersects[0];\n\t\t\t}\n\t\t\telse\n\t\t\t\tthis.hoveredDie = null;\n\t\t}\n\t}\n\n\tonMouseMove(event, ndc) {\n\t\tthis.mouse.pos.x = ndc.x;\n\t\tthis.mouse.pos.y = ndc.y;\n\n\t\tif (this.mouse.constraint) {\n\t\t\tthis.raycaster.setFromCamera(this.mouse.pos, this.camera);\n\t\t\tconst intersects = this.raycaster.intersectObjects([this.desk]);\n\t\t\tif (intersects.length) {\n\t\t\t\tlet pos = intersects[0].point;\n\t\t\t\tthis.jointBody.position.set(pos.x, pos.y, pos.z + 150);\n\t\t\t\tthis.mouse.constraint.update();\n\t\t\t}\n\t\t}\n\t}\n\n\tonMouseDown(event, ndc) {\n\t\tthis.mouse.pos.x = ndc.x;\n\t\tthis.mouse.pos.y = ndc.y;\n\t\tthis.hoveredDie = null;\n\t\tthis.findHoveredDie();\n\n\t\tlet entity = this.hoveredDie;\n\t\tif (!entity)\n\t\t\treturn;\n\t\tlet pos = entity.point;\n\t\tif (pos) {\n\t\t\tthis.mouse.constraintDown = true;\n\t\t\t//disable FVTT mouse events\n\t\t\tevent.stopPropagation();\n\t\t\tevent.preventDefault();\n\t\t\tif (canvas.mouseInteractionManager)\n\t\t\t\tcanvas.mouseInteractionManager.object.interactive = false;\n\n\t\t\t// Vector to the clicked point, relative to the body\n\t\t\tlet root = this.findRootObject(entity.object);\n\t\t\tlet v1 = new CANNON.Vec3(pos.x, pos.y, pos.z).vsub(root.body_sim.position);\n\n\t\t\t// Apply anti-quaternion to vector to tranform it into the local body coordinate system\n\t\t\tlet antiRot = root.body_sim.quaternion.inverse();\n\t\t\tlet pivot = antiRot.vmult(v1); // pivot is not in local body coordinates\n\n\t\t\t// Move the cannon click marker particle to the click position\n\t\t\tthis.jointBody.position.set(pos.x, pos.y, pos.z + 150);\n\n\t\t\t// Create a new constraint\n\t\t\t// The pivot for the jointBody is zero\n\t\t\tthis.mouse.constraint = new CANNON.PointToPointConstraint(root.body_sim, pivot, this.jointBody, new CANNON.Vec3(0, 0, 0));\n\n\t\t\t// Add the constriant to world\n\t\t\tthis.world_sim.addConstraint(this.mouse.constraint);\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tonMouseUp(event) {\n\t\tif (this.mouse.constraintDown) {\n\t\t\tthis.mouse.constraintDown = false;\n\t\t\tthis.world_sim.removeConstraint(this.mouse.constraint);\n\n\t\t\t//re-enable fvtt canvas events\n\t\t\tif (canvas.mouseInteractionManager)\n\t\t\t\tcanvas.mouseInteractionManager.activate();\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t}\n\n\tasync handleSpecialEffectsInit() {\n\t\tlet promisesSFX = [];\n\t\tthis.diceList.forEach(dice => {\n\t\t\tif (dice.specialEffects) {\n\t\t\t\tdice.specialEffects.forEach(sfx => {\n\t\t\t\t\tpromisesSFX.push(DiceSFXManager.playSFX(sfx, this, dice));\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\treturn Promise.all(promisesSFX);\n\t}\n}\n","\"use strict\"\n\nexport class DiceNotation {\n\n\t/**\n\t * A roll object from Foundry \n\t * @param {Roll} rolls \n\t */\n\tconstructor(rolls, userConfig = null) {\n\t\tthis.throws = [{dice:[]}];\n\t\tthis.userConfig = userConfig;\n\t\t\n\t\t//First we need to prepare the data\n\t\trolls.dice.forEach(die => {\n\t\t\t//We only are able to handle this list of number of face in 3D for now\n\t\t\tif([2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 30, 100].includes(die.faces)) {\n\t\t\t\t//We flag every single die with a throw number, to queue exploded dice\n\t\t\t\tlet cnt=die.number;\n\t\t\t\tlet countExploded = 0;\n\t\t\t\tlet localNbThrow = 0;\n\t\t\t\tfor(let i =0; i< die.results.length; i++){\n\t\t\t\t\tif(localNbThrow >= this.throws.length)\n\t\t\t\t\t\tthis.throws.push({dice:[]});\n\n\t\t\t\t\tif(die.results[i].exploded)\n\t\t\t\t\t\tcountExploded++;\n\t\t\t\t\tdie.results[i].indexThrow = localNbThrow;\n\t\t\t\t\tif (die.results[i].discarded) continue; //Continue if die result is discarded\n\t\t\t\t\t//If we have a new throw\n\t\t\t\t\tif(--cnt <= 0){\n\t\t\t\t\t\tlocalNbThrow++;\n\t\t\t\t\t\tcnt = countExploded;\n\t\t\t\t\t\tcountExploded = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tlet diceNumber = 0;\n\t\tlet maxDiceNumber = game.settings.get(\"dice-so-nice\", \"maxDiceNumber\");\n\t\t//Then we can create the throws\n\t\trolls.dice.some(die => {\n\t\t\t//We only are able to handle this list of number of face in 3D for now\n\t\t\tif([2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 30, 100].includes(die.faces)) {\n\t\t\t\tlet options = {};\n\t\t\t\tfor(let i =0; i< die.results.length; i++){\n\t\t\t\t\tif(++diceNumber >= maxDiceNumber)\n\t\t\t\t\t\treturn true;\n\t\t\t\t\tif(!die.results[i].hidden){\n\t\t\t\t\t\t//ghost can't be secret\n\t\t\t\t\t\tif(rolls.ghost)\n\t\t\t\t\t\t\toptions.ghost = true;\n\t\t\t\t\t\telse if(rolls.secret)\n\t\t\t\t\t\t\toptions.secret = true;\n\n\t\t\t\t\t\tif(die.modifiers.length)\n\t\t\t\t\t\t\toptions.modifiers = die.modifiers;\n\n\t\t\t\t\t\tthis.addDie({fvttDie: die, index:i, options:options});\n\t\t\t\t\t\tif(die.faces == 100){\n\t\t\t\t\t\t\tthis.addDie({fvttDie: die, index:i, isd10of100:true, options:options});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t/**\n\t * \n\t * @param {DiceTerm} fvttDie Die object from Foundry VTT\n\t * @param {Integer} index Position in the dice array\n\t * @param {Boolean} isd10of100 In DsN, we use two d10 for a d100. Set to true if this die should be the unit dice of a d100\n\t * @param {Object} options Options related to the fvtt roll that should be attached to the dsn die\n\t */\n\taddDie({fvttDie, index, isd10of100 = false, options = {}}){\n\t\tlet dsnDie = {};\n\t\tlet dieValue = fvttDie.results[index].result;\n\t\tif(fvttDie.faces == 100) {\n\t\t\t//For d100, we create two d10 dice\n\t\t\tif(isd10of100) {\n\t\t\t\tdieValue = dieValue%10;\n\t\t\t\t\n\t\t\t\tdsnDie.resultLabel = fvttDie.getResultLabel({result:dieValue});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tdieValue = parseInt(dieValue/10);\n\t\t\t\tdsnDie.resultLabel = fvttDie.getResultLabel({result:dieValue*10});\n\t\t\t\t//On a d100, 0 is 10, because.\n\t\t\t\tif(dieValue==10)\n\t\t\t\t\tdieValue=0;\n\t\t\t}\n\t\t\tdsnDie.d100Result = fvttDie.results[index].result;\n\t\t} else\n\t\t\t\n\t\t\tdsnDie.resultLabel = fvttDie.getResultLabel({result:dieValue});\n\t\tdsnDie.result = dieValue;\n\t\tif(fvttDie.results[index].discarded)\n\t\t\tdsnDie.discarded = true;\n\n\n\t\t//If it is not a standard die (\"d\"), we need to prepend \"d\" to the denominator. If it is, we append the number of face\n\t\tdsnDie.type = fvttDie.constructor.DENOMINATION;\n\t\tif(fvttDie.constructor.name == CONFIG.Dice.terms[\"d\"].name)\n\t\t\tdsnDie.type += isd10of100 ? \"10\":fvttDie.faces;\n\t\telse {\n\t\t\tdsnDie.type = \"d\"+dsnDie.type;\n\t\t}\n\t\tdsnDie.vectors = [];\n\t\t//Contains optionals flavor (core) and colorset (dsn) infos.\n\t\tdsnDie.options = duplicate(fvttDie.options);\n\t\tmergeObject(dsnDie.options, options);\n\t\tif(this.userConfig && !this.userConfig.enableFlavorColorset && dsnDie.options.flavor)\n\t\t\tdelete dsnDie.options.flavor;\n\n\t\tthis.throws[fvttDie.results[index].indexThrow].dice.push(dsnDie);\n\t}\n\n\tstatic mergeQueuedRollCommands(queue){\n\t\tlet mergedRollCommands = [];\n\t\tqueue.forEach(command => {\n\t\t\tfor(let i = 0; i< command.params.throws.length; i++){\n\t\t\t\tif(!mergedRollCommands[i])\n\t\t\t\t\tmergedRollCommands.push([]);\n\t\t\t\tcommand.params.throws[i].dsnConfig = command.params.dsnConfig;\n\t\t\t\tmergedRollCommands[i].push(command.params.throws[i]);\n\t\t\t}\n\t\t});\n\t\t//First we loop on the command list\n\t\tfor(let i=0;i<mergedRollCommands.length;i++){\n\t\t\t//Then we loop on throws\n\t\t\tfor(let j=0;j<mergedRollCommands[i].length;j++){\n\n\t\t\t\t//Retrieve the sfx list (unfiltered) for this throw. We do not know yet if these sfx should be visible or not\n\t\t\t\tlet sfxList = mergedRollCommands[i][j].dsnConfig.specialEffects;\n\t\t\t\t/*if(!sfxList || !sfxList[\"0\"])\n\t\t\t\t\tcontinue;*/\n\t\t\t\t//Finally we loop over each dice in this throw\n\t\t\t\tfor(let k=0;k<mergedRollCommands[i][j].dice.length;k++){\n\t\t\t\t\tconst dsnDie = mergedRollCommands[i][j].dice[k];\n\t\t\t\t\t//attach SFX that should trigger for this roll\n\t\t\t\t\t//For each sfx configured\n\t\t\t\t\tlet specialEffects = Object.values(sfxList).filter(sfx => {\n\t\t\t\t\t\t//if the dice is discarded, it should not trigger a special fx\n\t\t\t\t\t\tif(dsnDie.discarded)\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\n\t\t\t\t\t\t//if the dice is a ghost dice, it should not trigger a special fx\n\t\t\t\t\t\tif(dsnDie.options.ghost)\n\t\t\t\t\t\t\treturn false;\n\n\t\t\t\t\t\t//if the special effect \"onResult\" list contains non-numeric value, we manually deal with them here\n\t\t\t\t\t\tlet manualResultTrigger = false;\n\t\t\t\t\t\t//Keep Highest. Discarded dice are already filtered out\n\t\t\t\t\t\tif(sfx.onResult.includes(\"kh\"))\n\t\t\t\t\t\t\tmanualResultTrigger = dsnDie.options?.modifiers?.includes(\"kh\");\n\t\t\t\t\t\t//Keep Lowest. Discarded dice are already filtered out\n\t\t\t\t\t\tif(sfx.onResult.includes(\"kl\"))\n\t\t\t\t\t\t\tmanualResultTrigger = dsnDie.options?.modifiers?.includes(\"kl\");\n\n\t\t\t\t\t\tif(manualResultTrigger)\n\t\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t\t//if the result is in the triggers value, we keep the fx. Special case: double d10 for a d100 roll\n\t\t\t\t\t\tif(sfx.diceType == \"d100\"){\n\t\t\t\t\t\t\tif(dsnDie.d100Result && sfx.onResult.includes(dsnDie.d100Result.toString()))\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(sfx.diceType == dsnDie.type && sfx.onResult.includes(dsnDie.result.toString()))\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t//if a special effect was manually triggered for this dice, we also include it\n\t\t\t\t\t\tif(dsnDie.options.sfx && dsnDie.options.sfx.id == sfx.diceType && sfx.onResult.includes(dsnDie.options.sfx.result.toString()))\n\t\t\t\t\t\t\treturn true;\n\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t});\n\t\t\t\t\t//Now that we have a filtered list of sfx to play, we make a final list of all sfx for this die and we remove the duplicates\n\t\t\t\t\tif(dsnDie.options.sfx && dsnDie.options.sfx.specialEffect)\n\t\t\t\t\t\tspecialEffects.push({\n\t\t\t\t\t\t\tspecialEffect:dsnDie.options.sfx.specialEffect,\n\t\t\t\t\t\t\toptions:dsnDie.options.sfx.options\n\t\t\t\t\t\t});\n\t\t\t\t\tif(specialEffects.length){\n\t\t\t\t\t\t//remove duplicate\n\t\t\t\t\t\tspecialEffects = specialEffects.filter((v, i, a) => a.indexOf(v) === i);\n\t\t\t\t\t\tmergedRollCommands[i][j].dice[k].specialEffects = specialEffects;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tconsole.log(mergedRollCommands);\n\t\treturn mergedRollCommands;\n\t}\n}\n","export class Accumulator {\n constructor(delay, onEnd) {\n this._timeout = null;\n this._delay = delay;\n this._onEnd = onEnd;\n this._items = [];\n }\n\n addItem(item) {\n this._items.push(item);\n if (this._timeout)\n clearTimeout(this._timeout);\n let callback = function () {\n this._onEnd(this._items)\n this._timeout = null\n this._items = [];\n }.bind(this);\n if (this._delay)\n this._timeout = setTimeout(callback, this._delay);\n else\n callback();\n }\n}","import { TEXTURELIST, COLORSETS } from './DiceColors.js';\n/**\n * Generic utilities class...\n */\n export class Utils {\n\n /**\n * Migrate old 1.0 or 2.0 setting to new 4.0 format.\n */\n static async migrateOldSettings() {\n\n //migrate settings to flags. This is a scoped migration, no GM needed\n let userSettings = game.settings.get(\"dice-so-nice\", \"settings\");\n if(userSettings.hasOwnProperty(\"enabled\")){\n await game.user.setFlag(\"dice-so-nice\", \"settings\", userSettings);\n await game.settings.set(\"dice-so-nice\",\"settings\",{});\n }\n\n let formatversion = game.settings.get(\"dice-so-nice\", \"formatVersion\");\n\n if (formatversion == \"\" || formatversion != \"4.1\") { //Never updated or first install\n if (!game.user.isGM) {\n ui.notifications.warn(game.i18n.localize(\"DICESONICE.migrateMessageNeedGM\"));\n return false;\n }\n } else if (formatversion == \"4.1\") {\n //Fuck it, lets do this so I'm sure it it not because of DsN itself.\n if (game.user.isGM) {\n await Promise.all(game.users.map(async (user) => {\n let appearance = user.getFlag(\"dice-so-nice\", \"appearance\") ? duplicate(user.getFlag(\"dice-so-nice\", \"appearance\")) : null;\n if (appearance && appearance.hasOwnProperty(\"labelColor\")) {\n let data = {\n \"-=colorset\":null,\n \"-=diceColor\":null,\n \"-=edgeColor\":null,\n \"-=font\":null,\n \"-=labelColor\":null,\n \"-=material\":null,\n \"-=outlineColor\":null,\n \"-=system\":null,\n \"-=texture\":null\n };\n await user.setFlag(\"dice-so-nice\", \"appearance\", data);\n }\n }));\n } else {\n let appearance = game.user.getFlag(\"dice-so-nice\", \"appearance\") ? duplicate(game.user.getFlag(\"dice-so-nice\", \"appearance\")) : null;\n if (appearance && appearance.hasOwnProperty(\"labelColor\")) {\n let data = {\n \"-=colorset\":null,\n \"-=diceColor\":null,\n \"-=edgeColor\":null,\n \"-=font\":null,\n \"-=labelColor\":null,\n \"-=material\":null,\n \"-=outlineColor\":null,\n \"-=system\":null,\n \"-=texture\":null\n };\n await game.user.setFlag(\"dice-so-nice\", \"appearance\", data);\n }\n }\n return true;\n }\n let migrated = false;\n \n if(formatversion == \"\"){\n //v1 to v2\n let settings = game.user.getFlag(\"dice-so-nice\", \"settings\") ? duplicate(game.user.getFlag(\"dice-so-nice\", \"settings\")):{};\n if (settings.diceColor || settings.labelColor) {\n let newSettings = mergeObject(game.dice3d.constructor.DEFAULT_OPTIONS, settings, { insertKeys: false, insertValues: false,performDeletions:true });\n let appearance = mergeObject(game.dice3d.constructor.DEFAULT_APPEARANCE(), settings, { insertKeys: false, insertValues: false,performDeletions:true});\n await game.settings.set(\"dice-so-nice\", \"settings\", mergeObject(newSettings, { \"-=dimensions\": null, \"-=fxList\": null },{performDeletions:true}));\n await game.user.setFlag(\"dice-so-nice\", \"appearance\", appearance);\n migrated = true;\n }\n\n //v2 to v4\n await Promise.all(game.users.map(async (user) => {\n let appearance = user.getFlag(\"dice-so-nice\", \"appearance\") ? duplicate(user.getFlag(\"dice-so-nice\", \"appearance\")) : null;\n if (appearance && appearance.hasOwnProperty(\"labelColor\")) {\n let data = {\n global: appearance\n };\n await user.unsetFlag(\"dice-so-nice\", \"appearance\");\n await user.setFlag(\"dice-so-nice\", \"appearance\", data);\n migrated = true;\n }\n\n let sfxList = user.getFlag(\"dice-so-nice\", \"sfxList\") ? duplicate(user.getFlag(\"dice-so-nice\", \"sfxList\")) : null;\n \n if(sfxList){\n if(!Array.isArray(sfxList))\n sfxList = Object.values(sfxList);\n sfxList.forEach((sfx)=>{\n sfx.onResult = [sfx.onResult];\n });\n await user.unsetFlag(\"dice-so-nice\", \"sfxList\");\n await user.setFlag(\"dice-so-nice\", \"sfxList\", sfxList);\n migrated = true;\n }\n }));\n }\n //v4 to v4.1 (fix)\n //Remove the extra properties, no idea why tho\n await Promise.all(game.users.map(async (user) => {\n let appearance = user.getFlag(\"dice-so-nice\", \"appearance\") ? duplicate(user.getFlag(\"dice-so-nice\", \"appearance\")) : null;\n if (appearance && appearance.hasOwnProperty(\"labelColor\")) {\n let data = {\n \"-=colorset\":null,\n \"-=diceColor\":null,\n \"-=edgeColor\":null,\n \"-=font\":null,\n \"-=labelColor\":null,\n \"-=material\":null,\n \"-=outlineColor\":null,\n \"-=system\":null,\n \"-=texture\":null\n };\n await user.setFlag(\"dice-so-nice\", \"appearance\", data);\n }\n }));\n\n game.settings.set(\"dice-so-nice\", \"formatVersion\", \"4.1\");\n if(migrated)\n ui.notifications.info(game.i18n.localize(\"DICESONICE.migrateMessage\"));\n return true;\n }\n\n\n /**\n *\n * @param cfg\n * @returns {{}}\n */\n static localize(cfg) {\n return Object.keys(cfg).reduce((i18nCfg, key) => {\n i18nCfg[key] = game.i18n.localize(cfg[key]);\n return i18nCfg;\n }, {}\n );\n };\n\n /**\n * Get the contrasting color for any hex color.\n *\n * @returns {String} The contrasting color (black or white)\n */\n static contrastOf(color) {\n\n if (color.slice(0, 1) === '#') {\n color = color.slice(1);\n }\n\n if (color.length === 3) {\n color = color.split('').map(function (hex) {\n return hex + hex;\n }).join('');\n }\n\n const r = parseInt(color.substr(0, 2), 16);\n const g = parseInt(color.substr(2, 2), 16);\n const b = parseInt(color.substr(4, 2), 16);\n\n var yiq = ((r * 299) + (g * 587) + (b * 114)) / 1000;\n\n return (yiq >= 128) ? '#000000' : '#FFFFFF';\n };\n\n static prepareTextureList() {\n return Object.keys(TEXTURELIST).reduce((i18nCfg, key) => {\n i18nCfg[key] = game.i18n.localize(TEXTURELIST[key].name);\n return i18nCfg;\n }, {}\n );\n };\n\n static prepareFontList() {\n let fontList = {\n \"auto\": game.i18n.localize(\"DICESONICE.FontAuto\")\n };\n return mergeObject(fontList,FontConfig.getAvailableFontChoices());\n };\n\n static prepareColorsetList() {\n let groupedSetsList = Object.values(COLORSETS);\n groupedSetsList.sort((set1, set2) => {\n if (game.i18n.localize(set1.description) < game.i18n.localize(set2.description)) return -1;\n if (game.i18n.localize(set1.description) > game.i18n.localize(set2.description)) return 1;\n });\n let preparedList = {};\n for (let i = 0; i < groupedSetsList.length; i++) {\n if (groupedSetsList[i].visibility == 'hidden')\n continue;\n let locCategory = game.i18n.localize(groupedSetsList[i].category);\n if (!preparedList.hasOwnProperty(locCategory))\n preparedList[locCategory] = {};\n preparedList[locCategory][groupedSetsList[i].name] = game.i18n.localize(groupedSetsList[i].description);\n }\n\n return preparedList;\n };\n\n static prepareSystemList() {\n let systems = game.dice3d.box.dicefactory.systems;\n return Object.keys(systems).reduce((i18nCfg, key) => {\n i18nCfg[key] = game.i18n.localize(systems[key].name);\n return i18nCfg;\n }, {});\n };\n\n static filterObject(obj, predicate) {\n return Object.keys(obj)\n .filter(key => predicate(obj[key]))\n .reduce((res, key) => (res[key] = obj[key], res), {});\n }\n\n static actionSaveAs(name){\n let savesObject = game.user.getFlag(\"dice-so-nice\", \"saves\");\n let saves;\n if (!savesObject) {\n saves = new Map();\n } else {\n //workaround for https://gitlab.com/foundrynet/foundryvtt/-/issues/5464\n saves = new Map(Object.entries(savesObject));\n }\n //save current settings first\n \n let saveObject = {\n appearance: game.user.getFlag(\"dice-so-nice\", \"appearance\"),\n sfxList: game.user.getFlag(\"dice-so-nice\", \"sfxList\"),\n settings: game.settings.get(\"dice-so-nice\", \"settings\")\n };\n\n saves.set(name, saveObject);\n game.user.unsetFlag(\"dice-so-nice\", \"saves\").then(() => {\n game.user.setFlag(\"dice-so-nice\", \"saves\", Object.fromEntries(saves));\n });\n }\n\n static async actionDeleteSave(name){\n let savesObject = game.user.getFlag(\"dice-so-nice\", \"saves\");\n let saves = new Map(Object.entries(savesObject));\n saves.delete(name);\n game.user.unsetFlag(\"dice-so-nice\", \"saves\").then(async () => {\n await game.user.setFlag(\"dice-so-nice\", \"saves\", Object.fromEntries(saves));\n ui.notifications.info(game.i18n.localize(\"DICESONICE.saveMessage\"));\n });\n }\n\n static async actionLoadSave(name) {\n let savesObject = game.user.getFlag(\"dice-so-nice\", \"saves\");\n let save = new Map(Object.entries(savesObject)).get(name);\n\n if (save.appearance) {\n await game.user.unsetFlag(\"dice-so-nice\", \"appearance\");\n await game.user.setFlag(\"dice-so-nice\", \"appearance\", save.appearance);\n }\n if (save.sfxList) {\n await game.user.unsetFlag(\"dice-so-nice\", \"sfxList\");\n await game.user.setFlag(\"dice-so-nice\", \"sfxList\", save.sfxList);\n }\n if (save.settings) {\n await game.user.unsetFlag(\"dice-so-nice\", \"settings\");\n await game.user.setFlag(\"dice-so-nice\", \"settings\", save.settings);\n }\n }\n}\n","import { DataTexture, LinearFilter, LinearMipMapLinearFilter, MathUtils, RepeatWrapping, RGBAFormat, UnsignedByteType, UVMapping, Vector2 } from 'three';\n\n/**\n * MIT License\n * Copyright (c) 2019 David Lenaerts\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * @classdesc\n * ThinFilmFresnelMap is a lookup texture containing the reflection colour. The texture index value\n * is dot(normal, view). The texture values are stored in approximated gamma space (power 2.0), so\n * the sampled value needs to be multiplied with itself before use. The sampled value should replace\n * the fresnel factor in a PBR material.\n *\n * @property filmThickness The thickness of the thin film layer in nanometers. Defaults to 380.\n * @property refractiveIndexFilm The refractive index of the thin film. Defaults to 2.\n * @property refractiveIndexBase The refractive index of the material under the film. Defaults to 3.\n *\n * @constructor\n * @param filmThickness The thickness of the thin film layer in nanometers. Defaults to 380.\n * @param refractiveIndexFilm The refractive index of the thin film. Defaults to 2.\n * @param refractiveIndexBase The refractive index of the material under the film. Defaults to 3.\n * @param size The width of the texture. Defaults to 64.\n *\n * @extends DataTexture\n *\n * @author David Lenaerts <http://www.derschmale.com>\n * @author Mathias Latournerie\n */\nclass ThinFilmFresnelMap extends DataTexture {\n\n constructor(filmThickness = 480, refractiveIndexFilm = 1.3, refractiveIndexBase = 3, size = 64) {\n\n const data = new Uint8Array(size * size * 4);\n super(data, size, size, RGBAFormat, UnsignedByteType, UVMapping, RepeatWrapping, RepeatWrapping, LinearFilter, LinearMipMapLinearFilter);\n\n this._filmThickness = filmThickness;\n this._refractiveIndexFilm = refractiveIndexFilm;\n this._refractiveIndexBase = refractiveIndexBase;\n this._size = size;\n this._data = data;\n\n this._updateData();\n\n this.generateMipmaps = true;\n this.needsUpdate = true;\n }\n\n get filmThickness() {\n return this._filmThickness;\n }\n set filmThickness(value) {\n this._filmThickness = value;\n this.updateSettings(this._filmThickness, this._refractiveIndexFilm, this._refractiveIndexBase);\n }\n\n get refractiveIndexFilm() {\n return this._refractiveIndexFilm;\n }\n set refractiveIndexFilm(value) {\n this._refractiveIndexFilm = value;\n this.updateSettings(this._filmThickness, this._refractiveIndexFilm, this._refractiveIndexBase);\n }\n\n get refractiveIndexBase() {\n return this._refractiveIndexBase;\n }\n set refractiveIndexBase(value) {\n this._refractiveIndexBase = value;\n this.updateSettings(this._filmThickness, this._refractiveIndexFilm, this._refractiveIndexBase);\n }\n\n\n /**\n * Regenerates the lookup texture given new data.\n * @param filmThickness The thickness of the thin film layer in nanometers. Defaults to 380.\n * @param refractiveIndexFilm The refractive index of the thin film. Defaults to 2.\n * @param refractiveIndexBase The refractive index of the material under the film. Defaults to 3.\n */\n updateSettings(filmThickness, refractiveIndexFilm, refractiveIndexBase) {\n this._filmThickness = filmThickness || 380;\n this._refractiveIndexFilm = refractiveIndexFilm || 2;\n this._refractiveIndexBase = refractiveIndexBase || 3;\n this._updateData();\n };\n\n /**\n * @private\n */\n _fresnelRefl(refractiveIndex1, refractiveIndex2, cos1, cos2, R, phi) {\n // r is amplitudinal, R is power\n var sin1Sqr = 1.0 - cos1 * cos1; // = sin^2(incident)\n var refrRatio = refractiveIndex1 / refractiveIndex2;\n\n if (refrRatio * refrRatio * sin1Sqr > 1.0) {\n // total internal reflection\n R.x = 1.0;\n R.y = 1.0;\n\n var sqrRefrRatio = refrRatio * refrRatio;\n // it looks like glsl's atan ranges are different from those in JS?\n phi.x = 2.0 * Math.atan(-sqrRefrRatio * Math.sqrt(sin1Sqr - 1.0 / sqrRefrRatio) / cos1);\n phi.y = 2.0 * Math.atan(-Math.sqrt(sin1Sqr - 1.0 / sqrRefrRatio) / cos1);\n } else {\n var r_p = (refractiveIndex2 * cos1 - refractiveIndex1 * cos2) / (refractiveIndex2 * cos1 + refractiveIndex1 * cos2);\n var r_s = (refractiveIndex1 * cos1 - refractiveIndex2 * cos2) / (refractiveIndex1 * cos1 + refractiveIndex2 * cos2);\n\n phi.x = r_p < 0.0 ? Math.PI : 0.0;\n phi.y = r_s < 0.0 ? Math.PI : 0.0;\n\n R.x = r_p * r_p;\n R.y = r_s * r_s;\n }\n };\n\n /**\n * @private\n */\n _updateData() {\n var filmThickness = this._filmThickness;\n var refractiveIndexFilm = this._refractiveIndexFilm;\n var refractiveIndexBase = this._refractiveIndexBase;\n var size = this._size;\n\n // approximate CIE XYZ weighting functions from: http://jcgt.org/published/0002/02/01/paper.pdf\n function xFit_1931(lambda) {\n var t1 = (lambda - 442.0) * ((lambda < 442.0) ? 0.0624 : 0.0374);\n var t2 = (lambda - 599.8) * ((lambda < 599.8) ? 0.0264 : 0.0323);\n var t3 = (lambda - 501.1) * ((lambda < 501.1) ? 0.0490 : 0.0382);\n return 0.362 * Math.exp(-0.5 * t1 * t1) + 1.056 * Math.exp(-0.5 * t2 * t2) - 0.065 * Math.exp(-0.5 * t3 * t3);\n }\n\n function yFit_1931(lambda) {\n var t1 = (lambda - 568.8) * ((lambda < 568.8) ? 0.0213 : 0.0247);\n var t2 = (lambda - 530.9) * ((lambda < 530.9) ? 0.0613 : 0.0322);\n return 0.821 * Math.exp(-0.5 * t1 * t1) + 0.286 * Math.exp(-0.5 * t2 * t2);\n }\n\n function zFit_1931(lambda) {\n var t1 = (lambda - 437.0) * ((lambda < 437.0) ? 0.0845 : 0.0278);\n var t2 = (lambda - 459.0) * ((lambda < 459.0) ? 0.0385 : 0.0725);\n return 1.217 * Math.exp(-0.5 * t1 * t1) + 0.681 * Math.exp(-0.5 * t2 * t2);\n }\n\n var data = this._data;\n var phi12 = new Vector2();\n var phi21 = new Vector2();\n var phi23 = new Vector2();\n var R12 = new Vector2();\n var T12 = new Vector2();\n var R23 = new Vector2();\n var R_bi = new Vector2();\n var T_tot = new Vector2();\n var R_star = new Vector2();\n var R_bi_sqr = new Vector2();\n var R_12_star = new Vector2();\n var R_star_t_tot = new Vector2();\n\n var refrRatioSqr = 1.0 / (refractiveIndexFilm * refractiveIndexFilm);\n var refrRatioSqrBase = (refractiveIndexFilm * refractiveIndexFilm) / (refractiveIndexBase * refractiveIndexBase);\n\n // RGB is too limiting, so we use the entire spectral domain, but using limited samples (64) to\n // create more pleasing bands\n var numBands = 64;\n var waveLenRange = 780 - 380; // the entire visible range\n\n for (var i = 0; i < size; ++i) {\n for (var k = 0; k < size; ++k) {\n var cosThetaI = i / size;\n var cosThetaT = Math.sqrt(1 - refrRatioSqr * (1.0 - cosThetaI * cosThetaI));\n var cosThetaT2 = Math.sqrt(1 - refrRatioSqrBase * (1.0 - cosThetaT * cosThetaT));\n\n // this is essentially the extra distance traveled by a ray if it bounds through the film\n var pathDiff = 2.0 * refractiveIndexFilm * ((waveLenRange / size * k) + 280) * cosThetaT;\n var pathDiff2PI = 2.0 * Math.PI * pathDiff;\n\n this._fresnelRefl(1.0, refractiveIndexFilm, cosThetaI, cosThetaT, R12, phi12);\n T12.x = 1.0 - R12.x;\n T12.y = 1.0 - R12.y;\n phi21.x = Math.PI - phi12.x;\n phi21.y = Math.PI - phi12.y;\n\n // this concerns the base layer\n this._fresnelRefl(refractiveIndexFilm, refractiveIndexBase, cosThetaT, cosThetaT2, R23, phi23);\n R_bi.x = Math.sqrt(R23.x * R12.x);\n R_bi.y = Math.sqrt(R23.y * R12.y);\n T_tot.x = Math.sqrt(T12.x * T12.x);\n T_tot.y = Math.sqrt(T12.y * T12.y);\n R_star.x = (T12.x * T12.x * R23.x) / (1.0 - R23.x * R12.x);\n R_star.y = (T12.y * T12.y * R23.y) / (1.0 - R23.y * R12.y);\n R_bi_sqr.x = R_bi.x * R_bi.x;\n R_bi_sqr.y = R_bi.y * R_bi.y;\n R_12_star.x = R12.x + R_star.x;\n R_12_star.y = R12.y + R_star.y;\n R_star_t_tot.x = R_star.x - T_tot.x;\n R_star_t_tot.y = R_star.y - T_tot.y;\n var x = 0, y = 0, z = 0;\n var totX = 0, totY = 0, totZ = 0;\n\n for (var j = 0; j < numBands; ++j) {\n var waveLen = 380 + j / (numBands - 1) * waveLenRange;\n var deltaPhase = pathDiff2PI / waveLen;\n\n var cosPhiX = Math.cos(deltaPhase + phi23.x + phi21.x);\n var cosPhiY = Math.cos(deltaPhase + phi23.y + phi21.y);\n var valX = R_12_star.x + 2.0 * (R_bi.x * cosPhiX - R_bi_sqr.x) / (1.0 - 2 * R_bi.x * cosPhiX + R_bi_sqr.x) * R_star_t_tot.x;\n var valY = R_12_star.y + 2.0 * (R_bi.y * cosPhiY - R_bi_sqr.y) / (1.0 - 2 * R_bi.y * cosPhiY + R_bi_sqr.y) * R_star_t_tot.y;\n var v = .5 * (valX + valY);\n\n var wx = xFit_1931(waveLen);\n var wy = yFit_1931(waveLen);\n var wz = zFit_1931(waveLen);\n\n totX += wx;\n totY += wy;\n totZ += wz;\n\n x += wx * v;\n y += wy * v;\n z += wz * v;\n }\n\n x /= totX;\n y /= totY;\n z /= totZ;\n\n var r = 3.2406 * x - 1.5372 * y - 0.4986 * z;\n var g = -0.9689 * x + 1.8758 * y + 0.0415 * z;\n var b = 0.0557 * x - 0.2040 * y + 1.0570 * z;\n\n r = MathUtils.clamp(r, 0.0, 1.0);\n g = MathUtils.clamp(g, 0.0, 1.0);\n b = MathUtils.clamp(b, 0.0, 1.0);\n\n // linear to gamma\n r = Math.pow(r, 0.7);\n g = Math.pow(g, 0.7);\n b = Math.pow(b, 0.7);\n\n // CIE XYZ to linear rgb conversion matrix:\n // 3.2406 -1.5372 -0.4986\n // -0.9689 1.8758 0.0415\n // 0.0557 -0.2040 1.0570\n\n var l = i * 4 + (k * size) * 4;\n data[l] = Math.floor(r * 0xff);\n data[l + 1] = Math.floor(g * 0xff);\n data[l + 2] = Math.floor(b * 0xff);\n data[l + 3] = 0xff;\n }\n }\n\n this.needsUpdate = true;\n };\n}\n\nexport { ThinFilmFresnelMap };","export class DiceTour extends Tour {\n //This class overcharge the \"step\" data structure with the following properties:\n // - action: \"click\" or \"scrollTo\"\n // - target: CSS selector of the element to use for the action. If not set, the selector is used for the action\n\n /**\n * Wait for an element to exists in the DOM then resolves the promise\n * @param {string} selector CSS selector of the element to wait for\n * @returns {Promise<void>}\n */\n async waitForElement(selector) {\n return new Promise((resolve, reject) => {\n let element = document.querySelector(selector);\n if (element) {\n resolve();\n return;\n }\n\n const observer = new MutationObserver((mutations, observer) => {\n document.querySelectorAll(selector).forEach((el) => {\n resolve(el);\n observer.disconnect();\n });\n })\n\n observer.observe(document.body, {\n childList: true,\n subtree: true\n });\n });\n }\n\n async _preStep() {\n await super._preStep();\n await this.waitForElement(this.currentStep.selector);\n }\n\n async _postStep() {\n await super._postStep();\n if (this.stepIndex < 0 || !this.hasNext)\n return;\n\n if (!this.currentStep.action)\n return;\n\n if(this.triggerReset) {\n this.triggerReset = false;\n return;\n }\n let target = this.currentStep.target ? this.currentStep.target : this.currentStep.selector;\n switch (this.currentStep.action) {\n case \"click\":\n document.querySelector(target).click();\n break;\n case \"scrollTo\":\n document.querySelector(target).scrollIntoView({ block: \"start\", inline: \"nearest\" });\n break;\n }\n }\n\n /**\n * Detect when a reset is triggered and stop the actions in _postStep\n */\n async reset() {\n if(this.status != \"completed\")\n this.triggerReset = true;\n await super.reset();\n }\n}","import { DiceTour } from \"./DiceTour.js\";\n\nexport class DiceTourMain extends DiceTour {\n constructor() {\n super({\n title: \"How to use Dice So Nice!\",\n description: \"Learn how to customize your 3D dice in this short tour of the module\",\n canBeResumed: false,\n display: true,\n steps: [\n {\n id: \"goto-settings\",\n selector: \"[data-tab=\\\"settings\\\"]\",\n title: game.i18n.localize(\"DICESONICE.TourMainTitleGotoSettings\"),\n content: game.i18n.localize(\"DICESONICE.TourMainContentGotoSettings\"),\n action: \"click\"\n },\n {\n id: \"goto-configure\",\n selector: \"[data-action=\\\"configure\\\"]\",\n title: game.i18n.localize(\"DICESONICE.TourMainTitleGotoConfigure\"),\n content: game.i18n.localize(\"DICESONICE.TourMainContentGotoConfigure\"),\n action: \"click\"\n },\n {\n id: \"goto-modulessettings\",\n title: game.i18n.localize(\"DICESONICE.TourMainTitleGotoModulesSettings\"),\n selector: \".category-filter [data-category=\\\"dice-so-nice\\\"]\",\n content: game.i18n.localize(\"DICESONICE.TourMainContentGotoModulesSettings\"),\n action: \"click\"\n },\n {\n id: \"goto-dicesonice\",\n title: game.i18n.localize(\"DICESONICE.TourMainTitleGotoDiceSoNice\"),\n selector: \"#client-settings form.categories div.scrollable\",\n content: game.i18n.localize(\"DICESONICE.TourMainContentGotoDiceSoNice\"),\n },\n {\n id: \"goto-dicesonice-settings\",\n title: game.i18n.localize(\"DICESONICE.TourMainTitleGotoDiceSoNiceSettings\"),\n selector: \"[data-key=\\\"dice-so-nice.dice-so-nice\\\"]\",\n content: game.i18n.localize(\"DICESONICE.TourMainContentGotoDiceSoNiceSettings\"),\n action: \"click\"\n },\n {\n id: \"show-3d-dice\",\n title: game.i18n.localize(\"DICESONICE.TourMainTitleShow3DDice\"),\n selector: \"#dice-configuration-canvas\",\n content: game.i18n.localize(\"DICESONICE.TourMainContentShow3DDice\")\n },\n {\n id: \"show-appearance\",\n title: game.i18n.localize(\"DICESONICE.TourMainTitleShowAppearance\"),\n selector: \"#dsn-appearance-content\",\n content: game.i18n.localize(\"DICESONICE.TourMainContentShowAppearance\"),\n action: \"click\",\n target: \".dice-so-nice a[data-tab=\\\"preferences\\\"]\"\n },\n {\n id:\"show-preferences\",\n title: game.i18n.localize(\"DICESONICE.TourMainTitleShowPreferences\"),\n selector: \".dice-so-nice div.tab.active[data-tab=\\\"preferences\\\"]\",\n content: game.i18n.localize(\"DICESONICE.TourMainContentShowPreferences\"),\n action: \"click\",\n target: \".dice-so-nice a[data-tab=\\\"sfx\\\"]\"\n },\n {\n id: \"show-sfx\",\n title: game.i18n.localize(\"DICESONICE.TourMainTitleShowSFX\"),\n selector: \".dice-so-nice div.tab.active[data-tab=\\\"sfx\\\"]\",\n content: game.i18n.localize(\"DICESONICE.TourMainContentShowSFX\"),\n action: \"click\",\n target: \".dice-so-nice a[data-tab=\\\"performance\\\"]\"\n },\n {\n id: \"show-performance\",\n title: game.i18n.localize(\"DICESONICE.TourMainTitleShowPerformance\"),\n selector: \".dice-so-nice div.tab.active[data-tab=\\\"performance\\\"]\",\n content: game.i18n.localize(\"DICESONICE.TourMainContentShowPerformance\"),\n action: \"click\",\n target: \".dice-so-nice a[data-tab=\\\"backup\\\"]\"\n },\n {\n id: \"show-backup\",\n title: game.i18n.localize(\"DICESONICE.TourMainTitleShowBackup\"),\n selector: \".dice-so-nice div.tab.active[data-tab=\\\"backup\\\"]\",\n content: game.i18n.localize(\"DICESONICE.TourMainContentShowBackup\")\n },\n {\n id: \"end-tour\",\n title: game.i18n.localize(\"DICESONICE.TourMainTitleEndTour\"),\n selector: \".dice-so-nice div.tab.active[data-tab=\\\"backup\\\"]\",\n content: game.i18n.localize(\"DICESONICE.TourMainContentEndTour\")\n }\n ]\n });\n }\n /**\n * Override the DiceTour _preStep method to wait for the element to exists in the DOM\n */\n async _preStep() {\n switch (this.currentStep.id) {\n case \"goto-settings\":\n //start on the chat tab\n document.querySelector('a[data-tab=\"chat\"]').click();\n break;\n case \"goto-dicesonice\":\n //There is no native selector available for this step so we add something to identify the element with jQuery\n $(\"[data-tab=\\\"modules\\\"] h2:contains('Dice So Nice!')\").addClass(\"dice-tour\");\n break;\n }\n\n await super._preStep();\n }\n\n async _postStep() {\n if(!this.currentStep)\n return;\n switch (this.currentStep.id) {\n case \"end-tour\":\n //end the tour with a bang\n document.querySelector('.dice-so-nice button[data-test]').click();\n break;\n }\n await super._postStep();\n }\n}","import { DiceFactory } from './DiceFactory.js';\nimport { DiceBox } from './DiceBox.js';\nimport { DiceColors, TEXTURELIST, COLORSETS } from './DiceColors.js';\nimport { DiceNotation } from './DiceNotation.js';\nimport { DiceSFXManager } from './DiceSFXManager.js';\nimport { Accumulator } from './Accumulator.js';\nimport { Utils } from './Utils.js';\nimport { ThinFilmFresnelMap } from './libs/ThinFilmFresnelMap.js';\nimport { TextureLoader } from 'three';\nimport { DiceTourMain } from './tours/DiceTourMain.js';\n/**\n * Main class to handle 3D Dice animations.\n */\nexport class Dice3D {\n\n static get DEFAULT_OPTIONS() {\n const quality = {};\n switch(game.settings.get(\"core\", \"performanceMode\")) {\n case 0:\n quality.bumpMapping = false;\n quality.shadowQuality = \"low\";\n quality.glow = false;\n quality.antialiasing = \"none\";\n quality.useHighDPI = false;\n quality.imageQuality = \"low\";\n break;\n case 1:\n quality.bumpMapping = true;\n quality.shadowQuality = \"low\";\n quality.glow = false;\n quality.antialiasing = \"none\";\n quality.useHighDPI = false;\n quality.imageQuality = \"medium\";\n break;\n case 2:\n case 3:\n quality.bumpMapping = true;\n quality.shadowQuality = \"high\";\n quality.glow = true;\n quality.antialiasing = game.canvas.app.renderer.context.webGLVersion===2 ?\"msaa\":\"smaa\";\n quality.useHighDPI = true;\n quality.imageQuality = \"high\";\n break;\n }\n return {\n enabled: true,\n showExtraDice: game.dice3d && game.dice3d.hasOwnProperty(\"defaultShowExtraDice\") ? game.dice3d.defaultShowExtraDice : false,\n hideAfterRoll: true,\n timeBeforeHide: 2000,\n hideFX: 'fadeOut',\n autoscale: true,\n scale: 75,\n speed: 1,\n imageQuality: quality.imageQuality,\n shadowQuality: quality.shadowQuality,\n bumpMapping: quality.bumpMapping,\n sounds: true,\n soundsSurface: 'felt',\n soundsVolume: 0.5,\n canvasZIndex: 'over',\n throwingForce: 'medium',\n useHighDPI: quality.useHighDPI,\n antialiasing: quality.antialiasing,\n glow: quality.glow,\n showOthersSFX: true,\n immersiveDarkness: true,\n muteSoundSecretRolls: false,\n enableFlavorColorset: true,\n rollingArea: false\n };\n }\n\n static DEFAULT_APPEARANCE(user = game.user) {\n return {\n global: {\n labelColor: Utils.contrastOf(user.color),\n diceColor: user.color,\n outlineColor: user.color,\n edgeColor: user.color,\n texture: \"none\",\n material: \"auto\",\n font: \"auto\",\n colorset: \"custom\",\n system: \"standard\"\n }\n };\n }\n\n static ALL_DEFAULT_OPTIONS(user = game.user) {\n let options = mergeObject(Dice3D.DEFAULT_OPTIONS, { appearance: Dice3D.DEFAULT_APPEARANCE(user) }, { performDeletions: true });\n options.appearance.global.system = game.dice3d.DiceFactory.preferredSystem;\n options.appearance.global.colorset = game.dice3d.DiceFactory.preferredColorset;\n return options;\n }\n\n static CONFIG(user = game.user) {\n let userSettings = user.getFlag(\"dice-so-nice\", \"settings\") ? duplicate(user.getFlag(\"dice-so-nice\", \"settings\")) : null;\n let config = mergeObject(Dice3D.DEFAULT_OPTIONS, userSettings, { performDeletions: true });\n mergeObject(config, { \"-=appearance\": null, \"-=sfxLine\": null }, { performDeletions: true });\n return config;\n }\n\n static APPEARANCE(user = game.user) {\n let userAppearance = user.getFlag(\"dice-so-nice\", \"appearance\") ? duplicate(user.getFlag(\"dice-so-nice\", \"appearance\")) : null;\n let appearance = mergeObject(Dice3D.DEFAULT_APPEARANCE(user), userAppearance, { performDeletions: true });\n return mergeObject(appearance, { \"-=dimensions\": null }, { performDeletions: true });\n }\n\n static SFX(user = game.user) {\n let sfxArray;\n if (Dice3D.CONFIG().showOthersSFX || user.id == game.user.id)\n sfxArray = user.getFlag(\"dice-so-nice\", \"sfxList\") ? duplicate(user.getFlag(\"dice-so-nice\", \"sfxList\")) : [];\n else\n sfxArray = [];\n if (!Array.isArray(sfxArray)) {\n sfxArray = [];\n }\n return sfxArray;\n }\n\n /**\n * Get the full customizations settings for the _showAnimation method \n */\n static ALL_CUSTOMIZATION(user = game.user, dicefactory = null) {\n let specialEffects = Dice3D.SFX(user) || [];\n game.users.forEach((other) => {\n if (other.isGM && other.id != user.id) {\n let GMSFX = Dice3D.SFX(other);\n if (Array.isArray(GMSFX)) {\n GMSFX = GMSFX.filter(sfx => sfx.options && sfx.options.isGlobal);\n specialEffects = specialEffects.concat(GMSFX);\n }\n }\n });\n let config = mergeObject({ appearance: Dice3D.APPEARANCE(user) }, { specialEffects: specialEffects }, { performDeletions: true });\n if (dicefactory && !game.user.getFlag(\"dice-so-nice\", \"appearance\")) {\n if (dicefactory.preferredSystem != \"standard\")\n config.appearance.global.system = dicefactory.preferredSystem;\n if (dicefactory.preferredColorset != \"custom\")\n config.appearance.global.colorset = dicefactory.preferredColorset;\n }\n return config;\n }\n\n static ALL_CONFIG(user = game.user) {\n let ret = mergeObject(Dice3D.CONFIG(user), { appearance: Dice3D.APPEARANCE(user) }, { performDeletions: true });\n ret.specialEffects = Dice3D.SFX(user);\n return ret;\n }\n\n /**\n * Register a new system\n * The id is to be used with addDicePreset\n * The name can be a localized string\n * @param {Object} system {id, name}\n * @param {Boolean} mode \"default,preferred\". Default will add the system as a choice. Preferred will be enabled for all users unless they change their settings.\n */\n addSystem(system, mode = \"default\") {\n //retrocompatibility with API version < 3.1\n if (typeof mode == \"boolean\") {\n mode = mode ? \"preferred\" : \"default\";\n }\n\n this.DiceFactory.addSystem(system, mode);\n }\n\n /**\n * Register a new dice preset\n * Type should be a known dice type (d4,d6,d8,d10,d12,d14,d16,d20,d24,d30,d100)\n * Labels contains either strings (unicode) or a path to a texture (png, gif, jpg, webp)\n * The texture file size should be 256*256\n * The system should be a system id already registered\n * @param {Object} dice {type:\"\",labels:[],system:\"\"}\n */\n addDicePreset(dice, shape = null) {\n this.DiceFactory.addDicePreset(dice, shape);\n }\n\n /**\n * Add a texture to the list of textures and preload it\n * @param {String} textureID \n * @param {Object} textureData \n * @returns {Promise}\n */\n addTexture(textureID, textureData) {\n if (!textureData.bump)\n textureData.bump = '';\n return new Promise((resolve) => {\n let textureEntry = {};\n textureEntry[textureID] = textureData;\n TEXTURELIST[textureID] = textureData;\n DiceColors.loadTextures(textureEntry, (images) => {\n resolve();\n });\n });\n }\n\n /**\n * Add a colorset (theme)\n * @param {Object} colorset \n * @param {Object} mode = \"default\", \"preferred\"\n */\n async addColorset(colorset, mode = \"default\") {\n let defaultValues = {\n foreground: \"custom\",\n background: \"custom\",\n outline: \"\",\n edge: \"\",\n texture: \"custom\",\n material: \"custom\",\n font: \"custom\",\n visibility: \"visible\"\n }\n colorset = mergeObject(defaultValues, colorset, { performDeletions: true });\n COLORSETS[colorset.name] = colorset;\n DiceColors.initColorSets(colorset);\n\n if (colorset.font && !FontConfig.getAvailableFonts().includes(colorset.font)) {\n await FontConfig.loadFont(colorset.font, { editor: false, fonts: [] });\n }\n if (mode == \"preferred\")\n this.DiceFactory.preferredColorset = colorset.name;\n }\n\n /**\n * Add a new type if SFX trigger that can be customized by users.\n * This trigger can then be pulled by a system, a module or a macro\n * @param {String} id : Identifier of the trigger, ex: fate3df\n * @param {String} name : Localized name of the trigger, ex: Fate Roll\n * @param {Array(String)} results : Array of possible results for this trigger, ex: [\"-3\",\"3\",\"0\"]\n */\n addSFXTrigger(id, name, results) {\n if (DiceSFXManager.EXTRA_TRIGGER_RESULTS[id])\n return;\n DiceSFXManager.EXTRA_TRIGGER_TYPE.push({ id: id, name: name });\n DiceSFXManager.EXTRA_TRIGGER_RESULTS[id] = [];\n results.forEach((res) => {\n DiceSFXManager.EXTRA_TRIGGER_RESULTS[id].push({ id: res, name: res });\n });\n }\n\n /**\n * Load a save file by its name\n * @param {String} name \n * @returns {Promise}\n */\n async loadSaveFile(name) {\n if (game.user.getFlag(\"dice-so-nice\", \"saves\").hasOwnProperty(name))\n await Utils.actionLoadSave(name);\n }\n\n\n /**\n * Constructor. Create and initialize a new Dice3d.\n */\n constructor() {\n Hooks.call(\"diceSoNiceInit\", this);\n this.dice3dRenderers = {\n \"board\": null,\n \"showcase\": null\n };\n\n this.exports = {\n \"Utils\": Utils,\n \"DiceColors\": DiceColors,\n \"TEXTURELIST\": TEXTURELIST,\n \"COLORSETS\": COLORSETS\n };\n\n this.uniforms = {\n globalBloom: { value: 1 },\n bloomStrength: { value: 2.5 },\n bloomRadius: { value: 0.5 },\n bloomThreshold: { value: 0.03 },\n iridescenceLookUp: { value: new ThinFilmFresnelMap() },\n iridescenceNoise: { value: new TextureLoader().load(\"modules/dice-so-nice/textures/noise-thin-film.webp\") },\n boost: { value: 1.5 }\n };\n\n this.hiddenAnimationQueue = [];\n this.defaultShowExtraDice = Dice3D.DEFAULT_OPTIONS.showExtraDice;\n this._buildCanvas();\n this._initListeners();\n this._buildDiceBox();\n DiceColors.loadTextures(TEXTURELIST, async (images) => {\n DiceColors.initColorSets();\n\n Hooks.call(\"diceSoNiceReady\", this);\n await this.DiceFactory._loadFonts();\n await this.DiceFactory.preloadPresets();\n });\n DiceSFXManager.init();\n this._startQueueHandler();\n this._nextAnimationHandler();\n this._welcomeMessage();\n this._registerTours();\n }\n\n get canInteract() {\n return !this.box.running;\n }\n\n /**\n * Create and inject the dice box canvas resizing to the window total size.\n *\n * @private\n */\n _buildCanvas() {\n const config = Dice3D.CONFIG();\n const sidebarWidth = $('#sidebar').width();\n const sidebarOffset = sidebarWidth > window.innerWidth / 2 ? 0 : sidebarWidth;\n const area = config.rollingArea ? config.rollingArea : {\n left: 0,\n top: 0,\n width: window.innerWidth - sidebarOffset,\n height: window.innerHeight - 1\n };\n\n if(!config.enabled){\n area.width = 1;\n area.height = 1;\n }\n\n this.canvas = $(`<div id=\"dice-box-canvas\" style=\"position: absolute; left: ${area.left}px; top: ${area.top}px; pointer-events: none;\"></div>`);\n if (config.canvasZIndex === \"over\") {\n this.canvas.css(\"z-index\", 1000);\n this.canvas.appendTo($('body'));\n }\n else {\n $(\"#board\").after(this.canvas);\n }\n this.canvas.width(area.width + 'px');\n this.canvas.height(area.height + 'px');\n }\n\n /**\n * Build the dicebox.\n *\n * @private\n */\n _buildDiceBox() {\n this.DiceFactory = new DiceFactory();\n let config = Dice3D.ALL_CONFIG();\n config.boxType = \"board\";\n this.box = new DiceBox(this.canvas[0], this.DiceFactory, config);\n this.box.initialize();\n }\n\n /**\n * Init listeners on windows resize and on click if auto hide has been disabled within the settings.\n *\n * @private\n */\n _initListeners() {\n this._rtime;\n this._timeout = false;\n $(window).resize(() => {\n this._rtime = new Date();\n if (this._timeout === false) {\n this._timeout = true;\n setTimeout(this._resizeEnd.bind(this), 1000);\n }\n });\n\n $(document).on(\"click\", \".dice-so-nice-btn-settings\", (ev) => {\n ev.preventDefault();\n const menu = game.settings.menus.get(ev.currentTarget.dataset.key);\n const app = new menu.type();\n return app.render(true);\n });\n\n $(document).on(\"click\", \".dice-so-nice-btn-tour\", (ev) => {\n ev.preventDefault();\n game.tours.get(\"dice-so-nice.dice-so-nice-tour\").start();\n });\n\n game.socket.on('module.dice-so-nice', (request) => {\n switch (request.type) {\n case \"show\":\n if (!request.users || request.users.includes(game.user.id))\n this.show(request.data, game.users.get(request.user));\n break;\n case \"update\":\n if (request.user == game.user.id || Dice3D.CONFIG().showOthersSFX)\n DiceSFXManager.init();\n if (request.user != game.user.id) {\n this.DiceFactory.preloadPresets(false, request.user);\n }\n break;\n }\n });\n\n if (game.settings.get(\"dice-so-nice\", \"allowInteractivity\")) {\n $(document).on(\"mousemove.dicesonice\", \"body\", this._onMouseMove.bind(this));\n\n $(document).on(\"mousedown.dicesonice\", \"body\", this._onMouseDown.bind(this));\n\n $(document).on(\"mouseup.dicesonice\", \"body\", this._onMouseUp.bind(this));\n }\n }\n\n _mouseNDC(event) {\n let rect = this.canvas[0].getBoundingClientRect();\n let x = ((event.clientX - rect.left) / rect.width) * 2 - 1;\n if (x > 1)\n x = 1;\n let y = - ((event.clientY - rect.top) / rect.height) * 2 + 1;\n return { x: x, y: y };\n }\n\n _onMouseMove(event) {\n if (!this.canInteract)\n return;\n this.box.onMouseMove(event, this._mouseNDC(event));\n }\n\n _onMouseDown(event) {\n if (!this.canInteract)\n return;\n let hit = this.box.onMouseDown(event, this._mouseNDC(event));\n if (hit)\n this._beforeShow();\n else {\n const config = Dice3D.CONFIG();\n if (!config.hideAfterRoll && this.canvas.is(\":visible\") && !this.box.rolling) {\n this.canvas.hide();\n this.box.clearAll();\n }\n }\n\n }\n\n _onMouseUp(event) {\n if (!this.canInteract)\n return;\n let hit = this.box.onMouseUp(event);\n if (hit)\n this._afterShow();\n }\n\n _resizeEnd() {\n if (new Date() - this._rtime < 1000) {\n setTimeout(this._resizeEnd.bind(this), 1000);\n } else {\n this._timeout = false;\n //resize ended probably, lets remake the canvas\n this.resizeAndRebuild();\n }\n }\n\n resizeAndRebuild() {\n this.canvas[0].remove();\n this.box.clearScene();\n this._buildCanvas();\n let config = Dice3D.ALL_CONFIG();\n config.boxType = \"board\";\n this.box = new DiceBox(this.canvas[0], this.DiceFactory, config);\n this.box.initialize();\n this.box.preloadSounds();\n }\n\n /**\n * Start polling and watching te queue for animation requests.\n * Each request is resolved in sequence.\n *\n * @private\n */\n _startQueueHandler() {\n this.queue = [];\n setInterval(() => {\n if (this.queue.length > 0 && !this.box.rolling) {\n let animate = this.queue.shift();\n animate();\n }\n }, 100);\n }\n\n /**\n * Show a private message to new players\n */\n _welcomeMessage() {\n if (!game.user.getFlag(\"dice-so-nice\", \"welcomeMessageShown\")) {\n if (!game.user.getFlag(\"dice-so-nice\", \"appearance\")) {\n const content = [`\n <div class=\"dice-so-nice\">\n <h3 class=\"nue\">${game.i18n.localize(\"DICESONICE.WelcomeTitle\")}</h3>\n <p class=\"nue\">${game.i18n.localize(\"DICESONICE.WelcomeMessage1\")}</p>\n <p class=\"nue\">${game.i18n.localize(\"DICESONICE.WelcomeMessage2\")}</p>\n <p>\n <button type=\"button\" class=\"dice-so-nice-btn-settings\" data-key=\"dice-so-nice.dice-so-nice\">\n <i class=\"fas fa-dice-d20\"></i> ${game.i18n.localize(\"DICESONICE.configTitle\")}\n </button>\n </p>\n <p class=\"nue\">${game.i18n.localize(\"DICESONICE.WelcomeMessage3\")}</p>\n <p class=\"nue\">${game.i18n.localize(\"DICESONICE.WelcomeMessageTour\")}</p>\n <p>\n <button type=\"button\" class=\"dice-so-nice-btn-tour\" data-tour=\"dice-so-nice-tour\">\n <i class=\"fas fa-hiking\"></i> ${game.i18n.localize(\"DICESONICE.WelcomeMessageTourBtn\")}\n </button>\n </p>\n <p class=\"nue\">${game.i18n.localize(\"DICESONICE.WelcomeMessage4\")}</p>\n <footer class=\"nue\">${game.i18n.localize(\"NUE.FirstLaunchHint\")}</footer>\n </div>\n `];\n const chatData = content.map(c => {\n return {\n whisper: [game.user.id],\n speaker: { alias: \"Dice So Nice!\" },\n flags: { core: { canPopout: true } },\n content: c\n };\n });\n ChatMessage.implementation.createDocuments(chatData);\n }\n game.user.setFlag(\"dice-so-nice\", \"welcomeMessageShown\", true);\n }\n }\n\n /**\n * Register the tours to the Tour Manager\n */\n _registerTours() {\n game.tours.register(\"dice-so-nice\", \"dice-so-nice-tour\", new DiceTourMain());\n }\n\n /**\n * Check if 3D simulation is enabled from the settings.\n */\n isEnabled() {\n let combatEnabled = (!game.combat || !game.combat.started) || (game.combat && game.combat.started && !game.settings.get(\"dice-so-nice\", \"disabledDuringCombat\"));\n return Dice3D.CONFIG().enabled && combatEnabled;\n }\n\n /**\n * Update the DiceBox with fresh new settgins.\n *\n * @param settings\n */\n update(settings) {\n this.box.update(settings);\n }\n\n /**\n * Parse, sort and add the dice animation to the queue for a chat message and an array of Roll\n * Used internally by the message Hooks. Not meant to be used outside of the module.\n * Please use the showForRoll method instead.\n * @param {ChatMessage} chatMessage \n * @param {Array<Roll>} rolls \n */\n renderRolls(chatMessage, rolls) {\n const showMessage = () => {\n delete chatMessage._dice3danimating;\n\n window.ui.chat.element.find(`.message[data-message-id=\"${chatMessage.id}\"]`).removeClass(\"dsn-hide\").find(\".dice-roll\").removeClass(\"dsn-hide\");\n if (window.ui.sidebar.popouts.chat)\n window.ui.sidebar.popouts.chat.element.find(`.message[data-message-id=\"${chatMessage.id}\"]`).removeClass(\"dsn-hide\").find(\".dice-roll\").removeClass(\"dsn-hide\");\n\n Hooks.callAll(\"diceSoNiceRollComplete\", chatMessage.id);\n\n window.ui.chat.scrollBottom({ popout: true });\n }\n\n if (game.view == \"stream\" && !game.modules.get(\"0streamutils\")?.active) {\n setTimeout(showMessage, 2500, chatMessage);\n } else {\n //1- We create a list of all 3D rolls, ordered ASC\n //2- We create a Roll object with the correct formula and results\n //3- We queue the showForRoll calls and then show the message\n let orderedDiceList = [[]];\n rolls.forEach(roll => {\n roll.dice.forEach(diceTerm => {\n let index = 0;\n if (!game.settings.get(\"dice-so-nice\", \"enabledSimultaneousRollForMessage\") && diceTerm.options.hasOwnProperty(\"rollOrder\")) {\n index = diceTerm.options.rollOrder;\n if (orderedDiceList[index] == null) {\n orderedDiceList[index] = [];\n }\n }\n orderedDiceList[index].push(diceTerm);\n });\n });\n orderedDiceList = orderedDiceList.filter(el => el != null);\n\n let rollList = [];\n const plus = new OperatorTerm({ operator: \"+\" }).evaluate();\n orderedDiceList.forEach(dice => {\n //add a \"plus\" between each term\n if (Array.isArray(dice) && dice.length) {\n let termList = [...dice].map((e, i) => i < dice.length - 1 ? [e, plus] : [e]).reduce((a, b) => a.concat(b));\n //We use the Roll class registered in the CONFIG constant in case the system overwrites it (eg: HeXXen)\n rollList.push(CONFIG.Dice.rolls[0].fromTerms(termList));\n }\n });\n\n //call each promise one after the other, then call the showMessage function\n const recursShowForRoll = (rollList, index) => {\n this.showForRoll(rollList[index], chatMessage.user, false, null, false, chatMessage.id, chatMessage.speaker).then(() => {\n index++;\n if (rollList[index] != null)\n recursShowForRoll(rollList, index);\n else\n showMessage();\n });\n };\n\n recursShowForRoll(rollList, 0);\n }\n }\n\n /**\n * Show the 3D Dice animation for the Roll made by the User.\n *\n * @param roll an instance of Roll class to show 3D dice animation.\n * @param user the user who made the roll (game.user by default).\n * @param synchronize if the animation needs to be sent and played for each players (true/false).\n * @param users list of users or userId who can see the roll, leave it empty if everyone can see.\n * @param blind if the roll is blind for the current user\n * @param messageID ChatMessage related to this roll (default: null)\n * @param speaker Object based on the ChatSpeakerData data schema related to this roll. Useful to fully support DsN settings like \"hide npc rolls\". (Default: null)\n * @returns {Promise<boolean>} when resolved true if the animation was displayed, false if not.\n */\n showForRoll(roll, user = game.user, synchronize, users = null, blind, messageID = null, speaker = null) {\n let context = {\n roll: roll,\n user: user,\n users: users,\n blind: blind\n };\n if (speaker) {\n let actor = game.actors.get(speaker.actor);\n const isNpc = actor ? actor.type === 'npc' : false;\n if (isNpc && game.settings.get(\"dice-so-nice\", \"hideNpcRolls\")) {\n return Promise.resolve(false);\n }\n }\n let chatMessage = game.messages.get(messageID);\n if (chatMessage) {\n if (chatMessage.whisper.length > 0)\n context.roll.secret = true;\n if (!chatMessage.isContentVisible)\n context.roll.ghost = true;\n }\n\n\n Hooks.callAll(\"diceSoNiceRollStart\", messageID, context);\n //We allow the hook to modify the roll to be shown without altering the original roll reference\n //This is useful for example to show a different roll than the one made by the user without relying on the manual showForRoll method\n let hookedRoll = context.dsnRoll || context.roll;\n let notation = new DiceNotation(hookedRoll, Dice3D.ALL_CONFIG(user));\n return this.show(notation, context.user, synchronize, context.users, context.blind);\n }\n\n /**\n * Show the 3D Dice animation based on data configuration made by the User.\n *\n * @param data data containing the dice info.\n * @param user the user who made the roll (game.user by default).\n * @param synchronize\n * @param users list of users or userId who can see the roll, leave it empty if everyone can see.\n * @param blind if the roll is blind for the current user\n * @returns {Promise<boolean>} when resolved true if the animation was displayed, false if not.\n */\n show(data, user = game.user, synchronize = false, users = null, blind) {\n return new Promise((resolve, reject) => {\n\n if (!data.throws) throw new Error(\"Roll data should be not null\");\n\n if (!data.throws.length || !this.isEnabled()) {\n resolve(false);\n } else {\n\n if (synchronize) {\n users = users && users.length > 0 ? (users[0]?.id ? users.map(user => user.id) : users) : users;\n game.socket.emit(\"module.dice-so-nice\", { type: \"show\", data: data, user: user.id, users: users });\n }\n\n if (!blind) {\n if (document.hidden) {\n this.hiddenAnimationQueue.push({\n data: data,\n config: Dice3D.ALL_CUSTOMIZATION(user, this.DiceFactory),\n timestamp: (new Date()).getTime(),\n resolve: resolve\n });\n } else {\n this._showAnimation(data, Dice3D.ALL_CUSTOMIZATION(user, this.DiceFactory)).then(displayed => {\n resolve(displayed);\n });\n }\n } else {\n resolve(false);\n }\n }\n if (game.settings.get(\"dice-so-nice\", \"immediatelyDisplayChatMessages\")) {\n resolve();\n }\n });\n }\n\n /**\n * Change the default value of the showExtraDice settings\n * @param {Boolean} show \n */\n showExtraDiceByDefault(show = true) {\n this.defaultShowExtraDice = show;\n }\n\n /**\n * Helper function to detect the end of a 3D animation for a message\n * @param {ChatMessage.ID} targetMessageId \n * @returns Promise<boolean>\n */\n waitFor3DAnimationByMessageID(targetMessageId) {\n function buildHook(resolve) {\n Hooks.once('diceSoNiceRollComplete', (messageId) => {\n if (targetMessageId === messageId)\n resolve(true);\n else\n buildHook(resolve)\n });\n }\n return new Promise((resolve, reject) => {\n if (game.dice3d && Dice3D.CONFIG().enabled && !game.settings.get(\"dice-so-nice\", \"immediatelyDisplayChatMessages\")) {\n buildHook(resolve);\n } else {\n resolve(true);\n }\n });\n }\n\n\n /**\n *\n * @param formula\n * @param results\n * @param dsnConfig\n * @returns {Promise<boolean>}\n * @private\n */\n _showAnimation(notation, dsnConfig) {\n notation.dsnConfig = dsnConfig;\n return new Promise((resolve, reject) => {\n this.nextAnimation.addItem({\n params: notation,\n resolve: resolve\n });\n });\n }\n\n _nextAnimationHandler() {\n let timing = game.settings.get(\"dice-so-nice\", \"enabledSimultaneousRolls\") ? 400 : 0;\n this.nextAnimation = new Accumulator(timing, (items) => {\n let commands = DiceNotation.mergeQueuedRollCommands(items);\n if (this.isEnabled() && this.queue.length < 10) {\n let count = commands.length;\n commands.forEach(aThrow => {\n this.queue.push(() => {\n this._beforeShow();\n this.box.start_throw(aThrow, () => {\n if (!--count) {\n for (let item of items)\n item.resolve(true);\n this._afterShow();\n }\n }\n );\n });\n });\n } else {\n for (let item of items)\n item.resolve(false);\n }\n });\n }\n\n /**\n *\n * @private\n */\n _beforeShow() {\n if (this.timeoutHandle) {\n clearTimeout(this.timeoutHandle);\n }\n this.canvas.stop(true);\n this.canvas.show();\n }\n\n /**\n *\n * @private\n */\n _afterShow() {\n if (Dice3D.CONFIG().hideAfterRoll) {\n if (DiceSFXManager.renderQueue.length) {\n clearTimeout(this.timeoutHandle);\n return;\n } else {\n this.timeoutHandle = setTimeout(() => {\n if (!this.box.rolling) {\n if (Dice3D.CONFIG().hideFX === 'none') {\n this.canvas.hide();\n this.box.clearAll();\n }\n if (Dice3D.CONFIG().hideFX === 'fadeOut') {\n this.canvas.fadeOut({\n duration: 1000,\n complete: () => {\n this.box.clearAll();\n },\n fail: () => {\n this.canvas.fadeIn(0);\n }\n });\n }\n }\n }, Dice3D.CONFIG().timeBeforeHide);\n }\n }\n }\n}","import { Dice3D } from './Dice3D.js';\nimport { DiceBox } from './DiceBox.js';\nimport { DiceSFXManager } from './DiceSFXManager.js';\nimport { Utils } from './Utils.js';\nimport { DiceNotation } from './DiceNotation.js';\nimport { DiceColors, DICE_SCALE } from './DiceColors.js';\n/**\n * Form application to configure settings of the 3D Dice.\n */\nexport class DiceConfig extends FormApplication {\n\n static get defaultOptions() {\n return mergeObject(super.defaultOptions, {\n title: game.i18n.localize(\"DICESONICE.configTitle\"),\n id: \"dice-config\",\n template: \"modules/dice-so-nice/templates/dice-config.html\",\n width: 650,\n height: \"auto\",\n closeOnSubmit: true,\n tabs: [\n { navSelector: \".tabs\", contentSelector: \"#config-tabs\", initial: \"general\" },\n { navSelector: \".dsn-appearance-tabs\", contentSelector: \"#dsn-appearance-content\", initial: \"global\" }\n ]\n })\n }\n\n async getData(options) {\n let data = mergeObject({\n fxList: Utils.localize({\n \"none\": \"DICESONICE.None\",\n \"fadeOut\": \"DICESONICE.FadeOut\"\n }),\n speedList: Utils.localize({\n \"1\": \"DICESONICE.NormalSpeed\",\n \"2\": \"DICESONICE.2xSpeed\",\n \"3\": \"DICESONICE.3xSpeed\"\n }),\n textureList: Utils.prepareTextureList(),\n materialList: Utils.localize({\n \"auto\": \"DICESONICE.MaterialAuto\",\n \"chrome\": \"DICESONICE.MaterialChrome\",\n \"glass\": \"DICESONICE.MaterialGlass\",\n \"iridescent\": \"DICESONICE.MaterialIridescent\",\n \"metal\": \"DICESONICE.MaterialMetal\",\n \"plastic\": \"DICESONICE.MaterialPlastic\",\n \"pristine\": \"DICESONICE.MaterialPristine\",\n \"stone\": \"DICESONICE.MaterialStone\",\n \"wood\": \"DICESONICE.MaterialWood\"\n }),\n fontList: Utils.prepareFontList(),\n colorsetList: Utils.prepareColorsetList(),\n imageQualityList: Utils.localize({\n \"low\": \"DICESONICE.Low\",\n \"medium\": \"DICESONICE.Medium\",\n \"high\": \"DICESONICE.High\",\n \"custom\": \"DICESONICE.Custom\"\n }),\n shadowQualityList: Utils.localize({\n \"none\": \"DICESONICE.None\",\n \"low\": \"DICESONICE.Low\",\n \"high\": \"DICESONICE.High\"\n }),\n antialiasingList: Utils.localize({\n \"none\": \"DICESONICE.None\",\n \"smaa\": \"DICESONICE.SMAA\",\n \"msaa\": \"DICESONICE.MSAA\"\n }),\n systemList: Utils.prepareSystemList(),\n soundsSurfaceList: Utils.localize({\n \"felt\": \"DICESONICE.SurfaceFelt\",\n \"wood_table\": \"DICESONICE.SurfaceWoodTable\",\n \"wood_tray\": \"DICESONICE.SurfaceWoodTray\",\n \"metal\": \"DICESONICE.SurfaceMetal\"\n }),\n canvasZIndexList: Utils.localize({\n \"over\": \"DICESONICE.CanvasZIndexOver\",\n \"under\": \"DICESONICE.CanvasZIndexUnder\",\n }),\n throwingForceList: Utils.localize({\n \"weak\": \"DICESONICE.ThrowingForceWeak\",\n \"medium\": \"DICESONICE.ThrowingForceMedium\",\n \"strong\": \"DICESONICE.ThrowingForceStrong\"\n })\n },\n this.reset ? Dice3D.ALL_DEFAULT_OPTIONS() : Dice3D.ALL_CONFIG()\n );\n delete data.sfxLine;\n\n //remove MSAA if not supported\n if (game.canvas.app.renderer.context.webGLVersion<2){\n delete data.antialiasingList.msaa;\n }\n\n //fix corupted save from #139\n if (data.specialEffects) {\n for (let [key, value] of Object.entries(data.specialEffects)) {\n if (Array.isArray(value.diceType) || Array.isArray(value.onResult) || Array.isArray(value.specialEffect))\n delete data.specialEffects[key];\n }\n }\n\n this.canvas = $('<div id=\"dice-configuration-canvas\"></div>')[0];\n let config = mergeObject(\n this.reset ? Dice3D.ALL_DEFAULT_OPTIONS() : Dice3D.ALL_CONFIG(),\n { dimensions: { w: 634, h: 245 }, autoscale: false, scale: 60, boxType: \"showcase\" }\n );\n\n this.box = new DiceBox(this.canvas, game.dice3d.box.dicefactory, config);\n await this.box.initialize();\n if (!game.user.getFlag(\"dice-so-nice\", \"appearance\")) {\n if (this.box.dicefactory.preferredSystem != \"standard\")\n config.appearance.global.system = this.box.dicefactory.preferredSystem;\n if (this.box.dicefactory.preferredColorset != \"standard\")\n config.appearance.global.colorset = this.box.dicefactory.preferredColorset;\n }\n this.box.showcase(config);\n\n this.navOrder = {};\n let triggerTypeList = [{ id: \"\", name: \"\" }];\n this.possibleResultList = {};\n let i = 0;\n this.box.diceList.forEach((el) => {\n this.navOrder[el.userData] = i++;\n triggerTypeList.push({ id: el.userData, name: el.userData });\n this.possibleResultList[el.userData] = [];\n let preset = this.box.dicefactory.systems.standard.dice.find(dice => dice.type == el.userData);\n let termClass = Object.values(CONFIG.Dice.terms).find(term => term.name == preset.term) || Die;\n let term = new termClass({});\n\n if(el.userData == \"d100\"){\n for(let i = 1; i<=100;i++){\n let label = term.getResultLabel({ result: i });\n let option = { id: i + \"\", name: label };\n this.possibleResultList[el.userData].push(option);\n }\n } else {\n preset.values.forEach((value) => {\n let label = term.getResultLabel({ result: value });\n let option = { id: value + \"\", name: label };\n this.possibleResultList[el.userData].push(option);\n });\n }\n\n //add special triggers, like \"keep hihest\" (kh)\n this.possibleResultList[el.userData].push({id: \"kh\", name: \"Keep Highest\"});\n this.possibleResultList[el.userData].push({id: \"kl\", name: \"Keep Lowest\"});\n });\n\n let specialEffectsList = [];\n let specialEffectsPromises = [];\n let specialEffects = Dice3D.SFX();\n if (this.reset)\n specialEffects = [];\n this.triggerTypeList = [...triggerTypeList, ...DiceSFXManager.EXTRA_TRIGGER_TYPE];\n mergeObject(this.possibleResultList, DiceSFXManager.EXTRA_TRIGGER_RESULTS,{performDeletions:true});\n\n //Filter out the SFX that are not registered\n if (specialEffects) {\n let registeredTriggerTypes = this.triggerTypeList.map(trigger => trigger.id);\n specialEffects = specialEffects.filter(sfx => registeredTriggerTypes.includes(sfx.diceType));\n }\n\n if (specialEffects) {\n specialEffects.forEach((sfx, index) => {\n let sfxClass = DiceSFXManager.SFX_MODE_CLASS[sfx.specialEffect];\n let dialogContent = sfxClass.getDialogContent(sfx, index);\n let hdbsTemplate = Handlebars.compile(dialogContent.content);\n\n specialEffectsPromises.push(renderTemplate(\"modules/dice-so-nice/templates/partial-sfx.html\", {\n id: index,\n diceType: sfx.diceType,\n onResult: sfx.onResult,\n specialEffect: sfx.specialEffect,\n specialEffectsMode: DiceSFXManager.SFX_MODE_LIST,\n triggerTypeList: this.triggerTypeList,\n possibleResultList: this.possibleResultList[sfx.diceType],\n options: hdbsTemplate(dialogContent.data)\n }).then((html) => {\n specialEffectsList.push(html);\n }));\n });\n await Promise.all(specialEffectsPromises);\n }\n data.specialEffectsList = specialEffectsList.join(\"\");\n\n let tabsList = [];\n for (let scope in data.appearance) {\n if (data.appearance.hasOwnProperty(scope)) {\n tabsList.push(scope);\n if (scope != \"global\") {\n if (!data.appearance[scope].labelColor)\n data.appearance[scope].labelColor = data.appearance.global.labelColor;\n if (!data.appearance[scope].diceColor)\n data.appearance[scope].diceColor = data.appearance.global.diceColor;\n if (!data.appearance[scope].outlineColor)\n data.appearance[scope].outlineColor = data.appearance.global.outlineColor;\n if (!data.appearance[scope].edgeColor)\n data.appearance[scope].edgeColor = data.appearance.global.edgeColor;\n }\n }\n }\n\n let tabsAppearance = [];\n let tabsPromises = [];\n data.navAppearance = {};\n tabsList.forEach((diceType) => {\n tabsPromises.push(renderTemplate(\"modules/dice-so-nice/templates/partial-appearance.html\", {\n dicetype: diceType,\n appearance: data.appearance[diceType],\n systemList: data.systemList,\n colorsetList: data.colorsetList,\n textureList: data.textureList,\n materialList: data.materialList,\n fontList: data.fontList\n }).then((html) => {\n tabsAppearance.push(html);\n }));\n if (diceType != \"global\")\n data.navAppearance[diceType] = diceType.toUpperCase();\n });\n await Promise.all(tabsPromises);\n\n if (tabsAppearance.length > 1)\n data.displayHint = \"style='display:none;'\";\n else\n data.displayHint = '';\n\n data.tabsAppearance = tabsAppearance.join(\"\");\n this.lastActiveAppearanceTab = \"global\";\n\n this.initializationData = data;\n this.currentGlobalAppearance = data.appearance.global;\n this.sfxDialogList = [];\n\n const templateSelect2 = (result) => {\n\n if (result.element) {\n let label = this.possibleResultList[result.element.parentElement.dataset.sfxResultDicetype].find(el => el.id == result.text).name;\n if (label != result.text)\n return `${label} (${result.text})`;\n else\n return result.text;\n } else {\n return result.text;\n }\n };\n\n this.select2Options = {\n dropdownCssClass: \"dice-so-nice\",\n escapeMarkup: function (text) { return text; },\n dropdownParent: \"form.dice-so-nice\",\n templateResult: templateSelect2,\n templateSelection: templateSelect2,\n width: \"306px\"\n }\n\n return data;\n }\n\n activateListeners(html) {\n super.activateListeners(html);\n\n $(html).find(\"#dice-configuration-canvas-container\").append(this.canvas);\n\n\n this.toggleHideAfterRoll();\n this.toggleAutoScale();\n this.toggleCustomization();\n this.filterSystems();\n this.setPreferredOptions();\n\n select2dsn.call($(this.element).find(\"[data-sfx-result]\"), this.select2Options);\n\n if (!this.reset) {\n $(this.element).on(\"change\", \"[data-showExtraDice]\", (ev) => {\n this.onApply(ev);\n });\n\n $(this.element).on(\"change\", \"[data-hideAfterRoll]\", (ev) => {\n this.toggleHideAfterRoll(ev);\n });\n\n $(this.element).on(\"change\", \"[data-sounds]\", (ev) => {\n this.toggleSounds(ev);\n });\n\n $(this.element).on(\"change\", \"[data-autoscale]\", (ev) => {\n this.toggleAutoScale(ev);\n });\n\n $(this.element).on(\"change\", \"[data-colorset]\", (ev) => {\n this.toggleCustomColors($(ev.target).data(\"dicetype\"));\n });\n\n $(this.element).on(\"change\", \"[data-system]\", (ev) => {\n this.toggleCustomization($(ev.target).data(\"dicetype\"));\n });\n\n $(this.element).on(\"change\", \"input,select\", (ev) => {\n this.onApply(ev);\n });\n\n $(this.element).on(\"click\", \"[data-reset]\", (ev) => {\n this.onReset(ev);\n });\n\n $(this.element).on(\"click\", \"[data-cancel]\", (ev) => {\n this.close();\n });\n\n $(this.element).on(\"click\", \"[data-close-tab]\", (ev) => {\n let diceType = $(ev.target).parent().data(\"tab\");\n this.closeAppearanceTab(diceType);\n });\n\n $(this.element).on(\"click\", \"[data-test]\", (ev) => {\n let config = this.getShowcaseAppearance();\n let denominationList = [];\n this.box.diceList.forEach((el) => {\n //the d100 will roll the d10 so we remove the d10 from the list\n if (el.userData != \"d10\")\n denominationList.push(el.userData);\n });\n let roll = new Roll(denominationList.join(\"+\")).evaluate({async:true}).then((roll) =>{\n let data = new DiceNotation(roll);\n\n let specialEffects = this.getShowcaseSFX();\n let customization = mergeObject({ appearance: config.appearance }, { specialEffects: specialEffects },{performDeletions:true});\n\n game.dice3d._showAnimation(data, customization);\n });\n });\n\n $(this.element).on(\"click\", \"[data-sfx-create]\", (ev) => {\n let ID = $(this.element).find(\".sfx-line\").length;\n let firstSFX = Object.keys(DiceSFXManager.SFX_MODE_LIST)[0];\n let sfxClass = DiceSFXManager.SFX_MODE_CLASS[firstSFX];\n let dialogContent = sfxClass.getDialogContent({}, ID);\n let hdbsTemplate = Handlebars.compile(dialogContent.content);\n renderTemplate(\"modules/dice-so-nice/templates/partial-sfx.html\", {\n id: ID,\n diceType: \"\",\n onResult: [],\n specialEffect: \"\",\n specialEffectsMode: DiceSFXManager.SFX_MODE_LIST,\n triggerTypeList: this.triggerTypeList,\n possibleResultList: [],\n options: hdbsTemplate(dialogContent.data)\n }).then((html) => {\n $(this.element).find(\"#sfxs-list\").append(html);\n select2dsn.call($(\"[data-sfx-result]\"), this.select2Options);\n this.setPosition();\n });\n });\n\n $(this.element).on(\"click\", \"[data-sfx-delete]\", (ev) => {\n $(ev.target).parents(\".sfx-line\").remove();\n $(this.element).find(\".sfx-line\").each(function (index) {\n $(this).find(\"input, select\").each(function () {\n let name = $(this).attr(\"name\");\n $(this).attr(\"name\", name.replace(/(\\w+\\[)(\\d+)(\\]\\[\\w+\\])/, \"$1\" + index + \"$3\"));\n });\n });\n this.setPosition();\n });\n\n $(this.element).on(\"click\", \"[data-sfx-options]\", (ev) => {\n let sfxLineOptions = $(ev.target).parents(\".sfx-line\").find(\"[data-sfx-hidden-options]\");\n\n if (sfxLineOptions.length < 1)\n return;\n\n let d = new Dialog({\n title: game.i18n.localize(\"DICESONICE.Options\"),\n content: `<form autocomplete=\"off\" onsubmit=\"event.preventDefault();\"></form>`,\n buttons: {\n ok: {\n icon: '<i class=\"fas fa-check-circle\"></i>',\n label: 'OK'\n }\n },\n default: \"ok\",\n render: (html) => {\n sfxLineOptions.detach().appendTo($(html).find(\"form\"));\n },\n close: (html) => {\n $(html).find(\"[data-sfx-hidden-options]\").detach().appendTo($(ev.target).parents(\".sfx-line\").find(\".sfx-hidden\"));\n this.sfxDialogList = this.sfxDialogList.filter(dialog => dialog.appId != d.appId);\n }\n });\n d.render(true);\n this.sfxDialogList.push(d);\n });\n\n $(this.element).on(\"change\", \"[data-sfx-dicetype]\", (ev) => {\n let dicetype = $(ev.target).val();\n let optionHTML = $([]);\n if (dicetype != \"\") {\n this.possibleResultList[dicetype].forEach(opt => {\n let frag = $(\"<option></option>\");\n frag.html(opt.id);\n frag.attr(\"value\", opt.id);\n optionHTML = optionHTML.add(frag);\n });\n $(ev.target).parents(\".sfx-line\").find(\"[data-sfx-result]\").html(optionHTML).attr(\"data-sfx-result-dicetype\", dicetype).trigger(\"change\");\n } else {\n $(ev.target).parents(\".sfx-line\").find(\"[data-sfx-result]\").empty().trigger(\"change\");\n }\n });\n\n $(this.element).on(\"change\", \"[data-sfx-result]\", (ev) => {\n this.setPosition();\n });\n\n $(this.element).on(\"change\", \"[data-sfx-specialeffect]\", (ev) => {\n this.sfxDialogList.forEach((dialog) => {\n dialog.close();\n });\n this.sfxDialogList = [];\n let sfxLine = $(ev.target).parents(\".sfx-line\");\n\n let ID = sfxLine.prevAll(\".sfx-line\").length;\n let sfxClass = DiceSFXManager.SFX_MODE_CLASS[$(ev.target).val()];\n let dialogContent = sfxClass.getDialogContent({}, ID);\n let hdbsTemplate = Handlebars.compile(dialogContent.content);\n\n sfxLine.find(\".sfx-hidden [data-sfx-hidden-options]\").html(hdbsTemplate(dialogContent.data));\n for (let fp of sfxLine.find(\".sfx-hidden [data-sfx-hidden-options] button.file-picker\")) {\n fp.onclick = this._activateFilePicker.bind(this);\n }\n });\n\n /**\n * Save As\n */\n $(this.element).on(\"click\", \"[data-saveas]\", async (ev) => {\n let saves = game.user.getFlag(\"dice-so-nice\", \"saves\");\n let saveList = new Map();\n if (saves)\n saveList = new Map(Object.entries(saves));\n\n let dialogSaveAs = new Dialog({\n title: game.i18n.localize(\"DICESONICE.SaveAs\"),\n width: 550,\n content: await renderTemplate(\"modules/dice-so-nice/templates/dialog-saveas.html\",\n {\n saveList: saveList.keys()\n }),\n buttons: {},\n render: html => {\n if (saveList.size) {\n $(html).on(\"click\", \"[data-overwrite]\", (ev) => {\n let name = $(html).find(\"[data-save-list]\").val();\n this.actionSaveAs(name);\n dialogSaveAs.close();\n });\n\n $(html).on(\"click\", \"[data-delete]\", async (ev) => {\n let name = $(html).find(\"[data-save-list]\").val();\n await this.actionDeleteSave(name);\n saveList.delete(name);\n $(html).find(\"[data-save-list] option:selected\").remove();\n if (!saveList.size) {\n $(html).find(\"[data-overwrite]\").prop(\"disabled\", true);\n $(html).find(\"[data-delete]\").prop(\"disabled\", true);\n }\n });\n\n } else {\n $(html).find(\"[data-overwrite]\").prop(\"disabled\", true);\n $(html).find(\"[data-delete]\").prop(\"disabled\", true);\n }\n\n $(html).on(\"click\", \"[data-add-new]\", (ev) => {\n let name = $(html).find(\"[data-save-name]\").val();\n if (name) {\n if (saveList.has(name)) {\n ui.notifications.error(game.i18n.localize(\"DICESONICE.SaveAsErrorAlreadyExist\"));\n } else {\n this.actionSaveAs(name);\n dialogSaveAs.close();\n }\n }\n else\n ui.notifications.error(game.i18n.localize(\"DICESONICE.SaveAsErrorName\"));\n });\n }\n }, {\n width: 450,\n classes: [\"dice-so-nice\"]\n }).render(true);\n });\n\n /**\n * Load\n */\n $(this.element).on(\"click\", \"[data-load]\", async (ev) => {\n let saves = game.user.getFlag(\"dice-so-nice\", \"saves\");\n let saveList = [];\n if (saves)\n saveList = new Map(Object.entries(saves));\n\n new Dialog({\n title: game.i18n.localize(\"DICESONICE.Load\"),\n content: await renderTemplate(\"modules/dice-so-nice/templates/dialog-load.html\",\n {\n saveList: saveList.keys()\n }),\n buttons: {\n load: {\n icon: '<i class=\"fas fa-box-open\"></i>',\n label: game.i18n.localize(\"DICESONICE.Load\"),\n callback: async html => {\n let name = $(html).find(\"[data-save-list]\").val();\n await this.actionLoadSave(name);\n //Close Dice Settings\n this.close();\n }\n },\n no: {\n icon: '<i class=\"fas fa-ban\"></i>',\n label: game.i18n.localize(\"DICESONICE.Cancel\")\n }\n },\n render: html => {\n if (!saveList.size)\n $(html).find('[data-button=\"load\"]').prop(\"disabled\", true);\n },\n default: \"no\"\n }, {\n width: 550\n }).render(true);\n });\n\n\n /**\n * Import\n */\n $(this.element).on(\"click\", \"[data-import]\", async (ev) => {\n new Dialog({\n title: game.i18n.localize(\"DICESONICE.Import\"),\n content: await renderTemplate(\"modules/dice-so-nice/templates/dialog-import.html\"),\n buttons: {\n import: {\n icon: '<i class=\"fas fa-file-import\"></i>',\n label: game.i18n.localize(\"DICESONICE.Import\"),\n callback: html => {\n const form = html.find(\"form\")[0];\n if (!form.data.files.length) return ui.notifications.error(game.i18n.localize(\"DICESONICE.ImportNoFile\"));\n readTextFromFile(form.data.files[0]).then(async json => {\n await this.actionImportFromJSON(json);\n this.close();\n });\n }\n },\n no: {\n icon: '<i class=\"fas fa-ban\"></i>',\n label: \"Cancel\"\n }\n },\n default: \"import\"\n }, {\n width: 400\n }).render(true);\n });\n\n $(this.element).on(\"click\", \"[data-export]\", async (ev) => {\n const filename = `fvtt-dicesonice-${Date.now()}.json`;\n this.actionExportToJSON().then((json) => {\n saveDataToFile(json, \"text/json\", filename);\n });\n });\n\n $(this.element).on(\"click\", \"[data-exportSFX]\", async (ev) => {\n const filename = `fvtt-dicesonice-SFX-${Date.now()}.json`;\n this.actionExportSFXToJSON().then((json) => {\n saveDataToFile(json, \"text/json\", filename);\n });\n });\n\n $(this.element).on(\"click\", \"#dice-configuration-canvas\", (event) => {\n let rect = event.target.getBoundingClientRect();\n let x = ((event.clientX - rect.left) / rect.width) * 2 - 1;\n if (x > 1)\n x = 1;\n let y = - ((event.clientY - rect.top) / rect.height) * 2 + 1;\n let pos = { x: x, y: y };\n let dice = this.box.findShowcaseDie(pos);\n if (dice) {\n let diceType = this.box.findRootObject(dice.object).userData;\n if (!game.user.getFlag(\"dice-so-nice\", \"appearance\") && (this.box.dicefactory.preferredSystem != \"standard\" || this.box.dicefactory.preferredColorset != \"custom\"))\n this.getShowcaseAppearance();\n if ($(this.element).find(`.dsn-appearance-tabs [data-tab=\"${diceType}\"]`).length) {\n this.activateAppearanceTab(diceType);\n } else {\n $(this.element).find(\".dsn-appearance-hint\").hide();\n renderTemplate(\"modules/dice-so-nice/templates/partial-appearance.html\", {\n dicetype: diceType,\n appearance: this.currentGlobalAppearance,\n systemList: this.initializationData.systemList,\n colorsetList: this.initializationData.colorsetList,\n textureList: this.initializationData.textureList,\n materialList: this.initializationData.materialList,\n fontList: this.initializationData.fontList\n }).then((html) => {\n let tabName = diceType.toUpperCase();\n\n let insertBefore = null;\n //let's find where to insert the tab so it keeps the same order as the dice list\n $(this.element).find(\".dsn-appearance-tabs .item\").each((index, el) => {\n if (this.navOrder[$(el).data(\"tab\")] >= this.navOrder[diceType]) {\n insertBefore = $(el).data(\"tab\");\n return false;\n }\n });\n let htmlNavString = `<span class=\"item\" data-group=\"dsn-dice\" data-tab=\"${diceType}\">${tabName} <i class=\"fas fa-times\" data-close-tab></i></span>`;\n if (insertBefore) {\n $(html).insertBefore($(this.element).find(`.tabAppearance[data-tab=\"${insertBefore}\"]`));\n $(htmlNavString).insertBefore($(this.element).find(`.dsn-appearance-tabs .item[data-tab=\"${insertBefore}\"]`));\n } else {\n $(this.element).find(\"#dsn-appearance-content\").append(html);\n $(this.element).find(\".dsn-appearance-tabs\").append(htmlNavString);\n }\n this.activateAppearanceTab(diceType);\n this.toggleCustomization(diceType);\n this.filterSystems(diceType);\n });\n }\n }\n });\n\n $(this.element).on(\"change\", \"[data-imageQuality]\", (event) => {\n let quality = {\n bumpMapping: true,\n shadowQuality: \"high\",\n glow: true,\n antialiasing: game.canvas.app.renderer.context.webGLVersion===2 ?\"msaa\":\"smaa\",\n useHighDPI: true\n };\n switch(event.target.value) {\n case \"low\":\n quality.bumpMapping = false;\n quality.shadowQuality = \"low\";\n quality.glow = false;\n quality.antialiasing = \"none\";\n quality.useHighDPI = false;\n break;\n case \"medium\":\n quality.bumpMapping = true;\n quality.shadowQuality = \"low\";\n quality.glow = false;\n quality.antialiasing = \"none\";\n quality.useHighDPI = false;\n break;\n case \"high\":\n quality.bumpMapping = true;\n quality.shadowQuality = \"high\";\n quality.glow = true;\n quality.antialiasing = game.canvas.app.renderer.context.webGLVersion===2 ?\"msaa\":\"smaa\";\n quality.useHighDPI = true;\n break;\n }\n $(this.element).find(\"[data-bumpMapping]\").prop(\"checked\", quality.bumpMapping);\n $(this.element).find(\"[data-shadowQuality]\").val(quality.shadowQuality);\n $(this.element).find(\"[data-glow]\").prop(\"checked\", quality.glow);\n $(this.element).find(\"[data-antialiasing]\").val(quality.antialiasing);\n $(this.element).find(\"[data-useHighDPI]\").prop(\"checked\", quality.useHighDPI);\n });\n\n $(this.element).on(\"change\", \"[data-bumpMapping],[data-shadowQuality],[data-glow],[data-antialiasing],[data-useHighDPI]\", (event) => {\n $(this.element).find(\"[data-imageQuality]\").val(\"custom\");\n });\n }\n }\n\n async actionSaveAs(name) {\n await this.submit({\n preventClose: true,\n preventRender: true\n });\n\n Utils.actionSaveAs(name);\n }\n\n async actionDeleteSave(name) {\n await Utils.actionDeleteSave(name);\n }\n\n async actionLoadSave(name) {\n await Utils.actionLoadSave(name);\n }\n\n async actionExportToJSON() {\n\n //save current settings first\n await this.submit({\n preventClose: true,\n preventRender: true\n });\n let data = {\n appearance: game.user.getFlag(\"dice-so-nice\", \"appearance\"),\n sfxList: game.user.getFlag(\"dice-so-nice\", \"sfxList\"),\n settings: game.user.getFlag(\"dice-so-nice\", \"settings\")\n };\n\n return JSON.stringify(data, null, 2);\n }\n\n async actionExportSFXToJSON() {\n\n //save current settings first\n await this.submit({\n preventClose: true,\n preventRender: true\n });\n let data = {\n sfxList: game.user.getFlag(\"dice-so-nice\", \"sfxList\")\n };\n\n return JSON.stringify(data, null, 2);\n }\n\n async actionImportFromJSON(json) {\n let data = JSON.parse(json);\n\n if (data.appearance) {\n await game.user.unsetFlag(\"dice-so-nice\", \"appearance\");\n await game.user.setFlag(\"dice-so-nice\", \"appearance\", data.appearance);\n }\n if (data.sfxList) {\n await game.user.unsetFlag(\"dice-so-nice\", \"sfxList\");\n await game.user.setFlag(\"dice-so-nice\", \"sfxList\", data.sfxList);\n }\n if (data.settings) {\n await game.user.unsetFlag(\"dice-so-nice\", \"settings\");\n await game.user.setFlag(\"dice-so-nice\", \"settings\", data.settings);\n }\n }\n\n activateAppearanceTab(diceType) {\n let tabs = this._tabs[1];\n if (tabs.active != diceType)\n tabs.activate(diceType, { triggerCallback: true });\n }\n\n closeAppearanceTab(diceType) {\n if (diceType == \"global\")\n return;\n let tabs = this._tabs[1];\n if (this._tabs[1].active == diceType)\n tabs.activate(\"global\", { triggerCallback: true });\n\n $(this.element).find(`.tabAppearance[data-tab=\"${diceType}\"]`).remove();\n $(this.element).find(`.dsn-appearance-tabs [data-tab=\"${diceType}\"]`).remove();\n\n this.onApply();\n }\n\n _onChangeTab(event, tabs, active) {\n super._onChangeTab(event, tabs, active);\n if (tabs._contentSelector == \"#dsn-appearance-content\") {\n if (this.lastActiveAppearanceTab != \"global\") {\n let appearanceArray = [];\n $(this.element).find(`.tabAppearance[data-tab=\"global\"],.tabAppearance[data-tab=\"${this.lastActiveAppearanceTab}\"]`).each((index, element) => {\n let obj = {\n labelColor: $(element).find('[data-labelColor]').val(),\n diceColor: $(element).find('[data-diceColor]').val(),\n outlineColor: $(element).find('[data-outlineColor]').val(),\n edgeColor: $(element).find('[data-edgeColor]').val(),\n colorset: $(element).find('[data-colorset]').val(),\n texture: $(element).find('[data-texture]').val(),\n material: $(element).find('[data-material]').val(),\n font: $(element).find('[data-font]').val(),\n system: $(element).find('[data-system]').val(),\n };\n //disabled systems arent returned\n if (obj.system == null) {\n obj.system = this.currentGlobalAppearance.system;\n }\n appearanceArray.push(obj);\n });\n if (appearanceArray.length > 1) {\n let diff = diffObject(appearanceArray[0], appearanceArray[1]);\n if (isEmpty(diff)) {\n this.closeAppearanceTab(this.lastActiveAppearanceTab)\n }\n }\n }\n this.lastActiveAppearanceTab = active;\n }\n }\n\n toggleHideAfterRoll() {\n let hideAfterRoll = $(this.element).find('[data-hideAfterRoll]')[0].checked;\n $(this.element).find('[data-timeBeforeHide]').prop(\"disabled\", !hideAfterRoll);\n $(this.element).find('[data-hideFX]').prop(\"disabled\", !hideAfterRoll);\n }\n\n toggleSounds() {\n let sounds = $(this.element).find('[data-sounds]')[0].checked;\n $(this.element).find('[data-soundsSurface]').prop(\"disabled\", !sounds);\n $(this.element).find('[data-soundsVolume]').prop(\"disabled\", !sounds);\n //$('.sounds-range-value').css({ 'opacity': !sounds ? 0.4 : 1 });\n }\n\n toggleAutoScale() {\n let autoscale = $(this.element).find('[data-autoscale]')[0].checked;\n $(this.element).find('[data-scale]').prop(\"disabled\", autoscale);\n //$('.scale-range-value').css({ 'opacity': autoscale ? 0.4 : 1 });\n }\n\n toggleCustomColors(dicetype) {\n let scope = $(this.element).find(\".tabAppearance\");\n if (dicetype) {\n scope = scope.filter(`[data-tab=\"${dicetype}\"]`);\n }\n scope.each((index, element) => {\n let colorset = $(element).find('[data-colorset]');\n let disabled = colorset.val() !== 'custom' || colorset.prop(\"disabled\");\n $(element).find('[data-labelColor]').prop(\"disabled\", disabled);\n $(element).find('[data-diceColor]').prop(\"disabled\", disabled);\n $(element).find('[data-outlineColor]').prop(\"disabled\", disabled);\n $(element).find('[data-edgeColor]').prop(\"disabled\", disabled);\n $(element).find('[data-labelColorSelector]').prop(\"disabled\", disabled);\n $(element).find('[data-diceColorSelector]').prop(\"disabled\", disabled);\n $(element).find('[data-outlineColorSelector]').prop(\"disabled\", disabled);\n $(element).find('[data-edgeColorSelector]').prop(\"disabled\", disabled);\n });\n }\n\n toggleCustomization(diceType = null) {\n let container;\n if (diceType) {\n container = $(this.element).find(`.tabAppearance[data-tab=\"${diceType}\"]`);\n } else {\n container = $(this.element).find(`.tabAppearance`);\n }\n\n container.each((index, element) => {\n let diceType = $(element).data(\"tab\");\n if (diceType != \"global\") {\n let system = $(element).find('[data-system]').val();\n let customizationElements = $(element).find('[data-colorset],[data-texture],[data-material],[data-font]');\n if (system != \"standard\") {\n let diceobj = this.box.dicefactory.systems[system].dice.find(obj => obj.type == diceType);\n if (diceobj) {\n let colorsetData = {};\n if (diceobj.colorset) {\n colorsetData = DiceColors.getColorSet(diceobj.colorset);\n }\n customizationElements.each((index, el) => {\n let colorsetForce = false;\n if ($(el).is(\"[data-colorset]\") && !isEmpty(colorsetData))\n colorsetForce = true;\n else if ($(el).is(\"[data-texture]\") && !isEmpty(colorsetData) && colorsetData.texture != \"custom\")\n colorsetForce = true;\n else if ($(el).is(\"[data-material]\") && !isEmpty(colorsetData) && colorsetData.material != \"custom\")\n colorsetForce = true;\n else if ($(el).is(\"[data-font]\") && ((!isEmpty(colorsetData) && colorsetData.font != \"custom\") || diceobj.font))\n colorsetForce = true;\n $(el).prop(\"disabled\", diceobj.modelFile || colorsetForce);\n });\n }\n } else {\n customizationElements.prop(\"disabled\", false);\n }\n }\n });\n this.toggleCustomColors(diceType);\n }\n\n filterSystems(diceType = null) {\n let container;\n if (diceType) {\n container = $(this.element).find(`.tabAppearance[data-tab=\"${diceType}\"] [data-system]`);\n } else {\n container = $(this.element).find(`.tabAppearance [data-system]`);\n }\n container.each((index, element) => {\n let diceType = $(element).data(\"dicetype\");\n if (diceType != \"global\") {\n $(element).find(\"option\").each((indexOpt, elementOpt) => {\n let model = this.box.dicefactory.systems[\"standard\"].dice.find(obj => obj.type == diceType);\n if (!this.box.dicefactory.systems[$(elementOpt).val()].dice.find(obj => obj.type == diceType || (model && obj.shape == model.shape && obj.values.length == model.values.length)))\n $(elementOpt).attr(\"disabled\", \"disabled\");\n });\n }\n });\n }\n\n setPreferredOptions() {\n if (!game.user.getFlag(\"dice-so-nice\", \"appearance\")) {\n if (this.box.dicefactory.preferredSystem != \"standard\")\n $(this.element).find('.tabAppearance[data-tab=\"global\"] [data-system]').val(this.box.dicefactory.preferredSystem);\n if (this.box.dicefactory.preferredColorset != \"custom\")\n $(this.element).find('.tabAppearance[data-tab=\"global\"] [data-colorset]').val(this.box.dicefactory.preferredColorset);\n }\n }\n\n getShowcaseAppearance() {\n let config = {\n autoscale: false,\n scale: 60,\n shadowQuality: $('[data-shadowQuality]').val(),\n imageQuality: $('[data-imageQuality]').val(),\n antialiasing: $('[data-antialiasing]').val(),\n bumpMapping: $('[data-bumpMapping]').is(':checked'),\n glow: $('[data-glow]').is(':checked'),\n sounds: $('[data-sounds]').is(':checked'),\n throwingForce: $('[data-throwingForce]').val(),\n useHighDPI: $('[data-useHighDPI]').is(':checked'),\n showExtraDice: $('[data-showExtraDice]').is(':checked'),\n muteSoundSecretRolls: $('[data-muteSoundSecretRolls]').is(':checked'),\n enableFlavorColorset: $('[data-enableFlavorColorset]').is(':checked'),\n immersiveDarkness: $('[data-immersiveDarkness]').is(':checked'),\n appearance: {}\n };\n $(this.element).find('.tabAppearance').each((index, element) => {\n config.appearance[$(element).data(\"tab\")] = {\n labelColor: $(element).find('[data-labelColor]').val(),\n diceColor: $(element).find('[data-diceColor]').val(),\n outlineColor: $(element).find('[data-outlineColor]').val(),\n edgeColor: $(element).find('[data-edgeColor]').val(),\n colorset: $(element).find('[data-colorset]').val(),\n texture: $(element).find('[data-texture]').val(),\n material: $(element).find('[data-material]').val(),\n font: $(element).find('[data-font]').val(),\n system: $(element).find('[data-system]').val(),\n };\n });\n this.currentGlobalAppearance = config.appearance.global;\n return config;\n }\n\n //Not used because SFX aren't initialized. Keeping it here for later use.\n getShowcaseSFX() {\n let sfxList = [];\n\n $(this.element).find('.sfx-line').each((index, element) => {\n let sfx = {\n diceType: $(element).find('[data-sfx-dicetype]').val(),\n onResult: $(element).find('[data-sfx-result]').val(),\n specialEffect: $(element).find('[data-sfx-specialeffect]').val(),\n options: {}\n };\n $(element).find(\"[data-sfx-hidden-options]\").find(\"input,select\").each((i, el) => {\n let name = $(el).attr(\"name\").match(/.*\\[(.*)\\]$/)[1];\n if ($(el).attr(\"type\") == \"checkbox\")\n sfx.options[name] = $(el).prop(\"checked\");\n else\n sfx.options[name] = $(el).val();\n });\n if (sfx.diceType && sfx.onResult && sfx.specialEffect)\n sfxList.push(sfx);\n });\n return sfxList;\n }\n\n onApply(event = null) {\n if (event)\n event.preventDefault();\n\n setTimeout(() => {\n let config = this.getShowcaseAppearance();\n this.box.dicefactory.disposeCachedMaterials(\"showcase\");\n this.box.update(config).then(() => {\n this.box.showcase(config);\n });\n }, 100);\n }\n\n onReset() {\n this.reset = true;\n this.render();\n this._tabs[0].activate(\"general\");\n }\n\n parseInputs(data) {\n var ret = {};\n retloop:\n for (var input in data) {\n var val = data[input];\n\n var parts = input.split('[');\n var last = ret;\n\n for (var i in parts) {\n var part = parts[i];\n if (part.substr(-1) == ']') {\n part = part.substr(0, part.length - 1);\n }\n\n if (i == parts.length - 1) {\n last[part] = val;\n continue retloop;\n } else if (!last.hasOwnProperty(part)) {\n last[part] = {};\n }\n last = last[part];\n }\n }\n return ret;\n }\n\n async _updateObject(event, formData) {\n //Remove custom settings if custom isn't selected to prevent losing them in the user save\n formData = this.parseInputs(formData);\n let sfxLine = formData.sfxLine;\n if (sfxLine) {\n sfxLine = Object.values(sfxLine);\n //Remove empty lines\n for (let i = sfxLine.length - 1; i >= 0; i--) {\n //also prevent bug #217, unknown cause\n if (sfxLine[i].diceType == undefined || sfxLine[i].diceType == \"\" || sfxLine[i].onResult == \"\" || Array.isArray(sfxLine[i].diceType) || Array.isArray(sfxLine[i].specialEffect))\n sfxLine.splice(i, 1);\n }\n //Remove duplicate lines\n let dataArr = sfxLine.map(item => {\n return [JSON.stringify(item), item]\n });\n let mapArr = new Map(dataArr);\n\n sfxLine = [...mapArr.values()];\n\n delete formData.sfxLine;\n }\n\n for (let scope in formData.appearance) {\n if (formData.appearance.hasOwnProperty(scope)) {\n if (formData.appearance[scope].colorset != \"custom\") {\n delete formData.appearance[scope].labelColor;\n delete formData.appearance[scope].diceColor;\n delete formData.appearance[scope].outlineColor;\n delete formData.appearance[scope].edgeColor;\n }\n }\n }\n let currentSettings = Dice3D.CONFIG();\n\n //required\n await game.user.unsetFlag(\"dice-so-nice\", \"sfxList\");\n await game.user.unsetFlag(\"dice-so-nice\", \"appearance\");\n await game.user.unsetFlag(\"dice-so-nice\", \"settings\");\n\n\n let appearance = mergeObject(Dice3D.APPEARANCE(), formData.appearance, { insertKeys: true, insertValues: false, performDeletions:true});\n delete formData.appearance;\n let settings = mergeObject(Dice3D.CONFIG(), formData, { insertKeys: false, insertValues: false ,performDeletions:true});\n\n // preserve rollingArea config\n settings.rollingArea = currentSettings.rollingArea;\n\n await game.user.setFlag('dice-so-nice', 'settings', settings);\n await game.user.setFlag(\"dice-so-nice\", \"appearance\", appearance);\n await game.user.setFlag(\"dice-so-nice\", \"sfxList\", sfxLine);\n\n game.socket.emit(\"module.dice-so-nice\", { type: \"update\", user: game.user.id });\n DiceSFXManager.init();\n ui.notifications.info(game.i18n.localize(\"DICESONICE.saveMessage\"));\n\n let reloadRequiredIfChanged = [\"canvasZIndex\", \"bumpMapping\", \"useHighDPI\", \"glow\", \"antialiasing\", \"enabled\"];\n let reloadRequired = reloadRequiredIfChanged.some(setting => settings[setting] != currentSettings[setting]);\n\n if (reloadRequired) {\n window.location.reload();\n } else {\n game.dice3d.update(settings);\n }\n }\n\n close(options) {\n super.close(options);\n this.box.clearScene();\n this.box.dicefactory.disposeCachedMaterials(\"showcase\");\n }\n\n async _onSubmit(event, options) {\n this.sfxDialogList.forEach((dialog) => {\n dialog.close();\n });\n await super._onSubmit(event, options);\n }\n}","import {Dice3D} from \"./Dice3D.js\";\n\nexport class RollableAreaConfig extends FormApplication {\n\n static get defaultOptions() {\n return foundry.utils.mergeObject(super.defaultOptions, {\n title: game.i18n.localize(\"DICESONICE.RollableAreaConfigTitle\"),\n template: \"modules/dice-so-nice/templates/rollable-area-config.html\",\n width: 280,\n top: 70,\n left: window.innerWidth - 290\n });\n }\n\n render(force, context={}) {\n this.area = $(`\n <div class='dice-so-nice rollable-area'>\n <div class='resizers'>\n <div class='resizer nw'></div>\n <div class='resizer ne'></div>\n <div class='resizer sw'></div>\n <div class='resizer se'></div>\n <div class=\"info\">${game.i18n.localize(\"DICESONICE.RollableAreaText\")}</div> \n </div>\n </div>\n `);\n\n let rollingArea = Dice3D.CONFIG().rollingArea;\n if(!rollingArea) {\n const $diceBox = $(\"#dice-box-canvas\");\n rollingArea = {\n top: $diceBox.position().top,\n left: $diceBox.position().left,\n width: $diceBox.width(),\n height: $diceBox.height()\n }\n }\n console.log(rollingArea);\n this.area.appendTo($('body'));\n this.area.css(rollingArea);\n\n return super.render(force, context);\n }\n\n activateListeners(html) {\n super.activateListeners(html);\n html.find('button[name=\"restore\"]').click(this._onRestore.bind(this));\n\n let el = $(this.area).get(0);\n let resizing = false;\n this.area.mousedown(function(e) {\n let prevX = e.clientX;\n let prevY = e.clientY;\n\n window.addEventListener(\"mousemove\", onMouseMove);\n window.addEventListener(\"mouseup\", onMouseUp);\n\n function onMouseMove(e) {\n if (!resizing) {\n let newX = prevX - e.clientX;\n let newY = prevY - e.clientY;\n\n const rect = el.getBoundingClientRect();\n el.style.left = rect.left - newX + 'px';\n el.style.top = rect.top - newY + 'px';\n\n prevX = e.clientX;\n prevY = e.clientY;\n }\n }\n\n function onMouseUp() {\n window.removeEventListener(\"mousemove\", onMouseMove);\n window.removeEventListener(\"mouseup\", onMouseUp);\n }\n });\n\n const resizers = $(\".rollable-area > .resizers > .resizer\");\n for(let resizer of resizers) {\n $(resizer).mousedown(function (e) {\n resizing = true;\n let prevX = e.clientX;\n let prevY = e.clientY;\n\n window.addEventListener(\"mousemove\", onMouseMove);\n window.addEventListener(\"mouseup\", onMouseUp);\n\n function onMouseMove(e) {\n const rect = el.getBoundingClientRect();\n\n if(resizer.classList.contains(\"se\")) {\n el.style.width = rect.width - (prevX - e.clientX) + \"px\";\n el.style.height = rect.height - (prevY - e.clientY) + \"px\";\n }\n else if(resizer.classList.contains(\"sw\")) {\n el.style.width = rect.width + (prevX - e.clientX) + \"px\";\n el.style.height = rect.height - (prevY - e.clientY) + \"px\";\n el.style.left = rect.left - (prevX - e.clientX) + \"px\";\n }\n else if(resizer.classList.contains(\"ne\")) {\n el.style.width = rect.width - (prevX - e.clientX) + \"px\";\n el.style.height = rect.height + (prevY - e.clientY) + \"px\";\n el.style.top = rect.top - (prevY - e.clientY) + \"px\";\n }\n else {\n el.style.width = rect.width + (prevX - e.clientX) + \"px\";\n el.style.height = rect.height + (prevY - e.clientY) + \"px\";\n el.style.left = rect.left - (prevX - e.clientX) + \"px\";\n el.style.top = rect.top - (prevY - e.clientY) + \"px\";\n }\n\n prevX = e.clientX;\n prevY = e.clientY;\n }\n\n function onMouseUp() {\n window.removeEventListener(\"mousemove\", onMouseMove);\n window.removeEventListener(\"mouseup\", onMouseUp);\n resizing = false;\n }\n });\n }\n }\n\n async _onRestore() {\n await this.saveSettingsAndRebuild(false);\n await this.close();\n }\n\n async _updateObject() {\n await this.saveSettingsAndRebuild({\n top: this.area.position().top,\n left: this.area.position().left,\n width: this.area.width(),\n height: this.area.height()\n });\n }\n\n async saveSettingsAndRebuild(rollingArea) {\n let settings = mergeObject(Dice3D.CONFIG(), {\n rollingArea: rollingArea\n },{performDeletions:true});\n await game.user.setFlag('dice-so-nice', 'settings', settings);\n game.dice3d.resizeAndRebuild();\n }\n\n async close(options={}) {\n this.area.remove();\n return super.close(options);\n }\n}","import { Dice3D } from './Dice3D.js';\nimport { DiceConfig } from './DiceConfig.js';\nimport { RollableAreaConfig } from './RollableAreaConfig.js';\nimport { Utils } from './Utils.js';\n\n/**\n * Registers the exposed settings for the various 3D dice options.\n */\nHooks.once('init', () => {\n const debouncedReload = foundry.utils.debounce(() => {\n window.location.reload();\n }, 100);\n game.settings.registerMenu(\"dice-so-nice\", \"dice-so-nice\", {\n name: \"DICESONICE.config\",\n label: \"DICESONICE.configTitle\",\n hint: \"DICESONICE.configHint\",\n icon: \"fas fa-dice-d20\",\n type: DiceConfig,\n restricted: false\n });\n\n game.settings.registerMenu(\"dice-so-nice\", \"rollable-area\", {\n name: \"DICESONICE.RollableAreaConfig\",\n label: \"DICESONICE.RollableAreaConfigTitle\",\n hint: \"DICESONICE.RollableAreaConfigHint\",\n icon: \"fas fa-crop-alt\",\n type: RollableAreaConfig,\n restricted: false\n });\n\n //Not used anymore but kept for compatibility with migration\n game.settings.register(\"dice-so-nice\", \"settings\", {\n name: \"3D Dice Settings\",\n scope: \"client\",\n default: {},\n type: Object,\n config: false\n });\n\n game.settings.register(\"dice-so-nice\", \"maxDiceNumber\", {\n name: \"DICESONICE.maxDiceNumber\",\n hint: \"DICESONICE.maxDiceNumberHint\",\n scope: \"world\",\n type: Number,\n default: 20,\n range: {\n min: 20,\n max: 100,\n step: 5\n },\n config: true\n });\n\n game.settings.register(\"dice-so-nice\", \"globalAnimationSpeed\", {\n name: \"DICESONICE.globalAnimationSpeed\",\n hint: \"DICESONICE.globalAnimationSpeedHint\",\n scope: \"world\",\n type: String,\n choices: Utils.localize({\n \"0\": \"DICESONICE.PlayerSpeed\",\n \"1\": \"DICESONICE.NormalSpeed\",\n \"2\": \"DICESONICE.2xSpeed\",\n \"3\": \"DICESONICE.3xSpeed\"\n }),\n default: \"0\",\n config: true,\n onChange: debouncedReload\n });\n\n game.settings.register(\"dice-so-nice\", \"enabledSimultaneousRolls\", {\n name: \"DICESONICE.enabledSimultaneousRolls\",\n hint: \"DICESONICE.enabledSimultaneousRollsHint\",\n scope: \"world\",\n type: Boolean,\n default: true,\n config: true,\n onChange: debouncedReload\n });\n\n game.settings.register(\"dice-so-nice\", \"enabledSimultaneousRollForMessage\", {\n name: \"DICESONICE.enabledSimultaneousRollForMessage\",\n hint: \"DICESONICE.enabledSimultaneousRollForMessageHint\",\n scope: \"world\",\n type: Boolean,\n default: true,\n config: true\n });\n\n game.settings.register(\"dice-so-nice\", \"diceCanBeFlipped\", {\n name: \"DICESONICE.diceCanBeFlipped\",\n hint: \"DICESONICE.diceCanBeFlippedHint\",\n scope: \"world\",\n type: Boolean,\n default: true,\n config: true\n });\n\n game.settings.register(\"dice-so-nice\", \"formatVersion\", {\n scope: \"world\",\n type: String,\n default: \"\",\n config: false\n });\n\n game.settings.register(\"dice-so-nice\", \"disabledDuringCombat\", {\n name: \"DICESONICE.disabledDuringCombat\",\n hint: \"DICESONICE.disabledDuringCombatHint\",\n scope: \"world\",\n type: Boolean,\n default: false,\n config: true\n });\n\n game.settings.register(\"dice-so-nice\", \"disabledForInitiative\", {\n name: \"DICESONICE.disabledForInitiative\",\n hint: \"DICESONICE.disabledForInitiativeHint\",\n scope: \"world\",\n type: Boolean,\n default: false,\n config: true\n });\n\n game.settings.register(\"dice-so-nice\", \"immediatelyDisplayChatMessages\", {\n name: \"DICESONICE.immediatelyDisplayChatMessages\",\n hint: \"DICESONICE.immediatelyDisplayChatMessagesHint\",\n scope: \"world\",\n type: Boolean,\n default: false,\n config: true\n });\n\n game.settings.register(\"dice-so-nice\", \"animateRollTable\", {\n name: \"DICESONICE.animateRollTable\",\n hint: \"DICESONICE.animateRollTableHint\",\n scope: \"world\",\n type: Boolean,\n default: false,\n config: true\n });\n\n game.settings.register(\"dice-so-nice\", \"animateInlineRoll\", {\n name: \"DICESONICE.animateInlineRoll\",\n hint: \"DICESONICE.animateInlineRollHint\",\n scope: \"world\",\n type: Boolean,\n default: true,\n config: true\n });\n\n game.settings.register(\"dice-so-nice\", \"hideNpcRolls\", {\n name: \"DICESONICE.hideNpcRolls\",\n hint: \"DICESONICE.hideNpcRollsHint\",\n scope: \"world\",\n type: Boolean,\n default: false,\n config: true\n });\n\n game.settings.register(\"dice-so-nice\", \"allowInteractivity\", {\n name: \"DICESONICE.allowInteractivity\",\n hint: \"DICESONICE.allowInteractivityHint\",\n scope: \"world\",\n type: Boolean,\n default: true,\n config: true,\n onChange: debouncedReload\n });\n\n game.settings.register(\"dice-so-nice\", \"showGhostDice\", {\n name: \"DICESONICE.showGhostDice\",\n hint: \"DICESONICE.showGhostDiceHint\",\n scope: \"world\",\n type: Boolean,\n default: false,\n config: true\n });\n\n});\n\n/**\n * Foundry is ready, let's create a new Dice3D!\n */\nHooks.once('ready', () => {\n Utils.migrateOldSettings().then((updated) => {\n if (updated) {\n if (!game.settings.get(\"core\", \"noCanvas\"))\n game.dice3d = new Dice3D();\n else\n logger.warn(\"Dice So Nice! is disabled because the user has activated the 'No-Canvas' mode\");\n }\n });\n});\n\n/**\n * Intercepts all roll-type messages hiding the content until the animation is finished\n */\nHooks.on('createChatMessage', (chatMessage) => {\n //precheck for better perf\n let hasInlineRoll = game.settings.get(\"dice-so-nice\", \"animateInlineRoll\") && chatMessage.content.indexOf('inline-roll') !== -1;\n if ((!chatMessage.isRoll && !hasInlineRoll) || (!chatMessage.isContentVisible && !game.settings.get(\"dice-so-nice\", \"showGhostDice\")) ||\n (game.view != \"stream\" && (!game.dice3d || game.dice3d.messageHookDisabled)) ||\n (chatMessage.getFlag(\"core\", \"RollTable\") && !game.settings.get(\"dice-so-nice\", \"animateRollTable\"))) {\n return;\n }\n\n let rolls = chatMessage.isRoll ? chatMessage.rolls : null;\n let maxRollOrder = rolls ? 0 : -1;\n if (hasInlineRoll) {\n let JqInlineRolls = $($.parseHTML(`<div>${chatMessage.content}</div>`)).find(\".inline-roll.inline-result:not(.inline-dsn-hidden)\");\n if (JqInlineRolls.length == 0 && !chatMessage.isRoll) //it was a false positive\n return;\n let inlineRollList = [];\n JqInlineRolls.each((index, el) => {\n //We use the Roll class registered in the CONFIG constant in case the system overwrites it (eg: HeXXen)\n let roll = CONFIG.Dice.rolls[0].fromJSON(unescape(el.dataset.roll));\n maxRollOrder++;\n roll.dice.forEach(diceterm => {\n if (!diceterm.options.hasOwnProperty(\"rollOrder\"))\n diceterm.options.rollOrder = maxRollOrder;\n });\n inlineRollList.push(roll);\n });\n if (inlineRollList.length) {\n if (chatMessage.isRoll)\n inlineRollList = [...chatMessage.rolls, ...inlineRollList];\n\n let pool = PoolTerm.fromRolls(inlineRollList);\n //We use the Roll class registered in the CONFIG constant in case the system overwrites it (eg: HeXXen)\n rolls = [CONFIG.Dice.rolls[0].fromTerms([pool])];\n }\n else if (!chatMessage.isRoll)\n return;\n }\n\n //Because Better Roll 5e sends an empty roll object sometime\n if (!rolls.length || !rolls[0].dice.length)\n return;\n\n const isInitiativeRoll = chatMessage.getFlag(\"core\", \"initiativeRoll\");\n if (isInitiativeRoll && game.settings.get(\"dice-so-nice\", \"disabledForInitiative\"))\n return;\n\n //Remove the chatmessage sound if it is the core dice sound.\n if (Dice3D.CONFIG().enabled && chatMessage.sound == \"sounds/dice.wav\") {\n mergeObject(chatMessage, { \"-=sound\": null }, { performDeletions: true });\n }\n chatMessage._dice3danimating = true;\n\n game.dice3d.renderRolls(chatMessage, rolls);\n});\n\n/**\n * Hide messages which are animating rolls.\n */\nHooks.on(\"renderChatMessage\", (message, html, data) => {\n if (game.dice3d && game.dice3d.messageHookDisabled) {\n return;\n }\n if (message._dice3danimating && !game.settings.get(\"dice-so-nice\", \"immediatelyDisplayChatMessages\")) {\n\n if (message._countNewRolls)\n html.find(`.dice-roll:nth-last-child(-n+${message._countNewRolls})`).addClass(\"dsn-hide\");\n else\n html.addClass(\"dsn-hide\");\n }\n});\n\n/**\n * Save the number of new rolls in the message before it is updated.\n */\nHooks.on(\"preUpdateChatMessage\", (message, updateData, options) => {\n if (!(\"rolls\" in updateData)) return;\n // We test against the source data in case the system/macro/module has modified the scoped message variable\n options.dsnCountAddedRoll = updateData.rolls.length - message.toObject().rolls.length;\n});\n\n/**\n * Hide and roll new rolls added in a chat message in a update\n */\nHooks.on(\"updateChatMessage\", (message, updateData, options) => {\n //Todo: refactor this check into a function\n if (!message.rolls || !message.isRoll || (!message.isContentVisible && !game.settings.get(\"dice-so-nice\", \"showGhostDice\")) ||\n (game.view != \"stream\" && (!game.dice3d || game.dice3d.messageHookDisabled)) ||\n (message.getFlag(\"core\", \"RollTable\") && !game.settings.get(\"dice-so-nice\", \"animateRollTable\"))) {\n return;\n }\n if (options.dsnCountAddedRoll > 0) {\n message._dice3danimating = true;\n message._countNewRolls = options.dsnCountAddedRoll;\n game.dice3d.renderRolls(message, message.rolls.slice(-options.dsnCountAddedRoll));\n }\n});\n\ndocument.addEventListener(\"visibilitychange\", function () {\n //if there was roll while the tab was hidden\n if (!document.hidden && game.dice3d && game.dice3d.hiddenAnimationQueue && game.dice3d.hiddenAnimationQueue.length) {\n let now = (new Date()).getTime();\n for (let i = 0; i < game.dice3d.hiddenAnimationQueue.length; i++) {\n let anim = game.dice3d.hiddenAnimationQueue[i];\n if (now - anim.timestamp > 10000) {\n anim.resolve(false);\n } else {\n game.dice3d._showAnimation(anim.data, anim.config).then(displayed => {\n anim.resolve(displayed);\n });\n }\n }\n game.dice3d.hiddenAnimationQueue = [];\n }\n});"],"names":["ShaderUtils","static","shader","undefined","this","emissive","game","dice3d","DiceFactory","realisticLighting","selectiveBloomShaderFragment","userData","iridescent","iridescentShaderFragment","shaderName","transmission","transmissionAlphaShaderFragment","iridescence","iridescenceShaderFragment","fragmentShader","replace","uniforms","globalBloom","iridescenceLookUp","iridescenceNoise","boost","vertexShader","DicePreset","constructor","type","shape","term","scale","labels","valueMap","values","bumps","emissiveMaps","mass","inertia","geometry","model","system","modelLoaded","modelLoading","modelFile","internalAdd","appearance","labelColor","diceColor","outlineColor","edgeColor","texture","material","font","colorset","setValues","min","max","step","range","setValueMap","map","count","i","registerFaces","faces","tab","push","includes","a","b","c","d","Array","prototype","apply","setLabels","setBumpMaps","setEmissiveMaps","loadTextures","Promise","resolve","reject","textures","textureTypeLoaded","loadedImages","numImages","length","regexTexture","imgElements","hasTextures","match","Image","crossOrigin","textureType","onload","bind","onerror","console","error","src","start","stop","setModel","file","loadModel","loader","load","gltf","scene","traverse","node","isMesh","castShadow","onBeforeCompile","applyDiceSoNiceShader","anisotropy","box","normalMap","emissiveMap","roughnessMap","metalnessMap","Hooks","callAll","BASE_PRESETS_LIST","EXTRA_PRESETS_LIST","diceobj","bumpMaps","fontScale","TEXTURELIST","none","name","composite","source","bump","cloudy","cloudy_2","fire","marble","water","water_2","ice","ice_2","paper","speckles","glitter","glitter_2","stars","stainedglass","skulls","leopard","tiger","cheetah","dragon","lizard","bird","astral","wood","metal","stone","radial","bronze01","bronze02","bronze03","bronze03a","bronze03b","bronze04","COLORSETS","coin_default","description","category","foreground","background","outline","edge","visibility","spectrum_default","radiant","cold","poison","acid","thunder","lightning","air","earth","force","psychic","necrotic","breebaby","pinkdreams","inspired","bloodmoon","starynight","glitterparty","astralsea","foundry","dragons","birdup","tigerking","toxic","rainbow","random","black","white","grey","red","blue","green","yellow","pink","cyan","prism","bronze","custom","DICE_SCALE","d2","d4","d6","d8","d10","d12","d14","d16","d20","d24","d30","d3","d5","d7","df","d100","DiceColors","sources","callback","images","itemprops","Object","entries","key","value","diceTextures","mergeObject","performDeletions","diceBumps","texturename","isArray","l","getTexture","names","keys","pop","Math","floor","rgb","parseInt","sets","uniqueSet","data","id","inplace","randcolor","randomColor","randtex","colorsetname","DICE_MODELS","metadata","version","generator","uuid","attributes","position","itemSize","array","normalized","normal","uv","color","index","boundingSphere","center","radius","faceValues","rotationCombinations","EventDispatcher","addEventListener","listener","_listeners","listeners","indexOf","hasEventListener","removeEventListener","listenerArray","splice","dispatchEvent","event","target","slice","call","_lut","_seed","DEG2RAD","PI","RAD2DEG","generateUUID","d0","d1","toLowerCase","clamp","euclideanModulo","n","m","lerp","x","y","t","isPowerOfTwo","ceilPowerOfTwo","pow","ceil","log","LN2","floorPowerOfTwo","denormalize","Float32Array","Uint16Array","Uint8Array","Int16Array","Int8Array","Error","normalize","round","MathUtils","freeze","__proto__","damp","lambda","dt","exp","degToRad","degrees","inverseLerp","mapLinear","a1","a2","b1","b2","pingpong","abs","radToDeg","radians","randFloat","low","high","randFloatSpread","randInt","seededRandom","s","imul","setQuaternionFromProperEuler","q","order","cos","sin","c2","s2","c13","s13","c1_3","s1_3","c3_1","s3_1","set","warn","smootherstep","smoothstep","Vector2","isVector2","width","height","setScalar","scalar","setX","setY","setComponent","getComponent","clone","copy","v","add","addScalar","addVectors","addScaledVector","sub","subScalar","subVectors","multiply","multiplyScalar","divide","divideScalar","applyMatrix3","e","elements","clampScalar","minVal","maxVal","clampLength","roundToZero","negate","dot","cross","lengthSq","sqrt","manhattanLength","angle","atan2","distanceTo","distanceToSquared","dx","dy","manhattanDistanceTo","setLength","alpha","lerpVectors","v1","v2","equals","fromArray","offset","toArray","fromBufferAttribute","attribute","getX","getY","rotateAround","Symbol","iterator","Matrix3","isMatrix3","n11","n12","n13","n21","n22","n23","n31","n32","n33","te","identity","me","extractBasis","xAxis","yAxis","zAxis","setFromMatrix3Column","setFromMatrix4","multiplyMatrices","premultiply","ae","be","a11","a12","a13","a21","a22","a23","a31","a32","a33","b11","b12","b13","b21","b22","b23","b31","b32","b33","determinant","f","g","h","invert","t11","t12","t13","det","detInv","transpose","tmp","getNormalMatrix","matrix4","transposeIntoArray","r","setUvTransform","tx","ty","sx","sy","rotation","cx","cy","_m3","makeScale","rotate","theta","makeRotation","translate","makeTranslation","matrix","arrayNeedsUint32","TYPED_ARRAYS","Uint8ClampedArray","Int32Array","Uint32Array","Float64Array","getTypedArray","buffer","createElementNS","document","SRGBToLinear","LinearToSRGB","FN","srgb","ColorManagement","legacyMode","workingColorSpace","colorSpace","convert","sourceColorSpace","targetColorSpace","fn","fromWorkingColorSpace","toWorkingColorSpace","_colorKeywords","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","blanchedalmond","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","plum","powderblue","purple","rebeccapurple","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","whitesmoke","yellowgreen","_rgb$1","_hslA","_hslB","hue2rgb","p","toComponents","Color","isColor","setRGB","setHex","setStyle","hex","setHSL","style","handleAlpha","string","parseFloat","exec","components","size","charAt","setColorName","copySRGBToLinear","copyLinearToSRGB","convertSRGBToLinear","convertLinearToSRGB","getHex","getHexString","toString","getHSL","hue","saturation","lightness","delta","getRGB","getStyle","offsetHSL","addColors","color1","color2","lerpColors","lerpHSL","getZ","toJSON","_canvas","NAMES","ImageUtils","image","test","HTMLCanvasElement","canvas","context","getContext","ImageData","putImageData","drawImage","toDataURL","HTMLImageElement","ImageBitmap","imageData","getImageData","Source","isSource","needsUpdate","meta","isRootObject","output","url","isDataTexture","serializeImage","getDataURL","from","textureId","Texture","DEFAULT_IMAGE","mapping","DEFAULT_MAPPING","wrapS","wrapT","magFilter","minFilter","format","DEFAULT_ANISOTROPY","encoding","super","isTexture","defineProperty","mipmaps","internalFormat","repeat","matrixAutoUpdate","generateMipmaps","premultiplyAlpha","flipY","unpackAlignment","onUpdate","isRenderTargetTexture","needsPMREMUpdate","updateMatrix","JSON","parse","stringify","wrap","dispose","transformUv","Vector4","z","w","isVector4","setZ","setW","applyMatrix4","setAxisAngleFromQuaternion","acos","setAxisAngleFromRotationMatrix","epsilon","epsilon2","m11","m12","m13","m21","m22","m23","m31","m32","m33","xx","yy","zz","xy","xz","yz","getW","WebGLRenderTarget","options","isWebGLRenderTarget","depth","scissor","scissorTest","viewport","depthBuffer","stencilBuffer","depthTexture","samples","setSize","assign","DataArrayTexture","isDataArrayTexture","wrapR","Data3DTexture","isData3DTexture","Quaternion","isQuaternion","_x","_y","_z","_w","dst","dstOffset","src0","srcOffset0","src1","srcOffset1","x0","y0","z0","w0","x1","y1","z1","w1","dir","sqrSin","Number","EPSILON","len","tDir","_onChangeCallback","quaternion","setFromEuler","euler","update","_order","c1","c3","s1","s3","setFromAxisAngle","axis","halfAngle","setFromRotationMatrix","trace","setFromUnitVectors","vFrom","vTo","angleTo","rotateTowards","slerp","conjugate","multiplyQuaternions","qax","qay","qaz","qaw","qbx","qby","qbz","qbw","qb","cosHalfTheta","sqrSinHalfTheta","sinHalfTheta","halfTheta","ratioA","ratioB","slerpQuaternions","qa","u1","sqrt1u1","sqrtu1","u2","u3","_onChange","Vector3","isVector3","multiplyVectors","applyEuler","applyQuaternion","_quaternion$4","applyAxisAngle","applyNormalMatrix","qx","qy","qz","qw","ix","iy","iz","iw","project","camera","matrixWorldInverse","projectionMatrix","unproject","projectionMatrixInverse","matrixWorld","transformDirection","crossVectors","ax","ay","az","bx","by","bz","projectOnVector","denominator","projectOnPlane","planeNormal","_vector$c","reflect","dz","setFromSpherical","setFromSphericalCoords","phi","sinPhiRadius","setFromCylindrical","setFromCylindricalCoords","setFromMatrixPosition","setFromMatrixScale","setFromMatrixColumn","sz","randomDirection","u","Box3","Infinity","isBox3","setFromArray","minX","minY","minZ","maxX","maxY","maxZ","setFromBufferAttribute","setFromPoints","points","makeEmpty","il","expandByPoint","setFromCenterAndSize","halfSize","_vector$b","setFromObject","object","precise","expandByObject","isEmpty","getCenter","getSize","point","expandByVector","vector","expandByScalar","updateWorldMatrix","boundingBox","computeBoundingBox","_box$3","union","children","containsPoint","containsBox","getParameter","intersectsBox","intersectsSphere","sphere","clampPoint","intersectsPlane","plane","constant","intersectsTriangle","triangle","_center","_extents","_v0$2","_v1$7","_v2$4","_f0","_f1","_f2","axes","satForAxes","_triangleNormal","distanceToPoint","getBoundingSphere","intersect","_points","_testAxis","v0","extents","j","p0","p1","p2","_box$2","_v1$6","_v2$3","Sphere","optionalCenter","maxRadiusSq","radiusSum","deltaLengthSq","getBoundingBox","getMaxScaleOnAxis","_vector$a","_segCenter","_segDir","_diff","_edge1","_edge2","_normal$1","Ray","origin","direction","ray","at","lookAt","recast","closestPointToPoint","directionDistance","distanceSqToPoint","distanceSqToSegment","optionalPointOnRay","optionalPointOnSegment","segExtent","a01","b0","s0","sqrDist","extDet","invDet","intersectSphere","tca","radius2","thc","t0","t1","distanceToPlane","intersectPlane","distToPoint","intersectBox","tmin","tmax","tymin","tymax","tzmin","tzmax","invdirx","invdiry","invdirz","isNaN","intersectTriangle","backfaceCulling","sign","DdN","DdQxE2","DdE1xQ","QdN","Matrix4","isMatrix4","n14","n24","n34","n41","n42","n43","n44","copyPosition","setFromMatrix3","makeBasis","extractRotation","scaleX","_v1$5","scaleY","scaleZ","makeRotationFromEuler","af","bf","ce","cf","de","ac","ad","bc","bd","makeRotationFromQuaternion","compose","_zero","_one","eye","up","a14","a24","a34","a41","a42","a43","a44","b14","b24","b34","b41","b42","b43","b44","setPosition","t14","scaleXSq","scaleYSq","scaleZSq","makeRotationX","makeRotationY","makeRotationZ","makeRotationAxis","makeShear","yx","zx","zy","x2","y2","z2","wx","wy","wz","decompose","_m1$2","invSX","invSY","invSZ","makePerspective","left","right","top","bottom","near","far","makeOrthographic","_matrix$1","_quaternion$3","Euler","DEFAULT_ORDER","isEuler","asin","setFromQuaternion","setFromVector3","reorder","newOrder","Layers","mask","channel","enable","enableAll","toggle","disable","disableAll","layers","isEnabled","_object3DId","_v1$4","_q1","_m1$1","_target","_position$3","_scale$2","_quaternion$2","_xAxis","_yAxis","_zAxis","_addedEvent","_removedEvent","Object3D","isObject3D","parent","DEFAULT_UP","onRotationChange","onQuaternionChange","defineProperties","configurable","enumerable","modelViewMatrix","normalMatrix","DEFAULT_MATRIX_AUTO_UPDATE","matrixWorldNeedsUpdate","matrixWorldAutoUpdate","DEFAULT_MATRIX_WORLD_AUTO_UPDATE","visible","receiveShadow","frustumCulled","renderOrder","animations","onBeforeRender","onAfterRender","setRotationFromAxisAngle","setRotationFromEuler","setRotationFromMatrix","setRotationFromQuaternion","rotateOnAxis","rotateOnWorldAxis","rotateX","rotateY","rotateZ","translateOnAxis","distance","translateX","translateY","translateZ","localToWorld","worldToLocal","isCamera","isLight","arguments","remove","removeFromParent","clear","attach","getObjectById","getObjectByProperty","getObjectByName","getObjectsByProperty","result","childResult","concat","getWorldPosition","getWorldQuaternion","getWorldScale","getWorldDirection","raycast","traverseVisible","traverseAncestors","updateMatrixWorld","child","updateParents","updateChildren","geometries","materials","shapes","skeletons","nodes","serialize","library","element","isInstancedMesh","instanceMatrix","instanceColor","isScene","environment","isLine","isPoints","parameters","isSkinnedMesh","bindMode","bindMatrix","skeleton","uuids","animation","extractFromCache","cache","recursive","_v0$1","_v1$3","_v2$2","_v3$1","_vab","_vac","_vbc","_vap","_vbp","_vcp","Triangle","targetLengthSq","dot00","dot01","dot02","dot11","dot12","denom","invDenom","getBarycoord","p3","uv1","uv2","uv3","setFromPointsAndIndices","i0","i1","i2","setFromAttributeAndIndices","getArea","getMidpoint","getNormal","getPlane","setFromCoplanarPoints","getUV","isFrontFacing","vc","vb","va","materialId","Material","isMaterial","blending","side","vertexColors","opacity","transparent","blendSrc","blendDst","blendEquation","blendSrcAlpha","blendDstAlpha","blendEquationAlpha","depthFunc","depthTest","depthWrite","stencilWriteMask","stencilFunc","stencilRef","stencilFuncMask","stencilFail","stencilZFail","stencilZPass","stencilWrite","clippingPlanes","clipIntersection","clipShadows","shadowSide","colorWrite","precision","polygonOffset","polygonOffsetFactor","polygonOffsetUnits","dithering","alphaToCoverage","premultipliedAlpha","forceSinglePass","toneMapped","_alphaTest","alphaTest","onBuild","customProgramCacheKey","newValue","currentValue","roughness","metalness","sheen","sheenColor","sheenRoughness","emissiveIntensity","specular","specularIntensity","specularColor","shininess","clearcoat","clearcoatRoughness","clearcoatMap","clearcoatRoughnessMap","clearcoatNormalMap","clearcoatNormalScale","iridescenceIOR","iridescenceThicknessRange","iridescenceMap","iridescenceThicknessMap","matcap","alphaMap","lightMap","lightMapIntensity","aoMap","aoMapIntensity","bumpMap","bumpScale","normalMapType","normalScale","displacementMap","displacementScale","displacementBias","specularMap","specularIntensityMap","specularColorMap","envMap","combine","envMapIntensity","reflectivity","refractionRatio","gradientMap","transmissionMap","thickness","thicknessMap","attenuationDistance","attenuationColor","sizeAttenuation","linewidth","dashSize","gapSize","wireframe","wireframeLinewidth","wireframeLinecap","wireframeLinejoin","flatShading","fog","srcPlanes","dstPlanes","MeshBasicMaterial","isMeshBasicMaterial","_vector$9","_vector2$1","BufferAttribute","TypeError","isBufferAttribute","usage","updateRange","onUploadCallback","setUsage","copyAt","index1","index2","copyArray","setXY","setXYZ","setXYZW","onUpload","copyColorsArray","copyVector2sArray","copyVector3sArray","copyVector4sArray","Uint16BufferAttribute","Uint32BufferAttribute","Float32BufferAttribute","_id$1","_m1","_obj","_offset","_box$1","_boxMorphTargets","_vector$8","BufferGeometry","isBufferGeometry","morphAttributes","morphTargetsRelative","groups","drawRange","getIndex","setIndex","getAttribute","setAttribute","deleteAttribute","hasAttribute","addGroup","materialIndex","clearGroups","setDrawRange","tangent","computeBoundingSphere","morphAttributesPosition","isGLBufferAttribute","morphAttribute","jl","computeTangents","indices","positions","normals","uvs","nVertices","tangents","tan1","tan2","vA","vB","vC","uvA","uvB","uvC","sdir","tdir","handleTriangle","isFinite","group","tmp2","n2","handleVertex","computeVertexNormals","positionAttribute","normalAttribute","pA","pB","pC","nA","nB","nC","cb","ab","normalizeNormals","merge","toNonIndexed","convertBufferAttribute","array2","isInterleavedBufferAttribute","stride","geometry2","newAttribute","morphArray","hasMorphAttributes","attributeArray","_inverseMatrix$2","_ray$2","_sphere$3","_vA$1","_vB$1","_vC$1","_tempA","_morphA","_uvA$1","_uvB$1","_uvC$1","_intersectionPoint","_intersectionPointWorld","Mesh","updateMorphTargets","morphTargetInfluences","morphTargetDictionary","ml","String","getVertexPosition","morphPosition","morphInfluences","influence","boneTransform","raycaster","intersects","intersection","groupMaterial","checkBufferGeometryIntersection","faceIndex","face","checkIntersection","BoxGeometry","widthSegments","heightSegments","depthSegments","scope","vertices","numberOfVertices","groupStart","buildPlane","udir","vdir","gridX","gridY","segmentWidth","segmentHeight","widthHalf","heightHalf","depthHalf","gridX1","gridY1","vertexCounter","groupCount","cloneUniforms","property","mergeUniforms","merged","getUnlitUniformColorSpace","renderer","getRenderTarget","outputEncoding","UniformsUtils","ShaderMaterial","isShaderMaterial","defines","uniformsGroups","lights","clipping","extensions","derivatives","fragDepth","drawBuffers","shaderTextureLOD","defaultAttributeValues","index0AttributeName","uniformsNeedUpdate","glslVersion","cloneUniformsGroups","Camera","PerspectiveCamera","fov","aspect","isPerspectiveCamera","zoom","focus","view","filmGauge","filmOffset","updateProjectionMatrix","setFocalLength","focalLength","vExtentSlope","getFilmHeight","atan","getFocalLength","getEffectiveFOV","getFilmWidth","setViewOffset","fullWidth","fullHeight","enabled","offsetX","offsetY","clearViewOffset","skew","CubeCamera","renderTarget","cameraPX","cameraNX","cameraPY","cameraNY","cameraPZ","cameraNZ","currentRenderTarget","currentToneMapping","toneMapping","currentXrEnabled","xr","setRenderTarget","render","CubeTexture","isCubeTexture","WebGLCubeRenderTarget","isWebGLCubeRenderTarget","fromEquirectangularTexture","tEquirect","mesh","currentMinFilter","stencil","_vector1","_vector2","_normalMatrix","Plane","isPlane","setComponents","setFromNormalAndCoplanarPoint","inverseNormalLength","distanceToSphere","projectPoint","intersectLine","line","intersectsLine","startSign","endSign","end","coplanarPoint","optionalNormalMatrix","referencePoint","_sphere$2","_vector$7","Frustum","p4","p5","planes","frustum","setFromProjectionMatrix","me0","me1","me2","me3","me4","me5","me6","me7","me8","me9","me10","me11","me12","me13","me14","me15","intersectsObject","intersectsSprite","sprite","negRadius","WebGLAnimation","isAnimating","animationLoop","requestId","onAnimationFrame","time","frame","requestAnimationFrame","cancelAnimationFrame","setAnimationLoop","setContext","WebGLAttributes","gl","capabilities","isWebGL2","buffers","WeakMap","get","deleteBuffer","delete","bufferType","cached","bytesPerElement","elementSize","createBuffer","bindBuffer","bufferData","isFloat16BufferAttribute","BYTES_PER_ELEMENT","updateBuffer","bufferSubData","subarray","PlaneGeometry","width_half","height_half","segment_width","segment_height","ShaderChunk","alphamap_fragment","alphamap_pars_fragment","alphatest_fragment","alphatest_pars_fragment","aomap_fragment","aomap_pars_fragment","begin_vertex","beginnormal_vertex","bsdfs","iridescence_fragment","bumpmap_pars_fragment","clipping_planes_fragment","clipping_planes_pars_fragment","clipping_planes_pars_vertex","clipping_planes_vertex","color_fragment","color_pars_fragment","color_pars_vertex","color_vertex","common","cube_uv_reflection_fragment","defaultnormal_vertex","displacementmap_pars_vertex","displacementmap_vertex","emissivemap_fragment","emissivemap_pars_fragment","encodings_fragment","encodings_pars_fragment","envmap_fragment","envmap_common_pars_fragment","envmap_pars_fragment","envmap_pars_vertex","envmap_physical_pars_fragment","envmap_vertex","fog_vertex","fog_pars_vertex","fog_fragment","fog_pars_fragment","gradientmap_pars_fragment","lightmap_fragment","lightmap_pars_fragment","lights_lambert_fragment","lights_lambert_pars_fragment","lights_pars_begin","lights_toon_fragment","lights_toon_pars_fragment","lights_phong_fragment","lights_phong_pars_fragment","lights_physical_fragment","lights_physical_pars_fragment","lights_fragment_begin","lights_fragment_maps","lights_fragment_end","logdepthbuf_fragment","logdepthbuf_pars_fragment","logdepthbuf_pars_vertex","logdepthbuf_vertex","map_fragment","map_pars_fragment","map_particle_fragment","map_particle_pars_fragment","metalnessmap_fragment","metalnessmap_pars_fragment","morphcolor_vertex","morphnormal_vertex","morphtarget_pars_vertex","morphtarget_vertex","normal_fragment_begin","normal_fragment_maps","normal_pars_fragment","normal_pars_vertex","normal_vertex","normalmap_pars_fragment","clearcoat_normal_fragment_begin","clearcoat_normal_fragment_maps","clearcoat_pars_fragment","iridescence_pars_fragment","output_fragment","packing","premultiplied_alpha_fragment","project_vertex","dithering_fragment","dithering_pars_fragment","roughnessmap_fragment","roughnessmap_pars_fragment","shadowmap_pars_fragment","shadowmap_pars_vertex","shadowmap_vertex","shadowmask_pars_fragment","skinbase_vertex","skinning_pars_vertex","skinning_vertex","skinnormal_vertex","specularmap_fragment","specularmap_pars_fragment","tonemapping_fragment","tonemapping_pars_fragment","transmission_fragment","transmission_pars_fragment","uv_pars_fragment","uv_pars_vertex","uv_vertex","uv2_pars_fragment","uv2_pars_vertex","uv2_vertex","worldpos_vertex","background_vert","background_frag","backgroundCube_vert","backgroundCube_frag","cube_vert","cube_frag","depth_vert","depth_frag","distanceRGBA_vert","distanceRGBA_frag","equirect_vert","equirect_frag","linedashed_vert","linedashed_frag","meshbasic_vert","meshbasic_frag","meshlambert_vert","meshlambert_frag","meshmatcap_vert","meshmatcap_frag","meshnormal_vert","meshnormal_frag","meshphong_vert","meshphong_frag","meshphysical_vert","meshphysical_frag","meshtoon_vert","meshtoon_frag","points_vert","points_frag","shadow_vert","shadow_frag","sprite_vert","sprite_frag","UniformsLib","diffuse","uvTransform","uv2Transform","specularmap","envmap","flipEnvMap","ior","aomap","lightmap","emissivemap","bumpmap","normalmap","displacementmap","roughnessmap","metalnessmap","gradientmap","fogDensity","fogNear","fogFar","fogColor","ambientLightColor","lightProbe","directionalLights","properties","directionalLightShadows","shadowBias","shadowNormalBias","shadowRadius","shadowMapSize","directionalShadowMap","directionalShadowMatrix","spotLights","coneCos","penumbraCos","decay","spotLightShadows","spotLightMap","spotShadowMap","spotLightMatrix","pointLights","pointLightShadows","shadowCameraNear","shadowCameraFar","pointShadowMap","pointShadowMatrix","hemisphereLights","skyColor","groundColor","rectAreaLights","ltc_1","ltc_2","ShaderLib","basic","lambert","phong","standard","toon","dashed","totalSize","t2D","backgroundIntensity","backgroundCube","backgroundBlurriness","cube","tCube","tFlip","equirect","distanceRGBA","referencePosition","nearDistance","farDistance","shadow","physical","iridescenceThicknessMinimum","iridescenceThicknessMaximum","sheenColorMap","sheenRoughnessMap","transmissionSamplerSize","transmissionSamplerMap","_rgb","WebGLBackground","cubemaps","cubeuvmaps","state","objects","clearColor","planeMesh","boxMesh","clearAlpha","currentBackground","currentBackgroundVersion","currentTonemapping","setClear","getClearColor","setClearColor","getClearAlpha","setClearAlpha","renderList","forceClear","session","getSession","environmentBlendMode","autoClear","autoClearColor","autoClearDepth","autoClearStencil","unshift","WebGLBindingStates","maxVertexAttributes","extension","vaoAvailable","bindingStates","defaultState","createBindingState","currentState","forceUpdate","bindVertexArrayObject","vao","bindVertexArray","bindVertexArrayOES","deleteVertexArrayObject","deleteVertexArray","deleteVertexArrayOES","newAttributes","enabledAttributes","attributeDivisors","program","initAttributes","enableAttribute","enableAttributeAndDivisor","meshPerAttribute","enableVertexAttribArray","disableUnusedAttributes","disableVertexAttribArray","vertexAttribPointer","vertexAttribIPointer","reset","resetDefaultState","setup","updateBuffers","getBindingState","programMap","stateMap","createVertexArrayObject","createVertexArray","createVertexArrayOES","cachedAttributes","geometryAttributes","attributesNum","programAttributes","getAttributes","location","cachedAttribute","geometryAttribute","saveCache","setupVertexAttributes","isInstancedBufferGeometry","materialDefaultAttributeValues","programAttribute","isInstancedInterleavedBuffer","locationSize","_maxInstanceCount","isInstancedBufferAttribute","vertexAttrib2fv","vertexAttrib3fv","vertexAttrib4fv","vertexAttrib1fv","geometryId","programId","releaseStatesOfGeometry","releaseStatesOfProgram","WebGLBufferRenderer","info","mode","setMode","drawArrays","renderInstances","primcount","methodName","WebGLCapabilities","maxAnisotropy","getMaxPrecision","getShaderPrecisionFormat","WebGL2RenderingContext","maxPrecision","has","logarithmicDepthBuffer","maxTextures","maxVertexTextures","maxTextureSize","maxCubemapSize","maxAttributes","maxVertexUniforms","maxVaryings","maxFragmentUniforms","vertexTextures","floatFragmentTextures","getMaxAnisotropy","MAX_TEXTURE_MAX_ANISOTROPY_EXT","floatVertexTextures","maxSamples","WebGLClipping","globalState","numGlobalPlanes","localClippingEnabled","renderingShadows","viewNormalMatrix","uniform","projectPlanes","skipTransform","nPlanes","dstArray","flatSize","viewMatrix","i4","numPlanes","numIntersection","init","enableLocalClipping","beginShadows","endShadows","setGlobalState","setState","useCache","materialProperties","resetGlobalState","nGlobal","lGlobal","clippingState","WebGLCubeMaps","mapTextureMapping","onTextureDispose","cubemap","OrthographicCamera","isOrthographicCamera","scaleW","scaleH","EXTRA_LOD_SIGMA","_flatCamera","_clearColor","_oldTarget","PHI","INV_PHI","_axisDirections","PMREMGenerator","_renderer","_pingPongRenderTarget","_lodMax","_cubeSize","_lodPlanes","_sizeLods","_sigmas","_blurMaterial","_cubemapMaterial","_equirectMaterial","_compileMaterial","fromScene","sigma","_setSize","cubeUVRenderTarget","_allocateTargets","_sceneToCubeUV","_blur","_applyPMREM","_cleanup","fromEquirectangular","equirectangular","_fromTexture","fromCubemap","compileCubemapShader","_getCubemapMaterial","compileEquirectangularShader","_getEquirectMaterial","_dispose","cubeSize","log2","outputTarget","_setViewport","_textureToCubeUV","params","_createRenderTarget","sizeLods","lodPlanes","sigmas","_createPlanes","lodMax","lod","totalLods","sizeLod","texelSize","cubeFaces","positionSize","uvSize","faceIndexSize","coordinates","fill","_getBlurShader","weights","poleAxis","CUBEUV_TEXEL_WIDTH","CUBEUV_TEXEL_HEIGHT","CUBEUV_MAX_MIP","latitudinal","dTheta","mipInt","_getCommonVertexShader","tmpMesh","compile","cubeCamera","upSign","forwardSign","originalAutoClear","backgroundMaterial","backgroundBox","useSolidColor","col","lodIn","lodOut","pingPongRenderTarget","_halfBlur","targetIn","targetOut","sigmaRadians","blurMaterial","blurMesh","blurUniforms","pixels","radiansPerPixel","sigmaPixels","sum","weight","outputSize","WebGLCubeUVMaps","cubeUVmaps","pmremGenerator","cubemapUV","isEquirectMap","isCubeMap","isCubeTextureComplete","WebGLExtensions","getExtension","WebGLGeometries","wireframeAttributes","onGeometryDispose","memory","updateWireframeAttribute","geometryIndex","geometryPosition","previousAttribute","getWireframeAttribute","currentAttribute","WebGLIndexedBufferRenderer","drawElements","WebGLInfo","calls","triangles","lines","programs","autoReset","instanceCount","numericalSort","absNumericalSort","WebGLMorphtargets","influencesList","morphTextures","morph","workInfluences","objectInfluences","morphTargetsCount","entry","hasMorphPosition","hasMorphNormals","hasMorphColors","morphTargets","morphNormals","morphColors","vertexDataCount","vertexDataStride","morphTarget","morphNormal","morphColor","disposeTexture","morphInfluencesSum","morphBaseInfluence","getUniforms","setValue","influences","sort","MAX_SAFE_INTEGER","WebGLObjects","updateMap","onInstancedMeshDispose","instancedMesh","buffergeometry","emptyTexture","emptyArrayTexture","empty3dTexture","emptyCubeTexture","arrayCacheF32","arrayCacheI32","mat4array","mat3array","mat2array","flatten","nBlocks","blockSize","firstElem","arraysEqual","allocTexUnits","allocateTextureUnit","setValueV1f","uniform1f","addr","setValueV2f","uniform2f","uniform2fv","setValueV3f","uniform3f","uniform3fv","setValueV4f","uniform4f","uniform4fv","setValueM2","uniformMatrix2fv","setValueM3","uniformMatrix3fv","setValueM4","uniformMatrix4fv","setValueV1i","uniform1i","setValueV2i","uniform2i","uniform2iv","setValueV3i","uniform3i","uniform3iv","setValueV4i","uniform4i","uniform4iv","setValueV1ui","uniform1ui","setValueV2ui","uniform2ui","uniform2uiv","setValueV3ui","uniform3ui","uniform3uiv","setValueV4ui","uniform4ui","uniform4uiv","setValueT1","unit","setTexture2D","setValueT3D1","setTexture3D","setValueT6","setTextureCube","setValueT2DArray1","setTexture2DArray","setValueV1fArray","uniform1fv","setValueV2fArray","setValueV3fArray","setValueV4fArray","setValueM2Array","setValueM3Array","setValueM4Array","setValueV1iArray","uniform1iv","setValueV2iArray","setValueV3iArray","setValueV4iArray","setValueV1uiArray","uniform1uiv","setValueV2uiArray","setValueV3uiArray","setValueV4uiArray","setValueT1Array","units","setValueT3DArray","setValueT6Array","setValueT2DArrayArray","SingleUniform","activeInfo","getSingularSetter","PureArrayUniform","getPureArraySetter","StructuredUniform","seq","RePathPart","addUniform","container","uniformObject","parseUniform","path","pathLength","lastIndex","matchEnd","idIsIndex","subscript","next","WebGLUniforms","getProgramParameter","getActiveUniform","getUniformLocation","setOptional","WebGLShader","createShader","shaderSource","compileShader","programIdCount","getShaderErrors","status","getShaderParameter","errors","getShaderInfoLog","trim","errorMatches","errorLine","toUpperCase","handleSource","split","lines2","to","join","getShaderSource","getTexelEncodingFunction","functionName","getEncodingComponents","getToneMappingFunction","toneMappingName","filterEmptyLine","replaceLightNums","numSpotLightCoords","numSpotLightShadows","numSpotLightMaps","numSpotLightShadowsWithMaps","numDirLights","numSpotLights","numRectAreaLights","numPointLights","numHemiLights","numDirLightShadows","numPointLightShadows","replaceClippingPlaneNums","numClippingPlanes","numClipIntersection","includePattern","resolveIncludes","includeReplacer","include","unrollLoopPattern","unrollLoops","loopReplacer","snippet","generatePrecision","precisionstring","WebGLProgram","cacheKey","shadowMapTypeDefine","generateShadowMapTypeDefine","shadowMapType","envMapTypeDefine","generateEnvMapTypeDefine","envMapMode","envMapModeDefine","generateEnvMapModeDefine","envMapBlendingDefine","generateEnvMapBlendingDefine","envMapCubeUVSize","generateCubeUVSize","imageHeight","envMapCubeUVHeight","maxMip","texelHeight","texelWidth","customExtensions","generateExtensions","extensionDerivatives","tangentSpaceNormalMap","shaderID","extensionFragDepth","rendererExtensionFragDepth","extensionDrawBuffers","rendererExtensionDrawBuffers","extensionShaderTextureLOD","rendererExtensionShaderTextureLod","filter","customDefines","generateDefines","chunks","createProgram","prefixVertex","prefixFragment","versionString","isRawShaderMaterial","instancing","instancingColor","supportsVertexTextures","useFog","fogExp2","objectSpaceNormalMap","vertexTangents","vertexAlphas","vertexUvs","uvsVertexOnly","skinning","morphTextureStride","doubleSided","flipSided","shadowMapEnabled","decodeVideoTexture","physicallyCorrectLights","opaque","useDepthPacking","depthPacking","fragmentGlsl","glVertexShader","glFragmentShader","attachShader","bindAttribLocation","linkProgram","debug","checkShaderErrors","programLog","getProgramInfoLog","vertexLog","fragmentLog","runnable","haveDiagnostics","vertexErrors","fragmentErrors","getError","diagnostics","prefix","cachedUniforms","deleteShader","fetchAttributeLocations","getActiveAttrib","getAttribLocation","destroy","deleteProgram","usedTimes","_id","WebGLShaderCache","shaderCache","Map","materialCache","vertexShaderStage","_getShaderStage","fragmentShaderStage","materialShaders","_getShaderCacheForMaterial","shaderStage","code","getVertexShaderID","getFragmentShaderID","Set","stage","WebGLShaderStage","WebGLPrograms","_programLayers","_customShaders","shaderIDs","MeshDepthMaterial","MeshDistanceMaterial","MeshNormalMaterial","MeshLambertMaterial","MeshPhongMaterial","MeshToonMaterial","MeshStandardMaterial","MeshPhysicalMaterial","MeshMatcapMaterial","LineBasicMaterial","LineDashedMaterial","PointsMaterial","ShadowMaterial","SpriteMaterial","getParameters","shadows","isMeshStandardMaterial","customVertexShaderID","customFragmentShaderID","useAlphaTest","useClearcoat","useIridescence","isXRRenderTarget","isVideoTexture","isFogExp2","directional","spot","rectArea","hemi","shadowMap","getProgramCacheKey","getProgramCacheKeyParameters","morphAttributeCount","getProgramCacheKeyBooleans","acquireProgram","pl","preexistingProgram","releaseProgram","releaseShaderCache","WebGLProperties","painterSortStable","groupOrder","reversePainterSortStable","WebGLRenderList","renderItems","renderItemsIndex","transmissive","getNextRenderItem","renderItem","finish","customOpaqueSort","customTransparentSort","WebGLRenderLists","lists","renderCallDepth","listArray","list","UniformsCache","light","halfWidth","halfHeight","nextVersion","shadowCastingAndTexturingLightsFirst","lightA","lightB","WebGLLights","shadowCache","ShadowUniformsCache","hash","directionalLength","pointLength","spotLength","rectAreaLength","hemiLength","numDirectionalShadows","numPointShadows","numSpotShadows","numSpotMaps","ambient","probe","directionalShadow","spotShadow","rectAreaLTC1","rectAreaLTC2","pointShadow","vector3","matrix42","numSpotShadowsWithMaps","scaleFactor","intensity","isAmbientLight","isLightProbe","sh","coefficients","isDirectionalLight","shadowUniforms","bias","normalBias","mapSize","isSpotLight","penumbra","updateMatrices","isRectAreaLight","isPointLight","isHemisphereLight","LTC_FLOAT_1","LTC_FLOAT_2","LTC_HALF_1","LTC_HALF_2","setupView","WebGLRenderState","lightsArray","shadowsArray","setupLights","setupLightsView","pushLight","pushShadow","shadowLight","WebGLRenderStates","renderStates","renderStateArray","renderState","isMeshDepthMaterial","isMeshDistanceMaterial","WebGLShadowMap","_objects","_capabilities","_frustum","_shadowMapSize","_viewportSize","_viewport","_depthMaterial","_distanceMaterial","_materialCache","_maxTextureSize","shadowMaterialVertical","VSM_SAMPLES","shadow_pass","resolution","shadowMaterialHorizontal","HORIZONTAL_PASS","fullScreenTri","fullScreenMesh","VSMPass","blurSamples","mapPass","renderBufferDirect","getDepthMaterial","customMaterial","customDistanceMaterial","customDepthMaterial","keyA","keyB","materialsForVariant","cachedMaterial","renderObject","shadowCamera","k","kl","depthMaterial","autoUpdate","activeCubeFace","getActiveCubeFace","activeMipmapLevel","getActiveMipmapLevel","_state","setBlending","setTest","setScissorTest","shadowFrameExtents","getFrameExtents","pars","viewportCount","getViewportCount","vp","getViewport","getFrustum","isPointLightShadow","WebGLState","colorBuffer","ColorBuffer","locked","currentColorMask","currentColorClear","setMask","colorMask","setLocked","lock","DepthBuffer","currentDepthMask","currentDepthFunc","currentDepthClear","depthMask","setFunc","clearDepth","StencilBuffer","currentStencilMask","currentStencilFunc","currentStencilRef","currentStencilFuncMask","currentStencilFail","currentStencilZFail","currentStencilZPass","currentStencilClear","stencilTest","stencilMask","setOp","stencilOp","clearStencil","uboBindings","uboProgramMap","enabledCapabilities","currentBoundFramebuffers","currentDrawbuffers","defaultDrawbuffers","currentProgram","currentBlendingEnabled","currentBlending","currentBlendEquation","currentBlendSrc","currentBlendDst","currentBlendEquationAlpha","currentBlendSrcAlpha","currentBlendDstAlpha","currentPremultipledAlpha","currentFlipSided","currentCullFace","currentLineWidth","currentPolygonOffsetFactor","currentPolygonOffsetUnits","lineWidthAvailable","glVersion","currentTextureSlot","currentBoundTextures","scissorParam","viewportParam","currentScissor","currentViewport","createTexture","bindTexture","texParameteri","texImage2D","emptyTextures","setFlipSided","setCullFace","equationToGL","MIN_EXT","MAX_EXT","factorToGL","blendEquationSeparate","blendFuncSeparate","blendFunc","frontFace","cullFace","setPolygonOffset","factor","bindFramebuffer","framebuffer","isWebGLMultipleRenderTargets","drawBuffersWEBGL","useProgram","setMaterial","frontFaceCW","setLineWidth","lineWidth","activeTexture","webglSlot","webglType","webglTexture","boundTexture","unbindTexture","compressedTexImage2D","compressedTexImage3D","texImage3D","updateUBOMapping","uniformsGroup","blockIndex","getUniformBlockIndex","uniformBlockBinding","__bindingPointIndex","texStorage2D","texStorage3D","texSubImage2D","texSubImage3D","compressedTexSubImage2D","compressedTexSubImage3D","WebGLTextures","_gl","utils","multisampledRTTExt","supportsInvalidateFramebuffer","navigator","userAgent","_videoTextures","_sources","useOffscreenCanvas","OffscreenCanvas","err","createCanvas","resizeImage","needsPowerOfTwo","needsNewCanvas","maxSize","isPowerOfTwo$1","textureNeedsGenerateMipmaps","supportsMips","generateMipmap","getInternalFormat","internalFormatName","glFormat","glType","forceLinearEncoding","getMipLevels","isFramebufferTexture","isCompressedTexture","filterFallback","deallocateTexture","textureProperties","__webglInit","webglTextures","__cacheKey","deleteTexture","onRenderTargetDispose","deallocateRenderTarget","renderTargetProperties","__webglTexture","deleteFramebuffer","__webglFramebuffer","__webglDepthbuffer","deleteRenderbuffer","__webglMultisampledFramebuffer","__webglColorRenderbuffer","__webglDepthRenderbuffer","attachmentProperties","textureUnits","slot","updateVideoTexture","__version","complete","uploadTexture","wrappingToGL","filterToGL","setTextureParameters","__currentAnisotropy","texParameterf","TEXTURE_MAX_ANISOTROPY_EXT","initTexture","forceUpload","textureCacheKey","getTextureCacheKey","isCompressedArrayTexture","sourceProperties","pixelStorei","textureNeedsPowerOfTwo","verifyColorSpace","mipmap","glInternalFormat","useTexStorage","allocateMemory","levels","isDepthTexture","setupFrameBufferTexture","attachment","textureTarget","__hasExternalTextures","useMultisampledRTT","framebufferTexture2DMultisampleEXT","getRenderTargetSamples","framebufferTexture2D","setupRenderBufferStorage","renderbuffer","isMultisample","bindRenderbuffer","renderbufferStorageMultisampleEXT","renderbufferStorageMultisample","renderbufferStorage","framebufferRenderbuffer","setupDepthRenderbuffer","isCube","__autoAllocateDepthBuffer","setupDepthTexture","webglDepthTexture","createRenderbuffer","__useRenderToTexture","sRGBToLinear","textureUnit","resetTextureUnits","uploadCubeTexture","isCompressed","cubeImage","mipmapImage","rebindTextures","colorTexture","setupRenderTarget","isMultipleRenderTargets","createFramebuffer","glTextureType","isWebGL3DRenderTarget","isWebGLArrayRenderTarget","updateRenderTargetMipmap","updateMultisampleRenderTarget","invalidationArray","depthStyle","ignoreDepthValues","__ignoreDepthValues","invalidateFramebuffer","blitFramebuffer","WebGLUtils","HALF_FLOAT_OES","SRGB_ALPHA_EXT","COMPRESSED_SRGB_S3TC_DXT1_EXT","COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT","COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT","COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT","COMPRESSED_RGB_S3TC_DXT1_EXT","COMPRESSED_RGBA_S3TC_DXT1_EXT","COMPRESSED_RGBA_S3TC_DXT3_EXT","COMPRESSED_RGBA_S3TC_DXT5_EXT","COMPRESSED_RGB_PVRTC_4BPPV1_IMG","COMPRESSED_RGB_PVRTC_2BPPV1_IMG","COMPRESSED_RGBA_PVRTC_4BPPV1_IMG","COMPRESSED_RGBA_PVRTC_2BPPV1_IMG","COMPRESSED_RGB_ETC1_WEBGL","COMPRESSED_SRGB8_ETC2","COMPRESSED_RGB8_ETC2","COMPRESSED_SRGB8_ALPHA8_ETC2_EAC","COMPRESSED_RGBA8_ETC2_EAC","COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR","COMPRESSED_RGBA_ASTC_4x4_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR","COMPRESSED_RGBA_ASTC_5x4_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR","COMPRESSED_RGBA_ASTC_5x5_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR","COMPRESSED_RGBA_ASTC_6x5_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR","COMPRESSED_RGBA_ASTC_6x6_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR","COMPRESSED_RGBA_ASTC_8x5_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR","COMPRESSED_RGBA_ASTC_8x6_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR","COMPRESSED_RGBA_ASTC_8x8_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR","COMPRESSED_RGBA_ASTC_10x5_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR","COMPRESSED_RGBA_ASTC_10x6_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR","COMPRESSED_RGBA_ASTC_10x8_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR","COMPRESSED_RGBA_ASTC_10x10_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR","COMPRESSED_RGBA_ASTC_12x10_KHR","COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR","COMPRESSED_RGBA_ASTC_12x12_KHR","COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT","COMPRESSED_RGBA_BPTC_UNORM_EXT","COMPRESSED_RED_RGTC1_EXT","COMPRESSED_SIGNED_RED_RGTC1_EXT","COMPRESSED_RED_GREEN_RGTC2_EXT","COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT","UNSIGNED_INT_24_8_WEBGL","ArrayCamera","isArrayCamera","cameras","Group","isGroup","_moveEvent","WebXRController","_targetRay","_grip","_hand","getHandSpace","joints","inputState","pinching","getTargetRaySpace","hasLinearVelocity","linearVelocity","hasAngularVelocity","angularVelocity","getGripSpace","connect","inputSource","hand","inputjoint","_getHandJoint","disconnect","referenceSpace","inputPose","gripPose","handPose","targetRay","grip","visibilityState","jointPose","getJointPose","joint","transform","jointRadius","indexTip","thumbTip","distanceToPinch","threshold","handedness","gripSpace","getPose","targetRaySpace","jointName","DepthTexture","WebXRManager","framebufferScaleFactor","referenceSpaceType","foveation","customReferenceSpace","pose","glBinding","glProjLayer","glBaseLayer","xrFrame","getContextAttributes","initialRenderTarget","newRenderTarget","controllers","controllerInputSources","planesLastChangedTimes","cameraL","cameraR","cameraVR","_currentDepthNear","_currentDepthFar","onSessionEvent","controllerIndex","controller","onSessionEnd","onInputSourcesChange","isPresenting","removed","added","cameraAutoUpdate","getController","getControllerGrip","getHand","setFramebufferScaleFactor","setReferenceSpaceType","getReferenceSpace","setReferenceSpace","space","getBaseLayer","getBinding","getFrame","setSession","async","xrCompatible","makeXRCompatible","layerInit","antialias","XRWebGLLayer","updateRenderState","baseLayer","framebufferWidth","framebufferHeight","depthFormat","depthType","glDepthFormat","projectionlayerInit","colorFormat","XRWebGLBinding","createProjectionLayer","textureWidth","textureHeight","setFoveation","requestReferenceSpace","cameraLPos","cameraRPos","updateCamera","depthNear","depthFar","setProjectionFromUnion","ipd","projL","projR","topFov","bottomFov","leftFov","rightFov","zOffset","xOffset","near2","far2","left2","right2","top2","bottom2","getCamera","getFoveation","fixedFoveation","getPlanes","onAnimationFrameCallback","getViewerPose","views","setRenderTargetFramebuffer","cameraVRNeedsUpdate","glSubImage","getViewSubImage","setRenderTargetTextures","depthStencilTexture","detectedPlanes","planesToRemove","lastKnownTime","lastChangedTime","WebGLMaterials","refreshUniformsCommon","uvScaleMap","uv2ScaleMap","refreshFogUniforms","isFog","density","refreshMaterialUniforms","pixelRatio","transmissionRenderTarget","isMeshLambertMaterial","isMeshToonMaterial","refreshUniformsToon","isMeshPhongMaterial","refreshUniformsPhong","refreshUniformsStandard","isMeshPhysicalMaterial","refreshUniformsPhysical","isMeshMatcapMaterial","refreshUniformsMatcap","refreshUniformsDistance","isMeshNormalMaterial","isLineBasicMaterial","refreshUniformsLine","isLineDashedMaterial","refreshUniformsDash","isPointsMaterial","refreshUniformsPoints","isSpriteMaterial","refreshUniformsSprites","isShadowMaterial","WebGLUniformsGroups","updateList","allocatedBindingPoints","maxBindingPoints","hasUniformChanged","tempValues","cachedObjects","cachedObject","getUniformSize","boundary","storage","onUniformsGroupsDispose","webglProgram","prepareUniformsGroup","chunkSize","chunkOffset","infos","__data","__offset","remainingSizeInChunk","__size","__cache","bindingPointIndex","allocateBindingPointIndex","bindBufferBase","updateBufferData","arrayOffset","WebGLRenderer","isWebGLRenderer","createCanvasElement","display","_context","_depth","_stencil","_antialias","_premultipliedAlpha","_preserveDrawingBuffer","preserveDrawingBuffer","_powerPreference","powerPreference","_failIfMajorPerformanceCaveat","failIfMajorPerformanceCaveat","_alpha","currentRenderList","currentRenderState","renderListStack","renderStateStack","domElement","sortObjects","toneMappingExposure","_this","_isContextLost","_currentActiveCubeFace","_currentActiveMipmapLevel","_currentRenderTarget","_currentMaterialId","_currentCamera","_currentViewport","_currentScissor","_currentScissorTest","_width","_height","_pixelRatio","_opaqueSort","_transparentSort","_scissor","_scissorTest","_clippingEnabled","_localClippingEnabled","_transmissionRenderTarget","_projScreenMatrix","_vector3","_emptyScene","overrideMaterial","getTargetPixelRatio","programCache","renderLists","morphtargets","bufferRenderer","indexedBufferRenderer","contextNames","contextAttributes","contextName","onContextLost","onContextRestore","onContextCreationError","isWebGL1Renderer","shift","rangeMin","rangeMax","message","initGLContext","preventDefault","infoAutoReset","shadowMapAutoUpdate","shadowMapNeedsUpdate","statusMessage","onMaterialDispose","deallocateMaterial","releaseMaterialProgramReferences","forEach","forceContextLoss","loseContext","forceContextRestore","restoreContext","getPixelRatio","setPixelRatio","updateStyle","setViewport","getDrawingBufferSize","setDrawingBufferSize","getCurrentViewport","getScissor","setScissor","getScissorTest","boolean","setOpaqueSort","method","setTransparentSort","bits","onXRSessionStart","onXRSessionEnd","setProgram","needsProgramChange","needsLights","lightsStateVersion","getProgram","refreshProgram","refreshMaterial","refreshLights","p_uniforms","m_uniforms","uCamPos","cameraPosition","boneTexture","computeBoneTexture","boneTextureSize","isMeshGouraudMaterial","markUniformsLightsNeedsUpdate","upload","uniformsList","rangeFactor","drawStart","drawEnd","drawCount","isLineSegments","isLineLoop","isSprite","maxInstanceCount","prepare","projectObject","isLOD","renderScene","opaqueObjects","transmissiveObjects","transparentObjects","renderTransmissionPass","renderObjects","programCacheKey","updateCommonMaterialProperties","materialNeedsLights","progUniforms","seqWithValue","self","camera2","defaultFramebuffer","__useDefaultFramebuffer","useDefaultFramebuffer","isRenderTarget3D","layer","framebufferTextureLayer","readRenderTargetPixels","activeCubeFaceIndex","textureFormat","halfFloatSupportedByExt","readPixels","copyFramebufferToTexture","level","levelScale","copyTexSubImage2D","copyTextureToTexture","srcTexture","dstTexture","copyTextureToTexture3D","sourceBox","glTarget","unpackRowLen","unpackImageHeight","unpackSkipPixels","unpackSkipRows","unpackSkipImages","resetState","__THREE_DEVTOOLS__","CustomEvent","detail","WebGL1Renderer","Scene","InterleavedBuffer","isInterleavedBuffer","arrayBuffers","_uuid","ib","_vector$6","InterleavedBufferAttribute","interleavedBuffer","interleavedBuffers","_geometry","_intersectPoint","_worldScale","_mvPosition","_alignedPosition","_rotatedPosition","_viewWorldMatrix","_vA","_vB","_vC","_uvA","_uvB","_uvC","Sprite","float32Array","transformVertex","vertexPosition","mvPosition","_basePosition","_skinIndex","_skinWeight","_vector$5","_matrix","SkinnedMesh","bindMatrixInverse","calculateInverses","normalizeSkinWeights","skinWeight","skinIndex","boneIndex","bones","boneInverses","Bone","isBone","DataTexture","_offsetMatrix","_identityMatrix","Skeleton","boneMatrices","inverse","bone","getBoneByName","fromJSON","json","boneInverse","InstancedBufferAttribute","_instanceLocalMatrix","_instanceWorldMatrix","_instanceIntersects","_identity","_mesh","InstancedMesh","setMatrixAt","getColorAt","getMatrixAt","raycastTimes","instanceId","setColorAt","linecap","linejoin","_start$1","_end$1","_inverseMatrix$1","_ray$1","_sphere$1","Line","computeLineDistances","lineDistances","localThreshold","localThresholdSq","vStart","vEnd","interSegment","interRay","_start","_end","LineSegments","LineLoop","_inverseMatrix","_ray","_sphere","_position$2","Points","testPoint","rayPointDistanceSq","intersectPoint","distanceToRay","CanvasTexture","isCanvasTexture","CubicPoly","c0","initCatmullRom","x3","tension","initNonuniformCatmullRom","dt0","dt1","dt2","t2","calc","px","py","pz","CatmullRomCurve3","Curve","arcLengthDivisions","getPoint","getPointAt","optionalTarget","getUtoTmapping","getPoints","divisions","getSpacedPoints","getLength","lengths","getLengths","cacheArcLengths","current","last","updateArcLengths","arcLengths","targetArcLength","comparison","lengthBefore","getTangent","pt1","pt2","getTangentAt","computeFrenetFrames","segments","closed","binormals","vec","mat","MAX_VALUE","tz","curveType","isCatmullRomCurve3","intPoint","PolyhedronGeometry","vertexBuffer","uvBuffer","subdivideFace","cols","aj","bj","rows","pushVertex","vertex","getVertexByIndex","correctUV","azimuth","subdivide","applyRadius","generateUVs","correctUVs","centroid","azi","correctSeam","details","OctahedronGeometry","SphereGeometry","phiStart","phiLength","thetaStart","thetaLength","thetaEnd","grid","verticesRow","uOffset","STANDARD","PHYSICAL","_sheen","_clearcoat","_iridescence","_transmission","arraySlice","isTypedArray","convertArray","forceClone","ArrayBuffer","isView","DataView","getKeyframeOrder","times","compareTime","sortedArray","nValues","srcOffset","flattenJSON","jsonKeys","valuePropertyName","Interpolant","parameterPositions","sampleValues","sampleSize","resultBuffer","_cachedIndex","valueSize","settings","DefaultSettings_","evaluate","pp","validate_interval","seek","linear_scan","forward_scan","giveUpAt","copySampleValue_","t1global","mid","intervalChanged_","interpolate_","getSettings_","CubicInterpolant","_weightPrev","_offsetPrev","_weightNext","_offsetNext","endingStart","endingEnd","iPrev","iNext","tPrev","tNext","halfDt","o1","o0","oP","oN","wP","wN","ppp","sP","sN","LinearInterpolant","offset1","offset0","weight1","weight0","DiscreteInterpolant","KeyframeTrack","interpolation","TimeBufferType","ValueBufferType","setInterpolation","DefaultInterpolation","track","trackType","getInterpolation","ValueTypeName","InterpolantFactoryMethodDiscrete","getValueSize","InterpolantFactoryMethodLinear","InterpolantFactoryMethodSmooth","factoryMethod","createInterpolant","timeOffset","timeScale","startTime","endTime","nKeys","validate","valid","prevTime","currTime","optimize","smoothInterpolation","writeIndex","keep","offsetP","offsetN","readOffset","writeOffset","TypedKeyframeTrack","BooleanKeyframeTrack","ColorKeyframeTrack","NumberKeyframeTrack","QuaternionLinearInterpolant","slerpFlat","QuaternionKeyframeTrack","StringKeyframeTrack","VectorKeyframeTrack","AnimationClip","duration","tracks","blendMode","resetDuration","jsonTracks","frameTime","fps","parseKeyframeTrack","clip","clipTracks","morphTargetSequence","noLoop","numMorphTargets","objectOrClipArray","clipArray","o","animationToMorphTargets","pattern","parts","animationMorphTargets","clips","CreateFromMorphTargetSequence","addNonemptyTrack","trackName","animationKeys","propertyName","destTracks","clipName","hierarchyTracks","hierarchy","morphTargetNames","morphTargetName","animationKey","boneName","getTrackTypeForValueTypeName","typeName","Cache","files","LoadingManager","onLoad","onProgress","onError","urlModifier","isLoading","itemsLoaded","itemsTotal","handlers","onStart","itemStart","itemEnd","itemError","resolveURL","setURLModifier","addHandler","regex","removeHandler","getHandler","global","DefaultLoadingManager","Loader","manager","withCredentials","resourcePath","requestHeader","loadAsync","setCrossOrigin","setWithCredentials","setPath","setResourcePath","setRequestHeader","loading","HttpError","response","FileLoader","setTimeout","req","Request","headers","Headers","credentials","mimeType","responseType","fetch","then","ReadableStream","body","getReader","callbacks","reader","contentLength","total","lengthComputable","loaded","stream","readData","read","done","close","byteLength","ProgressEvent","enqueue","Response","statusText","arrayBuffer","blob","text","DOMParser","parseFromString","label","decoder","TextDecoder","decode","catch","finally","setResponseType","setMimeType","ImageLoader","onImageLoad","removeEventListeners","onImageError","CubeTextureLoader","urls","loadTexture","DataTextureLoader","texData","mipmapCount","TextureLoader","Light","HemisphereLight","_projScreenMatrix$1","_lightPositionWorld$1","_lookTarget$1","LightShadow","_frameExtents","_viewportCount","_viewports","shadowMatrix","viewportIndex","SpotLightShadow","isSpotLightShadow","SpotLight","power","_lightPositionWorld","_lookTarget","PointLightShadow","_cubeDirections","_cubeUps","PointLight","DirectionalLightShadow","isDirectionalLightShadow","DirectionalLight","LoaderUtils","fromCharCode","decodeURIComponent","escape","lastIndexOf","InstancedBufferGeometry","BufferGeometryLoader","interleavedBufferMap","arrayBufferMap","getInterleavedBuffer","getArrayBuffer","typedArray","bufferAttribute","drawcalls","offsets","ImageBitmapLoader","isImageBitmapLoader","createImageBitmap","setOptions","fetchOptions","res","colorSpaceConversion","imageBitmap","Clock","autoStart","oldTime","elapsedTime","running","now","getElapsedTime","getDelta","diff","newTime","performance","Date","PropertyMixer","binding","mixFunction","mixFunctionAdditive","setIdentity","_slerp","_slerpAdditive","_setAdditiveIdentityQuaternion","_workIndex","_select","_setAdditiveIdentityOther","_lerp","_lerpAdditive","_setAdditiveIdentityNumeric","_mixBufferRegion","_mixBufferRegionAdditive","_setIdentity","_origIndex","_addIndex","cumulativeWeight","cumulativeWeightAdditive","useCount","referenceCount","accumulate","accuIndex","currentWeight","mix","accumulateAdditive","weightAdditive","originalValueOffset","saveOriginalState","getValue","restoreOriginalState","startIndex","endIndex","targetIndex","workOffset","multiplyQuaternionsFlat","_reservedRe","RegExp","_wordCharOrDot","_trackRe","_supportedObjectNames","PropertyBinding","rootNode","parsedPath","parseTrackName","findNode","nodeName","_getValue_unbound","_setValue_unbound","root","isAnimationObjectGroup","Composite","matches","results","objectName","objectIndex","propertyIndex","lastDot","substring","searchNodeSubtree","childNode","subTreeNode","_getValue_unavailable","_setValue_unavailable","_getValue_direct","targetObject","_getValue_array","resolvedProperty","_getValue_arrayElement","_getValue_toArray","_setValue_direct","_setValue_direct_setNeedsUpdate","_setValue_direct_setMatrixWorldNeedsUpdate","_setValue_array","dest","_setValue_array_setNeedsUpdate","_setValue_array_setMatrixWorldNeedsUpdate","_setValue_arrayElement","_setValue_arrayElement_setNeedsUpdate","_setValue_arrayElement_setMatrixWorldNeedsUpdate","_setValue_fromArray","_setValue_fromArray_setNeedsUpdate","_setValue_fromArray_setMatrixWorldNeedsUpdate","targetArray","sourceArray","nodeProperty","versioning","Versioning","None","NeedsUpdate","MatrixWorldNeedsUpdate","bindingType","BindingType","Direct","ArrayElement","HasFromToArray","EntireArray","GetterByBindingType","SetterByBindingTypeAndVersioning","unbind","targetGroup","optionalParsedPath","_targetGroup","_bindings","subscribe_","firstValidIndex","nCachedObjects_","bindings","AnimationAction","mixer","localRoot","_mixer","_clip","_localRoot","nTracks","interpolants","interpolantSettings","interpolant","_interpolantSettings","_interpolants","_propertyBindings","_cacheIndex","_byClipCacheIndex","_timeScaleInterpolant","_weightInterpolant","loop","_loopCount","_startTime","_effectiveTimeScale","_effectiveWeight","repetitions","paused","clampWhenFinished","zeroSlopeAtStart","zeroSlopeAtEnd","play","_activateAction","_deactivateAction","stopFading","stopWarping","isRunning","_isActiveAction","isScheduled","startAt","setLoop","setEffectiveWeight","getEffectiveWeight","fadeIn","_scheduleFading","fadeOut","crossFadeFrom","fadeOutAction","warp","fadeInDuration","fadeOutDuration","startEndRatio","endStartRatio","crossFadeTo","fadeInAction","weightInterpolant","_takeBackControlInterpolant","setEffectiveTimeScale","getEffectiveTimeScale","setDuration","syncWith","action","halt","startTimeScale","endTimeScale","_lendControlInterpolant","timeScaleInterpolant","getMixer","getClip","getRoot","_root","_update","deltaTime","timeDirection","_updateWeight","timeRunning","_updateTimeScale","clipTime","_updateTime","propertyMixers","interpolantValue","loopCount","pingPong","_setEndings","handle_stop","loopDelta","pending","atStart","atEnd","weightNow","weightThen","_controlInterpolantsResultBuffer","AnimationMixer","_initMemoryManager","_accuIndex","_bindAction","prototypeAction","rootUuid","bindingsByRoot","_bindingsByRootAndName","bindingsByName","_addInactiveBinding","create","clipUuid","actionsForClip","_actionsByClip","knownActions","_addInactiveAction","_lendBinding","_lendAction","_takeBackBinding","_takeBackAction","_actions","_nActiveActions","_nActiveBindings","_controlInterpolants","_nActiveControlInterpolants","stats","actions","inUse","controlInterpolants","actionsByClip","actionByRoot","_removeInactiveAction","lastInactiveAction","cacheIndex","knownActionsForClip","lastKnownAction","byClipCacheIndex","_removeInactiveBindingsForAction","_removeInactiveBinding","prevIndex","lastActiveIndex","firstInactiveAction","firstInactiveIndex","lastActiveAction","bindingByName","propBinding","lastInactiveBinding","firstInactiveBinding","lastActiveBinding","__cacheIndex","lastActiveInterpolant","clipAction","optionalRoot","clipObject","findByName","existingAction","newAction","stopAllAction","nActions","nBindings","setTime","timeInSeconds","uncacheClip","actionsToRemove","uncacheRoot","uncacheAction","Raycaster","LOD","setFromCamera","coords","intersectObject","ascSort","intersectObjects","_tables","_generateTables","floatView","uint32View","baseTable","shiftTable","mantissaTable","exponentTable","offsetTable","DataUtils","fromHalfFloat","val","toHalfFloat","toTrianglesDrawMode","drawMode","numberOfTriangles","newIndices","newGeometry","revision","window","__THREE__","GLTFLoader","dracoLoader","ktx2Loader","meshoptDecoder","pluginCallbacks","register","parser","GLTFMaterialsClearcoatExtension","GLTFTextureBasisUExtension","GLTFTextureWebPExtension","GLTFMaterialsSheenExtension","GLTFMaterialsTransmissionExtension","GLTFMaterialsVolumeExtension","GLTFMaterialsIorExtension","GLTFMaterialsEmissiveStrengthExtension","GLTFMaterialsSpecularExtension","GLTFMaterialsIridescenceExtension","GLTFLightsExtension","GLTFMeshoptCompression","GLTFMeshGpuInstancing","extractUrlBase","_onError","setDRACOLoader","setDDSLoader","setKTX2Loader","setMeshoptDecoder","unregister","plugins","textDecoder","BINARY_EXTENSION_HEADER_MAGIC","EXTENSIONS","KHR_BINARY_GLTF","GLTFBinaryExtension","content","asset","GLTFParser","fileLoader","plugin","extensionsUsed","extensionName","extensionsRequired","KHR_MATERIALS_UNLIT","GLTFMaterialsUnlitExtension","KHR_DRACO_MESH_COMPRESSION","GLTFDracoMeshCompressionExtension","KHR_TEXTURE_TRANSFORM","GLTFTextureTransformExtension","KHR_MESH_QUANTIZATION","GLTFMeshQuantizationExtension","setExtensions","setPlugins","parseAsync","GLTFRegistry","removeAll","KHR_LIGHTS_PUNCTUAL","KHR_MATERIALS_CLEARCOAT","KHR_MATERIALS_IOR","KHR_MATERIALS_SHEEN","KHR_MATERIALS_SPECULAR","KHR_MATERIALS_TRANSMISSION","KHR_MATERIALS_IRIDESCENCE","KHR_MATERIALS_VOLUME","KHR_TEXTURE_BASISU","KHR_MATERIALS_EMISSIVE_STRENGTH","EXT_TEXTURE_WEBP","EXT_MESHOPT_COMPRESSION","EXT_MESH_GPU_INSTANCING","refs","uses","_markDefs","nodeDefs","nodeIndex","nodeLength","nodeDef","_addNodeRef","_loadLight","lightIndex","dependency","lightDef","lightNode","innerConeAngle","outerConeAngle","assignExtrasToUserData","createUniqueName","getDependency","createNodeAttachment","_getNodeRef","getMaterialType","extendParams","materialParams","materialDef","metallicRoughness","pbrMetallicRoughness","baseColorFactor","baseColorTexture","assignTexture","all","extendMaterialParams","emissiveStrength","clearcoatFactor","clearcoatTexture","clearcoatRoughnessFactor","clearcoatRoughnessTexture","clearcoatNormalTexture","iridescenceFactor","iridescenceTexture","iridescenceIor","iridescenceThicknessTexture","sheenColorFactor","sheenRoughnessFactor","sheenColorTexture","sheenRoughnessTexture","transmissionFactor","transmissionTexture","thicknessFactor","thicknessTexture","colorArray","specularFactor","specularTexture","specularColorFactor","specularColorTexture","textureIndex","textureDef","loadTextureImage","isSupported","textureLoader","uri","handler","detectSupport","loadBufferView","bufferView","bufferViews","extensionDef","supported","byteOffset","byteStride","decodeGltfBufferAsync","ready","decodeGltfBuffer","createNodeMesh","meshDef","meshes","primitive","primitives","WEBGL_CONSTANTS","TRIANGLES","TRIANGLE_STRIP","TRIANGLE_FAN","attributesDef","accessor","nodeObject","instancedMeshes","TRANSLATION","ROTATION","SCALE","attributeName","assignFinalMaterial","BINARY_EXTENSION_CHUNK_TYPES","headerView","header","magic","getUint32","chunkContentsLength","chunkView","chunkIndex","chunkLength","chunkType","contentArray","preload","decodePrimitive","bufferViewIndex","gltfAttributeMap","threeAttributeMap","attributeNormalizedMap","attributeTypeMap","threeAttributeName","ATTRIBUTES","accessorDef","accessors","componentType","WEBGL_COMPONENT_TYPES","decodeDracoFile","extendTexture","texCoord","GLTFCubicSplineInterpolant","stride2","stride3","td","m0","m1","_q","GLTFCubicSplineQuaternionInterpolant","FLOAT","FLOAT_MAT3","FLOAT_MAT4","FLOAT_VEC2","FLOAT_VEC3","FLOAT_VEC4","LINEAR","REPEAT","SAMPLER_2D","POINTS","LINES","LINE_LOOP","LINE_STRIP","UNSIGNED_BYTE","UNSIGNED_SHORT","WEBGL_FILTERS","WEBGL_WRAPPINGS","WEBGL_TYPE_SIZES","SCALAR","VEC2","VEC3","VEC4","MAT2","MAT3","MAT4","POSITION","NORMAL","TANGENT","TEXCOORD_0","TEXCOORD_1","COLOR_0","WEIGHTS_0","JOINTS_0","PATH_PROPERTIES","translation","INTERPOLATION","CUBICSPLINE","STEP","ALPHA_MODES","addUnknownExtensionsToUserData","knownExtensions","objectDef","gltfExtensions","gltfDef","extras","targetNames","createPrimitiveKey","primitiveDef","dracoExtension","geometryKey","createAttributesKey","attributesKey","getNormalizedComponentScale","associations","primitiveCache","meshCache","cameraCache","lightCache","sourceCache","textureCache","nodeNamesUsed","isSafari","isFirefox","firefoxVersion","_invokeAll","ext","beforeRoot","getDependencies","dependencies","scenes","afterRoot","skinDefs","skins","meshDefs","skinLength","skin","ref","updateMappings","original","mappings","_invokeOne","func","loadScene","loadNode","loadMesh","loadAccessor","loadBuffer","loadMaterial","loadSkin","loadAnimation","loadCamera","defs","def","bufferIndex","bufferDef","bufferViewDef","accessorIndex","sparse","TypedArray","pendingBufferViews","elementBytes","itemBytes","ibSlice","ibCacheKey","itemSizeIndices","TypedArrayIndices","byteOffsetIndices","byteOffsetValues","sparseIndices","sparseValues","sourceIndex","sourceDef","sampler","promise","loadImageSource","samplers","URL","webkitURL","sourceURI","isObjectURL","Blob","createObjectURL","revokeObjectURL","getImageURIMimeType","search","mapName","mapDef","gltfReference","useDerivativeTangents","useVertexColors","useFlatShading","pointsMaterial","lineMaterial","materialType","kmuExtension","metallicFactor","roughnessFactor","metallicRoughnessTexture","alphaMode","alphaCutoff","normalTexture","occlusionTexture","strength","emissiveFactor","emissiveTexture","originalName","sanitizedName","sanitizeNodeName","loadGeometries","createDracoPrimitive","addPrimitiveAttributes","geometryPromise","meshIndex","cameraIndex","cameraDef","yfov","aspectRatio","znear","zfar","xmag","ymag","skinDef","inverseBindMatrices","jointNodes","jointNode","animationIndex","animationDef","pendingNodes","pendingInputAccessors","pendingOutputAccessors","pendingSamplers","pendingTargets","channels","input","inputAccessors","outputAccessors","targets","inputAccessor","outputAccessor","targetName","outputArray","scaled","InterpolantFactoryMethodGLTFCubicSpline","isInterpolantFactoryMethodGLTFCubicSpline","objectPending","meshPromise","childPending","childrenDef","skeletonPending","sceneIndex","sceneDef","nodeIds","reducedAssociations","reduceAssociations","assignAttributeAccessor","gltfAttributeName","computeBounds","boxScale","maxDisplacement","addMorphTargets","hasMorphNormal","hasMorphColor","pendingPositionAccessors","pendingNormalAccessors","pendingColorAccessors","pendingAccessor","morphPositions","baseScale","preferredSystem","preferredColorset","cache_hits","cache_misses","loaderGLTF","fontLoadingPromises","baseTextureCache","systems","i18n","localize","dice","spectrum","foundry_vtt","dot_b","preset","addDicePreset","CONFIG","Dice","terms","Coin","FateDie","Die","objTerm","internalAddDicePreset","initializeMaterials","material_options","plastic","scopedOptions","glass","chrome","pristine","setScale","setQualitySettings","config","bumpMapping","aa","antialiasing","glow","useHighDPI","shadowQuality","findIndex","el","waitForLoad","userID","activePresets","preloadPresetsByUser","user","getFlag","duplicate","obj","hasOwnProperty","getPresetBySystem","users","promiseArray","addSystem","find","substr","FontConfig","getAvailableFonts","loadFont","editor","fonts","DENOMINATION","getResultLabel","disposeCachedMaterials","timeout","race","scopedTextureCache","isGhost","dicemesh","scopedScale","geom","createGeometry","cannon_shape","THREE.AnimationMixer","materialData","generateMaterialData","baseTextureCacheString","cacheString","createMaterials","THREE.Mesh","THREE.Color","rerolls","resultReason","factory","getFaceValue","closest_face","reason","THREE.Vector3","faceCannon","closest_angle","body_sim","faceNormals","notation","dieValue","labelIndex","storeRolledValue","getLastValue","setLastValue","dice_texture","materialSelected","THREE.MeshPhongMaterial","THREE.MeshStandardMaterial","THREE.MeshLambertMaterial","THREE.MeshPhysicalMaterial","textureCube","createElement","globalAlpha","canvasBump","contextBump","canvasEmissive","contextEmissive","labelsTotal","isHeritedFromShape","texturesPerLine","sizeTexture","ts","calc_texture_size","texturesOnThisLine","createTextMaterial","startI","THREE.CanvasTexture","needUpdate","forecolor","outlinecolor","backcolor","fillStyle","fillRect","save","beginPath","rect","globalCompositeOperation","restore","textAlign","textBaseline","shadowColor","shadowOffsetX","shadowOffsetY","shadowBlur","fontsize","textstarty","textstartx","lineHeight","textlines","pixiStyle","PIXI","TextStyle","fontFamily","fontSize","stroke","strokeThickness","TextMetrics","measureText","textline","strokeStyle","strokeText","fillText","hw","hh","wShift","hShift","destX","destY","textureSize","getAppearanceForDice","appearances","dicetype","dicenotation","colorsetData","getColorSet","opt","flavor","ghost","colorindex","baseTexture","approx","typeScale","create_d2_geometry","create_d4_geometry","create_d6_geometry","create_d8_geometry","create_d10_geometry","create_d12_geometry","create_d14_geometry","create_d16_geometry","create_d20_geometry","create_d24_geometry","create_d30_geometry","load_geometry","bufferGeometry","THREE.BufferGeometryLoader","CANNON","Cylinder","create_geom","create_geom_dcc","create_shape","cv","Vec3","ConvexPolyhedron","vectors","create_shape_dcc","DiceSFX","nameLocalized","_name","isGlobal","muteSound","destroyed","enableGC","renderReady","volume","secretRoll","muteSoundSecretRolls","sfxLine","dialogContent","disabled","isGM","PlaySoundEpicFail","audio","AudioHelper","preloadSound","PlaySoundEpicWin","Proton","preParticles","integrationType","Util","initValue","POOL_MAX","EULER","emitters","renderers","pool","Pool","integrator","Integration","initialize","TIME_STEP","DR","MEASURE","RK2","RK4","VERLET","PARTICLE_CREATED","PARTICLE_UPDATE","PARTICLE_SLEEP","PARTICLE_DEAD","PROTON_UPDATE","PROTON_UPDATE_AFTER","EMITTER_ADDED","EMITTER_REMOVED","bindEmtterEvent","addRender","removeRender","addEmitter","emitter","removeEmitter","$delta","getCount","particles","removeAllEventListeners","arr","eventName","eventTarget","ret","defaults","destroyArray","destroyObject","isUndefined","arg","setVectorByObj","pOBJ","setPrototypeByObj","proObj","filters","_getValue","pan","Span","inherits","subClass","superClass","_super_","F","ColorUtil","store","THREEUtil","toScreenPos","pos","toSpacePos","img","THREE.Texture","PUID","_uids","nid","str","Particle","ID","cID","getDirection","life","age","energy","dead","sleep","useColor","useAlpha","easing","ease","setEasingByName","easeLinear","Vector3D","old","behaviours","removeAllBehaviours","applyBehaviour","addBehaviour","behaviour","addBehaviours","removeBehaviour","puid","__puid","expire","_getList","uid","randomAToB","INT","randomFloating","randomZone","degreeTransform","toColor16","num","axisRotate","tha","addValue","integrate","damping","particle","getGradient","eulerFromDir","Polar3D","_isArray","ArraySpan","colors","_arr","setRadius","setPhi","setTheta","toVector3D","createSpan","createArraySpan","Box","Behaviour","Rate","numPan","timePan","nextTime","Initialize","contains","normalizeForce","normalizeValue","InitializeUtil","initializes","bindEmitter","Life","lifePan","Position","Velocity","dirVec","Mass","massPan","Radius","Body","Force","fx","fy","fz","Attraction","targetPosition","radiusSq","attractionForce","RandomDrift","driftX","driftY","driftZ","delay","Repulsion","Gravity","Collision","useMass","CrossZone","Alpha","Scale","Rotate","Spring","spring","friction","Emitter","pObj","currentEmitTime","totalEmitTimes","rate","BehaviourEmitter","selfBehaviours","FollowEmitter","mouseTarget","_allowEmitting","mouse","initEventHandler","zones","args","addZone","zone","getPosition","P","radiusPan","_useV","vr","V","oldRadius","randomFoce","delayPan","G","otherParticle","overlap","averageMass1","averageMass2","_getAverageMass","aPartcile","bParticle","crossType","crossing","_same","alphaA","alphaB","scaleA","scaleB","_type","_setRotation","fR","tR","addR","vec3","colorA","colorB","emit","stopEmit","removeAllParticles","createParticle","setupParticle","addSelfInitialize","initAll","addInitialize","removeInitialize","initializer","removeInitializers","emitting","addSelfBehaviour","removeSelfBehaviour","mousemoveHandler","mousemove","mousedownHandler","mousedown","mouseupHandler","mouseup","setCameraAndCanvas","setCameraAndRenderer","getBoundingClientRect","clientX","clientY","ratio","vec2","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInSine","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInBack","easeOutBack","easeInOutBack","easeName","BaseRender","MeshRender","_targetPool","_materialPool","_body","THREE.BoxGeometry","PointsRender","ps","SpriteRender","THREE.Sprite","THREE.SpriteMaterial","CustomRender","targetPool","materialPool","Zone","LineZone","SphereZone","MeshZone","toBufferGeometry","PointZone","BoxZone","ScreenZone","dis","proton","onProtonUpdate","onParticleCreated","onParticleUpdate","onParticleDead","_bound","_cross","_dead","rVector","_static","once","Debug","fun","drawZone","THREE.SphereGeometry","THREE.MeshBasicMaterial","drawEmitter","THREE.OctahedronGeometry","renderInfo","getCreatedNumber","addInfo","_infoType","getEmitterPos","_infoCon","innerHTML","bg","cssText","parentNode","appendChild","PlayAnimationParticleSpiral","loadAsset","DiceSFXManager","sound","R","emitter1","createEmitter","emitter2","animateEmitter","PlayAnimationParticleSparkles","THREE.Box3","PlayAnimationParticleVortex","THREE.PlaneGeometry","dicefactory","PlayAnimationBright","brightColor","glowingMesh","clock","THREE.Clock","baseColor","baseMaterial","sfxMaterial","PlayAnimationDark","darkColor","PlayAnimationThormund","thormund","curve","THREE.CatmullRomCurve3","curve2","duration1","duration2","PlayAnimationImpact","planeImpact","SFX_MODE_CLASS","PlayAnimationOutline","outlinePass","selectedObjects","PlayConfettiStrength1","confetti","confettiStrength","shootConfettiProps","getShootConfettiProps","handleShootConfetti","PlayConfettiStrength2","med","PlayConfettiStrength3","PlaySoundCustom","getDialogContent","PlayMacro","macro","macros","macroId","execute","permissionLevel","CONST","DOCUMENT_PERMISSION_LEVELS","OBSERVER","ENTITY_PERMISSIONS","macroList","testUserPermission","SFX_MODE_LIST","SFX_CLASS","EXTRA_TRIGGER_TYPE","EXTRA_TRIGGER_RESULTS","renderQueue","garbageCollector","sfx","startsWith","modules","active","specialEffectName","THREE.TextureLoader","sfxUniqueList","sfxList","specialEffect","sfxClassName","addSFXMode","initialized","playSFX","sfxInstance","renderSFX","queue","endSFX","_afterShow","clearQueue","RGBELoader","rgbe_error","rgbe_error_code","msg","fgets","lineLimit","consume","chunk","RGBEByteToRGBFloat","sourceOffset","destArray","destOffset","RGBEByteToRGBHalf","byteArray","rgbe_header_info","gamma_re","exposure_re","format_re","dimensions_re","comments","programtype","gamma","exposure","RGBE_ReadHeader","image_rgba_data","scanline_width","data_rgba","ptr_end","rgbeStart","scanline_buffer","num_scanlines","ptr","isEncodedRun","byteValue","off","RGBE_ReadPixels_RLE","numElements","floatArray","halfArray","setDataType","onLoadCallback","CopyShader","tDiffuse","Pass","needsSwap","renderToScreen","_camera","FullScreenQuad","ShaderPass","textureID","fsQuad","writeBuffer","readBuffer","MaskPass","writeValue","clearValue","REPLACE","ALWAYS","EQUAL","KEEP","ClearMaskPass","EffectComposer","renderTarget1","renderTarget2","passes","copyPass","swapBuffers","addPass","pass","insertPass","removePass","isLastEnabledPass","passIndex","maskActive","NOTEQUAL","effectiveWidth","effectiveHeight","RenderPass","_oldClearColor","oldAutoClear","oldClearAlpha","oldOverrideMaterial","OutlinePass","renderCamera","visibleEdgeColor","hiddenEdgeColor","edgeGlow","usePatternTexture","edgeThickness","edgeStrength","downSampleRatio","pulsePeriod","_visibilityCache","resx","resy","renderTargetMaskBuffer","prepareMaskMaterial","getPrepareMaskMaterial","replaceDepthToViewZ","renderTargetDepthBuffer","renderTargetMaskDownSampleBuffer","renderTargetBlurBuffer1","renderTargetBlurBuffer2","edgeDetectionMaterial","getEdgeDetectionMaterial","renderTargetEdgeBuffer1","renderTargetEdgeBuffer2","separableBlurMaterial1","getSeperableBlurMaterial","separableBlurMaterial2","overlayMaterial","getOverlayMaterial","copyShader","copyUniforms","materialCopy","tempPulseColor1","tempPulseColor2","textureMatrix","changeVisibilityOfSelectedObjects","bVisible","gatherSelectedMeshesCallBack","changeVisibilityOfNonSelectedObjects","selectedMeshes","VisibilityChangeCallBack","bFound","updateTextureMatrix","BlurDirectionX","BlurDirectionY","patternTexture","cameraNearFar","maskTexture","texSize","maxRadius","MAX_RADIUS","kernelRadius","edgeTexture1","edgeTexture2","SMAAEdgesShader","SMAA_THRESHOLD","SMAAWeightsShader","SMAA_MAX_SEARCH_STEPS","SMAA_AREATEX_MAX_DISTANCE","SMAA_AREATEX_PIXEL_SIZE","SMAA_AREATEX_SUBTEX_SIZE","tArea","tSearch","SMAABlendShader","tColor","SMAAPass","edgesRT","weightsRT","areaTextureImage","getAreaTexture","areaTexture","searchTextureImage","getSearchTexture","searchTexture","uniformsEdges","materialEdges","uniformsWeights","materialWeights","uniformsBlend","materialBlend","GammaCorrectionShader","LuminosityHighPassShader","luminosityThreshold","smoothWidth","defaultColor","defaultOpacity","TransparentUnrealBloomPass","renderTargetsHorizontal","renderTargetsVertical","nMips","renderTargetBright","renderTargetHorizonal","renderTargetVertical","highPassShader","highPassUniforms","materialHighPassFilter","separableBlurMaterials","kernelSizeArray","compositeMaterial","getCompositeMaterial","bloomTintColors","inputRenderTarget","KERNEL_RADIUS","SIGMA","NUM_MIPS","blurTexture1","blurTexture2","blurTexture3","blurTexture4","blurTexture5","dirtTexture","bloomStrength","bloomFactors","bloomRadius","DiceBox","element_container","dice_factory","known_types","dimensions","speed","isVisible","last_time","allowInteractivity","THREE.Raycaster","blackColor","nbIterationsBetweenRolls","currentWidth","currentHeight","containerWidth","containerHeight","THREE.Vector2","startDrag","startDragTime","constraintDown","constraint","cameraHeight","medium","world_sim","World","dice_body_material","desk_body_material","barrier_body_material","sounds_table","sounds_dice","sounds_coins","lastSoundType","lastSoundStep","lastSound","iteration","barrier","light_amb","desk","pane","public_interface","diceList","deadDiceList","framerate","sounds","soundDelay","soundsSurface","animstate","throwingForce","immersiveDarkness","toneMappingExposureDefault","selector","animate","intersected","showExtraDice","spotlight","ground","rethrowFunctions","afterThrowFunctions","preloadSounds","resources","spritemap","playAudioSprite","selfVolume","gainNode","createGain","gain","sampleSource","createBufferSource","destination","currentTime","preloadPresets","soundsVolume","boxType","globalAnimationSpeed","THREE.Scene","dice3dRenderers","THREE.WebGLRenderer","devicePixelRatio","loadContextScopedTextures","setScene","gravity","broadphase","NaiveBroadphase","solver","iterations","allowSleep","contactMaterial","ContactMaterial","restitution","addContactMaterial","addBody","jointBody","addShape","collisionFilterGroup","collisionFilterMask","roughnessMap_fingerprint","roughnessMap_wood","roughnessMap_metal","roughnessMap_stone","THREE.PMREMGenerator","THREE.CubeTextureLoader","clientWidth","clientHeight","autoscale","THREE.PerspectiveCamera","maxwidth","intensity_amb","THREE.HemisphereLight","THREE.DirectionalLight","shadowplane","THREE.ShadowMaterial","canvasSize","bloomPass","bloomThreshold","gammaPass","composerTarget","THREE.WebGLRenderTarget","bloomComposer","blendingPass","THREE.ShaderMaterial","bloomTexture","finalComposer","AAPass","vectorRand","getVectors","notationVectors","dist","projector","velocity","velvec","swapDiceFace","forcedResult","rotIndex","rotationDegrees","eulerAngle","THREE.Euler","THREE.MathUtils","THREE.Quaternion","spawnDice","dicedata","vectordata","startAtIteration","stopped","specialEffects","sleepSpeedLimit","sleepTimeLimit","DYNAMIC","linearDamping","angularDamping","eventCollide","stepQuaternions","stepPositions","diceType","diceMaterial","secret","glowingInDarkness","darknessLevel","objectContainer","THREE.Group","world","stepnumber","currentSoundType","detectedCollides","surface","soundlist","throwFinished","worldType","minIterations","iterationsNeeded","sleepState","updateMassProperties","simulateThrow","rolling","bodies","animateThrow","getTime","time_diff","neededSteps","animatedDiceDetected","meshCannon","worldAsleep","rendererStats","handleSpecialEffectsInit","throws","removeTicker","start_throw","countNewDice","throwingForceModifier","maxDiceNumber","clearAll","rollDice","clearDice","animateSelector","hasEmissive","clearScene","ticker","app","_head","_cancelIfNeeded","dsnConfig","showcase","selectordice","extraDiceTypes","die","proportion","columns","start_time","elapsed","angle_change","body2mesh","THREE.Object3D","currentMaterial","Shape","types","SPHERE","sphere_geometry","PARTICLE","particleGeo","particleMaterial","particleSize","PLANE","submesh","BOX","box_geometry","halfExtents","CONVEXPOLYHEDRON","geo","THREE.BufferGeometry","shapeOffsets","shapeOrientations","findRootObject","findShowcaseDie","findHoveredDie","hoveredDie","onMouseMove","ndc","onMouseDown","entity","stopPropagation","mouseInteractionManager","interactive","vsub","pivot","vmult","PointToPointConstraint","addConstraint","onMouseUp","removeConstraint","activate","promisesSFX","DiceNotation","rolls","userConfig","cnt","number","countExploded","localNbThrow","exploded","indexThrow","discarded","diceNumber","some","hidden","modifiers","addDie","fvttDie","isd10of100","dsnDie","resultLabel","d100Result","enableFlavorColorset","mergedRollCommands","command","manualResultTrigger","onResult","Accumulator","onEnd","_timeout","_delay","_onEnd","_items","addItem","item","clearTimeout","Utils","userSettings","setFlag","formatversion","ui","notifications","migrated","newSettings","DEFAULT_OPTIONS","insertKeys","insertValues","DEFAULT_APPEARANCE","unsetFlag","cfg","reduce","i18nCfg","fontList","auto","getAvailableFontChoices","groupedSetsList","set1","set2","preparedList","locCategory","predicate","saves","savesObject","saveObject","fromEntries","ThinFilmFresnelMap","filmThickness","refractiveIndexFilm","refractiveIndexBase","_filmThickness","_refractiveIndexFilm","_refractiveIndexBase","_size","_data","_updateData","updateSettings","_fresnelRefl","refractiveIndex1","refractiveIndex2","cos1","cos2","sin1Sqr","refrRatio","sqrRefrRatio","r_p","r_s","yFit_1931","zFit_1931","t3","phi12","phi21","phi23","R12","T12","R23","R_bi","T_tot","R_star","R_bi_sqr","R_12_star","R_star_t_tot","refrRatioSqr","refrRatioSqrBase","cosThetaI","cosThetaT","cosThetaT2","pathDiff","pathDiff2PI","totX","totY","totZ","waveLen","deltaPhase","cosPhiX","cosPhiY","DiceTour","Tour","querySelector","MutationObserver","mutations","observer","querySelectorAll","observe","childList","subtree","_preStep","waitForElement","currentStep","_postStep","stepIndex","hasNext","triggerReset","click","scrollIntoView","block","inline","DiceTourMain","title","canBeResumed","steps","$","addClass","Dice3D","quality","imageQuality","webGLVersion","defaultShowExtraDice","hideAfterRoll","timeBeforeHide","hideFX","canvasZIndex","showOthersSFX","rollingArea","contrastOf","userAppearance","sfxArray","SFX","other","GMSFX","APPEARANCE","addTexture","textureData","textureEntry","initColorSets","addSFXTrigger","actionLoadSave","board","exports","hiddenAnimationQueue","_buildCanvas","_initListeners","_buildDiceBox","_loadFonts","_startQueueHandler","_nextAnimationHandler","_welcomeMessage","_registerTours","canInteract","sidebarWidth","sidebarOffset","innerWidth","area","innerHeight","css","appendTo","after","ALL_CONFIG","_rtime","resize","_resizeEnd","on","ev","menus","currentTarget","dataset","tours","socket","request","show","_onMouseMove","_onMouseDown","_onMouseUp","_mouseNDC","_beforeShow","is","hide","resizeAndRebuild","setInterval","chatData","whisper","speaker","alias","flags","core","canPopout","ChatMessage","implementation","createDocuments","combatEnabled","combat","started","renderRolls","chatMessage","showMessage","_dice3danimating","chat","removeClass","sidebar","popouts","scrollBottom","popout","orderedDiceList","roll","diceTerm","rollOrder","rollList","plus","OperatorTerm","operator","termList","fromTerms","recursShowForRoll","showForRoll","synchronize","blind","messageID","actor","actors","messages","isContentVisible","hookedRoll","dsnRoll","ALL_CUSTOMIZATION","timestamp","_showAnimation","displayed","showExtraDiceByDefault","waitFor3DAnimationByMessageID","targetMessageId","buildHook","messageId","nextAnimation","timing","items","commands","mergeQueuedRollCommands","aThrow","timeoutHandle","fail","DiceConfig","FormApplication","defaultOptions","template","closeOnSubmit","tabs","navSelector","contentSelector","initial","fxList","speedList","textureList","prepareTextureList","materialList","prepareFontList","colorsetList","prepareColorsetList","imageQualityList","shadowQualityList","antialiasingList","smaa","msaa","systemList","prepareSystemList","soundsSurfaceList","felt","wood_table","wood_tray","canvasZIndexList","over","under","throwingForceList","weak","strong","ALL_DEFAULT_OPTIONS","navOrder","triggerTypeList","possibleResultList","termClass","option","specialEffectsList","specialEffectsPromises","registeredTriggerTypes","trigger","hdbsTemplate","Handlebars","renderTemplate","specialEffectsMode","html","tabsList","tabsAppearance","tabsPromises","navAppearance","displayHint","lastActiveAppearanceTab","initializationData","currentGlobalAppearance","sfxDialogList","templateSelect2","parentElement","sfxResultDicetype","select2Options","dropdownCssClass","escapeMarkup","dropdownParent","templateResult","templateSelection","activateListeners","append","toggleHideAfterRoll","toggleAutoScale","toggleCustomization","filterSystems","setPreferredOptions","select2dsn","onApply","toggleSounds","toggleCustomColors","onReset","closeAppearanceTab","getShowcaseAppearance","denominationList","Roll","getShowcaseSFX","customization","firstSFX","parents","each","attr","sfxLineOptions","Dialog","buttons","ok","icon","default","detach","dialog","appId","optionHTML","frag","empty","prevAll","fp","onclick","_activateFilePicker","saveList","dialogSaveAs","actionSaveAs","actionDeleteSave","prop","classes","no","import","form","readTextFromFile","actionImportFromJSON","filename","actionExportToJSON","saveDataToFile","actionExportSFXToJSON","activateAppearanceTab","tabName","insertBefore","htmlNavString","submit","preventClose","preventRender","_tabs","triggerCallback","_onChangeTab","_contentSelector","appearanceArray","diffObject","checked","customizationElements","colorsetForce","indexOpt","elementOpt","parseInputs","retloop","part","formData","dataArr","currentSettings","setting","reload","_onSubmit","RollableAreaConfig","$diceBox","_onRestore","resizing","prevX","prevY","newX","newY","resizers","resizer","classList","saveSettingsAndRebuild","debouncedReload","debounce","registerMenu","hint","restricted","choices","onChange","Boolean","migrateOldSettings","updated","logger","hasInlineRoll","isRoll","messageHookDisabled","maxRollOrder","JqInlineRolls","parseHTML","inlineRollList","unescape","diceterm","PoolTerm","fromRolls","_countNewRolls","updateData","dsnCountAddedRoll","toObject","anim"],"mappings":"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OAAQ,CACJ,uDACA,uDACA,uDACA,wDAEJI,aAAc,CACV,uDACA,uDACA,uDACA,wDAEJhC,SAAU,SACVkD,SAAU,mBACVb,OAAQ,aAGZoF,EAAmB1D,KAAK,CACpBvC,KAAM,KACNI,OAAQ,CACJ,uDACA,uDACA,uDACA,uDACA,uDACA,wDAEJI,aAAc,CACV,uDACA,uDACA,uDACA,uDACA,uDACA,wDAEJhC,SAAU,SACVkD,SAAU,mBACVb,OAAQ,aAGZoF,EAAmB1D,KAAK,CACpBvC,KAAM,KACNI,OAAQ,CACJ,uDACA,uDACA,uDACA,uDACA,uDACA,uDACA,uDACA,wDAEJI,aAAc,CACV,uDACA,uDACA,uDACA,uDACA,uDACA,uDACA,uDACA,wDAEJhC,SAAU,SACVkD,SAAU,mBACVb,OAAQ,aAGZoF,EAAmB1D,KAAK,CACpBvC,KAAM,MACNI,OAAQ,CACJ,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,yDAEJI,aAAc,CACV,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,yDAEJhC,SAAU,SACVkD,SAAU,mBACVb,OAAQ,aAGZoF,EAAmB1D,KAAK,CACpBvC,KAAM,MACNI,OAAQ,CACJ,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,yDACA,yDACA,0DAEJI,aAAc,CACV,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,yDACA,yDACA,0DAEJhC,SAAU,SACVkD,SAAU,mBACVb,OAAQ,aAGZoF,EAAmB1D,KAAK,CACpBvC,KAAM,OACNI,OAAQ,CACJ,0DACA,0DACA,0DACA,0DACA,0DACA,0DACA,0DACA,0DACA,0DACA,2DAEJI,aAAc,CACV,0DACA,0DACA,0DACA,0DACA,0DACA,0DACA,0DACA,0DACA,0DACA,2DAEJhC,SAAU,SACVkD,SAAU,mBACVb,OAAQ,aAGZoF,EAAmB1D,KAAK,CACpBvC,KAAM,MACNI,OAAQ,CACJ,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wDACA,wD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Q,eACRoP,MAAS,CAAC,mBAAoB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,oBAAqB,kBAAmB,qBAAsB,iBAAkB,iBAAkB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,oBAAqB,kBAAmB,oBAAqB,iBAAkB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,cAAe,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBACrrKC,YAAc,GAEhBG,MAAS,CACPL,SAAY,EACZnP,KAAQ,cACRoP,MAAS,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,OACpsGC,YAAc,IAGlBI,MAAS,CACPzP,KAAQ,cACRoP,MAAS,CAAC,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,GAAG,EAAE,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,I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B,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBACtmLC,YAAc,GAEhBC,OAAU,CACRH,SAAY,EACZnP,KAAQ,eACRoP,MAAS,CAAC,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,oBAAsB,qBAAuB,kBAAoB,oBAAsB,qBAAuB,kBAAoB,oBAAsB,qBAAuB,kBAAoB,oBAAsB,qBAAuB,kBAAoB,oBAAsB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,qBAAuB,oBAAsB,mBAAqB,qBAAuB,oBAAsB,mBAAqB,qBAAuB,oBAAsB,mBAAqB,qBAAuB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,kBAAoB,qBAAuB,mBAAqB,oBAAsB,qBAAuB,mBAAqB,oBAAsB,qBAAuB,mBAAqB,oBAAsB,qBAAuB,mBAAqB,qBAAuB,qBAAuB,kBAAoB,oBAAsB,qBAAuB,kBAAoB,oBAAsB,qBAAuB,kBAAoB,oBAAsB,qBAAuB,kBAAoB,mBAAqB,mBAAqB,qBAAuB,oBAAsB,mBAAqB,qBAAuB,oBAAsB,mBAAqB,qBAAuB,oBAAsB,mBAAqB,qBAAuB,oBAAsB,qBAAuB,qBAAuB,kBAAoB,qBAAuB,qBAAuB,kBAAoB,qBAAuB,qBAAuB,kBAAoB,qBAAuB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,qBAAuB,mBAAqB,qBAAuB,qBAAuB,mBAAqB,qBAAuB,qBAAuB,mBAAqB,qBAAuB,qBAAuB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,qBAAuB,qBAAuB,oBAAsB,mBAAqB,qBAAuB,oBAAsB,mBAAqB,qBAAuB,oBAAsB,mBAAqB,qBAAuB,oBAAsB,mBAAqB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,oBAAsB,oBAAsB,oBAAsB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,oBAAsB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,oBAAsB,qBAAuB,oBAAsB,kBAAoB,qBAAuB,oBAAsB,kBAAoB,qBAAuB,oBAAsB,kBAAoB,qBAAuB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,qBAA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,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO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,kBAAoB,iBAAmB,mBAAqB,kBAAoB,iBAAmB,mBAAqB,kBAAoB,iBAAmB,mBAAqB,kBAAoB,iBAAmB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,iBAAmB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kB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MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,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AkB,mBAAmB,qBAAsB,kBAAkB,mBAAmB,qBAAsB,kBAAkB,mBAAmB,qBAAsB,kBAAkB,oBAAoB,oBAAqB,kBAAkB,oBAAoB,oBAAqB,kBAAkB,oBAAoB,oBAAqB,kBAAkB,oBAAoB,oBAAqB,mBAAmB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,mBAAoB,mBAAmB,kBAAkB,mBAAoB,mBAAmB,kBAAkB,mBAAoB,mBAAmB,kBAAkB,mBAAoB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,mBAAmB,gBAAgB,oBAAoB,mBAAmB,gBAAgB,oBAAoB,mBAAmB,gBAAgB,oBAAoB,mBAAmB,gBAAgB,oBAAoB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,kBAAmB,mBAAmB,iBAAiB,kBAAmB,mBAAmB,iBAAiB,kBAAmB,mBAAmB,iBAAiB,kBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,oBAAoB,mBAAmB,oBAAqB,mBAAmB,mBAAmB,oBAAqB,mBAAmB,mBAAmB,oBAAqB,mBAAmB,mBAAmB,oBAAqB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAoB,mBAAmB,kBAAkB,mBAAoB,mBAAmB,kBAAkB,mBAAoB,mBAAmB,kBAAkB,mBAAoB,mBAAmB,kBAAkB,oBAAoB,qBAAsB,mBAAmB,oBAAoB,qBAAsB,mBAAmB,oBAAoB,qBAAsB,mBAAmB,oBAAoB,qBAAsB,mBAAmB,kBAAmB,oBAAoB,mBAAmB,kBAAmB,oBAAoB,mBAAmB,kBAAmB,oBAAoB,mBAAmB,kBAAmB,oBAAoB,mBAC51RC,YAAc,GAEhBC,OAAU,CACRH,SAAY,EACZnP,KAAQ,eACRoP,MAAS,EAAE,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,qBAAuB,kBAAmB,kBAAmB,qBAAuB,kBAAmB,kBAAmB,qBAAuB,kBAAmB,kBAAmB,qBAAuB,kBAAmB,kBAAmB,sBAAwB,kBAAmB,kBAAmB,sBAAwB,kBAAmB,kBAAmB,sBAAwB,kBAAmB,kBAAmB,sBAAwB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,qBAAsB,kBAAmB,kBAAmB,qBAAsB,kBAAmB,kBAAmB,qBAAsB,kBAAmB,kBAAmB,qBAAsB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,uBAAyB,mBAAoB,kBAAmB,uBAAyB,mBAAoB,kBAAmB,uBAAyB,mBAAoB,kBAAmB,uBAAyB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,sBAAwB,mBAAoB,mBAAoB,sBAAwB,mBAAoB,mBAAoB,sBAAwB,mBAAoB,mBAAoB,sBAAwB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAC3wSC,YAAc,GAEhBE,GAAM,CACJJ,SAAY,EACZnP,KAAQ,eACRoP,MAAS,CAAC,kBAAmB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,qBAAsB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,iBAAkB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,iBAAkB,qBAAsB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,iBAAkB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,sBACzsMC,YAAc,GAEhBG,MAAS,CACPL,SAAY,EACZnP,KAAQ,cACRoP,MAAS,CAAC,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAA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AAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,iBAAkB,oBAAqB,iBAAkB,iBAAkB,oBAAqB,iBAAkB,iBAAkB,oBAAqB,iBAAkB,iBAAkB,oBAAqB,gBAAiB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,oBAAsB,mBAAoB,mBAAoB,oBAAsB,mBAAoB,mBAAoB,oBAAsB,mBAAoB,mBAAoB,oBAAsB,mBAAoB,kBAAmB,kBAAmB,EAAG,iBAAkB,kBAAmB,EAAG,iBAAkB,kBAAmB,EAAG,iBAAkB,kBAAmB,EAAG,iBAAkB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,kBAAmB,GAAI,kBAAmB,kBAAmB,GAAI,kBAAmB,kBAAmB,GAAI,kBAAmB,kBAAmB,GAAI,kBAAmB,mBAAoB,mBAAoB,sBAAwB,mBAAoB,mBAAoB,sBAAwB,mBAAoB,mBAAoB,sBAAwB,mBAAoB,mBAAoB,uBAAyB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,iBAAkB,oBAAsB,kBAAmB,kBAAmB,oBAAsB,kBAAmB,kBAAmB,oBAAsB,kBAAmB,kBAAmB,oBAAsB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,uBAAyB,kBAAmB,kBAAmB,uBAAyB,kBAAmB,kBAAmB,uBAAyB,kBAAmB,kBAAmB,uBAAyB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,uBAAyB,mBAAoB,kBAAmB,uBAAyB,mBAAoB,kBAAmB,uBAAyB,mBAAoB,kBAAmB,uBAAyB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,iBAAkB,kBAAmB,oBAAqB,iBAAkB,kBAAmB,oBAAqB,iBAAkB,kBAAmB,oBAAqB,iBAAkB,qBAAuB,mBAAoB,mBAAoB,qBAAuB,mBAAoB,mBAAoB,qBAAuB,mBAAoB,mBAAoB,qBAAuB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,oBAAqB,iBAAkB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,iBAAkB,oBAAqB,oBAAqB,iBAAkB,oBAAqB,oBAAqB,iBAAkB,oBAAqB,oBAAqB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,mBAAoB,sBAAwB,kBAAmB,mBAAoB,sBAAwB,kBAAmB,mBAAoB,sBAAwB,kBAAmB,mBAAoB,sBAAwB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,qBAAuB,kBAAmB,kBAAmB,qBAAuB,kBAAmB,kBAAmB,qBAAuB,kBAAmB,kBAAmB,qBAAuB,kBAAmB,mBAAoB,kBAAmB,GAAI,kBAAmB,kBAAmB,GAAI,kBAAmB,kBAAmB,GAAI,kBAAmB,kBAAmB,GAAI,kBAAmB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,gBAAiB,kBAAmB,mBAAoB,gBAAiB,kBAAmB,mBAAoB,gBAAiB,kBAAmB,mBAAoB,iBACjsbC,YAAc,GAEhBC,OAAU,CACRH,SAAY,EACZnP,KAAQ,eACRoP,MAAS,EAAE,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,qBAAwB,mBAAqB,mBAAqB,qBAAwB,mBAAqB,mBAAqB,qBAAwB,mBAAqB,mBAAqB,qBAAwB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,qBAAuB,iBAAmB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,qBAAwB,kBAAoB,iBAAmB,qBAAwB,kBAAoB,iBAAmB,qBAAwB,kBAAoB,iBAAmB,qBAAwB,kBAAoB,gBAAkB,kBAAoB,sBAAyB,iBAAmB,kBAAoB,sBAAyB,iBAAmB,kBAAoB,sBAAyB,iBAAmB,kBAAoB,sBAAyB,iBAAmB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,sBAA0B,kBAAoB,mBAAqB,sBAA0B,kBAAoB,mBAAqB,sBAA0B,kBAAoB,mBAAqB,sBAA0B,kBAAoB,mBAAqB,mBAAqB,oBAAwB,mBAAqB,mBAAqB,oBAAwB,mBAAqB,mBAAqB,oBAAwB,mBAAqB,mBAAqB,qBAAyB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,mBAAqB,sBAAyB,kBAAoB,kBAAoB,sBAAyB,kBAAoB,kBAAoB,sBAAyB,kBAAoB,kBAAoB,sBAAyB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,kBAAoB,sBAA0B,kBAAoB,kBAAoB,sBAA0B,kBAAoB,kBAAoB,sBAA0B,kBAAoB,kBAAoB,sBAA0B,oBAAsB,iBAAmB,kBAAoB,oBAAsB,iBAAmB,kBAAoB,oBAAsB,iBAAmB,kBAAoB,oBAAsB,iBAAmB,iBAAmB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,kBAAoB,sBAAyB,mBAAqB,kBAAoB,sBAAyB,mBAAqB,kBAAoB,sBAAyB,mBAAqB,kBAAoB,sBAAyB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,iBAAmB,uBAA0B,mBAAqB,kBAAoB,uBAA0B,mBAAqB,kBAAoB,uBAA0B,mBAAqB,kBAAoB,uBAA0B,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,mBAAqB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,iBAAmB,mBAAqB,qBAAuB,iBAAmB,mBAAqB,qBAAuB,iBAAmB,mBAAqB,qBAAuB,iBAAmB,mBAAqB,qBAAuB,kBAAoB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,qBAAuB,kBAAoB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,qBAAuB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,iBAAmB,kBAAoB,sBAA0B,iBAAmB,kBAAoB,sBAA0B,iBAAmB,kBAAoB,sBAA0B,iBAAmB,kBAAoB,sBAA0B,qBAAuB,iBAAmB,iBAAmB,qBAAuB,iBAAmB,iBAAmB,qBAAuB,iBAAmB,iBAAmB,qBAAuB,iBAAmB,iBAAmB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,sBAAyB,kBAAoB,mBAAqB,sBAAyB,kBAAoB,mBAAqB,sBAAyB,kBAAoB,mBAAqB,sBAAyB,kBAAoB,mBAAqB,kBAAoB,oBAAwB,mBAAqB,kBAAoB,oBAAwB,mBAAqB,kBAAoB,oBAAwB,mBAAqB,kBAAoB,oBAAwB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,mBACt3dC,YAAc,GAEhBE,GAAM,CACJJ,SAAY,EACZnP,KAAQ,eACRoP,MAAS,CAAC,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,gBAAkB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,gBAAkB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,oBAAsB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,gBAAkB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,qBAAuB,oBAAsB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,iBAAmB,oBAAsB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,iBAAmB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,iBAAmB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,iBAAmB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,qBAAuB,kBAAoB,oBAAsB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,oBAAsB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,iBAAmB,oBAAsB,kBAAoB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,iBAAmB,kBAAoB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,mBACjvTC,YAAc,GAEhBG,MAAS,CACPL,SAAY,EACZnP,KAAQ,cACRoP,MAAS,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OACnkNC,YAAc,IAGlBI,MAAS,CACPzP,KAAQ,cACRoP,MAAS,CAAC,GAAI,IAAK,IAAK,IAAK,EAAG,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,EAAG,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,EAAG,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,EAAG,GAAI,GAAI,IAAK,IAAK,GAAI,EAAG,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,EAAG,IAAK,GAAI,GAAI,GAAI,IAAK,EAAG,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,EAAG,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,EAAG,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,G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AmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,iBAAiB,iBAAiB,kBAAkB,iBAAiB,iBAAiB,kBAAkB,iBAAiB,iBAAiB,kBAAkB,iBAAiB,iBAAiB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,oBAAoB,iBAAiB,cAAc,oBAAoB,iBAAiB,cAAc,oBAAoB,iBAAiB,cAAc,oBAAoB,iBAAiB,cAAc,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,iBAAiB,iBAAiB,kBAAkB,iBAAiB,iBAAiB,kBAAkB,iBAAiB,iBAAiB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,mBAAmB,mBAAoB,kBAAkB,kBAAkB,mBAAoB,kBAAkB,kBAAkB,mBAAoB,kBAAkB,kBAAkB,mBAAoB,kBAAkB,kBAAkB,mBAAoB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAmB,mBAAmB,kBAAkB,kBAAmB,mBAAmB,kBAAkB,kBAAmB,mBAAmB,kBAAkB,kBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,iBAAiB,oBAAqB,kBAAkB,iBAAiB,oBAAqB,kBAAkB,iBAAiB,oBAAqB,kBAAkB,iBAAiB,oBAAqB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,oBAAoB,mBAAoB,iBAAiB,mBAAmB,mBAAoB,iBAAiB,mBAAmB,mBAAoB,iBAAiB,mBAAmB,mBAAoB,iBAAiB,mBAAmB,mBAAoB,iBAAiB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,mBAAoB,kBAAkB,oBAAqB,mBAAoB,kBAAkB,oBAAqB,mBAAoB,kBAAkB,oBAAqB,mBAAoB,kBAAkB,oBAAqB,mBAAoB,kBAAkB,oBAAqB,mBAAoB,kBAAkB,oBAAqB,mBAAoB,kBAAkB,mBAAoB,kBAAmB,mBAAmB,kBAAmB,kBAAmB,mBAAmB,kBAAmB,kBAAmB,mBAAmB,kBAAmB,kBAAmB,mBAAmB,kBAAmB,kBAAmB,mBAAmB,kBAAmB,kBAAmB,mBAAmB,kBAAmB,kBAAmB,mBAAmB,mBACjwbC,YAAc,GAEhBC,OAAU,CACRH,SAAY,EACZnP,KAAQ,eACRoP,MAAS,EAAE,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,sBAAuB,mBAAoB,kBAAmB,sBAAuB,mBAAoB,kBAAmB,sBAAuB,mBAAoB,kBAAmB,sBAAuB,mBAAoB,kBAAmB,sBAAuB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,sBAAuB,mBAAoB,kBAAmB,sBAAuB,mBAAoB,kBAAmB,sBAAuB,mBAAoB,kBAAmB,sBAAuB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,qBAAsB,kBAAmB,mBAAoB,qBAAsB,kBAAmB,mBAAoB,qBAAsB,kBAAmB,mBAAoB,qBAAsB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,iBAAkB,oBAAqB,mBAAoB,iBAAkB,oBAAqB,mBAAoB,iBAAkB,oBAAqB,mBAAoB,iBAAkB,oBAAqB,gBAAiB,kBAAmB,oBAAqB,gBAAiB,kBAAmB,oBAAqB,gBAAiB,kBAAmB,oBAAqB,gBAAiB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,qBAAsB,kBAAmB,mBAAoB,qBAAsB,kBAAmB,mBAAoB,qBAAsB,kBAAmB,mBAAoB,qBAAsB,kBAAmB,mBAAoB,qBAAsB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,qBAAsB,EAAE,qBAAuB,qBAAsB,EAAE,qBAAuB,qBAAsB,EAAE,qBAAuB,qBAAsB,EAAE,qBAAuB,qBAAsB,EAAE,qBAAuB,qBAAsB,EAAE,qBAAuB,qBAAsB,EAAE,sBAAwB,uBAAwB,GAAG,sBAAwB,uBAAwB,GAAG,sBAAwB,uBAAwB,GAAG,sBAAwB,uBAAwB,GAAG,sBAAwB,uBAAwB,GAAG,sBAAwB,uBAAwB,GAAG,sBAAwB,uBAAwB,GAAG,sBACx5cC,YAAc,GAEhBE,GAAM,CACJJ,SAAY,EACZnP,KAAQ,eACRoP,MAAS,CAAC,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,iBAAkB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,iBAAkB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,iBAAkB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAC5wTC,YAAc,IAGlBI,MAAS,CACPzP,KAAQ,cACRoP,MAAS,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,EAAE,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE,GAAG,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,EAAE,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI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AmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,oBAAoB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,kBAAkB,qBAAuB,kBAAkB,qBAAqB,qBAAuB,kBAAkB,qBAAqB,qBAAuB,kBAAkB,qBAAqB,qBAAuB,kBAAkB,qBAAqB,qBAAuB,kBAAkB,qBAAqB,qBAAuB,kBAAkB,qBAAqB,qBAAuB,kBAAkB,qBAAqB,qBAAuB,kBAAkB,sBAAsB,sBAAyB,kBAAkB,sBAAsB,sBAAyB,kBAAkB,sBAAsB,sBAAyB,kBAAkB,sBAAsB,sBAAyB,kBAAkB,sBAAsB,sBAAyB,kBAAkB,sBAAsB,sBAAyB,kBAAkB,sBAAsB,sBAAyB,kBAAkB,sBAAsB,sBAAyB,kBAAkB,sBAC7ofC,YAAc,GAEhBC,OAAU,CACRH,SAAY,EACZnP,KAAQ,eACRoP,MAAS,CAAC,kBAAmB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,eAAgB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,gBAAiB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,iBAAkB,kBAAmB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,iBAAkB,iBAAkB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,iBAAkB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,iBAAkB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,eAAgB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,iBAAkB,iBAAkB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,iBAAkB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,gBAAiB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,qBAAwB,GAAG,qBAAqB,qBAAwB,GAAG,qBAAqB,qBAAwB,GAAG,qBAAqB,qBAAwB,GAAG,qBAAqB,qBAAwB,GAAG,qBAAqB,qBAAwB,GAAG,qBAAqB,qBAAwB,GAAG,qBAAqB,qBAAwB,GAAG,sBAAsB,sBAAsB,GAAG,sBAAsB,sBAAsB,GAAG,sBAAsB,sBAAsB,GAAG,sBAAsB,sBAAsB,GAAG,sBAAsB,sBAAsB,GAAG,sBAAsB,sBAAsB,GAAG,sBAAsB,sBAAsB,GAAG,sBAAsB,sBAAsB,GAAG,sBACt+fC,YAAc,GAEhBE,GAAM,CACJJ,SAAY,EACZnP,KAAQ,eACRoP,MAAS,CAAC,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,qBAAsB,oBAAqB,qBAAsB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,iBAAkB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,qBAAsB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,qBAAsB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,qBAAsB,mBAAoB,qBAAsB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,qBAAsB,mBAAoB,mBAAoB,qBAAsB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,qBAAsB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,qBAAsB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,qBAAsB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,qBAAsB,mBAAoB,qBAAsB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,qBAAsB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,qBAAsB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,qBAAsB,kBAAmB,qBAAsB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,qBAAsB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,qBAAsB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAA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mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,iBAAkB,oBAAqB,mBAAoB,iBAAkB,oBAAqB,mBAAoB,iBAAkB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,sBAAwB,oBAAqB,mBAAoB,sBAAwB,oBAAqB,mBAAoB,sBAAwB,oBAAqB,mBAAoB,sBAAwB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,EAAG,mBAAoB,kBAAmB,EAAG,mBAAoB,kBAAmB,EAAG,mBAAoB,kBAAmB,EAAG,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,uBAAyB,oBAAqB,kBAAmB,uBAAyB,oBAAqB,kBAAmB,uBAAyB,oBAAqB,kBAAmB,uBAAyB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,qBAAuB,oBAAqB,mBAAoB,qBAAuB,oBAAqB,mBAAoB,qBAAuB,oBAAqB,mBAAoB,qBAAuB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,EAAG,mBAAoB,kBAAmB,EAAG,mBAAoB,kBAAmB,EAAG,mBAAoB,kBAAmB,EAAG,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,GAAI,oBAAqB,kBAAmB,GAAI,oBAAqB,kBAAmB,GAAI,oBAAqB,kBAAmB,GAAI,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,sBAAwB,mBAAoB,mBAAoB,sBAAwB,mBAAoB,mBAAoB,sBAAwB,mBAAoB,mBAAoB,sBAAwB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,GAAI,kBAAmB,kBAAmB,GAAI,kBAAmB,kBAAmB,GAAI,kBAAmB,kBAAmB,GAAI,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,sBAAwB,oBAAqB,mBAAoB,sBAAwB,oBAAqB,mBAAoB,sBAAwB,oBAAqB,mBAAoB,sBAAwB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,iBAAkB,sBAAwB,mBAAoB,kBAAmB,sBAAwB,mBAAoB,kBAAmB,sBAAwB,mBAAoB,kBAAmB,sBAAwB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,qBAAuB,mBAAoB,kBAAmB,qBAAuB,mBAAoB,kBAAmB,qBAAuB,mBAAoB,kBAAmB,qBAAuB,mBAAoB,mBAC/1bC,YAAc,GAEhBC,OAAU,CACRH,SAAY,EACZnP,KAAQ,eACRoP,MAAS,EAAE,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,sBAAuB,kBAAoB,mBAAqB,sBAAuB,kBAAoB,mBAAqB,sBAAuB,kBAAoB,mBAAqB,sBAAuB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,oBAAsB,oBAAsB,kBAAoB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,qBAAyB,mBAAqB,mBAAqB,qBAAyB,mBAAqB,mBAAqB,qBAAyB,mBAAqB,mBAAqB,qBAAyB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,qBAAyB,mBAAqB,mBAAqB,qBAAyB,mBAAqB,mBAAqB,qBAAyB,mBAAqB,mBAAqB,qBAAyB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,kBAAoB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,sBAA0B,mBAAqB,kBAAoB,sBAA0B,mBAAqB,kBAAoB,sBAA0B,mBAAqB,kBAAoB,sBAA0B,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,iBAAmB,kBAAoB,mBAAqB,iBAAmB,kBAAoB,mBAAqB,iBAAmB,kBAAoB,mBAAqB,iBAAmB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,qBAAyB,mBAAqB,mBAAqB,qBAAyB,mBAAqB,mBAAqB,qBAAyB,mBAAqB,mBAAqB,qBAAyB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,kBAAoB,oBAAsB,kBAAoB,gBAAkB,oBAAsB,kBAAoB,gBAAkB,oBAAsB,kBAAoB,gBAAkB,oBAAsB,kBAAoB,iBAAmB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,sBAA0B,iBAAmB,kBAAoB,sBAA0B,iBAAmB,kBAAoB,sBAA0B,iBAAmB,kBAAoB,sBAA0B,iBAAmB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,qBAAuB,iBAAmB,kBAAoB,qBAAuB,iBAAmB,kBAAoB,qBAAuB,iBAAmB,kBAAoB,qBAAuB,iBAAmB,kBAAoB,mBAAqB,iBAAmB,kBAAoB,mBAAqB,iBAAmB,kBAAoB,mBAAqB,iBAAmB,kBAAoB,mBAAqB,iBAAmB,kBAAoB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,uBAA2B,mBAAqB,mBAAqB,uBAA2B,mBAAqB,mBAAqB,uBAA2B,mBAAqB,mBAAqB,uBAA2B,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,kBAAoB,qBAAsB,kBAAoB,kBAAoB,qBAAsB,kBAAoB,kBAAoB,qBAAsB,kBAAoB,kBAAoB,qBAAsB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,iBAAmB,oBAAsB,mBAAqB,iBAAmB,oBAAsB,mBAAqB,iBAAmB,oBAAsB,mBAAqB,iBAAmB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,oBAAsB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,sBAA0B,kBAAoB,mBAAqB,sBAA0B,kBAAoB,mBAAqB,sBAA0B,kBAAoB,mBAAqB,sBAA0B,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,qBAAuB,kBAAoB,oBAAsB,qBAAuB,kBAAoB,oBAAsB,qBAAuB,kBAAoB,oBAAsB,qBAAuB,kBAAoB,mBAAqB,oBAAsB,qBAAuB,kBAAoB,oBAAsB,qBAAuB,kBAAoB,oBAAsB,qBAAuB,kBAAoB,oBAAsB,qBAAuB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,uBAA2B,mBAAqB,kBAAoB,uBAA2B,mBAAqB,kBAAoB,uBAA2B,mBAAqB,kBAAoB,uBAA2B,mBAAqB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,uBAA2B,kBAAoB,mBAAqB,uBAA2B,kBAAoB,mBAAqB,uBAA2B,kBAAoB,mBAAqB,uBAA2B,kBAAoB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,qBAAyB,kBAAoB,mBAAqB,qBAAyB,kBAAoB,mBAAqB,qBAAyB,kBAAoB,mBAAqB,qBAAyB,kBAAoB,oBACjydC,YAAc,GAEhBE,GAAM,CACJJ,SAAY,EACZnP,KAAQ,eACRoP,MAAS,CAAC,oBAAsB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,iBAAmB,oBAAsB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,qBAAuB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,kBAAoB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,oBAAsB,kBAAoB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,iBAAmB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,sBAAwB,kBAAoB,mBAAqB,mBAAqB,iBAAmB,qBAAuB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,iBAAmB,kBAAoB,kBAAoB,oBAAuB,qBAAuB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,kBAAoB,qBAAuB,mBAAqB,mBAAqB,mBAAqB,qBAAuB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,kBAAoB,iBAAmB,mBAAqB,mBAAqB,kBAAoB,oBAAsB,oBAAsB,oBAAsB,mBAAqB,kBAAoB,qBAAuB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,oBAAsB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,iBAAmB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,qBAAuB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,qBAAuB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,iBAAmB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,sBAAwB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,sBAAwB,mBAAqB,qBAAuB,kBAAoB,oBAAsB,kBAAoB,oBAAsB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,iBAAmB,kBAAoB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,qBAAuB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,kBAAoB,sBAAwB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,iBAAmB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,qBAAuB,oBAAsB,qBAAuB,iBAAmB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,oBAAsB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,qBAAuB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,iBAAmB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,kBAAoB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,iBAAmB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,qBAAuB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,qBAAuB,iBAAmB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,kBAAoB,sBAAwB,mBAAqB,kBAAoB,mBAAqB,oBAAsB,qBAAuB,iBAAmB,oBAAsB,oBAAsB,qBAAuB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,oBAAsB,oBAAsB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,iBAAmB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,oBAAsB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,sBAAwB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,qBAAuB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,oBAAsB,mBAAqB,oBAAsB,mBAAqB,kBAAoB,oBAAsB,iBAAmB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,iBAAmB,mBAAqB,kBAAoB,kBAAoB,mBAAqB,mBAAqB,mBAAqB,mBAAqB,kBAAoB,mBAAqB,kBAAoB,oBACjzTC,YAAc,GAEhBG,MAAS,CACPL,SAAY,EACZnP,KAAQ,cACRoP,MAAS,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OACnkNC,YAAc,IAGlBI,MAAS,CACPzP,KAAQ,cACRoP,MAAS,CAAC,EAAG,GAAI,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,EAAG,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,EAAG,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,EAAG,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,E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BAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,iBAAiB,iBAAiB,oBAAoB,iBAAiB,iBAAiB,oBAAoB,iBAAiB,iBAAiB,oBAAoB,iBAAiB,iBAAiB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,oBAAoB,iBAAiB,aAAa,mBAAmB,iBAAiB,aAAa,mBAAmB,iBAAiB,aAAa,mBAAmB,iBAAiB,aAAa,mBAAmB,iBAAiB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,kBAAkB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,iBAAiB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,oBAAoB,kBAAkB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,iBAAiB,iBAAiB,mBAAmB,iBAAiB,iBAAiB,mBAAmB,iBAAiB,iBAAiB,mBAAmB,iBAAiB,iBAAiB,oBAAoB,iBAAiB,iBAAiB,oBAAoB,iBAAiB,iBAAiB,oBAAoB,iBAAiB,iBAAiB,oBAAoB,iBAAiB,iBAAiB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,iBAAiB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,iBAAiB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,iBAAiB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,iBAAiB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,iBAAiB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,iBAAiB,oBAAoB,kBAAkB,iBAAiB,oBAAoB,kBAAkB,iBAAiB,oBAAoB,kBAAkB,iBAAiB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,cAAc,mBAAmB,iBAAiB,cAAc,mBAAmB,iBAAiB,cAAc,mBAAmB,iBAAiB,cAAc,mBAAmB,kBAC73pBC,YAAc,GAEhBC,OAAU,CACRH,SAAY,EACZnP,KAAQ,eACRoP,MAAS,EAAE,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,gBAAiB,kBAAmB,oBAAqB,gBAAiB,kBAAmB,oBAAqB,gBAAiB,kBAAmB,oBAAqB,gBAAiB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,iBAAkB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAClusBC,YAAc,GAEhBE,GAAM,CACJJ,SAAY,EACZnP,KAAQ,eACRoP,MAAS,CAAC,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,iBAAkB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,qBAAsB,kBAAmB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,iBAAkB,oBAAqB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,iBAAkB,oBAAqB,iBAAkB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,kBAAmB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,qBAAsB,mBAAoB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,iBAAkB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,kBAAmB,qBAAsB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,iBAAkB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,iBAAkB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,iBAAkB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAC17dC,YAAc,IAGlBI,MAAS,CACPzP,KAAQ,cACRoP,MAAS,CAAC,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,EAAE,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,EAAE,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,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BAAkB,mBAAmB,sBAAsB,kBAAkB,mBAAmB,sBAAsB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,kBAAkB,iBAAiB,kBAAkB,kBAAkB,kBAAkB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,kBAAkB,kBAAkB,oBAAoB,sBAAuB,kBAAkB,oBAAoB,sBAAuB,kBAAkB,oBAAoB,sBAAuB,kBAAkB,oBAAoB,sBAAuB,qBAAsB,kBAAkB,kBAAkB,qBAAsB,kBAAkB,kBAAkB,qBAAsB,kBAAkB,kBAAkB,qBAAsB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,qBAAsB,mBAAmB,mBAAmB,qBAAsB,mBAAmB,mBAAmB,qBAAsB,mBAAmB,mBAAmB,qBAAsB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,oBAAoB,oBAAoB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,iBAAiB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,oBAAoB,iBAAiB,kBAAkB,mBAAmB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,oBAAoB,iBAAiB,oBAAoB,mBAAmB,oBAAoB,qBAAqB,kBAAkB,oBAAoB,qBAAqB,kBAAkB,oBAAoB,qBAAqB,kBAAkB,oBAAoB,qBAAqB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,oBAAoB,iBAAiB,mBAAmB,mBAAmB,qBAAqB,mBAAmB,mBAAmB,qBAAqB,mBAAmB,mBAAmB,qBAAqB,mBAAmB,mBAAmB,qBAAqB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,sBAAuB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,uBAAuB,mBAAmB,mBAAmB,uBAAuB,mBAAmB,mBAAmB,uBAAuB,mBAAmB,mBAAmB,uBAAuB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,kBAAkB,iBAAiB,oBAAoB,kBAAkB,iBAAiB,oBAAoB,kBAAkB,iBAAiB,oBAAoB,kBAAkB,iBAAiB,oBAAoB,kBAAkB,iBAAiB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,kBAAkB,mBAAmB,iBAAiB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,oBAAoB,uBAAwB,mBAAmB,oBAAoB,uBAAwB,mBAAmB,oBAAoB,uBAAwB,mBAAmB,oBAAoB,uBAAwB,mBAAmB,oBAAoB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,iBAAiB,iBAAiB,kBAAkB,iBAAiB,iBAAiB,kBAAkB,iBAAiB,iBAAiB,kBAAkB,iBAAiB,iBAAiB,kBAAkB,iBAAiB,iBAAiB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,sBAAuB,kBAAkB,mBAAmB,sBAAuB,kBAAkB,mBAAmB,sBAAuB,kBAAkB,mBAAmB,sBAAuB,kBAAkB,mBAAmB,sBAAuB,kBAAkB,mBAAmB,uBAAwB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,kBAAkB,mBAAmB,sBAAuB,kBAAkB,mBAAmB,sBAAuB,kBAAkB,mBAAmB,sBAAuB,kBAAkB,mBAAmB,sBAAuB,mBAAmB,qBAAqB,mBAAmB,mBAAmB,qBAAqB,mBAAmB,mBAAmB,qBAAqB,mBAAmB,mBAAmB,qBAAqB,mBAAmB,mBAAmB,qBAAqB,mBAAmB,mBAAmB,qBAAqB,mBAAmB,mBAAmB,qBAAqB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,uBAAwB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,kBAAkB,uBAAwB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,qBAAsB,mBAAmB,oBAAoB,qBAAsB,mBAAmB,oBAAoB,qBAAsB,mBAAmB,oBAAoB,qBAAsB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,sBAAsB,iBAAiB,mBAAmB,sBAAsB,iBAAiB,mBAAmB,sBAAsB,iBAAiB,mBAAmB,sBAAsB,iBAAiB,mBAAmB,sBAAsB,iBAAiB,mBAAmB,sBAAsB,iBAAiB,mBAAmB,sBAAsB,iBAAiB,qBAAsB,kBAAkB,kBAAkB,qBAAsB,kBAAkB,kBAAkB,qBAAsB,kBAAkB,kBAAkB,qBAAsB,kBAAkB,kBAAkB,qBAAsB,kBAAkB,kBAAkB,qBAAsB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,oBAAoB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,uBAAwB,mBAAmB,kBAAkB,uBAAwB,mBAAmB,kBAAkB,uBAAwB,mBAAmB,kBAAkB,uBAAwB,mBAAmB,kBAAkB,uBAAwB,mBAAmB,kBAAkB,uBAAwB,mBAAmB,kBAAkB,uBAAwB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,mBAAmB,kBAAkB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,iBAAiB,oBAAoB,mBAAmB,kBAAkB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,sBAAsB,kBAAkB,kBAAkB,sBAAsB,kBAAkB,kBAAkB,sBAAsB,kBAAkB,kBAAkB,sBAAsB,kBAAkB,kBAAkB,sBAAsB,kBAAkB,kBAAkB,sBAAsB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,kBAAkB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,kBAAkB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,uBAAuB,mBAAmB,kBAAkB,uBAAuB,mBAAmB,kBAAkB,uBAAuB,mBAAmB,kBAAkB,uBAAuB,mBAAmB,kBAAkB,uBAAuB,mBAAmB,kBAAkB,uBAAuB,mBAAmB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,oBAAoB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,kBAAkB,kBAAmB,mBAAmB,kBAAkB,kBAAmB,mBAAmB,kBAAkB,kBAAmB,mBAAmB,kBAAkB,kBAAmB,mBAAmB,kBAAkB,kBAAmB,mBAAmB,mBAAmB,kBAAmB,mBAAmB,mBAAmB,kBAAmB,mBAAmB,mBAAmB,kBAAmB,mBAAmB,mBAAmB,kBAAmB,mBAAmB,mBAAmB,kBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,mBAAmB,sBAAuB,mBAAmB,oBAAoB,sBAAuB,mBAAmB,oBAAoB,sBAAuB,mBAAmB,oBAAoB,sBAAuB,mBAAmB,oBAAoB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,mBAAmB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBAAmB,kBAAkB,kBAAkB,mBACj2mCC,YAAc,GAEhBC,OAAU,CACRH,SAAY,EACZnP,KAAQ,eACRoP,MAAS,EAAE,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,sBAAuB,kBAAmB,mBAAoB,qBAAsB,kBAAmB,mBAAoB,sBAAuB,kBAAmB,oBAAqB,qBAAsB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,gBAAiB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,iBAAkB,qBAAsB,sBAAwB,kBAAmB,mBAAoB,qBAAwB,kBAAmB,qBAAsB,sBAAwB,kBAAmB,qBAAsB,sBAAyB,qBAAwB,kBAAmB,oBAAqB,sBAAyB,kBAAmB,mBAAoB,qBAAwB,kBAAmB,oBAAqB,sBAAwB,kBAAmB,qBAAsB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,iBAAkB,oBAAqB,kBAAmB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,uBAA0B,mBAAoB,mBAAoB,uBAAyB,mBAAoB,qBAAsB,qBAAuB,mBAAoB,oBAAqB,sBAAyB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,iBAAkB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,iBAAkB,oBAAqB,iBAAkB,kBAAmB,oBAAqB,kBAAmB,iBAAkB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,o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,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,iBAAkB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,oBAAqB,uBAAyB,mBAAoB,mBAAoB,sBAAyB,oBAAqB,iBAAkB,uBAA0B,mBAAoB,kBAAmB,uBAA0B,mBAAoB,kBAAmB,sBAAyB,oBAAqB,kBAAmB,uBAAyB,oBAAqB,iBAAkB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,uBAA0B,kBAAmB,mBAAoB,uBAA0B,kBAAmB,oBAAqB,sBAAyB,kBAAmB,oBAAqB,uBAAyB,kBAAmB,qBAAsB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,iBAAkB,mBAAoB,qBAAsB,qBAAwB,mBAAoB,mBAAoB,oBAAsB,mBAAoB,qBAAsB,sBAAwB,mBAAoB,oBAAqB,sBAAyB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,sBAAsB,oBAAqB,mBAAoB,oBAAoB,oBAAqB,kBAAmB,qBAAwB,mBAAoB,iBAAkB,sBAAsB,oBAAqB,iBAAkB,uBAAyB,oBAAqB,mBAAoB,uBAAyB,oBAAqB,mBAAoB,sBAAwB,mBAAoB,oBAAuB,oBAAqB,kBAAmB,qBAAqB,mBAAoB,kBAAmB,qBAAwB,mBAAoB,kBAAmB,sBAAyB,mBAAoB,kBAAmB,qBAAuB,oBAAqB,kBAAmB,qBAAuB,oBAAqB,iBAAkB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,iBAAkB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,iBAAkB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,iBAAkB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,qBAAsB,kBAAmB,uBAAuB,qBAAsB,kBAAmB,sBAAsB,qBAAsB,kBAAmB,sBAAwB,qBAAsB,kBAAmB,uBAAyB,qBAAsB,iBAAkB,uBAAyB,oBAAqB,mBAAoB,sBAAsB,oBAAqB,kBAAmB,sBAAwB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,iBAAkB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,iBAAkB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,iBAAkB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,iBAAkB,mBAAoB,kBAAmB,m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B,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,iBAAkB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,iBAAkB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,MAAO,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,eAAgB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,MAAO,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,MAAO,mBAAoB,MAAO,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,qBAAsB,kBAAmB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,eAAgB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,eAAgB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,iBAAkB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,iBAAkB,mBAAoB,iBAAkB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,MAAO,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,MAAO,kBAAmB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,eAAgB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,kBAAmB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,qBAAsB,kBAAmB,oBAAqB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,eAAgB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,eAAgB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,kBAAmB,oBAAqB,iBAAkB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,MAAO,kBAAmB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,MAAO,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,qBAAsB,kBAAmB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,MAAO,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,kBAAmB,kBAAmB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,kBAAmB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,kBAAmB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,kBAAmB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,iBAAkB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,MAAO,kBAAmB,mBAAoB,mBAAoB,qBAAsB,kBAAmB,mBAAoB,mBAAoB,mBAAoB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,kBAAmB,oBAAqB,oBAAqB,oBAAqB,mBAAoB,mBAAoB,qBACjyxBC,YAAc,IAGlBI,MAAS,CACPzP,KAAQ,cACRoP,MAAS,CAAC,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,EAAE,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,EAAE,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IA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"}