@panoramax/web-viewer 4.1.0-develop-b60f7e56 → 4.1.0-develop-3ab9b4cf

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/build/index.js CHANGED
@@ -9,7 +9,7 @@
9
9
  * LICENSE file in the root directory of this source tree.
10
10
  *
11
11
  */
12
- !function(at,st){"object"===typeof exports&&"object"===typeof module?module.exports=st():"function"===typeof define&&define.amd?define("Panoramax",[],st):"object"===typeof exports?exports.Panoramax=st():at.Panoramax=st()}(this,(()=>(()=>{var at={9039:(at,st,ot)=>{"use strict";ot.d(st,{A:()=>Basic});var ut=ot(4542),Hl=ot(5254),rc=ot(4964),sc=ot(8340),oc=ot(5995),_c=ot(7343),wc=ot(2614),Sc=ot.n(wc),iu=ot(8330);ot(1865),ot(3638);class Basic extends ut.WF{constructor(){let at=arguments.length>0&&void 0!==arguments[0]&&arguments[0];super(),this.users=["geovisio"],this.mapstyle=this.getAttribute("mapstyle")||sc.DEFAULT_TILES,this.lang=this.getAttribute("lang")||null,this.endpoint=this.getAttribute("endpoint")||null,this.picture=this.getAttribute("picture")||null,this.sequence=this.getAttribute("sequence")||null,console.info(`\ud83d\udcf7 Panoramax ${this.getClassName()} - Version ${iu.rE} (b60f7e5)\n\n\ud83c\udd98 Issues can be reported at ${iu.Jk.O}`),at||(this._isInternetFast=null,(0,_c.isInternetFast)().then((at=>this._isInternetFast=at)))}connectedCallback(){super.connectedCallback(),this._t=(0,rc.getTranslations)(this.lang),this.loader=(0,oc.createWebComp)("pnx-loader",{_parent:this,"no-label":(0,_c.isInIframe)()}),this._loadsAPI&&this.endpoint&&this._loadsAPI===this.endpoint||this.api&&this.api._endpoint===this.endpoint||!this.endpoint||((this._loadsAPI||this.api)&&(delete this.api,delete this._loadsAPI),this._setupAPI())}_setupAPI(){if(this.loader=this.loader||(0,oc.createWebComp)("pnx-loader",{_parent:this}),!this.endpoint)return void console.warn("No endpoint is defined");this._loadsAPI=this.endpoint;let at=this.endpoint;try{this.mapstyle=JSON.parse(this.mapstyle)}catch(ot){}try{this.api=new Hl.A(this.endpoint,{users:this.users,fetch:this.fetchOptions,style:this.mapstyle}),this.api.onceReady().then((()=>{if(at!=this._loadsAPI||!this.api)return;let st=this.api.getUnavailableFeatures(),ot=this.api.getAvailableFeatures();ot=0===st.length?"\u2705 All features available":"\u2705 Available features: "+ot.join(", "),st=0===st.length?"":"\ud83d\udeab Unavailable features: "+st.join(", "),console.info(`\ud83c\udf10 Connected to API "${this.api._metadata.name}" (${this.api._endpoint})\n\u2139\ufe0f API runs STAC ${this.api._metadata.stac_version} ${this.api._metadata.geovisio_version?"& GeoVisio "+this.api._metadata.geovisio_version:""}\n ${ot}\n ${st}\n`.trim())})).catch((at=>this.loader.dismiss(at,this._t.pnx.error_api))).finally((()=>delete this._loadsAPI))}catch(ot){var st;delete this._loadsAPI,null!==(st=this.loader)&&void 0!==st&&st.dismiss?this.loader.dismiss(ot,this._t.pnx.error_api):console.error(ot)}}onceReady(){throw new Error("You must override this method on sub-class")}onceAPIReady(){return this.api?this.api.onceReady():new Promise((at=>setTimeout(at,100))).then(this.onceAPIReady.bind(this))}createRenderRoot(){return this}attributeChangedCallback(at,st,ot){if(super.attributeChangedCallback(at,st,ot),"endpoint"===at&&(this._loadsAPI&&ot&&this._loadsAPI===ot||this.api&&this.api._endpoint===ot||!ot||((this._loadsAPI||this.api)&&(delete this.api,delete this._loadsAPI),this._setupAPI())),["picture","sequence"].includes(at)){let ut,Hl,rc,sc;"picture"===at?(ut=this.sequence,rc=this.sequence,Hl=ot,sc=st):(ut=ot,rc=st,Hl=this.picture,sc=this.picture),this.dispatchEvent(new CustomEvent("select",{bubbles:!0,composed:!0,detail:{seqId:ut,picId:Hl,prevSeqId:rc,prevPicId:sc}}))}}getClassName(){return"Basic"}select(){let at=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,st=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;arguments.length>2&&void 0!==arguments[2]&&arguments[2]&&(this.picture=null,this.sequence=null),this.picture=st,this.sequence=at}isWidthSmall(){return(null===this||void 0===this?void 0:this.offsetWidth)<576}isHeightSmall(){return(null===this||void 0===this?void 0:this.offsetHeight)<400}render(){return ut.qy`<p>Should not be used directly, use Viewer/CoverageMap/Editor instead</p>`}getSubComponentsNames(){return["loader","api"]}addEventListener(at,st,ot){let ut=at.split(":").shift();if(ut&&this.getSubComponentsNames().includes(ut)){var Hl;const rc=at.substring(ut.length+1);null!==(Hl=this[ut])&&void 0!==Hl&&Hl.addEventListener?this[ut].addEventListener(rc,st,ot):setTimeout((()=>this.addEventListener(at,st,ot)),50)}else super.addEventListener(at,st,ot)}static GetJSONConverter(){return{fromAttribute:at=>null===at||""===at?null:"object"===typeof at||Array.isArray(at)?at:Sc().parse(at),toAttribute:at=>null===at||""===at?"":"string"===typeof at?at:Sc().stringify(at)}}}Basic.properties={picture:{type:String,reflect:!0},sequence:{type:String,reflect:!0},fetchOptions:{converter:Basic.GetJSONConverter()},users:{type:Array,reflect:!0},mapstyle:{type:String},lang:{type:String},endpoint:{type:String}}},153:(at,st,ot)=>{"use strict";ot.d(st,{A:()=>CoverageMap});var ut=ot(9039),Hl=ot(5642),rc=ot(8340),sc=ot(927),oc=(ot(7776),ot(2118));class CoverageMap extends ut.A{constructor(){super(),this._mapContainer=document.createElement("div"),this.onceAPIReady().then((()=>{this.loader.setAttribute("value",30),this._initParams=new oc.Ay(oc.Ay.GetComponentProperties(CoverageMap,this)),this._initMap()}))}disconnectedCallback(){var at;super.disconnectedCallback(),null===(at=this.map)||void 0===at||at.destroy()}getClassName(){return"CoverageMap"}onceReady(){return this.map&&this.map.waitForEnoughMapLoaded?this.map.waitForEnoughMapLoaded():new Promise((at=>setTimeout(at,100))).then(this.onceReady.bind(this))}render(){return[this.loader,this._mapContainer]}getSubComponentsNames(){const at=super.getSubComponentsNames();return at.push("map"),at}_initMap(){class MyMap extends Hl.A{_getLayerStyleProperties(at){return"pictures_symbols"===at?{layout:{visibility:"none"}}:super._getLayerStyleProperties(at)}}this.map=new MyMap(this,this._mapContainer,Object.assign({},this._initParams.getMapInit(),{hash:!0})),this.map.addControl(new sc.NavigationControl({showCompass:!1})),this.loader.setAttribute("value",70),this.addEventListener("select",this._onSelect.bind(this)),this.map.on("picture-click",(at=>this.select(at.seqId,at.picId))),this.map.on("sequence-click",(at=>this.select(at.seqId))),this.map.waitForEnoughMapLoaded().then((async()=>{await(0,oc.mK)(this.map,this._initParams.getMapPostInit()),this.map.reloadLayersStyles(),this.loader.dismiss()}))}_onSelect(at){if(at.detail.picId||at.detail.seqId){const st=at.detail.picId?"pictures":"sequences",ot=this.map.queryRenderedFeatures({layers:[...this.map._userLayers].map((at=>(0,rc.getUserLayerId)(at,st))),filter:["==",["get","id"],at.detail.picId||at.detail.seqId]});ot.length>=0&&null!=ot[0]&&this.map._attachPreviewToPictures({features:ot},st)}}}CoverageMap.properties={map:{converter:ut.A.GetJSONConverter()},...ut.A.properties},customElements.define("pnx-coverage-map",CoverageMap)},1752:(at,st,ot)=>{"use strict";ot.d(st,{A:()=>Editor});ot(7365);var ut=ot(9039),Hl=ot(5642),rc=ot(9048),sc=ot(508),oc=ot(8340),_c=ot(1545),wc=ot(5995);const Sc="sequence-headings";class Editor extends ut.A{constructor(){super(),this.raster=null,this.background="streets",this.users=[],this._psvContainer=document.createElement("div"),this._psvContainer.setAttribute("slot","bg"),this._mapContainer=document.createElement("div"),this._mapContainer.setAttribute("slot","bg"),this.grid=(0,wc.createWebComp)("pnx-cornered-grid"),this.grid.appendChild(this._psvContainer),this.grid.appendChild(this._mapContainer),this.onceAPIReady().then((()=>{this.loader.setAttribute("value",30),this.sequence||this.loader.dismiss({},"No sequence is selected"),this.addEventListener("select",this._onSelect.bind(this)),this._initPSV(),this._initMap()}))}disconnectedCallback(){var at,st;super.disconnectedCallback(),null===(at=this.map)||void 0===at||at.destroy(),null===(st=this.psv)||void 0===st||st.destroy()}getClassName(){return"Editor"}onceReady(){var at,st;return this.map&&this.psv&&null!==(at=(st=this.map).loaded)&&void 0!==at&&at.call(st)?Promise.resolve():new Promise((at=>setTimeout(at,100))).then(this.onceReady.bind(this))}connectedCallback(){Array.isArray(this.users)&&this.users.length>0&&(console.warn("Parameters users can't be changed in Editor, only selected sequence can be visible"),this.users=[]),super.connectedCallback(),window.addEventListener("DOMContentLoaded",(()=>{this._moveChildToGrid()}),{once:!0})}attributeChangedCallback(at,st,ot){"users"===at&&Array.isArray(ot)&&ot.length>0?console.warn("Parameters users can't be changed in Editor, only selected sequence can be visible"):super.attributeChangedCallback(at,st,ot)}render(){return[this.loader,this.grid]}getSubComponentsNames(){return super.getSubComponentsNames().concat(["map","psv","grid"])}_initPSV(){try{this.psv=new rc.Ay(this,this._psvContainer),this.psv._myVTour.datasource.nodeResolver=this._getNode.bind(this)}catch(at){let st=_c.IJ.isWebGLSupported?this._t.pnx.error_psv:this._t.pnx.error_webgl;this.loader.dismiss(at,st)}}_initMap(){try{this.map=new Hl.A(this,this._mapContainer,{raster:this.raster,background:this.background,supplementaryStyle:this._createMapStyle(),zoom:15,picMarkerDraggable:!0}),(0,oc.linkMapAndPhoto)(this),this.loader.setAttribute("value",50),this._loadSequence(),this.map.once("load",(()=>{this.map.hasTwoBackgrounds()&&this._addMapBackgroundWidget(),this._bindPicturesEvents()}));const at=this.map._picMarker.setRotation.bind(this.map._picMarker);this.map._picMarker.setRotation=st=>(st=void 0===this._lastRelHeading?st:st+this._lastRelHeading-this.psv.getPictureRelativeHeading(),at(st))}catch(at){this.loader.dismiss(at,this._t.pnx.error_psv)}}_createMapStyle(){return{sources:{geovisio_editor_sequences:{type:"geojson",data:{type:"FeatureCollection",features:[]}}},layers:[{id:"geovisio_editor_sequences",type:"line",source:"geovisio_editor_sequences",layout:{...oc.VECTOR_STYLES.SEQUENCES.layout},paint:{...oc.VECTOR_STYLES.SEQUENCES.paint}},{id:"geovisio_editor_pictures",type:"circle",source:"geovisio_editor_sequences",layout:{...oc.VECTOR_STYLES.PICTURES.layout},paint:{...oc.VECTOR_STYLES.PICTURES.paint}}]}}_bindPicturesEvents(){this.map.on("mousemove","geovisio_editor_pictures",(()=>{this.map.getCanvas().style.cursor="pointer"})),this.map.on("mouseleave","geovisio_editor_pictures",(()=>{this.map.getCanvas().style.cursor=""})),this.map.on("click","geovisio_editor_pictures",this.map._onPictureClick.bind(this.map))}_loadSequence(){return this.loader.setAttribute("value",60),this.api.getSequenceItems(this.sequence).then((at=>{if(this.loader.setAttribute("value",80),this.map.once("sourcedata",(()=>{this.map.setPaintProperty("geovisio_editor_sequences","line-color",this.map._getLayerColorStyle("sequences")),this.map.setPaintProperty("geovisio_editor_pictures","circle-color",this.map._getLayerColorStyle("pictures")),this.map.setLayoutProperty("geovisio_editor_sequences","visibility","visible"),this.map.setLayoutProperty("geovisio_editor_pictures","visibility","visible"),this.map.once("styledata",(()=>this.loader.dismiss()))})),this._sequenceData=at.features,this.map.getSource("geovisio_editor_sequences").setData({type:"FeatureCollection",features:[{id:this.sequence,type:"Feature",properties:{id:this.sequence},geometry:{type:"LineString",coordinates:at.features.map((at=>at.geometry.coordinates))}},...at.features.map((at=>(at.properties.id=at.id,at.properties.sequences=[this.sequence],at)))]}),this.picture){const st=at.features.find((at=>at.id===this.picture));st?(this.select(this.sequence,this.picture,!0),this.map.jumpTo({center:st.geometry.coordinates,zoom:18})):console.log("Picture with ID",st,"was not found")}else{const st=[...at.features[0].geometry.coordinates,...at.features[0].geometry.coordinates];for(let ot=1;ot<at.features.length;ot++){const ut=at.features[ot].geometry.coordinates;ut[0]<st[0]&&(st[0]=ut[0]),ut[1]<st[1]&&(st[1]=ut[1]),ut[0]>st[2]&&(st[2]=ut[0]),ut[1]>st[3]&&(st[3]=ut[1])}this.map.fitBounds(st,{animate:!1})}})).catch((at=>this.loader.dismiss(at,this._t.pnx.error_api)))}_getNode(at){const st=this._sequenceData.find((st=>st.properties.id===at)),ot=st?(0,sc.apiFeatureToPSVNode)(st,this._t,this._isInternetFast):null;return ot&&delete ot.links,ot}_addMapBackgroundWidget(){const at=(0,wc.createWebComp)("pnx-map-background",{_parent:this,size:"sm",slot:"bottom-left"});this.grid.appendChild(at)}_moveChildToGrid(){Array.from(this.querySelectorAll("[slot]")).forEach((at=>{var st;null!==(st=at.tagName)&&void 0!==st&&st.toLowerCase().startsWith("pnx-")&&(at._parent=this,at._t=this._t),this.grid.appendChild(at)}))}previewSequenceHeadingChange(at){const st=void 0!==this.map.getLayer(Sc);if(this.map._picMarkerPreview.remove(),void 0===at)return delete this._lastRelHeading,st&&this.map.setLayoutProperty(Sc,"visibility","none"),void(this.picture&&this.map._picMarker.setRotation(this.psv.getXY().x));this._lastRelHeading=at,st||this.map.addLayer({id:Sc,type:"symbol",source:"geovisio_editor_sequences",layout:{"icon-image":"pnx-marker","icon-overlap":"always","icon-size":.8}});const ot=-this.psv.getPictureRelativeHeading();this.map.setLayoutProperty(Sc,"visibility","visible"),this.map.setLayoutProperty(Sc,"icon-rotate",["+",["get","view:azimuth"],ot,at]);const ut=[["==",["geometry-type"],"Point"]];this.picture&&ut.push(["!=",["get","id"],this.picture]),this.map.setFilter(Sc,["all",...ut]),this.picture&&this.map._picMarker.setRotation(this.psv.getXY().x)}_onSelect(){void 0!==this._lastRelHeading&&this.previewSequenceHeadingChange(this._lastRelHeading)}}Editor.properties={raster:{converter:ut.A.GetJSONConverter()},background:{type:String},...ut.A.properties},customElements.define("pnx-editor",Editor)},3407:(at,st,ot)=>{"use strict";ot.d(st,{Ay:()=>PhotoViewer,RD:()=>su});ot(970);var ut=ot(1545),Hl=ot(4451),rc=ot(9039),sc=ot(9048),oc=ot(5995),_c=ot(7343),wc=ot(2118),Sc=ot(4207);const iu=Math.PI/6,su=["pnx-mini","pnx-widget-player","pnx-widget-zoom"];class PhotoViewer extends rc.A{constructor(){super(),this.psv={},this["url-parameters"]=this.getAttribute("url-parameters")||!0,this["keyboard-shortcuts"]=this.getAttribute("keyboard-shortcuts")||!0,this.widgets=this.getAttribute("widgets")||"true",this.grid=(0,oc.createWebComp)("pnx-cornered-grid"),this.psvContainer=document.createElement("div"),this.psvContainer.setAttribute("slot","bg"),this.grid.appendChild(this.psvContainer),this.popup=(0,oc.createWebComp)("pnx-popup",{_parent:this,onclose:this._onPopupClose.bind(this)})}_createInitParamsHandler(){var at,st;this._initParams=new wc.Ay(wc.Ay.GetComponentProperties(PhotoViewer,this),Object.assign({},null===(at=this.urlHandler)||void 0===at?void 0:at.currentURLParams(),null===(st=this.urlHandler)||void 0===st?void 0:st.currentURLParams(!0)),{})}_initWidgets(){"false"!==this._initParams.getParentPostInit().widgets&&((0,_c.isInIframe)()||(this.grid.appendChild((0,oc.createWebComp)("pnx-widget-player",{slot:"top",_parent:this,class:"pnx-only-psv pnx-print-hidden",size:this.isHeightSmall()?"md":"xl"})),this.grid.appendChild((0,oc.createWebComp)("pnx-annotations-switch",{slot:"top",_parent:this,class:"pnx-only-psv pnx-print-hidden",size:this.isHeightSmall()?"md":"xl"}))),(0,_c.isInIframe)()?(this.legend=(0,oc.createWebComp)("pnx-widget-legend",{slot:"bottom-right",light:!0,_parent:this,focus:this._initParams.getParentPostInit().focus,picture:this._initParams.getParentPostInit().picture}),this.grid.appendChild(this.legend)):this.isWidthSmall()?(this.legend=(0,oc.createWebComp)("pnx-picture-legend",{_parent:this}),this.bottomDrawer=(0,oc.createWebComp)("pnx-bottom-drawer",{slot:"bottom",_parent:this,class:this._initParams.getParentPostInit().picture?void 0:"pnx-hidden"}),this.bottomDrawer.appendChild(this.legend),this.grid.appendChild(this.bottomDrawer),this.addEventListener("select",(at=>{(0,_c.isNullId)(at.detail.picId)?this.bottomDrawer.classList.add("pnx-hidden"):this.bottomDrawer.classList.remove("pnx-hidden")}))):(this.legend=(0,oc.createWebComp)("pnx-widget-legend",{slot:this.isWidthSmall()?void 0:"top-left",_parent:this,focus:this._initParams.getParentPostInit().focus,picture:this._initParams.getParentPostInit().picture}),this.grid.appendChild((0,oc.createWebComp)("pnx-widget-zoom",{slot:"bottom-right",class:"pnx-print-hidden",_parent:this})),this.grid.appendChild(this.legend)))}connectedCallback(){super.connectedCallback(),this.presetsManager=new Sc.A(this.lang),this["url-parameters"]&&"false"!==this["url-parameters"]&&(this.urlHandler=new Hl.A(this),this.onceReady().then((()=>{this.urlHandler.listenToChanges(),this.urlHandler._onParentChange()}))),this.onceAPIReady().then(this._postAPIInit.bind(this)),window.addEventListener("DOMContentLoaded",(()=>{this._moveChildToGrid()}),{once:!0})}disconnectedCallback(){var at,st;super.disconnectedCallback(),null===(at=this.urlHandler)||void 0===at||at.destroy(),null===(st=this.psv)||void 0===st||st.destroy()}getClassName(){return"PhotoViewer"}onceReady(){return this.oncePSVReady().then((()=>this._initParams.getParentPostInit().picture&&!this.psv.getPictureMetadata()?this.onceFirstPicLoaded():Promise.resolve()))}render(){return[this.loader,this.grid,this.popup]}getSubComponentsNames(){return super.getSubComponentsNames().concat(["psv","grid","popup","urlHandler"])}oncePSVReady(){let at;return new Promise((st=>{at=setInterval((()=>{this.psv&&"object"===typeof this.psv&&(this.psv.container?(clearInterval(at),st()):this.psv.addEventListener&&this.psv.addEventListener("ready",(()=>{clearInterval(at),st()}),{once:!0}))}),250)}))}onceFirstPicLoaded(){return this.oncePSVReady().then((()=>this.psv.getPictureMetadata()?Promise.resolve():new Promise((at=>{this.psv.addEventListener("picture-loaded",at,{once:!0})}))))}async _postAPIInit(){this.loader.setAttribute("value",30),this._createInitParamsHandler();const at=this._initParams.getParentPostInit();this._initPSV(),this._initWidgets(),(0,wc.ai)(this,at),at.keyboardShortcuts&&this._handleKeyboardManagement(),at.picture?this.psv.addEventListener("picture-loaded",(()=>this.loader.dismiss()),{once:!0}):this.loader.dismiss()}_initPSV(){try{this.psv=new sc.Ay(this,this.psvContainer,{shouldGoFast:this._psvShouldGoFast.bind(this),keyboard:"always",keyboardActions:{...ut.zY.keyboardActions,8:"ROTATE_UP",2:"ROTATE_DOWN",4:"ROTATE_LEFT",6:"ROTATE_RIGHT",PageUp:()=>this.psv.goToNextPicture(),9:()=>this.psv.goToNextPicture(),PageDown:()=>this.psv.goToPrevPicture(),3:()=>this.psv.goToPrevPicture(),5:()=>this.moveCenter(),"*":()=>this.moveCenter(),Home:()=>this._toggleFocus(),7:()=>this._toggleFocus(),End:()=>this.mini.toggleAttribute("collapsed"),1:()=>this.mini.toggleAttribute("collapsed")," ":()=>this.psv.toggleSequencePlaying(),0:()=>this.psv.toggleSequencePlaying()},...this._initParams.getPSVInit()}),this.oncePSVReady().then((()=>{this.loader.setAttribute("value",50),(0,wc.Vy)(this.psv,this._initParams.getPSVPostInit())})),this.psv.addEventListener("sequence-playing",(()=>this.classList.add("pnx-playing"))),this.psv.addEventListener("sequence-stopped",(()=>this.classList.remove("pnx-playing")))}catch(at){let st=ut.IJ.isWebGLSupported?this._t.pnx.error_psv:this._t.pnx.error_webgl;this.loader.dismiss(at,st)}}_handleKeyboardManagement(){const keytonone=()=>this.psv.stopKeyboardControl(),keytopsv=()=>this.psv.startKeyboardControl();this.popup.addEventListener("open",keytonone),this.popup.addEventListener("close",keytopsv),this.psv.addEventListener("click",keytopsv);for(let at of this.grid.childNodes)"bg"===at.getAttribute("slot")||su.includes(at.tagName.toLowerCase())||(at.addEventListener("focusin",keytonone),at.addEventListener("focusout",(()=>{null===this.popup.getAttribute("visible")&&keytopsv()})))}_psvShouldGoFast(){return this.psv._sequencePlaying&&this.psv.getTransitionDuration()<1e3}_moveChildToGrid(){Array.from(this.querySelectorAll("[slot]")).forEach((at=>{var st;null!==(st=at.tagName)&&void 0!==st&&st.toLowerCase().startsWith("pnx-")&&(at._parent=this,at._t=this._t),"editors"===at.getAttribute("slot")?this.onceReady().then((()=>{var st;return null===(st=this.legend)||void 0===st?void 0:st.appendChild(at)})):this.grid.appendChild(at)}))}setPopup(at){let st=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;at?this.popup.setAttribute("visible",""):this.popup.removeAttribute("visible"),this.popup.innerHTML="","string"===typeof st?this.popup.innerHTML=st:Array.isArray(st)&&st.forEach((at=>this.popup.appendChild(at)))}_onPopupClose(){this.dispatchEvent(new CustomEvent("focus-changed",{detail:{focus:this.map&&this.isMapWide()?"map":"pic"}}))}_showQualityScoreDoc(){this.setPopup(!0,[(0,oc.createWebComp)("pnx-quality-score-doc",{_t:this._t})])}_showReportForm(){if(!this.psv.getPictureMetadata())throw new Error("No picture currently selected");this.setPopup(!0,[(0,oc.createWebComp)("pnx-report-form",{_parent:this})])}_showShareOptions(){this.setPopup(!0,[(0,oc.createWebComp)("pnx-share-menu",{_parent:this})])}moveCenter(){this.psv.getPictureMetadata()&&this._psvAnimate({speed:sc.LM,yaw:0,pitch:0,zoom:sc.cS})}moveLeft(){this._moveToDirection("left")}moveRight(){this._moveToDirection("right")}moveUp(){this._moveToDirection("up")}moveDown(){this._moveToDirection("down")}_moveToDirection(at){let st=this.psv.getPosition();switch(at){case"up":st.pitch+=iu;break;case"left":st.yaw-=iu;break;case"down":st.pitch-=iu;break;case"right":st.yaw+=iu}this._psvAnimate({speed:sc.LM,...st})}_psvAnimate(at){this._lastPsvAnim&&this._lastPsvAnim.cancel(),this._lastPsvAnim=this.psv.animate(at)}addEventListener(at,st,ot){super.addEventListener(at,st,ot)}}PhotoViewer.properties={psv:{converter:rc.A.GetJSONConverter()},widgets:{type:String},"url-parameters":{type:String},"keyboard-shortcuts":{type:String},...rc.A.properties},customElements.define("pnx-photo-viewer",PhotoViewer)},8743:(at,st,ot)=>{"use strict";ot.d(st,{$:()=>su,A:()=>Viewer});ot(9616);var ut=ot(8340),Hl=ot(3407),rc=ot(2771),sc=ot(7343),oc=ot(5995),_c=ot(9683),wc=ot(2e3),Sc=ot(9438),iu=ot(2118);const su=20,lu=100;class Viewer extends Hl.Ay{constructor(){super(),this.map=!0,this.geocoder=this.getAttribute("geocoder")||"nominatim",this.mini=(0,oc.createWebComp)("pnx-mini",{slot:"bottom-left",_parent:this,onexpand:this._onMiniExpand.bind(this),collapsed:!!(0,sc.isNullId)(this.picture)||void 0}),this.mini.addEventListener("expand",this._toggleFocus.bind(this)),this.grid.appendChild(this.mini),this.mapContainer=document.createElement("div")}_createInitParamsHandler(){var at,st;this._initParams=new iu.Ay(iu.Ay.GetComponentProperties(Viewer,this),Object.assign({},null===(at=this.urlHandler)||void 0===at?void 0:at.currentURLParams(),null===(st=this.urlHandler)||void 0===st?void 0:st.currentURLParams(!0)),{map:(0,ut.getMapParamsFromLocalStorage)()})}_initWidgets(){var at,st;"false"!==this._initParams.getParentPostInit().widgets&&(this.grid.appendChild((0,oc.createWebComp)("pnx-widget-zoom",{slot:this.isWidthSmall()?"top-left":"bottom-right",class:this.isWidthSmall()?"pnx-only-map pnx-print-hidden":"pnx-print-hidden",_parent:this})),(0,sc.isInIframe)()?(this.legend=(0,oc.createWebComp)("pnx-widget-legend",{slot:"bottom-right",light:!0,_parent:this,focus:this._initParams.getParentPostInit().focus,picture:this._initParams.getParentPostInit().picture}),this.grid.appendChild(this.legend)):this.isWidthSmall()?(this.legend=(0,oc.createWebComp)("pnx-picture-legend",{_parent:this}),this.bottomDrawer=(0,oc.createWebComp)("pnx-bottom-drawer",{slot:"bottom",_parent:this,class:this._initParams.getParentPostInit().picture?void 0:"pnx-hidden"}),this.bottomDrawer.appendChild(this.legend),this.grid.appendChild(this.bottomDrawer),this.addEventListener("select",(at=>{(0,sc.isNullId)(at.detail.picId)?this.bottomDrawer.classList.add("pnx-hidden"):this.bottomDrawer.classList.remove("pnx-hidden")}))):(this.legend=(0,oc.createWebComp)("pnx-widget-legend",{slot:this.isWidthSmall()?"top":"top-left",_parent:this,focus:this._initParams.getParentPostInit().focus,picture:this._initParams.getParentPostInit().picture}),this._miniPicLegend=(0,oc.createWebComp)("pnx-mini-picture-legend",{_parent:this}),this.grid.appendChild(this.legend)),(0,sc.isInIframe)()||(this.grid.appendChild((0,oc.createWebComp)("pnx-widget-player",{slot:"top",_parent:this,class:"pnx-only-psv pnx-print-hidden",size:this.isHeightSmall()?"md":"xl"})),this.grid.appendChild((0,oc.createWebComp)("pnx-annotations-switch",{slot:"top",_parent:this,class:"pnx-only-psv pnx-print-hidden",size:this.isHeightSmall()?"md":"xl"})),this.grid.appendChild((0,oc.createWebComp)("pnx-widget-geosearch",{slot:this.isWidthSmall()?"top-right":"top-left",_parent:this,class:"pnx-only-map pnx-print-hidden",geocoder:this._initParams.getParentPostInit().geocoder})),this.grid.appendChild((0,oc.createWebComp)("pnx-widget-mapfilters",{slot:this.isWidthSmall()?"top-right":"top-left",_parent:this,"user-search":null!==this.api._endpoints.user_search&&null!==this.api._endpoints.user_tiles,"quality-score":(null===(at=this.map)||void 0===at||null===(st=at._hasQualityScore)||void 0===st?void 0:st.call(at))||!1,class:"pnx-only-map pnx-print-hidden"})),this.grid.appendChild((0,oc.createWebComp)("pnx-widget-maplayers",{slot:"top-right",_parent:this,class:"pnx-only-map pnx-print-hidden"}))))}disconnectedCallback(){var at;super.disconnectedCallback(),null===(at=this.map)||void 0===at||at.destroy()}getClassName(){return"Viewer"}getSubComponentsNames(){return super.getSubComponentsNames().concat(["mini","map"])}onceReady(){return Promise.all([this.oncePSVReady(),this.onceMapReady()]).then((()=>this._initParams.getParentPostInit().picture&&!this.psv.getPictureMetadata()?this.onceFirstPicLoaded():Promise.resolve()))}attributeChangedCallback(at,st,ot){var ut,Hl,rc,oc;(super.attributeChangedCallback(at,st,ot),"picture"===at)&&(null===(ut=this.legend)||void 0===ut||null===(Hl=ut.setAttribute)||void 0===Hl||Hl.call(ut,"picture",ot),(0,sc.isNullId)(st)&&!(0,sc.isNullId)(ot)&&this.mini.removeAttribute("collapsed"),(0,sc.isNullId)(ot)?this.map&&this.isMapWide()?this.mini.classList.add("pnx-hidden"):this.map&&!this.isMapWide()&&this._setFocus("map"):(this.mini.classList.remove("pnx-hidden"),(0,sc.isNullId)(st)&&(this._setFocus("pic"),"closed"===(null===(rc=this.bottomDrawer)||void 0===rc||null===(oc=rc.getAttribute)||void 0===oc?void 0:oc.call(rc,"openness"))&&this.bottomDrawer.setAttribute("openness","half-opened"))));"focus"===at&&this._setFocus(ot)}onceMapReady(){if(!this.map)return Promise.resolve();let at;return new Promise((st=>{at=setInterval((()=>{var ot,ut,Hl;"object"===typeof this.map&&(null!==(ot=this.map)&&void 0!==ot&&null!==(ut=ot.loaded)&&void 0!==ut&&ut.call(ot)?(clearInterval(at),st()):null!==(Hl=this.map)&&void 0!==Hl&&Hl.once&&this.map.once("render",(()=>{clearInterval(at),st()})))}),250)}))}async _initMap(){await new Promise((at=>{this.map=new rc.A(this,this.mapContainer,this._initParams.getMapInit()),(0,ut.saveMapParamsToLocalStorage)(this.map),this.map.once("users-changed",(()=>{this.loader.setAttribute("value",75),at()}))})),await(0,iu.mK)(this.map,this._initParams.getMapPostInit()),(0,ut.initMapKeyboardHandler)(this),(0,ut.linkMapAndPhoto)(this)}async _postAPIInit(){this.loader.setAttribute("value",30),this._createInitParamsHandler();const at=this._initParams.getParentPostInit();this._initPSV(),await this._initMap(),this._initWidgets(),this._moveChildToGrid(),(0,iu.iz)(this,at),at.keyboardShortcuts&&this._handleKeyboardManagement(),at.picture?this.psv.addEventListener("picture-loaded",(()=>{(0,iu.iz)(this,at),this.loader.dismiss()}),{once:!0}):this.loader.dismiss()}_handleKeyboardManagement(){const keytomap=()=>{this.psv.stopKeyboardControl(),this.map.keyboard.enable()},keytopsv=()=>{this.psv.startKeyboardControl(),this.map.keyboard.disable()},keytonone=()=>{this.psv.stopKeyboardControl(),this.map.keyboard.disable()},keytofocused=()=>{this.map&&this.isMapWide()?keytomap():keytopsv()};this.addEventListener("focus-changed",(at=>{"map"===at.detail.focus&&keytomap(),this.popup.getAttribute("visible")?keytonone():keytopsv()})),this.popup.addEventListener("open",(()=>keytonone())),this.popup.addEventListener("close",(()=>keytofocused()));for(let at of this.grid.childNodes)"bg"===at.getAttribute("slot")||Hl.RD.includes(at.tagName.toLowerCase())||(at.addEventListener("focusin",(()=>keytonone())),at.addEventListener("focusout",(()=>{null===this.popup.getAttribute("visible")&&keytofocused()})))}moveCenter(){const at=this.psv.getPictureMetadata();at&&(this.map&&this.isMapWide()?this.map.flyTo({center:at.gps,zoom:20}):super.moveCenter())}_moveToDirection(at){if(this.map&&this.isMapWide()){let st;switch(at){case"up":st=[0,-100];break;case"left":st=[-100,0];break;case"down":st=[0,lu];break;case"right":st=[lu,0]}this.map.panBy(st)}else super._moveToDirection(at)}isMapWide(){return this.mapContainer.parentNode==this.grid}_setFocus(at){var st,ot,ut,Hl;let rc=arguments.length>1&&void 0!==arguments[1]&&arguments[1],Sc=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if("map"===at&&!this.map)throw new Error("Map is not enabled");if(!["map","pic"].includes(at))throw new Error("Invalid focus value (should be pic or map)");if(this.focus=at,(Sc||("map"!==at||!this.map||!this.isMapWide())&&("pic"!==at||this.map&&this.isMapWide()))&&("map"===at?(this.psvContainer.parentNode==this.grid&&(this.grid.removeChild(this.psvContainer),this.psvContainer.removeAttribute("slot")),this.mapContainer.parentNode==this.mini&&this.mini.removeChild(this.mapContainer),this.mapContainer.setAttribute("slot","bg"),this.grid.appendChild(this.mapContainer),this.mini.appendChild(this.psvContainer),this.mini.icon=(0,oc.fa)(_c.pt),this._miniPicLegend&&this.mini.appendChild(this._miniPicLegend),(0,sc.isNullId)(this.picture)?this.mini.classList.add("pnx-hidden"):this.mini.classList.remove("pnx-hidden"),this.map.getCanvas().focus()):(this.mapContainer.parentNode==this.grid&&(this.grid.removeChild(this.mapContainer),this.mapContainer.removeAttribute("slot")),this.psvContainer.parentNode==this.mini&&(this.mini.removeChild(this.psvContainer),this._miniPicLegend&&this.mini.removeChild(this._miniPicLegend)),this.psvContainer.setAttribute("slot","bg"),this.grid.appendChild(this.psvContainer),this.mini.classList.remove("pnx-hidden"),this.mini.appendChild(this.mapContainer),this.mini.icon=(0,oc.fa)(wc.e5),this.psvContainer.focus()),null===this||void 0===this||null===(st=this.map)||void 0===st||null===(ot=st.resize)||void 0===ot||ot.call(st),this.psv.autoSize(),this.psv.forceRefresh(),null===(ut=this.legend)||void 0===ut||null===(Hl=ut.setAttribute)||void 0===Hl||Hl.call(ut,"focus",this.focus),!rc)){const st=new CustomEvent("focus-changed",{detail:{focus:at}});this.dispatchEvent(st)}}_toggleFocus(){this._setFocus(this.isMapWide()?"pic":"map")}_onMiniExpand(){this.map.resize(),this.psv.autoSize()}_onMapFiltersChange(){var at;const st=(0,Sc.qi)("#pnx-map-filters-menu"),ot=null===st||void 0===st?void 0:st.shadowRoot.getElementById("pnx-filter-date-from"),ut=null===st||void 0===st?void 0:st.shadowRoot.getElementById("pnx-filter-date-end"),Hl=null===st||void 0===st?void 0:st.shadowRoot.querySelectorAll("input[name='pnx-filter-type']"),rc=(0,Sc.qi)("#pnx-map-theme");let sc="";for(let wc=0;wc<Hl.length;wc++){const at=Hl[wc];if(at.checked){sc=at.value;break}}let oc=[];if(null!==(at=this.map)&&void 0!==at&&at._hasQualityScore()){const at=null===st||void 0===st?void 0:st.shadowRoot.getElementById("pnx-filter-qualityscore");oc=((null===at||void 0===at?void 0:at.grade)||"").split(",").map((at=>parseInt(at))).filter((at=>!isNaN(at))),5==oc.length&&(oc=[])}const _c={minDate:null===ot||void 0===ot?void 0:ot.value,maxDate:null===ut||void 0===ut?void 0:ut.value,pic_type:sc,theme:null===rc||void 0===rc?void 0:rc.value,qualityscore:oc};this.map.setFilters(_c)}}Viewer.properties={map:{converter:Hl.Ay.GetJSONConverter()},focus:{type:String,reflect:!0},geocoder:{type:String},...Hl.Ay.properties},customElements.define("pnx-viewer",Viewer)},3921:(at,st,ot)=>{"use strict";ot.r(st),ot.d(st,{Basic:()=>ut.A,CoverageMap:()=>Hl.A,Editor:()=>rc.A,PhotoViewer:()=>oc.Ay,Viewer:()=>sc.A});var ut=ot(9039),Hl=ot(153),rc=ot(1752),sc=ot(8743),oc=ot(3407)},9341:(at,st,ot)=>{"use strict";ot.r(st),ot.d(st,{core:()=>ut,layout:()=>Hl,menus:()=>rc,ui:()=>sc});var ut=ot(3921),Hl=ot(456),rc=ot(8794),sc=ot(9472)},6784:(at,st,ot)=>{"use strict";ot.d(st,{A:()=>BottomDrawer});var ut=ot(4542),Hl=ot(1198),rc=ot(5995);const sc={opened:0,"half-opened":.7,closed:1};class BottomDrawer extends ut.WF{constructor(){super(),this._isDragging=!1,this.openness="half-opened"}firstUpdated(){super.firstUpdated(),this._boundTouchMove=this._onTouchMove.bind(this),this._boundTouchEnd=this._onTouchEnd.bind(this),this._drawerHeight=window.innerHeight-30;const at=this._getDrawer();at&&(at.style.height=`${this._drawerHeight}px`,at.style.maxHeight=`${this._drawerHeight}px`,(0,rc.onceParentAvailable)(this).then((()=>this._parent.onceReady())).then((()=>{var at,st;null===(at=this._parent.map)||void 0===at||at.addEventListener("click",(()=>this.openness="closed")),null===(st=this._parent.psv)||void 0===st||st.addEventListener("click",(()=>this.openness="closed"))})))}attributeChangedCallback(at,st,ot){if(super.attributeChangedCallback(at,st,ot),"openness"===at){if("opened"!==ot){const at=this.shadowRoot.querySelector(".content");at&&(at.scrollTop=0)}const at=this._getDrawer();at&&(at.style.transform=null)}}disconnectedCallback(){super.disconnectedCallback(),this._cleanupTouchListeners()}_getDrawer(){var at;return null===(at=this.shadowRoot)||void 0===at?void 0:at.querySelector(".drawer")}_onHandleClick(){"opened"===this.openness?this.openness="closed":"half-opened"===this.openness?this.openness="opened":"closed"===this.openness&&(this.openness="half-opened")}_onTouchStart(at){this._isDragging=!0,this._startFingerY=at.touches[0].clientY,this._deltaFingerY=0,this._drawerY=this._drawerHeight*sc[this.openness],window.addEventListener("touchmove",this._boundTouchMove,{passive:!0}),window.addEventListener("touchend",this._boundTouchEnd),window.addEventListener("touchcancel",this._boundTouchEnd)}_onTouchMove(at){if(!this._isDragging)return;const st=this.shadowRoot.querySelector(".content");st.scrollHeight>st.offsetHeight&&st.scrollTop>0?this._updateDrawerTransform(0):(this._deltaFingerY=at.touches[0].clientY-this._startFingerY,this._updateDrawerTransform(this._drawerY+this._deltaFingerY))}_onTouchEnd(at){(this._isDragging&&!(Math.abs(this._deltaFingerY)<30)||at.target.closest(".handle"))&&(at.preventDefault(),this._isDragging=!1,0===this._deltaFingerY&&"closed"===this.openness?this.openness="half-opened":this._updateDrawerTransform(this._drawerY+this._deltaFingerY,!0),this._cleanupTouchListeners(),this._startFingerY=null,this._deltaFingerY=null)}_cleanupTouchListeners(){window.removeEventListener("touchmove",this._boundTouchMove),window.removeEventListener("touchend",this._boundTouchEnd),window.removeEventListener("touchcancel",this._boundTouchCancel)}_updateDrawerTransform(at){let st=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const ot=this._getDrawer();ot&&(at=Math.max(0,Math.min(at,this._drawerHeight-30)),st&&(this._deltaFingerY<0?"closed"===this.openness?Math.abs(this._deltaFingerY)>this._drawerHeight*(1-sc["half-opened"])?this.openness="opened":this.openness="half-opened":this.openness="opened":this.openness="closed",this._drawerY=null,at=Math.max(0,Math.min(sc[this.openness]*this._drawerHeight,this._drawerHeight-30))),ot.style.transform=`translateY(${at}px)`)}render(){const at={drawer:!0,[this.openness]:!0,dragging:this._isDragging};return ut.qy`
12
+ !function(at,st){"object"===typeof exports&&"object"===typeof module?module.exports=st():"function"===typeof define&&define.amd?define("Panoramax",[],st):"object"===typeof exports?exports.Panoramax=st():at.Panoramax=st()}(this,(()=>(()=>{var at={9039:(at,st,ot)=>{"use strict";ot.d(st,{A:()=>Basic});var ut=ot(4542),Hl=ot(5254),rc=ot(4964),sc=ot(8340),oc=ot(5995),_c=ot(7343),wc=ot(2614),Sc=ot.n(wc),iu=ot(8330);ot(1865),ot(3638);class Basic extends ut.WF{constructor(){let at=arguments.length>0&&void 0!==arguments[0]&&arguments[0];super(),this.users=["geovisio"],this.mapstyle=this.getAttribute("mapstyle")||sc.DEFAULT_TILES,this.lang=this.getAttribute("lang")||null,this.endpoint=this.getAttribute("endpoint")||null,this.picture=this.getAttribute("picture")||null,this.sequence=this.getAttribute("sequence")||null,console.info(`\ud83d\udcf7 Panoramax ${this.getClassName()} - Version ${iu.rE} (3ab9b4c)\n\n\ud83c\udd98 Issues can be reported at ${iu.Jk.O}`),at||(this._isInternetFast=null,(0,_c.isInternetFast)().then((at=>this._isInternetFast=at)))}connectedCallback(){super.connectedCallback(),this._t=(0,rc.getTranslations)(this.lang),this.loader=(0,oc.createWebComp)("pnx-loader",{_parent:this,"no-label":(0,_c.isInIframe)()}),this._loadsAPI&&this.endpoint&&this._loadsAPI===this.endpoint||this.api&&this.api._endpoint===this.endpoint||!this.endpoint||((this._loadsAPI||this.api)&&(delete this.api,delete this._loadsAPI),this._setupAPI())}_setupAPI(){if(this.loader=this.loader||(0,oc.createWebComp)("pnx-loader",{_parent:this}),!this.endpoint)return void console.warn("No endpoint is defined");this._loadsAPI=this.endpoint;let at=this.endpoint;try{this.mapstyle=JSON.parse(this.mapstyle)}catch(ot){}try{this.api=new Hl.A(this.endpoint,{users:this.users,fetch:this.fetchOptions,style:this.mapstyle}),this.api.onceReady().then((()=>{if(at!=this._loadsAPI||!this.api)return;let st=this.api.getUnavailableFeatures(),ot=this.api.getAvailableFeatures();ot=0===st.length?"\u2705 All features available":"\u2705 Available features: "+ot.join(", "),st=0===st.length?"":"\ud83d\udeab Unavailable features: "+st.join(", "),console.info(`\ud83c\udf10 Connected to API "${this.api._metadata.name}" (${this.api._endpoint})\n\u2139\ufe0f API runs STAC ${this.api._metadata.stac_version} ${this.api._metadata.geovisio_version?"& GeoVisio "+this.api._metadata.geovisio_version:""}\n ${ot}\n ${st}\n`.trim())})).catch((at=>this.loader.dismiss(at,this._t.pnx.error_api))).finally((()=>delete this._loadsAPI))}catch(ot){var st;delete this._loadsAPI,null!==(st=this.loader)&&void 0!==st&&st.dismiss?this.loader.dismiss(ot,this._t.pnx.error_api):console.error(ot)}}onceReady(){throw new Error("You must override this method on sub-class")}onceAPIReady(){return this.api?this.api.onceReady():new Promise((at=>setTimeout(at,100))).then(this.onceAPIReady.bind(this))}createRenderRoot(){return this}attributeChangedCallback(at,st,ot){if(super.attributeChangedCallback(at,st,ot),"endpoint"===at&&(this._loadsAPI&&ot&&this._loadsAPI===ot||this.api&&this.api._endpoint===ot||!ot||((this._loadsAPI||this.api)&&(delete this.api,delete this._loadsAPI),this._setupAPI())),["picture","sequence"].includes(at)){let ut,Hl,rc,sc;"picture"===at?(ut=this.sequence,rc=this.sequence,Hl=ot,sc=st):(ut=ot,rc=st,Hl=this.picture,sc=this.picture),this.dispatchEvent(new CustomEvent("select",{bubbles:!0,composed:!0,detail:{seqId:ut,picId:Hl,prevSeqId:rc,prevPicId:sc}}))}}getClassName(){return"Basic"}select(){let at=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,st=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;arguments.length>2&&void 0!==arguments[2]&&arguments[2]&&(this.picture=null,this.sequence=null),this.picture=st,this.sequence=at}isWidthSmall(){return(null===this||void 0===this?void 0:this.offsetWidth)<576}isHeightSmall(){return(null===this||void 0===this?void 0:this.offsetHeight)<400}render(){return ut.qy`<p>Should not be used directly, use Viewer/CoverageMap/Editor instead</p>`}getSubComponentsNames(){return["loader","api"]}addEventListener(at,st,ot){let ut=at.split(":").shift();if(ut&&this.getSubComponentsNames().includes(ut)){var Hl;const rc=at.substring(ut.length+1);null!==(Hl=this[ut])&&void 0!==Hl&&Hl.addEventListener?this[ut].addEventListener(rc,st,ot):setTimeout((()=>this.addEventListener(at,st,ot)),50)}else super.addEventListener(at,st,ot)}static GetJSONConverter(){return{fromAttribute:at=>null===at||""===at?null:"object"===typeof at||Array.isArray(at)?at:Sc().parse(at),toAttribute:at=>null===at||""===at?"":"string"===typeof at?at:Sc().stringify(at)}}}Basic.properties={picture:{type:String,reflect:!0},sequence:{type:String,reflect:!0},fetchOptions:{converter:Basic.GetJSONConverter()},users:{type:Array,reflect:!0},mapstyle:{type:String},lang:{type:String},endpoint:{type:String}}},153:(at,st,ot)=>{"use strict";ot.d(st,{A:()=>CoverageMap});var ut=ot(9039),Hl=ot(5642),rc=ot(8340),sc=ot(927),oc=(ot(7776),ot(2118));class CoverageMap extends ut.A{constructor(){super(),this._mapContainer=document.createElement("div"),this.onceAPIReady().then((()=>{this.loader.setAttribute("value",30),this._initParams=new oc.Ay(oc.Ay.GetComponentProperties(CoverageMap,this)),this._initMap()}))}disconnectedCallback(){var at;super.disconnectedCallback(),null===(at=this.map)||void 0===at||at.destroy()}getClassName(){return"CoverageMap"}onceReady(){return this.map&&this.map.waitForEnoughMapLoaded?this.map.waitForEnoughMapLoaded():new Promise((at=>setTimeout(at,100))).then(this.onceReady.bind(this))}render(){return[this.loader,this._mapContainer]}getSubComponentsNames(){const at=super.getSubComponentsNames();return at.push("map"),at}_initMap(){class MyMap extends Hl.A{_getLayerStyleProperties(at){return"pictures_symbols"===at?{layout:{visibility:"none"}}:super._getLayerStyleProperties(at)}}this.map=new MyMap(this,this._mapContainer,Object.assign({},this._initParams.getMapInit(),{hash:!0})),this.map.addControl(new sc.NavigationControl({showCompass:!1})),this.loader.setAttribute("value",70),this.addEventListener("select",this._onSelect.bind(this)),this.map.on("picture-click",(at=>this.select(at.seqId,at.picId))),this.map.on("sequence-click",(at=>this.select(at.seqId))),this.map.waitForEnoughMapLoaded().then((async()=>{await(0,oc.mK)(this.map,this._initParams.getMapPostInit()),this.map.reloadLayersStyles(),this.loader.dismiss()}))}_onSelect(at){if(at.detail.picId||at.detail.seqId){const st=at.detail.picId?"pictures":"sequences",ot=this.map.queryRenderedFeatures({layers:[...this.map._userLayers].map((at=>(0,rc.getUserLayerId)(at,st))),filter:["==",["get","id"],at.detail.picId||at.detail.seqId]});ot.length>=0&&null!=ot[0]&&this.map._attachPreviewToPictures({features:ot},st)}}}CoverageMap.properties={map:{converter:ut.A.GetJSONConverter()},...ut.A.properties},customElements.define("pnx-coverage-map",CoverageMap)},1752:(at,st,ot)=>{"use strict";ot.d(st,{A:()=>Editor});ot(7365);var ut=ot(9039),Hl=ot(5642),rc=ot(9048),sc=ot(508),oc=ot(8340),_c=ot(1545),wc=ot(5995);const Sc="sequence-headings";class Editor extends ut.A{constructor(){super(),this.raster=null,this.background="streets",this.users=[],this._psvContainer=document.createElement("div"),this._psvContainer.setAttribute("slot","bg"),this._mapContainer=document.createElement("div"),this._mapContainer.setAttribute("slot","bg"),this.grid=(0,wc.createWebComp)("pnx-cornered-grid"),this.grid.appendChild(this._psvContainer),this.grid.appendChild(this._mapContainer),this.onceAPIReady().then((()=>{this.loader.setAttribute("value",30),this.sequence||this.loader.dismiss({},"No sequence is selected"),this.addEventListener("select",this._onSelect.bind(this)),this._initPSV(),this._initMap()}))}disconnectedCallback(){var at,st;super.disconnectedCallback(),null===(at=this.map)||void 0===at||at.destroy(),null===(st=this.psv)||void 0===st||st.destroy()}getClassName(){return"Editor"}onceReady(){var at,st;return this.map&&this.psv&&null!==(at=(st=this.map).loaded)&&void 0!==at&&at.call(st)?Promise.resolve():new Promise((at=>setTimeout(at,100))).then(this.onceReady.bind(this))}connectedCallback(){Array.isArray(this.users)&&this.users.length>0&&(console.warn("Parameters users can't be changed in Editor, only selected sequence can be visible"),this.users=[]),super.connectedCallback(),window.addEventListener("DOMContentLoaded",(()=>{this._moveChildToGrid()}),{once:!0})}attributeChangedCallback(at,st,ot){"users"===at&&Array.isArray(ot)&&ot.length>0?console.warn("Parameters users can't be changed in Editor, only selected sequence can be visible"):super.attributeChangedCallback(at,st,ot)}render(){return[this.loader,this.grid]}getSubComponentsNames(){return super.getSubComponentsNames().concat(["map","psv","grid"])}_initPSV(){try{this.psv=new rc.Ay(this,this._psvContainer),this.psv._myVTour.datasource.nodeResolver=this._getNode.bind(this)}catch(at){let st=_c.IJ.isWebGLSupported?this._t.pnx.error_psv:this._t.pnx.error_webgl;this.loader.dismiss(at,st)}}_initMap(){try{this.map=new Hl.A(this,this._mapContainer,{raster:this.raster,background:this.background,supplementaryStyle:this._createMapStyle(),zoom:15,picMarkerDraggable:!0}),(0,oc.linkMapAndPhoto)(this),this.loader.setAttribute("value",50),this._loadSequence(),this.map.once("load",(()=>{this.map.hasTwoBackgrounds()&&this._addMapBackgroundWidget(),this._bindPicturesEvents()}));const at=this.map._picMarker.setRotation.bind(this.map._picMarker);this.map._picMarker.setRotation=st=>(st=void 0===this._lastRelHeading?st:st+this._lastRelHeading-this.psv.getPictureRelativeHeading(),at(st))}catch(at){this.loader.dismiss(at,this._t.pnx.error_psv)}}_createMapStyle(){return{sources:{geovisio_editor_sequences:{type:"geojson",data:{type:"FeatureCollection",features:[]}}},layers:[{id:"geovisio_editor_sequences",type:"line",source:"geovisio_editor_sequences",layout:{...oc.VECTOR_STYLES.SEQUENCES.layout},paint:{...oc.VECTOR_STYLES.SEQUENCES.paint}},{id:"geovisio_editor_pictures",type:"circle",source:"geovisio_editor_sequences",layout:{...oc.VECTOR_STYLES.PICTURES.layout},paint:{...oc.VECTOR_STYLES.PICTURES.paint}}]}}_bindPicturesEvents(){this.map.on("mousemove","geovisio_editor_pictures",(()=>{this.map.getCanvas().style.cursor="pointer"})),this.map.on("mouseleave","geovisio_editor_pictures",(()=>{this.map.getCanvas().style.cursor=""})),this.map.on("click","geovisio_editor_pictures",this.map._onPictureClick.bind(this.map))}_loadSequence(){return this.loader.setAttribute("value",60),this.api.getSequenceItems(this.sequence).then((at=>{if(this.loader.setAttribute("value",80),this.map.once("sourcedata",(()=>{this.map.setPaintProperty("geovisio_editor_sequences","line-color",this.map._getLayerColorStyle("sequences")),this.map.setPaintProperty("geovisio_editor_pictures","circle-color",this.map._getLayerColorStyle("pictures")),this.map.setLayoutProperty("geovisio_editor_sequences","visibility","visible"),this.map.setLayoutProperty("geovisio_editor_pictures","visibility","visible"),this.map.once("styledata",(()=>this.loader.dismiss()))})),this._sequenceData=at.features,this.map.getSource("geovisio_editor_sequences").setData({type:"FeatureCollection",features:[{id:this.sequence,type:"Feature",properties:{id:this.sequence},geometry:{type:"LineString",coordinates:at.features.map((at=>at.geometry.coordinates))}},...at.features.map((at=>(at.properties.id=at.id,at.properties.sequences=[this.sequence],at)))]}),this.picture){const st=at.features.find((at=>at.id===this.picture));st?(this.select(this.sequence,this.picture,!0),this.map.jumpTo({center:st.geometry.coordinates,zoom:18})):console.log("Picture with ID",st,"was not found")}else{const st=[...at.features[0].geometry.coordinates,...at.features[0].geometry.coordinates];for(let ot=1;ot<at.features.length;ot++){const ut=at.features[ot].geometry.coordinates;ut[0]<st[0]&&(st[0]=ut[0]),ut[1]<st[1]&&(st[1]=ut[1]),ut[0]>st[2]&&(st[2]=ut[0]),ut[1]>st[3]&&(st[3]=ut[1])}this.map.fitBounds(st,{animate:!1})}})).catch((at=>this.loader.dismiss(at,this._t.pnx.error_api)))}_getNode(at){const st=this._sequenceData.find((st=>st.properties.id===at)),ot=st?(0,sc.apiFeatureToPSVNode)(st,this._t,this._isInternetFast):null;return ot&&delete ot.links,ot}_addMapBackgroundWidget(){const at=(0,wc.createWebComp)("pnx-map-background",{_parent:this,size:"sm",slot:"bottom-left"});this.grid.appendChild(at)}_moveChildToGrid(){Array.from(this.querySelectorAll("[slot]")).forEach((at=>{var st;null!==(st=at.tagName)&&void 0!==st&&st.toLowerCase().startsWith("pnx-")&&(at._parent=this,at._t=this._t),this.grid.appendChild(at)}))}previewSequenceHeadingChange(at){const st=void 0!==this.map.getLayer(Sc);if(this.map._picMarkerPreview.remove(),void 0===at)return delete this._lastRelHeading,st&&this.map.setLayoutProperty(Sc,"visibility","none"),void(this.picture&&this.map._picMarker.setRotation(this.psv.getXY().x));this._lastRelHeading=at,st||this.map.addLayer({id:Sc,type:"symbol",source:"geovisio_editor_sequences",layout:{"icon-image":"pnx-marker","icon-overlap":"always","icon-size":.8}});const ot=-this.psv.getPictureRelativeHeading();this.map.setLayoutProperty(Sc,"visibility","visible"),this.map.setLayoutProperty(Sc,"icon-rotate",["+",["get","view:azimuth"],ot,at]);const ut=[["==",["geometry-type"],"Point"]];this.picture&&ut.push(["!=",["get","id"],this.picture]),this.map.setFilter(Sc,["all",...ut]),this.picture&&this.map._picMarker.setRotation(this.psv.getXY().x)}_onSelect(){void 0!==this._lastRelHeading&&this.previewSequenceHeadingChange(this._lastRelHeading)}}Editor.properties={raster:{converter:ut.A.GetJSONConverter()},background:{type:String},...ut.A.properties},customElements.define("pnx-editor",Editor)},3407:(at,st,ot)=>{"use strict";ot.d(st,{Ay:()=>PhotoViewer,RD:()=>su});ot(970);var ut=ot(1545),Hl=ot(4451),rc=ot(9039),sc=ot(9048),oc=ot(5995),_c=ot(7343),wc=ot(2118),Sc=ot(4207);const iu=Math.PI/6,su=["pnx-mini","pnx-widget-player","pnx-widget-zoom"];class PhotoViewer extends rc.A{constructor(){super(),this.psv={},this["url-parameters"]=this.getAttribute("url-parameters")||!0,this["keyboard-shortcuts"]=this.getAttribute("keyboard-shortcuts")||!0,this.widgets=this.getAttribute("widgets")||"true",this.grid=(0,oc.createWebComp)("pnx-cornered-grid"),this.psvContainer=document.createElement("div"),this.psvContainer.setAttribute("slot","bg"),this.grid.appendChild(this.psvContainer),this.popup=(0,oc.createWebComp)("pnx-popup",{_parent:this,onclose:this._onPopupClose.bind(this)})}_createInitParamsHandler(){var at,st;this._initParams=new wc.Ay(wc.Ay.GetComponentProperties(PhotoViewer,this),Object.assign({},null===(at=this.urlHandler)||void 0===at?void 0:at.currentURLParams(),null===(st=this.urlHandler)||void 0===st?void 0:st.currentURLParams(!0)),{})}_initWidgets(){"false"!==this._initParams.getParentPostInit().widgets&&((0,_c.isInIframe)()||(this.grid.appendChild((0,oc.createWebComp)("pnx-widget-player",{slot:"top",_parent:this,class:"pnx-only-psv pnx-print-hidden",size:this.isHeightSmall()?"md":"xl"})),this.grid.appendChild((0,oc.createWebComp)("pnx-annotations-switch",{slot:"top",_parent:this,class:"pnx-only-psv pnx-print-hidden",size:this.isHeightSmall()?"md":"xl"}))),(0,_c.isInIframe)()?(this.legend=(0,oc.createWebComp)("pnx-widget-legend",{slot:"bottom-right",light:!0,_parent:this,focus:this._initParams.getParentPostInit().focus,picture:this._initParams.getParentPostInit().picture}),this.grid.appendChild(this.legend)):this.isWidthSmall()?(this.legend=(0,oc.createWebComp)("pnx-picture-legend",{_parent:this}),this.bottomDrawer=(0,oc.createWebComp)("pnx-bottom-drawer",{slot:"bottom",_parent:this,class:this._initParams.getParentPostInit().picture?void 0:"pnx-hidden"}),this.bottomDrawer.appendChild(this.legend),this.grid.appendChild(this.bottomDrawer),this.addEventListener("select",(at=>{(0,_c.isNullId)(at.detail.picId)?this.bottomDrawer.classList.add("pnx-hidden"):this.bottomDrawer.classList.remove("pnx-hidden")}))):(this.legend=(0,oc.createWebComp)("pnx-widget-legend",{slot:this.isWidthSmall()?void 0:"top-left",_parent:this,focus:this._initParams.getParentPostInit().focus,picture:this._initParams.getParentPostInit().picture}),this.grid.appendChild((0,oc.createWebComp)("pnx-widget-zoom",{slot:"bottom-right",class:"pnx-print-hidden",_parent:this})),this.grid.appendChild(this.legend)))}connectedCallback(){super.connectedCallback(),this.presetsManager=new Sc.A(this.lang),this["url-parameters"]&&"false"!==this["url-parameters"]&&(this.urlHandler=new Hl.A(this),this.onceReady().then((()=>{this.urlHandler.listenToChanges(),this.urlHandler._onParentChange()}))),this.onceAPIReady().then(this._postAPIInit.bind(this)),window.addEventListener("DOMContentLoaded",(()=>{this._moveChildToGrid()}),{once:!0})}disconnectedCallback(){var at,st;super.disconnectedCallback(),null===(at=this.urlHandler)||void 0===at||at.destroy(),null===(st=this.psv)||void 0===st||st.destroy()}getClassName(){return"PhotoViewer"}onceReady(){return this.oncePSVReady().then((()=>this._initParams.getParentPostInit().picture&&!this.psv.getPictureMetadata()?this.onceFirstPicLoaded():Promise.resolve()))}render(){return[this.loader,this.grid,this.popup]}getSubComponentsNames(){return super.getSubComponentsNames().concat(["psv","grid","popup","urlHandler"])}oncePSVReady(){let at;return new Promise((st=>{at=setInterval((()=>{this.psv&&"object"===typeof this.psv&&(this.psv.container?(clearInterval(at),st()):this.psv.addEventListener&&this.psv.addEventListener("ready",(()=>{clearInterval(at),st()}),{once:!0}))}),250)}))}onceFirstPicLoaded(){return this.oncePSVReady().then((()=>this.psv.getPictureMetadata()?Promise.resolve():new Promise((at=>{this.psv.addEventListener("picture-loaded",at,{once:!0})}))))}async _postAPIInit(){this.loader.setAttribute("value",30),this._createInitParamsHandler();const at=this._initParams.getParentPostInit();this._initPSV(),this._initWidgets(),(0,wc.ai)(this,at),at.keyboardShortcuts&&this._handleKeyboardManagement(),at.picture?this.psv.addEventListener("picture-loaded",(()=>this.loader.dismiss()),{once:!0}):this.loader.dismiss()}_initPSV(){try{this.psv=new sc.Ay(this,this.psvContainer,{shouldGoFast:this._psvShouldGoFast.bind(this),keyboard:"always",keyboardActions:{...ut.zY.keyboardActions,8:"ROTATE_UP",2:"ROTATE_DOWN",4:"ROTATE_LEFT",6:"ROTATE_RIGHT",PageUp:()=>this.psv.goToNextPicture(),9:()=>this.psv.goToNextPicture(),PageDown:()=>this.psv.goToPrevPicture(),3:()=>this.psv.goToPrevPicture(),5:()=>this.moveCenter(),"*":()=>this.moveCenter(),Home:()=>this._toggleFocus(),7:()=>this._toggleFocus(),End:()=>this.mini.toggleAttribute("collapsed"),1:()=>this.mini.toggleAttribute("collapsed")," ":()=>this.psv.toggleSequencePlaying(),0:()=>this.psv.toggleSequencePlaying()},...this._initParams.getPSVInit()}),this.oncePSVReady().then((()=>{this.loader.setAttribute("value",50),(0,wc.Vy)(this.psv,this._initParams.getPSVPostInit())})),this.psv.addEventListener("sequence-playing",(()=>this.classList.add("pnx-playing"))),this.psv.addEventListener("sequence-stopped",(()=>this.classList.remove("pnx-playing")))}catch(at){let st=ut.IJ.isWebGLSupported?this._t.pnx.error_psv:this._t.pnx.error_webgl;this.loader.dismiss(at,st)}}_handleKeyboardManagement(){const keytonone=()=>this.psv.stopKeyboardControl(),keytopsv=()=>this.psv.startKeyboardControl();this.popup.addEventListener("open",keytonone),this.popup.addEventListener("close",keytopsv),this.psv.addEventListener("click",keytopsv);for(let at of this.grid.childNodes)"bg"===at.getAttribute("slot")||su.includes(at.tagName.toLowerCase())||(at.addEventListener("focusin",keytonone),at.addEventListener("focusout",(()=>{null===this.popup.getAttribute("visible")&&keytopsv()})))}_psvShouldGoFast(){return this.psv._sequencePlaying&&this.psv.getTransitionDuration()<1e3}_moveChildToGrid(){Array.from(this.querySelectorAll("[slot]")).forEach((at=>{var st;null!==(st=at.tagName)&&void 0!==st&&st.toLowerCase().startsWith("pnx-")&&(at._parent=this,at._t=this._t),"editors"===at.getAttribute("slot")?this.onceReady().then((()=>{var st;return null===(st=this.legend)||void 0===st?void 0:st.appendChild(at)})):this.grid.appendChild(at)}))}setPopup(at){let st=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;at?this.popup.setAttribute("visible",""):this.popup.removeAttribute("visible"),this.popup.innerHTML="","string"===typeof st?this.popup.innerHTML=st:Array.isArray(st)&&st.forEach((at=>this.popup.appendChild(at)))}_onPopupClose(){this.dispatchEvent(new CustomEvent("focus-changed",{detail:{focus:this.map&&this.isMapWide()?"map":"pic"}}))}_showQualityScoreDoc(){this.setPopup(!0,[(0,oc.createWebComp)("pnx-quality-score-doc",{_t:this._t})])}_showReportForm(){if(!this.psv.getPictureMetadata())throw new Error("No picture currently selected");this.setPopup(!0,[(0,oc.createWebComp)("pnx-report-form",{_parent:this})])}_showShareOptions(){this.setPopup(!0,[(0,oc.createWebComp)("pnx-share-menu",{_parent:this})])}moveCenter(){this.psv.getPictureMetadata()&&this._psvAnimate({speed:sc.LM,yaw:0,pitch:0,zoom:sc.cS})}moveLeft(){this._moveToDirection("left")}moveRight(){this._moveToDirection("right")}moveUp(){this._moveToDirection("up")}moveDown(){this._moveToDirection("down")}_moveToDirection(at){let st=this.psv.getPosition();switch(at){case"up":st.pitch+=iu;break;case"left":st.yaw-=iu;break;case"down":st.pitch-=iu;break;case"right":st.yaw+=iu}this._psvAnimate({speed:sc.LM,...st})}_psvAnimate(at){this._lastPsvAnim&&this._lastPsvAnim.cancel(),this._lastPsvAnim=this.psv.animate(at)}addEventListener(at,st,ot){super.addEventListener(at,st,ot)}}PhotoViewer.properties={psv:{converter:rc.A.GetJSONConverter()},widgets:{type:String},"url-parameters":{type:String},"keyboard-shortcuts":{type:String},...rc.A.properties},customElements.define("pnx-photo-viewer",PhotoViewer)},8743:(at,st,ot)=>{"use strict";ot.d(st,{$:()=>su,A:()=>Viewer});ot(9616);var ut=ot(8340),Hl=ot(3407),rc=ot(2771),sc=ot(7343),oc=ot(5995),_c=ot(9683),wc=ot(2e3),Sc=ot(9438),iu=ot(2118);const su=20,lu=100;class Viewer extends Hl.Ay{constructor(){super(),this.map=!0,this.geocoder=this.getAttribute("geocoder")||"nominatim",this.mini=(0,oc.createWebComp)("pnx-mini",{slot:"bottom-left",_parent:this,onexpand:this._onMiniExpand.bind(this),collapsed:!!(0,sc.isNullId)(this.picture)||void 0}),this.mini.addEventListener("expand",this._toggleFocus.bind(this)),this.grid.appendChild(this.mini),this.mapContainer=document.createElement("div")}_createInitParamsHandler(){var at,st;this._initParams=new iu.Ay(iu.Ay.GetComponentProperties(Viewer,this),Object.assign({},null===(at=this.urlHandler)||void 0===at?void 0:at.currentURLParams(),null===(st=this.urlHandler)||void 0===st?void 0:st.currentURLParams(!0)),{map:(0,ut.getMapParamsFromLocalStorage)()})}_initWidgets(){var at,st;"false"!==this._initParams.getParentPostInit().widgets&&(this.grid.appendChild((0,oc.createWebComp)("pnx-widget-zoom",{slot:this.isWidthSmall()?"top-left":"bottom-right",class:this.isWidthSmall()?"pnx-only-map pnx-print-hidden":"pnx-print-hidden",_parent:this})),(0,sc.isInIframe)()?(this.legend=(0,oc.createWebComp)("pnx-widget-legend",{slot:"bottom-right",light:!0,_parent:this,focus:this._initParams.getParentPostInit().focus,picture:this._initParams.getParentPostInit().picture}),this.grid.appendChild(this.legend)):this.isWidthSmall()?(this.legend=(0,oc.createWebComp)("pnx-picture-legend",{_parent:this}),this.bottomDrawer=(0,oc.createWebComp)("pnx-bottom-drawer",{slot:"bottom",_parent:this,class:this._initParams.getParentPostInit().picture?void 0:"pnx-hidden"}),this.bottomDrawer.appendChild(this.legend),this.grid.appendChild(this.bottomDrawer),this.addEventListener("select",(at=>{(0,sc.isNullId)(at.detail.picId)?this.bottomDrawer.classList.add("pnx-hidden"):this.bottomDrawer.classList.remove("pnx-hidden")}))):(this.legend=(0,oc.createWebComp)("pnx-widget-legend",{slot:this.isWidthSmall()?"top":"top-left",_parent:this,focus:this._initParams.getParentPostInit().focus,picture:this._initParams.getParentPostInit().picture}),this._miniPicLegend=(0,oc.createWebComp)("pnx-mini-picture-legend",{_parent:this}),this.grid.appendChild(this.legend)),(0,sc.isInIframe)()||(this.grid.appendChild((0,oc.createWebComp)("pnx-widget-player",{slot:"top",_parent:this,class:"pnx-only-psv pnx-print-hidden",size:this.isHeightSmall()?"md":"xl"})),this.grid.appendChild((0,oc.createWebComp)("pnx-annotations-switch",{slot:"top",_parent:this,class:"pnx-only-psv pnx-print-hidden",size:this.isHeightSmall()?"md":"xl"})),this.grid.appendChild((0,oc.createWebComp)("pnx-widget-geosearch",{slot:this.isWidthSmall()?"top-right":"top-left",_parent:this,class:"pnx-only-map pnx-print-hidden",geocoder:this._initParams.getParentPostInit().geocoder})),this.grid.appendChild((0,oc.createWebComp)("pnx-widget-mapfilters",{slot:this.isWidthSmall()?"top-right":"top-left",_parent:this,"user-search":null!==this.api._endpoints.user_search&&null!==this.api._endpoints.user_tiles,"quality-score":(null===(at=this.map)||void 0===at||null===(st=at._hasQualityScore)||void 0===st?void 0:st.call(at))||!1,class:"pnx-only-map pnx-print-hidden"})),this.grid.appendChild((0,oc.createWebComp)("pnx-widget-maplayers",{slot:"top-right",_parent:this,class:"pnx-only-map pnx-print-hidden"}))))}disconnectedCallback(){var at;super.disconnectedCallback(),null===(at=this.map)||void 0===at||at.destroy()}getClassName(){return"Viewer"}getSubComponentsNames(){return super.getSubComponentsNames().concat(["mini","map"])}onceReady(){return Promise.all([this.oncePSVReady(),this.onceMapReady()]).then((()=>this._initParams.getParentPostInit().picture&&!this.psv.getPictureMetadata()?this.onceFirstPicLoaded():Promise.resolve()))}attributeChangedCallback(at,st,ot){var ut,Hl,rc,oc;(super.attributeChangedCallback(at,st,ot),"picture"===at)&&(null===(ut=this.legend)||void 0===ut||null===(Hl=ut.setAttribute)||void 0===Hl||Hl.call(ut,"picture",ot),(0,sc.isNullId)(st)&&!(0,sc.isNullId)(ot)&&this.mini.removeAttribute("collapsed"),(0,sc.isNullId)(ot)?this.map&&this.isMapWide()?this.mini.classList.add("pnx-hidden"):this.map&&!this.isMapWide()&&this._setFocus("map"):(this.mini.classList.remove("pnx-hidden"),(0,sc.isNullId)(st)&&(this._setFocus("pic"),"closed"===(null===(rc=this.bottomDrawer)||void 0===rc||null===(oc=rc.getAttribute)||void 0===oc?void 0:oc.call(rc,"openness"))&&this.bottomDrawer.setAttribute("openness","half-opened"))));"focus"===at&&this._setFocus(ot)}onceMapReady(){if(!this.map)return Promise.resolve();let at;return new Promise((st=>{at=setInterval((()=>{var ot,ut,Hl;"object"===typeof this.map&&(null!==(ot=this.map)&&void 0!==ot&&null!==(ut=ot.loaded)&&void 0!==ut&&ut.call(ot)?(clearInterval(at),st()):null!==(Hl=this.map)&&void 0!==Hl&&Hl.once&&this.map.once("render",(()=>{clearInterval(at),st()})))}),250)}))}async _initMap(){await new Promise((at=>{this.map=new rc.A(this,this.mapContainer,this._initParams.getMapInit()),(0,ut.saveMapParamsToLocalStorage)(this.map),this.map.once("users-changed",(()=>{this.loader.setAttribute("value",75),at()}))})),await(0,iu.mK)(this.map,this._initParams.getMapPostInit()),(0,ut.initMapKeyboardHandler)(this),(0,ut.linkMapAndPhoto)(this)}async _postAPIInit(){this.loader.setAttribute("value",30),this._createInitParamsHandler();const at=this._initParams.getParentPostInit();this._initPSV(),await this._initMap(),this._initWidgets(),this._moveChildToGrid(),(0,iu.iz)(this,at),at.keyboardShortcuts&&this._handleKeyboardManagement(),at.picture?this.psv.addEventListener("picture-loaded",(()=>{(0,iu.iz)(this,at),this.loader.dismiss()}),{once:!0}):this.loader.dismiss()}_handleKeyboardManagement(){const keytomap=()=>{this.psv.stopKeyboardControl(),this.map.keyboard.enable()},keytopsv=()=>{this.psv.startKeyboardControl(),this.map.keyboard.disable()},keytonone=()=>{this.psv.stopKeyboardControl(),this.map.keyboard.disable()},keytofocused=()=>{this.map&&this.isMapWide()?keytomap():keytopsv()};this.addEventListener("focus-changed",(at=>{"map"===at.detail.focus&&keytomap(),this.popup.getAttribute("visible")?keytonone():keytopsv()})),this.popup.addEventListener("open",(()=>keytonone())),this.popup.addEventListener("close",(()=>keytofocused()));for(let at of this.grid.childNodes)"bg"===at.getAttribute("slot")||Hl.RD.includes(at.tagName.toLowerCase())||(at.addEventListener("focusin",(()=>keytonone())),at.addEventListener("focusout",(()=>{null===this.popup.getAttribute("visible")&&keytofocused()})))}moveCenter(){const at=this.psv.getPictureMetadata();at&&(this.map&&this.isMapWide()?this.map.flyTo({center:at.gps,zoom:20}):super.moveCenter())}_moveToDirection(at){if(this.map&&this.isMapWide()){let st;switch(at){case"up":st=[0,-100];break;case"left":st=[-100,0];break;case"down":st=[0,lu];break;case"right":st=[lu,0]}this.map.panBy(st)}else super._moveToDirection(at)}isMapWide(){return this.mapContainer.parentNode==this.grid}_setFocus(at){var st,ot,ut,Hl;let rc=arguments.length>1&&void 0!==arguments[1]&&arguments[1],Sc=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if("map"===at&&!this.map)throw new Error("Map is not enabled");if(!["map","pic"].includes(at))throw new Error("Invalid focus value (should be pic or map)");if(this.focus=at,(Sc||("map"!==at||!this.map||!this.isMapWide())&&("pic"!==at||this.map&&this.isMapWide()))&&("map"===at?(this.psvContainer.parentNode==this.grid&&(this.grid.removeChild(this.psvContainer),this.psvContainer.removeAttribute("slot")),this.mapContainer.parentNode==this.mini&&this.mini.removeChild(this.mapContainer),this.mapContainer.setAttribute("slot","bg"),this.grid.appendChild(this.mapContainer),this.mini.appendChild(this.psvContainer),this.mini.icon=(0,oc.fa)(_c.pt),this._miniPicLegend&&this.mini.appendChild(this._miniPicLegend),(0,sc.isNullId)(this.picture)?this.mini.classList.add("pnx-hidden"):this.mini.classList.remove("pnx-hidden"),this.map.getCanvas().focus()):(this.mapContainer.parentNode==this.grid&&(this.grid.removeChild(this.mapContainer),this.mapContainer.removeAttribute("slot")),this.psvContainer.parentNode==this.mini&&(this.mini.removeChild(this.psvContainer),this._miniPicLegend&&this.mini.removeChild(this._miniPicLegend)),this.psvContainer.setAttribute("slot","bg"),this.grid.appendChild(this.psvContainer),this.mini.classList.remove("pnx-hidden"),this.mini.appendChild(this.mapContainer),this.mini.icon=(0,oc.fa)(wc.e5),this.psvContainer.focus()),null===this||void 0===this||null===(st=this.map)||void 0===st||null===(ot=st.resize)||void 0===ot||ot.call(st),this.psv.autoSize(),this.psv.forceRefresh(),null===(ut=this.legend)||void 0===ut||null===(Hl=ut.setAttribute)||void 0===Hl||Hl.call(ut,"focus",this.focus),!rc)){const st=new CustomEvent("focus-changed",{detail:{focus:at}});this.dispatchEvent(st)}}_toggleFocus(){this._setFocus(this.isMapWide()?"pic":"map")}_onMiniExpand(){this.map.resize(),this.psv.autoSize()}_onMapFiltersChange(){var at;const st=(0,Sc.qi)("#pnx-map-filters-menu"),ot=null===st||void 0===st?void 0:st.shadowRoot.getElementById("pnx-filter-date-from"),ut=null===st||void 0===st?void 0:st.shadowRoot.getElementById("pnx-filter-date-end"),Hl=null===st||void 0===st?void 0:st.shadowRoot.querySelectorAll("input[name='pnx-filter-type']"),rc=(0,Sc.qi)("#pnx-map-theme");let sc="";for(let wc=0;wc<Hl.length;wc++){const at=Hl[wc];if(at.checked){sc=at.value;break}}let oc=[];if(null!==(at=this.map)&&void 0!==at&&at._hasQualityScore()){const at=null===st||void 0===st?void 0:st.shadowRoot.getElementById("pnx-filter-qualityscore");oc=((null===at||void 0===at?void 0:at.grade)||"").split(",").map((at=>parseInt(at))).filter((at=>!isNaN(at))),5==oc.length&&(oc=[])}const _c={minDate:null===ot||void 0===ot?void 0:ot.value,maxDate:null===ut||void 0===ut?void 0:ut.value,pic_type:sc,theme:null===rc||void 0===rc?void 0:rc.value,qualityscore:oc};this.map.setFilters(_c)}}Viewer.properties={map:{converter:Hl.Ay.GetJSONConverter()},focus:{type:String,reflect:!0},geocoder:{type:String},...Hl.Ay.properties},customElements.define("pnx-viewer",Viewer)},3921:(at,st,ot)=>{"use strict";ot.r(st),ot.d(st,{Basic:()=>ut.A,CoverageMap:()=>Hl.A,Editor:()=>rc.A,PhotoViewer:()=>oc.Ay,Viewer:()=>sc.A});var ut=ot(9039),Hl=ot(153),rc=ot(1752),sc=ot(8743),oc=ot(3407)},9341:(at,st,ot)=>{"use strict";ot.r(st),ot.d(st,{core:()=>ut,layout:()=>Hl,menus:()=>rc,ui:()=>sc});var ut=ot(3921),Hl=ot(456),rc=ot(8794),sc=ot(9472)},6784:(at,st,ot)=>{"use strict";ot.d(st,{A:()=>BottomDrawer});var ut=ot(4542),Hl=ot(1198),rc=ot(5995);const sc={opened:0,"half-opened":.7,closed:1};class BottomDrawer extends ut.WF{constructor(){super(),this._isDragging=!1,this.openness="half-opened"}firstUpdated(){super.firstUpdated(),this._boundTouchMove=this._onTouchMove.bind(this),this._boundTouchEnd=this._onTouchEnd.bind(this),this._drawerHeight=window.innerHeight-30;const at=this._getDrawer();at&&(at.style.height=`${this._drawerHeight}px`,at.style.maxHeight=`${this._drawerHeight}px`,(0,rc.onceParentAvailable)(this).then((()=>this._parent.onceReady())).then((()=>{var at,st;null===(at=this._parent.map)||void 0===at||at.addEventListener("click",(()=>this.openness="closed")),null===(st=this._parent.psv)||void 0===st||st.addEventListener("click",(()=>this.openness="closed"))})))}attributeChangedCallback(at,st,ot){if(super.attributeChangedCallback(at,st,ot),"openness"===at){if("opened"!==ot){const at=this.shadowRoot.querySelector(".content");at&&(at.scrollTop=0)}const at=this._getDrawer();at&&(at.style.transform=null)}}disconnectedCallback(){super.disconnectedCallback(),this._cleanupTouchListeners()}_getDrawer(){var at;return null===(at=this.shadowRoot)||void 0===at?void 0:at.querySelector(".drawer")}_onHandleClick(){"opened"===this.openness?this.openness="closed":"half-opened"===this.openness?this.openness="opened":"closed"===this.openness&&(this.openness="half-opened")}_onTouchStart(at){this._isDragging=!0,this._startFingerY=at.touches[0].clientY,this._deltaFingerY=0,this._drawerY=this._drawerHeight*sc[this.openness],window.addEventListener("touchmove",this._boundTouchMove,{passive:!0}),window.addEventListener("touchend",this._boundTouchEnd),window.addEventListener("touchcancel",this._boundTouchEnd)}_onTouchMove(at){if(!this._isDragging)return;const st=this.shadowRoot.querySelector(".content");st.scrollHeight>st.offsetHeight&&st.scrollTop>0?this._updateDrawerTransform(0):(this._deltaFingerY=at.touches[0].clientY-this._startFingerY,this._updateDrawerTransform(this._drawerY+this._deltaFingerY))}_onTouchEnd(at){(this._isDragging&&!(Math.abs(this._deltaFingerY)<30)||at.target.closest(".handle"))&&(at.preventDefault(),this._isDragging=!1,0===this._deltaFingerY&&"closed"===this.openness?this.openness="half-opened":this._updateDrawerTransform(this._drawerY+this._deltaFingerY,!0),this._cleanupTouchListeners(),this._startFingerY=null,this._deltaFingerY=null)}_cleanupTouchListeners(){window.removeEventListener("touchmove",this._boundTouchMove),window.removeEventListener("touchend",this._boundTouchEnd),window.removeEventListener("touchcancel",this._boundTouchCancel)}_updateDrawerTransform(at){let st=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const ot=this._getDrawer();ot&&(at=Math.max(0,Math.min(at,this._drawerHeight-30)),st&&(this._deltaFingerY<0?"closed"===this.openness?Math.abs(this._deltaFingerY)>this._drawerHeight*(1-sc["half-opened"])?this.openness="opened":this.openness="half-opened":this.openness="opened":this.openness="closed",this._drawerY=null,at=Math.max(0,Math.min(sc[this.openness]*this._drawerHeight,this._drawerHeight-30))),ot.style.transform=`translateY(${at}px)`)}render(){const at={drawer:!0,[this.openness]:!0,dragging:this._isDragging};return ut.qy`
13
13
  <div
14
14
  class=${(0,Hl.H)(at)}
15
15
  @touchstart="${this._onTouchStart}"
@@ -2704,5 +2704,5 @@ const ut="175",Hl=0,rc=1,sc=2,oc=1,_c=2,wc=3,Sc=0,iu=1,su=2,lu=0,cu=1,uu=2,pu=3,
2704
2704
  * @license
2705
2705
  * Copyright 2010-2025 Three.js Authors
2706
2706
  * SPDX-License-Identifier: MIT
2707
- */function WebGLAnimation(){let at=null,st=!1,ot=null,ut=null;function onAnimationFrame(st,Hl){ot(st,Hl),ut=at.requestAnimationFrame(onAnimationFrame)}return{start:function(){!0!==st&&null!==ot&&(ut=at.requestAnimationFrame(onAnimationFrame),st=!0)},stop:function(){at.cancelAnimationFrame(ut),st=!1},setAnimationLoop:function(at){ot=at},setContext:function(st){at=st}}}function WebGLAttributes(at){const st=new WeakMap;return{get:function(at){return at.isInterleavedBufferAttribute&&(at=at.data),st.get(at)},remove:function(ot){ot.isInterleavedBufferAttribute&&(ot=ot.data);const ut=st.get(ot);ut&&(at.deleteBuffer(ut.buffer),st.delete(ot))},update:function(ot,ut){if(ot.isInterleavedBufferAttribute&&(ot=ot.data),ot.isGLBufferAttribute){const at=st.get(ot);return void((!at||at.version<ot.version)&&st.set(ot,{buffer:ot.buffer,type:ot.type,bytesPerElement:ot.elementSize,version:ot.version}))}const Hl=st.get(ot);if(void 0===Hl)st.set(ot,function(st,ot){const ut=st.array,Hl=st.usage,rc=ut.byteLength,sc=at.createBuffer();let oc;if(at.bindBuffer(ot,sc),at.bufferData(ot,ut,Hl),st.onUploadCallback(),ut instanceof Float32Array)oc=at.FLOAT;else if(ut instanceof Uint16Array)oc=st.isFloat16BufferAttribute?at.HALF_FLOAT:at.UNSIGNED_SHORT;else if(ut instanceof Int16Array)oc=at.SHORT;else if(ut instanceof Uint32Array)oc=at.UNSIGNED_INT;else if(ut instanceof Int32Array)oc=at.INT;else if(ut instanceof Int8Array)oc=at.BYTE;else if(ut instanceof Uint8Array)oc=at.UNSIGNED_BYTE;else{if(!(ut instanceof Uint8ClampedArray))throw new Error("THREE.WebGLAttributes: Unsupported buffer data format: "+ut);oc=at.UNSIGNED_BYTE}return{buffer:sc,type:oc,bytesPerElement:ut.BYTES_PER_ELEMENT,version:st.version,size:rc}}(ot,ut));else if(Hl.version<ot.version){if(Hl.size!==ot.array.byteLength)throw new Error("THREE.WebGLAttributes: The size of the buffer attribute's array buffer does not match the original size. Resizing buffer attributes is not supported.");!function(st,ot,ut){const Hl=ot.array,rc=ot.updateRanges;if(at.bindBuffer(ut,st),0===rc.length)at.bufferSubData(ut,0,Hl);else{rc.sort(((at,st)=>at.start-st.start));let st=0;for(let at=1;at<rc.length;at++){const ot=rc[st],ut=rc[at];ut.start<=ot.start+ot.count+1?ot.count=Math.max(ot.count,ut.start+ut.count-ot.start):(++st,rc[st]=ut)}rc.length=st+1;for(let ot=0,sc=rc.length;ot<sc;ot++){const st=rc[ot];at.bufferSubData(ut,st.start*Hl.BYTES_PER_ELEMENT,Hl,st.start,st.count)}ot.clearUpdateRanges()}ot.onUploadCallback()}(Hl.buffer,ot,ut),Hl.version=ot.version}}}}const Hl={alphahash_fragment:"#ifdef USE_ALPHAHASH\n\tif ( diffuseColor.a < getAlphaHashThreshold( vPosition ) ) discard;\n#endif",alphahash_pars_fragment:"#ifdef USE_ALPHAHASH\n\tconst float ALPHA_HASH_SCALE = 0.05;\n\tfloat hash2D( vec2 value ) {\n\t\treturn fract( 1.0e4 * sin( 17.0 * value.x + 0.1 * value.y ) * ( 0.1 + abs( sin( 13.0 * value.y + value.x ) ) ) );\n\t}\n\tfloat hash3D( vec3 value ) {\n\t\treturn hash2D( vec2( hash2D( value.xy ), value.z ) );\n\t}\n\tfloat getAlphaHashThreshold( vec3 position ) {\n\t\tfloat maxDeriv = max(\n\t\t\tlength( dFdx( position.xyz ) ),\n\t\t\tlength( dFdy( position.xyz ) )\n\t\t);\n\t\tfloat pixScale = 1.0 / ( ALPHA_HASH_SCALE * maxDeriv );\n\t\tvec2 pixScales = vec2(\n\t\t\texp2( floor( log2( pixScale ) ) ),\n\t\t\texp2( ceil( log2( pixScale ) ) )\n\t\t);\n\t\tvec2 alpha = vec2(\n\t\t\thash3D( floor( pixScales.x * position.xyz ) ),\n\t\t\thash3D( floor( pixScales.y * position.xyz ) )\n\t\t);\n\t\tfloat lerpFactor = fract( log2( pixScale ) );\n\t\tfloat x = ( 1.0 - lerpFactor ) * alpha.x + lerpFactor * alpha.y;\n\t\tfloat a = min( lerpFactor, 1.0 - lerpFactor );\n\t\tvec3 cases = vec3(\n\t\t\tx * x / ( 2.0 * a * ( 1.0 - a ) ),\n\t\t\t( x - 0.5 * a ) / ( 1.0 - a ),\n\t\t\t1.0 - ( ( 1.0 - x ) * ( 1.0 - x ) / ( 2.0 * a * ( 1.0 - a ) ) )\n\t\t);\n\t\tfloat threshold = ( x < ( 1.0 - a ) )\n\t\t\t? ( ( x < a ) ? cases.x : cases.y )\n\t\t\t: cases.z;\n\t\treturn clamp( threshold , 1.0e-6, 1.0 );\n\t}\n#endif",alphamap_fragment:"#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vAlphaMapUv ).g;\n#endif",alphamap_pars_fragment:"#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",alphatest_fragment:"#ifdef USE_ALPHATEST\n\t#ifdef ALPHA_TO_COVERAGE\n\tdiffuseColor.a = smoothstep( alphaTest, alphaTest + fwidth( diffuseColor.a ), diffuseColor.a );\n\tif ( diffuseColor.a == 0.0 ) discard;\n\t#else\n\tif ( diffuseColor.a < alphaTest ) discard;\n\t#endif\n#endif",alphatest_pars_fragment:"#ifdef USE_ALPHATEST\n\tuniform float alphaTest;\n#endif",aomap_fragment:"#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vAoMapUv ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_CLEARCOAT ) \n\t\tclearcoatSpecularIndirect *= ambientOcclusion;\n\t#endif\n\t#if defined( USE_SHEEN ) \n\t\tsheenSpecularIndirect *= ambientOcclusion;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD )\n\t\tfloat dotNV = saturate( dot( geometryNormal, geometryViewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\n\t#endif\n#endif",aomap_pars_fragment:"#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif",batching_pars_vertex:"#ifdef USE_BATCHING\n\t#if ! defined( GL_ANGLE_multi_draw )\n\t#define gl_DrawID _gl_DrawID\n\tuniform int _gl_DrawID;\n\t#endif\n\tuniform highp sampler2D batchingTexture;\n\tuniform highp usampler2D batchingIdTexture;\n\tmat4 getBatchingMatrix( const in float i ) {\n\t\tint size = textureSize( batchingTexture, 0 ).x;\n\t\tint j = int( i ) * 4;\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\tvec4 v1 = texelFetch( batchingTexture, ivec2( x, y ), 0 );\n\t\tvec4 v2 = texelFetch( batchingTexture, ivec2( x + 1, y ), 0 );\n\t\tvec4 v3 = texelFetch( batchingTexture, ivec2( x + 2, y ), 0 );\n\t\tvec4 v4 = texelFetch( batchingTexture, ivec2( x + 3, y ), 0 );\n\t\treturn mat4( v1, v2, v3, v4 );\n\t}\n\tfloat getIndirectIndex( const in int i ) {\n\t\tint size = textureSize( batchingIdTexture, 0 ).x;\n\t\tint x = i % size;\n\t\tint y = i / size;\n\t\treturn float( texelFetch( batchingIdTexture, ivec2( x, y ), 0 ).r );\n\t}\n#endif\n#ifdef USE_BATCHING_COLOR\n\tuniform sampler2D batchingColorTexture;\n\tvec3 getBatchingColor( const in float i ) {\n\t\tint size = textureSize( batchingColorTexture, 0 ).x;\n\t\tint j = int( i );\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\treturn texelFetch( batchingColorTexture, ivec2( x, y ), 0 ).rgb;\n\t}\n#endif",batching_vertex:"#ifdef USE_BATCHING\n\tmat4 batchingMatrix = getBatchingMatrix( getIndirectIndex( gl_DrawID ) );\n#endif",begin_vertex:"vec3 transformed = vec3( position );\n#ifdef USE_ALPHAHASH\n\tvPosition = vec3( position );\n#endif",beginnormal_vertex:"vec3 objectNormal = vec3( normal );\n#ifdef USE_TANGENT\n\tvec3 objectTangent = vec3( tangent.xyz );\n#endif",bsdfs:"float 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} // validated",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\treturn 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 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",bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vBumpMapUv );\n\t\tvec2 dSTdy = dFdy( vBumpMapUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vBumpMapUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vBumpMapUv + 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 = normalize( dFdx( surf_pos.xyz ) );\n\t\tvec3 vSigmaY = normalize( 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",clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#ifdef ALPHA_TO_COVERAGE\n\t\tfloat distanceToPlane, distanceGradient;\n\t\tfloat clipOpacity = 1.0;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\n\t\t\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\n\t\t\tclipOpacity *= smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\n\t\t\tif ( clipOpacity == 0.0 ) discard;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\t\tfloat unionClipOpacity = 1.0;\n\t\t\t#pragma unroll_loop_start\n\t\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\t\tplane = clippingPlanes[ i ];\n\t\t\t\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\n\t\t\t\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\n\t\t\t\tunionClipOpacity *= 1.0 - smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\n\t\t\t}\n\t\t\t#pragma unroll_loop_end\n\t\t\tclipOpacity *= 1.0 - unionClipOpacity;\n\t\t#endif\n\t\tdiffuseColor.a *= clipOpacity;\n\t\tif ( diffuseColor.a == 0.0 ) discard;\n\t#else\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\t\tbool clipped = true;\n\t\t\t#pragma unroll_loop_start\n\t\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\t\tplane = clippingPlanes[ i ];\n\t\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t\t}\n\t\t\t#pragma unroll_loop_end\n\t\t\tif ( clipped ) discard;\n\t\t#endif\n\t#endif\n#endif",clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif",color_fragment:"#if defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#elif defined( USE_COLOR )\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR )\n\tvarying vec3 vColor;\n#endif",color_pars_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvarying vec3 vColor;\n#endif",color_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_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#ifdef USE_BATCHING_COLOR\n\tvec3 batchingColor = getBatchingColor( getIndirectIndex( gl_DrawID ) );\n\tvColor.xyz *= batchingColor.xyz;\n#endif",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};\n#ifdef USE_ALPHAHASH\n\tvarying vec3 vPosition;\n#endif\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}\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}\nvec3 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} // validated",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_m0 - 2.0\n\t#define cubeUV_r1 0.8\n\t#define cubeUV_m1 - 1.0\n\t#define cubeUV_r4 0.4\n\t#define cubeUV_m4 2.0\n\t#define cubeUV_r5 0.305\n\t#define cubeUV_m5 3.0\n\t#define cubeUV_r6 0.21\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",defaultnormal_vertex:"vec3 transformedNormal = objectNormal;\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = objectTangent;\n#endif\n#ifdef USE_BATCHING\n\tmat3 bm = mat3( batchingMatrix );\n\ttransformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) );\n\ttransformedNormal = bm * transformedNormal;\n\t#ifdef USE_TANGENT\n\t\ttransformedTangent = bm * transformedTangent;\n\t#endif\n#endif\n#ifdef USE_INSTANCING\n\tmat3 im = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) );\n\ttransformedNormal = im * transformedNormal;\n\t#ifdef USE_TANGENT\n\t\ttransformedTangent = im * transformedTangent;\n\t#endif\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\ttransformedTangent = ( modelViewMatrix * vec4( transformedTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias );\n#endif",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv );\n\t#ifdef DECODE_VIDEO_TEXTURE_EMISSIVE\n\t\temissiveColor = sRGBTransferEOTF( emissiveColor );\n\t#endif\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",colorspace_fragment:"gl_FragColor = linearToOutputTexel( gl_FragColor );",colorspace_pars_fragment:"vec4 LinearTransferOETF( in vec4 value ) {\n\treturn value;\n}\nvec4 sRGBTransferEOTF( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 sRGBTransferOETF( 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}",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, envMapRotation * 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",envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform mat3 envMapRotation;\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",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",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",envmap_physical_pars_fragment:"#ifdef USE_ENVMAP\n\tvec3 getIBLIrradiance( const in vec3 normal ) {\n\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * 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#ifdef 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, envMapRotation * 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\t#ifdef USE_ANISOTROPY\n\t\tvec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {\n\t\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\t\tvec3 bentNormal = cross( bitangent, viewDir );\n\t\t\t\tbentNormal = normalize( cross( bentNormal, bitangent ) );\n\t\t\t\tbentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) );\n\t\t\t\treturn getIBLRadiance( viewDir, bentNormal, roughness );\n\t\t\t#else\n\t\t\t\treturn vec3( 0.0 );\n\t\t\t#endif\n\t\t}\n\t#endif\n#endif",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",fog_vertex:"#ifdef USE_FOG\n\tvFogDepth = - mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float vFogDepth;\n#endif",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",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",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}",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_fragment:"LambertMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularStrength = specularStrength;",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 vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, 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 vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, 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",lights_pars_begin:"uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\n#if defined( USE_LIGHT_PROBES )\n\tuniform vec3 lightProbe[ 9 ];\n#endif\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\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\tif ( cutoffDistance > 0.0 ) {\n\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t}\n\treturn distanceFalloff;\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, 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 vec3 geometryPosition, out IncidentLight light ) {\n\t\tvec3 lVector = pointLight.position - geometryPosition;\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 vec3 geometryPosition, out IncidentLight light ) {\n\t\tvec3 lVector = spotLight.position - geometryPosition;\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",lights_toon_fragment:"ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;",lights_toon_pars_fragment:"varying vec3 vViewPosition;\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, 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",lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",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 vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, 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",lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );\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 USE_SPECULAR\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularColorFactor = specularColor;\n\t\t#ifdef USE_SPECULAR_COLORMAP\n\t\t\tspecularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\n\t\t#endif\n\t\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\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, vClearcoatMapUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).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_DISPERSION\n\tmaterial.dispersion = dispersion;\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, vIridescenceMapUv ).r;\n\t#endif\n\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\t\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).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_SHEEN_COLORMAP\n\t\tmaterial.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\n\t#endif\n\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\t#ifdef USE_ANISOTROPYMAP\n\t\tmat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\n\t\tvec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\n\t\tvec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\n\t#else\n\t\tvec2 anisotropyV = anisotropyVector;\n\t#endif\n\tmaterial.anisotropy = length( anisotropyV );\n\tif( material.anisotropy == 0.0 ) {\n\t\tanisotropyV = vec2( 1.0, 0.0 );\n\t} else {\n\t\tanisotropyV /= material.anisotropy;\n\t\tmaterial.anisotropy = saturate( material.anisotropy );\n\t}\n\tmaterial.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\n\tmaterial.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;\n\tmaterial.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;\n#endif",lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat roughness;\n\tvec3 specularColor;\n\tfloat specularF90;\n\tfloat dispersion;\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\t#ifdef USE_ANISOTROPY\n\t\tfloat anisotropy;\n\t\tfloat alphaT;\n\t\tvec3 anisotropyT;\n\t\tvec3 anisotropyB;\n\t#endif\n};\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\nvec3 sheenSpecularDirect = vec3( 0.0 );\nvec3 sheenSpecularIndirect = vec3(0.0 );\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}\n#ifdef USE_ANISOTROPY\n\tfloat V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\n\t\tfloat gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\n\t\tfloat gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\n\t\tfloat v = 0.5 / ( gv + gl );\n\t\treturn saturate(v);\n\t}\n\tfloat D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\n\t\tfloat a2 = alphaT * alphaB;\n\t\thighp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\n\t\thighp float v2 = dot( v, v );\n\t\tfloat w2 = a2 / v2;\n\t\treturn RECIPROCAL_PI * a2 * pow2 ( w2 );\n\t}\n#endif\n#ifdef USE_CLEARCOAT\n\tvec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\n\t\tvec3 f0 = material.clearcoatF0;\n\t\tfloat f90 = material.clearcoatF90;\n\t\tfloat roughness = material.clearcoatRoughness;\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 = F_Schlick( f0, f90, dotVH );\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\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n\tvec3 f0 = material.specularColor;\n\tfloat f90 = material.specularF90;\n\tfloat roughness = material.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\t#ifdef USE_IRIDESCENCE\n\t\tF = mix( F, material.iridescenceFresnel, material.iridescence );\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat dotTL = dot( material.anisotropyT, lightDir );\n\t\tfloat dotTV = dot( material.anisotropyT, viewDir );\n\t\tfloat dotTH = dot( material.anisotropyT, halfDir );\n\t\tfloat dotBL = dot( material.anisotropyB, lightDir );\n\t\tfloat dotBV = dot( material.anisotropyB, viewDir );\n\t\tfloat dotBH = dot( material.anisotropyB, halfDir );\n\t\tfloat V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\n\t\tfloat D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\n\t#else\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t#endif\n\treturn F * ( V * D );\n}\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}\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\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 vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometryNormal;\n\t\tvec3 viewDir = geometryViewDir;\n\t\tvec3 position = geometryPosition;\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 vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\t\tclearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\n\t#endif\n\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometryViewDir, geometryNormal, material );\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, 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 vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, 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( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\n\t#else\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, 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}",lights_fragment_begin:"\nvec3 geometryPosition = - vViewPosition;\nvec3 geometryNormal = normal;\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\nvec3 geometryClearcoatNormal = vec3( 0.0 );\n#ifdef USE_CLEARCOAT\n\tgeometryClearcoatNormal = clearcoatNormal;\n#endif\n#ifdef USE_IRIDESCENCE\n\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\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, geometryPosition, 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.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, 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, geometryPosition, 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.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, 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, 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.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, 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, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, 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\t#if defined( USE_LIGHT_PROBES )\n\t\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\n\t#endif\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 ], geometryNormal );\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",lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\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( geometryNormal );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\t#ifdef USE_ANISOTROPY\n\t\tradiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\n\t#else\n\t\tradiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\n\t#endif\n#endif",lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif",logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF )\n\tgl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGDEPTHBUF )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\tvFragDepth = 1.0 + gl_Position.w;\n\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n#endif",map_fragment:"#ifdef USE_MAP\n\tvec4 sampledDiffuseColor = texture2D( map, vMapUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\tsampledDiffuseColor = sRGBTransferEOTF( sampledDiffuseColor );\n\t#endif\n\tdiffuseColor *= sampledDiffuseColor;\n#endif",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif",map_particle_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\t#if defined( USE_POINTS_UV )\n\t\tvec2 uv = vUv;\n\t#else\n\t\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\t#endif\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",map_particle_pars_fragment:"#if defined( USE_POINTS_UV )\n\tvarying vec2 vUv;\n#else\n\t#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\t\tuniform mat3 uvTransform;\n\t#endif\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphinstance_vertex:"#ifdef USE_INSTANCING_MORPH\n\tfloat morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\tfloat morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tmorphTargetInfluences[i] = texelFetch( morphTexture, ivec2( i + 1, gl_InstanceID ), 0 ).r;\n\t}\n#endif",morphcolor_vertex:"#if defined( USE_MORPHCOLORS )\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",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\n\t}\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\t#ifndef USE_INSTANCING_MORPH\n\t\tuniform float morphTargetBaseInfluence;\n\t\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\t#endif\n\tuniform sampler2DArray morphTargetsTexture;\n\tuniform ivec2 morphTargetsTextureSize;\n\tvec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\n\t\tint texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\n\t\tint y = texelIndex / morphTargetsTextureSize.x;\n\t\tint x = texelIndex - y * morphTargetsTextureSize.x;\n\t\tivec3 morphUV = ivec3( x, y, morphTargetIndex );\n\t\treturn texelFetch( morphTargetsTexture, morphUV, 0 );\n\t}\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\n\t}\n#endif",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 *= faceDirection;\n\t#endif\n#endif\n#if defined( USE_NORMALMAP_TANGENTSPACE ) || defined( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY )\n\t#ifdef USE_TANGENT\n\t\tmat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n\t#else\n\t\tmat3 tbn = getTangentFrame( - vViewPosition, normal,\n\t\t#if defined( USE_NORMALMAP )\n\t\t\tvNormalMapUv\n\t\t#elif defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tvClearcoatNormalMapUv\n\t\t#else\n\t\t\tvUv\n\t\t#endif\n\t\t);\n\t#endif\n\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n\t\ttbn[0] *= faceDirection;\n\t\ttbn[1] *= faceDirection;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\t#ifdef USE_TANGENT\n\t\tmat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n\t#else\n\t\tmat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv );\n\t#endif\n\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n\t\ttbn2[0] *= faceDirection;\n\t\ttbn2[1] *= faceDirection;\n\t#endif\n#endif\nvec3 nonPerturbedNormal = normal;",normal_fragment_maps:"#ifdef USE_NORMALMAP_OBJECTSPACE\n\tnormal = texture2D( normalMap, vNormalMapUv ).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( USE_NORMALMAP_TANGENTSPACE )\n\tvec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\tnormal = normalize( tbn * mapN );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif",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",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",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",normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef USE_NORMALMAP_OBJECTSPACE\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) )\n\tmat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) {\n\t\tvec3 q0 = dFdx( eye_pos.xyz );\n\t\tvec3 q1 = dFdy( eye_pos.xyz );\n\t\tvec2 st0 = dFdx( uv.st );\n\t\tvec2 st1 = dFdy( uv.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 : inversesqrt( det );\n\t\treturn mat3( T * scale, B * scale, N );\n\t}\n#endif",clearcoat_normal_fragment_begin:"#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal = nonPerturbedNormal;\n#endif",clearcoat_normal_fragment_maps:"#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\tclearcoatNormal = normalize( tbn2 * clearcoatMapN );\n#endif",clearcoat_pars_fragment:"#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif",iridescence_pars_fragment:"#ifdef USE_IRIDESCENCEMAP\n\tuniform sampler2D iridescenceMap;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform sampler2D iridescenceThicknessMap;\n#endif",opaque_fragment:"#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= material.transmissionAlpha;\n#endif\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );",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.;const float ShiftRight8 = 1. / 256.;\nconst float Inv255 = 1. / 255.;\nconst vec4 PackFactors = vec4( 1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0 );\nconst vec2 UnpackFactors2 = vec2( UnpackDownscale, 1.0 / PackFactors.g );\nconst vec3 UnpackFactors3 = vec3( UnpackDownscale / PackFactors.rg, 1.0 / PackFactors.b );\nconst vec4 UnpackFactors4 = vec4( UnpackDownscale / PackFactors.rgb, 1.0 / PackFactors.a );\nvec4 packDepthToRGBA( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec4( 0., 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec4( 1., 1., 1., 1. );\n\tfloat vuf;\n\tfloat af = modf( v * PackFactors.a, vuf );\n\tfloat bf = modf( vuf * ShiftRight8, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec4( vuf * Inv255, gf * PackUpscale, bf * PackUpscale, af );\n}\nvec3 packDepthToRGB( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec3( 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec3( 1., 1., 1. );\n\tfloat vuf;\n\tfloat bf = modf( v * PackFactors.b, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec3( vuf * Inv255, gf * PackUpscale, bf );\n}\nvec2 packDepthToRG( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec2( 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec2( 1., 1. );\n\tfloat vuf;\n\tfloat gf = modf( v * 256., vuf );\n\treturn vec2( vuf * Inv255, gf );\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors4 );\n}\nfloat unpackRGBToDepth( const in vec3 v ) {\n\treturn dot( v, UnpackFactors3 );\n}\nfloat unpackRGToDepth( const in vec2 v ) {\n\treturn v.r * UnpackFactors2.r + v.g * UnpackFactors2.g;\n}\nvec4 pack2HalfToRGBA( const in 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( const in 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 depth, const in float near, const in float far ) {\n\treturn depth * ( 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 depth, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * depth - far );\n}",premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif",project_vertex:"vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_BATCHING\n\tmvPosition = batchingMatrix * mvPosition;\n#endif\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;",dithering_fragment:"#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif",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",roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv );\n\troughnessFactor *= texelRoughness.g;\n#endif",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#if NUM_SPOT_LIGHT_COORDS > 0\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#if NUM_SPOT_LIGHT_MAPS > 0\n\tuniform 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 shadowIntensity;\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 shadowIntensity;\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 shadowIntensity;\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 shadowIntensity, 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 mix( 1.0, shadow, shadowIntensity );\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 shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\t\n\t\tfloat lightToPositionLength = length( lightToPosition );\n\t\tif ( lightToPositionLength - shadowCameraFar <= 0.0 && lightToPositionLength - shadowCameraNear >= 0.0 ) {\n\t\t\tfloat dp = ( lightToPositionLength - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\t\tdp += shadowBias;\n\t\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\t\tshadow = (\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t\t) * ( 1.0 / 9.0 );\n\t\t\t#else\n\t\t\t\tshadow = texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t\t#endif\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n#endif",shadowmap_pars_vertex:"#if NUM_SPOT_LIGHT_COORDS > 0\n\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\n\tvarying 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 shadowIntensity;\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 shadowIntensity;\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 shadowIntensity;\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",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",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.shadowIntensity, 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.shadowIntensity, 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.shadowIntensity, 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}",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",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\tuniform highp sampler2D boneTexture;\n\tmat4 getBoneMatrix( const in float i ) {\n\t\tint size = textureSize( boneTexture, 0 ).x;\n\t\tint j = int( i ) * 4;\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\tvec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 );\n\t\tvec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 );\n\t\tvec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 );\n\t\tvec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 );\n\t\treturn mat4( v1, v2, v3, v4 );\n\t}\n#endif",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",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",specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vSpecularMapUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif",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 saturate( toneMappingExposure * color );\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 CineonToneMapping( 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}\nconst mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(\n\tvec3( 1.6605, - 0.1246, - 0.0182 ),\n\tvec3( - 0.5876, 1.1329, - 0.1006 ),\n\tvec3( - 0.0728, - 0.0083, 1.1187 )\n);\nconst mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(\n\tvec3( 0.6274, 0.0691, 0.0164 ),\n\tvec3( 0.3293, 0.9195, 0.0880 ),\n\tvec3( 0.0433, 0.0113, 0.8956 )\n);\nvec3 agxDefaultContrastApprox( vec3 x ) {\n\tvec3 x2 = x * x;\n\tvec3 x4 = x2 * x2;\n\treturn + 15.5 * x4 * x2\n\t\t- 40.14 * x4 * x\n\t\t+ 31.96 * x4\n\t\t- 6.868 * x2 * x\n\t\t+ 0.4298 * x2\n\t\t+ 0.1191 * x\n\t\t- 0.00232;\n}\nvec3 AgXToneMapping( vec3 color ) {\n\tconst mat3 AgXInsetMatrix = mat3(\n\t\tvec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ),\n\t\tvec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ),\n\t\tvec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 )\n\t);\n\tconst mat3 AgXOutsetMatrix = mat3(\n\t\tvec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ),\n\t\tvec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ),\n\t\tvec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 )\n\t);\n\tconst float AgxMinEv = - 12.47393;\tconst float AgxMaxEv = 4.026069;\n\tcolor *= toneMappingExposure;\n\tcolor = LINEAR_SRGB_TO_LINEAR_REC2020 * color;\n\tcolor = AgXInsetMatrix * color;\n\tcolor = max( color, 1e-10 );\tcolor = log2( color );\n\tcolor = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv );\n\tcolor = clamp( color, 0.0, 1.0 );\n\tcolor = agxDefaultContrastApprox( color );\n\tcolor = AgXOutsetMatrix * color;\n\tcolor = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) );\n\tcolor = LINEAR_REC2020_TO_LINEAR_SRGB * color;\n\tcolor = clamp( color, 0.0, 1.0 );\n\treturn color;\n}\nvec3 NeutralToneMapping( vec3 color ) {\n\tconst float StartCompression = 0.8 - 0.04;\n\tconst float Desaturation = 0.15;\n\tcolor *= toneMappingExposure;\n\tfloat x = min( color.r, min( color.g, color.b ) );\n\tfloat offset = x < 0.08 ? x - 6.25 * x * x : 0.04;\n\tcolor -= offset;\n\tfloat peak = max( color.r, max( color.g, color.b ) );\n\tif ( peak < StartCompression ) return color;\n\tfloat d = 1. - StartCompression;\n\tfloat newPeak = 1. - d * d / ( peak + d - StartCompression );\n\tcolor *= newPeak / peak;\n\tfloat g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. );\n\treturn mix( color, vec3( newPeak ), g );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }",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, vTransmissionMapUv ).r;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tmaterial.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\n\t#endif\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\tvec4 transmitted = getIBLVolumeRefraction(\n\t\tn, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.dispersion, material.ior, material.thickness,\n\t\tmaterial.attenuationColor, material.attenuationDistance );\n\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\n\ttotalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission );\n#endif",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\tfloat w0( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\n\t}\n\tfloat w1( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\n\t}\n\tfloat w2( float a ){\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\n\t}\n\tfloat w3( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * a );\n\t}\n\tfloat g0( float a ) {\n\t\treturn w0( a ) + w1( a );\n\t}\n\tfloat g1( float a ) {\n\t\treturn w2( a ) + w3( a );\n\t}\n\tfloat h0( float a ) {\n\t\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\n\t}\n\tfloat h1( float a ) {\n\t\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\n\t}\n\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\n\t\tuv = uv * texelSize.zw + 0.5;\n\t\tvec2 iuv = floor( uv );\n\t\tvec2 fuv = fract( uv );\n\t\tfloat g0x = g0( fuv.x );\n\t\tfloat g1x = g1( fuv.x );\n\t\tfloat h0x = h0( fuv.x );\n\t\tfloat h1x = h1( fuv.x );\n\t\tfloat h0y = h0( fuv.y );\n\t\tfloat h1y = h1( fuv.y );\n\t\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\n\t\t\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\n\t}\n\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\n\t\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\n\t\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\n\t\tvec2 fLodSizeInv = 1.0 / fLodSize;\n\t\tvec2 cLodSizeInv = 1.0 / cLodSize;\n\t\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\n\t\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\n\t\treturn mix( fSample, cSample, fract( lod ) );\n\t}\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 lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\n\t}\n\tvec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tif ( isinf( attenuationDistance ) ) {\n\t\t\treturn vec3( 1.0 );\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\t\t\treturn transmittance;\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 dispersion, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tvec4 transmittedLight;\n\t\tvec3 transmittance;\n\t\t#ifdef USE_DISPERSION\n\t\t\tfloat halfSpread = ( ior - 1.0 ) * 0.025 * dispersion;\n\t\t\tvec3 iors = vec3( ior - halfSpread, ior, ior + halfSpread );\n\t\t\tfor ( int i = 0; i < 3; i ++ ) {\n\t\t\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, iors[ i ], modelMatrix );\n\t\t\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\t\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\t\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\t\t\trefractionCoords += 1.0;\n\t\t\t\trefractionCoords /= 2.0;\n\t\t\t\tvec4 transmissionSample = getTransmissionSample( refractionCoords, roughness, iors[ i ] );\n\t\t\t\ttransmittedLight[ i ] = transmissionSample[ i ];\n\t\t\t\ttransmittedLight.a += transmissionSample.a;\n\t\t\t\ttransmittance[ i ] = diffuseColor[ i ] * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance )[ i ];\n\t\t\t}\n\t\t\ttransmittedLight.a /= 3.0;\n\t\t#else\n\t\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\t\trefractionCoords += 1.0;\n\t\t\trefractionCoords /= 2.0;\n\t\t\ttransmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\t\ttransmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\t#endif\n\t\tvec3 attenuatedColor = transmittance * transmittedLight.rgb;\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\t\tfloat transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\n\t}\n#endif",uv_pars_fragment:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\n\tvarying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n\tvarying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n\tvarying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n\tvarying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n\tvarying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n\tvarying vec2 vNormalMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tvarying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n\tvarying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tvarying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tvarying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tvarying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvarying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tvarying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tvarying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tvarying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tvarying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tvarying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n\tvarying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tvarying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tvarying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tuniform mat3 transmissionMapTransform;\n\tvarying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n\tuniform mat3 thicknessMapTransform;\n\tvarying vec2 vThicknessMapUv;\n#endif",uv_pars_vertex:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\n\tuniform mat3 mapTransform;\n\tvarying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform mat3 alphaMapTransform;\n\tvarying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n\tuniform mat3 lightMapTransform;\n\tvarying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n\tuniform mat3 aoMapTransform;\n\tvarying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n\tuniform mat3 bumpMapTransform;\n\tvarying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n\tuniform mat3 normalMapTransform;\n\tvarying vec2 vNormalMapUv;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n\tuniform mat3 displacementMapTransform;\n\tvarying vec2 vDisplacementMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tuniform mat3 emissiveMapTransform;\n\tvarying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n\tuniform mat3 metalnessMapTransform;\n\tvarying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tuniform mat3 roughnessMapTransform;\n\tvarying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tuniform mat3 anisotropyMapTransform;\n\tvarying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tuniform mat3 clearcoatMapTransform;\n\tvarying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform mat3 clearcoatNormalMapTransform;\n\tvarying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform mat3 clearcoatRoughnessMapTransform;\n\tvarying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tuniform mat3 sheenColorMapTransform;\n\tvarying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tuniform mat3 sheenRoughnessMapTransform;\n\tvarying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tuniform mat3 iridescenceMapTransform;\n\tvarying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform mat3 iridescenceThicknessMapTransform;\n\tvarying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n\tuniform mat3 specularMapTransform;\n\tvarying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tuniform mat3 specularColorMapTransform;\n\tvarying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tuniform mat3 specularIntensityMapTransform;\n\tvarying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tuniform mat3 transmissionMapTransform;\n\tvarying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n\tuniform mat3 thicknessMapTransform;\n\tvarying vec2 vThicknessMapUv;\n#endif",uv_vertex:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvUv = vec3( uv, 1 ).xy;\n#endif\n#ifdef USE_MAP\n\tvMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ALPHAMAP\n\tvAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_LIGHTMAP\n\tvLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_AOMAP\n\tvAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_BUMPMAP\n\tvBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_NORMALMAP\n\tvNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n\tvDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tvEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_METALNESSMAP\n\tvMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tvRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tvAnisotropyMapUv = ( anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tvClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tvClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tvIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tvIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tvSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tvSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULARMAP\n\tvSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tvSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tvSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tvTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_THICKNESSMAP\n\tvThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy;\n#endif",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_BATCHING\n\t\tworldPosition = batchingMatrix * worldPosition;\n\t#endif\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif",background_vert:"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}",background_frag:"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 <colorspace_fragment>\n}",backgroundCube_vert:"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}",backgroundCube_frag:"#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;\nuniform mat3 backgroundRotation;\nvarying vec3 vWorldDirection;\n#include <cube_uv_reflection_fragment>\nvoid main() {\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 texColor = textureCube( envMap, backgroundRotation * vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 texColor = textureCubeUV( envMap, backgroundRotation * 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 <colorspace_fragment>\n}",cube_vert:"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}",cube_frag:"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 <colorspace_fragment>\n}",depth_vert:"#include <common>\n#include <batching_pars_vertex>\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 <batching_vertex>\n\t#include <skinbase_vertex>\n\t#include <morphinstance_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}",depth_frag:"#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 <alphahash_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include <clipping_planes_fragment>\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 <alphahash_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#elif DEPTH_PACKING == 3202\n\t\tgl_FragColor = vec4( packDepthToRGB( fragCoordZ ), 1.0 );\n\t#elif DEPTH_PACKING == 3203\n\t\tgl_FragColor = vec4( packDepthToRG( fragCoordZ ), 0.0, 1.0 );\n\t#endif\n}",distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include <common>\n#include <batching_pars_vertex>\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 <batching_vertex>\n\t#include <skinbase_vertex>\n\t#include <morphinstance_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}",distanceRGBA_frag:"#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 <alphahash_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include <clipping_planes_fragment>\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}",equirect_vert:"varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}",equirect_frag:"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 <colorspace_fragment>\n}",linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <uv_pars_vertex>\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 <uv_vertex>\n\t#include <color_vertex>\n\t#include <morphinstance_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}",linedashed_frag:"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 <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <clipping_planes_fragment>\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}",meshbasic_vert:"#include <common>\n#include <batching_pars_vertex>\n#include <uv_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 <color_vertex>\n\t#include <morphinstance_vertex>\n\t#include <morphcolor_vertex>\n\t#include <batching_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}",meshbasic_frag:"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 <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_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\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <clipping_planes_fragment>\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 <alphahash_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, vLightMapUv );\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 <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshlambert_vert:"#define LAMBERT\nvarying vec3 vViewPosition;\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_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 <color_vertex>\n\t#include <morphinstance_vertex>\n\t#include <morphcolor_vertex>\n\t#include <batching_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}",meshlambert_frag:"#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 <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_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\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <clipping_planes_fragment>\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 <alphahash_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 <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshmatcap_vert:"#define MATCAP\nvarying vec3 vViewPosition;\n#include <common>\n#include <batching_pars_vertex>\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 <morphinstance_vertex>\n\t#include <morphcolor_vertex>\n\t#include <batching_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}",meshmatcap_frag:"#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 <alphahash_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\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <clipping_planes_fragment>\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 <alphahash_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 <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshnormal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include <common>\n#include <batching_pars_vertex>\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 <batching_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphinstance_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( USE_NORMALMAP_TANGENTSPACE )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",meshnormal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\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\tvec4 diffuseColor = vec4( 0.0, 0.0, 0.0, opacity );\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 ), diffuseColor.a );\n\t#ifdef OPAQUE\n\t\tgl_FragColor.a = 1.0;\n\t#endif\n}",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_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 <color_vertex>\n\t#include <morphcolor_vertex>\n\t#include <batching_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphinstance_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}",meshphong_frag:"#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 <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_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\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <clipping_planes_fragment>\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 <alphahash_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 <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshphysical_vert:"#define STANDARD\nvarying vec3 vViewPosition;\n#ifdef USE_TRANSMISSION\n\tvarying vec3 vWorldPosition;\n#endif\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_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 <color_vertex>\n\t#include <morphinstance_vertex>\n\t#include <morphcolor_vertex>\n\t#include <batching_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}",meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n\t#define IOR\n\t#define USE_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 USE_SPECULAR\n\tuniform float specularIntensity;\n\tuniform vec3 specularColor;\n\t#ifdef USE_SPECULAR_COLORMAP\n\t\tuniform sampler2D specularColorMap;\n\t#endif\n\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\tuniform sampler2D specularIntensityMap;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_DISPERSION\n\tuniform float dispersion;\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_SHEEN_COLORMAP\n\t\tuniform sampler2D sheenColorMap;\n\t#endif\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tuniform sampler2D sheenRoughnessMap;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\tuniform vec2 anisotropyVector;\n\t#ifdef USE_ANISOTROPYMAP\n\t\tuniform sampler2D anisotropyMap;\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 <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\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\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <clipping_planes_fragment>\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 <alphahash_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 + sheenSpecularDirect + sheenSpecularIndirect;\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) );\n\t\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n\t\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;\n\t#endif\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshtoon_vert:"#define TOON\nvarying vec3 vViewPosition;\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_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 <color_vertex>\n\t#include <morphinstance_vertex>\n\t#include <morphcolor_vertex>\n\t#include <batching_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}",meshtoon_frag:"#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 <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_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\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <clipping_planes_fragment>\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 <alphahash_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 <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",points_vert:"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>\n#ifdef USE_POINTS_UV\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\nvoid main() {\n\t#ifdef USE_POINTS_UV\n\t\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\t#endif\n\t#include <color_vertex>\n\t#include <morphinstance_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}",points_frag:"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 <alphahash_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}",shadow_vert:"#include <common>\n#include <batching_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <batching_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphinstance_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 <logdepthbuf_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",shadow_frag:"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 <logdepthbuf_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\t#include <logdepthbuf_fragment>\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n}",sprite_vert:"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[ 3 ];\n\tvec2 scale = vec2( length( modelMatrix[ 0 ].xyz ), length( modelMatrix[ 1 ].xyz ) );\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}",sprite_frag:"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 <alphahash_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n}"},rc={common:{diffuse:{value:new ut.Q1f(16777215)},opacity:{value:1},map:{value:null},mapTransform:{value:new ut.dwI},alphaMap:{value:null},alphaMapTransform:{value:new ut.dwI},alphaTest:{value:0}},specularmap:{specularMap:{value:null},specularMapTransform:{value:new ut.dwI}},envmap:{envMap:{value:null},envMapRotation:{value:new ut.dwI},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1},aoMapTransform:{value:new ut.dwI}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1},lightMapTransform:{value:new ut.dwI}},bumpmap:{bumpMap:{value:null},bumpMapTransform:{value:new ut.dwI},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalMapTransform:{value:new ut.dwI},normalScale:{value:new ut.I9Y(1,1)}},displacementmap:{displacementMap:{value:null},displacementMapTransform:{value:new ut.dwI},displacementScale:{value:1},displacementBias:{value:0}},emissivemap:{emissiveMap:{value:null},emissiveMapTransform:{value:new ut.dwI}},metalnessmap:{metalnessMap:{value:null},metalnessMapTransform:{value:new ut.dwI}},roughnessmap:{roughnessMap:{value:null},roughnessMapTransform:{value:new ut.dwI}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new ut.Q1f(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotShadowMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new ut.Q1f(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaMapTransform:{value:new ut.dwI},alphaTest:{value:0},uvTransform:{value:new ut.dwI}},sprite:{diffuse:{value:new ut.Q1f(16777215)},opacity:{value:1},center:{value:new ut.I9Y(.5,.5)},rotation:{value:0},map:{value:null},mapTransform:{value:new ut.dwI},alphaMap:{value:null},alphaMapTransform:{value:new ut.dwI},alphaTest:{value:0}}},sc={basic:{uniforms:(0,ut.Iit)([rc.common,rc.specularmap,rc.envmap,rc.aomap,rc.lightmap,rc.fog]),vertexShader:Hl.meshbasic_vert,fragmentShader:Hl.meshbasic_frag},lambert:{uniforms:(0,ut.Iit)([rc.common,rc.specularmap,rc.envmap,rc.aomap,rc.lightmap,rc.emissivemap,rc.bumpmap,rc.normalmap,rc.displacementmap,rc.fog,rc.lights,{emissive:{value:new ut.Q1f(0)}}]),vertexShader:Hl.meshlambert_vert,fragmentShader:Hl.meshlambert_frag},phong:{uniforms:(0,ut.Iit)([rc.common,rc.specularmap,rc.envmap,rc.aomap,rc.lightmap,rc.emissivemap,rc.bumpmap,rc.normalmap,rc.displacementmap,rc.fog,rc.lights,{emissive:{value:new ut.Q1f(0)},specular:{value:new ut.Q1f(1118481)},shininess:{value:30}}]),vertexShader:Hl.meshphong_vert,fragmentShader:Hl.meshphong_frag},standard:{uniforms:(0,ut.Iit)([rc.common,rc.envmap,rc.aomap,rc.lightmap,rc.emissivemap,rc.bumpmap,rc.normalmap,rc.displacementmap,rc.roughnessmap,rc.metalnessmap,rc.fog,rc.lights,{emissive:{value:new ut.Q1f(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:Hl.meshphysical_vert,fragmentShader:Hl.meshphysical_frag},toon:{uniforms:(0,ut.Iit)([rc.common,rc.aomap,rc.lightmap,rc.emissivemap,rc.bumpmap,rc.normalmap,rc.displacementmap,rc.gradientmap,rc.fog,rc.lights,{emissive:{value:new ut.Q1f(0)}}]),vertexShader:Hl.meshtoon_vert,fragmentShader:Hl.meshtoon_frag},matcap:{uniforms:(0,ut.Iit)([rc.common,rc.bumpmap,rc.normalmap,rc.displacementmap,rc.fog,{matcap:{value:null}}]),vertexShader:Hl.meshmatcap_vert,fragmentShader:Hl.meshmatcap_frag},points:{uniforms:(0,ut.Iit)([rc.points,rc.fog]),vertexShader:Hl.points_vert,fragmentShader:Hl.points_frag},dashed:{uniforms:(0,ut.Iit)([rc.common,rc.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:Hl.linedashed_vert,fragmentShader:Hl.linedashed_frag},depth:{uniforms:(0,ut.Iit)([rc.common,rc.displacementmap]),vertexShader:Hl.depth_vert,fragmentShader:Hl.depth_frag},normal:{uniforms:(0,ut.Iit)([rc.common,rc.bumpmap,rc.normalmap,rc.displacementmap,{opacity:{value:1}}]),vertexShader:Hl.meshnormal_vert,fragmentShader:Hl.meshnormal_frag},sprite:{uniforms:(0,ut.Iit)([rc.sprite,rc.fog]),vertexShader:Hl.sprite_vert,fragmentShader:Hl.sprite_frag},background:{uniforms:{uvTransform:{value:new ut.dwI},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:Hl.background_vert,fragmentShader:Hl.background_frag},backgroundCube:{uniforms:{envMap:{value:null},flipEnvMap:{value:-1},backgroundBlurriness:{value:0},backgroundIntensity:{value:1},backgroundRotation:{value:new ut.dwI}},vertexShader:Hl.backgroundCube_vert,fragmentShader:Hl.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:Hl.cube_vert,fragmentShader:Hl.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:Hl.equirect_vert,fragmentShader:Hl.equirect_frag},distanceRGBA:{uniforms:(0,ut.Iit)([rc.common,rc.displacementmap,{referencePosition:{value:new ut.Pq0},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:Hl.distanceRGBA_vert,fragmentShader:Hl.distanceRGBA_frag},shadow:{uniforms:(0,ut.Iit)([rc.lights,rc.fog,{color:{value:new ut.Q1f(0)},opacity:{value:1}}]),vertexShader:Hl.shadow_vert,fragmentShader:Hl.shadow_frag}};sc.physical={uniforms:(0,ut.Iit)([sc.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatMapTransform:{value:new ut.dwI},clearcoatNormalMap:{value:null},clearcoatNormalMapTransform:{value:new ut.dwI},clearcoatNormalScale:{value:new ut.I9Y(1,1)},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatRoughnessMapTransform:{value:new ut.dwI},dispersion:{value:0},iridescence:{value:0},iridescenceMap:{value:null},iridescenceMapTransform:{value:new ut.dwI},iridescenceIOR:{value:1.3},iridescenceThicknessMinimum:{value:100},iridescenceThicknessMaximum:{value:400},iridescenceThicknessMap:{value:null},iridescenceThicknessMapTransform:{value:new ut.dwI},sheen:{value:0},sheenColor:{value:new ut.Q1f(0)},sheenColorMap:{value:null},sheenColorMapTransform:{value:new ut.dwI},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},sheenRoughnessMapTransform:{value:new ut.dwI},transmission:{value:0},transmissionMap:{value:null},transmissionMapTransform:{value:new ut.dwI},transmissionSamplerSize:{value:new ut.I9Y},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},thicknessMapTransform:{value:new ut.dwI},attenuationDistance:{value:0},attenuationColor:{value:new ut.Q1f(0)},specularColor:{value:new ut.Q1f(1,1,1)},specularColorMap:{value:null},specularColorMapTransform:{value:new ut.dwI},specularIntensity:{value:1},specularIntensityMap:{value:null},specularIntensityMapTransform:{value:new ut.dwI},anisotropyVector:{value:new ut.I9Y},anisotropyMap:{value:null},anisotropyMapTransform:{value:new ut.dwI}}]),vertexShader:Hl.meshphysical_vert,fragmentShader:Hl.meshphysical_frag};const oc={r:0,b:0,g:0},_c=new ut.O9p,wc=new ut.kn4;function WebGLBackground(at,st,ot,Hl,rc,Sc,iu){const su=new ut.Q1f(0);let lu,cu,uu=!0===Sc?0:1,pu=null,mu=0,gu=null;function getBackground(at){let ut=!0===at.isScene?at.background:null;if(ut&&ut.isTexture){ut=(at.backgroundBlurriness>0?ot:st).get(ut)}return ut}function setClear(st,ot){st.getRGB(oc,(0,ut._Ut)(at)),Hl.buffers.color.setClear(oc.r,oc.g,oc.b,ot,iu)}return{getClearColor:function(){return su},setClearColor:function(at,st){void 0===st&&(st=1),su.set(at),uu=st,setClear(su,uu)},getClearAlpha:function(){return uu},setClearAlpha:function(at){uu=at,setClear(su,uu)},render:function(st){let ot=!1;const ut=getBackground(st);null===ut?setClear(su,uu):ut&&ut.isColor&&(setClear(ut,1),ot=!0);const rc=at.xr.getEnvironmentBlendMode();"additive"===rc?Hl.buffers.color.setClear(0,0,0,1,iu):"alpha-blend"===rc&&Hl.buffers.color.setClear(0,0,0,0,iu),(at.autoClear||ot)&&(Hl.buffers.depth.setTest(!0),Hl.buffers.depth.setMask(!0),Hl.buffers.color.setMask(!0),at.clear(at.autoClearColor,at.autoClearDepth,at.autoClearStencil))},addToRenderList:function(st,ot){const Hl=getBackground(ot);Hl&&(Hl.isCubeTexture||Hl.mapping===ut.Om)?(void 0===cu&&(cu=new ut.eaF(new ut.iNn(1,1,1),new ut.BKk({name:"BackgroundCubeMaterial",uniforms:(0,ut.lxW)(sc.backgroundCube.uniforms),vertexShader:sc.backgroundCube.vertexShader,fragmentShader:sc.backgroundCube.fragmentShader,side:ut.hsX,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),cu.geometry.deleteAttribute("normal"),cu.geometry.deleteAttribute("uv"),cu.onBeforeRender=function(at,st,ot){this.matrixWorld.copyPosition(ot.matrixWorld)},Object.defineProperty(cu.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),rc.update(cu)),_c.copy(ot.backgroundRotation),_c.x*=-1,_c.y*=-1,_c.z*=-1,Hl.isCubeTexture&&!1===Hl.isRenderTargetTexture&&(_c.y*=-1,_c.z*=-1),cu.material.uniforms.envMap.value=Hl,cu.material.uniforms.flipEnvMap.value=Hl.isCubeTexture&&!1===Hl.isRenderTargetTexture?-1:1,cu.material.uniforms.backgroundBlurriness.value=ot.backgroundBlurriness,cu.material.uniforms.backgroundIntensity.value=ot.backgroundIntensity,cu.material.uniforms.backgroundRotation.value.setFromMatrix4(wc.makeRotationFromEuler(_c)),cu.material.toneMapped=ut.ppV.getTransfer(Hl.colorSpace)!==ut.KLL,pu===Hl&&mu===Hl.version&&gu===at.toneMapping||(cu.material.needsUpdate=!0,pu=Hl,mu=Hl.version,gu=at.toneMapping),cu.layers.enableAll(),st.unshift(cu,cu.geometry,cu.material,0,0,null)):Hl&&Hl.isTexture&&(void 0===lu&&(lu=new ut.eaF(new ut.bdM(2,2),new ut.BKk({name:"BackgroundMaterial",uniforms:(0,ut.lxW)(sc.background.uniforms),vertexShader:sc.background.vertexShader,fragmentShader:sc.background.fragmentShader,side:ut.hB5,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),lu.geometry.deleteAttribute("normal"),Object.defineProperty(lu.material,"map",{get:function(){return this.uniforms.t2D.value}}),rc.update(lu)),lu.material.uniforms.t2D.value=Hl,lu.material.uniforms.backgroundIntensity.value=ot.backgroundIntensity,lu.material.toneMapped=ut.ppV.getTransfer(Hl.colorSpace)!==ut.KLL,!0===Hl.matrixAutoUpdate&&Hl.updateMatrix(),lu.material.uniforms.uvTransform.value.copy(Hl.matrix),pu===Hl&&mu===Hl.version&&gu===at.toneMapping||(lu.material.needsUpdate=!0,pu=Hl,mu=Hl.version,gu=at.toneMapping),lu.layers.enableAll(),st.unshift(lu,lu.geometry,lu.material,0,0,null))},dispose:function(){void 0!==cu&&(cu.geometry.dispose(),cu.material.dispose(),cu=void 0),void 0!==lu&&(lu.geometry.dispose(),lu.material.dispose(),lu=void 0)}}}function WebGLBindingStates(at,st){const ot=at.getParameter(at.MAX_VERTEX_ATTRIBS),Hl={},rc=createBindingState(null);let sc=rc,oc=!1;function bindVertexArrayObject(st){return at.bindVertexArray(st)}function deleteVertexArrayObject(st){return at.deleteVertexArray(st)}function createBindingState(at){const st=[],ut=[],Hl=[];for(let rc=0;rc<ot;rc++)st[rc]=0,ut[rc]=0,Hl[rc]=0;return{geometry:null,program:null,wireframe:!1,newAttributes:st,enabledAttributes:ut,attributeDivisors:Hl,object:at,attributes:{},index:null}}function initAttributes(){const at=sc.newAttributes;for(let st=0,ot=at.length;st<ot;st++)at[st]=0}function enableAttribute(at){enableAttributeAndDivisor(at,0)}function enableAttributeAndDivisor(st,ot){const ut=sc.newAttributes,Hl=sc.enabledAttributes,rc=sc.attributeDivisors;ut[st]=1,0===Hl[st]&&(at.enableVertexAttribArray(st),Hl[st]=1),rc[st]!==ot&&(at.vertexAttribDivisor(st,ot),rc[st]=ot)}function disableUnusedAttributes(){const st=sc.newAttributes,ot=sc.enabledAttributes;for(let ut=0,Hl=ot.length;ut<Hl;ut++)ot[ut]!==st[ut]&&(at.disableVertexAttribArray(ut),ot[ut]=0)}function vertexAttribPointer(st,ot,ut,Hl,rc,sc,oc){!0===oc?at.vertexAttribIPointer(st,ot,ut,rc,sc):at.vertexAttribPointer(st,ot,ut,Hl,rc,sc)}function reset(){resetDefaultState(),oc=!0,sc!==rc&&(sc=rc,bindVertexArrayObject(sc.object))}function resetDefaultState(){rc.geometry=null,rc.program=null,rc.wireframe=!1}return{setup:function(ot,rc,_c,wc,Sc){let iu=!1;const su=function(st,ot,ut){const rc=!0===ut.wireframe;let sc=Hl[st.id];void 0===sc&&(sc={},Hl[st.id]=sc);let oc=sc[ot.id];void 0===oc&&(oc={},sc[ot.id]=oc);let _c=oc[rc];void 0===_c&&(_c=createBindingState(at.createVertexArray()),oc[rc]=_c);return _c}(wc,_c,rc);sc!==su&&(sc=su,bindVertexArrayObject(sc.object)),iu=function(at,st,ot,ut){const Hl=sc.attributes,rc=st.attributes;let oc=0;const _c=ot.getAttributes();for(const sc in _c){if(_c[sc].location>=0){const st=Hl[sc];let ot=rc[sc];if(void 0===ot&&("instanceMatrix"===sc&&at.instanceMatrix&&(ot=at.instanceMatrix),"instanceColor"===sc&&at.instanceColor&&(ot=at.instanceColor)),void 0===st)return!0;if(st.attribute!==ot)return!0;if(ot&&st.data!==ot.data)return!0;oc++}}return sc.attributesNum!==oc||sc.index!==ut}(ot,wc,_c,Sc),iu&&function(at,st,ot,ut){const Hl={},rc=st.attributes;let oc=0;const _c=ot.getAttributes();for(const sc in _c){if(_c[sc].location>=0){let st=rc[sc];void 0===st&&("instanceMatrix"===sc&&at.instanceMatrix&&(st=at.instanceMatrix),"instanceColor"===sc&&at.instanceColor&&(st=at.instanceColor));const ot={};ot.attribute=st,st&&st.data&&(ot.data=st.data),Hl[sc]=ot,oc++}}sc.attributes=Hl,sc.attributesNum=oc,sc.index=ut}(ot,wc,_c,Sc),null!==Sc&&st.update(Sc,at.ELEMENT_ARRAY_BUFFER),(iu||oc)&&(oc=!1,function(ot,Hl,rc,sc){initAttributes();const oc=sc.attributes,_c=rc.getAttributes(),wc=Hl.defaultAttributeValues;for(const Sc in _c){const Hl=_c[Sc];if(Hl.location>=0){let rc=oc[Sc];if(void 0===rc&&("instanceMatrix"===Sc&&ot.instanceMatrix&&(rc=ot.instanceMatrix),"instanceColor"===Sc&&ot.instanceColor&&(rc=ot.instanceColor)),void 0!==rc){const oc=rc.normalized,_c=rc.itemSize,wc=st.get(rc);if(void 0===wc)continue;const Sc=wc.buffer,iu=wc.type,su=wc.bytesPerElement,lu=iu===at.INT||iu===at.UNSIGNED_INT||rc.gpuType===ut.Yuy;if(rc.isInterleavedBufferAttribute){const st=rc.data,ut=st.stride,wc=rc.offset;if(st.isInstancedInterleavedBuffer){for(let at=0;at<Hl.locationSize;at++)enableAttributeAndDivisor(Hl.location+at,st.meshPerAttribute);!0!==ot.isInstancedMesh&&void 0===sc._maxInstanceCount&&(sc._maxInstanceCount=st.meshPerAttribute*st.count)}else for(let at=0;at<Hl.locationSize;at++)enableAttribute(Hl.location+at);at.bindBuffer(at.ARRAY_BUFFER,Sc);for(let at=0;at<Hl.locationSize;at++)vertexAttribPointer(Hl.location+at,_c/Hl.locationSize,iu,oc,ut*su,(wc+_c/Hl.locationSize*at)*su,lu)}else{if(rc.isInstancedBufferAttribute){for(let at=0;at<Hl.locationSize;at++)enableAttributeAndDivisor(Hl.location+at,rc.meshPerAttribute);!0!==ot.isInstancedMesh&&void 0===sc._maxInstanceCount&&(sc._maxInstanceCount=rc.meshPerAttribute*rc.count)}else for(let at=0;at<Hl.locationSize;at++)enableAttribute(Hl.location+at);at.bindBuffer(at.ARRAY_BUFFER,Sc);for(let at=0;at<Hl.locationSize;at++)vertexAttribPointer(Hl.location+at,_c/Hl.locationSize,iu,oc,_c*su,_c/Hl.locationSize*at*su,lu)}}else if(void 0!==wc){const st=wc[Sc];if(void 0!==st)switch(st.length){case 2:at.vertexAttrib2fv(Hl.location,st);break;case 3:at.vertexAttrib3fv(Hl.location,st);break;case 4:at.vertexAttrib4fv(Hl.location,st);break;default:at.vertexAttrib1fv(Hl.location,st)}}}}disableUnusedAttributes()}(ot,rc,_c,wc),null!==Sc&&at.bindBuffer(at.ELEMENT_ARRAY_BUFFER,st.get(Sc).buffer))},reset:reset,resetDefaultState:resetDefaultState,dispose:function(){reset();for(const at in Hl){const st=Hl[at];for(const at in st){const ot=st[at];for(const at in ot)deleteVertexArrayObject(ot[at].object),delete ot[at];delete st[at]}delete Hl[at]}},releaseStatesOfGeometry:function(at){if(void 0===Hl[at.id])return;const st=Hl[at.id];for(const ot in st){const at=st[ot];for(const st in at)deleteVertexArrayObject(at[st].object),delete at[st];delete st[ot]}delete Hl[at.id]},releaseStatesOfProgram:function(at){for(const st in Hl){const ot=Hl[st];if(void 0===ot[at.id])continue;const ut=ot[at.id];for(const at in ut)deleteVertexArrayObject(ut[at].object),delete ut[at];delete ot[at.id]}},initAttributes:initAttributes,enableAttribute:enableAttribute,disableUnusedAttributes:disableUnusedAttributes}}function WebGLBufferRenderer(at,st,ot){let ut;function renderInstances(st,Hl,rc){0!==rc&&(at.drawArraysInstanced(ut,st,Hl,rc),ot.update(Hl,ut,rc))}this.setMode=function(at){ut=at},this.render=function(st,Hl){at.drawArrays(ut,st,Hl),ot.update(Hl,ut,1)},this.renderInstances=renderInstances,this.renderMultiDraw=function(at,Hl,rc){if(0===rc)return;st.get("WEBGL_multi_draw").multiDrawArraysWEBGL(ut,at,0,Hl,0,rc);let sc=0;for(let st=0;st<rc;st++)sc+=Hl[st];ot.update(sc,ut,1)},this.renderMultiDrawInstances=function(at,Hl,rc,sc){if(0===rc)return;const oc=st.get("WEBGL_multi_draw");if(null===oc)for(let st=0;st<at.length;st++)renderInstances(at[st],Hl[st],sc[st]);else{oc.multiDrawArraysInstancedWEBGL(ut,at,0,Hl,0,sc,0,rc);let st=0;for(let at=0;at<rc;at++)st+=Hl[at]*sc[at];ot.update(st,ut,1)}}}function WebGLCapabilities(at,st,ot,Hl){let rc;function getMaxPrecision(st){if("highp"===st){if(at.getShaderPrecisionFormat(at.VERTEX_SHADER,at.HIGH_FLOAT).precision>0&&at.getShaderPrecisionFormat(at.FRAGMENT_SHADER,at.HIGH_FLOAT).precision>0)return"highp";st="mediump"}return"mediump"===st&&at.getShaderPrecisionFormat(at.VERTEX_SHADER,at.MEDIUM_FLOAT).precision>0&&at.getShaderPrecisionFormat(at.FRAGMENT_SHADER,at.MEDIUM_FLOAT).precision>0?"mediump":"lowp"}let sc=void 0!==ot.precision?ot.precision:"highp";const oc=getMaxPrecision(sc);oc!==sc&&(console.warn("THREE.WebGLRenderer:",sc,"not supported, using",oc,"instead."),sc=oc);const _c=!0===ot.logarithmicDepthBuffer,wc=!0===ot.reverseDepthBuffer&&st.has("EXT_clip_control"),Sc=at.getParameter(at.MAX_TEXTURE_IMAGE_UNITS),iu=at.getParameter(at.MAX_VERTEX_TEXTURE_IMAGE_UNITS);return{isWebGL2:!0,getMaxAnisotropy:function(){if(void 0!==rc)return rc;if(!0===st.has("EXT_texture_filter_anisotropic")){const ot=st.get("EXT_texture_filter_anisotropic");rc=at.getParameter(ot.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else rc=0;return rc},getMaxPrecision:getMaxPrecision,textureFormatReadable:function(st){return st===ut.GWd||Hl.convert(st)===at.getParameter(at.IMPLEMENTATION_COLOR_READ_FORMAT)},textureTypeReadable:function(ot){const rc=ot===ut.ix0&&(st.has("EXT_color_buffer_half_float")||st.has("EXT_color_buffer_float"));return!(ot!==ut.OUM&&Hl.convert(ot)!==at.getParameter(at.IMPLEMENTATION_COLOR_READ_TYPE)&&ot!==ut.RQf&&!rc)},precision:sc,logarithmicDepthBuffer:_c,reverseDepthBuffer:wc,maxTextures:Sc,maxVertexTextures:iu,maxTextureSize:at.getParameter(at.MAX_TEXTURE_SIZE),maxCubemapSize:at.getParameter(at.MAX_CUBE_MAP_TEXTURE_SIZE),maxAttributes:at.getParameter(at.MAX_VERTEX_ATTRIBS),maxVertexUniforms:at.getParameter(at.MAX_VERTEX_UNIFORM_VECTORS),maxVaryings:at.getParameter(at.MAX_VARYING_VECTORS),maxFragmentUniforms:at.getParameter(at.MAX_FRAGMENT_UNIFORM_VECTORS),vertexTextures:iu>0,maxSamples:at.getParameter(at.MAX_SAMPLES)}}function WebGLClipping(at){const st=this;let ot=null,Hl=0,rc=!1,sc=!1;const oc=new ut.Zcv,_c=new ut.dwI,wc={value:null,needsUpdate:!1};function projectPlanes(at,ot,ut,Hl){const rc=null!==at?at.length:0;let sc=null;if(0!==rc){if(sc=wc.value,!0!==Hl||null===sc){const st=ut+4*rc,Hl=ot.matrixWorldInverse;_c.getNormalMatrix(Hl),(null===sc||sc.length<st)&&(sc=new Float32Array(st));for(let ot=0,wc=ut;ot!==rc;++ot,wc+=4)oc.copy(at[ot]).applyMatrix4(Hl,_c),oc.normal.toArray(sc,wc),sc[wc+3]=oc.constant}wc.value=sc,wc.needsUpdate=!0}return st.numPlanes=rc,st.numIntersection=0,sc}this.uniform=wc,this.numPlanes=0,this.numIntersection=0,this.init=function(at,st){const ot=0!==at.length||st||0!==Hl||rc;return rc=st,Hl=at.length,ot},this.beginShadows=function(){sc=!0,projectPlanes(null)},this.endShadows=function(){sc=!1},this.setGlobalState=function(at,st){ot=projectPlanes(at,st,0)},this.setState=function(ut,oc,_c){const Sc=ut.clippingPlanes,iu=ut.clipIntersection,su=ut.clipShadows,lu=at.get(ut);if(!rc||null===Sc||0===Sc.length||sc&&!su)sc?projectPlanes(null):function(){wc.value!==ot&&(wc.value=ot,wc.needsUpdate=Hl>0);st.numPlanes=Hl,st.numIntersection=0}();else{const at=sc?0:Hl,st=4*at;let ut=lu.clippingState||null;wc.value=ut,ut=projectPlanes(Sc,oc,st,_c);for(let Hl=0;Hl!==st;++Hl)ut[Hl]=ot[Hl];lu.clippingState=ut,this.numIntersection=iu?this.numPlanes:0,this.numPlanes+=at}}}function WebGLCubeMaps(at){let st=new WeakMap;function mapTextureMapping(at,st){return st===ut.wfO?at.mapping=ut.hy7:st===ut.uV5&&(at.mapping=ut.xFO),at}function onTextureDispose(at){const ot=at.target;ot.removeEventListener("dispose",onTextureDispose);const ut=st.get(ot);void 0!==ut&&(st.delete(ot),ut.dispose())}return{get:function(ot){if(ot&&ot.isTexture){const Hl=ot.mapping;if(Hl===ut.wfO||Hl===ut.uV5){if(st.has(ot)){return mapTextureMapping(st.get(ot).texture,ot.mapping)}{const Hl=ot.image;if(Hl&&Hl.height>0){const rc=new ut.o6l(Hl.height);return rc.fromEquirectangularTexture(at,ot),st.set(ot,rc),ot.addEventListener("dispose",onTextureDispose),mapTextureMapping(rc.texture,ot.mapping)}return null}}}return ot},dispose:function(){st=new WeakMap}}}const Sc=[.125,.215,.35,.446,.526,.582],iu=20,su=new ut.qUd,lu=new ut.Q1f;let cu=null,uu=0,pu=0,mu=!1;const gu=(1+Math.sqrt(5))/2,Au=1/gu,yu=[new ut.Pq0(-gu,Au,0),new ut.Pq0(gu,Au,0),new ut.Pq0(-Au,0,gu),new ut.Pq0(Au,0,gu),new ut.Pq0(0,gu,-Au),new ut.Pq0(0,gu,Au),new ut.Pq0(-1,1,-1),new ut.Pq0(1,1,-1),new ut.Pq0(-1,1,1),new ut.Pq0(1,1,1)],_u=new ut.Pq0;class PMREMGenerator{constructor(at){this._renderer=at,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._compileMaterial(this._blurMaterial)}fromScene(at,st,ot,ut,Hl){void 0===st&&(st=0),void 0===ot&&(ot=.1),void 0===ut&&(ut=100),void 0===Hl&&(Hl={});const{size:rc=256,position:sc=_u}=Hl;cu=this._renderer.getRenderTarget(),uu=this._renderer.getActiveCubeFace(),pu=this._renderer.getActiveMipmapLevel(),mu=this._renderer.xr.enabled,this._renderer.xr.enabled=!1,this._setSize(rc);const oc=this._allocateTargets();return oc.depthBuffer=!0,this._sceneToCubeUV(at,ot,ut,oc,sc),st>0&&this._blur(oc,0,0,st),this._applyPMREM(oc),this._cleanup(oc),oc}fromEquirectangular(at,st){return void 0===st&&(st=null),this._fromTexture(at,st)}fromCubemap(at,st){return void 0===st&&(st=null),this._fromTexture(at,st)}compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=_getCubemapMaterial(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=_getEquirectMaterial(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose()}_setSize(at){this._lodMax=Math.floor(Math.log2(at)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let at=0;at<this._lodPlanes.length;at++)this._lodPlanes[at].dispose()}_cleanup(at){this._renderer.setRenderTarget(cu,uu,pu),this._renderer.xr.enabled=mu,at.scissorTest=!1,_setViewport(at,0,0,at.width,at.height)}_fromTexture(at,st){at.mapping===ut.hy7||at.mapping===ut.xFO?this._setSize(0===at.image.length?16:at.image[0].width||at.image[0].image.width):this._setSize(at.image.width/4),cu=this._renderer.getRenderTarget(),uu=this._renderer.getActiveCubeFace(),pu=this._renderer.getActiveMipmapLevel(),mu=this._renderer.xr.enabled,this._renderer.xr.enabled=!1;const ot=st||this._allocateTargets();return this._textureToCubeUV(at,ot),this._applyPMREM(ot),this._cleanup(ot),ot}_allocateTargets(){const at=3*Math.max(this._cubeSize,112),st=4*this._cubeSize,ot={magFilter:ut.k6q,minFilter:ut.k6q,generateMipmaps:!1,type:ut.ix0,format:ut.GWd,colorSpace:ut.Zr2,depthBuffer:!1},Hl=_createRenderTarget(at,st,ot);if(null===this._pingPongRenderTarget||this._pingPongRenderTarget.width!==at||this._pingPongRenderTarget.height!==st){null!==this._pingPongRenderTarget&&this._dispose(),this._pingPongRenderTarget=_createRenderTarget(at,st,ot);const{_lodMax:Hl}=this;({sizeLods:this._sizeLods,lodPlanes:this._lodPlanes,sigmas:this._sigmas}=function(at){const st=[],ot=[],Hl=[];let rc=at;const sc=at-4+1+Sc.length;for(let oc=0;oc<sc;oc++){const sc=Math.pow(2,rc);ot.push(sc);let _c=1/sc;oc>at-4?_c=Sc[oc-at+4-1]:0===oc&&(_c=0),Hl.push(_c);const wc=1/(sc-2),iu=-wc,su=1+wc,lu=[iu,iu,su,iu,su,su,iu,iu,su,su,iu,su],cu=6,uu=6,pu=3,mu=2,gu=1,Au=new Float32Array(pu*uu*cu),yu=new Float32Array(mu*uu*cu),_u=new Float32Array(gu*uu*cu);for(let at=0;at<cu;at++){const st=at%3*2/3-1,ot=at>2?0:-1,ut=[st,ot,0,st+2/3,ot,0,st+2/3,ot+1,0,st,ot,0,st+2/3,ot+1,0,st,ot+1,0];Au.set(ut,pu*uu*at),yu.set(lu,mu*uu*at);const Hl=[at,at,at,at,at,at];_u.set(Hl,gu*uu*at)}const xu=new ut.LoY;xu.setAttribute("position",new ut.THS(Au,pu)),xu.setAttribute("uv",new ut.THS(yu,mu)),xu.setAttribute("faceIndex",new ut.THS(_u,gu)),st.push(xu),rc>4&&rc--}return{lodPlanes:st,sizeLods:ot,sigmas:Hl}}(Hl)),this._blurMaterial=function(at,st,ot){const Hl=new Float32Array(iu),rc=new ut.Pq0(0,1,0),sc=new ut.BKk({name:"SphericalGaussianBlur",defines:{n:iu,CUBEUV_TEXEL_WIDTH:1/st,CUBEUV_TEXEL_HEIGHT:1/ot,CUBEUV_MAX_MIP:`${at}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:Hl},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:rc}},vertexShader:_getCommonVertexShader(),fragmentShader:"\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",blending:ut.XIg,depthTest:!1,depthWrite:!1});return sc}(Hl,at,st)}return Hl}_compileMaterial(at){const st=new ut.eaF(this._lodPlanes[0],at);this._renderer.compile(st,su)}_sceneToCubeUV(at,st,ot,Hl,rc){const sc=new ut.ubm(90,1,st,ot),oc=[1,-1,1,1,1,1],_c=[1,1,1,-1,-1,-1],wc=this._renderer,Sc=wc.autoClear,iu=wc.toneMapping;wc.getClearColor(lu),wc.toneMapping=ut.y_p,wc.autoClear=!1;const su=new ut.V9B({name:"PMREM.Background",side:ut.hsX,depthWrite:!1,depthTest:!1}),cu=new ut.eaF(new ut.iNn,su);let uu=!1;const pu=at.background;pu?pu.isColor&&(su.color.copy(pu),at.background=null,uu=!0):(su.color.copy(lu),uu=!0);for(let ut=0;ut<6;ut++){const st=ut%3;0===st?(sc.up.set(0,oc[ut],0),sc.position.set(rc.x,rc.y,rc.z),sc.lookAt(rc.x+_c[ut],rc.y,rc.z)):1===st?(sc.up.set(0,0,oc[ut]),sc.position.set(rc.x,rc.y,rc.z),sc.lookAt(rc.x,rc.y+_c[ut],rc.z)):(sc.up.set(0,oc[ut],0),sc.position.set(rc.x,rc.y,rc.z),sc.lookAt(rc.x,rc.y,rc.z+_c[ut]));const ot=this._cubeSize;_setViewport(Hl,st*ot,ut>2?ot:0,ot,ot),wc.setRenderTarget(Hl),uu&&wc.render(cu,sc),wc.render(at,sc)}cu.geometry.dispose(),cu.material.dispose(),wc.toneMapping=iu,wc.autoClear=Sc,at.background=pu}_textureToCubeUV(at,st){const ot=this._renderer,Hl=at.mapping===ut.hy7||at.mapping===ut.xFO;Hl?(null===this._cubemapMaterial&&(this._cubemapMaterial=_getCubemapMaterial()),this._cubemapMaterial.uniforms.flipEnvMap.value=!1===at.isRenderTargetTexture?-1:1):null===this._equirectMaterial&&(this._equirectMaterial=_getEquirectMaterial());const rc=Hl?this._cubemapMaterial:this._equirectMaterial,sc=new ut.eaF(this._lodPlanes[0],rc);rc.uniforms.envMap.value=at;const oc=this._cubeSize;_setViewport(st,0,0,3*oc,2*oc),ot.setRenderTarget(st),ot.render(sc,su)}_applyPMREM(at){const st=this._renderer,ot=st.autoClear;st.autoClear=!1;const ut=this._lodPlanes.length;for(let Hl=1;Hl<ut;Hl++){const st=Math.sqrt(this._sigmas[Hl]*this._sigmas[Hl]-this._sigmas[Hl-1]*this._sigmas[Hl-1]),ot=yu[(ut-Hl-1)%yu.length];this._blur(at,Hl-1,Hl,st,ot)}st.autoClear=ot}_blur(at,st,ot,ut,Hl){const rc=this._pingPongRenderTarget;this._halfBlur(at,rc,st,ot,ut,"latitudinal",Hl),this._halfBlur(rc,at,ot,ot,ut,"longitudinal",Hl)}_halfBlur(at,st,ot,Hl,rc,sc,oc){const _c=this._renderer,wc=this._blurMaterial;"latitudinal"!==sc&&"longitudinal"!==sc&&console.error("blur direction must be either latitudinal or longitudinal!");const Sc=new ut.eaF(this._lodPlanes[Hl],wc),lu=wc.uniforms,cu=this._sizeLods[ot]-1,uu=isFinite(rc)?Math.PI/(2*cu):2*Math.PI/39,pu=rc/uu,mu=isFinite(rc)?1+Math.floor(3*pu):iu;mu>iu&&console.warn(`sigmaRadians, ${rc}, is too large and will clip, as it requested ${mu} samples when the maximum is set to 20`);const gu=[];let Au=0;for(let ut=0;ut<iu;++ut){const at=ut/pu,st=Math.exp(-at*at/2);gu.push(st),0===ut?Au+=st:ut<mu&&(Au+=2*st)}for(let ut=0;ut<gu.length;ut++)gu[ut]=gu[ut]/Au;lu.envMap.value=at.texture,lu.samples.value=mu,lu.weights.value=gu,lu.latitudinal.value="latitudinal"===sc,oc&&(lu.poleAxis.value=oc);const{_lodMax:yu}=this;lu.dTheta.value=uu,lu.mipInt.value=yu-ot;const _u=this._sizeLods[Hl];_setViewport(st,3*_u*(Hl>yu-4?Hl-yu+4:0),4*(this._cubeSize-_u),3*_u,2*_u),_c.setRenderTarget(st),_c.render(Sc,su)}}function _createRenderTarget(at,st,ot){const Hl=new ut.nWS(at,st,ot);return Hl.texture.mapping=ut.Om,Hl.texture.name="PMREM.cubeUv",Hl.scissorTest=!0,Hl}function _setViewport(at,st,ot,ut,Hl){at.viewport.set(st,ot,ut,Hl),at.scissor.set(st,ot,ut,Hl)}function _getEquirectMaterial(){return new ut.BKk({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null}},vertexShader:_getCommonVertexShader(),fragmentShader:"\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",blending:ut.XIg,depthTest:!1,depthWrite:!1})}function _getCubemapMaterial(){return new ut.BKk({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:_getCommonVertexShader(),fragmentShader:"\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",blending:ut.XIg,depthTest:!1,depthWrite:!1})}function _getCommonVertexShader(){return"\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"}function WebGLCubeUVMaps(at){let st=new WeakMap,ot=null;function onTextureDispose(at){const ot=at.target;ot.removeEventListener("dispose",onTextureDispose);const ut=st.get(ot);void 0!==ut&&(st.delete(ot),ut.dispose())}return{get:function(Hl){if(Hl&&Hl.isTexture){const rc=Hl.mapping,sc=rc===ut.wfO||rc===ut.uV5,oc=rc===ut.hy7||rc===ut.xFO;if(sc||oc){let ut=st.get(Hl);const rc=void 0!==ut?ut.texture.pmremVersion:0;if(Hl.isRenderTargetTexture&&Hl.pmremVersion!==rc)return null===ot&&(ot=new PMREMGenerator(at)),ut=sc?ot.fromEquirectangular(Hl,ut):ot.fromCubemap(Hl,ut),ut.texture.pmremVersion=Hl.pmremVersion,st.set(Hl,ut),ut.texture;if(void 0!==ut)return ut.texture;{const rc=Hl.image;return sc&&rc&&rc.height>0||oc&&rc&&function(at){let st=0;const ot=6;for(let ut=0;ut<ot;ut++)void 0!==at[ut]&&st++;return st===ot}(rc)?(null===ot&&(ot=new PMREMGenerator(at)),ut=sc?ot.fromEquirectangular(Hl):ot.fromCubemap(Hl),ut.texture.pmremVersion=Hl.pmremVersion,st.set(Hl,ut),Hl.addEventListener("dispose",onTextureDispose),ut.texture):null}}}return Hl},dispose:function(){st=new WeakMap,null!==ot&&(ot.dispose(),ot=null)}}}function WebGLExtensions(at){const st={};function getExtension(ot){if(void 0!==st[ot])return st[ot];let ut;switch(ot){case"WEBGL_depth_texture":ut=at.getExtension("WEBGL_depth_texture")||at.getExtension("MOZ_WEBGL_depth_texture")||at.getExtension("WEBKIT_WEBGL_depth_texture");break;case"EXT_texture_filter_anisotropic":ut=at.getExtension("EXT_texture_filter_anisotropic")||at.getExtension("MOZ_EXT_texture_filter_anisotropic")||at.getExtension("WEBKIT_EXT_texture_filter_anisotropic");break;case"WEBGL_compressed_texture_s3tc":ut=at.getExtension("WEBGL_compressed_texture_s3tc")||at.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||at.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");break;case"WEBGL_compressed_texture_pvrtc":ut=at.getExtension("WEBGL_compressed_texture_pvrtc")||at.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");break;default:ut=at.getExtension(ot)}return st[ot]=ut,ut}return{has:function(at){return null!==getExtension(at)},init:function(){getExtension("EXT_color_buffer_float"),getExtension("WEBGL_clip_cull_distance"),getExtension("OES_texture_float_linear"),getExtension("EXT_color_buffer_half_float"),getExtension("WEBGL_multisampled_render_to_texture"),getExtension("WEBGL_render_shared_exponent")},get:function(at){const st=getExtension(at);return null===st&&(0,ut.mcG)("THREE.WebGLRenderer: "+at+" extension not supported."),st}}}function WebGLGeometries(at,st,ot,Hl){const rc={},sc=new WeakMap;function onGeometryDispose(at){const ut=at.target;null!==ut.index&&st.remove(ut.index);for(const ot in ut.attributes)st.remove(ut.attributes[ot]);ut.removeEventListener("dispose",onGeometryDispose),delete rc[ut.id];const oc=sc.get(ut);oc&&(st.remove(oc),sc.delete(ut)),Hl.releaseStatesOfGeometry(ut),!0===ut.isInstancedBufferGeometry&&delete ut._maxInstanceCount,ot.memory.geometries--}function updateWireframeAttribute(at){const ot=[],Hl=at.index,rc=at.attributes.position;let oc=0;if(null!==Hl){const at=Hl.array;oc=Hl.version;for(let st=0,ut=at.length;st<ut;st+=3){const ut=at[st+0],Hl=at[st+1],rc=at[st+2];ot.push(ut,Hl,Hl,rc,rc,ut)}}else{if(void 0===rc)return;{const at=rc.array;oc=rc.version;for(let st=0,ut=at.length/3-1;st<ut;st+=3){const at=st+0,ut=st+1,Hl=st+2;ot.push(at,ut,ut,Hl,Hl,at)}}}const _c=new((0,ut.AQS)(ot)?ut.MW4:ut.A$4)(ot,1);_c.version=oc;const wc=sc.get(at);wc&&st.remove(wc),sc.set(at,_c)}return{get:function(at,st){return!0===rc[st.id]||(st.addEventListener("dispose",onGeometryDispose),rc[st.id]=!0,ot.memory.geometries++),st},update:function(ot){const ut=ot.attributes;for(const Hl in ut)st.update(ut[Hl],at.ARRAY_BUFFER)},getWireframeAttribute:function(at){const st=sc.get(at);if(st){const ot=at.index;null!==ot&&st.version<ot.version&&updateWireframeAttribute(at)}else updateWireframeAttribute(at);return sc.get(at)}}}function WebGLIndexedBufferRenderer(at,st,ot){let ut,Hl,rc;function renderInstances(st,sc,oc){0!==oc&&(at.drawElementsInstanced(ut,sc,Hl,st*rc,oc),ot.update(sc,ut,oc))}this.setMode=function(at){ut=at},this.setIndex=function(at){Hl=at.type,rc=at.bytesPerElement},this.render=function(st,sc){at.drawElements(ut,sc,Hl,st*rc),ot.update(sc,ut,1)},this.renderInstances=renderInstances,this.renderMultiDraw=function(at,rc,sc){if(0===sc)return;st.get("WEBGL_multi_draw").multiDrawElementsWEBGL(ut,rc,0,Hl,at,0,sc);let oc=0;for(let st=0;st<sc;st++)oc+=rc[st];ot.update(oc,ut,1)},this.renderMultiDrawInstances=function(at,sc,oc,_c){if(0===oc)return;const wc=st.get("WEBGL_multi_draw");if(null===wc)for(let st=0;st<at.length;st++)renderInstances(at[st]/rc,sc[st],_c[st]);else{wc.multiDrawElementsInstancedWEBGL(ut,sc,0,Hl,at,0,_c,0,oc);let st=0;for(let at=0;at<oc;at++)st+=sc[at]*_c[at];ot.update(st,ut,1)}}}function WebGLInfo(at){const st={frame:0,calls:0,triangles:0,points:0,lines:0};return{memory:{geometries:0,textures:0},render:st,programs:null,autoReset:!0,reset:function(){st.calls=0,st.triangles=0,st.points=0,st.lines=0},update:function(ot,ut,Hl){switch(st.calls++,ut){case at.TRIANGLES:st.triangles+=Hl*(ot/3);break;case at.LINES:st.lines+=Hl*(ot/2);break;case at.LINE_STRIP:st.lines+=Hl*(ot-1);break;case at.LINE_LOOP:st.lines+=Hl*ot;break;case at.POINTS:st.points+=Hl*ot;break;default:console.error("THREE.WebGLInfo: Unknown draw mode:",ut)}}}}function WebGLMorphtargets(at,st,ot){const Hl=new WeakMap,rc=new ut.IUQ;return{update:function(sc,oc,_c){const wc=sc.morphTargetInfluences,Sc=oc.morphAttributes.position||oc.morphAttributes.normal||oc.morphAttributes.color,iu=void 0!==Sc?Sc.length:0;let su=Hl.get(oc);if(void 0===su||su.count!==iu){void 0!==su&&su.texture.dispose();const lu=void 0!==oc.morphAttributes.position,cu=void 0!==oc.morphAttributes.normal,uu=void 0!==oc.morphAttributes.color,pu=oc.morphAttributes.position||[],mu=oc.morphAttributes.normal||[],gu=oc.morphAttributes.color||[];let Au=0;!0===lu&&(Au=1),!0===cu&&(Au=2),!0===uu&&(Au=3);let yu=oc.attributes.position.count*Au,_u=1;yu>st.maxTextureSize&&(_u=Math.ceil(yu/st.maxTextureSize),yu=st.maxTextureSize);const xu=new Float32Array(yu*_u*4*iu),Su=new ut.rFo(xu,yu,_u,iu);Su.type=ut.RQf,Su.needsUpdate=!0;const Du=4*Au;for(let Lu=0;Lu<iu;Lu++){const $u=pu[Lu],hh=mu[Lu],ed=gu[Lu],td=yu*_u*4*Lu;for(let id=0;id<$u.count;id++){const nd=id*Du;!0===lu&&(rc.fromBufferAttribute($u,id),xu[td+nd+0]=rc.x,xu[td+nd+1]=rc.y,xu[td+nd+2]=rc.z,xu[td+nd+3]=0),!0===cu&&(rc.fromBufferAttribute(hh,id),xu[td+nd+4]=rc.x,xu[td+nd+5]=rc.y,xu[td+nd+6]=rc.z,xu[td+nd+7]=0),!0===uu&&(rc.fromBufferAttribute(ed,id),xu[td+nd+8]=rc.x,xu[td+nd+9]=rc.y,xu[td+nd+10]=rc.z,xu[td+nd+11]=4===ed.itemSize?rc.w:1)}}function disposeTexture(){Su.dispose(),Hl.delete(oc),oc.removeEventListener("dispose",disposeTexture)}su={count:iu,texture:Su,size:new ut.I9Y(yu,_u)},Hl.set(oc,su),oc.addEventListener("dispose",disposeTexture)}if(!0===sc.isInstancedMesh&&null!==sc.morphTexture)_c.getUniforms().setValue(at,"morphTexture",sc.morphTexture,ot);else{let rd=0;for(let sd=0;sd<wc.length;sd++)rd+=wc[sd];const ad=oc.morphTargetsRelative?1:1-rd;_c.getUniforms().setValue(at,"morphTargetBaseInfluence",ad),_c.getUniforms().setValue(at,"morphTargetInfluences",wc)}_c.getUniforms().setValue(at,"morphTargetsTexture",su.texture,ot),_c.getUniforms().setValue(at,"morphTargetsTextureSize",su.size)}}}function WebGLObjects(at,st,ot,ut){let Hl=new WeakMap;function onInstancedMeshDispose(at){const st=at.target;st.removeEventListener("dispose",onInstancedMeshDispose),ot.remove(st.instanceMatrix),null!==st.instanceColor&&ot.remove(st.instanceColor)}return{update:function(rc){const sc=ut.render.frame,oc=rc.geometry,_c=st.get(rc,oc);if(Hl.get(_c)!==sc&&(st.update(_c),Hl.set(_c,sc)),rc.isInstancedMesh&&(!1===rc.hasEventListener("dispose",onInstancedMeshDispose)&&rc.addEventListener("dispose",onInstancedMeshDispose),Hl.get(rc)!==sc&&(ot.update(rc.instanceMatrix,at.ARRAY_BUFFER),null!==rc.instanceColor&&ot.update(rc.instanceColor,at.ARRAY_BUFFER),Hl.set(rc,sc))),rc.isSkinnedMesh){const at=rc.skeleton;Hl.get(at)!==sc&&(at.update(),Hl.set(at,sc))}return _c},dispose:function(){Hl=new WeakMap}}}const xu=new ut.gPd,Su=new ut.VCu(1,1),Du=new ut.rFo,Lu=new ut.dYF,$u=new ut.b4q,hh=[],ed=[],td=new Float32Array(16),id=new Float32Array(9),nd=new Float32Array(4);function flatten(at,st,ot){const ut=at[0];if(ut<=0||ut>0)return at;const Hl=st*ot;let rc=hh[Hl];if(void 0===rc&&(rc=new Float32Array(Hl),hh[Hl]=rc),0!==st){ut.toArray(rc,0);for(let ut=1,Hl=0;ut!==st;++ut)Hl+=ot,at[ut].toArray(rc,Hl)}return rc}function arraysEqual(at,st){if(at.length!==st.length)return!1;for(let ot=0,ut=at.length;ot<ut;ot++)if(at[ot]!==st[ot])return!1;return!0}function copyArray(at,st){for(let ot=0,ut=st.length;ot<ut;ot++)at[ot]=st[ot]}function allocTexUnits(at,st){let ot=ed[st];void 0===ot&&(ot=new Int32Array(st),ed[st]=ot);for(let ut=0;ut!==st;++ut)ot[ut]=at.allocateTextureUnit();return ot}function setValueV1f(at,st){const ot=this.cache;ot[0]!==st&&(at.uniform1f(this.addr,st),ot[0]=st)}function setValueV2f(at,st){const ot=this.cache;if(void 0!==st.x)ot[0]===st.x&&ot[1]===st.y||(at.uniform2f(this.addr,st.x,st.y),ot[0]=st.x,ot[1]=st.y);else{if(arraysEqual(ot,st))return;at.uniform2fv(this.addr,st),copyArray(ot,st)}}function setValueV3f(at,st){const ot=this.cache;if(void 0!==st.x)ot[0]===st.x&&ot[1]===st.y&&ot[2]===st.z||(at.uniform3f(this.addr,st.x,st.y,st.z),ot[0]=st.x,ot[1]=st.y,ot[2]=st.z);else if(void 0!==st.r)ot[0]===st.r&&ot[1]===st.g&&ot[2]===st.b||(at.uniform3f(this.addr,st.r,st.g,st.b),ot[0]=st.r,ot[1]=st.g,ot[2]=st.b);else{if(arraysEqual(ot,st))return;at.uniform3fv(this.addr,st),copyArray(ot,st)}}function setValueV4f(at,st){const ot=this.cache;if(void 0!==st.x)ot[0]===st.x&&ot[1]===st.y&&ot[2]===st.z&&ot[3]===st.w||(at.uniform4f(this.addr,st.x,st.y,st.z,st.w),ot[0]=st.x,ot[1]=st.y,ot[2]=st.z,ot[3]=st.w);else{if(arraysEqual(ot,st))return;at.uniform4fv(this.addr,st),copyArray(ot,st)}}function setValueM2(at,st){const ot=this.cache,ut=st.elements;if(void 0===ut){if(arraysEqual(ot,st))return;at.uniformMatrix2fv(this.addr,!1,st),copyArray(ot,st)}else{if(arraysEqual(ot,ut))return;nd.set(ut),at.uniformMatrix2fv(this.addr,!1,nd),copyArray(ot,ut)}}function setValueM3(at,st){const ot=this.cache,ut=st.elements;if(void 0===ut){if(arraysEqual(ot,st))return;at.uniformMatrix3fv(this.addr,!1,st),copyArray(ot,st)}else{if(arraysEqual(ot,ut))return;id.set(ut),at.uniformMatrix3fv(this.addr,!1,id),copyArray(ot,ut)}}function setValueM4(at,st){const ot=this.cache,ut=st.elements;if(void 0===ut){if(arraysEqual(ot,st))return;at.uniformMatrix4fv(this.addr,!1,st),copyArray(ot,st)}else{if(arraysEqual(ot,ut))return;td.set(ut),at.uniformMatrix4fv(this.addr,!1,td),copyArray(ot,ut)}}function setValueV1i(at,st){const ot=this.cache;ot[0]!==st&&(at.uniform1i(this.addr,st),ot[0]=st)}function setValueV2i(at,st){const ot=this.cache;if(void 0!==st.x)ot[0]===st.x&&ot[1]===st.y||(at.uniform2i(this.addr,st.x,st.y),ot[0]=st.x,ot[1]=st.y);else{if(arraysEqual(ot,st))return;at.uniform2iv(this.addr,st),copyArray(ot,st)}}function setValueV3i(at,st){const ot=this.cache;if(void 0!==st.x)ot[0]===st.x&&ot[1]===st.y&&ot[2]===st.z||(at.uniform3i(this.addr,st.x,st.y,st.z),ot[0]=st.x,ot[1]=st.y,ot[2]=st.z);else{if(arraysEqual(ot,st))return;at.uniform3iv(this.addr,st),copyArray(ot,st)}}function setValueV4i(at,st){const ot=this.cache;if(void 0!==st.x)ot[0]===st.x&&ot[1]===st.y&&ot[2]===st.z&&ot[3]===st.w||(at.uniform4i(this.addr,st.x,st.y,st.z,st.w),ot[0]=st.x,ot[1]=st.y,ot[2]=st.z,ot[3]=st.w);else{if(arraysEqual(ot,st))return;at.uniform4iv(this.addr,st),copyArray(ot,st)}}function setValueV1ui(at,st){const ot=this.cache;ot[0]!==st&&(at.uniform1ui(this.addr,st),ot[0]=st)}function setValueV2ui(at,st){const ot=this.cache;if(void 0!==st.x)ot[0]===st.x&&ot[1]===st.y||(at.uniform2ui(this.addr,st.x,st.y),ot[0]=st.x,ot[1]=st.y);else{if(arraysEqual(ot,st))return;at.uniform2uiv(this.addr,st),copyArray(ot,st)}}function setValueV3ui(at,st){const ot=this.cache;if(void 0!==st.x)ot[0]===st.x&&ot[1]===st.y&&ot[2]===st.z||(at.uniform3ui(this.addr,st.x,st.y,st.z),ot[0]=st.x,ot[1]=st.y,ot[2]=st.z);else{if(arraysEqual(ot,st))return;at.uniform3uiv(this.addr,st),copyArray(ot,st)}}function setValueV4ui(at,st){const ot=this.cache;if(void 0!==st.x)ot[0]===st.x&&ot[1]===st.y&&ot[2]===st.z&&ot[3]===st.w||(at.uniform4ui(this.addr,st.x,st.y,st.z,st.w),ot[0]=st.x,ot[1]=st.y,ot[2]=st.z,ot[3]=st.w);else{if(arraysEqual(ot,st))return;at.uniform4uiv(this.addr,st),copyArray(ot,st)}}function setValueT1(at,st,ot){const Hl=this.cache,rc=ot.allocateTextureUnit();let sc;Hl[0]!==rc&&(at.uniform1i(this.addr,rc),Hl[0]=rc),this.type===at.SAMPLER_2D_SHADOW?(Su.compareFunction=ut.TiK,sc=Su):sc=xu,ot.setTexture2D(st||sc,rc)}function setValueT3D1(at,st,ot){const ut=this.cache,Hl=ot.allocateTextureUnit();ut[0]!==Hl&&(at.uniform1i(this.addr,Hl),ut[0]=Hl),ot.setTexture3D(st||Lu,Hl)}function setValueT6(at,st,ot){const ut=this.cache,Hl=ot.allocateTextureUnit();ut[0]!==Hl&&(at.uniform1i(this.addr,Hl),ut[0]=Hl),ot.setTextureCube(st||$u,Hl)}function setValueT2DArray1(at,st,ot){const ut=this.cache,Hl=ot.allocateTextureUnit();ut[0]!==Hl&&(at.uniform1i(this.addr,Hl),ut[0]=Hl),ot.setTexture2DArray(st||Du,Hl)}function setValueV1fArray(at,st){at.uniform1fv(this.addr,st)}function setValueV2fArray(at,st){const ot=flatten(st,this.size,2);at.uniform2fv(this.addr,ot)}function setValueV3fArray(at,st){const ot=flatten(st,this.size,3);at.uniform3fv(this.addr,ot)}function setValueV4fArray(at,st){const ot=flatten(st,this.size,4);at.uniform4fv(this.addr,ot)}function setValueM2Array(at,st){const ot=flatten(st,this.size,4);at.uniformMatrix2fv(this.addr,!1,ot)}function setValueM3Array(at,st){const ot=flatten(st,this.size,9);at.uniformMatrix3fv(this.addr,!1,ot)}function setValueM4Array(at,st){const ot=flatten(st,this.size,16);at.uniformMatrix4fv(this.addr,!1,ot)}function setValueV1iArray(at,st){at.uniform1iv(this.addr,st)}function setValueV2iArray(at,st){at.uniform2iv(this.addr,st)}function setValueV3iArray(at,st){at.uniform3iv(this.addr,st)}function setValueV4iArray(at,st){at.uniform4iv(this.addr,st)}function setValueV1uiArray(at,st){at.uniform1uiv(this.addr,st)}function setValueV2uiArray(at,st){at.uniform2uiv(this.addr,st)}function setValueV3uiArray(at,st){at.uniform3uiv(this.addr,st)}function setValueV4uiArray(at,st){at.uniform4uiv(this.addr,st)}function setValueT1Array(at,st,ot){const ut=this.cache,Hl=st.length,rc=allocTexUnits(ot,Hl);arraysEqual(ut,rc)||(at.uniform1iv(this.addr,rc),copyArray(ut,rc));for(let sc=0;sc!==Hl;++sc)ot.setTexture2D(st[sc]||xu,rc[sc])}function setValueT3DArray(at,st,ot){const ut=this.cache,Hl=st.length,rc=allocTexUnits(ot,Hl);arraysEqual(ut,rc)||(at.uniform1iv(this.addr,rc),copyArray(ut,rc));for(let sc=0;sc!==Hl;++sc)ot.setTexture3D(st[sc]||Lu,rc[sc])}function setValueT6Array(at,st,ot){const ut=this.cache,Hl=st.length,rc=allocTexUnits(ot,Hl);arraysEqual(ut,rc)||(at.uniform1iv(this.addr,rc),copyArray(ut,rc));for(let sc=0;sc!==Hl;++sc)ot.setTextureCube(st[sc]||$u,rc[sc])}function setValueT2DArrayArray(at,st,ot){const ut=this.cache,Hl=st.length,rc=allocTexUnits(ot,Hl);arraysEqual(ut,rc)||(at.uniform1iv(this.addr,rc),copyArray(ut,rc));for(let sc=0;sc!==Hl;++sc)ot.setTexture2DArray(st[sc]||Du,rc[sc])}class SingleUniform{constructor(at,st,ot){this.id=at,this.addr=ot,this.cache=[],this.type=st.type,this.setValue=function(at){switch(at){case 5126:return setValueV1f;case 35664:return setValueV2f;case 35665:return setValueV3f;case 35666:return setValueV4f;case 35674:return setValueM2;case 35675:return setValueM3;case 35676:return setValueM4;case 5124:case 35670:return setValueV1i;case 35667:case 35671:return setValueV2i;case 35668:case 35672:return setValueV3i;case 35669:case 35673:return setValueV4i;case 5125:return setValueV1ui;case 36294:return setValueV2ui;case 36295:return setValueV3ui;case 36296:return setValueV4ui;case 35678:case 36198:case 36298:case 36306:case 35682:return setValueT1;case 35679:case 36299:case 36307:return setValueT3D1;case 35680:case 36300:case 36308:case 36293:return setValueT6;case 36289:case 36303:case 36311:case 36292:return setValueT2DArray1}}(st.type)}}class PureArrayUniform{constructor(at,st,ot){this.id=at,this.addr=ot,this.cache=[],this.type=st.type,this.size=st.size,this.setValue=function(at){switch(at){case 5126:return setValueV1fArray;case 35664:return setValueV2fArray;case 35665:return setValueV3fArray;case 35666:return setValueV4fArray;case 35674:return setValueM2Array;case 35675:return setValueM3Array;case 35676:return setValueM4Array;case 5124:case 35670:return setValueV1iArray;case 35667:case 35671:return setValueV2iArray;case 35668:case 35672:return setValueV3iArray;case 35669:case 35673:return setValueV4iArray;case 5125:return setValueV1uiArray;case 36294:return setValueV2uiArray;case 36295:return setValueV3uiArray;case 36296:return setValueV4uiArray;case 35678:case 36198:case 36298:case 36306:case 35682:return setValueT1Array;case 35679:case 36299:case 36307:return setValueT3DArray;case 35680:case 36300:case 36308:case 36293:return setValueT6Array;case 36289:case 36303:case 36311:case 36292:return setValueT2DArrayArray}}(st.type)}}class StructuredUniform{constructor(at){this.id=at,this.seq=[],this.map={}}setValue(at,st,ot){const ut=this.seq;for(let Hl=0,rc=ut.length;Hl!==rc;++Hl){const rc=ut[Hl];rc.setValue(at,st[rc.id],ot)}}}const rd=/(\w+)(\])?(\[|\.)?/g;function addUniform(at,st){at.seq.push(st),at.map[st.id]=st}function parseUniform(at,st,ot){const ut=at.name,Hl=ut.length;for(rd.lastIndex=0;;){const rc=rd.exec(ut),sc=rd.lastIndex;let oc=rc[1];const _c="]"===rc[2],wc=rc[3];if(_c&&(oc|=0),void 0===wc||"["===wc&&sc+2===Hl){addUniform(ot,void 0===wc?new SingleUniform(oc,at,st):new PureArrayUniform(oc,at,st));break}{let at=ot.map[oc];void 0===at&&(at=new StructuredUniform(oc),addUniform(ot,at)),ot=at}}}class WebGLUniforms{constructor(at,st){this.seq=[],this.map={};const ot=at.getProgramParameter(st,at.ACTIVE_UNIFORMS);for(let ut=0;ut<ot;++ut){const ot=at.getActiveUniform(st,ut);parseUniform(ot,at.getUniformLocation(st,ot.name),this)}}setValue(at,st,ot,ut){const Hl=this.map[st];void 0!==Hl&&Hl.setValue(at,ot,ut)}setOptional(at,st,ot){const ut=st[ot];void 0!==ut&&this.setValue(at,ot,ut)}static upload(at,st,ot,ut){for(let Hl=0,rc=st.length;Hl!==rc;++Hl){const rc=st[Hl],sc=ot[rc.id];!1!==sc.needsUpdate&&rc.setValue(at,sc.value,ut)}}static seqWithValue(at,st){const ot=[];for(let ut=0,Hl=at.length;ut!==Hl;++ut){const Hl=at[ut];Hl.id in st&&ot.push(Hl)}return ot}}function WebGLShader(at,st,ot){const ut=at.createShader(st);return at.shaderSource(ut,ot),at.compileShader(ut),ut}let ad=0;const sd=new ut.dwI;function getShaderErrors(at,st,ot){const ut=at.getShaderParameter(st,at.COMPILE_STATUS),Hl=at.getShaderInfoLog(st).trim();if(ut&&""===Hl)return"";const rc=/ERROR: 0:(\d+)/.exec(Hl);if(rc){const ut=parseInt(rc[1]);return ot.toUpperCase()+"\n\n"+Hl+"\n\n"+function(at,st){const ot=at.split("\n"),ut=[],Hl=Math.max(st-6,0),rc=Math.min(st+6,ot.length);for(let sc=Hl;sc<rc;sc++){const at=sc+1;ut.push(`${at===st?">":" "} ${at}: ${ot[sc]}`)}return ut.join("\n")}(at.getShaderSource(st),ut)}return Hl}function getTexelEncodingFunction(at,st){const ot=function(at){ut.ppV._getMatrix(sd,ut.ppV.workingColorSpace,at);const st=`mat3( ${sd.elements.map((at=>at.toFixed(4)))} )`;switch(ut.ppV.getTransfer(at)){case ut.VxR:return[st,"LinearTransferOETF"];case ut.KLL:return[st,"sRGBTransferOETF"];default:return console.warn("THREE.WebGLProgram: Unsupported color space: ",at),[st,"LinearTransferOETF"]}}(st);return[`vec4 ${at}( vec4 value ) {`,`\treturn ${ot[1]}( vec4( value.rgb * ${ot[0]}, value.a ) );`,"}"].join("\n")}function getToneMappingFunction(at,st){let ot;switch(st){case ut.kyO:ot="Linear";break;case ut.Mjd:ot="Reinhard";break;case ut.nNL:ot="Cineon";break;case ut.FV:ot="ACESFilmic";break;case ut.LAk:ot="AgX";break;case ut.aJ8:ot="Neutral";break;case ut.g7M:ot="Custom";break;default:console.warn("THREE.WebGLProgram: Unsupported toneMapping:",st),ot="Linear"}return"vec3 "+at+"( vec3 color ) { return "+ot+"ToneMapping( color ); }"}const od=new ut.Pq0;function getLuminanceFunction(){ut.ppV.getLuminanceCoefficients(od);return["float luminance( const in vec3 rgb ) {",`\tconst vec3 weights = vec3( ${od.x.toFixed(4)}, ${od.y.toFixed(4)}, ${od.z.toFixed(4)} );`,"\treturn dot( weights, rgb );","}"].join("\n")}function filterEmptyLine(at){return""!==at}function replaceLightNums(at,st){const ot=st.numSpotLightShadows+st.numSpotLightMaps-st.numSpotLightShadowsWithMaps;return at.replace(/NUM_DIR_LIGHTS/g,st.numDirLights).replace(/NUM_SPOT_LIGHTS/g,st.numSpotLights).replace(/NUM_SPOT_LIGHT_MAPS/g,st.numSpotLightMaps).replace(/NUM_SPOT_LIGHT_COORDS/g,ot).replace(/NUM_RECT_AREA_LIGHTS/g,st.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,st.numPointLights).replace(/NUM_HEMI_LIGHTS/g,st.numHemiLights).replace(/NUM_DIR_LIGHT_SHADOWS/g,st.numDirLightShadows).replace(/NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g,st.numSpotLightShadowsWithMaps).replace(/NUM_SPOT_LIGHT_SHADOWS/g,st.numSpotLightShadows).replace(/NUM_POINT_LIGHT_SHADOWS/g,st.numPointLightShadows)}function replaceClippingPlaneNums(at,st){return at.replace(/NUM_CLIPPING_PLANES/g,st.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,st.numClippingPlanes-st.numClipIntersection)}const ld=/^[ \t]*#include +<([\w\d./]+)>/gm;function resolveIncludes(at){return at.replace(ld,includeReplacer)}const cd=new Map;function includeReplacer(at,st){let ot=Hl[st];if(void 0===ot){const at=cd.get(st);if(void 0===at)throw new Error("Can not resolve #include <"+st+">");ot=Hl[at],console.warn('THREE.WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.',st,at)}return resolveIncludes(ot)}const ud=/#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;function unrollLoops(at){return at.replace(ud,loopReplacer)}function loopReplacer(at,st,ot,ut){let Hl="";for(let rc=parseInt(st);rc<parseInt(ot);rc++)Hl+=ut.replace(/\[\s*i\s*\]/g,"[ "+rc+" ]").replace(/UNROLLED_LOOP_INDEX/g,rc);return Hl}function generatePrecision(at){let st=`precision ${at.precision} float;\n\tprecision ${at.precision} int;\n\tprecision ${at.precision} sampler2D;\n\tprecision ${at.precision} samplerCube;\n\tprecision ${at.precision} sampler3D;\n\tprecision ${at.precision} sampler2DArray;\n\tprecision ${at.precision} sampler2DShadow;\n\tprecision ${at.precision} samplerCubeShadow;\n\tprecision ${at.precision} sampler2DArrayShadow;\n\tprecision ${at.precision} isampler2D;\n\tprecision ${at.precision} isampler3D;\n\tprecision ${at.precision} isamplerCube;\n\tprecision ${at.precision} isampler2DArray;\n\tprecision ${at.precision} usampler2D;\n\tprecision ${at.precision} usampler3D;\n\tprecision ${at.precision} usamplerCube;\n\tprecision ${at.precision} usampler2DArray;\n\t`;return"highp"===at.precision?st+="\n#define HIGH_PRECISION":"mediump"===at.precision?st+="\n#define MEDIUM_PRECISION":"lowp"===at.precision&&(st+="\n#define LOW_PRECISION"),st}function WebGLProgram(at,st,ot,rc){const sc=at.getContext(),oc=ot.defines;let _c=ot.vertexShader,wc=ot.fragmentShader;const Sc=function(at){let st="SHADOWMAP_TYPE_BASIC";return at.shadowMapType===ut.QP0?st="SHADOWMAP_TYPE_PCF":at.shadowMapType===ut.Wk7?st="SHADOWMAP_TYPE_PCF_SOFT":at.shadowMapType===ut.RyA&&(st="SHADOWMAP_TYPE_VSM"),st}(ot),iu=function(at){let st="ENVMAP_TYPE_CUBE";if(at.envMap)switch(at.envMapMode){case ut.hy7:case ut.xFO:st="ENVMAP_TYPE_CUBE";break;case ut.Om:st="ENVMAP_TYPE_CUBE_UV"}return st}(ot),su=function(at){let st="ENVMAP_MODE_REFLECTION";at.envMap&&at.envMapMode===ut.xFO&&(st="ENVMAP_MODE_REFRACTION");return st}(ot),lu=function(at){let st="ENVMAP_BLENDING_NONE";if(at.envMap)switch(at.combine){case ut.caT:st="ENVMAP_BLENDING_MULTIPLY";break;case ut.KRh:st="ENVMAP_BLENDING_MIX";break;case ut.XrR:st="ENVMAP_BLENDING_ADD"}return st}(ot),cu=function(at){const st=at.envMapCubeUVHeight;if(null===st)return null;const ot=Math.log2(st)-2,ut=1/st;return{texelWidth:1/(3*Math.max(Math.pow(2,ot),112)),texelHeight:ut,maxMip:ot}}(ot),uu=function(at){return[at.extensionClipCullDistance?"#extension GL_ANGLE_clip_cull_distance : require":"",at.extensionMultiDraw?"#extension GL_ANGLE_multi_draw : require":""].filter(filterEmptyLine).join("\n")}(ot),pu=function(at){const st=[];for(const ot in at){const ut=at[ot];!1!==ut&&st.push("#define "+ot+" "+ut)}return st.join("\n")}(oc),mu=sc.createProgram();let gu,Au,yu=ot.glslVersion?"#version "+ot.glslVersion+"\n":"";ot.isRawShaderMaterial?(gu=["#define SHADER_TYPE "+ot.shaderType,"#define SHADER_NAME "+ot.shaderName,pu].filter(filterEmptyLine).join("\n"),gu.length>0&&(gu+="\n"),Au=["#define SHADER_TYPE "+ot.shaderType,"#define SHADER_NAME "+ot.shaderName,pu].filter(filterEmptyLine).join("\n"),Au.length>0&&(Au+="\n")):(gu=[generatePrecision(ot),"#define SHADER_TYPE "+ot.shaderType,"#define SHADER_NAME "+ot.shaderName,pu,ot.extensionClipCullDistance?"#define USE_CLIP_DISTANCE":"",ot.batching?"#define USE_BATCHING":"",ot.batchingColor?"#define USE_BATCHING_COLOR":"",ot.instancing?"#define USE_INSTANCING":"",ot.instancingColor?"#define USE_INSTANCING_COLOR":"",ot.instancingMorph?"#define USE_INSTANCING_MORPH":"",ot.useFog&&ot.fog?"#define USE_FOG":"",ot.useFog&&ot.fogExp2?"#define FOG_EXP2":"",ot.map?"#define USE_MAP":"",ot.envMap?"#define USE_ENVMAP":"",ot.envMap?"#define "+su:"",ot.lightMap?"#define USE_LIGHTMAP":"",ot.aoMap?"#define USE_AOMAP":"",ot.bumpMap?"#define USE_BUMPMAP":"",ot.normalMap?"#define USE_NORMALMAP":"",ot.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",ot.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",ot.displacementMap?"#define USE_DISPLACEMENTMAP":"",ot.emissiveMap?"#define USE_EMISSIVEMAP":"",ot.anisotropy?"#define USE_ANISOTROPY":"",ot.anisotropyMap?"#define USE_ANISOTROPYMAP":"",ot.clearcoatMap?"#define USE_CLEARCOATMAP":"",ot.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",ot.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",ot.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",ot.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",ot.specularMap?"#define USE_SPECULARMAP":"",ot.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",ot.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",ot.roughnessMap?"#define USE_ROUGHNESSMAP":"",ot.metalnessMap?"#define USE_METALNESSMAP":"",ot.alphaMap?"#define USE_ALPHAMAP":"",ot.alphaHash?"#define USE_ALPHAHASH":"",ot.transmission?"#define USE_TRANSMISSION":"",ot.transmissionMap?"#define USE_TRANSMISSIONMAP":"",ot.thicknessMap?"#define USE_THICKNESSMAP":"",ot.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",ot.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",ot.mapUv?"#define MAP_UV "+ot.mapUv:"",ot.alphaMapUv?"#define ALPHAMAP_UV "+ot.alphaMapUv:"",ot.lightMapUv?"#define LIGHTMAP_UV "+ot.lightMapUv:"",ot.aoMapUv?"#define AOMAP_UV "+ot.aoMapUv:"",ot.emissiveMapUv?"#define EMISSIVEMAP_UV "+ot.emissiveMapUv:"",ot.bumpMapUv?"#define BUMPMAP_UV "+ot.bumpMapUv:"",ot.normalMapUv?"#define NORMALMAP_UV "+ot.normalMapUv:"",ot.displacementMapUv?"#define DISPLACEMENTMAP_UV "+ot.displacementMapUv:"",ot.metalnessMapUv?"#define METALNESSMAP_UV "+ot.metalnessMapUv:"",ot.roughnessMapUv?"#define ROUGHNESSMAP_UV "+ot.roughnessMapUv:"",ot.anisotropyMapUv?"#define ANISOTROPYMAP_UV "+ot.anisotropyMapUv:"",ot.clearcoatMapUv?"#define CLEARCOATMAP_UV "+ot.clearcoatMapUv:"",ot.clearcoatNormalMapUv?"#define CLEARCOAT_NORMALMAP_UV "+ot.clearcoatNormalMapUv:"",ot.clearcoatRoughnessMapUv?"#define CLEARCOAT_ROUGHNESSMAP_UV "+ot.clearcoatRoughnessMapUv:"",ot.iridescenceMapUv?"#define IRIDESCENCEMAP_UV "+ot.iridescenceMapUv:"",ot.iridescenceThicknessMapUv?"#define IRIDESCENCE_THICKNESSMAP_UV "+ot.iridescenceThicknessMapUv:"",ot.sheenColorMapUv?"#define SHEEN_COLORMAP_UV "+ot.sheenColorMapUv:"",ot.sheenRoughnessMapUv?"#define SHEEN_ROUGHNESSMAP_UV "+ot.sheenRoughnessMapUv:"",ot.specularMapUv?"#define SPECULARMAP_UV "+ot.specularMapUv:"",ot.specularColorMapUv?"#define SPECULAR_COLORMAP_UV "+ot.specularColorMapUv:"",ot.specularIntensityMapUv?"#define SPECULAR_INTENSITYMAP_UV "+ot.specularIntensityMapUv:"",ot.transmissionMapUv?"#define TRANSMISSIONMAP_UV "+ot.transmissionMapUv:"",ot.thicknessMapUv?"#define THICKNESSMAP_UV "+ot.thicknessMapUv:"",ot.vertexTangents&&!1===ot.flatShading?"#define USE_TANGENT":"",ot.vertexColors?"#define USE_COLOR":"",ot.vertexAlphas?"#define USE_COLOR_ALPHA":"",ot.vertexUv1s?"#define USE_UV1":"",ot.vertexUv2s?"#define USE_UV2":"",ot.vertexUv3s?"#define USE_UV3":"",ot.pointsUvs?"#define USE_POINTS_UV":"",ot.flatShading?"#define FLAT_SHADED":"",ot.skinning?"#define USE_SKINNING":"",ot.morphTargets?"#define USE_MORPHTARGETS":"",ot.morphNormals&&!1===ot.flatShading?"#define USE_MORPHNORMALS":"",ot.morphColors?"#define USE_MORPHCOLORS":"",ot.morphTargetsCount>0?"#define MORPHTARGETS_TEXTURE_STRIDE "+ot.morphTextureStride:"",ot.morphTargetsCount>0?"#define MORPHTARGETS_COUNT "+ot.morphTargetsCount:"",ot.doubleSided?"#define DOUBLE_SIDED":"",ot.flipSided?"#define FLIP_SIDED":"",ot.shadowMapEnabled?"#define USE_SHADOWMAP":"",ot.shadowMapEnabled?"#define "+Sc:"",ot.sizeAttenuation?"#define USE_SIZEATTENUATION":"",ot.numLightProbes>0?"#define USE_LIGHT_PROBES":"",ot.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",ot.reverseDepthBuffer?"#define USE_REVERSEDEPTHBUF":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING","\tattribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR","\tattribute vec3 instanceColor;","#endif","#ifdef USE_INSTANCING_MORPH","\tuniform sampler2D morphTexture;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_UV1","\tattribute vec2 uv1;","#endif","#ifdef USE_UV2","\tattribute vec2 uv2;","#endif","#ifdef USE_UV3","\tattribute vec2 uv3;","#endif","#ifdef USE_TANGENT","\tattribute vec4 tangent;","#endif","#if defined( USE_COLOR_ALPHA )","\tattribute vec4 color;","#elif defined( USE_COLOR )","\tattribute vec3 color;","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(filterEmptyLine).join("\n"),Au=[generatePrecision(ot),"#define SHADER_TYPE "+ot.shaderType,"#define SHADER_NAME "+ot.shaderName,pu,ot.useFog&&ot.fog?"#define USE_FOG":"",ot.useFog&&ot.fogExp2?"#define FOG_EXP2":"",ot.alphaToCoverage?"#define ALPHA_TO_COVERAGE":"",ot.map?"#define USE_MAP":"",ot.matcap?"#define USE_MATCAP":"",ot.envMap?"#define USE_ENVMAP":"",ot.envMap?"#define "+iu:"",ot.envMap?"#define "+su:"",ot.envMap?"#define "+lu:"",cu?"#define CUBEUV_TEXEL_WIDTH "+cu.texelWidth:"",cu?"#define CUBEUV_TEXEL_HEIGHT "+cu.texelHeight:"",cu?"#define CUBEUV_MAX_MIP "+cu.maxMip+".0":"",ot.lightMap?"#define USE_LIGHTMAP":"",ot.aoMap?"#define USE_AOMAP":"",ot.bumpMap?"#define USE_BUMPMAP":"",ot.normalMap?"#define USE_NORMALMAP":"",ot.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",ot.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",ot.emissiveMap?"#define USE_EMISSIVEMAP":"",ot.anisotropy?"#define USE_ANISOTROPY":"",ot.anisotropyMap?"#define USE_ANISOTROPYMAP":"",ot.clearcoat?"#define USE_CLEARCOAT":"",ot.clearcoatMap?"#define USE_CLEARCOATMAP":"",ot.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",ot.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",ot.dispersion?"#define USE_DISPERSION":"",ot.iridescence?"#define USE_IRIDESCENCE":"",ot.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",ot.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",ot.specularMap?"#define USE_SPECULARMAP":"",ot.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",ot.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",ot.roughnessMap?"#define USE_ROUGHNESSMAP":"",ot.metalnessMap?"#define USE_METALNESSMAP":"",ot.alphaMap?"#define USE_ALPHAMAP":"",ot.alphaTest?"#define USE_ALPHATEST":"",ot.alphaHash?"#define USE_ALPHAHASH":"",ot.sheen?"#define USE_SHEEN":"",ot.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",ot.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",ot.transmission?"#define USE_TRANSMISSION":"",ot.transmissionMap?"#define USE_TRANSMISSIONMAP":"",ot.thicknessMap?"#define USE_THICKNESSMAP":"",ot.vertexTangents&&!1===ot.flatShading?"#define USE_TANGENT":"",ot.vertexColors||ot.instancingColor||ot.batchingColor?"#define USE_COLOR":"",ot.vertexAlphas?"#define USE_COLOR_ALPHA":"",ot.vertexUv1s?"#define USE_UV1":"",ot.vertexUv2s?"#define USE_UV2":"",ot.vertexUv3s?"#define USE_UV3":"",ot.pointsUvs?"#define USE_POINTS_UV":"",ot.gradientMap?"#define USE_GRADIENTMAP":"",ot.flatShading?"#define FLAT_SHADED":"",ot.doubleSided?"#define DOUBLE_SIDED":"",ot.flipSided?"#define FLIP_SIDED":"",ot.shadowMapEnabled?"#define USE_SHADOWMAP":"",ot.shadowMapEnabled?"#define "+Sc:"",ot.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",ot.numLightProbes>0?"#define USE_LIGHT_PROBES":"",ot.decodeVideoTexture?"#define DECODE_VIDEO_TEXTURE":"",ot.decodeVideoTextureEmissive?"#define DECODE_VIDEO_TEXTURE_EMISSIVE":"",ot.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",ot.reverseDepthBuffer?"#define USE_REVERSEDEPTHBUF":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",ot.toneMapping!==ut.y_p?"#define TONE_MAPPING":"",ot.toneMapping!==ut.y_p?Hl.tonemapping_pars_fragment:"",ot.toneMapping!==ut.y_p?getToneMappingFunction("toneMapping",ot.toneMapping):"",ot.dithering?"#define DITHERING":"",ot.opaque?"#define OPAQUE":"",Hl.colorspace_pars_fragment,getTexelEncodingFunction("linearToOutputTexel",ot.outputColorSpace),getLuminanceFunction(),ot.useDepthPacking?"#define DEPTH_PACKING "+ot.depthPacking:"","\n"].filter(filterEmptyLine).join("\n")),_c=resolveIncludes(_c),_c=replaceLightNums(_c,ot),_c=replaceClippingPlaneNums(_c,ot),wc=resolveIncludes(wc),wc=replaceLightNums(wc,ot),wc=replaceClippingPlaneNums(wc,ot),_c=unrollLoops(_c),wc=unrollLoops(wc),!0!==ot.isRawShaderMaterial&&(yu="#version 300 es\n",gu=[uu,"#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+gu,Au=["#define varying in",ot.glslVersion===ut.Wdf?"":"layout(location = 0) out highp vec4 pc_fragColor;",ot.glslVersion===ut.Wdf?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join("\n")+"\n"+Au);const _u=yu+gu+_c,xu=yu+Au+wc,Su=WebGLShader(sc,sc.VERTEX_SHADER,_u),Du=WebGLShader(sc,sc.FRAGMENT_SHADER,xu);function onFirstUse(st){if(at.debug.checkShaderErrors){const ot=sc.getProgramInfoLog(mu).trim(),ut=sc.getShaderInfoLog(Su).trim(),Hl=sc.getShaderInfoLog(Du).trim();let rc=!0,oc=!0;if(!1===sc.getProgramParameter(mu,sc.LINK_STATUS))if(rc=!1,"function"===typeof at.debug.onShaderError)at.debug.onShaderError(sc,mu,Su,Du);else{const at=getShaderErrors(sc,Su,"vertex"),ut=getShaderErrors(sc,Du,"fragment");console.error("THREE.WebGLProgram: Shader Error "+sc.getError()+" - VALIDATE_STATUS "+sc.getProgramParameter(mu,sc.VALIDATE_STATUS)+"\n\nMaterial Name: "+st.name+"\nMaterial Type: "+st.type+"\n\nProgram Info Log: "+ot+"\n"+at+"\n"+ut)}else""!==ot?console.warn("THREE.WebGLProgram: Program Info Log:",ot):""!==ut&&""!==Hl||(oc=!1);oc&&(st.diagnostics={runnable:rc,programLog:ot,vertexShader:{log:ut,prefix:gu},fragmentShader:{log:Hl,prefix:Au}})}sc.deleteShader(Su),sc.deleteShader(Du),Lu=new WebGLUniforms(sc,mu),$u=function(at,st){const ot={},ut=at.getProgramParameter(st,at.ACTIVE_ATTRIBUTES);for(let Hl=0;Hl<ut;Hl++){const ut=at.getActiveAttrib(st,Hl),rc=ut.name;let sc=1;ut.type===at.FLOAT_MAT2&&(sc=2),ut.type===at.FLOAT_MAT3&&(sc=3),ut.type===at.FLOAT_MAT4&&(sc=4),ot[rc]={type:ut.type,location:at.getAttribLocation(st,rc),locationSize:sc}}return ot}(sc,mu)}let Lu,$u;sc.attachShader(mu,Su),sc.attachShader(mu,Du),void 0!==ot.index0AttributeName?sc.bindAttribLocation(mu,0,ot.index0AttributeName):!0===ot.morphTargets&&sc.bindAttribLocation(mu,0,"position"),sc.linkProgram(mu),this.getUniforms=function(){return void 0===Lu&&onFirstUse(this),Lu},this.getAttributes=function(){return void 0===$u&&onFirstUse(this),$u};let hh=!1===ot.rendererExtensionParallelShaderCompile;return this.isReady=function(){return!1===hh&&(hh=sc.getProgramParameter(mu,37297)),hh},this.destroy=function(){rc.releaseStatesOfProgram(this),sc.deleteProgram(mu),this.program=void 0},this.type=ot.shaderType,this.name=ot.shaderName,this.id=ad++,this.cacheKey=st,this.usedTimes=1,this.program=mu,this.vertexShader=Su,this.fragmentShader=Du,this}let hd=0;class WebGLShaderCache{constructor(){this.shaderCache=new Map,this.materialCache=new Map}update(at){const st=at.vertexShader,ot=at.fragmentShader,ut=this._getShaderStage(st),Hl=this._getShaderStage(ot),rc=this._getShaderCacheForMaterial(at);return!1===rc.has(ut)&&(rc.add(ut),ut.usedTimes++),!1===rc.has(Hl)&&(rc.add(Hl),Hl.usedTimes++),this}remove(at){const st=this.materialCache.get(at);for(const ot of st)ot.usedTimes--,0===ot.usedTimes&&this.shaderCache.delete(ot.code);return this.materialCache.delete(at),this}getVertexShaderID(at){return this._getShaderStage(at.vertexShader).id}getFragmentShaderID(at){return this._getShaderStage(at.fragmentShader).id}dispose(){this.shaderCache.clear(),this.materialCache.clear()}_getShaderCacheForMaterial(at){const st=this.materialCache;let ot=st.get(at);return void 0===ot&&(ot=new Set,st.set(at,ot)),ot}_getShaderStage(at){const st=this.shaderCache;let ot=st.get(at);return void 0===ot&&(ot=new WebGLShaderStage(at),st.set(at,ot)),ot}}class WebGLShaderStage{constructor(at){this.id=hd++,this.code=at,this.usedTimes=0}}function WebGLPrograms(at,st,ot,Hl,rc,oc,_c){const wc=new ut.zgK,Sc=new WebGLShaderCache,iu=new Set,su=[],lu=rc.logarithmicDepthBuffer,cu=rc.vertexTextures;let uu=rc.precision;const pu={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distanceRGBA",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"toon",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",MeshMatcapMaterial:"matcap",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points",ShadowMaterial:"shadow",SpriteMaterial:"sprite"};function getChannel(at){return iu.add(at),0===at?"uv":`uv${at}`}return{getParameters:function(oc,wc,su,mu,gu){const Au=mu.fog,yu=gu.geometry,_u=oc.isMeshStandardMaterial?mu.environment:null,xu=(oc.isMeshStandardMaterial?ot:st).get(oc.envMap||_u),Su=xu&&xu.mapping===ut.Om?xu.image.height:null,Du=pu[oc.type];null!==oc.precision&&(uu=rc.getMaxPrecision(oc.precision),uu!==oc.precision&&console.warn("THREE.WebGLProgram.getParameters:",oc.precision,"not supported, using",uu,"instead."));const Lu=yu.morphAttributes.position||yu.morphAttributes.normal||yu.morphAttributes.color,$u=void 0!==Lu?Lu.length:0;let hh,ed,td,id,nd=0;if(void 0!==yu.morphAttributes.position&&(nd=1),void 0!==yu.morphAttributes.normal&&(nd=2),void 0!==yu.morphAttributes.color&&(nd=3),Du){const at=sc[Du];hh=at.vertexShader,ed=at.fragmentShader}else hh=oc.vertexShader,ed=oc.fragmentShader,Sc.update(oc),td=Sc.getVertexShaderID(oc),id=Sc.getFragmentShaderID(oc);const rd=at.getRenderTarget(),ad=at.state.buffers.depth.getReversed(),sd=!0===gu.isInstancedMesh,od=!0===gu.isBatchedMesh,ld=!!oc.map,cd=!!oc.matcap,ud=!!xu,hd=!!oc.aoMap,dd=!!oc.lightMap,pd=!!oc.bumpMap,md=!!oc.normalMap,fd=!!oc.displacementMap,gd=!!oc.emissiveMap,Ad=!!oc.metalnessMap,yd=!!oc.roughnessMap,vd=oc.anisotropy>0,_d=oc.clearcoat>0,xd=oc.dispersion>0,bd=oc.iridescence>0,wd=oc.sheen>0,Ed=oc.transmission>0,Md=vd&&!!oc.anisotropyMap,Sd=_d&&!!oc.clearcoatMap,Td=_d&&!!oc.clearcoatNormalMap,Cd=_d&&!!oc.clearcoatRoughnessMap,kd=bd&&!!oc.iridescenceMap,Id=bd&&!!oc.iridescenceThicknessMap,Dd=wd&&!!oc.sheenColorMap,Ld=wd&&!!oc.sheenRoughnessMap,Pd=!!oc.specularMap,zd=!!oc.specularColorMap,Nd=!!oc.specularIntensityMap,Rd=Ed&&!!oc.transmissionMap,Od=Ed&&!!oc.thicknessMap,Bd=!!oc.gradientMap,Fd=!!oc.alphaMap,jd=oc.alphaTest>0,Ud=!!oc.alphaHash,Vd=!!oc.extensions;let Gd=ut.y_p;oc.toneMapped&&(null!==rd&&!0!==rd.isXRRenderTarget||(Gd=at.toneMapping));const Zd={shaderID:Du,shaderType:oc.type,shaderName:oc.name,vertexShader:hh,fragmentShader:ed,defines:oc.defines,customVertexShaderID:td,customFragmentShaderID:id,isRawShaderMaterial:!0===oc.isRawShaderMaterial,glslVersion:oc.glslVersion,precision:uu,batching:od,batchingColor:od&&null!==gu._colorsTexture,instancing:sd,instancingColor:sd&&null!==gu.instanceColor,instancingMorph:sd&&null!==gu.morphTexture,supportsVertexTextures:cu,outputColorSpace:null===rd?at.outputColorSpace:!0===rd.isXRRenderTarget?rd.texture.colorSpace:ut.Zr2,alphaToCoverage:!!oc.alphaToCoverage,map:ld,matcap:cd,envMap:ud,envMapMode:ud&&xu.mapping,envMapCubeUVHeight:Su,aoMap:hd,lightMap:dd,bumpMap:pd,normalMap:md,displacementMap:cu&&fd,emissiveMap:gd,normalMapObjectSpace:md&&oc.normalMapType===ut.vyJ,normalMapTangentSpace:md&&oc.normalMapType===ut.bI3,metalnessMap:Ad,roughnessMap:yd,anisotropy:vd,anisotropyMap:Md,clearcoat:_d,clearcoatMap:Sd,clearcoatNormalMap:Td,clearcoatRoughnessMap:Cd,dispersion:xd,iridescence:bd,iridescenceMap:kd,iridescenceThicknessMap:Id,sheen:wd,sheenColorMap:Dd,sheenRoughnessMap:Ld,specularMap:Pd,specularColorMap:zd,specularIntensityMap:Nd,transmission:Ed,transmissionMap:Rd,thicknessMap:Od,gradientMap:Bd,opaque:!1===oc.transparent&&oc.blending===ut.NTi&&!1===oc.alphaToCoverage,alphaMap:Fd,alphaTest:jd,alphaHash:Ud,combine:oc.combine,mapUv:ld&&getChannel(oc.map.channel),aoMapUv:hd&&getChannel(oc.aoMap.channel),lightMapUv:dd&&getChannel(oc.lightMap.channel),bumpMapUv:pd&&getChannel(oc.bumpMap.channel),normalMapUv:md&&getChannel(oc.normalMap.channel),displacementMapUv:fd&&getChannel(oc.displacementMap.channel),emissiveMapUv:gd&&getChannel(oc.emissiveMap.channel),metalnessMapUv:Ad&&getChannel(oc.metalnessMap.channel),roughnessMapUv:yd&&getChannel(oc.roughnessMap.channel),anisotropyMapUv:Md&&getChannel(oc.anisotropyMap.channel),clearcoatMapUv:Sd&&getChannel(oc.clearcoatMap.channel),clearcoatNormalMapUv:Td&&getChannel(oc.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:Cd&&getChannel(oc.clearcoatRoughnessMap.channel),iridescenceMapUv:kd&&getChannel(oc.iridescenceMap.channel),iridescenceThicknessMapUv:Id&&getChannel(oc.iridescenceThicknessMap.channel),sheenColorMapUv:Dd&&getChannel(oc.sheenColorMap.channel),sheenRoughnessMapUv:Ld&&getChannel(oc.sheenRoughnessMap.channel),specularMapUv:Pd&&getChannel(oc.specularMap.channel),specularColorMapUv:zd&&getChannel(oc.specularColorMap.channel),specularIntensityMapUv:Nd&&getChannel(oc.specularIntensityMap.channel),transmissionMapUv:Rd&&getChannel(oc.transmissionMap.channel),thicknessMapUv:Od&&getChannel(oc.thicknessMap.channel),alphaMapUv:Fd&&getChannel(oc.alphaMap.channel),vertexTangents:!!yu.attributes.tangent&&(md||vd),vertexColors:oc.vertexColors,vertexAlphas:!0===oc.vertexColors&&!!yu.attributes.color&&4===yu.attributes.color.itemSize,pointsUvs:!0===gu.isPoints&&!!yu.attributes.uv&&(ld||Fd),fog:!!Au,useFog:!0===oc.fog,fogExp2:!!Au&&Au.isFogExp2,flatShading:!0===oc.flatShading,sizeAttenuation:!0===oc.sizeAttenuation,logarithmicDepthBuffer:lu,reverseDepthBuffer:ad,skinning:!0===gu.isSkinnedMesh,morphTargets:void 0!==yu.morphAttributes.position,morphNormals:void 0!==yu.morphAttributes.normal,morphColors:void 0!==yu.morphAttributes.color,morphTargetsCount:$u,morphTextureStride:nd,numDirLights:wc.directional.length,numPointLights:wc.point.length,numSpotLights:wc.spot.length,numSpotLightMaps:wc.spotLightMap.length,numRectAreaLights:wc.rectArea.length,numHemiLights:wc.hemi.length,numDirLightShadows:wc.directionalShadowMap.length,numPointLightShadows:wc.pointShadowMap.length,numSpotLightShadows:wc.spotShadowMap.length,numSpotLightShadowsWithMaps:wc.numSpotLightShadowsWithMaps,numLightProbes:wc.numLightProbes,numClippingPlanes:_c.numPlanes,numClipIntersection:_c.numIntersection,dithering:oc.dithering,shadowMapEnabled:at.shadowMap.enabled&&su.length>0,shadowMapType:at.shadowMap.type,toneMapping:Gd,decodeVideoTexture:ld&&!0===oc.map.isVideoTexture&&ut.ppV.getTransfer(oc.map.colorSpace)===ut.KLL,decodeVideoTextureEmissive:gd&&!0===oc.emissiveMap.isVideoTexture&&ut.ppV.getTransfer(oc.emissiveMap.colorSpace)===ut.KLL,premultipliedAlpha:oc.premultipliedAlpha,doubleSided:oc.side===ut.$EB,flipSided:oc.side===ut.hsX,useDepthPacking:oc.depthPacking>=0,depthPacking:oc.depthPacking||0,index0AttributeName:oc.index0AttributeName,extensionClipCullDistance:Vd&&!0===oc.extensions.clipCullDistance&&Hl.has("WEBGL_clip_cull_distance"),extensionMultiDraw:(Vd&&!0===oc.extensions.multiDraw||od)&&Hl.has("WEBGL_multi_draw"),rendererExtensionParallelShaderCompile:Hl.has("KHR_parallel_shader_compile"),customProgramCacheKey:oc.customProgramCacheKey()};return Zd.vertexUv1s=iu.has(1),Zd.vertexUv2s=iu.has(2),Zd.vertexUv3s=iu.has(3),iu.clear(),Zd},getProgramCacheKey:function(st){const ot=[];if(st.shaderID?ot.push(st.shaderID):(ot.push(st.customVertexShaderID),ot.push(st.customFragmentShaderID)),void 0!==st.defines)for(const at in st.defines)ot.push(at),ot.push(st.defines[at]);return!1===st.isRawShaderMaterial&&(!function(at,st){at.push(st.precision),at.push(st.outputColorSpace),at.push(st.envMapMode),at.push(st.envMapCubeUVHeight),at.push(st.mapUv),at.push(st.alphaMapUv),at.push(st.lightMapUv),at.push(st.aoMapUv),at.push(st.bumpMapUv),at.push(st.normalMapUv),at.push(st.displacementMapUv),at.push(st.emissiveMapUv),at.push(st.metalnessMapUv),at.push(st.roughnessMapUv),at.push(st.anisotropyMapUv),at.push(st.clearcoatMapUv),at.push(st.clearcoatNormalMapUv),at.push(st.clearcoatRoughnessMapUv),at.push(st.iridescenceMapUv),at.push(st.iridescenceThicknessMapUv),at.push(st.sheenColorMapUv),at.push(st.sheenRoughnessMapUv),at.push(st.specularMapUv),at.push(st.specularColorMapUv),at.push(st.specularIntensityMapUv),at.push(st.transmissionMapUv),at.push(st.thicknessMapUv),at.push(st.combine),at.push(st.fogExp2),at.push(st.sizeAttenuation),at.push(st.morphTargetsCount),at.push(st.morphAttributeCount),at.push(st.numDirLights),at.push(st.numPointLights),at.push(st.numSpotLights),at.push(st.numSpotLightMaps),at.push(st.numHemiLights),at.push(st.numRectAreaLights),at.push(st.numDirLightShadows),at.push(st.numPointLightShadows),at.push(st.numSpotLightShadows),at.push(st.numSpotLightShadowsWithMaps),at.push(st.numLightProbes),at.push(st.shadowMapType),at.push(st.toneMapping),at.push(st.numClippingPlanes),at.push(st.numClipIntersection),at.push(st.depthPacking)}(ot,st),function(at,st){wc.disableAll(),st.supportsVertexTextures&&wc.enable(0);st.instancing&&wc.enable(1);st.instancingColor&&wc.enable(2);st.instancingMorph&&wc.enable(3);st.matcap&&wc.enable(4);st.envMap&&wc.enable(5);st.normalMapObjectSpace&&wc.enable(6);st.normalMapTangentSpace&&wc.enable(7);st.clearcoat&&wc.enable(8);st.iridescence&&wc.enable(9);st.alphaTest&&wc.enable(10);st.vertexColors&&wc.enable(11);st.vertexAlphas&&wc.enable(12);st.vertexUv1s&&wc.enable(13);st.vertexUv2s&&wc.enable(14);st.vertexUv3s&&wc.enable(15);st.vertexTangents&&wc.enable(16);st.anisotropy&&wc.enable(17);st.alphaHash&&wc.enable(18);st.batching&&wc.enable(19);st.dispersion&&wc.enable(20);st.batchingColor&&wc.enable(21);at.push(wc.mask),wc.disableAll(),st.fog&&wc.enable(0);st.useFog&&wc.enable(1);st.flatShading&&wc.enable(2);st.logarithmicDepthBuffer&&wc.enable(3);st.reverseDepthBuffer&&wc.enable(4);st.skinning&&wc.enable(5);st.morphTargets&&wc.enable(6);st.morphNormals&&wc.enable(7);st.morphColors&&wc.enable(8);st.premultipliedAlpha&&wc.enable(9);st.shadowMapEnabled&&wc.enable(10);st.doubleSided&&wc.enable(11);st.flipSided&&wc.enable(12);st.useDepthPacking&&wc.enable(13);st.dithering&&wc.enable(14);st.transmission&&wc.enable(15);st.sheen&&wc.enable(16);st.opaque&&wc.enable(17);st.pointsUvs&&wc.enable(18);st.decodeVideoTexture&&wc.enable(19);st.decodeVideoTextureEmissive&&wc.enable(20);st.alphaToCoverage&&wc.enable(21);at.push(wc.mask)}(ot,st),ot.push(at.outputColorSpace)),ot.push(st.customProgramCacheKey),ot.join()},getUniforms:function(at){const st=pu[at.type];let ot;if(st){const at=sc[st];ot=ut.LlO.clone(at.uniforms)}else ot=at.uniforms;return ot},acquireProgram:function(st,ot){let ut;for(let at=0,Hl=su.length;at<Hl;at++){const st=su[at];if(st.cacheKey===ot){ut=st,++ut.usedTimes;break}}return void 0===ut&&(ut=new WebGLProgram(at,ot,st,oc),su.push(ut)),ut},releaseProgram:function(at){if(0===--at.usedTimes){const st=su.indexOf(at);su[st]=su[su.length-1],su.pop(),at.destroy()}},releaseShaderCache:function(at){Sc.remove(at)},programs:su,dispose:function(){Sc.dispose()}}}function WebGLProperties(){let at=new WeakMap;return{has:function(st){return at.has(st)},get:function(st){let ot=at.get(st);return void 0===ot&&(ot={},at.set(st,ot)),ot},remove:function(st){at.delete(st)},update:function(st,ot,ut){at.get(st)[ot]=ut},dispose:function(){at=new WeakMap}}}function painterSortStable(at,st){return at.groupOrder!==st.groupOrder?at.groupOrder-st.groupOrder:at.renderOrder!==st.renderOrder?at.renderOrder-st.renderOrder:at.material.id!==st.material.id?at.material.id-st.material.id:at.z!==st.z?at.z-st.z:at.id-st.id}function reversePainterSortStable(at,st){return at.groupOrder!==st.groupOrder?at.groupOrder-st.groupOrder:at.renderOrder!==st.renderOrder?at.renderOrder-st.renderOrder:at.z!==st.z?st.z-at.z:at.id-st.id}function WebGLRenderList(){const at=[];let st=0;const ot=[],ut=[],Hl=[];function getNextRenderItem(ot,ut,Hl,rc,sc,oc){let _c=at[st];return void 0===_c?(_c={id:ot.id,object:ot,geometry:ut,material:Hl,groupOrder:rc,renderOrder:ot.renderOrder,z:sc,group:oc},at[st]=_c):(_c.id=ot.id,_c.object=ot,_c.geometry=ut,_c.material=Hl,_c.groupOrder=rc,_c.renderOrder=ot.renderOrder,_c.z=sc,_c.group=oc),st++,_c}return{opaque:ot,transmissive:ut,transparent:Hl,init:function(){st=0,ot.length=0,ut.length=0,Hl.length=0},push:function(at,st,rc,sc,oc,_c){const wc=getNextRenderItem(at,st,rc,sc,oc,_c);rc.transmission>0?ut.push(wc):!0===rc.transparent?Hl.push(wc):ot.push(wc)},unshift:function(at,st,rc,sc,oc,_c){const wc=getNextRenderItem(at,st,rc,sc,oc,_c);rc.transmission>0?ut.unshift(wc):!0===rc.transparent?Hl.unshift(wc):ot.unshift(wc)},finish:function(){for(let ot=st,ut=at.length;ot<ut;ot++){const st=at[ot];if(null===st.id)break;st.id=null,st.object=null,st.geometry=null,st.material=null,st.group=null}},sort:function(at,st){ot.length>1&&ot.sort(at||painterSortStable),ut.length>1&&ut.sort(st||reversePainterSortStable),Hl.length>1&&Hl.sort(st||reversePainterSortStable)}}}function WebGLRenderLists(){let at=new WeakMap;return{get:function(st,ot){const ut=at.get(st);let Hl;return void 0===ut?(Hl=new WebGLRenderList,at.set(st,[Hl])):ot>=ut.length?(Hl=new WebGLRenderList,ut.push(Hl)):Hl=ut[ot],Hl},dispose:function(){at=new WeakMap}}}function UniformsCache(){const at={};return{get:function(st){if(void 0!==at[st.id])return at[st.id];let ot;switch(st.type){case"DirectionalLight":ot={direction:new ut.Pq0,color:new ut.Q1f};break;case"SpotLight":ot={position:new ut.Pq0,direction:new ut.Pq0,color:new ut.Q1f,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":ot={position:new ut.Pq0,color:new ut.Q1f,distance:0,decay:0};break;case"HemisphereLight":ot={direction:new ut.Pq0,skyColor:new ut.Q1f,groundColor:new ut.Q1f};break;case"RectAreaLight":ot={color:new ut.Q1f,position:new ut.Pq0,halfWidth:new ut.Pq0,halfHeight:new ut.Pq0}}return at[st.id]=ot,ot}}}let dd=0;function shadowCastingAndTexturingLightsFirst(at,st){return(st.castShadow?2:0)-(at.castShadow?2:0)+(st.map?1:0)-(at.map?1:0)}function WebGLLights(at){const st=new UniformsCache,ot=function(){const at={};return{get:function(st){if(void 0!==at[st.id])return at[st.id];let ot;switch(st.type){case"DirectionalLight":case"SpotLight":ot={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new ut.I9Y};break;case"PointLight":ot={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new ut.I9Y,shadowCameraNear:1,shadowCameraFar:1e3}}return at[st.id]=ot,ot}}}(),Hl={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1,numSpotMaps:-1,numLightProbes:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotLightMap:[],spotShadow:[],spotShadowMap:[],spotLightMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],numSpotLightShadowsWithMaps:0,numLightProbes:0};for(let rc=0;rc<9;rc++)Hl.probe.push(new ut.Pq0);const sc=new ut.Pq0,oc=new ut.kn4,_c=new ut.kn4;return{setup:function(ut){let sc=0,oc=0,_c=0;for(let at=0;at<9;at++)Hl.probe[at].set(0,0,0);let wc=0,Sc=0,iu=0,su=0,lu=0,cu=0,uu=0,pu=0,mu=0,gu=0,Au=0;ut.sort(shadowCastingAndTexturingLightsFirst);for(let at=0,rc=ut.length;at<rc;at++){const rc=ut[at],yu=rc.color,_u=rc.intensity,xu=rc.distance,Su=rc.shadow&&rc.shadow.map?rc.shadow.map.texture:null;if(rc.isAmbientLight)sc+=yu.r*_u,oc+=yu.g*_u,_c+=yu.b*_u;else if(rc.isLightProbe){for(let at=0;at<9;at++)Hl.probe[at].addScaledVector(rc.sh.coefficients[at],_u);Au++}else if(rc.isDirectionalLight){const at=st.get(rc);if(at.color.copy(rc.color).multiplyScalar(rc.intensity),rc.castShadow){const at=rc.shadow,st=ot.get(rc);st.shadowIntensity=at.intensity,st.shadowBias=at.bias,st.shadowNormalBias=at.normalBias,st.shadowRadius=at.radius,st.shadowMapSize=at.mapSize,Hl.directionalShadow[wc]=st,Hl.directionalShadowMap[wc]=Su,Hl.directionalShadowMatrix[wc]=rc.shadow.matrix,cu++}Hl.directional[wc]=at,wc++}else if(rc.isSpotLight){const at=st.get(rc);at.position.setFromMatrixPosition(rc.matrixWorld),at.color.copy(yu).multiplyScalar(_u),at.distance=xu,at.coneCos=Math.cos(rc.angle),at.penumbraCos=Math.cos(rc.angle*(1-rc.penumbra)),at.decay=rc.decay,Hl.spot[iu]=at;const ut=rc.shadow;if(rc.map&&(Hl.spotLightMap[mu]=rc.map,mu++,ut.updateMatrices(rc),rc.castShadow&&gu++),Hl.spotLightMatrix[iu]=ut.matrix,rc.castShadow){const at=ot.get(rc);at.shadowIntensity=ut.intensity,at.shadowBias=ut.bias,at.shadowNormalBias=ut.normalBias,at.shadowRadius=ut.radius,at.shadowMapSize=ut.mapSize,Hl.spotShadow[iu]=at,Hl.spotShadowMap[iu]=Su,pu++}iu++}else if(rc.isRectAreaLight){const at=st.get(rc);at.color.copy(yu).multiplyScalar(_u),at.halfWidth.set(.5*rc.width,0,0),at.halfHeight.set(0,.5*rc.height,0),Hl.rectArea[su]=at,su++}else if(rc.isPointLight){const at=st.get(rc);if(at.color.copy(rc.color).multiplyScalar(rc.intensity),at.distance=rc.distance,at.decay=rc.decay,rc.castShadow){const at=rc.shadow,st=ot.get(rc);st.shadowIntensity=at.intensity,st.shadowBias=at.bias,st.shadowNormalBias=at.normalBias,st.shadowRadius=at.radius,st.shadowMapSize=at.mapSize,st.shadowCameraNear=at.camera.near,st.shadowCameraFar=at.camera.far,Hl.pointShadow[Sc]=st,Hl.pointShadowMap[Sc]=Su,Hl.pointShadowMatrix[Sc]=rc.shadow.matrix,uu++}Hl.point[Sc]=at,Sc++}else if(rc.isHemisphereLight){const at=st.get(rc);at.skyColor.copy(rc.color).multiplyScalar(_u),at.groundColor.copy(rc.groundColor).multiplyScalar(_u),Hl.hemi[lu]=at,lu++}}su>0&&(!0===at.has("OES_texture_float_linear")?(Hl.rectAreaLTC1=rc.LTC_FLOAT_1,Hl.rectAreaLTC2=rc.LTC_FLOAT_2):(Hl.rectAreaLTC1=rc.LTC_HALF_1,Hl.rectAreaLTC2=rc.LTC_HALF_2)),Hl.ambient[0]=sc,Hl.ambient[1]=oc,Hl.ambient[2]=_c;const yu=Hl.hash;yu.directionalLength===wc&&yu.pointLength===Sc&&yu.spotLength===iu&&yu.rectAreaLength===su&&yu.hemiLength===lu&&yu.numDirectionalShadows===cu&&yu.numPointShadows===uu&&yu.numSpotShadows===pu&&yu.numSpotMaps===mu&&yu.numLightProbes===Au||(Hl.directional.length=wc,Hl.spot.length=iu,Hl.rectArea.length=su,Hl.point.length=Sc,Hl.hemi.length=lu,Hl.directionalShadow.length=cu,Hl.directionalShadowMap.length=cu,Hl.pointShadow.length=uu,Hl.pointShadowMap.length=uu,Hl.spotShadow.length=pu,Hl.spotShadowMap.length=pu,Hl.directionalShadowMatrix.length=cu,Hl.pointShadowMatrix.length=uu,Hl.spotLightMatrix.length=pu+mu-gu,Hl.spotLightMap.length=mu,Hl.numSpotLightShadowsWithMaps=gu,Hl.numLightProbes=Au,yu.directionalLength=wc,yu.pointLength=Sc,yu.spotLength=iu,yu.rectAreaLength=su,yu.hemiLength=lu,yu.numDirectionalShadows=cu,yu.numPointShadows=uu,yu.numSpotShadows=pu,yu.numSpotMaps=mu,yu.numLightProbes=Au,Hl.version=dd++)},setupView:function(at,st){let ot=0,ut=0,rc=0,wc=0,Sc=0;const iu=st.matrixWorldInverse;for(let su=0,lu=at.length;su<lu;su++){const st=at[su];if(st.isDirectionalLight){const at=Hl.directional[ot];at.direction.setFromMatrixPosition(st.matrixWorld),sc.setFromMatrixPosition(st.target.matrixWorld),at.direction.sub(sc),at.direction.transformDirection(iu),ot++}else if(st.isSpotLight){const at=Hl.spot[rc];at.position.setFromMatrixPosition(st.matrixWorld),at.position.applyMatrix4(iu),at.direction.setFromMatrixPosition(st.matrixWorld),sc.setFromMatrixPosition(st.target.matrixWorld),at.direction.sub(sc),at.direction.transformDirection(iu),rc++}else if(st.isRectAreaLight){const at=Hl.rectArea[wc];at.position.setFromMatrixPosition(st.matrixWorld),at.position.applyMatrix4(iu),_c.identity(),oc.copy(st.matrixWorld),oc.premultiply(iu),_c.extractRotation(oc),at.halfWidth.set(.5*st.width,0,0),at.halfHeight.set(0,.5*st.height,0),at.halfWidth.applyMatrix4(_c),at.halfHeight.applyMatrix4(_c),wc++}else if(st.isPointLight){const at=Hl.point[ut];at.position.setFromMatrixPosition(st.matrixWorld),at.position.applyMatrix4(iu),ut++}else if(st.isHemisphereLight){const at=Hl.hemi[Sc];at.direction.setFromMatrixPosition(st.matrixWorld),at.direction.transformDirection(iu),Sc++}}},state:Hl}}function WebGLRenderState(at){const st=new WebGLLights(at),ot=[],ut=[];const Hl={lightsArray:ot,shadowsArray:ut,camera:null,lights:st,transmissionRenderTarget:{}};return{init:function(at){Hl.camera=at,ot.length=0,ut.length=0},state:Hl,setupLights:function(){st.setup(ot)},setupLightsView:function(at){st.setupView(ot,at)},pushLight:function(at){ot.push(at)},pushShadow:function(at){ut.push(at)}}}function WebGLRenderStates(at){let st=new WeakMap;return{get:function(ot,ut){void 0===ut&&(ut=0);const Hl=st.get(ot);let rc;return void 0===Hl?(rc=new WebGLRenderState(at),st.set(ot,[rc])):ut>=Hl.length?(rc=new WebGLRenderState(at),Hl.push(rc)):rc=Hl[ut],rc},dispose:function(){st=new WeakMap}}}function WebGLShadowMap(at,st,ot){let Hl=new ut.PPD;const rc=new ut.I9Y,sc=new ut.I9Y,oc=new ut.IUQ,_c=new ut.CSG({depthPacking:ut.N5j}),wc=new ut.aVO,Sc={},iu=ot.maxTextureSize,su={[ut.hB5]:ut.hsX,[ut.hsX]:ut.hB5,[ut.$EB]:ut.$EB},lu=new ut.BKk({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new ut.I9Y},radius:{value:4}},vertexShader:"void main() {\n\tgl_Position = vec4( position, 1.0 );\n}",fragmentShader:"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}"}),cu=lu.clone();cu.defines.HORIZONTAL_PASS=1;const uu=new ut.LoY;uu.setAttribute("position",new ut.THS(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const pu=new ut.eaF(uu,lu),mu=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=ut.QP0;let gu=this.type;function VSMPass(ot,Hl){const sc=st.update(pu);lu.defines.VSM_SAMPLES!==ot.blurSamples&&(lu.defines.VSM_SAMPLES=ot.blurSamples,cu.defines.VSM_SAMPLES=ot.blurSamples,lu.needsUpdate=!0,cu.needsUpdate=!0),null===ot.mapPass&&(ot.mapPass=new ut.nWS(rc.x,rc.y)),lu.uniforms.shadow_pass.value=ot.map.texture,lu.uniforms.resolution.value=ot.mapSize,lu.uniforms.radius.value=ot.radius,at.setRenderTarget(ot.mapPass),at.clear(),at.renderBufferDirect(Hl,null,sc,lu,pu,null),cu.uniforms.shadow_pass.value=ot.mapPass.texture,cu.uniforms.resolution.value=ot.mapSize,cu.uniforms.radius.value=ot.radius,at.setRenderTarget(ot.map),at.clear(),at.renderBufferDirect(Hl,null,sc,cu,pu,null)}function getDepthMaterial(st,ot,Hl,rc){let sc=null;const oc=!0===Hl.isPointLight?st.customDistanceMaterial:st.customDepthMaterial;if(void 0!==oc)sc=oc;else if(sc=!0===Hl.isPointLight?wc:_c,at.localClippingEnabled&&!0===ot.clipShadows&&Array.isArray(ot.clippingPlanes)&&0!==ot.clippingPlanes.length||ot.displacementMap&&0!==ot.displacementScale||ot.alphaMap&&ot.alphaTest>0||ot.map&&ot.alphaTest>0){const at=sc.uuid,st=ot.uuid;let ut=Sc[at];void 0===ut&&(ut={},Sc[at]=ut);let Hl=ut[st];void 0===Hl&&(Hl=sc.clone(),ut[st]=Hl,ot.addEventListener("dispose",onMaterialDispose)),sc=Hl}if(sc.visible=ot.visible,sc.wireframe=ot.wireframe,rc===ut.RyA?sc.side=null!==ot.shadowSide?ot.shadowSide:ot.side:sc.side=null!==ot.shadowSide?ot.shadowSide:su[ot.side],sc.alphaMap=ot.alphaMap,sc.alphaTest=ot.alphaTest,sc.map=ot.map,sc.clipShadows=ot.clipShadows,sc.clippingPlanes=ot.clippingPlanes,sc.clipIntersection=ot.clipIntersection,sc.displacementMap=ot.displacementMap,sc.displacementScale=ot.displacementScale,sc.displacementBias=ot.displacementBias,sc.wireframeLinewidth=ot.wireframeLinewidth,sc.linewidth=ot.linewidth,!0===Hl.isPointLight&&!0===sc.isMeshDistanceMaterial){at.properties.get(sc).light=Hl}return sc}function renderObject(ot,rc,sc,oc,_c){if(!1===ot.visible)return;if(ot.layers.test(rc.layers)&&(ot.isMesh||ot.isLine||ot.isPoints)&&(ot.castShadow||ot.receiveShadow&&_c===ut.RyA)&&(!ot.frustumCulled||Hl.intersectsObject(ot))){ot.modelViewMatrix.multiplyMatrices(sc.matrixWorldInverse,ot.matrixWorld);const ut=st.update(ot),Hl=ot.material;if(Array.isArray(Hl)){const st=ut.groups;for(let wc=0,Sc=st.length;wc<Sc;wc++){const Sc=st[wc],iu=Hl[Sc.materialIndex];if(iu&&iu.visible){const st=getDepthMaterial(ot,iu,oc,_c);ot.onBeforeShadow(at,ot,rc,sc,ut,st,Sc),at.renderBufferDirect(sc,null,ut,st,ot,Sc),ot.onAfterShadow(at,ot,rc,sc,ut,st,Sc)}}}else if(Hl.visible){const st=getDepthMaterial(ot,Hl,oc,_c);ot.onBeforeShadow(at,ot,rc,sc,ut,st,null),at.renderBufferDirect(sc,null,ut,st,ot,null),ot.onAfterShadow(at,ot,rc,sc,ut,st,null)}}const wc=ot.children;for(let at=0,st=wc.length;at<st;at++)renderObject(wc[at],rc,sc,oc,_c)}function onMaterialDispose(at){at.target.removeEventListener("dispose",onMaterialDispose);for(const st in Sc){const ot=Sc[st],ut=at.target.uuid;if(ut in ot){ot[ut].dispose(),delete ot[ut]}}}this.render=function(st,ot,_c){if(!1===mu.enabled)return;if(!1===mu.autoUpdate&&!1===mu.needsUpdate)return;if(0===st.length)return;const wc=at.getRenderTarget(),Sc=at.getActiveCubeFace(),su=at.getActiveMipmapLevel(),lu=at.state;lu.setBlending(ut.XIg),lu.buffers.color.setClear(1,1,1,1),lu.buffers.depth.setTest(!0),lu.setScissorTest(!1);const cu=gu!==ut.RyA&&this.type===ut.RyA,uu=gu===ut.RyA&&this.type!==ut.RyA;for(let pu=0,mu=st.length;pu<mu;pu++){const wc=st[pu],Sc=wc.shadow;if(void 0===Sc){console.warn("THREE.WebGLShadowMap:",wc,"has no shadow.");continue}if(!1===Sc.autoUpdate&&!1===Sc.needsUpdate)continue;rc.copy(Sc.mapSize);const su=Sc.getFrameExtents();if(rc.multiply(su),sc.copy(Sc.mapSize),(rc.x>iu||rc.y>iu)&&(rc.x>iu&&(sc.x=Math.floor(iu/su.x),rc.x=sc.x*su.x,Sc.mapSize.x=sc.x),rc.y>iu&&(sc.y=Math.floor(iu/su.y),rc.y=sc.y*su.y,Sc.mapSize.y=sc.y)),null===Sc.map||!0===cu||!0===uu){const at=this.type!==ut.RyA?{minFilter:ut.hxR,magFilter:ut.hxR}:{};null!==Sc.map&&Sc.map.dispose(),Sc.map=new ut.nWS(rc.x,rc.y,at),Sc.map.texture.name=wc.name+".shadowMap",Sc.camera.updateProjectionMatrix()}at.setRenderTarget(Sc.map),at.clear();const mu=Sc.getViewportCount();for(let at=0;at<mu;at++){const st=Sc.getViewport(at);oc.set(sc.x*st.x,sc.y*st.y,sc.x*st.z,sc.y*st.w),lu.viewport(oc),Sc.updateMatrices(wc,at),Hl=Sc.getFrustum(),renderObject(ot,_c,Sc.camera,wc,this.type)}!0!==Sc.isPointLightShadow&&this.type===ut.RyA&&VSMPass(Sc,_c),Sc.needsUpdate=!1}gu=this.type,mu.needsUpdate=!1,at.setRenderTarget(wc,Sc,su)}}const pd={[ut.eHc]:ut.lGu,[ut.brA]:ut.K52,[ut.U3G]:ut.bw0,[ut.xSv]:ut.Gwm,[ut.lGu]:ut.eHc,[ut.K52]:ut.brA,[ut.bw0]:ut.U3G,[ut.Gwm]:ut.xSv};function WebGLState(at,st){const ot=new function(){let st=!1;const ot=new ut.IUQ;let Hl=null;const rc=new ut.IUQ(0,0,0,0);return{setMask:function(ot){Hl===ot||st||(at.colorMask(ot,ot,ot,ot),Hl=ot)},setLocked:function(at){st=at},setClear:function(st,ut,Hl,sc,oc){!0===oc&&(st*=sc,ut*=sc,Hl*=sc),ot.set(st,ut,Hl,sc),!1===rc.equals(ot)&&(at.clearColor(st,ut,Hl,sc),rc.copy(ot))},reset:function(){st=!1,Hl=null,rc.set(-1,0,0,0)}}},Hl=new function(){let ot=!1,Hl=!1,rc=null,sc=null,oc=null;return{setReversed:function(at){if(Hl!==at){const ot=st.get("EXT_clip_control");at?ot.clipControlEXT(ot.LOWER_LEFT_EXT,ot.ZERO_TO_ONE_EXT):ot.clipControlEXT(ot.LOWER_LEFT_EXT,ot.NEGATIVE_ONE_TO_ONE_EXT),Hl=at;const ut=oc;oc=null,this.setClear(ut)}},getReversed:function(){return Hl},setTest:function(st){st?enable(at.DEPTH_TEST):disable(at.DEPTH_TEST)},setMask:function(st){rc===st||ot||(at.depthMask(st),rc=st)},setFunc:function(st){if(Hl&&(st=pd[st]),sc!==st){switch(st){case ut.eHc:at.depthFunc(at.NEVER);break;case ut.lGu:at.depthFunc(at.ALWAYS);break;case ut.brA:at.depthFunc(at.LESS);break;case ut.xSv:at.depthFunc(at.LEQUAL);break;case ut.U3G:at.depthFunc(at.EQUAL);break;case ut.Gwm:at.depthFunc(at.GEQUAL);break;case ut.K52:at.depthFunc(at.GREATER);break;case ut.bw0:at.depthFunc(at.NOTEQUAL);break;default:at.depthFunc(at.LEQUAL)}sc=st}},setLocked:function(at){ot=at},setClear:function(st){oc!==st&&(Hl&&(st=1-st),at.clearDepth(st),oc=st)},reset:function(){ot=!1,rc=null,sc=null,oc=null,Hl=!1}}},rc=new function(){let st=!1,ot=null,ut=null,Hl=null,rc=null,sc=null,oc=null,_c=null,wc=null;return{setTest:function(ot){st||(ot?enable(at.STENCIL_TEST):disable(at.STENCIL_TEST))},setMask:function(ut){ot===ut||st||(at.stencilMask(ut),ot=ut)},setFunc:function(st,ot,sc){ut===st&&Hl===ot&&rc===sc||(at.stencilFunc(st,ot,sc),ut=st,Hl=ot,rc=sc)},setOp:function(st,ot,ut){sc===st&&oc===ot&&_c===ut||(at.stencilOp(st,ot,ut),sc=st,oc=ot,_c=ut)},setLocked:function(at){st=at},setClear:function(st){wc!==st&&(at.clearStencil(st),wc=st)},reset:function(){st=!1,ot=null,ut=null,Hl=null,rc=null,sc=null,oc=null,_c=null,wc=null}}},sc=new WeakMap,oc=new WeakMap;let _c={},wc={},Sc=new WeakMap,iu=[],su=null,lu=!1,cu=null,uu=null,pu=null,mu=null,gu=null,Au=null,yu=null,_u=new ut.Q1f(0,0,0),xu=0,Su=!1,Du=null,Lu=null,$u=null,hh=null,ed=null;const td=at.getParameter(at.MAX_COMBINED_TEXTURE_IMAGE_UNITS);let id=!1,nd=0;const rd=at.getParameter(at.VERSION);-1!==rd.indexOf("WebGL")?(nd=parseFloat(/^WebGL (\d)/.exec(rd)[1]),id=nd>=1):-1!==rd.indexOf("OpenGL ES")&&(nd=parseFloat(/^OpenGL ES (\d)/.exec(rd)[1]),id=nd>=2);let ad=null,sd={};const od=at.getParameter(at.SCISSOR_BOX),ld=at.getParameter(at.VIEWPORT),cd=(new ut.IUQ).fromArray(od),ud=(new ut.IUQ).fromArray(ld);function createTexture(st,ot,ut,Hl){const rc=new Uint8Array(4),sc=at.createTexture();at.bindTexture(st,sc),at.texParameteri(st,at.TEXTURE_MIN_FILTER,at.NEAREST),at.texParameteri(st,at.TEXTURE_MAG_FILTER,at.NEAREST);for(let oc=0;oc<ut;oc++)st===at.TEXTURE_3D||st===at.TEXTURE_2D_ARRAY?at.texImage3D(ot,0,at.RGBA,1,1,Hl,0,at.RGBA,at.UNSIGNED_BYTE,rc):at.texImage2D(ot+oc,0,at.RGBA,1,1,0,at.RGBA,at.UNSIGNED_BYTE,rc);return sc}const hd={};function enable(st){!0!==_c[st]&&(at.enable(st),_c[st]=!0)}function disable(st){!1!==_c[st]&&(at.disable(st),_c[st]=!1)}hd[at.TEXTURE_2D]=createTexture(at.TEXTURE_2D,at.TEXTURE_2D,1),hd[at.TEXTURE_CUBE_MAP]=createTexture(at.TEXTURE_CUBE_MAP,at.TEXTURE_CUBE_MAP_POSITIVE_X,6),hd[at.TEXTURE_2D_ARRAY]=createTexture(at.TEXTURE_2D_ARRAY,at.TEXTURE_2D_ARRAY,1,1),hd[at.TEXTURE_3D]=createTexture(at.TEXTURE_3D,at.TEXTURE_3D,1,1),ot.setClear(0,0,0,1),Hl.setClear(1),rc.setClear(0),enable(at.DEPTH_TEST),Hl.setFunc(ut.xSv),setFlipSided(!1),setCullFace(ut.Vb5),enable(at.CULL_FACE),setBlending(ut.XIg);const dd={[ut.gO9]:at.FUNC_ADD,[ut.FXf]:at.FUNC_SUBTRACT,[ut.nST]:at.FUNC_REVERSE_SUBTRACT};dd[ut.znC]=at.MIN,dd[ut.$ei]=at.MAX;const md={[ut.ojh]:at.ZERO,[ut.qad]:at.ONE,[ut.f4X]:at.SRC_COLOR,[ut.ie2]:at.SRC_ALPHA,[ut.hgQ]:at.SRC_ALPHA_SATURATE,[ut.wn6]:at.DST_COLOR,[ut.hdd]:at.DST_ALPHA,[ut.LiQ]:at.ONE_MINUS_SRC_COLOR,[ut.OuU]:at.ONE_MINUS_SRC_ALPHA,[ut.aEY]:at.ONE_MINUS_DST_COLOR,[ut.Nt7]:at.ONE_MINUS_DST_ALPHA,[ut.RrE]:at.CONSTANT_COLOR,[ut.$Yl]:at.ONE_MINUS_CONSTANT_COLOR,[ut.e0p]:at.CONSTANT_ALPHA,[ut.ov9]:at.ONE_MINUS_CONSTANT_ALPHA};function setBlending(st,ot,Hl,rc,sc,oc,_c,wc,Sc,iu){if(st!==ut.XIg){if(!1===lu&&(enable(at.BLEND),lu=!0),st===ut.bCz)sc=sc||ot,oc=oc||Hl,_c=_c||rc,ot===uu&&sc===gu||(at.blendEquationSeparate(dd[ot],dd[sc]),uu=ot,gu=sc),Hl===pu&&rc===mu&&oc===Au&&_c===yu||(at.blendFuncSeparate(md[Hl],md[rc],md[oc],md[_c]),pu=Hl,mu=rc,Au=oc,yu=_c),!1!==wc.equals(_u)&&Sc===xu||(at.blendColor(wc.r,wc.g,wc.b,Sc),_u.copy(wc),xu=Sc),cu=st,Su=!1;else if(st!==cu||iu!==Su){if(uu===ut.gO9&&gu===ut.gO9||(at.blendEquation(at.FUNC_ADD),uu=ut.gO9,gu=ut.gO9),iu)switch(st){case ut.NTi:at.blendFuncSeparate(at.ONE,at.ONE_MINUS_SRC_ALPHA,at.ONE,at.ONE_MINUS_SRC_ALPHA);break;case ut.EZo:at.blendFunc(at.ONE,at.ONE);break;case ut.Kwu:at.blendFuncSeparate(at.ZERO,at.ONE_MINUS_SRC_COLOR,at.ZERO,at.ONE);break;case ut.EdD:at.blendFuncSeparate(at.ZERO,at.SRC_COLOR,at.ZERO,at.SRC_ALPHA);break;default:console.error("THREE.WebGLState: Invalid blending: ",st)}else switch(st){case ut.NTi:at.blendFuncSeparate(at.SRC_ALPHA,at.ONE_MINUS_SRC_ALPHA,at.ONE,at.ONE_MINUS_SRC_ALPHA);break;case ut.EZo:at.blendFunc(at.SRC_ALPHA,at.ONE);break;case ut.Kwu:at.blendFuncSeparate(at.ZERO,at.ONE_MINUS_SRC_COLOR,at.ZERO,at.ONE);break;case ut.EdD:at.blendFunc(at.ZERO,at.SRC_COLOR);break;default:console.error("THREE.WebGLState: Invalid blending: ",st)}pu=null,mu=null,Au=null,yu=null,_u.set(0,0,0),xu=0,cu=st,Su=iu}}else!0===lu&&(disable(at.BLEND),lu=!1)}function setFlipSided(st){Du!==st&&(st?at.frontFace(at.CW):at.frontFace(at.CCW),Du=st)}function setCullFace(st){st!==ut.WNZ?(enable(at.CULL_FACE),st!==Lu&&(st===ut.Vb5?at.cullFace(at.BACK):st===ut.Jnc?at.cullFace(at.FRONT):at.cullFace(at.FRONT_AND_BACK))):disable(at.CULL_FACE),Lu=st}function setPolygonOffset(st,ot,ut){st?(enable(at.POLYGON_OFFSET_FILL),hh===ot&&ed===ut||(at.polygonOffset(ot,ut),hh=ot,ed=ut)):disable(at.POLYGON_OFFSET_FILL)}return{buffers:{color:ot,depth:Hl,stencil:rc},enable:enable,disable:disable,bindFramebuffer:function(st,ot){return wc[st]!==ot&&(at.bindFramebuffer(st,ot),wc[st]=ot,st===at.DRAW_FRAMEBUFFER&&(wc[at.FRAMEBUFFER]=ot),st===at.FRAMEBUFFER&&(wc[at.DRAW_FRAMEBUFFER]=ot),!0)},drawBuffers:function(st,ot){let ut=iu,Hl=!1;if(st){ut=Sc.get(ot),void 0===ut&&(ut=[],Sc.set(ot,ut));const rc=st.textures;if(ut.length!==rc.length||ut[0]!==at.COLOR_ATTACHMENT0){for(let st=0,ot=rc.length;st<ot;st++)ut[st]=at.COLOR_ATTACHMENT0+st;ut.length=rc.length,Hl=!0}}else ut[0]!==at.BACK&&(ut[0]=at.BACK,Hl=!0);Hl&&at.drawBuffers(ut)},useProgram:function(st){return su!==st&&(at.useProgram(st),su=st,!0)},setBlending:setBlending,setMaterial:function(st,sc){st.side===ut.$EB?disable(at.CULL_FACE):enable(at.CULL_FACE);let oc=st.side===ut.hsX;sc&&(oc=!oc),setFlipSided(oc),st.blending===ut.NTi&&!1===st.transparent?setBlending(ut.XIg):setBlending(st.blending,st.blendEquation,st.blendSrc,st.blendDst,st.blendEquationAlpha,st.blendSrcAlpha,st.blendDstAlpha,st.blendColor,st.blendAlpha,st.premultipliedAlpha),Hl.setFunc(st.depthFunc),Hl.setTest(st.depthTest),Hl.setMask(st.depthWrite),ot.setMask(st.colorWrite);const _c=st.stencilWrite;rc.setTest(_c),_c&&(rc.setMask(st.stencilWriteMask),rc.setFunc(st.stencilFunc,st.stencilRef,st.stencilFuncMask),rc.setOp(st.stencilFail,st.stencilZFail,st.stencilZPass)),setPolygonOffset(st.polygonOffset,st.polygonOffsetFactor,st.polygonOffsetUnits),!0===st.alphaToCoverage?enable(at.SAMPLE_ALPHA_TO_COVERAGE):disable(at.SAMPLE_ALPHA_TO_COVERAGE)},setFlipSided:setFlipSided,setCullFace:setCullFace,setLineWidth:function(st){st!==$u&&(id&&at.lineWidth(st),$u=st)},setPolygonOffset:setPolygonOffset,setScissorTest:function(st){st?enable(at.SCISSOR_TEST):disable(at.SCISSOR_TEST)},activeTexture:function(st){void 0===st&&(st=at.TEXTURE0+td-1),ad!==st&&(at.activeTexture(st),ad=st)},bindTexture:function(st,ot,ut){void 0===ut&&(ut=null===ad?at.TEXTURE0+td-1:ad);let Hl=sd[ut];void 0===Hl&&(Hl={type:void 0,texture:void 0},sd[ut]=Hl),Hl.type===st&&Hl.texture===ot||(ad!==ut&&(at.activeTexture(ut),ad=ut),at.bindTexture(st,ot||hd[st]),Hl.type=st,Hl.texture=ot)},unbindTexture:function(){const st=sd[ad];void 0!==st&&void 0!==st.type&&(at.bindTexture(st.type,null),st.type=void 0,st.texture=void 0)},compressedTexImage2D:function(){try{at.compressedTexImage2D(...arguments)}catch(st){console.error("THREE.WebGLState:",st)}},compressedTexImage3D:function(){try{at.compressedTexImage3D(...arguments)}catch(st){console.error("THREE.WebGLState:",st)}},texImage2D:function(){try{at.texImage2D(...arguments)}catch(st){console.error("THREE.WebGLState:",st)}},texImage3D:function(){try{at.texImage3D(...arguments)}catch(st){console.error("THREE.WebGLState:",st)}},updateUBOMapping:function(st,ot){let ut=oc.get(ot);void 0===ut&&(ut=new WeakMap,oc.set(ot,ut));let Hl=ut.get(st);void 0===Hl&&(Hl=at.getUniformBlockIndex(ot,st.name),ut.set(st,Hl))},uniformBlockBinding:function(st,ot){const ut=oc.get(ot).get(st);sc.get(ot)!==ut&&(at.uniformBlockBinding(ot,ut,st.__bindingPointIndex),sc.set(ot,ut))},texStorage2D:function(){try{at.texStorage2D(...arguments)}catch(st){console.error("THREE.WebGLState:",st)}},texStorage3D:function(){try{at.texStorage3D(...arguments)}catch(st){console.error("THREE.WebGLState:",st)}},texSubImage2D:function(){try{at.texSubImage2D(...arguments)}catch(st){console.error("THREE.WebGLState:",st)}},texSubImage3D:function(){try{at.texSubImage3D(...arguments)}catch(st){console.error("THREE.WebGLState:",st)}},compressedTexSubImage2D:function(){try{at.compressedTexSubImage2D(...arguments)}catch(st){console.error("THREE.WebGLState:",st)}},compressedTexSubImage3D:function(){try{at.compressedTexSubImage3D(...arguments)}catch(st){console.error("THREE.WebGLState:",st)}},scissor:function(st){!1===cd.equals(st)&&(at.scissor(st.x,st.y,st.z,st.w),cd.copy(st))},viewport:function(st){!1===ud.equals(st)&&(at.viewport(st.x,st.y,st.z,st.w),ud.copy(st))},reset:function(){at.disable(at.BLEND),at.disable(at.CULL_FACE),at.disable(at.DEPTH_TEST),at.disable(at.POLYGON_OFFSET_FILL),at.disable(at.SCISSOR_TEST),at.disable(at.STENCIL_TEST),at.disable(at.SAMPLE_ALPHA_TO_COVERAGE),at.blendEquation(at.FUNC_ADD),at.blendFunc(at.ONE,at.ZERO),at.blendFuncSeparate(at.ONE,at.ZERO,at.ONE,at.ZERO),at.blendColor(0,0,0,0),at.colorMask(!0,!0,!0,!0),at.clearColor(0,0,0,0),at.depthMask(!0),at.depthFunc(at.LESS),Hl.setReversed(!1),at.clearDepth(1),at.stencilMask(4294967295),at.stencilFunc(at.ALWAYS,0,4294967295),at.stencilOp(at.KEEP,at.KEEP,at.KEEP),at.clearStencil(0),at.cullFace(at.BACK),at.frontFace(at.CCW),at.polygonOffset(0,0),at.activeTexture(at.TEXTURE0),at.bindFramebuffer(at.FRAMEBUFFER,null),at.bindFramebuffer(at.DRAW_FRAMEBUFFER,null),at.bindFramebuffer(at.READ_FRAMEBUFFER,null),at.useProgram(null),at.lineWidth(1),at.scissor(0,0,at.canvas.width,at.canvas.height),at.viewport(0,0,at.canvas.width,at.canvas.height),_c={},ad=null,sd={},wc={},Sc=new WeakMap,iu=[],su=null,lu=!1,cu=null,uu=null,pu=null,mu=null,gu=null,Au=null,yu=null,_u=new ut.Q1f(0,0,0),xu=0,Su=!1,Du=null,Lu=null,$u=null,hh=null,ed=null,cd.set(0,0,at.canvas.width,at.canvas.height),ud.set(0,0,at.canvas.width,at.canvas.height),ot.reset(),Hl.reset(),rc.reset()}}}function WebGLTextures(at,st,ot,Hl,rc,sc,oc){const _c=st.has("WEBGL_multisampled_render_to_texture")?st.get("WEBGL_multisampled_render_to_texture"):null,wc="undefined"!==typeof navigator&&/OculusBrowser/g.test(navigator.userAgent),Sc=new ut.I9Y,iu=new WeakMap;let su;const lu=new WeakMap;let cu=!1;try{cu="undefined"!==typeof OffscreenCanvas&&null!==new OffscreenCanvas(1,1).getContext("2d")}catch(_u){}function createCanvas(at,st){return cu?new OffscreenCanvas(at,st):(0,ut.qq$)("canvas")}function resizeImage(at,st,ot){let ut=1;const Hl=getDimensions(at);if((Hl.width>ot||Hl.height>ot)&&(ut=ot/Math.max(Hl.width,Hl.height)),ut<1){if("undefined"!==typeof HTMLImageElement&&at instanceof HTMLImageElement||"undefined"!==typeof HTMLCanvasElement&&at instanceof HTMLCanvasElement||"undefined"!==typeof ImageBitmap&&at instanceof ImageBitmap||"undefined"!==typeof VideoFrame&&at instanceof VideoFrame){const ot=Math.floor(ut*Hl.width),rc=Math.floor(ut*Hl.height);void 0===su&&(su=createCanvas(ot,rc));const sc=st?createCanvas(ot,rc):su;sc.width=ot,sc.height=rc;return sc.getContext("2d").drawImage(at,0,0,ot,rc),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+Hl.width+"x"+Hl.height+") to ("+ot+"x"+rc+")."),sc}return"data"in at&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+Hl.width+"x"+Hl.height+")."),at}return at}function textureNeedsGenerateMipmaps(at){return at.generateMipmaps}function generateMipmap(st){at.generateMipmap(st)}function getTargetType(st){return st.isWebGLCubeRenderTarget?at.TEXTURE_CUBE_MAP:st.isWebGL3DRenderTarget?at.TEXTURE_3D:st.isWebGLArrayRenderTarget||st.isCompressedArrayTexture?at.TEXTURE_2D_ARRAY:at.TEXTURE_2D}function getInternalFormat(ot,Hl,rc,sc,oc){if(void 0===oc&&(oc=!1),null!==ot){if(void 0!==at[ot])return at[ot];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+ot+"'")}let _c=Hl;if(Hl===at.RED&&(rc===at.FLOAT&&(_c=at.R32F),rc===at.HALF_FLOAT&&(_c=at.R16F),rc===at.UNSIGNED_BYTE&&(_c=at.R8)),Hl===at.RED_INTEGER&&(rc===at.UNSIGNED_BYTE&&(_c=at.R8UI),rc===at.UNSIGNED_SHORT&&(_c=at.R16UI),rc===at.UNSIGNED_INT&&(_c=at.R32UI),rc===at.BYTE&&(_c=at.R8I),rc===at.SHORT&&(_c=at.R16I),rc===at.INT&&(_c=at.R32I)),Hl===at.RG&&(rc===at.FLOAT&&(_c=at.RG32F),rc===at.HALF_FLOAT&&(_c=at.RG16F),rc===at.UNSIGNED_BYTE&&(_c=at.RG8)),Hl===at.RG_INTEGER&&(rc===at.UNSIGNED_BYTE&&(_c=at.RG8UI),rc===at.UNSIGNED_SHORT&&(_c=at.RG16UI),rc===at.UNSIGNED_INT&&(_c=at.RG32UI),rc===at.BYTE&&(_c=at.RG8I),rc===at.SHORT&&(_c=at.RG16I),rc===at.INT&&(_c=at.RG32I)),Hl===at.RGB_INTEGER&&(rc===at.UNSIGNED_BYTE&&(_c=at.RGB8UI),rc===at.UNSIGNED_SHORT&&(_c=at.RGB16UI),rc===at.UNSIGNED_INT&&(_c=at.RGB32UI),rc===at.BYTE&&(_c=at.RGB8I),rc===at.SHORT&&(_c=at.RGB16I),rc===at.INT&&(_c=at.RGB32I)),Hl===at.RGBA_INTEGER&&(rc===at.UNSIGNED_BYTE&&(_c=at.RGBA8UI),rc===at.UNSIGNED_SHORT&&(_c=at.RGBA16UI),rc===at.UNSIGNED_INT&&(_c=at.RGBA32UI),rc===at.BYTE&&(_c=at.RGBA8I),rc===at.SHORT&&(_c=at.RGBA16I),rc===at.INT&&(_c=at.RGBA32I)),Hl===at.RGB&&rc===at.UNSIGNED_INT_5_9_9_9_REV&&(_c=at.RGB9_E5),Hl===at.RGBA){const st=oc?ut.VxR:ut.ppV.getTransfer(sc);rc===at.FLOAT&&(_c=at.RGBA32F),rc===at.HALF_FLOAT&&(_c=at.RGBA16F),rc===at.UNSIGNED_BYTE&&(_c=st===ut.KLL?at.SRGB8_ALPHA8:at.RGBA8),rc===at.UNSIGNED_SHORT_4_4_4_4&&(_c=at.RGBA4),rc===at.UNSIGNED_SHORT_5_5_5_1&&(_c=at.RGB5_A1)}return _c!==at.R16F&&_c!==at.R32F&&_c!==at.RG16F&&_c!==at.RG32F&&_c!==at.RGBA16F&&_c!==at.RGBA32F||st.get("EXT_color_buffer_float"),_c}function getInternalDepthFormat(st,ot){let Hl;return st?null===ot||ot===ut.bkx||ot===ut.V3x?Hl=at.DEPTH24_STENCIL8:ot===ut.RQf?Hl=at.DEPTH32F_STENCIL8:ot===ut.cHt&&(Hl=at.DEPTH24_STENCIL8,console.warn("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.")):null===ot||ot===ut.bkx||ot===ut.V3x?Hl=at.DEPTH_COMPONENT24:ot===ut.RQf?Hl=at.DEPTH_COMPONENT32F:ot===ut.cHt&&(Hl=at.DEPTH_COMPONENT16),Hl}function getMipLevels(at,st){return!0===textureNeedsGenerateMipmaps(at)||at.isFramebufferTexture&&at.minFilter!==ut.hxR&&at.minFilter!==ut.k6q?Math.log2(Math.max(st.width,st.height))+1:void 0!==at.mipmaps&&at.mipmaps.length>0?at.mipmaps.length:at.isCompressedTexture&&Array.isArray(at.image)?st.mipmaps.length:1}function onTextureDispose(at){const st=at.target;st.removeEventListener("dispose",onTextureDispose),function(at){const st=Hl.get(at);if(void 0===st.__webglInit)return;const ot=at.source,ut=lu.get(ot);if(ut){const Hl=ut[st.__cacheKey];Hl.usedTimes--,0===Hl.usedTimes&&deleteTexture(at),0===Object.keys(ut).length&&lu.delete(ot)}Hl.remove(at)}(st),st.isVideoTexture&&iu.delete(st)}function onRenderTargetDispose(st){const ot=st.target;ot.removeEventListener("dispose",onRenderTargetDispose),function(st){const ot=Hl.get(st);st.depthTexture&&(st.depthTexture.dispose(),Hl.remove(st.depthTexture));if(st.isWebGLCubeRenderTarget)for(let Hl=0;Hl<6;Hl++){if(Array.isArray(ot.__webglFramebuffer[Hl]))for(let st=0;st<ot.__webglFramebuffer[Hl].length;st++)at.deleteFramebuffer(ot.__webglFramebuffer[Hl][st]);else at.deleteFramebuffer(ot.__webglFramebuffer[Hl]);ot.__webglDepthbuffer&&at.deleteRenderbuffer(ot.__webglDepthbuffer[Hl])}else{if(Array.isArray(ot.__webglFramebuffer))for(let st=0;st<ot.__webglFramebuffer.length;st++)at.deleteFramebuffer(ot.__webglFramebuffer[st]);else at.deleteFramebuffer(ot.__webglFramebuffer);if(ot.__webglDepthbuffer&&at.deleteRenderbuffer(ot.__webglDepthbuffer),ot.__webglMultisampledFramebuffer&&at.deleteFramebuffer(ot.__webglMultisampledFramebuffer),ot.__webglColorRenderbuffer)for(let st=0;st<ot.__webglColorRenderbuffer.length;st++)ot.__webglColorRenderbuffer[st]&&at.deleteRenderbuffer(ot.__webglColorRenderbuffer[st]);ot.__webglDepthRenderbuffer&&at.deleteRenderbuffer(ot.__webglDepthRenderbuffer)}const ut=st.textures;for(let rc=0,sc=ut.length;rc<sc;rc++){const st=Hl.get(ut[rc]);st.__webglTexture&&(at.deleteTexture(st.__webglTexture),oc.memory.textures--),Hl.remove(ut[rc])}Hl.remove(st)}(ot)}function deleteTexture(st){const ot=Hl.get(st);at.deleteTexture(ot.__webglTexture);const ut=st.source;delete lu.get(ut)[ot.__cacheKey],oc.memory.textures--}let uu=0;function setTexture2D(st,ut){const rc=Hl.get(st);if(st.isVideoTexture&&function(at){const st=oc.render.frame;iu.get(at)!==st&&(iu.set(at,st),at.update())}(st),!1===st.isRenderTargetTexture&&st.version>0&&rc.__version!==st.version){const at=st.image;if(null===at)console.warn("THREE.WebGLRenderer: Texture marked for update but no image data found.");else{if(!1!==at.complete)return void uploadTexture(rc,st,ut);console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete")}}ot.bindTexture(at.TEXTURE_2D,rc.__webglTexture,at.TEXTURE0+ut)}const pu={[ut.GJx]:at.REPEAT,[ut.ghU]:at.CLAMP_TO_EDGE,[ut.kTW]:at.MIRRORED_REPEAT},mu={[ut.hxR]:at.NEAREST,[ut.pHI]:at.NEAREST_MIPMAP_NEAREST,[ut.Cfg]:at.NEAREST_MIPMAP_LINEAR,[ut.k6q]:at.LINEAR,[ut.kRr]:at.LINEAR_MIPMAP_NEAREST,[ut.$_I]:at.LINEAR_MIPMAP_LINEAR},gu={[ut.amv]:at.NEVER,[ut.FFZ]:at.ALWAYS,[ut.vim]:at.LESS,[ut.TiK]:at.LEQUAL,[ut.kO0]:at.EQUAL,[ut.gWB]:at.GEQUAL,[ut.eoi]:at.GREATER,[ut.jzd]:at.NOTEQUAL};function setTextureParameters(ot,sc){if(sc.type!==ut.RQf||!1!==st.has("OES_texture_float_linear")||sc.magFilter!==ut.k6q&&sc.magFilter!==ut.kRr&&sc.magFilter!==ut.Cfg&&sc.magFilter!==ut.$_I&&sc.minFilter!==ut.k6q&&sc.minFilter!==ut.kRr&&sc.minFilter!==ut.Cfg&&sc.minFilter!==ut.$_I||console.warn("THREE.WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device."),at.texParameteri(ot,at.TEXTURE_WRAP_S,pu[sc.wrapS]),at.texParameteri(ot,at.TEXTURE_WRAP_T,pu[sc.wrapT]),ot!==at.TEXTURE_3D&&ot!==at.TEXTURE_2D_ARRAY||at.texParameteri(ot,at.TEXTURE_WRAP_R,pu[sc.wrapR]),at.texParameteri(ot,at.TEXTURE_MAG_FILTER,mu[sc.magFilter]),at.texParameteri(ot,at.TEXTURE_MIN_FILTER,mu[sc.minFilter]),sc.compareFunction&&(at.texParameteri(ot,at.TEXTURE_COMPARE_MODE,at.COMPARE_REF_TO_TEXTURE),at.texParameteri(ot,at.TEXTURE_COMPARE_FUNC,gu[sc.compareFunction])),!0===st.has("EXT_texture_filter_anisotropic")){if(sc.magFilter===ut.hxR)return;if(sc.minFilter!==ut.Cfg&&sc.minFilter!==ut.$_I)return;if(sc.type===ut.RQf&&!1===st.has("OES_texture_float_linear"))return;if(sc.anisotropy>1||Hl.get(sc).__currentAnisotropy){const ut=st.get("EXT_texture_filter_anisotropic");at.texParameterf(ot,ut.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(sc.anisotropy,rc.getMaxAnisotropy())),Hl.get(sc).__currentAnisotropy=sc.anisotropy}}}function initTexture(st,ot){let ut=!1;void 0===st.__webglInit&&(st.__webglInit=!0,ot.addEventListener("dispose",onTextureDispose));const Hl=ot.source;let rc=lu.get(Hl);void 0===rc&&(rc={},lu.set(Hl,rc));const sc=function(at){const st=[];return st.push(at.wrapS),st.push(at.wrapT),st.push(at.wrapR||0),st.push(at.magFilter),st.push(at.minFilter),st.push(at.anisotropy),st.push(at.internalFormat),st.push(at.format),st.push(at.type),st.push(at.generateMipmaps),st.push(at.premultiplyAlpha),st.push(at.flipY),st.push(at.unpackAlignment),st.push(at.colorSpace),st.join()}(ot);if(sc!==st.__cacheKey){void 0===rc[sc]&&(rc[sc]={texture:at.createTexture(),usedTimes:0},oc.memory.textures++,ut=!0),rc[sc].usedTimes++;const Hl=rc[st.__cacheKey];void 0!==Hl&&(rc[st.__cacheKey].usedTimes--,0===Hl.usedTimes&&deleteTexture(ot)),st.__cacheKey=sc,st.__webglTexture=rc[sc].texture}return ut}function uploadTexture(st,oc,_c){let wc=at.TEXTURE_2D;(oc.isDataArrayTexture||oc.isCompressedArrayTexture)&&(wc=at.TEXTURE_2D_ARRAY),oc.isData3DTexture&&(wc=at.TEXTURE_3D);const Sc=initTexture(st,oc),iu=oc.source;ot.bindTexture(wc,st.__webglTexture,at.TEXTURE0+_c);const su=Hl.get(iu);if(iu.version!==su.__version||!0===Sc){ot.activeTexture(at.TEXTURE0+_c);const st=ut.ppV.getPrimaries(ut.ppV.workingColorSpace),Hl=oc.colorSpace===ut.jf0?null:ut.ppV.getPrimaries(oc.colorSpace),lu=oc.colorSpace===ut.jf0||st===Hl?at.NONE:at.BROWSER_DEFAULT_WEBGL;at.pixelStorei(at.UNPACK_FLIP_Y_WEBGL,oc.flipY),at.pixelStorei(at.UNPACK_PREMULTIPLY_ALPHA_WEBGL,oc.premultiplyAlpha),at.pixelStorei(at.UNPACK_ALIGNMENT,oc.unpackAlignment),at.pixelStorei(at.UNPACK_COLORSPACE_CONVERSION_WEBGL,lu);let cu=resizeImage(oc.image,!1,rc.maxTextureSize);cu=verifyColorSpace(oc,cu);const uu=sc.convert(oc.format,oc.colorSpace),pu=sc.convert(oc.type);let mu,gu=getInternalFormat(oc.internalFormat,uu,pu,oc.colorSpace,oc.isVideoTexture);setTextureParameters(wc,oc);const Au=oc.mipmaps,yu=!0!==oc.isVideoTexture,_u=void 0===su.__version||!0===Sc,xu=iu.dataReady,Su=getMipLevels(oc,cu);if(oc.isDepthTexture)gu=getInternalDepthFormat(oc.format===ut.dcC,oc.type),_u&&(yu?ot.texStorage2D(at.TEXTURE_2D,1,gu,cu.width,cu.height):ot.texImage2D(at.TEXTURE_2D,0,gu,cu.width,cu.height,0,uu,pu,null));else if(oc.isDataTexture)if(Au.length>0){yu&&_u&&ot.texStorage2D(at.TEXTURE_2D,Su,gu,Au[0].width,Au[0].height);for(let st=0,ut=Au.length;st<ut;st++)mu=Au[st],yu?xu&&ot.texSubImage2D(at.TEXTURE_2D,st,0,0,mu.width,mu.height,uu,pu,mu.data):ot.texImage2D(at.TEXTURE_2D,st,gu,mu.width,mu.height,0,uu,pu,mu.data);oc.generateMipmaps=!1}else yu?(_u&&ot.texStorage2D(at.TEXTURE_2D,Su,gu,cu.width,cu.height),xu&&ot.texSubImage2D(at.TEXTURE_2D,0,0,0,cu.width,cu.height,uu,pu,cu.data)):ot.texImage2D(at.TEXTURE_2D,0,gu,cu.width,cu.height,0,uu,pu,cu.data);else if(oc.isCompressedTexture)if(oc.isCompressedArrayTexture){yu&&_u&&ot.texStorage3D(at.TEXTURE_2D_ARRAY,Su,gu,Au[0].width,Au[0].height,cu.depth);for(let st=0,Hl=Au.length;st<Hl;st++)if(mu=Au[st],oc.format!==ut.GWd)if(null!==uu)if(yu){if(xu)if(oc.layerUpdates.size>0){const Hl=(0,ut.Nex)(mu.width,mu.height,oc.format,oc.type);for(const ut of oc.layerUpdates){const rc=mu.data.subarray(ut*Hl/mu.data.BYTES_PER_ELEMENT,(ut+1)*Hl/mu.data.BYTES_PER_ELEMENT);ot.compressedTexSubImage3D(at.TEXTURE_2D_ARRAY,st,0,0,ut,mu.width,mu.height,1,uu,rc)}oc.clearLayerUpdates()}else ot.compressedTexSubImage3D(at.TEXTURE_2D_ARRAY,st,0,0,0,mu.width,mu.height,cu.depth,uu,mu.data)}else ot.compressedTexImage3D(at.TEXTURE_2D_ARRAY,st,gu,mu.width,mu.height,cu.depth,0,mu.data,0,0);else console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()");else yu?xu&&ot.texSubImage3D(at.TEXTURE_2D_ARRAY,st,0,0,0,mu.width,mu.height,cu.depth,uu,pu,mu.data):ot.texImage3D(at.TEXTURE_2D_ARRAY,st,gu,mu.width,mu.height,cu.depth,0,uu,pu,mu.data)}else{yu&&_u&&ot.texStorage2D(at.TEXTURE_2D,Su,gu,Au[0].width,Au[0].height);for(let st=0,Hl=Au.length;st<Hl;st++)mu=Au[st],oc.format!==ut.GWd?null!==uu?yu?xu&&ot.compressedTexSubImage2D(at.TEXTURE_2D,st,0,0,mu.width,mu.height,uu,mu.data):ot.compressedTexImage2D(at.TEXTURE_2D,st,gu,mu.width,mu.height,0,mu.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"):yu?xu&&ot.texSubImage2D(at.TEXTURE_2D,st,0,0,mu.width,mu.height,uu,pu,mu.data):ot.texImage2D(at.TEXTURE_2D,st,gu,mu.width,mu.height,0,uu,pu,mu.data)}else if(oc.isDataArrayTexture)if(yu){if(_u&&ot.texStorage3D(at.TEXTURE_2D_ARRAY,Su,gu,cu.width,cu.height,cu.depth),xu)if(oc.layerUpdates.size>0){const st=(0,ut.Nex)(cu.width,cu.height,oc.format,oc.type);for(const ut of oc.layerUpdates){const Hl=cu.data.subarray(ut*st/cu.data.BYTES_PER_ELEMENT,(ut+1)*st/cu.data.BYTES_PER_ELEMENT);ot.texSubImage3D(at.TEXTURE_2D_ARRAY,0,0,0,ut,cu.width,cu.height,1,uu,pu,Hl)}oc.clearLayerUpdates()}else ot.texSubImage3D(at.TEXTURE_2D_ARRAY,0,0,0,0,cu.width,cu.height,cu.depth,uu,pu,cu.data)}else ot.texImage3D(at.TEXTURE_2D_ARRAY,0,gu,cu.width,cu.height,cu.depth,0,uu,pu,cu.data);else if(oc.isData3DTexture)yu?(_u&&ot.texStorage3D(at.TEXTURE_3D,Su,gu,cu.width,cu.height,cu.depth),xu&&ot.texSubImage3D(at.TEXTURE_3D,0,0,0,0,cu.width,cu.height,cu.depth,uu,pu,cu.data)):ot.texImage3D(at.TEXTURE_3D,0,gu,cu.width,cu.height,cu.depth,0,uu,pu,cu.data);else if(oc.isFramebufferTexture){if(_u)if(yu)ot.texStorage2D(at.TEXTURE_2D,Su,gu,cu.width,cu.height);else{let st=cu.width,ut=cu.height;for(let Hl=0;Hl<Su;Hl++)ot.texImage2D(at.TEXTURE_2D,Hl,gu,st,ut,0,uu,pu,null),st>>=1,ut>>=1}}else if(Au.length>0){if(yu&&_u){const st=getDimensions(Au[0]);ot.texStorage2D(at.TEXTURE_2D,Su,gu,st.width,st.height)}for(let st=0,ut=Au.length;st<ut;st++)mu=Au[st],yu?xu&&ot.texSubImage2D(at.TEXTURE_2D,st,0,0,uu,pu,mu):ot.texImage2D(at.TEXTURE_2D,st,gu,uu,pu,mu);oc.generateMipmaps=!1}else if(yu){if(_u){const st=getDimensions(cu);ot.texStorage2D(at.TEXTURE_2D,Su,gu,st.width,st.height)}xu&&ot.texSubImage2D(at.TEXTURE_2D,0,0,0,uu,pu,cu)}else ot.texImage2D(at.TEXTURE_2D,0,gu,uu,pu,cu);textureNeedsGenerateMipmaps(oc)&&generateMipmap(wc),su.__version=iu.version,oc.onUpdate&&oc.onUpdate(oc)}st.__version=oc.version}function setupFrameBufferTexture(st,ut,rc,oc,wc,Sc){const iu=sc.convert(rc.format,rc.colorSpace),su=sc.convert(rc.type),lu=getInternalFormat(rc.internalFormat,iu,su,rc.colorSpace),cu=Hl.get(ut),uu=Hl.get(rc);if(uu.__renderTarget=ut,!cu.__hasExternalTextures){const st=Math.max(1,ut.width>>Sc),Hl=Math.max(1,ut.height>>Sc);wc===at.TEXTURE_3D||wc===at.TEXTURE_2D_ARRAY?ot.texImage3D(wc,Sc,lu,st,Hl,ut.depth,0,iu,su,null):ot.texImage2D(wc,Sc,lu,st,Hl,0,iu,su,null)}ot.bindFramebuffer(at.FRAMEBUFFER,st),useMultisampledRTT(ut)?_c.framebufferTexture2DMultisampleEXT(at.FRAMEBUFFER,oc,wc,uu.__webglTexture,0,getRenderTargetSamples(ut)):(wc===at.TEXTURE_2D||wc>=at.TEXTURE_CUBE_MAP_POSITIVE_X&&wc<=at.TEXTURE_CUBE_MAP_NEGATIVE_Z)&&at.framebufferTexture2D(at.FRAMEBUFFER,oc,wc,uu.__webglTexture,Sc),ot.bindFramebuffer(at.FRAMEBUFFER,null)}function setupRenderBufferStorage(st,ot,ut){if(at.bindRenderbuffer(at.RENDERBUFFER,st),ot.depthBuffer){const Hl=ot.depthTexture,rc=Hl&&Hl.isDepthTexture?Hl.type:null,sc=getInternalDepthFormat(ot.stencilBuffer,rc),oc=ot.stencilBuffer?at.DEPTH_STENCIL_ATTACHMENT:at.DEPTH_ATTACHMENT,wc=getRenderTargetSamples(ot);useMultisampledRTT(ot)?_c.renderbufferStorageMultisampleEXT(at.RENDERBUFFER,wc,sc,ot.width,ot.height):ut?at.renderbufferStorageMultisample(at.RENDERBUFFER,wc,sc,ot.width,ot.height):at.renderbufferStorage(at.RENDERBUFFER,sc,ot.width,ot.height),at.framebufferRenderbuffer(at.FRAMEBUFFER,oc,at.RENDERBUFFER,st)}else{const st=ot.textures;for(let Hl=0;Hl<st.length;Hl++){const rc=st[Hl],oc=sc.convert(rc.format,rc.colorSpace),wc=sc.convert(rc.type),Sc=getInternalFormat(rc.internalFormat,oc,wc,rc.colorSpace),iu=getRenderTargetSamples(ot);ut&&!1===useMultisampledRTT(ot)?at.renderbufferStorageMultisample(at.RENDERBUFFER,iu,Sc,ot.width,ot.height):useMultisampledRTT(ot)?_c.renderbufferStorageMultisampleEXT(at.RENDERBUFFER,iu,Sc,ot.width,ot.height):at.renderbufferStorage(at.RENDERBUFFER,Sc,ot.width,ot.height)}}at.bindRenderbuffer(at.RENDERBUFFER,null)}function setupDepthRenderbuffer(st){const rc=Hl.get(st),sc=!0===st.isWebGLCubeRenderTarget;if(rc.__boundDepthTexture!==st.depthTexture){const at=st.depthTexture;if(rc.__depthDisposeCallback&&rc.__depthDisposeCallback(),at){const disposeEvent=()=>{delete rc.__boundDepthTexture,delete rc.__depthDisposeCallback,at.removeEventListener("dispose",disposeEvent)};at.addEventListener("dispose",disposeEvent),rc.__depthDisposeCallback=disposeEvent}rc.__boundDepthTexture=at}if(st.depthTexture&&!rc.__autoAllocateDepthBuffer){if(sc)throw new Error("target.depthTexture not supported in Cube render targets");!function(st,rc){if(rc&&rc.isWebGLCubeRenderTarget)throw new Error("Depth Texture with cube render targets is not supported");if(ot.bindFramebuffer(at.FRAMEBUFFER,st),!rc.depthTexture||!rc.depthTexture.isDepthTexture)throw new Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");const sc=Hl.get(rc.depthTexture);sc.__renderTarget=rc,sc.__webglTexture&&rc.depthTexture.image.width===rc.width&&rc.depthTexture.image.height===rc.height||(rc.depthTexture.image.width=rc.width,rc.depthTexture.image.height=rc.height,rc.depthTexture.needsUpdate=!0),setTexture2D(rc.depthTexture,0);const oc=sc.__webglTexture,wc=getRenderTargetSamples(rc);if(rc.depthTexture.format===ut.zdS)useMultisampledRTT(rc)?_c.framebufferTexture2DMultisampleEXT(at.FRAMEBUFFER,at.DEPTH_ATTACHMENT,at.TEXTURE_2D,oc,0,wc):at.framebufferTexture2D(at.FRAMEBUFFER,at.DEPTH_ATTACHMENT,at.TEXTURE_2D,oc,0);else{if(rc.depthTexture.format!==ut.dcC)throw new Error("Unknown depthTexture format");useMultisampledRTT(rc)?_c.framebufferTexture2DMultisampleEXT(at.FRAMEBUFFER,at.DEPTH_STENCIL_ATTACHMENT,at.TEXTURE_2D,oc,0,wc):at.framebufferTexture2D(at.FRAMEBUFFER,at.DEPTH_STENCIL_ATTACHMENT,at.TEXTURE_2D,oc,0)}}(rc.__webglFramebuffer,st)}else if(sc){rc.__webglDepthbuffer=[];for(let ut=0;ut<6;ut++)if(ot.bindFramebuffer(at.FRAMEBUFFER,rc.__webglFramebuffer[ut]),void 0===rc.__webglDepthbuffer[ut])rc.__webglDepthbuffer[ut]=at.createRenderbuffer(),setupRenderBufferStorage(rc.__webglDepthbuffer[ut],st,!1);else{const ot=st.stencilBuffer?at.DEPTH_STENCIL_ATTACHMENT:at.DEPTH_ATTACHMENT,Hl=rc.__webglDepthbuffer[ut];at.bindRenderbuffer(at.RENDERBUFFER,Hl),at.framebufferRenderbuffer(at.FRAMEBUFFER,ot,at.RENDERBUFFER,Hl)}}else if(ot.bindFramebuffer(at.FRAMEBUFFER,rc.__webglFramebuffer),void 0===rc.__webglDepthbuffer)rc.__webglDepthbuffer=at.createRenderbuffer(),setupRenderBufferStorage(rc.__webglDepthbuffer,st,!1);else{const ot=st.stencilBuffer?at.DEPTH_STENCIL_ATTACHMENT:at.DEPTH_ATTACHMENT,ut=rc.__webglDepthbuffer;at.bindRenderbuffer(at.RENDERBUFFER,ut),at.framebufferRenderbuffer(at.FRAMEBUFFER,ot,at.RENDERBUFFER,ut)}ot.bindFramebuffer(at.FRAMEBUFFER,null)}const Au=[],yu=[];function getRenderTargetSamples(at){return Math.min(rc.maxSamples,at.samples)}function useMultisampledRTT(at){const ot=Hl.get(at);return at.samples>0&&!0===st.has("WEBGL_multisampled_render_to_texture")&&!1!==ot.__useRenderToTexture}function verifyColorSpace(at,st){const ot=at.colorSpace,Hl=at.format,rc=at.type;return!0===at.isCompressedTexture||!0===at.isVideoTexture||ot!==ut.Zr2&&ot!==ut.jf0&&(ut.ppV.getTransfer(ot)===ut.KLL?Hl===ut.GWd&&rc===ut.OUM||console.warn("THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):console.error("THREE.WebGLTextures: Unsupported texture color space:",ot)),st}function getDimensions(at){return"undefined"!==typeof HTMLImageElement&&at instanceof HTMLImageElement?(Sc.width=at.naturalWidth||at.width,Sc.height=at.naturalHeight||at.height):"undefined"!==typeof VideoFrame&&at instanceof VideoFrame?(Sc.width=at.displayWidth,Sc.height=at.displayHeight):(Sc.width=at.width,Sc.height=at.height),Sc}this.allocateTextureUnit=function(){const at=uu;return at>=rc.maxTextures&&console.warn("THREE.WebGLTextures: Trying to use "+at+" texture units while this GPU supports only "+rc.maxTextures),uu+=1,at},this.resetTextureUnits=function(){uu=0},this.setTexture2D=setTexture2D,this.setTexture2DArray=function(st,ut){const rc=Hl.get(st);st.version>0&&rc.__version!==st.version?uploadTexture(rc,st,ut):ot.bindTexture(at.TEXTURE_2D_ARRAY,rc.__webglTexture,at.TEXTURE0+ut)},this.setTexture3D=function(st,ut){const rc=Hl.get(st);st.version>0&&rc.__version!==st.version?uploadTexture(rc,st,ut):ot.bindTexture(at.TEXTURE_3D,rc.__webglTexture,at.TEXTURE0+ut)},this.setTextureCube=function(st,oc){const _c=Hl.get(st);st.version>0&&_c.__version!==st.version?function(st,oc,_c){if(6!==oc.image.length)return;const wc=initTexture(st,oc),Sc=oc.source;ot.bindTexture(at.TEXTURE_CUBE_MAP,st.__webglTexture,at.TEXTURE0+_c);const iu=Hl.get(Sc);if(Sc.version!==iu.__version||!0===wc){ot.activeTexture(at.TEXTURE0+_c);const st=ut.ppV.getPrimaries(ut.ppV.workingColorSpace),Hl=oc.colorSpace===ut.jf0?null:ut.ppV.getPrimaries(oc.colorSpace),su=oc.colorSpace===ut.jf0||st===Hl?at.NONE:at.BROWSER_DEFAULT_WEBGL;at.pixelStorei(at.UNPACK_FLIP_Y_WEBGL,oc.flipY),at.pixelStorei(at.UNPACK_PREMULTIPLY_ALPHA_WEBGL,oc.premultiplyAlpha),at.pixelStorei(at.UNPACK_ALIGNMENT,oc.unpackAlignment),at.pixelStorei(at.UNPACK_COLORSPACE_CONVERSION_WEBGL,su);const lu=oc.isCompressedTexture||oc.image[0].isCompressedTexture,cu=oc.image[0]&&oc.image[0].isDataTexture,uu=[];for(let at=0;at<6;at++)uu[at]=lu||cu?cu?oc.image[at].image:oc.image[at]:resizeImage(oc.image[at],!0,rc.maxCubemapSize),uu[at]=verifyColorSpace(oc,uu[at]);const pu=uu[0],mu=sc.convert(oc.format,oc.colorSpace),gu=sc.convert(oc.type),Au=getInternalFormat(oc.internalFormat,mu,gu,oc.colorSpace),yu=!0!==oc.isVideoTexture,_u=void 0===iu.__version||!0===wc,xu=Sc.dataReady;let Su,Du=getMipLevels(oc,pu);if(setTextureParameters(at.TEXTURE_CUBE_MAP,oc),lu){yu&&_u&&ot.texStorage2D(at.TEXTURE_CUBE_MAP,Du,Au,pu.width,pu.height);for(let st=0;st<6;st++){Su=uu[st].mipmaps;for(let Hl=0;Hl<Su.length;Hl++){const rc=Su[Hl];oc.format!==ut.GWd?null!==mu?yu?xu&&ot.compressedTexSubImage2D(at.TEXTURE_CUBE_MAP_POSITIVE_X+st,Hl,0,0,rc.width,rc.height,mu,rc.data):ot.compressedTexImage2D(at.TEXTURE_CUBE_MAP_POSITIVE_X+st,Hl,Au,rc.width,rc.height,0,rc.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()"):yu?xu&&ot.texSubImage2D(at.TEXTURE_CUBE_MAP_POSITIVE_X+st,Hl,0,0,rc.width,rc.height,mu,gu,rc.data):ot.texImage2D(at.TEXTURE_CUBE_MAP_POSITIVE_X+st,Hl,Au,rc.width,rc.height,0,mu,gu,rc.data)}}}else{if(Su=oc.mipmaps,yu&&_u){Su.length>0&&Du++;const st=getDimensions(uu[0]);ot.texStorage2D(at.TEXTURE_CUBE_MAP,Du,Au,st.width,st.height)}for(let st=0;st<6;st++)if(cu){yu?xu&&ot.texSubImage2D(at.TEXTURE_CUBE_MAP_POSITIVE_X+st,0,0,0,uu[st].width,uu[st].height,mu,gu,uu[st].data):ot.texImage2D(at.TEXTURE_CUBE_MAP_POSITIVE_X+st,0,Au,uu[st].width,uu[st].height,0,mu,gu,uu[st].data);for(let ut=0;ut<Su.length;ut++){const Hl=Su[ut].image[st].image;yu?xu&&ot.texSubImage2D(at.TEXTURE_CUBE_MAP_POSITIVE_X+st,ut+1,0,0,Hl.width,Hl.height,mu,gu,Hl.data):ot.texImage2D(at.TEXTURE_CUBE_MAP_POSITIVE_X+st,ut+1,Au,Hl.width,Hl.height,0,mu,gu,Hl.data)}}else{yu?xu&&ot.texSubImage2D(at.TEXTURE_CUBE_MAP_POSITIVE_X+st,0,0,0,mu,gu,uu[st]):ot.texImage2D(at.TEXTURE_CUBE_MAP_POSITIVE_X+st,0,Au,mu,gu,uu[st]);for(let ut=0;ut<Su.length;ut++){const Hl=Su[ut];yu?xu&&ot.texSubImage2D(at.TEXTURE_CUBE_MAP_POSITIVE_X+st,ut+1,0,0,mu,gu,Hl.image[st]):ot.texImage2D(at.TEXTURE_CUBE_MAP_POSITIVE_X+st,ut+1,Au,mu,gu,Hl.image[st])}}}textureNeedsGenerateMipmaps(oc)&&generateMipmap(at.TEXTURE_CUBE_MAP),iu.__version=Sc.version,oc.onUpdate&&oc.onUpdate(oc)}st.__version=oc.version}(_c,st,oc):ot.bindTexture(at.TEXTURE_CUBE_MAP,_c.__webglTexture,at.TEXTURE0+oc)},this.rebindTextures=function(st,ot,ut){const rc=Hl.get(st);void 0!==ot&&setupFrameBufferTexture(rc.__webglFramebuffer,st,st.texture,at.COLOR_ATTACHMENT0,at.TEXTURE_2D,0),void 0!==ut&&setupDepthRenderbuffer(st)},this.setupRenderTarget=function(st){const ut=st.texture,rc=Hl.get(st),_c=Hl.get(ut);st.addEventListener("dispose",onRenderTargetDispose);const wc=st.textures,Sc=!0===st.isWebGLCubeRenderTarget,iu=wc.length>1;if(iu||(void 0===_c.__webglTexture&&(_c.__webglTexture=at.createTexture()),_c.__version=ut.version,oc.memory.textures++),Sc){rc.__webglFramebuffer=[];for(let st=0;st<6;st++)if(ut.mipmaps&&ut.mipmaps.length>0){rc.__webglFramebuffer[st]=[];for(let ot=0;ot<ut.mipmaps.length;ot++)rc.__webglFramebuffer[st][ot]=at.createFramebuffer()}else rc.__webglFramebuffer[st]=at.createFramebuffer()}else{if(ut.mipmaps&&ut.mipmaps.length>0){rc.__webglFramebuffer=[];for(let st=0;st<ut.mipmaps.length;st++)rc.__webglFramebuffer[st]=at.createFramebuffer()}else rc.__webglFramebuffer=at.createFramebuffer();if(iu)for(let st=0,ot=wc.length;st<ot;st++){const ot=Hl.get(wc[st]);void 0===ot.__webglTexture&&(ot.__webglTexture=at.createTexture(),oc.memory.textures++)}if(st.samples>0&&!1===useMultisampledRTT(st)){rc.__webglMultisampledFramebuffer=at.createFramebuffer(),rc.__webglColorRenderbuffer=[],ot.bindFramebuffer(at.FRAMEBUFFER,rc.__webglMultisampledFramebuffer);for(let ot=0;ot<wc.length;ot++){const ut=wc[ot];rc.__webglColorRenderbuffer[ot]=at.createRenderbuffer(),at.bindRenderbuffer(at.RENDERBUFFER,rc.__webglColorRenderbuffer[ot]);const Hl=sc.convert(ut.format,ut.colorSpace),oc=sc.convert(ut.type),_c=getInternalFormat(ut.internalFormat,Hl,oc,ut.colorSpace,!0===st.isXRRenderTarget),Sc=getRenderTargetSamples(st);at.renderbufferStorageMultisample(at.RENDERBUFFER,Sc,_c,st.width,st.height),at.framebufferRenderbuffer(at.FRAMEBUFFER,at.COLOR_ATTACHMENT0+ot,at.RENDERBUFFER,rc.__webglColorRenderbuffer[ot])}at.bindRenderbuffer(at.RENDERBUFFER,null),st.depthBuffer&&(rc.__webglDepthRenderbuffer=at.createRenderbuffer(),setupRenderBufferStorage(rc.__webglDepthRenderbuffer,st,!0)),ot.bindFramebuffer(at.FRAMEBUFFER,null)}}if(Sc){ot.bindTexture(at.TEXTURE_CUBE_MAP,_c.__webglTexture),setTextureParameters(at.TEXTURE_CUBE_MAP,ut);for(let ot=0;ot<6;ot++)if(ut.mipmaps&&ut.mipmaps.length>0)for(let Hl=0;Hl<ut.mipmaps.length;Hl++)setupFrameBufferTexture(rc.__webglFramebuffer[ot][Hl],st,ut,at.COLOR_ATTACHMENT0,at.TEXTURE_CUBE_MAP_POSITIVE_X+ot,Hl);else setupFrameBufferTexture(rc.__webglFramebuffer[ot],st,ut,at.COLOR_ATTACHMENT0,at.TEXTURE_CUBE_MAP_POSITIVE_X+ot,0);textureNeedsGenerateMipmaps(ut)&&generateMipmap(at.TEXTURE_CUBE_MAP),ot.unbindTexture()}else if(iu){for(let ut=0,sc=wc.length;ut<sc;ut++){const sc=wc[ut],oc=Hl.get(sc);ot.bindTexture(at.TEXTURE_2D,oc.__webglTexture),setTextureParameters(at.TEXTURE_2D,sc),setupFrameBufferTexture(rc.__webglFramebuffer,st,sc,at.COLOR_ATTACHMENT0+ut,at.TEXTURE_2D,0),textureNeedsGenerateMipmaps(sc)&&generateMipmap(at.TEXTURE_2D)}ot.unbindTexture()}else{let Hl=at.TEXTURE_2D;if((st.isWebGL3DRenderTarget||st.isWebGLArrayRenderTarget)&&(Hl=st.isWebGL3DRenderTarget?at.TEXTURE_3D:at.TEXTURE_2D_ARRAY),ot.bindTexture(Hl,_c.__webglTexture),setTextureParameters(Hl,ut),ut.mipmaps&&ut.mipmaps.length>0)for(let ot=0;ot<ut.mipmaps.length;ot++)setupFrameBufferTexture(rc.__webglFramebuffer[ot],st,ut,at.COLOR_ATTACHMENT0,Hl,ot);else setupFrameBufferTexture(rc.__webglFramebuffer,st,ut,at.COLOR_ATTACHMENT0,Hl,0);textureNeedsGenerateMipmaps(ut)&&generateMipmap(Hl),ot.unbindTexture()}st.depthBuffer&&setupDepthRenderbuffer(st)},this.updateRenderTargetMipmap=function(at){const st=at.textures;for(let ut=0,rc=st.length;ut<rc;ut++){const rc=st[ut];if(textureNeedsGenerateMipmaps(rc)){const st=getTargetType(at),ut=Hl.get(rc).__webglTexture;ot.bindTexture(st,ut),generateMipmap(st),ot.unbindTexture()}}},this.updateMultisampleRenderTarget=function(st){if(st.samples>0)if(!1===useMultisampledRTT(st)){const ut=st.textures,rc=st.width,sc=st.height;let oc=at.COLOR_BUFFER_BIT;const _c=st.stencilBuffer?at.DEPTH_STENCIL_ATTACHMENT:at.DEPTH_ATTACHMENT,Sc=Hl.get(st),iu=ut.length>1;if(iu)for(let st=0;st<ut.length;st++)ot.bindFramebuffer(at.FRAMEBUFFER,Sc.__webglMultisampledFramebuffer),at.framebufferRenderbuffer(at.FRAMEBUFFER,at.COLOR_ATTACHMENT0+st,at.RENDERBUFFER,null),ot.bindFramebuffer(at.FRAMEBUFFER,Sc.__webglFramebuffer),at.framebufferTexture2D(at.DRAW_FRAMEBUFFER,at.COLOR_ATTACHMENT0+st,at.TEXTURE_2D,null,0);ot.bindFramebuffer(at.READ_FRAMEBUFFER,Sc.__webglMultisampledFramebuffer),ot.bindFramebuffer(at.DRAW_FRAMEBUFFER,Sc.__webglFramebuffer);for(let ot=0;ot<ut.length;ot++){if(st.resolveDepthBuffer&&(st.depthBuffer&&(oc|=at.DEPTH_BUFFER_BIT),st.stencilBuffer&&st.resolveStencilBuffer&&(oc|=at.STENCIL_BUFFER_BIT)),iu){at.framebufferRenderbuffer(at.READ_FRAMEBUFFER,at.COLOR_ATTACHMENT0,at.RENDERBUFFER,Sc.__webglColorRenderbuffer[ot]);const st=Hl.get(ut[ot]).__webglTexture;at.framebufferTexture2D(at.DRAW_FRAMEBUFFER,at.COLOR_ATTACHMENT0,at.TEXTURE_2D,st,0)}at.blitFramebuffer(0,0,rc,sc,0,0,rc,sc,oc,at.NEAREST),!0===wc&&(Au.length=0,yu.length=0,Au.push(at.COLOR_ATTACHMENT0+ot),st.depthBuffer&&!1===st.resolveDepthBuffer&&(Au.push(_c),yu.push(_c),at.invalidateFramebuffer(at.DRAW_FRAMEBUFFER,yu)),at.invalidateFramebuffer(at.READ_FRAMEBUFFER,Au))}if(ot.bindFramebuffer(at.READ_FRAMEBUFFER,null),ot.bindFramebuffer(at.DRAW_FRAMEBUFFER,null),iu)for(let st=0;st<ut.length;st++){ot.bindFramebuffer(at.FRAMEBUFFER,Sc.__webglMultisampledFramebuffer),at.framebufferRenderbuffer(at.FRAMEBUFFER,at.COLOR_ATTACHMENT0+st,at.RENDERBUFFER,Sc.__webglColorRenderbuffer[st]);const rc=Hl.get(ut[st]).__webglTexture;ot.bindFramebuffer(at.FRAMEBUFFER,Sc.__webglFramebuffer),at.framebufferTexture2D(at.DRAW_FRAMEBUFFER,at.COLOR_ATTACHMENT0+st,at.TEXTURE_2D,rc,0)}ot.bindFramebuffer(at.DRAW_FRAMEBUFFER,Sc.__webglMultisampledFramebuffer)}else if(st.depthBuffer&&!1===st.resolveDepthBuffer&&wc){const ot=st.stencilBuffer?at.DEPTH_STENCIL_ATTACHMENT:at.DEPTH_ATTACHMENT;at.invalidateFramebuffer(at.DRAW_FRAMEBUFFER,[ot])}},this.setupDepthRenderbuffer=setupDepthRenderbuffer,this.setupFrameBufferTexture=setupFrameBufferTexture,this.useMultisampledRTT=useMultisampledRTT}function WebGLUtils(at,st){return{convert:function(ot,Hl){let rc;void 0===Hl&&(Hl=ut.jf0);const sc=ut.ppV.getTransfer(Hl);if(ot===ut.OUM)return at.UNSIGNED_BYTE;if(ot===ut.Wew)return at.UNSIGNED_SHORT_4_4_4_4;if(ot===ut.gJ2)return at.UNSIGNED_SHORT_5_5_5_1;if(ot===ut.Dmk)return at.UNSIGNED_INT_5_9_9_9_REV;if(ot===ut.tJf)return at.BYTE;if(ot===ut.fBL)return at.SHORT;if(ot===ut.cHt)return at.UNSIGNED_SHORT;if(ot===ut.Yuy)return at.INT;if(ot===ut.bkx)return at.UNSIGNED_INT;if(ot===ut.RQf)return at.FLOAT;if(ot===ut.ix0)return at.HALF_FLOAT;if(ot===ut.wrO)return at.ALPHA;if(ot===ut.HIg)return at.RGB;if(ot===ut.GWd)return at.RGBA;if(ot===ut.Kzv)return at.LUMINANCE;if(ot===ut.CMB)return at.LUMINANCE_ALPHA;if(ot===ut.zdS)return at.DEPTH_COMPONENT;if(ot===ut.dcC)return at.DEPTH_STENCIL;if(ot===ut.VT0)return at.RED;if(ot===ut.ZQM)return at.RED_INTEGER;if(ot===ut.paN)return at.RG;if(ot===ut.TkQ)return at.RG_INTEGER;if(ot===ut.c90)return at.RGBA_INTEGER;if(ot===ut.IE4||ot===ut.Nz6||ot===ut.jR7||ot===ut.BXX)if(sc===ut.KLL){if(rc=st.get("WEBGL_compressed_texture_s3tc_srgb"),null===rc)return null;if(ot===ut.IE4)return rc.COMPRESSED_SRGB_S3TC_DXT1_EXT;if(ot===ut.Nz6)return rc.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;if(ot===ut.jR7)return rc.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;if(ot===ut.BXX)return rc.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT}else{if(rc=st.get("WEBGL_compressed_texture_s3tc"),null===rc)return null;if(ot===ut.IE4)return rc.COMPRESSED_RGB_S3TC_DXT1_EXT;if(ot===ut.Nz6)return rc.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(ot===ut.jR7)return rc.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(ot===ut.BXX)return rc.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(ot===ut.k6Q||ot===ut.kTp||ot===ut.HXV||ot===ut.pBf){if(rc=st.get("WEBGL_compressed_texture_pvrtc"),null===rc)return null;if(ot===ut.k6Q)return rc.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(ot===ut.kTp)return rc.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(ot===ut.HXV)return rc.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(ot===ut.pBf)return rc.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(ot===ut.CVz||ot===ut.Riy||ot===ut.KDk){if(rc=st.get("WEBGL_compressed_texture_etc"),null===rc)return null;if(ot===ut.CVz||ot===ut.Riy)return sc===ut.KLL?rc.COMPRESSED_SRGB8_ETC2:rc.COMPRESSED_RGB8_ETC2;if(ot===ut.KDk)return sc===ut.KLL?rc.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:rc.COMPRESSED_RGBA8_ETC2_EAC}if(ot===ut.qa3||ot===ut.B_h||ot===ut.czI||ot===ut.rSH||ot===ut.Qrf||ot===ut.psI||ot===ut.a5J||ot===ut._QJ||ot===ut.uB5||ot===ut.lyL||ot===ut.bC7||ot===ut.y3Z||ot===ut.ojs||ot===ut.S$4){if(rc=st.get("WEBGL_compressed_texture_astc"),null===rc)return null;if(ot===ut.qa3)return sc===ut.KLL?rc.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:rc.COMPRESSED_RGBA_ASTC_4x4_KHR;if(ot===ut.B_h)return sc===ut.KLL?rc.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:rc.COMPRESSED_RGBA_ASTC_5x4_KHR;if(ot===ut.czI)return sc===ut.KLL?rc.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:rc.COMPRESSED_RGBA_ASTC_5x5_KHR;if(ot===ut.rSH)return sc===ut.KLL?rc.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:rc.COMPRESSED_RGBA_ASTC_6x5_KHR;if(ot===ut.Qrf)return sc===ut.KLL?rc.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:rc.COMPRESSED_RGBA_ASTC_6x6_KHR;if(ot===ut.psI)return sc===ut.KLL?rc.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:rc.COMPRESSED_RGBA_ASTC_8x5_KHR;if(ot===ut.a5J)return sc===ut.KLL?rc.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:rc.COMPRESSED_RGBA_ASTC_8x6_KHR;if(ot===ut._QJ)return sc===ut.KLL?rc.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:rc.COMPRESSED_RGBA_ASTC_8x8_KHR;if(ot===ut.uB5)return sc===ut.KLL?rc.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:rc.COMPRESSED_RGBA_ASTC_10x5_KHR;if(ot===ut.lyL)return sc===ut.KLL?rc.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:rc.COMPRESSED_RGBA_ASTC_10x6_KHR;if(ot===ut.bC7)return sc===ut.KLL?rc.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:rc.COMPRESSED_RGBA_ASTC_10x8_KHR;if(ot===ut.y3Z)return sc===ut.KLL?rc.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:rc.COMPRESSED_RGBA_ASTC_10x10_KHR;if(ot===ut.ojs)return sc===ut.KLL?rc.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:rc.COMPRESSED_RGBA_ASTC_12x10_KHR;if(ot===ut.S$4)return sc===ut.KLL?rc.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:rc.COMPRESSED_RGBA_ASTC_12x12_KHR}if(ot===ut.Fn||ot===ut.H23||ot===ut.W9U){if(rc=st.get("EXT_texture_compression_bptc"),null===rc)return null;if(ot===ut.Fn)return sc===ut.KLL?rc.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT:rc.COMPRESSED_RGBA_BPTC_UNORM_EXT;if(ot===ut.H23)return rc.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;if(ot===ut.W9U)return rc.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT}if(ot===ut.Kef||ot===ut.XG_||ot===ut.HO_||ot===ut.CWW){if(rc=st.get("EXT_texture_compression_rgtc"),null===rc)return null;if(ot===ut.Fn)return rc.COMPRESSED_RED_RGTC1_EXT;if(ot===ut.XG_)return rc.COMPRESSED_SIGNED_RED_RGTC1_EXT;if(ot===ut.HO_)return rc.COMPRESSED_RED_GREEN_RGTC2_EXT;if(ot===ut.CWW)return rc.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT}return ot===ut.V3x?at.UNSIGNED_INT_24_8:void 0!==at[ot]?at[ot]:null}}}class WebXRDepthSensing{constructor(){this.texture=null,this.mesh=null,this.depthNear=0,this.depthFar=0}init(at,st,ot){if(null===this.texture){const Hl=new ut.gPd;at.properties.get(Hl).__webglTexture=st.texture,st.depthNear===ot.depthNear&&st.depthFar===ot.depthFar||(this.depthNear=st.depthNear,this.depthFar=st.depthFar),this.texture=Hl}}getMesh(at){if(null!==this.texture&&null===this.mesh){const st=at.cameras[0].viewport,ot=new ut.BKk({vertexShader:"\nvoid main() {\n\n\tgl_Position = vec4( position, 1.0 );\n\n}",fragmentShader:"\nuniform sampler2DArray depthColor;\nuniform float depthWidth;\nuniform float depthHeight;\n\nvoid main() {\n\n\tvec2 coord = vec2( gl_FragCoord.x / depthWidth, gl_FragCoord.y / depthHeight );\n\n\tif ( coord.x >= 1.0 ) {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x - 1.0, coord.y, 1 ) ).r;\n\n\t} else {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x, coord.y, 0 ) ).r;\n\n\t}\n\n}",uniforms:{depthColor:{value:this.texture},depthWidth:{value:st.z},depthHeight:{value:st.w}}});this.mesh=new ut.eaF(new ut.bdM(20,20),ot)}return this.mesh}reset(){this.texture=null,this.mesh=null}getDepthTexture(){return this.texture}}class WebXRManager extends ut.Qev{constructor(at,st){super();const ot=this;let Hl=null,rc=1,sc=null,oc="local-floor",_c=1,wc=null,Sc=null,iu=null,su=null,lu=null,cu=null;const uu=new WebXRDepthSensing,pu=st.getContextAttributes();let mu=null,gu=null;const Au=[],yu=[],_u=new ut.I9Y;let xu=null;const Su=new ut.ubm;Su.viewport=new ut.IUQ;const Du=new ut.ubm;Du.viewport=new ut.IUQ;const Lu=[Su,Du],$u=new ut.nZQ;let hh=null,ed=null;function onSessionEvent(at){const st=yu.indexOf(at.inputSource);if(-1===st)return;const ot=Au[st];void 0!==ot&&(ot.update(at.inputSource,at.frame,wc||sc),ot.dispatchEvent({type:at.type,data:at.inputSource}))}function onSessionEnd(){Hl.removeEventListener("select",onSessionEvent),Hl.removeEventListener("selectstart",onSessionEvent),Hl.removeEventListener("selectend",onSessionEvent),Hl.removeEventListener("squeeze",onSessionEvent),Hl.removeEventListener("squeezestart",onSessionEvent),Hl.removeEventListener("squeezeend",onSessionEvent),Hl.removeEventListener("end",onSessionEnd),Hl.removeEventListener("inputsourceschange",onInputSourcesChange);for(let at=0;at<Au.length;at++){const st=yu[at];null!==st&&(yu[at]=null,Au[at].disconnect(st))}hh=null,ed=null,uu.reset(),at.setRenderTarget(mu),lu=null,su=null,iu=null,Hl=null,gu=null,rd.stop(),ot.isPresenting=!1,at.setPixelRatio(xu),at.setSize(_u.width,_u.height,!1),ot.dispatchEvent({type:"sessionend"})}function onInputSourcesChange(at){for(let st=0;st<at.removed.length;st++){const ot=at.removed[st],ut=yu.indexOf(ot);ut>=0&&(yu[ut]=null,Au[ut].disconnect(ot))}for(let st=0;st<at.added.length;st++){const ot=at.added[st];let ut=yu.indexOf(ot);if(-1===ut){for(let at=0;at<Au.length;at++){if(at>=yu.length){yu.push(ot),ut=at;break}if(null===yu[at]){yu[at]=ot,ut=at;break}}if(-1===ut)break}const Hl=Au[ut];Hl&&Hl.connect(ot)}}this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.getController=function(at){let st=Au[at];return void 0===st&&(st=new ut.R3r,Au[at]=st),st.getTargetRaySpace()},this.getControllerGrip=function(at){let st=Au[at];return void 0===st&&(st=new ut.R3r,Au[at]=st),st.getGripSpace()},this.getHand=function(at){let st=Au[at];return void 0===st&&(st=new ut.R3r,Au[at]=st),st.getHandSpace()},this.setFramebufferScaleFactor=function(at){rc=at,!0===ot.isPresenting&&console.warn("THREE.WebXRManager: Cannot change framebuffer scale while presenting.")},this.setReferenceSpaceType=function(at){oc=at,!0===ot.isPresenting&&console.warn("THREE.WebXRManager: Cannot change reference space type while presenting.")},this.getReferenceSpace=function(){return wc||sc},this.setReferenceSpace=function(at){wc=at},this.getBaseLayer=function(){return null!==su?su:lu},this.getBinding=function(){return iu},this.getFrame=function(){return cu},this.getSession=function(){return Hl},this.setSession=async function(Sc){if(Hl=Sc,null!==Hl){mu=at.getRenderTarget(),Hl.addEventListener("select",onSessionEvent),Hl.addEventListener("selectstart",onSessionEvent),Hl.addEventListener("selectend",onSessionEvent),Hl.addEventListener("squeeze",onSessionEvent),Hl.addEventListener("squeezestart",onSessionEvent),Hl.addEventListener("squeezeend",onSessionEvent),Hl.addEventListener("end",onSessionEnd),Hl.addEventListener("inputsourceschange",onInputSourcesChange),!0!==pu.xrCompatible&&await st.makeXRCompatible(),xu=at.getPixelRatio(),at.getSize(_u);if("undefined"!==typeof XRWebGLBinding&&"createProjectionLayer"in XRWebGLBinding.prototype){let ot=null,sc=null,oc=null;pu.depth&&(oc=pu.stencil?st.DEPTH24_STENCIL8:st.DEPTH_COMPONENT24,ot=pu.stencil?ut.dcC:ut.zdS,sc=pu.stencil?ut.V3x:ut.bkx);const _c={colorFormat:st.RGBA8,depthFormat:oc,scaleFactor:rc};iu=new XRWebGLBinding(Hl,st),su=iu.createProjectionLayer(_c),Hl.updateRenderState({layers:[su]}),at.setPixelRatio(1),at.setSize(su.textureWidth,su.textureHeight,!1),gu=new ut.nWS(su.textureWidth,su.textureHeight,{format:ut.GWd,type:ut.OUM,depthTexture:new ut.VCu(su.textureWidth,su.textureHeight,sc,void 0,void 0,void 0,void 0,void 0,void 0,ot),stencilBuffer:pu.stencil,colorSpace:at.outputColorSpace,samples:pu.antialias?4:0,resolveDepthBuffer:!1===su.ignoreDepthValues,resolveStencilBuffer:!1===su.ignoreDepthValues})}else{const ot={antialias:pu.antialias,alpha:!0,depth:pu.depth,stencil:pu.stencil,framebufferScaleFactor:rc};lu=new XRWebGLLayer(Hl,st,ot),Hl.updateRenderState({baseLayer:lu}),at.setPixelRatio(1),at.setSize(lu.framebufferWidth,lu.framebufferHeight,!1),gu=new ut.nWS(lu.framebufferWidth,lu.framebufferHeight,{format:ut.GWd,type:ut.OUM,colorSpace:at.outputColorSpace,stencilBuffer:pu.stencil,resolveDepthBuffer:!1===lu.ignoreDepthValues,resolveStencilBuffer:!1===lu.ignoreDepthValues})}gu.isXRRenderTarget=!0,this.setFoveation(_c),wc=null,sc=await Hl.requestReferenceSpace(oc),rd.setContext(Hl),rd.start(),ot.isPresenting=!0,ot.dispatchEvent({type:"sessionstart"})}},this.getEnvironmentBlendMode=function(){if(null!==Hl)return Hl.environmentBlendMode},this.getDepthTexture=function(){return uu.getDepthTexture()};const td=new ut.Pq0,id=new ut.Pq0;function updateCamera(at,st){null===st?at.matrixWorld.copy(at.matrix):at.matrixWorld.multiplyMatrices(st.matrixWorld,at.matrix),at.matrixWorldInverse.copy(at.matrixWorld).invert()}this.updateCamera=function(at){if(null===Hl)return;let st=at.near,ot=at.far;null!==uu.texture&&(uu.depthNear>0&&(st=uu.depthNear),uu.depthFar>0&&(ot=uu.depthFar)),$u.near=Du.near=Su.near=st,$u.far=Du.far=Su.far=ot,hh===$u.near&&ed===$u.far||(Hl.updateRenderState({depthNear:$u.near,depthFar:$u.far}),hh=$u.near,ed=$u.far),Su.layers.mask=2|at.layers.mask,Du.layers.mask=4|at.layers.mask,$u.layers.mask=Su.layers.mask|Du.layers.mask;const rc=at.parent,sc=$u.cameras;updateCamera($u,rc);for(let ut=0;ut<sc.length;ut++)updateCamera(sc[ut],rc);2===sc.length?function(at,st,ot){td.setFromMatrixPosition(st.matrixWorld),id.setFromMatrixPosition(ot.matrixWorld);const ut=td.distanceTo(id),Hl=st.projectionMatrix.elements,rc=ot.projectionMatrix.elements,sc=Hl[14]/(Hl[10]-1),oc=Hl[14]/(Hl[10]+1),_c=(Hl[9]+1)/Hl[5],wc=(Hl[9]-1)/Hl[5],Sc=(Hl[8]-1)/Hl[0],iu=(rc[8]+1)/rc[0],su=sc*Sc,lu=sc*iu,cu=ut/(-Sc+iu),uu=cu*-Sc;if(st.matrixWorld.decompose(at.position,at.quaternion,at.scale),at.translateX(uu),at.translateZ(cu),at.matrixWorld.compose(at.position,at.quaternion,at.scale),at.matrixWorldInverse.copy(at.matrixWorld).invert(),-1===Hl[10])at.projectionMatrix.copy(st.projectionMatrix),at.projectionMatrixInverse.copy(st.projectionMatrixInverse);else{const st=sc+cu,ot=oc+cu,Hl=su-uu,rc=lu+(ut-uu),Sc=_c*oc/ot*st,iu=wc*oc/ot*st;at.projectionMatrix.makePerspective(Hl,rc,Sc,iu,st,ot),at.projectionMatrixInverse.copy(at.projectionMatrix).invert()}}($u,Su,Du):$u.projectionMatrix.copy(Su.projectionMatrix),function(at,st,ot){null===ot?at.matrix.copy(st.matrixWorld):(at.matrix.copy(ot.matrixWorld),at.matrix.invert(),at.matrix.multiply(st.matrixWorld));at.matrix.decompose(at.position,at.quaternion,at.scale),at.updateMatrixWorld(!0),at.projectionMatrix.copy(st.projectionMatrix),at.projectionMatrixInverse.copy(st.projectionMatrixInverse),at.isPerspectiveCamera&&(at.fov=2*ut.a55*Math.atan(1/at.projectionMatrix.elements[5]),at.zoom=1)}(at,$u,rc)},this.getCamera=function(){return $u},this.getFoveation=function(){if(null!==su||null!==lu)return _c},this.setFoveation=function(at){_c=at,null!==su&&(su.fixedFoveation=at),null!==lu&&void 0!==lu.fixedFoveation&&(lu.fixedFoveation=at)},this.hasDepthSensing=function(){return null!==uu.texture},this.getDepthSensingMesh=function(){return uu.getMesh($u)};let nd=null;const rd=new WebGLAnimation;rd.setAnimationLoop((function(st,rc){if(Sc=rc.getViewerPose(wc||sc),cu=rc,null!==Sc){const st=Sc.views;null!==lu&&(at.setRenderTargetFramebuffer(gu,lu.framebuffer),at.setRenderTarget(gu));let ot=!1;st.length!==$u.cameras.length&&($u.cameras.length=0,ot=!0);for(let Hl=0;Hl<st.length;Hl++){const rc=st[Hl];let sc=null;if(null!==lu)sc=lu.getViewport(rc);else{const st=iu.getViewSubImage(su,rc);sc=st.viewport,0===Hl&&(at.setRenderTargetTextures(gu,st.colorTexture,st.depthStencilTexture),at.setRenderTarget(gu))}let oc=Lu[Hl];void 0===oc&&(oc=new ut.ubm,oc.layers.enable(Hl),oc.viewport=new ut.IUQ,Lu[Hl]=oc),oc.matrix.fromArray(rc.transform.matrix),oc.matrix.decompose(oc.position,oc.quaternion,oc.scale),oc.projectionMatrix.fromArray(rc.projectionMatrix),oc.projectionMatrixInverse.copy(oc.projectionMatrix).invert(),oc.viewport.set(sc.x,sc.y,sc.width,sc.height),0===Hl&&($u.matrix.copy(oc.matrix),$u.matrix.decompose($u.position,$u.quaternion,$u.scale)),!0===ot&&$u.cameras.push(oc)}const rc=Hl.enabledFeatures;if(rc&&rc.includes("depth-sensing")&&"gpu-optimized"==Hl.depthUsage&&iu){const ot=iu.getDepthInformation(st[0]);ot&&ot.isValid&&ot.texture&&uu.init(at,ot,Hl.renderState)}}for(let at=0;at<Au.length;at++){const st=yu[at],ot=Au[at];null!==st&&void 0!==ot&&ot.update(st,rc,wc||sc)}nd&&nd(st,rc),rc.detectedPlanes&&ot.dispatchEvent({type:"planesdetected",data:rc}),cu=null})),this.setAnimationLoop=function(at){nd=at},this.dispose=function(){}}}const md=new ut.O9p,fd=new ut.kn4;function WebGLMaterials(at,st){function refreshTransformUniform(at,st){!0===at.matrixAutoUpdate&&at.updateMatrix(),st.value.copy(at.matrix)}function refreshUniformsCommon(at,ot){at.opacity.value=ot.opacity,ot.color&&at.diffuse.value.copy(ot.color),ot.emissive&&at.emissive.value.copy(ot.emissive).multiplyScalar(ot.emissiveIntensity),ot.map&&(at.map.value=ot.map,refreshTransformUniform(ot.map,at.mapTransform)),ot.alphaMap&&(at.alphaMap.value=ot.alphaMap,refreshTransformUniform(ot.alphaMap,at.alphaMapTransform)),ot.bumpMap&&(at.bumpMap.value=ot.bumpMap,refreshTransformUniform(ot.bumpMap,at.bumpMapTransform),at.bumpScale.value=ot.bumpScale,ot.side===ut.hsX&&(at.bumpScale.value*=-1)),ot.normalMap&&(at.normalMap.value=ot.normalMap,refreshTransformUniform(ot.normalMap,at.normalMapTransform),at.normalScale.value.copy(ot.normalScale),ot.side===ut.hsX&&at.normalScale.value.negate()),ot.displacementMap&&(at.displacementMap.value=ot.displacementMap,refreshTransformUniform(ot.displacementMap,at.displacementMapTransform),at.displacementScale.value=ot.displacementScale,at.displacementBias.value=ot.displacementBias),ot.emissiveMap&&(at.emissiveMap.value=ot.emissiveMap,refreshTransformUniform(ot.emissiveMap,at.emissiveMapTransform)),ot.specularMap&&(at.specularMap.value=ot.specularMap,refreshTransformUniform(ot.specularMap,at.specularMapTransform)),ot.alphaTest>0&&(at.alphaTest.value=ot.alphaTest);const Hl=st.get(ot),rc=Hl.envMap,sc=Hl.envMapRotation;rc&&(at.envMap.value=rc,md.copy(sc),md.x*=-1,md.y*=-1,md.z*=-1,rc.isCubeTexture&&!1===rc.isRenderTargetTexture&&(md.y*=-1,md.z*=-1),at.envMapRotation.value.setFromMatrix4(fd.makeRotationFromEuler(md)),at.flipEnvMap.value=rc.isCubeTexture&&!1===rc.isRenderTargetTexture?-1:1,at.reflectivity.value=ot.reflectivity,at.ior.value=ot.ior,at.refractionRatio.value=ot.refractionRatio),ot.lightMap&&(at.lightMap.value=ot.lightMap,at.lightMapIntensity.value=ot.lightMapIntensity,refreshTransformUniform(ot.lightMap,at.lightMapTransform)),ot.aoMap&&(at.aoMap.value=ot.aoMap,at.aoMapIntensity.value=ot.aoMapIntensity,refreshTransformUniform(ot.aoMap,at.aoMapTransform))}return{refreshFogUniforms:function(st,ot){ot.color.getRGB(st.fogColor.value,(0,ut._Ut)(at)),ot.isFog?(st.fogNear.value=ot.near,st.fogFar.value=ot.far):ot.isFogExp2&&(st.fogDensity.value=ot.density)},refreshMaterialUniforms:function(at,ot,Hl,rc,sc){ot.isMeshBasicMaterial||ot.isMeshLambertMaterial?refreshUniformsCommon(at,ot):ot.isMeshToonMaterial?(refreshUniformsCommon(at,ot),function(at,st){st.gradientMap&&(at.gradientMap.value=st.gradientMap)}(at,ot)):ot.isMeshPhongMaterial?(refreshUniformsCommon(at,ot),function(at,st){at.specular.value.copy(st.specular),at.shininess.value=Math.max(st.shininess,1e-4)}(at,ot)):ot.isMeshStandardMaterial?(refreshUniformsCommon(at,ot),function(at,st){at.metalness.value=st.metalness,st.metalnessMap&&(at.metalnessMap.value=st.metalnessMap,refreshTransformUniform(st.metalnessMap,at.metalnessMapTransform));at.roughness.value=st.roughness,st.roughnessMap&&(at.roughnessMap.value=st.roughnessMap,refreshTransformUniform(st.roughnessMap,at.roughnessMapTransform));st.envMap&&(at.envMapIntensity.value=st.envMapIntensity)}(at,ot),ot.isMeshPhysicalMaterial&&function(at,st,ot){at.ior.value=st.ior,st.sheen>0&&(at.sheenColor.value.copy(st.sheenColor).multiplyScalar(st.sheen),at.sheenRoughness.value=st.sheenRoughness,st.sheenColorMap&&(at.sheenColorMap.value=st.sheenColorMap,refreshTransformUniform(st.sheenColorMap,at.sheenColorMapTransform)),st.sheenRoughnessMap&&(at.sheenRoughnessMap.value=st.sheenRoughnessMap,refreshTransformUniform(st.sheenRoughnessMap,at.sheenRoughnessMapTransform)));st.clearcoat>0&&(at.clearcoat.value=st.clearcoat,at.clearcoatRoughness.value=st.clearcoatRoughness,st.clearcoatMap&&(at.clearcoatMap.value=st.clearcoatMap,refreshTransformUniform(st.clearcoatMap,at.clearcoatMapTransform)),st.clearcoatRoughnessMap&&(at.clearcoatRoughnessMap.value=st.clearcoatRoughnessMap,refreshTransformUniform(st.clearcoatRoughnessMap,at.clearcoatRoughnessMapTransform)),st.clearcoatNormalMap&&(at.clearcoatNormalMap.value=st.clearcoatNormalMap,refreshTransformUniform(st.clearcoatNormalMap,at.clearcoatNormalMapTransform),at.clearcoatNormalScale.value.copy(st.clearcoatNormalScale),st.side===ut.hsX&&at.clearcoatNormalScale.value.negate()));st.dispersion>0&&(at.dispersion.value=st.dispersion);st.iridescence>0&&(at.iridescence.value=st.iridescence,at.iridescenceIOR.value=st.iridescenceIOR,at.iridescenceThicknessMinimum.value=st.iridescenceThicknessRange[0],at.iridescenceThicknessMaximum.value=st.iridescenceThicknessRange[1],st.iridescenceMap&&(at.iridescenceMap.value=st.iridescenceMap,refreshTransformUniform(st.iridescenceMap,at.iridescenceMapTransform)),st.iridescenceThicknessMap&&(at.iridescenceThicknessMap.value=st.iridescenceThicknessMap,refreshTransformUniform(st.iridescenceThicknessMap,at.iridescenceThicknessMapTransform)));st.transmission>0&&(at.transmission.value=st.transmission,at.transmissionSamplerMap.value=ot.texture,at.transmissionSamplerSize.value.set(ot.width,ot.height),st.transmissionMap&&(at.transmissionMap.value=st.transmissionMap,refreshTransformUniform(st.transmissionMap,at.transmissionMapTransform)),at.thickness.value=st.thickness,st.thicknessMap&&(at.thicknessMap.value=st.thicknessMap,refreshTransformUniform(st.thicknessMap,at.thicknessMapTransform)),at.attenuationDistance.value=st.attenuationDistance,at.attenuationColor.value.copy(st.attenuationColor));st.anisotropy>0&&(at.anisotropyVector.value.set(st.anisotropy*Math.cos(st.anisotropyRotation),st.anisotropy*Math.sin(st.anisotropyRotation)),st.anisotropyMap&&(at.anisotropyMap.value=st.anisotropyMap,refreshTransformUniform(st.anisotropyMap,at.anisotropyMapTransform)));at.specularIntensity.value=st.specularIntensity,at.specularColor.value.copy(st.specularColor),st.specularColorMap&&(at.specularColorMap.value=st.specularColorMap,refreshTransformUniform(st.specularColorMap,at.specularColorMapTransform));st.specularIntensityMap&&(at.specularIntensityMap.value=st.specularIntensityMap,refreshTransformUniform(st.specularIntensityMap,at.specularIntensityMapTransform))}(at,ot,sc)):ot.isMeshMatcapMaterial?(refreshUniformsCommon(at,ot),function(at,st){st.matcap&&(at.matcap.value=st.matcap)}(at,ot)):ot.isMeshDepthMaterial?refreshUniformsCommon(at,ot):ot.isMeshDistanceMaterial?(refreshUniformsCommon(at,ot),function(at,ot){const ut=st.get(ot).light;at.referencePosition.value.setFromMatrixPosition(ut.matrixWorld),at.nearDistance.value=ut.shadow.camera.near,at.farDistance.value=ut.shadow.camera.far}(at,ot)):ot.isMeshNormalMaterial?refreshUniformsCommon(at,ot):ot.isLineBasicMaterial?(function(at,st){at.diffuse.value.copy(st.color),at.opacity.value=st.opacity,st.map&&(at.map.value=st.map,refreshTransformUniform(st.map,at.mapTransform))}(at,ot),ot.isLineDashedMaterial&&function(at,st){at.dashSize.value=st.dashSize,at.totalSize.value=st.dashSize+st.gapSize,at.scale.value=st.scale}(at,ot)):ot.isPointsMaterial?function(at,st,ot,ut){at.diffuse.value.copy(st.color),at.opacity.value=st.opacity,at.size.value=st.size*ot,at.scale.value=.5*ut,st.map&&(at.map.value=st.map,refreshTransformUniform(st.map,at.uvTransform));st.alphaMap&&(at.alphaMap.value=st.alphaMap,refreshTransformUniform(st.alphaMap,at.alphaMapTransform));st.alphaTest>0&&(at.alphaTest.value=st.alphaTest)}(at,ot,Hl,rc):ot.isSpriteMaterial?function(at,st){at.diffuse.value.copy(st.color),at.opacity.value=st.opacity,at.rotation.value=st.rotation,st.map&&(at.map.value=st.map,refreshTransformUniform(st.map,at.mapTransform));st.alphaMap&&(at.alphaMap.value=st.alphaMap,refreshTransformUniform(st.alphaMap,at.alphaMapTransform));st.alphaTest>0&&(at.alphaTest.value=st.alphaTest)}(at,ot):ot.isShadowMaterial?(at.color.value.copy(ot.color),at.opacity.value=ot.opacity):ot.isShaderMaterial&&(ot.uniformsNeedUpdate=!1)}}}function WebGLUniformsGroups(at,st,ot,ut){let Hl={},rc={},sc=[];const oc=at.getParameter(at.MAX_UNIFORM_BUFFER_BINDINGS);function hasUniformChanged(at,st,ot,ut){const Hl=at.value,rc=st+"_"+ot;if(void 0===ut[rc])return ut[rc]="number"===typeof Hl||"boolean"===typeof Hl?Hl:Hl.clone(),!0;{const at=ut[rc];if("number"===typeof Hl||"boolean"===typeof Hl){if(at!==Hl)return ut[rc]=Hl,!0}else if(!1===at.equals(Hl))return at.copy(Hl),!0}return!1}function getUniformSize(at){const st={boundary:0,storage:0};return"number"===typeof at||"boolean"===typeof at?(st.boundary=4,st.storage=4):at.isVector2?(st.boundary=8,st.storage=8):at.isVector3||at.isColor?(st.boundary=16,st.storage=12):at.isVector4?(st.boundary=16,st.storage=16):at.isMatrix3?(st.boundary=48,st.storage=48):at.isMatrix4?(st.boundary=64,st.storage=64):at.isTexture?console.warn("THREE.WebGLRenderer: Texture samplers can not be part of an uniforms group."):console.warn("THREE.WebGLRenderer: Unsupported uniform value type.",at),st}function onUniformsGroupsDispose(st){const ot=st.target;ot.removeEventListener("dispose",onUniformsGroupsDispose);const ut=sc.indexOf(ot.__bindingPointIndex);sc.splice(ut,1),at.deleteBuffer(Hl[ot.id]),delete Hl[ot.id],delete rc[ot.id]}return{bind:function(at,st){const ot=st.program;ut.uniformBlockBinding(at,ot)},update:function(ot,_c){let wc=Hl[ot.id];void 0===wc&&(!function(at){const st=at.uniforms;let ot=0;const ut=16;for(let rc=0,sc=st.length;rc<sc;rc++){const at=Array.isArray(st[rc])?st[rc]:[st[rc]];for(let st=0,Hl=at.length;st<Hl;st++){const Hl=at[st],rc=Array.isArray(Hl.value)?Hl.value:[Hl.value];for(let at=0,st=rc.length;at<st;at++){const st=getUniformSize(rc[at]),sc=ot%ut,oc=sc%st.boundary,_c=sc+oc;ot+=oc,0!==_c&&ut-_c<st.storage&&(ot+=ut-_c),Hl.__data=new Float32Array(st.storage/Float32Array.BYTES_PER_ELEMENT),Hl.__offset=ot,ot+=st.storage}}}const Hl=ot%ut;Hl>0&&(ot+=ut-Hl);at.__size=ot,at.__cache={}}(ot),wc=function(st){const ot=function(){for(let at=0;at<oc;at++)if(-1===sc.indexOf(at))return sc.push(at),at;return console.error("THREE.WebGLRenderer: Maximum number of simultaneously usable uniforms groups reached."),0}();st.__bindingPointIndex=ot;const ut=at.createBuffer(),Hl=st.__size,rc=st.usage;return at.bindBuffer(at.UNIFORM_BUFFER,ut),at.bufferData(at.UNIFORM_BUFFER,Hl,rc),at.bindBuffer(at.UNIFORM_BUFFER,null),at.bindBufferBase(at.UNIFORM_BUFFER,ot,ut),ut}(ot),Hl[ot.id]=wc,ot.addEventListener("dispose",onUniformsGroupsDispose));const Sc=_c.program;ut.updateUBOMapping(ot,Sc);const iu=st.render.frame;rc[ot.id]!==iu&&(!function(st){const ot=Hl[st.id],ut=st.uniforms,rc=st.__cache;at.bindBuffer(at.UNIFORM_BUFFER,ot);for(let Hl=0,sc=ut.length;Hl<sc;Hl++){const st=Array.isArray(ut[Hl])?ut[Hl]:[ut[Hl]];for(let ot=0,ut=st.length;ot<ut;ot++){const ut=st[ot];if(!0===hasUniformChanged(ut,Hl,ot,rc)){const st=ut.__offset,ot=Array.isArray(ut.value)?ut.value:[ut.value];let Hl=0;for(let rc=0;rc<ot.length;rc++){const sc=ot[rc],oc=getUniformSize(sc);"number"===typeof sc||"boolean"===typeof sc?(ut.__data[0]=sc,at.bufferSubData(at.UNIFORM_BUFFER,st+Hl,ut.__data)):sc.isMatrix3?(ut.__data[0]=sc.elements[0],ut.__data[1]=sc.elements[1],ut.__data[2]=sc.elements[2],ut.__data[3]=0,ut.__data[4]=sc.elements[3],ut.__data[5]=sc.elements[4],ut.__data[6]=sc.elements[5],ut.__data[7]=0,ut.__data[8]=sc.elements[6],ut.__data[9]=sc.elements[7],ut.__data[10]=sc.elements[8],ut.__data[11]=0):(sc.toArray(ut.__data,Hl),Hl+=oc.storage/Float32Array.BYTES_PER_ELEMENT)}at.bufferSubData(at.UNIFORM_BUFFER,st,ut.__data)}}}at.bindBuffer(at.UNIFORM_BUFFER,null)}(ot),rc[ot.id]=iu)},dispose:function(){for(const st in Hl)at.deleteBuffer(Hl[st]);sc=[],Hl={},rc={}}}}class WebGLRenderer{constructor(at){void 0===at&&(at={});const{canvas:st=(0,ut.lPF)(),context:ot=null,depth:Hl=!0,stencil:rc=!1,alpha:sc=!1,antialias:oc=!1,premultipliedAlpha:_c=!0,preserveDrawingBuffer:wc=!1,powerPreference:Sc="default",failIfMajorPerformanceCaveat:iu=!1,reverseDepthBuffer:su=!1}=at;let lu;if(this.isWebGLRenderer=!0,null!==ot){if("undefined"!==typeof WebGLRenderingContext&&ot instanceof WebGLRenderingContext)throw new Error("THREE.WebGLRenderer: WebGL 1 is not supported since r163.");lu=ot.getContextAttributes().alpha}else lu=sc;const cu=new Uint32Array(4),uu=new Int32Array(4);let pu=null,mu=null;const gu=[],Au=[];this.domElement=st,this.debug={checkShaderErrors:!0,onShaderError:null},this.autoClear=!0,this.autoClearColor=!0,this.autoClearDepth=!0,this.autoClearStencil=!0,this.sortObjects=!0,this.clippingPlanes=[],this.localClippingEnabled=!1,this.toneMapping=ut.y_p,this.toneMappingExposure=1,this.transmissionResolutionScale=1;const yu=this;let _u=!1;this._outputColorSpace=ut.er$;let xu=0,Su=0,Du=null,Lu=-1,$u=null;const hh=new ut.IUQ,ed=new ut.IUQ;let td=null;const id=new ut.Q1f(0);let nd=0,rd=st.width,ad=st.height,sd=1,od=null,ld=null;const cd=new ut.IUQ(0,0,rd,ad),ud=new ut.IUQ(0,0,rd,ad);let hd=!1;const dd=new ut.PPD;let pd=!1,md=!1;const fd=new ut.kn4,gd=new ut.kn4,Ad=new ut.Pq0,yd=new ut.IUQ,vd={background:null,fog:null,environment:null,overrideMaterial:null,isScene:!0};let _d=!1;function getTargetPixelRatio(){return null===Du?sd:1}let xd,bd,wd,Ed,Md,Sd,Td,Cd,kd,Id,Dd,Ld,Pd,zd,Nd,Rd,Od,Bd,Fd,jd,Ud,Vd,Gd,Zd,Hd=ot;function getContext(at,ot){return st.getContext(at,ot)}try{const at={alpha:!0,depth:Hl,stencil:rc,antialias:oc,premultipliedAlpha:_c,preserveDrawingBuffer:wc,powerPreference:Sc,failIfMajorPerformanceCaveat:iu};if("setAttribute"in st&&st.setAttribute("data-engine",`three.js r${ut.sPf}`),st.addEventListener("webglcontextlost",onContextLost,!1),st.addEventListener("webglcontextrestored",onContextRestore,!1),st.addEventListener("webglcontextcreationerror",onContextCreationError,!1),null===Hd){const st="webgl2";if(Hd=getContext(st,at),null===Hd)throw getContext(st)?new Error("Error creating WebGL context with your selected attributes."):new Error("Error creating WebGL context.")}}catch(Jd){throw console.error("THREE.WebGLRenderer: "+Jd.message),Jd}function initGLContext(){xd=new WebGLExtensions(Hd),xd.init(),Vd=new WebGLUtils(Hd,xd),bd=new WebGLCapabilities(Hd,xd,at,Vd),wd=new WebGLState(Hd,xd),bd.reverseDepthBuffer&&su&&wd.buffers.depth.setReversed(!0),Ed=new WebGLInfo(Hd),Md=new WebGLProperties,Sd=new WebGLTextures(Hd,xd,wd,Md,bd,Vd,Ed),Td=new WebGLCubeMaps(yu),Cd=new WebGLCubeUVMaps(yu),kd=new WebGLAttributes(Hd),Gd=new WebGLBindingStates(Hd,kd),Id=new WebGLGeometries(Hd,kd,Ed,Gd),Dd=new WebGLObjects(Hd,Id,kd,Ed),Fd=new WebGLMorphtargets(Hd,bd,Sd),Rd=new WebGLClipping(Md),Ld=new WebGLPrograms(yu,Td,Cd,xd,bd,Gd,Rd),Pd=new WebGLMaterials(yu,Md),zd=new WebGLRenderLists,Nd=new WebGLRenderStates(xd),Bd=new WebGLBackground(yu,Td,Cd,wd,Dd,lu,_c),Od=new WebGLShadowMap(yu,Dd,bd),Zd=new WebGLUniformsGroups(Hd,Ed,bd,wd),jd=new WebGLBufferRenderer(Hd,xd,Ed),Ud=new WebGLIndexedBufferRenderer(Hd,xd,Ed),Ed.programs=Ld.programs,yu.capabilities=bd,yu.extensions=xd,yu.properties=Md,yu.renderLists=zd,yu.shadowMap=Od,yu.state=wd,yu.info=Ed}initGLContext();const Wd=new WebXRManager(yu,Hd);function onContextLost(at){at.preventDefault(),console.log("THREE.WebGLRenderer: Context Lost."),_u=!0}function onContextRestore(){console.log("THREE.WebGLRenderer: Context Restored."),_u=!1;const at=Ed.autoReset,st=Od.enabled,ot=Od.autoUpdate,ut=Od.needsUpdate,Hl=Od.type;initGLContext(),Ed.autoReset=at,Od.enabled=st,Od.autoUpdate=ot,Od.needsUpdate=ut,Od.type=Hl}function onContextCreationError(at){console.error("THREE.WebGLRenderer: A WebGL context could not be created. Reason: ",at.statusMessage)}function onMaterialDispose(at){const st=at.target;st.removeEventListener("dispose",onMaterialDispose),function(at){(function(at){const st=Md.get(at).programs;void 0!==st&&(st.forEach((function(at){Ld.releaseProgram(at)})),at.isShaderMaterial&&Ld.releaseShaderCache(at))})(at),Md.remove(at)}(st)}function prepareMaterial(at,st,ot){!0===at.transparent&&at.side===ut.$EB&&!1===at.forceSinglePass?(at.side=ut.hsX,at.needsUpdate=!0,getProgram(at,st,ot),at.side=ut.hB5,at.needsUpdate=!0,getProgram(at,st,ot),at.side=ut.$EB):getProgram(at,st,ot)}this.xr=Wd,this.getContext=function(){return Hd},this.getContextAttributes=function(){return Hd.getContextAttributes()},this.forceContextLoss=function(){const at=xd.get("WEBGL_lose_context");at&&at.loseContext()},this.forceContextRestore=function(){const at=xd.get("WEBGL_lose_context");at&&at.restoreContext()},this.getPixelRatio=function(){return sd},this.setPixelRatio=function(at){void 0!==at&&(sd=at,this.setSize(rd,ad,!1))},this.getSize=function(at){return at.set(rd,ad)},this.setSize=function(at,ot,ut){void 0===ut&&(ut=!0),Wd.isPresenting?console.warn("THREE.WebGLRenderer: Can't change size while VR device is presenting."):(rd=at,ad=ot,st.width=Math.floor(at*sd),st.height=Math.floor(ot*sd),!0===ut&&(st.style.width=at+"px",st.style.height=ot+"px"),this.setViewport(0,0,at,ot))},this.getDrawingBufferSize=function(at){return at.set(rd*sd,ad*sd).floor()},this.setDrawingBufferSize=function(at,ot,ut){rd=at,ad=ot,sd=ut,st.width=Math.floor(at*ut),st.height=Math.floor(ot*ut),this.setViewport(0,0,at,ot)},this.getCurrentViewport=function(at){return at.copy(hh)},this.getViewport=function(at){return at.copy(cd)},this.setViewport=function(at,st,ot,ut){at.isVector4?cd.set(at.x,at.y,at.z,at.w):cd.set(at,st,ot,ut),wd.viewport(hh.copy(cd).multiplyScalar(sd).round())},this.getScissor=function(at){return at.copy(ud)},this.setScissor=function(at,st,ot,ut){at.isVector4?ud.set(at.x,at.y,at.z,at.w):ud.set(at,st,ot,ut),wd.scissor(ed.copy(ud).multiplyScalar(sd).round())},this.getScissorTest=function(){return hd},this.setScissorTest=function(at){wd.setScissorTest(hd=at)},this.setOpaqueSort=function(at){od=at},this.setTransparentSort=function(at){ld=at},this.getClearColor=function(at){return at.copy(Bd.getClearColor())},this.setClearColor=function(){Bd.setClearColor(...arguments)},this.getClearAlpha=function(){return Bd.getClearAlpha()},this.setClearAlpha=function(){Bd.setClearAlpha(...arguments)},this.clear=function(at,st,ot){void 0===at&&(at=!0),void 0===st&&(st=!0),void 0===ot&&(ot=!0);let Hl=0;if(at){let at=!1;if(null!==Du){const st=Du.texture.format;at=st===ut.c90||st===ut.TkQ||st===ut.ZQM}if(at){const at=Du.texture.type,st=at===ut.OUM||at===ut.bkx||at===ut.cHt||at===ut.V3x||at===ut.Wew||at===ut.gJ2,ot=Bd.getClearColor(),Hl=Bd.getClearAlpha(),rc=ot.r,sc=ot.g,oc=ot.b;st?(cu[0]=rc,cu[1]=sc,cu[2]=oc,cu[3]=Hl,Hd.clearBufferuiv(Hd.COLOR,0,cu)):(uu[0]=rc,uu[1]=sc,uu[2]=oc,uu[3]=Hl,Hd.clearBufferiv(Hd.COLOR,0,uu))}else Hl|=Hd.COLOR_BUFFER_BIT}st&&(Hl|=Hd.DEPTH_BUFFER_BIT),ot&&(Hl|=Hd.STENCIL_BUFFER_BIT,this.state.buffers.stencil.setMask(4294967295)),Hd.clear(Hl)},this.clearColor=function(){this.clear(!0,!1,!1)},this.clearDepth=function(){this.clear(!1,!0,!1)},this.clearStencil=function(){this.clear(!1,!1,!0)},this.dispose=function(){st.removeEventListener("webglcontextlost",onContextLost,!1),st.removeEventListener("webglcontextrestored",onContextRestore,!1),st.removeEventListener("webglcontextcreationerror",onContextCreationError,!1),Bd.dispose(),zd.dispose(),Nd.dispose(),Md.dispose(),Td.dispose(),Cd.dispose(),Dd.dispose(),Gd.dispose(),Zd.dispose(),Ld.dispose(),Wd.dispose(),Wd.removeEventListener("sessionstart",onXRSessionStart),Wd.removeEventListener("sessionend",onXRSessionEnd),Yd.stop()},this.renderBufferDirect=function(at,st,ot,Hl,rc,sc){null===st&&(st=vd);const oc=rc.isMesh&&rc.matrixWorld.determinant()<0,_c=function(at,st,ot,Hl,rc){!0!==st.isScene&&(st=vd);Sd.resetTextureUnits();const sc=st.fog,oc=Hl.isMeshStandardMaterial?st.environment:null,_c=null===Du?yu.outputColorSpace:!0===Du.isXRRenderTarget?Du.texture.colorSpace:ut.Zr2,wc=(Hl.isMeshStandardMaterial?Cd:Td).get(Hl.envMap||oc),Sc=!0===Hl.vertexColors&&!!ot.attributes.color&&4===ot.attributes.color.itemSize,iu=!!ot.attributes.tangent&&(!!Hl.normalMap||Hl.anisotropy>0),su=!!ot.morphAttributes.position,lu=!!ot.morphAttributes.normal,cu=!!ot.morphAttributes.color;let uu=ut.y_p;Hl.toneMapped&&(null!==Du&&!0!==Du.isXRRenderTarget||(uu=yu.toneMapping));const pu=ot.morphAttributes.position||ot.morphAttributes.normal||ot.morphAttributes.color,gu=void 0!==pu?pu.length:0,Au=Md.get(Hl),_u=mu.state.lights;if(!0===pd&&(!0===md||at!==$u)){const st=at===$u&&Hl.id===Lu;Rd.setState(Hl,at,st)}let xu=!1;Hl.version===Au.__version?Au.needsLights&&Au.lightsStateVersion!==_u.state.version||Au.outputColorSpace!==_c||rc.isBatchedMesh&&!1===Au.batching?xu=!0:rc.isBatchedMesh||!0!==Au.batching?rc.isBatchedMesh&&!0===Au.batchingColor&&null===rc.colorTexture||rc.isBatchedMesh&&!1===Au.batchingColor&&null!==rc.colorTexture||rc.isInstancedMesh&&!1===Au.instancing?xu=!0:rc.isInstancedMesh||!0!==Au.instancing?rc.isSkinnedMesh&&!1===Au.skinning?xu=!0:rc.isSkinnedMesh||!0!==Au.skinning?rc.isInstancedMesh&&!0===Au.instancingColor&&null===rc.instanceColor||rc.isInstancedMesh&&!1===Au.instancingColor&&null!==rc.instanceColor||rc.isInstancedMesh&&!0===Au.instancingMorph&&null===rc.morphTexture||rc.isInstancedMesh&&!1===Au.instancingMorph&&null!==rc.morphTexture||Au.envMap!==wc||!0===Hl.fog&&Au.fog!==sc?xu=!0:void 0===Au.numClippingPlanes||Au.numClippingPlanes===Rd.numPlanes&&Au.numIntersection===Rd.numIntersection?(Au.vertexAlphas!==Sc||Au.vertexTangents!==iu||Au.morphTargets!==su||Au.morphNormals!==lu||Au.morphColors!==cu||Au.toneMapping!==uu||Au.morphTargetsCount!==gu)&&(xu=!0):xu=!0:xu=!0:xu=!0:xu=!0:(xu=!0,Au.__version=Hl.version);let Su=Au.currentProgram;!0===xu&&(Su=getProgram(Hl,st,rc));let hh=!1,ed=!1,td=!1;const id=Su.getUniforms(),nd=Au.uniforms;wd.useProgram(Su.program)&&(hh=!0,ed=!0,td=!0);Hl.id!==Lu&&(Lu=Hl.id,ed=!0);if(hh||$u!==at){wd.buffers.depth.getReversed()?(fd.copy(at.projectionMatrix),(0,ut.xiE)(fd),(0,ut.Mmk)(fd),id.setValue(Hd,"projectionMatrix",fd)):id.setValue(Hd,"projectionMatrix",at.projectionMatrix),id.setValue(Hd,"viewMatrix",at.matrixWorldInverse);const st=id.map.cameraPosition;void 0!==st&&st.setValue(Hd,Ad.setFromMatrixPosition(at.matrixWorld)),bd.logarithmicDepthBuffer&&id.setValue(Hd,"logDepthBufFC",2/(Math.log(at.far+1)/Math.LN2)),(Hl.isMeshPhongMaterial||Hl.isMeshToonMaterial||Hl.isMeshLambertMaterial||Hl.isMeshBasicMaterial||Hl.isMeshStandardMaterial||Hl.isShaderMaterial)&&id.setValue(Hd,"isOrthographic",!0===at.isOrthographicCamera),$u!==at&&($u=at,ed=!0,td=!0)}if(rc.isSkinnedMesh){id.setOptional(Hd,rc,"bindMatrix"),id.setOptional(Hd,rc,"bindMatrixInverse");const at=rc.skeleton;at&&(null===at.boneTexture&&at.computeBoneTexture(),id.setValue(Hd,"boneTexture",at.boneTexture,Sd))}rc.isBatchedMesh&&(id.setOptional(Hd,rc,"batchingTexture"),id.setValue(Hd,"batchingTexture",rc._matricesTexture,Sd),id.setOptional(Hd,rc,"batchingIdTexture"),id.setValue(Hd,"batchingIdTexture",rc._indirectTexture,Sd),id.setOptional(Hd,rc,"batchingColorTexture"),null!==rc._colorsTexture&&id.setValue(Hd,"batchingColorTexture",rc._colorsTexture,Sd));const rd=ot.morphAttributes;void 0===rd.position&&void 0===rd.normal&&void 0===rd.color||Fd.update(rc,ot,Su);(ed||Au.receiveShadow!==rc.receiveShadow)&&(Au.receiveShadow=rc.receiveShadow,id.setValue(Hd,"receiveShadow",rc.receiveShadow));Hl.isMeshGouraudMaterial&&null!==Hl.envMap&&(nd.envMap.value=wc,nd.flipEnvMap.value=wc.isCubeTexture&&!1===wc.isRenderTargetTexture?-1:1);Hl.isMeshStandardMaterial&&null===Hl.envMap&&null!==st.environment&&(nd.envMapIntensity.value=st.environmentIntensity);ed&&(id.setValue(Hd,"toneMappingExposure",yu.toneMappingExposure),Au.needsLights&&(ld=td,(od=nd).ambientLightColor.needsUpdate=ld,od.lightProbe.needsUpdate=ld,od.directionalLights.needsUpdate=ld,od.directionalLightShadows.needsUpdate=ld,od.pointLights.needsUpdate=ld,od.pointLightShadows.needsUpdate=ld,od.spotLights.needsUpdate=ld,od.spotLightShadows.needsUpdate=ld,od.rectAreaLights.needsUpdate=ld,od.hemisphereLights.needsUpdate=ld),sc&&!0===Hl.fog&&Pd.refreshFogUniforms(nd,sc),Pd.refreshMaterialUniforms(nd,Hl,sd,ad,mu.state.transmissionRenderTarget[at.id]),WebGLUniforms.upload(Hd,getUniformList(Au),nd,Sd));var od,ld;Hl.isShaderMaterial&&!0===Hl.uniformsNeedUpdate&&(WebGLUniforms.upload(Hd,getUniformList(Au),nd,Sd),Hl.uniformsNeedUpdate=!1);Hl.isSpriteMaterial&&id.setValue(Hd,"center",rc.center);if(id.setValue(Hd,"modelViewMatrix",rc.modelViewMatrix),id.setValue(Hd,"normalMatrix",rc.normalMatrix),id.setValue(Hd,"modelMatrix",rc.matrixWorld),Hl.isShaderMaterial||Hl.isRawShaderMaterial){const at=Hl.uniformsGroups;for(let st=0,ot=at.length;st<ot;st++){const ot=at[st];Zd.update(ot,Su),Zd.bind(ot,Su)}}return Su}(at,st,ot,Hl,rc);wd.setMaterial(Hl,oc);let wc=ot.index,Sc=1;if(!0===Hl.wireframe){if(wc=Id.getWireframeAttribute(ot),void 0===wc)return;Sc=2}const iu=ot.drawRange,su=ot.attributes.position;let lu=iu.start*Sc,cu=(iu.start+iu.count)*Sc;null!==sc&&(lu=Math.max(lu,sc.start*Sc),cu=Math.min(cu,(sc.start+sc.count)*Sc)),null!==wc?(lu=Math.max(lu,0),cu=Math.min(cu,wc.count)):void 0!==su&&null!==su&&(lu=Math.max(lu,0),cu=Math.min(cu,su.count));const uu=cu-lu;if(uu<0||uu===1/0)return;let pu;Gd.setup(rc,Hl,_c,ot,wc);let gu=jd;if(null!==wc&&(pu=kd.get(wc),gu=Ud,gu.setIndex(pu)),rc.isMesh)!0===Hl.wireframe?(wd.setLineWidth(Hl.wireframeLinewidth*getTargetPixelRatio()),gu.setMode(Hd.LINES)):gu.setMode(Hd.TRIANGLES);else if(rc.isLine){let at=Hl.linewidth;void 0===at&&(at=1),wd.setLineWidth(at*getTargetPixelRatio()),rc.isLineSegments?gu.setMode(Hd.LINES):rc.isLineLoop?gu.setMode(Hd.LINE_LOOP):gu.setMode(Hd.LINE_STRIP)}else rc.isPoints?gu.setMode(Hd.POINTS):rc.isSprite&&gu.setMode(Hd.TRIANGLES);if(rc.isBatchedMesh)if(null!==rc._multiDrawInstances)(0,ut.mcG)("THREE.WebGLRenderer: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection."),gu.renderMultiDrawInstances(rc._multiDrawStarts,rc._multiDrawCounts,rc._multiDrawCount,rc._multiDrawInstances);else if(xd.get("WEBGL_multi_draw"))gu.renderMultiDraw(rc._multiDrawStarts,rc._multiDrawCounts,rc._multiDrawCount);else{const at=rc._multiDrawStarts,st=rc._multiDrawCounts,ot=rc._multiDrawCount,ut=wc?kd.get(wc).bytesPerElement:1,sc=Md.get(Hl).currentProgram.getUniforms();for(let Hl=0;Hl<ot;Hl++)sc.setValue(Hd,"_gl_DrawID",Hl),gu.render(at[Hl]/ut,st[Hl])}else if(rc.isInstancedMesh)gu.renderInstances(lu,uu,rc.count);else if(ot.isInstancedBufferGeometry){const at=void 0!==ot._maxInstanceCount?ot._maxInstanceCount:1/0,st=Math.min(ot.instanceCount,at);gu.renderInstances(lu,uu,st)}else gu.render(lu,uu)},this.compile=function(at,st,ot){void 0===ot&&(ot=null),null===ot&&(ot=at),mu=Nd.get(ot),mu.init(st),Au.push(mu),ot.traverseVisible((function(at){at.isLight&&at.layers.test(st.layers)&&(mu.pushLight(at),at.castShadow&&mu.pushShadow(at))})),at!==ot&&at.traverseVisible((function(at){at.isLight&&at.layers.test(st.layers)&&(mu.pushLight(at),at.castShadow&&mu.pushShadow(at))})),mu.setupLights();const ut=new Set;return at.traverse((function(at){if(!(at.isMesh||at.isPoints||at.isLine||at.isSprite))return;const st=at.material;if(st)if(Array.isArray(st))for(let Hl=0;Hl<st.length;Hl++){const rc=st[Hl];prepareMaterial(rc,ot,at),ut.add(rc)}else prepareMaterial(st,ot,at),ut.add(st)})),mu=Au.pop(),ut},this.compileAsync=function(at,st,ot){void 0===ot&&(ot=null);const ut=this.compile(at,st,ot);return new Promise((st=>{function checkMaterialsReady(){ut.forEach((function(at){Md.get(at).currentProgram.isReady()&&ut.delete(at)})),0!==ut.size?setTimeout(checkMaterialsReady,10):st(at)}null!==xd.get("KHR_parallel_shader_compile")?checkMaterialsReady():setTimeout(checkMaterialsReady,10)}))};let qd=null;function onXRSessionStart(){Yd.stop()}function onXRSessionEnd(){Yd.start()}const Yd=new WebGLAnimation;function projectObject(at,st,ot,ut){if(!1===at.visible)return;if(at.layers.test(st.layers))if(at.isGroup)ot=at.renderOrder;else if(at.isLOD)!0===at.autoUpdate&&at.update(st);else if(at.isLight)mu.pushLight(at),at.castShadow&&mu.pushShadow(at);else if(at.isSprite){if(!at.frustumCulled||dd.intersectsSprite(at)){ut&&yd.setFromMatrixPosition(at.matrixWorld).applyMatrix4(gd);const st=Dd.update(at),Hl=at.material;Hl.visible&&pu.push(at,st,Hl,ot,yd.z,null)}}else if((at.isMesh||at.isLine||at.isPoints)&&(!at.frustumCulled||dd.intersectsObject(at))){const st=Dd.update(at),Hl=at.material;if(ut&&(void 0!==at.boundingSphere?(null===at.boundingSphere&&at.computeBoundingSphere(),yd.copy(at.boundingSphere.center)):(null===st.boundingSphere&&st.computeBoundingSphere(),yd.copy(st.boundingSphere.center)),yd.applyMatrix4(at.matrixWorld).applyMatrix4(gd)),Array.isArray(Hl)){const ut=st.groups;for(let rc=0,sc=ut.length;rc<sc;rc++){const sc=ut[rc],oc=Hl[sc.materialIndex];oc&&oc.visible&&pu.push(at,st,oc,ot,yd.z,sc)}}else Hl.visible&&pu.push(at,st,Hl,ot,yd.z,null)}const Hl=at.children;for(let rc=0,sc=Hl.length;rc<sc;rc++)projectObject(Hl[rc],st,ot,ut)}function renderScene(at,st,ot,ut){const Hl=at.opaque,rc=at.transmissive,sc=at.transparent;mu.setupLightsView(ot),!0===pd&&Rd.setGlobalState(yu.clippingPlanes,ot),ut&&wd.viewport(hh.copy(ut)),Hl.length>0&&renderObjects(Hl,st,ot),rc.length>0&&renderObjects(rc,st,ot),sc.length>0&&renderObjects(sc,st,ot),wd.buffers.depth.setTest(!0),wd.buffers.depth.setMask(!0),wd.buffers.color.setMask(!0),wd.setPolygonOffset(!1)}function renderTransmissionPass(at,st,ot,Hl){if(null!==(!0===ot.isScene?ot.overrideMaterial:null))return;void 0===mu.state.transmissionRenderTarget[Hl.id]&&(mu.state.transmissionRenderTarget[Hl.id]=new ut.nWS(1,1,{generateMipmaps:!0,type:xd.has("EXT_color_buffer_half_float")||xd.has("EXT_color_buffer_float")?ut.ix0:ut.OUM,minFilter:ut.$_I,samples:4,stencilBuffer:rc,resolveDepthBuffer:!1,resolveStencilBuffer:!1,colorSpace:ut.ppV.workingColorSpace}));const sc=mu.state.transmissionRenderTarget[Hl.id],oc=Hl.viewport||hh;sc.setSize(oc.z*yu.transmissionResolutionScale,oc.w*yu.transmissionResolutionScale);const _c=yu.getRenderTarget();yu.setRenderTarget(sc),yu.getClearColor(id),nd=yu.getClearAlpha(),nd<1&&yu.setClearColor(16777215,.5),yu.clear(),_d&&Bd.render(ot);const wc=yu.toneMapping;yu.toneMapping=ut.y_p;const Sc=Hl.viewport;if(void 0!==Hl.viewport&&(Hl.viewport=void 0),mu.setupLightsView(Hl),!0===pd&&Rd.setGlobalState(yu.clippingPlanes,Hl),renderObjects(at,ot,Hl),Sd.updateMultisampleRenderTarget(sc),Sd.updateRenderTargetMipmap(sc),!1===xd.has("WEBGL_multisampled_render_to_texture")){let at=!1;for(let rc=0,sc=st.length;rc<sc;rc++){const sc=st[rc],oc=sc.object,_c=sc.geometry,wc=sc.material,Sc=sc.group;if(wc.side===ut.$EB&&oc.layers.test(Hl.layers)){const st=wc.side;wc.side=ut.hsX,wc.needsUpdate=!0,renderObject(oc,ot,Hl,_c,wc,Sc),wc.side=st,wc.needsUpdate=!0,at=!0}}!0===at&&(Sd.updateMultisampleRenderTarget(sc),Sd.updateRenderTargetMipmap(sc))}yu.setRenderTarget(_c),yu.setClearColor(id,nd),void 0!==Sc&&(Hl.viewport=Sc),yu.toneMapping=wc}function renderObjects(at,st,ot){const ut=!0===st.isScene?st.overrideMaterial:null;for(let Hl=0,rc=at.length;Hl<rc;Hl++){const rc=at[Hl],sc=rc.object,oc=rc.geometry,_c=rc.group;let wc=rc.material;!0===wc.allowOverride&&null!==ut&&(wc=ut),sc.layers.test(ot.layers)&&renderObject(sc,st,ot,oc,wc,_c)}}function renderObject(at,st,ot,Hl,rc,sc){at.onBeforeRender(yu,st,ot,Hl,rc,sc),at.modelViewMatrix.multiplyMatrices(ot.matrixWorldInverse,at.matrixWorld),at.normalMatrix.getNormalMatrix(at.modelViewMatrix),rc.onBeforeRender(yu,st,ot,Hl,at,sc),!0===rc.transparent&&rc.side===ut.$EB&&!1===rc.forceSinglePass?(rc.side=ut.hsX,rc.needsUpdate=!0,yu.renderBufferDirect(ot,st,Hl,rc,at,sc),rc.side=ut.hB5,rc.needsUpdate=!0,yu.renderBufferDirect(ot,st,Hl,rc,at,sc),rc.side=ut.$EB):yu.renderBufferDirect(ot,st,Hl,rc,at,sc),at.onAfterRender(yu,st,ot,Hl,rc,sc)}function getProgram(at,st,ot){!0!==st.isScene&&(st=vd);const ut=Md.get(at),Hl=mu.state.lights,rc=mu.state.shadowsArray,sc=Hl.state.version,oc=Ld.getParameters(at,Hl.state,rc,st,ot),_c=Ld.getProgramCacheKey(oc);let wc=ut.programs;ut.environment=at.isMeshStandardMaterial?st.environment:null,ut.fog=st.fog,ut.envMap=(at.isMeshStandardMaterial?Cd:Td).get(at.envMap||ut.environment),ut.envMapRotation=null!==ut.environment&&null===at.envMap?st.environmentRotation:at.envMapRotation,void 0===wc&&(at.addEventListener("dispose",onMaterialDispose),wc=new Map,ut.programs=wc);let Sc=wc.get(_c);if(void 0!==Sc){if(ut.currentProgram===Sc&&ut.lightsStateVersion===sc)return updateCommonMaterialProperties(at,oc),Sc}else oc.uniforms=Ld.getUniforms(at),at.onBeforeCompile(oc,yu),Sc=Ld.acquireProgram(oc,_c),wc.set(_c,Sc),ut.uniforms=oc.uniforms;const iu=ut.uniforms;return(at.isShaderMaterial||at.isRawShaderMaterial)&&!0!==at.clipping||(iu.clippingPlanes=Rd.uniform),updateCommonMaterialProperties(at,oc),ut.needsLights=function(at){return at.isMeshLambertMaterial||at.isMeshToonMaterial||at.isMeshPhongMaterial||at.isMeshStandardMaterial||at.isShadowMaterial||at.isShaderMaterial&&!0===at.lights}(at),ut.lightsStateVersion=sc,ut.needsLights&&(iu.ambientLightColor.value=Hl.state.ambient,iu.lightProbe.value=Hl.state.probe,iu.directionalLights.value=Hl.state.directional,iu.directionalLightShadows.value=Hl.state.directionalShadow,iu.spotLights.value=Hl.state.spot,iu.spotLightShadows.value=Hl.state.spotShadow,iu.rectAreaLights.value=Hl.state.rectArea,iu.ltc_1.value=Hl.state.rectAreaLTC1,iu.ltc_2.value=Hl.state.rectAreaLTC2,iu.pointLights.value=Hl.state.point,iu.pointLightShadows.value=Hl.state.pointShadow,iu.hemisphereLights.value=Hl.state.hemi,iu.directionalShadowMap.value=Hl.state.directionalShadowMap,iu.directionalShadowMatrix.value=Hl.state.directionalShadowMatrix,iu.spotShadowMap.value=Hl.state.spotShadowMap,iu.spotLightMatrix.value=Hl.state.spotLightMatrix,iu.spotLightMap.value=Hl.state.spotLightMap,iu.pointShadowMap.value=Hl.state.pointShadowMap,iu.pointShadowMatrix.value=Hl.state.pointShadowMatrix),ut.currentProgram=Sc,ut.uniformsList=null,Sc}function getUniformList(at){if(null===at.uniformsList){const st=at.currentProgram.getUniforms();at.uniformsList=WebGLUniforms.seqWithValue(st.seq,at.uniforms)}return at.uniformsList}function updateCommonMaterialProperties(at,st){const ot=Md.get(at);ot.outputColorSpace=st.outputColorSpace,ot.batching=st.batching,ot.batchingColor=st.batchingColor,ot.instancing=st.instancing,ot.instancingColor=st.instancingColor,ot.instancingMorph=st.instancingMorph,ot.skinning=st.skinning,ot.morphTargets=st.morphTargets,ot.morphNormals=st.morphNormals,ot.morphColors=st.morphColors,ot.morphTargetsCount=st.morphTargetsCount,ot.numClippingPlanes=st.numClippingPlanes,ot.numIntersection=st.numClipIntersection,ot.vertexAlphas=st.vertexAlphas,ot.vertexTangents=st.vertexTangents,ot.toneMapping=st.toneMapping}Yd.setAnimationLoop((function(at){qd&&qd(at)})),"undefined"!==typeof self&&Yd.setContext(self),this.setAnimationLoop=function(at){qd=at,Wd.setAnimationLoop(at),null===at?Yd.stop():Yd.start()},Wd.addEventListener("sessionstart",onXRSessionStart),Wd.addEventListener("sessionend",onXRSessionEnd),this.render=function(at,st){if(void 0!==st&&!0!==st.isCamera)return void console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.");if(!0===_u)return;if(!0===at.matrixWorldAutoUpdate&&at.updateMatrixWorld(),null===st.parent&&!0===st.matrixWorldAutoUpdate&&st.updateMatrixWorld(),!0===Wd.enabled&&!0===Wd.isPresenting&&(!0===Wd.cameraAutoUpdate&&Wd.updateCamera(st),st=Wd.getCamera()),!0===at.isScene&&at.onBeforeRender(yu,at,st,Du),mu=Nd.get(at,Au.length),mu.init(st),Au.push(mu),gd.multiplyMatrices(st.projectionMatrix,st.matrixWorldInverse),dd.setFromProjectionMatrix(gd),md=this.localClippingEnabled,pd=Rd.init(this.clippingPlanes,md),pu=zd.get(at,gu.length),pu.init(),gu.push(pu),!0===Wd.enabled&&!0===Wd.isPresenting){const at=yu.xr.getDepthSensingMesh();null!==at&&projectObject(at,st,-1/0,yu.sortObjects)}projectObject(at,st,0,yu.sortObjects),pu.finish(),!0===yu.sortObjects&&pu.sort(od,ld),_d=!1===Wd.enabled||!1===Wd.isPresenting||!1===Wd.hasDepthSensing(),_d&&Bd.addToRenderList(pu,at),this.info.render.frame++,!0===pd&&Rd.beginShadows();const ot=mu.state.shadowsArray;Od.render(ot,at,st),!0===pd&&Rd.endShadows(),!0===this.info.autoReset&&this.info.reset();const ut=pu.opaque,Hl=pu.transmissive;if(mu.setupLights(),st.isArrayCamera){const ot=st.cameras;if(Hl.length>0)for(let st=0,rc=ot.length;st<rc;st++){renderTransmissionPass(ut,Hl,at,ot[st])}_d&&Bd.render(at);for(let st=0,ut=ot.length;st<ut;st++){const ut=ot[st];renderScene(pu,at,ut,ut.viewport)}}else Hl.length>0&&renderTransmissionPass(ut,Hl,at,st),_d&&Bd.render(at),renderScene(pu,at,st);null!==Du&&0===Su&&(Sd.updateMultisampleRenderTarget(Du),Sd.updateRenderTargetMipmap(Du)),!0===at.isScene&&at.onAfterRender(yu,at,st),Gd.resetDefaultState(),Lu=-1,$u=null,Au.pop(),Au.length>0?(mu=Au[Au.length-1],!0===pd&&Rd.setGlobalState(yu.clippingPlanes,mu.state.camera)):mu=null,gu.pop(),pu=gu.length>0?gu[gu.length-1]:null},this.getActiveCubeFace=function(){return xu},this.getActiveMipmapLevel=function(){return Su},this.getRenderTarget=function(){return Du},this.setRenderTargetTextures=function(at,st,ot){const ut=Md.get(at);ut.__autoAllocateDepthBuffer=!1===at.resolveDepthBuffer,!1===ut.__autoAllocateDepthBuffer&&(ut.__useRenderToTexture=!1),Md.get(at.texture).__webglTexture=st,Md.get(at.depthTexture).__webglTexture=ut.__autoAllocateDepthBuffer?void 0:ot,ut.__hasExternalTextures=!0},this.setRenderTargetFramebuffer=function(at,st){const ot=Md.get(at);ot.__webglFramebuffer=st,ot.__useDefaultFramebuffer=void 0===st};const Qd=Hd.createFramebuffer();this.setRenderTarget=function(at,st,ot){void 0===st&&(st=0),void 0===ot&&(ot=0),Du=at,xu=st,Su=ot;let ut=!0,Hl=null,rc=!1,sc=!1;if(at){const oc=Md.get(at);if(void 0!==oc.__useDefaultFramebuffer)wd.bindFramebuffer(Hd.FRAMEBUFFER,null),ut=!1;else if(void 0===oc.__webglFramebuffer)Sd.setupRenderTarget(at);else if(oc.__hasExternalTextures)Sd.rebindTextures(at,Md.get(at.texture).__webglTexture,Md.get(at.depthTexture).__webglTexture);else if(at.depthBuffer){const st=at.depthTexture;if(oc.__boundDepthTexture!==st){if(null!==st&&Md.has(st)&&(at.width!==st.image.width||at.height!==st.image.height))throw new Error("WebGLRenderTarget: Attached DepthTexture is initialized to the incorrect size.");Sd.setupDepthRenderbuffer(at)}}const _c=at.texture;(_c.isData3DTexture||_c.isDataArrayTexture||_c.isCompressedArrayTexture)&&(sc=!0);const wc=Md.get(at).__webglFramebuffer;at.isWebGLCubeRenderTarget?(Hl=Array.isArray(wc[st])?wc[st][ot]:wc[st],rc=!0):Hl=at.samples>0&&!1===Sd.useMultisampledRTT(at)?Md.get(at).__webglMultisampledFramebuffer:Array.isArray(wc)?wc[ot]:wc,hh.copy(at.viewport),ed.copy(at.scissor),td=at.scissorTest}else hh.copy(cd).multiplyScalar(sd).floor(),ed.copy(ud).multiplyScalar(sd).floor(),td=hd;0!==ot&&(Hl=Qd);if(wd.bindFramebuffer(Hd.FRAMEBUFFER,Hl)&&ut&&wd.drawBuffers(at,Hl),wd.viewport(hh),wd.scissor(ed),wd.setScissorTest(td),rc){const ut=Md.get(at.texture);Hd.framebufferTexture2D(Hd.FRAMEBUFFER,Hd.COLOR_ATTACHMENT0,Hd.TEXTURE_CUBE_MAP_POSITIVE_X+st,ut.__webglTexture,ot)}else if(sc){const ut=Md.get(at.texture),Hl=st;Hd.framebufferTextureLayer(Hd.FRAMEBUFFER,Hd.COLOR_ATTACHMENT0,ut.__webglTexture,ot,Hl)}else if(null!==at&&0!==ot){const st=Md.get(at.texture);Hd.framebufferTexture2D(Hd.FRAMEBUFFER,Hd.COLOR_ATTACHMENT0,Hd.TEXTURE_2D,st.__webglTexture,ot)}Lu=-1},this.readRenderTargetPixels=function(at,st,ot,ut,Hl,rc,sc){if(!at||!at.isWebGLRenderTarget)return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let oc=Md.get(at).__webglFramebuffer;if(at.isWebGLCubeRenderTarget&&void 0!==sc&&(oc=oc[sc]),oc){wd.bindFramebuffer(Hd.FRAMEBUFFER,oc);try{const sc=at.texture,oc=sc.format,_c=sc.type;if(!bd.textureFormatReadable(oc))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");if(!bd.textureTypeReadable(_c))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");st>=0&&st<=at.width-ut&&ot>=0&&ot<=at.height-Hl&&Hd.readPixels(st,ot,ut,Hl,Vd.convert(oc),Vd.convert(_c),rc)}finally{const at=null!==Du?Md.get(Du).__webglFramebuffer:null;wd.bindFramebuffer(Hd.FRAMEBUFFER,at)}}},this.readRenderTargetPixelsAsync=async function(at,st,ot,Hl,rc,sc,oc){if(!at||!at.isWebGLRenderTarget)throw new Error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let _c=Md.get(at).__webglFramebuffer;if(at.isWebGLCubeRenderTarget&&void 0!==oc&&(_c=_c[oc]),_c){if(st>=0&&st<=at.width-Hl&&ot>=0&&ot<=at.height-rc){wd.bindFramebuffer(Hd.FRAMEBUFFER,_c);const oc=at.texture,wc=oc.format,Sc=oc.type;if(!bd.textureFormatReadable(wc))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.");if(!bd.textureTypeReadable(Sc))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.");const iu=Hd.createBuffer();Hd.bindBuffer(Hd.PIXEL_PACK_BUFFER,iu),Hd.bufferData(Hd.PIXEL_PACK_BUFFER,sc.byteLength,Hd.STREAM_READ),Hd.readPixels(st,ot,Hl,rc,Vd.convert(wc),Vd.convert(Sc),0);const su=null!==Du?Md.get(Du).__webglFramebuffer:null;wd.bindFramebuffer(Hd.FRAMEBUFFER,su);const lu=Hd.fenceSync(Hd.SYNC_GPU_COMMANDS_COMPLETE,0);return Hd.flush(),await(0,ut.jej)(Hd,lu,4),Hd.bindBuffer(Hd.PIXEL_PACK_BUFFER,iu),Hd.getBufferSubData(Hd.PIXEL_PACK_BUFFER,0,sc),Hd.deleteBuffer(iu),Hd.deleteSync(lu),sc}throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.")}},this.copyFramebufferToTexture=function(at,st,ot){void 0===st&&(st=null),void 0===ot&&(ot=0);const ut=Math.pow(2,-ot),Hl=Math.floor(at.image.width*ut),rc=Math.floor(at.image.height*ut),sc=null!==st?st.x:0,oc=null!==st?st.y:0;Sd.setTexture2D(at,0),Hd.copyTexSubImage2D(Hd.TEXTURE_2D,ot,0,0,sc,oc,Hl,rc),wd.unbindTexture()};const Xd=Hd.createFramebuffer(),Kd=Hd.createFramebuffer();this.copyTextureToTexture=function(at,st,ot,Hl,rc,sc){let oc,_c,wc,Sc,iu,su,lu,cu,uu;void 0===ot&&(ot=null),void 0===Hl&&(Hl=null),void 0===rc&&(rc=0),void 0===sc&&(sc=null),null===sc&&(0!==rc?((0,ut.mcG)("WebGLRenderer: copyTextureToTexture function signature has changed to support src and dst mipmap levels."),sc=rc,rc=0):sc=0);const pu=at.isCompressedTexture?at.mipmaps[sc]:at.image;if(null!==ot)oc=ot.max.x-ot.min.x,_c=ot.max.y-ot.min.y,wc=ot.isBox3?ot.max.z-ot.min.z:1,Sc=ot.min.x,iu=ot.min.y,su=ot.isBox3?ot.min.z:0;else{const st=Math.pow(2,-rc);oc=Math.floor(pu.width*st),_c=Math.floor(pu.height*st),wc=at.isDataArrayTexture?pu.depth:at.isData3DTexture?Math.floor(pu.depth*st):1,Sc=0,iu=0,su=0}null!==Hl?(lu=Hl.x,cu=Hl.y,uu=Hl.z):(lu=0,cu=0,uu=0);const mu=Vd.convert(st.format),gu=Vd.convert(st.type);let Au;st.isData3DTexture?(Sd.setTexture3D(st,0),Au=Hd.TEXTURE_3D):st.isDataArrayTexture||st.isCompressedArrayTexture?(Sd.setTexture2DArray(st,0),Au=Hd.TEXTURE_2D_ARRAY):(Sd.setTexture2D(st,0),Au=Hd.TEXTURE_2D),Hd.pixelStorei(Hd.UNPACK_FLIP_Y_WEBGL,st.flipY),Hd.pixelStorei(Hd.UNPACK_PREMULTIPLY_ALPHA_WEBGL,st.premultiplyAlpha),Hd.pixelStorei(Hd.UNPACK_ALIGNMENT,st.unpackAlignment);const yu=Hd.getParameter(Hd.UNPACK_ROW_LENGTH),_u=Hd.getParameter(Hd.UNPACK_IMAGE_HEIGHT),xu=Hd.getParameter(Hd.UNPACK_SKIP_PIXELS),Su=Hd.getParameter(Hd.UNPACK_SKIP_ROWS),Du=Hd.getParameter(Hd.UNPACK_SKIP_IMAGES);Hd.pixelStorei(Hd.UNPACK_ROW_LENGTH,pu.width),Hd.pixelStorei(Hd.UNPACK_IMAGE_HEIGHT,pu.height),Hd.pixelStorei(Hd.UNPACK_SKIP_PIXELS,Sc),Hd.pixelStorei(Hd.UNPACK_SKIP_ROWS,iu),Hd.pixelStorei(Hd.UNPACK_SKIP_IMAGES,su);const Lu=at.isDataArrayTexture||at.isData3DTexture,$u=st.isDataArrayTexture||st.isData3DTexture;if(at.isDepthTexture){const ot=Md.get(at),ut=Md.get(st),Hl=Md.get(ot.__renderTarget),pu=Md.get(ut.__renderTarget);wd.bindFramebuffer(Hd.READ_FRAMEBUFFER,Hl.__webglFramebuffer),wd.bindFramebuffer(Hd.DRAW_FRAMEBUFFER,pu.__webglFramebuffer);for(let mu=0;mu<wc;mu++)Lu&&(Hd.framebufferTextureLayer(Hd.READ_FRAMEBUFFER,Hd.COLOR_ATTACHMENT0,Md.get(at).__webglTexture,rc,su+mu),Hd.framebufferTextureLayer(Hd.DRAW_FRAMEBUFFER,Hd.COLOR_ATTACHMENT0,Md.get(st).__webglTexture,sc,uu+mu)),Hd.blitFramebuffer(Sc,iu,oc,_c,lu,cu,oc,_c,Hd.DEPTH_BUFFER_BIT,Hd.NEAREST);wd.bindFramebuffer(Hd.READ_FRAMEBUFFER,null),wd.bindFramebuffer(Hd.DRAW_FRAMEBUFFER,null)}else if(0!==rc||at.isRenderTargetTexture||Md.has(at)){const ot=Md.get(at),ut=Md.get(st);wd.bindFramebuffer(Hd.READ_FRAMEBUFFER,Xd),wd.bindFramebuffer(Hd.DRAW_FRAMEBUFFER,Kd);for(let at=0;at<wc;at++)Lu?Hd.framebufferTextureLayer(Hd.READ_FRAMEBUFFER,Hd.COLOR_ATTACHMENT0,ot.__webglTexture,rc,su+at):Hd.framebufferTexture2D(Hd.READ_FRAMEBUFFER,Hd.COLOR_ATTACHMENT0,Hd.TEXTURE_2D,ot.__webglTexture,rc),$u?Hd.framebufferTextureLayer(Hd.DRAW_FRAMEBUFFER,Hd.COLOR_ATTACHMENT0,ut.__webglTexture,sc,uu+at):Hd.framebufferTexture2D(Hd.DRAW_FRAMEBUFFER,Hd.COLOR_ATTACHMENT0,Hd.TEXTURE_2D,ut.__webglTexture,sc),0!==rc?Hd.blitFramebuffer(Sc,iu,oc,_c,lu,cu,oc,_c,Hd.COLOR_BUFFER_BIT,Hd.NEAREST):$u?Hd.copyTexSubImage3D(Au,sc,lu,cu,uu+at,Sc,iu,oc,_c):Hd.copyTexSubImage2D(Au,sc,lu,cu,Sc,iu,oc,_c);wd.bindFramebuffer(Hd.READ_FRAMEBUFFER,null),wd.bindFramebuffer(Hd.DRAW_FRAMEBUFFER,null)}else $u?at.isDataTexture||at.isData3DTexture?Hd.texSubImage3D(Au,sc,lu,cu,uu,oc,_c,wc,mu,gu,pu.data):st.isCompressedArrayTexture?Hd.compressedTexSubImage3D(Au,sc,lu,cu,uu,oc,_c,wc,mu,pu.data):Hd.texSubImage3D(Au,sc,lu,cu,uu,oc,_c,wc,mu,gu,pu):at.isDataTexture?Hd.texSubImage2D(Hd.TEXTURE_2D,sc,lu,cu,oc,_c,mu,gu,pu.data):at.isCompressedTexture?Hd.compressedTexSubImage2D(Hd.TEXTURE_2D,sc,lu,cu,pu.width,pu.height,mu,pu.data):Hd.texSubImage2D(Hd.TEXTURE_2D,sc,lu,cu,oc,_c,mu,gu,pu);Hd.pixelStorei(Hd.UNPACK_ROW_LENGTH,yu),Hd.pixelStorei(Hd.UNPACK_IMAGE_HEIGHT,_u),Hd.pixelStorei(Hd.UNPACK_SKIP_PIXELS,xu),Hd.pixelStorei(Hd.UNPACK_SKIP_ROWS,Su),Hd.pixelStorei(Hd.UNPACK_SKIP_IMAGES,Du),0===sc&&st.generateMipmaps&&Hd.generateMipmap(Au),wd.unbindTexture()},this.copyTextureToTexture3D=function(at,st,ot,Hl,rc){return void 0===ot&&(ot=null),void 0===Hl&&(Hl=null),void 0===rc&&(rc=0),(0,ut.mcG)('WebGLRenderer: copyTextureToTexture3D function has been deprecated. Use "copyTextureToTexture" instead.'),this.copyTextureToTexture(at,st,ot,Hl,rc)},this.initRenderTarget=function(at){void 0===Md.get(at).__webglFramebuffer&&Sd.setupRenderTarget(at)},this.initTexture=function(at){at.isCubeTexture?Sd.setTextureCube(at,0):at.isData3DTexture?Sd.setTexture3D(at,0):at.isDataArrayTexture||at.isCompressedArrayTexture?Sd.setTexture2DArray(at,0):Sd.setTexture2D(at,0),wd.unbindTexture()},this.resetState=function(){xu=0,Su=0,Du=null,wd.reset(),Gd.reset()},"undefined"!==typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}get coordinateSystem(){return ut.TdN}get outputColorSpace(){return this._outputColorSpace}set outputColorSpace(at){this._outputColorSpace=at;const st=this.getContext();st.drawingBufferColorSpace=ut.ppV._getDrawingBufferColorSpace(at),st.unpackColorSpace=ut.ppV._getUnpackColorSpace()}}},8330:at=>{"use strict";at.exports=JSON.parse('{"rE":"4.1.0","Jk":{"O":"https://gitlab.com/panoramax/clients/web-viewer"}}')},4149:at=>{"use strict";at.exports=JSON.parse('{"maplibre":{"GeolocateControl.LocationNotAvailable":"Placering ikke tilg\xe6ngelig","GeolocateControl.FindMyLocation":"Find min placering"},"pnx":{"minimize":"Skjul dette modul, du kan vise det igen ved hj\xe6lp af knappen i nederste venstre hj\xf8rne","share_embed_docs":"L\xe6s mere om indlejringskonfiguration","zoom":"Zoom","zoomOut":"Zoom ud","zoomIn":"Zoom ind","moveUp":"Ryk opad","moveDown":"Ryk nedad","moveLeft":"Ryk til venstre","moveRight":"Ryk til h\xf8jre","moveMiddle":"Centreret visning","expand":"Udvid","expand_info":"F\xe5 modulet til at blive vist p\xe5 hele siden","show_psv":"Vis billedfremviseren","show_map":"Vis kortet","options":"Valgmuligheder","filters":"Filtre","layers":"Lag","search":"S\xf8g","search_empty":"Ingen resultater fundet","search_user":"S\xf8g efter et brugernavn\u2026","share":"Del","share_links":"Links","share_page":"Link til dette billede","share_image":"HD-billede","share_rss":"RSS-feed","share_rss_title":"RSS-feed med nye sekvenser i det aktuelt synlige kortomr\xe5de","share_embed":"Indlejr p\xe5 din hjemmeside","share_print":"Udskriv","copy":"Kopi\xe9r","copied":"Kopieret","error_retry":"Pr\xf8v igen senere","sequence_next":"N\xe6ste billede i sekvensen","sequence_play":"Afspil denne sekvens","sequence_more":"Flere afspilningsmuligheder","sequence_speed":"Afspillerens hastighed","legend_license":"Licens: {l}","legend_title":"Vis detaljer om billedet","error_click":"Forts\xe6t","error":"Vi har et problem\u2026","search_address":"S\xf8g efter en adresse, by\u2026","sequence_pause":"S\xe6t sekvensen p\xe5 pause","sequence_prev":"Forrige billede i sekvensen","loading_labels_serious":["\ud83d\uddfa\ufe0f Indl\xe6ser kortdata","\ud83d\udda5\ufe0f Anmoder API","\ud83d\uddbc\ufe0f Indl\xe6ser thumbnails","\ud83d\udd0d Analyserer EXIF-metadata","\ud83c\udfd8\ufe0f 3D-rendering","\ud83d\udcf7 Initialiserer 360\xb0-billeder","\ud83d\udfe0 Farveafstemning","\ud83d\udcaf Beregning af kvalitetsscore \xa9","\ud83d\udce1 Downloader opdateringer","\ud83c\udf0d Henter kortfliser","\ud83d\udcf8 Behandler skygger"],"edit_osm":"Rediger OSM","josm_live":"Aktiv\xe9r automatisk JOSM-synkronisering ved indl\xe6sning af billeder","loading_labels_fun":["\ud83e\udd8c Registrering af skilte om hjortekrydsning","\ud83d\ude98 S\xf8ger Panoramax Car \xa9","\u2615 Injicerer koffein","\ud83d\ude00 Smil, du er blevet kortlagt!","\ud83d\udc08 Deler kattebilleder","\ud83d\ude34 Reducerer overspringshandlinger","\ud83e\uded6 Brygger te","\ud83d\udc27 \xc5bner kildekode","\ud83d\ude87 Indekser undergrundsstationer","\ud83e\uddf9 Metadata-oprydning","\ud83d\ude92 Sender billeder af brandstation","\ud83d\udeb2 Opdatering af Greenways","\ud83d\ude89 Gennemgang af perron p\xe5 station","\ud83d\udef0\ufe0f S\xf8ger efter satellitter","\ud83d\udc65 Skriver personaer","\ud83d\udc1f Finder fish and chip butik","\ud83e\uddd1\u200d\ud83d\udcbb Gr\xe6nseflade til fejlfinding","\ud83d\udcc8 Inkrementelle statistikker","\ud83e\udd16 L\xe6rer semantik","\ud83c\udfa8 Redesign af gr\xe6nseflade","\ud83d\udcc5 Planl\xe6gning af foto-kortl\xe6gningsfester","\ud83e\uddc0 Modning af cheddars","\ud83c\udf04 Beregning af Cornwalls solskin","\ud83c\udf0a M\xe5ling af h\xf8jvande"],"error_psv":"Photo Sphere Viewer indl\xe6ses ikke korrekt","error_nopic":"Intet billede tilg\xe6ngeligt p\xe5 den givne position","error_api":"Billedserveren er ikke tilg\xe6ngelig","error_webgl":"WebGL underst\xf8ttes ikke af din browser","filter_date":"Dato","filter_date_1month":"1 m\xe5ned","filter_date_1year":"1 \xe5r","filter_user":"Bruger","filter_user_mypics":"Mine billeder","filter_picture":"Billedtype","filter_zoom_in":"Zoom ind p\xe5 kortet for at se dette filter","picture_flat":"Klassisk","picture_360":"360\xb0","filter_qualityscore_help":"Klik for at aktivere eller deaktivere","map_background":"Kortbaggrund","map_background_aerial":"Luftfoto","map_background_streets":"Gader","map_theme":"Korttema","error_pic":"Det \xf8nskede billede blev ikke fundet","error_api_compatibility":"Billedserveren er ikke kompatibel med denne version af fremviseren","filter_qualityscore":"Kvalitetsscore","error_josm":"JOSM svarer ikke, k\xf8rer den, og er fjernstyring aktiveret?","metadata_general_seqid_link":"G\xe5 til JSON-beskrivelse af sekvensen","map_theme_default":"Klassisk","map_theme_age_1":"> 2 \xe5r","map_theme_age_2":"< 2 \xe5r","map_theme_age_3":"< 1 \xe5r","map_theme_age_4":"< 1 m\xe5ned","map_theme_type":"Kameratype","map_theme_score":"Kvalitetsscore","contrast":"Aktiv\xe9r h\xf8jere billedkontrast","metadata_general_picid":"Billede","metadata_general_seqid":"Sekvens","metadata_general_picid_link":"G\xe5 til JSON-beskrivelse af billedet","metadata_general_author":"Forfatter","metadata_general_license":"Licens","metadata_general_license_link":"Se den fulde licensbeskrivelse","metadata_general_date":"Optagelsesdato","metadata_camera":"Kamera","metadata_camera_make":"Fabrikat","metadata_camera_model":"Model","metadata_camera_type":"Type","metadata_camera_resolution":"Opl\xf8sning","metadata_camera_focal_length":"Br\xe6ndvidde","metadata_location_latitude":"Breddegrad","metadata_location_orientation":"Retning","metadata_location_precision":"Pr\xe6cision i positionering","metadata_quality":"Kvalitet","metadata_quality_score":"Global score","metadata_quality_gps_score":"Positioneringsscore","metadata_quality_help":"F\xe5 mere at vide om kvalitetsscore","map_theme_age":"Optagelsesdato","metadata_location":"Position","metadata":"Metadata for billede","metadata_location_longitude":"L\xe6ngdegrad","metadata_quality_resolution_score":"Opl\xf8sningsscore","metadata_quality_missing":"ingen v\xe6rdi indstillet i billedet","metadata_exif":"EXIF","metadata_exif_name":"Tag","metadata_exif_value":"V\xe6rdi","report":"Indberet","report_auth":"Denne indberetning vil blive sendt via din konto \\"{a}\\"","report_nature_label":"Problemets karakter","report_nature":{"":"V\xe6lg problemets art\u2026","blur_missing":"En persons ansigt eller bils nummerplade er synlig","blur_excess":"Et objekt, der ikke har brug for sl\xf8ring, sl\xf8res","inappropriate":"Billedet er upassende (ikke relevant, n\xf8genhed\u2026)","privacy":"En privat sti eller ejendom er synlig","picture_low_quality":"Billedet er af meget d\xe5rlig kvalitet","mislocated":"Billedet er d\xe5rligt placeret p\xe5 kortet","copyright":"Billedet kr\xe6nker ophavsretten","other":"Enhver anden form for problem"},"report_whole_sequence":"Det g\xe6lder hele sekvensen","report_details":"Yderligere detaljer","report_details_placeholder":"Hvis du vil, kan du tilf\xf8je detaljer om problemet, og hvad det drejer sig om","report_email":"Din e-mail","report_email_placeholder":"Valgfri","report_submit":"Indsend","report_wait":"Sender indberetning \u2026","report_success":"Indberetningen er blevet sendt. Den vil blive gennemg\xe5et s\xe5 hurtigt som muligt.","report_failure":"Der opstod en fejl under oprettelse af indberetning: {e}. Pr\xf8v venligst igen senere.","qualityscore_title":"Om kvalitetsscoren","qualityscore_doc_2":"Bed\xf8mmelsen vises for brugerne som en A/B/C/D/E-score (A er den bedste, E den d\xe5rligste) og vises grafisk via denne skala:","qualityscore_doc_3":"Den beregnes ud fra GPS-pr\xe6cision og billedopl\xf8sning. Et professionelt system vil have en A-rating, et 360\xb0 actionkamera vil have en B-rating, og en smartphone vil have en C/D/E-rating.","qualityscore_doc_link":"Yderligere oplysninger om kvalitetsscoren","qualityscore_doc_1":"Panoramax tilbyder en kvalitetsscore for hvert billede. Det giver mulighed for nem kortfiltrering og overskuelig visning af tilg\xe6ngelige billeder af h\xf8j kvalitet.","minimize_short":"Skjul","id":"iD","josm":"JOSM","metadata_general_instance":"Oprindelse instans","contribute_id":"Bidrag til OpenStreetMap med iD-editor","geo_uri":"Ekstern app","picture_flat_long":"Klassisk billede","picture_360_long":"Panoramabillede","metadata_summary":"Opsummering","metadata_general_copy_id":"Kopi-ID","metadata_general_copy_picid":"Kopi billed-ID","filter_date_6months":"6 m\xe5neder","picture_all":"Alle","panoramax":"Panoramax","semantics_send_ok":"Dine redigeringer blev indsendt"},"psv":{"loadError":"Panoramaet kan ikke indl\xe6ses","twoFingers":"Brug to fingre til at navigere","ctrlZoom":"Brug ctrl + scroll til at zoome ind p\xe5 billedet"},"map":{"loading":"Indl\xe6ser\u2026","thumbnail":"Miniature af billedet, der holdes","not_public":"Ikke offentligt synlig","slow_loading":"Kortet indl\xe6ses langsomt og kan virke defekt","map_data":"Kortdata: {m}","more_panoramax":"F\xe5 mere at vide om Panoramax"}}')},369:at=>{"use strict";at.exports=JSON.parse('{"pnx":{"options":"Optionen","filters":"Filter","search":"Suche","layers":"Ebenen","share_links":"Links","share_page":"Link zu diesem Bild","loading_labels_fun":["\ud83e\udd8c Erkennung der \\"Reh kreuzt\\"-Schilder","\ud83d\ude98 Suche Panoramax-Auto \xa9","\u2615 Koffeininjektion","\ud83d\ude00 L\xe4chle, du wirst kartografiert!","\ud83d\udc08 Katzenfotos teilen","\ud83d\ude34 Reduzieren der Prokrastination","\ud83c\udf7a\ufe0f Bier brauen","\ud83d\udc27 Quellcode \xf6ffnen","\ud83d\udee3\ufe0f Indizierung der Autobahnen","\ud83e\uddf9 Metadatenreinigung","\ud83d\ude92 Senden der Fotos der Feuerwehren","\ud83d\udeb2 Gr\xfcne Radwege identifiziert","\ud83d\ude89 Durchgang zum Bahnsteig","\ud83d\udef0\ufe0f Suche Satelliten","\ud83d\udc65 Personas anlegen","\ud83c\udf2d\ufe0f Lokalisierung der Currywurst","\ud83e\uddd1\u200d\ud83d\udcbb Debugging des Interfaces","\ud83d\udcc8 Hochz\xe4hlen der Statistiken","\ud83e\udd16 Lerne Semantik","\ud83c\udfa8 \xdcberarbeitung des Interface","\ud83d\udcc5 Plane Fotomapping-Parties","\ud83e\uddc0 Reifen des Emmentalers","\ud83c\udf04 Berechnen des Sonnenscheins","\ud83c\udf0a Messung der Gezeiten"],"search_empty":"Keine Ergebnisse gefunden","share":"Teilen","metadata_general_picid":"Bild","zoom":"Zoom","zoomOut":"Herauszoomen","zoomIn":"Hereinzoomen","moveUp":"Nach oben","moveDown":"Nach unten","moveRight":"Nach rechts","moveMiddle":"Sicht zentrieren","map_theme_age":"Aufnahmedatum","expand":"Vergr\xf6\xdfern","expand_info":"Widget im Vollbild anzeigen","show_psv":"Bildbetrachter anzeigen","show_map":"Karte anzeigen","search_user":"Benutzernamen suchen\u2026","filter_zoom_in":"Vergr\xf6\xdfere die Karte, um diesen Filter zu sehen","picture_flat":"Klassisch","picture_360":"360\xb0","filter_camera_model":"Nach Kameramodell","map_background":"Kartenhintergrund","map_background_aerial":"Satelliten","map_background_streets":"Stra\xdfen","map_theme":"Karten-Art","metadata_exif_name":"Schlagwort","metadata_exif_value":"Wert","map_theme_age_2":"<2 Jahre","map_theme_age_3":"<1 Jahr","map_theme_type":"Kameratyp","contrast":"H\xf6heren Bildkontrast aktivieren","metadata":"Bildmetadaten","metadata_general_seqid":"Sequenz","metadata_general_picid_link":"Zur JOSN-Beschreibung des Bildes gehen","loading_labels_serious":["\ud83d\uddfa\ufe0f Laden der Kartendaten","\ud83d\udda5\ufe0f API anfragen","\ud83d\uddbc\ufe0f Vorschaubilder laden","\ud83d\udd0d EXIF Metadaten analysieren","\ud83c\udfd8\ufe0f 3D-Rendering","\ud83d\udcf7 360\xb0 Fotos initialisieren","\ud83d\udfe0 Farben balancieren","\ud83d\udcaf Berechnung der Qualit\xe4tsbewertung \xa9","\ud83d\udce1 Herunterladen von Updates","\ud83c\udf0d Laden von Kartenteilen","\ud83d\udcf8 Bearbeitung der Schatten"],"search_address":"Suchen sie eine Adresse, Stadt, \u2026","share_image":"HD Bild","share_rss":"RSS Feed","share_embed":"Auf Webseite einbetten","share_print":"Druck","copy":"Kopieren","copied":"Kopiert","error":"Panoramax ist abgest\xfcrzt\u2026","sequence_next":"N\xe4chstes Foto in der Sequenz","sequence_play":"Sequenz abspielen","sequence_pause":"Sequenz pausieren","sequence_prev":"Vorheriges Foto in der Sequenz","sequence_more":"Mehr Abspieloptionen","sequence_speed":"Abspielgeschwindigkeit","legend_license":"Lizenz: {l}","edit_osm":"OSM editieren","id":"iD","josm":"JOSM","josm_live":"Einschalten der automatischen JOSM-Synchronisierung beim Laden eines Bildes","error_psv":"Betrachter f\xfcr die Photospheres wurde nicht richtig geladen","error_pic":"Gesuchtes Foto wurde nicht gefunden","error_nopic":"Kein Foto verf\xfcgbar an dieser Position","error_api":"Foto-Server ist nicht verf\xfcgbar","error_josm":"JOSM reagiert nicht, ist es ge\xf6ffnet und die Remote eingeschaltet?","error_api_compatibility":"Der Foto-Server ist nicht mit dieser Version des Betrachters kompatibel","filter_date":"Datum","filter_user":"Benutzer","filter_picture":"Foto-Art","map_theme_default":"Klassisch","map_theme_age_1":">2 Jahre","metadata_general_seqid_link":"Zur JSON-Beschreibung der Sequenz gehen","metadata_general_author":"Autor","metadata_general_license":"Lizenz","metadata_general_date":"Aufnahmedatum","metadata_camera":"Kamera","metadata_camera_make":"Hersteller","metadata_camera_model":"Modell","metadata_camera_type":"Typ","metadata_camera_focal_length":"Brennweite","metadata_location":"Position","metadata_location_longitude":"L\xe4ngengrad","metadata_location_latitude":"Breitengrad","metadata_location_orientation":"Richtung","metadata_location_precision":"Pr\xe4zision der Positionierung","metadata_exif":"EXIF","minimize":"Widget verbergen, sie k\xf6nnen es \xfcber die Schaltfl\xe4che in der linken unteren Ecke wieder einblenden","map_theme_age_4":"< 1 Monat","error_subtitle":"Bitte versuchen sie es sp\xe4ter erneut, oder schauen sie in die Web-Browser-Konsole f\xfcr mehr Details.","moveLeft":"Nach links","share_rss_title":"RSS Feed neuer Sequenzen auf dem aktuell sichtbaren Kartenbereich","error_webgl":"WebGL wird von ihrem Browser nicht unterst\xfctzt","metadata_general_license_link":"Volle Lizenzbeschreibung ansehen","share_embed_docs":"Mehr \xfcber die Einbettungs-Konfiguration lesen","report_nature":{"":"Art des Problems ausw\xe4hlen\u2026","inappropriate":"Bild ist unangemessen (irrelevant, Nacktheit, ...)","picture_low_quality":"Bild hat eine sehr schlechte Qualit\xe4t","blur_missing":"Das Gesicht einer Person oder ein KFZ-Kennzeichen ist sichtbar","blur_excess":"Ein Objekt das nicht unkenntlich gemacht werden muss wurde unkenntlich gemacht","privacy":"Ein privater Pfad oder ein privates Grundst\xfcck ist sichtbar","mislocated":"Bild ist falsch auf der Karte verortet","copyright":"Bild verletzt das Urheberrecht","other":"Andere Art von Problem"},"report_details_placeholder":"Sie k\xf6nnen optionale Details \xfcber das Problem hinzuf\xfcgen","report_auth":"Dieser Report wird durch ihren Account \\"{a}\\" gesendet","report_nature_label":"Art des Problems","report_whole_sequence":"Dies betrifft die gesamte Sequenz","report_details":"Weitere Details","report_email":"Ihre Email","report_email_placeholder":"Optional","report_submit":"Absenden","report_success":"Ihr Report wurde erfolgreich gesendet. Er wird so schnell wie m\xf6glich \xfcberpr\xfcft.","report_failure":"Ein Fehler ist bei der Erstellung des Reports aufgetreten: {e}. Bitte versuchen sie es erneut.","report":"Melden","legend_title":"Zeige Bilderdetails","report_wait":"Bericht senden\u2026","error_click":"Weiter","error_retry":"Bitte sp\xe4ter erneut versuchen","metadata_camera_resolution":"Aufl\xf6sung","filter_user_mypics":"Meine Fotos","metadata_quality_missing":"kein Wert im Foto gesetzt","filter_date_1month":"1 Monat","filter_date_1year":"1 Jahr","filter_qualityscore":"Qualit\xe4tswert","filter_qualityscore_help":"Klicken, um zu aktivieren oder deaktivieren","map_theme_score":"Qualit\xe4tswert","metadata_quality":"Qualit\xe4t","metadata_quality_help":"Erfahre mehr \xfcber den Qualit\xe4tswert","metadata_quality_resolution_score":"Aufl\xf6sungswertung","metadata_quality_gps_score":"Positionswertung","metadata_quality_score":"Gesamtwertung","qualityscore_title":"\xdcber den Qualit\xe4tsfaktor","qualityscore_doc_link":"Weitere Informationen zur Berechnung des Qualit\xe4tsfaktors findest du in unserer Dokumentation","qualityscore_doc_1":"Panoramax bietet einen Qualit\xe4tsfaktor f\xfcr jedes Bild. Es erm\xf6glicht eine einfache Kartenfilterung und eine umfassende Anzeige der Verf\xfcgbarkeit hochwertiger Bilder.","qualityscore_doc_2":"Die Note wird den Benutzern als A/B/C/D/E-Bewertung angezeigt (A ist die beste, E die schlechteste) und anhand dieser Skala grafisch dargestellt:","qualityscore_doc_3":"Die Berechnung erfolgt auf der Grundlage der GPS-Genauigkeit und der Bildaufl\xf6sung. Ein professionelles System wird mit A bewertet, eine 360-Grad-Action-Kamera mit B und ein Smartphone mit C/D/E.","minimize_short":"Verbergen","semantics_features_none":"Bislang wurde kein Feature erkannt oder annotiert in diesem Bild.","semantics_features_default_title":"Feature #{nb}","semantics_features_subtitle":"{nb} assozierte Eigenschaften","semantics_show_all_tags":"Alle Schlagworte anzeigen","semantics_title":"Schlagworte","semantics_tags":"{nb] Schlagworte","semantics_features":"Erkannte Features","semantics_hide_all_tags":"Alle Schlagworte verbergen","semantics_annotation_tooltip":"Klicken um Details zu sehen","semantics_key":"Schl\xfcssel","semantics_value":"Wert","semantics_key_doc":"Mehr \xfcber diesen Schl\xfcssel erfahren","semantics_value_doc":"Mehr \xfcber dieses Schlagwort erfahren","semantics_tags_picture":"Foto-Schlagworte","semantics_tags_picture_none":"Bislang wurden keine Schlagworte f\xfcr dieses Foto gesetzt.","semantics_show_annotations":"Fotoannotierungen anzeigen","semantics_hide_annotations":"Fotoannotierungen verbergen","semantics_wikidata_properties":{"P31":"Instanz von","P279":"Unterklasse von","P361":"Teil von"},"metadata_exif_doc":"Dokumentation der EXIF Tags","metadata_exif_doc_title":"Zur Exiv2 Dokumentation f\xfcr die vollen Details zu EXIF und den XMP Tag Definitionen","metadata_location_coordinates":"Koordinaten (L\xe4ngengrad, Breitengrad)","metadata_location_copy":"Kopiere {v}","metadata_location_copy_more":"Mehr Optionen zum Kopieren der Koordinaten","whats_panoramax":"Panoramax ist eine Geo-Commons f\xfcr Gebietsfotos.","picture_360_long":"Panoramafoto","metadata_summary":"Zusammenfassung","filter_date_6months":"6 Monate","picture_all":"Alle","picture_flat_long":"Klassisches Foto","metadata_general_instance":"Quellinstanz","geo_uri":"Externe App","contribute_id":"Zu OpenStreetMap mit dem iD Editor beitragen","metadata_general_copy_id":"ID kopieren","metadata_general_copy_picid":"Kopiere Foto ID","semantics_qualifiers":"Qualifikationskriterien","panoramax":"Panoramax","semantics_zero_annotations":"Zu diesem Bild sind keine Anmerkungen vorhanden","semantics_hashtags":"Bild-Hashtags"},"psv":{"twoFingers":"Nutzen sie zwei Finger zum navigieren","ctrlZoom":"Nutzen sie Strg+Scrollen um das Bild zu zoomen","loadError":"Das Panorama konnte nicht geladen werden"},"map":{"thumbnail":"Vorschau des marktierten Fotos","not_public":"Nicht \xf6ffentlich sichtbar","loading":"Laden\u2026","slow_loading":"Die Karte wird nur langsam geladen und k\xf6nnte fehlerhaft erscheinen","map_data":"Kartendaten: {m}","more_panoramax":"Mehr Infos \xfcber Panoramax"},"maplibre":{"GeolocateControl.FindMyLocation":"Meinen Standort finden","GeolocateControl.LocationNotAvailable":"Standort nicht verf\xfcgbar"}}')},389:at=>{"use strict";at.exports=JSON.parse('{"psv":{"twoFingers":"Use two fingers to navigate","ctrlZoom":"Use ctrl + scroll to zoom the image","loadError":"The panorama can\'t be loaded"},"maplibre":{"GeolocateControl.FindMyLocation":"Find my location","GeolocateControl.LocationNotAvailable":"Location not available"},"pnx":{"zoom":"Zoom","zoomOut":"Zoom out","zoomIn":"Zoom in","moveUp":"Move up","moveDown":"Move down","moveLeft":"Move left","moveRight":"Move right","moveMiddle":"Center view","expand":"Expand","expand_info":"Make the widget appear in full page","show_psv":"Show the picture viewer","show_map":"Show the map","minimize":"Hide this widget, you can show it again using button in bottom left corner","minimize_short":"Hide","options":"Options","filters":"Filters","layers":"Layers","search":"Search","search_empty":"No results found","search_address":"Search an address, city\u2026","search_user":"Search a username\u2026","share":"Share","share_links":"Links","share_page":"Link to this picture","share_image":"HD Image","share_rss":"RSS feed","share_rss_title":"RSS feed of new sequences in the currently visible map area","share_embed":"Embed on your website","share_embed_docs":"Read more about embed configuration","share_print":"Print","panoramax":"Panoramax","whats_panoramax":"Panoramax is the geo-commons for territories\' pictures.","copy":"Copy","copied":"Copied","error":"We have a problem\u2026","error_click":"Continue","error_retry":"Please retry later","sequence_next":"Next picture in sequence","sequence_play":"Play along this sequence","sequence_pause":"Pause sequence","sequence_prev":"Previous picture in sequence","sequence_more":"More play options","sequence_speed":"Player speed","legend_license":"License: {l}","legend_title":"Show details of picture","id":"iD","contribute_id":"Contribute to OpenStreetMap with iD editor","geo_uri":"External app","josm":"JOSM","josm_live":"Enable JOSM automatic sync on picture loading","loading_labels_serious":["\ud83d\uddfa\ufe0f Loading map data","\ud83d\udda5\ufe0f Querying API","\ud83d\uddbc\ufe0f Loading thumbnails","\ud83d\udd0d Analyzing EXIF metadata","\ud83c\udfd8\ufe0f 3D rendering","\ud83d\udcf7 Initializing 360\xb0 pictures","\ud83d\udfe0 Colour balancing","\ud83d\udcaf Computing Quality Score \xa9","\ud83d\udce1 Downloading updates","\ud83c\udf0d Fetching map tiles","\ud83d\udcf8 Processing shadows"],"loading_labels_fun":["\ud83e\udd8c Detecting deer crossing signs","\ud83d\ude98 Searching Panoramax Car \xa9","\u2615 Injecting caffeine","\ud83d\ude00 Smile, you\'re mapped!","\ud83d\udc08 Sharing cat pictures","\ud83d\ude34 Reducing procrastination","\ud83e\uded6 Brewing tea","\ud83d\udc27 Opening source code","\ud83d\ude87 Indexing Underground stations","\ud83e\uddf9 Metadata cleanup","\ud83d\ude92 Sending fire station photos","\ud83d\udeb2 Greenways update","\ud83d\ude89 Station platform walkthrough","\ud83d\udef0\ufe0f Searching satellites","\ud83d\udc65 Writing personas","\ud83d\udc1f Locating chip shops","\ud83e\uddd1\u200d\ud83d\udcbb Debugging interface","\ud83d\udcc8 Incrementing statistics","\ud83e\udd16 Learning semantics","\ud83c\udfa8 Interface redesign","\ud83d\udcc5 Planning photo-mapping-parties","\ud83e\uddc0 Maturing cheddars","\ud83c\udf04 Calculating Cornish sunshine","\ud83c\udf0a Measuring the high tides"],"error_psv":"Photo Sphere Viewer is not loading properly","error_pic":"Requested picture wasn\'t found","error_nopic":"No picture available at given position","error_api":"The pictures server is not available","error_webgl":"WebGL is not supported by your browser","error_josm":"JOSM doesn\'t respond, is it running and is remote enabled?","error_api_compatibility":"The pictures server is not compatible with this viewer version","filter_date":"Date","filter_date_1month":"1 month","filter_date_6months":"6 months","filter_date_1year":"1 year","filter_user":"User","filter_user_mypics":"My pictures","filter_picture":"Picture type","filter_zoom_in":"Zoom-in the map to see this filter","picture_all":"All","picture_flat":"Classic","picture_360":"360\xb0","picture_flat_long":"Classic picture","picture_360_long":"Panoramic picture","filter_qualityscore":"Quality score","filter_qualityscore_help":"Click to enable or disable","qualityscore_title":"About the quality score","qualityscore_doc_1":"Panoramax offers a Quality Score for each picture. It allows easy map filtering and comprehensive display of high-quality pictures availability.","qualityscore_doc_2":"The grade is shown to users as a A/B/C/D/E score (A is the best, E the worst), and shown graphically through this scale:","qualityscore_doc_3":"It is computed based on GPS precision and picture resolution. A professional system will have an A-rating, a 360\xb0 action camera will have a B-rating, and a smartphone will be C/D/E-rated.","qualityscore_doc_link":"Know more about the Quality Score","map_background":"Map background","map_background_aerial":"Aerial","map_background_streets":"Streets","map_theme":"Map theme","map_theme_default":"Classic","map_theme_age":"Capture date","map_theme_age_1":"> 2 years","map_theme_age_2":"< 2 years","map_theme_age_3":"< 1 year","map_theme_age_4":"< 1 month","map_theme_type":"Camera type","map_theme_score":"Quality score","contrast":"Enable higher image contrast","metadata":"Picture metadata","metadata_summary":"Summary","metadata_general_copy_id":"Copy ID","metadata_general_copy_picid":"Copy picture ID","metadata_general_picid":"Picture","metadata_general_seqid":"Sequence","metadata_general_picid_link":"Go to JSON description of the picture","metadata_general_seqid_link":"Go to JSON description of the sequence","metadata_general_author":"Author","metadata_general_license":"License","metadata_general_license_link":"See the full licence description","metadata_general_date":"Capture date","metadata_general_instance":"Origin instance","metadata_camera":"Camera","metadata_camera_make":"Make","metadata_camera_model":"Model","metadata_camera_type":"Type","metadata_camera_resolution":"Resolution","metadata_camera_focal_length":"Focal length","metadata_location":"Position","metadata_location_coordinates":"Coordinates (longitude, latitude)","metadata_location_orientation":"Direction","metadata_location_precision":"Positioning precision","metadata_location_copy":"Copy {v}","metadata_location_copy_more":"More coordinates copy options","metadata_quality":"Quality","metadata_quality_help":"Know more about Quality Score","metadata_quality_score":"Global score","metadata_quality_gps_score":"Positioning score","metadata_quality_resolution_score":"Resolution score","metadata_quality_missing":"no value set in picture","metadata_exif":"EXIF","metadata_exif_name":"Tag","metadata_exif_value":"Value","metadata_exif_doc":"Docs for EXIF tags","metadata_exif_doc_title":"Go to Exiv2 documentation to have full details on EXIF and XMP tags definitions","semantics_title":"Tags","semantics_tags":"{nb} tags","semantics_features":"Detected features","semantics_features_none":"No feature has been detected or annotated in this picture yet.","semantics_features_default_title":"Feature #{nb}","semantics_features_subtitle":"{nb} associated properties","semantics_annotation_tooltip":"Click to see details","semantics_show_all_tags":"Show all tags","semantics_hide_all_tags":"Hide all tags","semantics_key":"Key","semantics_value":"Value","semantics_key_doc":"Know more about this key","semantics_value_doc":"Know more about this tag","semantics_tags_picture":"Picture tags","semantics_tags_picture_none":"No tags has been set for this picture yet.","semantics_qualifiers":"Qualifiers","semantics_show_annotations":"Display picture annotations","semantics_hide_annotations":"Hide picture annotations","semantics_zero_annotations":"No annotation set on this picture","semantics_hashtags":"Picture hashtags","semantics_wikidata_properties":{"P31":"instance of","P279":"subclass of","P361":"part of"},"semantics_editor_error":"The syntax is invalid. Your tags may look like:\\nkey=value\\nprefix|key=value\\nprefix|key[qualif_key=qualif_val]=value\\n\\nMax key length is 256 characters, max value length 2048 characters.","semantics_editor_example":"key=value\\nprefix|key=value","semantics_edit":"Edit attributes","semantics_save":"Save your edits","semantics_undo":"Cancel your edits","semantics_cantsave_invalid":"Cannot save changes, input is invalid","semantics_send_fail":"We can\'t send your edits for now, please retry later.","semantics_send_ok":"Your edits were sent successfully","report":"Report","report_auth":"This report will be sent using your account \\"{a}\\"","report_nature_label":"Nature of the issue","report_nature":{"":"Select the nature of issue\u2026","blur_missing":"A person face or car plate is visible","blur_excess":"An object not needing blur is blurred","inappropriate":"Picture is inappropriate (unrelated, nudity\u2026)","privacy":"A private path or property is visible","picture_low_quality":"Picture is of very bad quality","mislocated":"Picture is badly positioned on map","copyright":"Picture infringes copyright","other":"Any other kind of issue"},"report_whole_sequence":"This concerns the entire sequence","report_details":"Additional details","report_details_placeholder":"Optional, you can add details about the issue and how this is concerning","report_email":"Your email","report_email_placeholder":"Optional","report_submit":"Submit","report_wait":"Sending report \u2026","report_success":"Report has been successfully sent. It will be reviewed as soon as possible.","report_failure":"An error occurred when creating report: {e}. Please try again later."},"map":{"loading":"Loading\u2026","thumbnail":"Thumbnail of hovered picture","not_public":"Not publicly visible","slow_loading":"Map is slow to load and could appear broken","map_data":"Map based on {m}","more_panoramax":"Discover more about Panoramax"}}')},9946:at=>{"use strict";at.exports=JSON.parse('{"psv":{"twoFingers":"Uzu du fingrojn por navigi","ctrlZoom":"Uzu ctrl + rulumo por zomi la bildon","loadError":"La bildo ne povas esti \u015dar\u011dita"},"pnx":{"zoom":"Zomo","zoomOut":"Malzomo","zoomIn":"Zomi","moveUp":"Movi supren","moveDown":"Movi malsupren","moveLeft":"Movi maldekstren","moveRight":"Movi dekstren","moveMiddle":"Centri vido","expand":"Pligrandigi","expand_info":"Aperigu la fenestra\u0135on en plena pa\u011do","show_psv":"Montri la bildspektilo","show_map":"Montri la mapo","minimize":"Maski la fenestra\u0135o, vu povas montri \u011din denove kun la butono en malsupra maldekstra angulo","sequence_prev":"Anta\u016da foto en la sekvenco","sequence_more":"Pli da ludopcioj","sequence_speed":"Rapideco de legado","sequence_next":"Sekva foto en la sekvenco","sequence_play":"Foliumi \u0109i tiun sinsekvon","sequence_pause":"Pa\u016dzi la sekvenco","copy":"Kopii","copied":"Kopiita","error":"Ni havas problemon\u2026","error_click":"Kontinui","error_retry":"Bonvolu reprovi poste","search_address":"Ser\u0109i adreson, urbon\u2026","filters":"Filtriloj","layers":"Tavoloj","search":"Ser\u0109i","share_embed_docs":"Pli pri enigito sur via retpa\u011daro","search_empty":"Neniu rezulto trovita","search_user":"Ser\u0109i uzantnomon\u2026","share":"Kunhavigi","share_links":"Ligiloj","share_page":"Ligilo de la foto","share_image":"HD bildo","share_rss":"RSS abonfluo","share_rss_title":"RSS abonfluo de la novaj sekvecoj en la nuntempe videbla mapzono","share_embed":"Enigita en via retpa\u011daro","share_print":"Presi","edit_osm":"Modifi OSM","legend_license":"Rajtigilo : {l}","josm_live":"Ebligas a\u016dtomatan JOSM-sinkronigon dum \u015dar\u011do de bildo","loading_labels_serious":["\ud83d\uddfa\ufe0f \u015cargo de la bazmapon","\ud83d\udda5\ufe0f API demandado","\ud83d\uddbc\ufe0f \u015car\u011do de miniaturoj","\ud83d\udd0d Analizo de EXIF-metadatumoj","\ud83c\udfd8\ufe0f 3D-rendumo","\ud83d\udcf7 Inico de 360\xb0-bildoj","\ud83d\udfe0 Kolora ekvilibrigo","\ud83d\udcaf Kalkulo de kvalitpoentaro \xa9","\ud83d\udce1 El\u015dutante \u011disdatoj","\ud83c\udf0d Reakirante mapkaheloj","\ud83d\udcf8 Traktadante ombroj"],"legend_title":"Montri la detaloj de la bildo","error_api":"La bildservilo ne estas disponebla","error_josm":"JOSM ne respondis. \u0108u \u011di funkcias kaj la regilo estas \u015daltita?","error_webgl":"WebGL ne estas subtenata per via retumilo","loading_labels_fun":["\ud83e\udd8c Detekto de cervinaj vojmontriloj","\ud83d\ude98 Ser\u0109o de Panoramax-a\u016dto \xa9","\u2615 Injekto de kafeino","\ud83d\ude00 Ridetu, vi estas mapita!","\ud83d\udc08 Kunhavigo de katbildoj","\ud83d\ude34 Redukto de prokrastado","\ud83d\udcd6 Lernado de Esperanto","\ud83d\udc27 Malfermo de fontkodo","\ud83d\ude87 Indekso de subteraj stacioj","\ud83e\uddf9 Purigo de metadatumoj","\ud83d\ude92 Sendado de fotoj de fajrostacioj","\ud83d\udeb2 \u011cisdatigo de verdaj vojoj","\ud83d\ude89 Promenado tra stacioplatformoj","\ud83d\udef0\ufe0f Ser\u0109o de satelitoj","\ud83d\udc65 Verkado de roluloj","\u2747\ufe0f Lokalizo de la Esperanto-flagoj","\ud83e\uddd1\u200d\ud83d\udcbb Sencimigado de la interfaco","\ud83d\udcc8 Alkrementi de la statistikoj","\ud83e\udd16 Lernadante semantiko","\ud83c\udfa8 Interfaca redezajno","\ud83d\udcc5 Planante fota-mapa-festoj","\ud83e\uddc0 Finmaturigo de la froma\u011doj","\ud83c\udf04 Kalkulante la sunbrilon de la Saharo","\ud83c\udf0a Mezurado de la altaj tajdoj"],"picture_360":"360\xb0","picture_flat":"Klasika","report_nature_label":"Speco de problemo","report_nature":{"":"Elektu la specon de problemo\u2026","blur_missing":"Viza\u011do a\u016d numerplato estas videbla","copyright":"La bildo malobeas kopirajton","blur_excess":"Objekto kiu ne bezonis malklari\u011don estas malklarigita","inappropriate":"La bildo estas neta\u016dga (nevera, nudeco...)","privacy":"Privata vojo a\u016d poseda\u0135o estas videbla","picture_low_quality":"La bildo estas de tre malbona kvalito","mislocated":"La bildo estas malbone poziciigita sur la mapo","other":"\u0108ia alia speco de problemo"},"report":"Raporti","report_auth":"\u0108i tiu raporto estos sendita per via konto \\"{a}\\"","filter_date":"Dato","filter_user_mypics":"Miaj fotoj","options":"Opcioj","error_api_compatibility":"La fotoservilo ne kongruas kun \u0109i tiu spektilo","filter_qualityscore":"Kvalitpoentaro","filter_qualityscore_help":"Alllaku por aktivigi a\u016d mal\u015dalti","map_theme_age":"Dato de fotado","map_theme_age_1":"> 2 jaroj","map_theme_age_2":"< 2 jaroj","map_theme_age_3":"< 1 jaro","map_theme_age_4":"< 1 monato","map_theme_score":"Kvalitpoentaro","metadata":"Metadatenoj de la bildo","map_theme_type":"Fotiltipo","metadata_general_seqid":"Sekvenco","metadata_camera_resolution":"Difino","metadata_quality_resolution_score":"Rezolucia poentaro","error_psv":"Foto-Sfera Spektilo ne \u015dar\u011di\u011das \u011duste","error_pic":"La petita bildo ne estis trovita","error_nopic":"Neniu bildo disponeblas \u0109e la donita pozicio","filter_user":"Uzanto","map_theme_default":"Klasika","filter_date_1month":"1 monato","filter_date_1year":"1 jaro","contrast":"Pliigi bildkontraston","metadata_general_picid":"Foto","filter_picture":"Bilda tipo","filter_zoom_in":"Zomu en la mapo por vidi tiun filtrilon","map_background":"Bazmapo","map_background_aerial":"Aera","map_background_streets":"Stratoj","map_theme":"Mapa etoso","metadata_general_picid_link":"Iru al la JSON-priskribo de la foto","metadata_general_seqid_link":"Iru al la JSON-priskribo de la sekvenco","metadata_general_author":"A\u016dtoro","metadata_general_license":"Rajtigilo","metadata_general_license_link":"Vidi la kompletan rajtigilon en la priskribo","metadata_general_date":"Dato de la fotado","metadata_camera":"Fotilo","metadata_camera_make":"Faristo","metadata_camera_model":"\u015cablono","metadata_camera_type":"Tipo","metadata_camera_focal_length":"Fokuslongo","metadata_location":"Pozicio","metadata_location_longitude":"Longitudo","metadata_location_latitude":"Latitudo","metadata_location_orientation":"Direkto","metadata_location_precision":"Pozicia precizeco","metadata_quality":"Kvalito","metadata_quality_help":"Pli pri la Kvalitapoentaro","metadata_quality_score":"Malloka poentaro","metadata_quality_gps_score":"Pozicia poentaro","metadata_quality_missing":"neniu valoro en la bildo","metadata_exif":"EXIF","metadata_exif_name":"Etikedo","metadata_exif_value":"Valoro","report_whole_sequence":"\u0108i tio koncernas la tutan sekvencon","report_details":"Aliaj detaloj","report_email":"Via retpo\u015dto","report_submit":"Sendi","report_wait":"Sendante raporton\u2026","report_success":"La raporto estis sukcese sendita. \u011ci estos reviziita balda\u016d.","report_details_placeholder":"Opcie, vi povas aldoni detalojn pri la problemo","report_email_placeholder":"Opcie","report_failure":"Eraro okazis dum kreo de la raporto: {e}. Bonvolu provi denove poste.","qualityscore_doc_3":"\u011ci estas kalkulita surbaze de GPS-precizeco kaj bildrezolucio. Profesiaj sistemoj havos A-poentaron, 360\xb0-akcifotilo havos B-poentaron, kaj po\u015dtelefono havos C/D/E-poentaron.","qualityscore_title":"Pri la kvalita poentaro","qualityscore_doc_1":"Panoramax ofertas Kvalitan Poentaron por \u0109iu bildo. \u011ci ebligas facilan mapfiltradon kaj ampleksan vidigon de la havebleco de altkvalitaj bildoj.","qualityscore_doc_link":"Pli da detaloj pri la kalkulo de la Kvalita Poentaro estas disponeblaj en nia dokumentado","minimize_short":"Maski","qualityscore_doc_2":"La poentaro estas montrita al uzantoj kiel litero A/B/C/D/E (A estas la plej bona, E la plej malbona) kaj grafike prezentita per \u0109i tiu skalo:","id":"iD","josm":"JOSM","contribute_id":"Kontribuu al OpenStreetMap kun iD-modifilo","filter_date_6months":"6 monatoj","picture_all":"\u0108iuj","picture_flat_long":"Klasika foto","picture_360_long":"Panorama foto","metadata_summary":"Resumo","metadata_general_copy_id":"Kopii la ID-on","metadata_general_copy_picid":"Kopii la fotan ID-on","metadata_general_instance":"Origina instanco","geo_uri":"Ekseteraj aplika\u0135oj","semantics_title":"Etikedoj","semantics_tags":"{nb} etikedoj","semantics_features":"Detektitaj objektoj","semantics_features_none":"No objekto estis ankora\u016d detektita a\u016d prinotita en \u0109i tiu foto.","semantics_features_default_title":"Objekto #{nb}","metadata_exif_doc":"Dokumentoj por EXIF-etikedoj","metadata_exif_doc_title":"Iru al la dokumentaro de Exiv2 por havi plenajn detalojn pri difinoj de EXIF kaj XMP-etikedoj","metadata_location_coordinates":"Koordinatoj (longitudo, latitudo)","metadata_location_copy":"Kopii {v}","metadata_location_copy_more":"Pli da ebloj por kopii koordinatojn","whats_panoramax":"Panoramax estas la geokomuna\u0135o por teritoriaj fotoj.","semantics_features_subtitle":"{nb} asociitaj atributoj","semantics_tags_picture_none":"Ankora\u016d neniuj atributoj estas difinitaj por \u0109i tiu foto.","semantics_hide_all_tags":"Maski la atributojn","semantics_key":"\u015closilo","semantics_value":"Valoro","semantics_show_all_tags":"Vidi \u0109iujn atributojn","semantics_tags_picture":"Foto-atributoj","semantics_value_doc":"Lernu pli pri \u0109i tiu atributo","semantics_qualifiers":"Kvalifikiloj","semantics_hide_annotations":"Maski bildajn komentojn","semantics_wikidata_properties":{"P279":"subklaso de","P361":"parto de","P31":"instanco de"},"share_picture":"Foto","semantics_annotation_tooltip":"Alklaku por vidi la detalojn","semantics_show_annotations":"Montri bildajn komentojn","semantics_key_doc":"Lernu pli pri \u0109i tiu \u015dlosilo"},"maplibre":{"GeolocateControl.FindMyLocation":"Trovi mian pozicion","GeolocateControl.LocationNotAvailable":"Loko ne disponeblas"},"map":{"slow_loading":"La mapo \u015dar\u011das malrapide kaj povus aperi rompi\u011dinta","loading":"\u015car\u011danto\u2026","thumbnail":"Miniaturo de la surflikta bildo","not_public":"Ne publike videbla","more_panoramax":"Malkovri pli pri Panoramax","map_data":"Kartaj datumoj : {m}"}}')},8302:at=>{"use strict";at.exports=JSON.parse('{"pnx":{"report_auth":"La denuncia se enviar\xe1 usando tu cuenta \xab{a}\xbb","report":"Denunciar imagen","report_nature_label":"Tipo de problema","report_nature":{"":"Selecciona el tipo de problema\u2026","blur_missing":"Se ve el rostro de una persona, o una matr\xedcula","blur_excess":"Est\xe1 borroso un objeto que no hac\xeda falta ocultar","inappropriate":"La imagen no es apropiada (irrelevante, desnudez, \u2026)","privacy":"Se ve un camino privado, o una propiedad privada","mislocated":"La localizaci\xf3n de la imagen en el mapa no es correcta","picture_low_quality":"La calidad de la imagen es pobre","copyright":"La imagen infringe derechos de autor","other":"Otro tipo de problema"},"sequence_more":"M\xe1s opciones de reproducci\xf3n","sequence_speed":"Velocidad de reproducci\xf3n","legend_license":"Licencia: {l}","edit_osm":"Editar OpenStreetMap","id":"iD","josm":"JOSM","josm_live":"Activar la sincronizaci\xf3n autom\xe1tica de JOSM cuando se carga una imagen","loading_labels_serious":["\ud83d\uddfa\ufe0f Cargando datos del mapa","\ud83d\udda5\ufe0f Consultando la API","\ud83d\uddbc\ufe0f Cargando vistas previas","\ud83d\udd0d Analizando metadatos EXIF","\ud83c\udfd8\ufe0f Renderizado 3D","\ud83d\udcf7 Preparando im\xe1genes 360\xb0","\ud83d\udfe0 Ajustando balance de color","\ud83d\udcaf C\xe1lculo del nivel de calidad \xa9"],"metadata":"Metadatos de la imagen","map_theme_type":"Tipo de c\xe1mara","contrast":"Dar m\xe1s contraste a la imagen","zoom":"Acercar/alejar","zoomOut":"Alejar","map_background_streets":"Calles","loading_labels_fun":["\ud83e\udd8c Detectando paneles de cruce de alces","\ud83d\ude98 Buscando el Coche Panoramax \xa9","\u2615 Inyectando cafe\xedna","\ud83d\ude00 \xa1Sonr\xede, est\xe1s siendo mapeado!","\ud83d\udc08 Compartiendo fotos de gatos","\ud83d\ude34 Reduciendo la procrastinaci\xf3n","\ud83e\uded6 Preparando el t\xe9","\ud83d\udc27 Abriendo el c\xf3digo fuente","\ud83d\ude87 Indexando estaciones del metro","\ud83e\uddf9 Limpieza de metadatos","\ud83d\ude92 Enviando fotos de estaciones de bomberos","\ud83d\udeb2 Actualizando v\xedas verdes","\ud83d\ude89 Paseo por el and\xe9n de la estaci\xf3n","\ud83d\udef0\ufe0f Buscando sat\xe9lites","\ud83d\udc65 Describiendo tipolog\xedas de persona","\ud83d\udc1f Localizando tiendas de fish & chips","\ud83e\uddd1\u200d\ud83d\udcbb Buscando gazapos de la interfaz","\ud83d\udcc8 Incrementando estad\xedsticas"],"metadata_general_license_link":"Ir a la descripci\xf3n completa de la licencia","metadata_general_picid":"Identificador de la imagen","metadata_general_license":"Licencia","report_details_placeholder":"Opcional; puedes a\xf1adir m\xe1s detalles sobre el problema y por qu\xe9 te preocupa","expand":"Expandir","expand_info":"Mostrar el elemento ocupando toda la p\xe1gina","show_psv":"Mostrar el visor de im\xe1genes","show_map":"Mostrar el mapa","zoomIn":"Acercar","moveUp":"Desplazar hacia arriba","moveDown":"Desplazar hacia abajo","moveLeft":"Desplazar hacia la izquierda","moveRight":"Desplazar hacia la derecha","moveMiddle":"Centrar la vista","minimize":"Esconder este elemento. Para mostrarlo de nuevo, pulsa el bot\xf3n en la esquina inferior izquierda","options":"Opciones","filters":"Filtros","layers":"Capas","search":"Buscar","search_empty":"No se encontraron resultados","search_address":"Buscar una direcci\xf3n, una ciudad, \u2026","search_user":"Buscar un usuario\u2026","share":"Compartir","share_links":"Enlaces","share_page":"Enlace a esta p\xe1gina","share_image":"Imagen de alta calidad","share_rss":"Flujo RSS","share_rss_title":"Flujo RSS de las nuevas secuencias en el \xe1rea visible del mapa","share_embed":"Incrustar en tu p\xe1gina web","share_embed_docs":"M\xe1s informaci\xf3n sobre c\xf3mo configurar el incrustado","share_print":"Imprimir","copy":"Copiar","copied":"Copiado","error":"Hay un problema\u2026","sequence_next":"Siguiente imagen de la secuencia","sequence_play":"Reproducir esta secuencia","sequence_pause":"Pausar la secuencia","sequence_prev":"Imagen anterior de la secuencia","error_click":"Continuar","error_retry":"Por favor, int\xe9ntalo m\xe1s tarde","error_psv":"El visor de fotos esf\xe9ricas no se carga correctamente","error_pic":"No se encuentra la imagen que quer\xedamos","error_nopic":"No hay im\xe1genes para la posici\xf3n dada","error_api":"El servidor de im\xe1genes no est\xe1 disponible","error_webgl":"Este navegador no admite WebGL","error_josm":"JOSM no responde. \xbfEst\xe1 abierto, y admite el modo de Control Remoto?","error_api_compatibility":"El servidor de im\xe1genes no es compatible con esta versi\xf3n del visor","filter_date":"Fecha","filter_user":"Usuario","filter_picture":"Tipo de imagen","filter_zoom_in":"Ac\xe9rcate para poder ver filtros","picture_flat":"Cl\xe1sico","picture_360":"360\xb0","filter_camera_model":"Por modelo de c\xe1mara","map_background":"Fondo de mapa","map_background_aerial":"Vista a\xe9rea","map_theme":"Tema de mapa","map_theme_default":"Cl\xe1sico","map_theme_age":"Fecha de toma de imagen","map_theme_age_1":"M\xe1s de dos a\xf1os","map_theme_age_2":"Menos de dos a\xf1os","map_theme_age_3":"Menos de un a\xf1o","map_theme_age_4":"Menos de un mes","metadata_general_seqid":"Identificador de la secuencia","metadata_general_picid_link":"Ir a la descripci\xf3n de la imagen en formato JSON","metadata_general_seqid_link":"Ir a la descripci\xf3n de la secuencia en formato JSON","metadata_general_author":"Autor","metadata_general_date":"Fecha de toma de imagen","metadata_camera":"C\xe1mara","metadata_camera_make":"Marca","metadata_camera_model":"Modelo","metadata_camera_type":"Tipo","metadata_camera_focal_length":"Distancia focal","metadata_location":"Localizaci\xf3n","metadata_location_longitude":"Longitud","metadata_location_latitude":"Latitud","metadata_location_orientation":"Orientaci\xf3n","metadata_location_precision":"Precisi\xf3n de la localizaci\xf3n","metadata_exif":"EXIF / XMP","metadata_exif_name":"Etiqueta","metadata_exif_value":"Valor","report_whole_sequence":"El problema afecta a la secuencia entera","report_details":"M\xe1s detalles","report_email":"Tu direcci\xf3n de correo electr\xf3nico","report_email_placeholder":"Opcional","report_submit":"Enviar","report_success":"La denuncia se ha enviado correctamente. Ser\xe1 revisada lo antes posible.","report_failure":"Ocurri\xf3 un error al crear la denuncia: {e}. Por favor, int\xe9ntalo m\xe1s tarde.","map_theme_score":"Nivel de calidad","filter_qualityscore":"Nivel de calidad","filter_qualityscore_help":"Haga clic para habilitar o deshabilitar","legend_title":"Ver detalles de la imagen","metadata_camera_resolution":"Resoluci\xf3n","metadata_quality":"Puntuaci\xf3n de calidad","metadata_quality_help":"M\xe1s informaci\xf3n sobre el nivel de calidad","metadata_quality_score":"Valoraci\xf3n general","metadata_quality_gps_score":"Puntuaci\xf3n de posicionamiento","metadata_quality_resolution_score":"Puntuaci\xf3n de resoluci\xf3n","metadata_quality_missing":"no hay informaci\xf3n en la imagen","report_wait":"Env\xedo del informe\u2026"},"psv":{"ctrlZoom":"Utiliza Control+rueda de desplazamiento para acercar/alejar","loadError":"Este panorama no se puede cargar","twoFingers":"Desplaza el mapa con dos dedos"},"maplibre":{"GeolocateControl.FindMyLocation":"Local\xedzame","GeolocateControl.LocationNotAvailable":"Localizaci\xf3n no disponible"},"map":{"loading":"Cargando\u2026","thumbnail":"Vista previa de la imagen bajo el cursor","not_public":"No es visible p\xfablicamente","slow_loading":"La mapa tarda mucho en cargarse y puede parecer rota"}}')},5222:at=>{"use strict";at.exports=JSON.parse('{"psv":{"twoFingers":"Utilisez deux doigts pour vous d\xe9placer","ctrlZoom":"Utilisez ctrl + scroll pour zoomer dans l\'image","loadError":"L\'image ne peut pas \xeatre charg\xe9e"},"maplibre":{"GeolocateControl.FindMyLocation":"Afficher ma position","GeolocateControl.LocationNotAvailable":"GPS non-disponible"},"pnx":{"zoom":"Zoom","zoomOut":"D\xe9zoomer","zoomIn":"Zoomer","moveUp":"Vers le haut","moveDown":"Vers le bas","moveLeft":"Vers la gauche","moveRight":"Vers la droite","moveMiddle":"Centrer la vue","expand":"Agrandir","expand_info":"Faire appara\xeetre ce widget en pleine page","show_psv":"Afficher la visionneuse de photos","show_map":"Afficher la carte","minimize":"Masquer ce widget, vous pouvez l\'afficher de nouveau gr\xe2ce au bouton dans le coin en bas \xe0 gauche","minimize_short":"Masquer","options":"Options","filters":"Filtres","layers":"Calques","search":"Rechercher","search_empty":"Aucun r\xe9sultat","search_address":"Rechercher une adresse, ville\u2026","search_user":"Rechercher un nom d\'utilisateur\u2026","share":"Partager","share_links":"Liens utiles","share_page":"Lien de la photo","share_image":"Image HD","share_rss":"Flux RSS","share_rss_title":"Flux RSS des nouvelles s\xe9quences dans la zone visible sur la carte","share_embed":"Int\xe9gration sur votre site","share_embed_docs":"D\xe9couvrir plus de possibilit\xe9s pour l\'int\xe9gration sur votre site","share_print":"Imprimer","panoramax":"Panoramax","whats_panoramax":"Panoramax est le g\xe9ocommun des photos des territoires.","copy":"Copier","copied":"Copi\xe9","error":"On a un probl\xe8me\u2026","error_click":"Continuer","error_retry":"Merci de r\xe9essayer plus tard","sequence_next":"Photo suivante dans la s\xe9quence","sequence_play":"Parcourir cette s\xe9quence","sequence_pause":"Mettre en pause la s\xe9quence","sequence_prev":"Photo pr\xe9c\xe9dente dans la s\xe9quence","sequence_more":"Plus d\'options de lecture","sequence_speed":"Vitesse de lecture","legend_license":"Licence : {l}","legend_title":"Afficher les d\xe9tails de l\'image","id":"iD","contribute_id":"Contribuez \xe0 OpenStreetMap avec l\'\xe9diteur iD","geo_uri":"App externe","josm":"JOSM","josm_live":"Active la synchronisation automatique de JOSM lors du chargement d\'une photo","loading_labels_serious":["\ud83d\uddfa\ufe0f Chargement du fond de carte","\ud83d\udda5\ufe0f Interrogation de l\'API","\ud83d\uddbc\ufe0f Chargement des miniatures","\ud83d\udd0d Analyse des m\xe9tadonn\xe9es EXIF","\ud83c\udfd8\ufe0f Cr\xe9ation du rendu 3D","\ud83d\udcf7 Initialisation des vues 360\xb0","\ud83d\udfe0 \xc9quilibrage des couleurs","\ud83d\udcaf Calcul du score qualit\xe9 \xa9","\ud83d\udce1 T\xe9l\xe9chargement des mises \xe0 jour","\ud83c\udf0d R\xe9cup\xe9ration des tuiles","\ud83d\udcf8 Traitement des ombres"],"loading_labels_fun":["\ud83e\udd8c D\xe9tection des panneaux biche","\ud83d\ude98 Recherche de la Panoramax Car \xa9","\u2615 Injection de caf\xe9ine","\ud83d\ude00 Souriez, vous \xeates mapp\xe9s !","\ud83d\udc08 Partage de photos de chats","\ud83d\ude34 R\xe9duction de la procrastination","\ud83c\uddf7\ud83c\uddea Chargement : 974%","\ud83d\udc27 Ouverture du code source","\ud83e\udd81 Indexation des traboules","\ud83e\uddf9 Nettoyage des m\xe9tadonn\xe9es","\ud83d\ude92 Envoi des photos du SDIS","\ud83d\udeb2 Mise \xe0 jour des voies vertes","\ud83d\ude89 Remont\xe9e des quais de gare","\ud83d\udef0\ufe0f Recherche de satellites","\ud83d\udc65 \xc9criture des personas","\ud83e\udd5e Localisation des cr\xeaperies","\ud83e\uddd1\u200d\ud83d\udcbb D\xe9boguage de l\'interface","\ud83d\udcc8 Incr\xe9mentation des statistiques","\ud83e\udd16 Apprentissage de la s\xe9mantique","\ud83c\udfa8 Redesign de l\'interface","\ud83d\udcc5 Planification des photos-carto-parties","\ud83e\uddc0 Affinage des fromages","\ud83c\udf04 Calcul de l\'ensoleillement corse","\ud83c\udf0a Mesure des grandes mar\xe9es"],"error_psv":"Photo Sphere Viewer ne s\'est pas charg\xe9 correctement","error_pic":"La photo demand\xe9e est introuvable","error_nopic":"Aucune photo disponible autour de la localisation recherch\xe9e","error_api":"Le serveur de photos n\'est pas disponible","error_webgl":"WebGL n\'est pas support\xe9 par votre navigateur","error_josm":"JOSM n\'a pas r\xe9pondu, est-il bien lanc\xe9 et la t\xe9l\xe9commande activ\xe9e ?","error_api_compatibility":"Le serveur de photos n\'est pas compatible avec cette visionneuse","filter_date":"Date","filter_date_1month":"1 mois","filter_date_6months":"6 mois","filter_date_1year":"1 an","filter_user":"Utilisateur","filter_user_mypics":"Mes photos","filter_picture":"Type d\'image","picture_all":"Tout","picture_flat":"Classique","picture_360":"360\xb0","picture_flat_long":"Photo classique","picture_360_long":"Photo panoramique","filter_qualityscore":"Score de qualit\xe9","filter_qualityscore_help":"Cliquez pour activer ou d\xe9sactiver","qualityscore_title":"\xc0 propos du score de qualit\xe9","qualityscore_doc_1":"Panoramax propose un Score de Qualit\xe9 pour chacune de ses photos. Cela facilite le filtre et la recherche de photos de bonne qualit\xe9 sur la carte.","qualityscore_doc_2":"Le score est affich\xe9 sous la forme d\'une lettre A/B/C/D/E (A \xe9tant le meilleur, E le moins bon), et visualisable gr\xe2ce \xe0 cette \xe9chelle :","qualityscore_doc_3":"Il est calcul\xe9 en fonction de la pr\xe9cision du GPS ainsi que la r\xe9solution de la photo. Un mat\xe9riel professionnel aura une note de A, une cam\xe9ra sportive 360\xb0 une note de B, et un smartphone une note de C \xe0 E.","qualityscore_doc_link":"En savoir plus sur le Score de Qualit\xe9","filter_zoom_in":"Zoomez la carte pour voir ce filtre","map_background":"Fond de carte","map_background_aerial":"Satellite","map_background_streets":"Plan","map_theme":"Rendu de carte","map_theme_default":"Classique","map_theme_age":"Date de prise de vue","map_theme_age_1":"> 2 ans","map_theme_age_2":"< 2 ans","map_theme_age_3":"< 1 an","map_theme_age_4":"< 1 mois","map_theme_type":"Type de cam\xe9ra","map_theme_score":"Score de qualit\xe9","contrast":"Augmenter le contraste de l\'image","metadata":"M\xe9tadonn\xe9es de la photo","metadata_summary":"R\xe9sum\xe9","metadata_general_copy_id":"Copier l\'ID","metadata_general_copy_picid":"Copier l\'ID de photo","metadata_general_picid":"Photo","metadata_general_seqid":"S\xe9quence","metadata_general_picid_link":"Aller au descriptif JSON de la photo","metadata_general_seqid_link":"Aller au descriptif JSON de la s\xe9quence","metadata_general_author":"Auteur","metadata_general_license":"Licence","metadata_general_license_link":"Voir la description compl\xe8te de la licence","metadata_general_date":"Date de prise de vue","metadata_general_instance":"Instance d\'origine","metadata_camera":"Appareil","metadata_camera_make":"Fabricant","metadata_camera_model":"Mod\xe8le","metadata_camera_type":"Type","metadata_camera_resolution":"R\xe9solution","metadata_camera_focal_length":"Longueur focale","metadata_location":"Position","metadata_location_coordinates":"Coordonn\xe9es (longitude, latitude)","metadata_location_orientation":"Direction","metadata_location_precision":"Pr\xe9cision du positionnement","metadata_location_copy":"Copier {v}","metadata_location_copy_more":"Copier d\'autres formats de coordonn\xe9es","metadata_quality":"Qualit\xe9","metadata_quality_help":"En savoir plus sur le score de qualit\xe9","metadata_quality_score":"Note globale","metadata_quality_gps_score":"Note du positionnement","metadata_quality_resolution_score":"Note de la r\xe9solution","metadata_quality_missing":"pas d\'info dans l\'image","metadata_exif":"EXIF","metadata_exif_name":"Balise","metadata_exif_value":"Valeur","metadata_exif_doc":"Doc des attributs EXIF","metadata_exif_doc_title":"Ac\xe9\xe9der \xe0 la doc Exiv2 pour en savoir plus sur les attributs EXIF et XMP","semantics_title":"Tags","semantics_tags":"{nb} attributs","semantics_features":"Objets d\xe9tect\xe9s","semantics_features_none":"Aucun objet n\'a \xe9t\xe9 d\xe9tect\xe9 ou annot\xe9 dans cette photo pour l\'instant.","semantics_features_default_title":"Objet #{nb}","semantics_features_subtitle":"{nb} attributs associ\xe9s","semantics_annotation_tooltip":"Cliquez pour voir les d\xe9tails","semantics_show_all_tags":"Voir tous les attributs","semantics_hide_all_tags":"Masquer les attributs","semantics_key":"Cl\xe9","semantics_value":"Valeur","semantics_key_doc":"En savoir plus \xe0 propos de cette cl\xe9","semantics_value_doc":"En savoir plus \xe0 propos de cet attribut","semantics_tags_picture":"Attributs de la photo","semantics_tags_picture_none":"Aucun attribut n\'a \xe9t\xe9 d\xe9fini pour cette photo pour l\'instant.","semantics_qualifiers":"Qualificateurs","semantics_show_annotations":"Afficher les annotations de photo","semantics_hide_annotations":"Masquer les annotations de photo","semantics_zero_annotations":"Aucune annotation sur cette image","semantics_hashtags":"Mots-di\xe8se de la photo","semantics_wikidata_properties":{"P31":"instance de","P279":"sous-classe de","P361":"partie de"},"semantics_editor_error":"La syntaxe est invalide. Vos attributs doivent avoir cette forme:\\ncl\xe9=valeur\\npr\xe9fixe|cl\xe9=valeur\\npr\xe9fixe|cl\xe9[qualif_cl\xe9=qualif_val]=valeur\\n\\nLongueur max des cl\xe9s : 256 caract\xe8res, max des valeurs 2048 caract\xe8res.","semantics_editor_example":"cl\xe9=valeur\\npr\xe9fixe|cl\xe9=valeur","semantics_edit":"Modifier les attributs","semantics_save":"Enregistrer vos modifications","semantics_undo":"Annuler vos modifications","semantics_cantsave_invalid":"Impossible de sauvegarder les modifications, les attributs ne sont pas valides","semantics_send_fail":"Nous n\'avons pas pu enregistrer vos modifications, merci de r\xe9essayer plus tard","semantics_send_ok":"Vos modifications ont bien \xe9t\xe9 enregistr\xe9es","report":"Signaler","report_auth":"Ce signalement sera envoy\xe9 en utilisant votre compte \\"{a}\\"","report_nature_label":"Nature du probl\xe8me","report_nature":{"":"S\xe9lectionnez la nature du probl\xe8me\u2026","blur_missing":"Un visage ou une plaque d\'immatriculation est visible","blur_excess":"Un objet qui ne n\xe9cessite pas de floutage est flout\xe9","inappropriate":"L\'image est inappropri\xe9e (non pertinente, nudit\xe9\u2026)","privacy":"Un chemin priv\xe9 ou une propri\xe9t\xe9 priv\xe9e est visible","picture_low_quality":"L\'image est de mauvaise qualit\xe9","mislocated":"L\'image est mal g\xe9olocalis\xe9e","copyright":"L\'image enfreint les droits d\'auteur","other":"Tout autre type de probl\xe8me"},"report_whole_sequence":"Cela concerne toute la s\xe9quence","report_details":"D\xe9tails suppl\xe9mentaires","report_details_placeholder":"Optionnel, vous pouvez ajouter des d\xe9tails sur le probl\xe8me","report_email":"Votre email","report_email_placeholder":"Optionnel","report_submit":"Envoyer","report_wait":"Envoi du signalement en cours\u2026","report_success":"Le signalement a \xe9t\xe9 envoy\xe9 avec succ\xe8s. Il sera examin\xe9 d\xe8s que possible.","report_failure":"Une erreur est survenue lors de la cr\xe9ation du signalement : {e}. Veuillez r\xe9essayer plus tard."},"map":{"loading":"Chargement\u2026","thumbnail":"Miniature de la photo survol\xe9e","not_public":"Masqu\xe9 au public","slow_loading":"La carte est longue \xe0 charger et pourrait appara\xeetre cass\xe9e","map_data":"Carte bas\xe9e sur {m}","more_panoramax":"En savoir plus sur Panoramax"}}')},6909:at=>{"use strict";at.exports=JSON.parse('{"psv":{"twoFingers":"K\xe9t ujjal navig\xe1lhat","ctrlZoom":"K\xf6zel\xedt\xe9s vagy t\xe1vol\xedt\xe1s: Ctrl + g\xf6rget\xe9s","loadError":"A panor\xe1ma nem t\xf6lthet\u0151 be"},"pnx":{"zoom":"Nagy\xedt\xe1s","zoomOut":"T\xe1vol\xedt\xe1s","zoomIn":"K\xf6zel\xedt\xe9s","moveUp":"Mozg\xe1s fel","moveDown":"Mozg\xe1s le","moveLeft":"Mozg\xe1s balra","moveRight":"Mozg\xe1s jobbra","moveMiddle":"N\xe9zet k\xf6z\xe9pre hoz\xe1sa","expand":"B\u0151v\xedt\xe9s","expand_info":"Widget megjelen\xedt\xe9se teljes oldalon","show_psv":"K\xe9pn\xe9zeget\u0151 megjelen\xedt\xe9se","show_map":"T\xe9rk\xe9p megjelen\xedt\xe9se","minimize":"Widget elrejt\xe9se; a bal als\xf3 sarokban l\xe9v\u0151 gombbal \xfajra megjelen\xedtheti","options":"Be\xe1ll\xedt\xe1sok","filters":"Sz\u0171r\u0151k","layers":"R\xe9tegek","share":"Megoszt\xe1s","search":"Keres\xe9s","search_empty":"Nincs tal\xe1lat","share_links":"Linkek","share_page":"Link erre az oldalra","share_image":"Nagy felbont\xe1s\xfa (HD) k\xe9p","share_rss":"RSS h\xedrcsatorna","share_rss_title":"A t\xe9rk\xe9p l\xe1that\xf3 ter\xfclet\xe9n l\xe9v\u0151 \xfaj sorozatok RSS-h\xedrcsatorn\xe1ja","share_embed":"Be\xe1gyaz\xe1s a weboldaladon","share_print":"Nyomtat\xe1s","copy":"M\xe1sol\xe1s","copied":"M\xe1solva","error":"Ajjaj, baj van\u2026","error_subtitle":"Pr\xf3b\xe1lja \xfajra k\xe9s\u0151bb, vagy n\xe9zze meg a b\xf6ng\xe9sz\u0151konzolt a tov\xe1bbi r\xe9szletek\xe9rt.","sequence_next":"A sorozat k\xf6vetkez\u0151 k\xe9pe","sequence_play":"Sorozat lej\xe1tsz\xe1sa","sequence_pause":"Sorozatlej\xe1tsz\xe1s sz\xfcneteltet\xe9se","sequence_prev":"A sorozat el\u0151z\u0151 k\xe9pe","sequence_more":"Tov\xe1bbi lej\xe1tsz\xe1si lehet\u0151s\xe9gek","sequence_speed":"Lej\xe1tsz\xe1s sebess\xe9ge","legend_license":"Licenc: {l}","edit_osm":"OSM szerkeszt\xe9se","id":"iD","josm":"JOSM","josm_live":"JOSM automatikus szinkroniz\xe1l\xe1s\xe1nak enged\xe9lyez\xe9se k\xe9pbet\xf6lt\xe9skor","loading_labels_serious":["\ud83d\uddfa\ufe0f T\xe9rk\xe9padatok bet\xf6lt\xe9se","\ud83d\udda5\ufe0f API lek\xe9rdez\xe9se","\ud83d\uddbc\ufe0f B\xe9lyegk\xe9pek bet\xf6lt\xe9se","\ud83d\udd0d EXIF metaadatok elemz\xe9se","\ud83c\udfd8\ufe0f 3D megjelen\xedt\xe9s","\ud83d\udcf7 360\xb0-os k\xe9pek inicializ\xe1l\xe1sa","\ud83d\udfe0 Sz\xednek kiegyenl\xedt\xe9se","\ud83d\udcaf Min\u0151s\xe9gi pontsz\xe1m kisz\xe1m\xedt\xe1sa \xa9"],"loading_labels_fun":["\ud83e\udd8c Vadvesz\xe9lyt jelz\u0151 t\xe1bla \xe9szlel\xe9se","\ud83d\ude98 Panoramax aut\xf3 \xa9 keres\xe9se","\u2615 Koffeininjekci\xf3","\ud83d\ude00 Mosolyogj, fel lett\xe9l t\xe9rk\xe9pezve!","\ud83d\udc08 Kiscic\xe1s k\xe9pek megoszt\xe1sa","\ud83d\ude34 Halogat\xe1s cs\xf6kkent\xe9se","\ud83e\uded6 Tea megf\u0151z\xe9se","\ud83d\udc27 Forr\xe1sk\xf3d felnyit\xe1sa","\ud83d\ude87 Metr\xf3\xe1llom\xe1sok indexel\xe9se","\ud83e\uddf9 Metaadatok tisztogat\xe1sa","\ud83d\ude92 T\u0171zolt\xf3s\xe1gr\xf3l sz\xf3l\xf3 fot\xf3k bek\xfcld\xe9se","\ud83d\udeb2 Z\xf6ldutak friss\xedt\xe9se","\ud83d\ude89 Peronok bej\xe1r\xe1sa","\ud83d\udef0\ufe0f M\u0171holdak keres\xe9se","\ud83d\udc65 Person\xe1k meg\xedr\xe1sa","\ud83d\udc1f S\xfcltkrumplikap\xf3k lokaliz\xe1l\xe1sa","\ud83e\uddd1\u200d\ud83d\udcbb Hibakeres\u0151 fel\xfclet","\ud83d\udcc8 Statisztika n\xf6vel\xe9se"],"error_psv":"A Photo Sphere Viewer (g\xf6mbpanor\xe1ma-n\xe9zeget\u0151) nem t\xf6lt\u0151dik be megfelel\u0151en","error_pic":"A k\xe9rt k\xe9p nem tal\xe1lhat\xf3","error_nopic":"Az adott helyen nem \xe9rhet\u0151 el k\xe9p","error_api":"A k\xe9pkiszolg\xe1l\xf3 nem \xe9rhet\u0151 el","error_webgl":"A WebGL nem t\xe1mogatott ebben a b\xf6ng\xe9sz\u0151ben","error_josm":"A JOSM nem v\xe1laszol. Val\xf3ban fut \xe9s el\xe9rhet\u0151 t\xe1volr\xf3l?","error_api_compatibility":"A k\xe9pkiszolg\xe1l\xf3 nem kompatibilis a k\xe9pn\xe9zeget\u0151 ezen verzi\xf3j\xe1val","filter_date":"D\xe1tum szerint","filter_user":"Felhaszn\xe1l\xf3 szerint","filter_picture":"K\xe9pt\xedpus szerint","picture_flat":"Klasszikus","picture_360":"360\xb0","filter_camera_model":"Kameramodell szerint","map_background":"T\xe9rk\xe9ph\xe1tt\xe9r","map_background_aerial":"L\xe9gi felv\xe9tel","map_background_streets":"k\xe9pUtca","map_theme":"T\xe9rk\xe9p t\xe9m\xe1ja","map_theme_default":"Klasszikus","map_theme_age":"K\xe9pk\xe9sz\xedt\xe9s ideje","map_theme_age_1":"> 2 \xe9ve","map_theme_age_2":"< 2 \xe9ve","map_theme_age_3":"< 1 \xe9ve","map_theme_age_4":"< 1 h\xf3napja","map_theme_type":"Kamerat\xedpus","contrast":"Nagyobb k\xe9pkontraszt enged\xe9lyez\xe9se","metadata":"K\xe9p metaadatai","metadata_general_picid":"K\xe9p azonos\xedt\xf3js","metadata_general_seqid":"Sorozat azonos\xedt\xf3ja","metadata_general_picid_link":"Ugr\xe1s a k\xe9p JSON le\xedr\xe1s\xe1hoz","metadata_general_seqid_link":"Ugr\xe1s a sorozat JSON le\xedr\xe1s\xe1hoz","metadata_general_author":"Szerz\u0151","metadata_general_license":"Licenc (enged\xe9ly)","metadata_general_license_link":"Ugr\xe1s a licenc teljes le\xedr\xe1s\xe1hoz","metadata_general_date":"K\xe9sz\xedt\xe9s d\xe1tuma","metadata_camera":"Kamera","metadata_camera_make":"Gy\xe1rt\xf3","metadata_camera_model":"Modell","metadata_camera_type":"T\xedpus","metadata_camera_focal_length":"Gy\xfajt\xf3t\xe1vols\xe1g","metadata_location":"Helysz\xedn","metadata_location_longitude":"Hossz\xfas\xe1g","metadata_location_latitude":"Sz\xe9less\xe9g","metadata_location_orientation":"Felv\xe9tel ir\xe1nya","metadata_location_precision":"Helymeghat\xe1roz\xe1s pontoss\xe1ga","metadata_exif":"EXIF / XMP","metadata_exif_name":"C\xedmke","metadata_exif_value":"\xc9rt\xe9k","report":"K\xe9p bejelent\xe9se","report_auth":"A jelent\xe9s a fi\xf3kod ({a}) felhaszn\xe1l\xe1s\xe1val lesz elk\xfcldve","report_nature":{"":"Probl\xe9ma jelleg\xe9nek kiv\xe1laszt\xe1sa\u2026","blur_missing":"A k\xe9pen l\xe1tszik egy szem\xe9ly arca vagy egy rendsz\xe1mt\xe1bla","blur_excess":"A k\xe9pen el van hom\xe1lyos\xedtva egy olyan objektum, amelynek \xe9lesnek kellene lennie","inappropriate":"A k\xe9p nem megfelel\u0151 (irrelev\xe1ns, meztelens\xe9get jelen\xedt meg stb.)","privacy":"A k\xe9pen mag\xe1n\xfat vagy mag\xe1nter\xfclet l\xe1that\xf3","picture_low_quality":"A k\xe9p nagyon rossz min\u0151s\xe9g\u0171","mislocated":"A k\xe9p rosszul van elhelyezve a t\xe9rk\xe9pen","copyright":"A k\xe9p szerz\u0151i jogot s\xe9rt","other":"B\xe1rmilyen m\xe1s jelleg\u0171 probl\xe9ma"},"report_nature_label":"Probl\xe9ma jellege","report_details":"Tov\xe1bbi r\xe9szletek","filter_zoom_in":"Nagy\xedts a sz\u0171r\u0151k l\xe1that\xf3v\xe1 t\xe9tel\xe9hez","report_email":"E-mail-c\xedm","report_email_placeholder":"Nem k\xf6telez\u0151","report_submit":"Bek\xfcld\xe9s","report_success":"A jelent\xe9s sikeresen be lett k\xfcldve; a lehet\u0151 leghamarabb megvizsg\xe1ljuk.","report_failure":"Hiba t\xf6rt\xe9nt a jelent\xe9s l\xe9trehoz\xe1sakor: {e}. K\xe9rj\xfck, pr\xf3b\xe1ld meg k\xe9s\u0151bb \xfajra.","search_user":"Felhaszn\xe1l\xf3n\xe9v keres\xe9se\u2026","search_address":"C\xedm, v\xe1ros stb. keres\xe9se\u2026","share_embed_docs":"Tov\xe1bbi inform\xe1ci\xf3 a be\xe1gyaz\xe1s konfigur\xe1l\xe1s\xe1r\xf3l","error_click":"Kattints a folytat\xe1shoz","error_retry":"K\xe9rj\xfck, pr\xf3b\xe1ld meg k\xe9s\u0151bb","legend_title":"K\xe9p adatainak megjelen\xedt\xe9se","report_whole_sequence":"A teljes sorozatra vonatkozik","report_wait":"Jelent\xe9s bek\xfcld\xe9se folyamatban\u2026","report_details_placeholder":"Megadhatsz tov\xe1bbi r\xe9szleteket a probl\xe9m\xe1r\xf3l (nem k\xf6telez\u0151)","filter_qualityscore_help":"Kattints az enged\xe9lyez\xe9shez vagy a letilt\xe1shoz","filter_qualityscore":"Min\u0151s\xe9gi pontsz\xe1m","map_theme_score":"Min\u0151s\xe9gi pontsz\xe1m","metadata_camera_resolution":"Felbont\xe1s","metadata_quality":"Min\u0151s\xe9gi pontsz\xe1m","metadata_quality_help":"Tov\xe1bbi tudnival\xf3k a min\u0151s\xe9gi pontsz\xe1mr\xf3l","metadata_quality_score":"\xd6sszes\xedtett pontsz\xe1m","metadata_quality_gps_score":"Pozicion\xe1l\xe1si pontsz\xe1m","metadata_quality_resolution_score":"Felbont\xe1si pontsz\xe1m","metadata_quality_missing":"a k\xe9pben nincs megadva \xe9rt\xe9k"},"map":{"loading":"Bet\xf6lt\xe9s\u2026","thumbnail":"A kurzor alatti k\xe9p b\xe9lyegk\xe9pe","not_public":"Nem l\xe1that\xf3 nyilv\xe1nosan","slow_loading":"A t\xe9rk\xe9p lassan t\xf6lt\u0151dik be, \xe9s lehet, hogy lerobbant"},"maplibre":{"GeolocateControl.FindMyLocation":"Tart\xf3zkod\xe1si hely megtal\xe1l\xe1sa","GeolocateControl.LocationNotAvailable":"Tart\xf3zkod\xe1si hely nem \xe9rhet\u0151 el"}}')},4895:at=>{"use strict";at.exports=JSON.parse('{"pnx":{"expand":"Espandi","zoomOut":"Rimpicciolisci","zoomIn":"Ingrandisci","zoom":"Zoom","moveUp":"Muovi in alto","moveDown":"Muovi in basso","moveLeft":"Muovi a sinistra","moveRight":"Muovi a destra","expand_info":"Fai apparire il widget a schermo pieno","options":"Opzioni","filters":"Filtri","layers":"Livelli","search":"Cerca","search_empty":"Nessun risultato trovato","search_address":"Cerca un indirizzo, citt\xe0\u2026","search_user":"Cerca un nome utente\u2026","share":"Condividi","share_links":"Collegamenti","share_page":"Collegamento a questa immagine","share_image":"Immagine HD","share_embed":"Incorpora nel tuo sito web","share_embed_docs":"Scopri di pi\xf9 sulla configurazione della incorporazione","share_print":"Stampa","copy":"Copia","copied":"Copiato","error":"Abbiamo un problema\u2026","error_click":"Continuare","error_retry":"Riprovare pi\xf9 tardi","sequence_play":"Riproduci questa sequenza","sequence_pause":"Pausa la sequenza","sequence_speed":"Velocit\xe0 di riproduzione","legend_license":"Licenza: {l}","legend_title":"Mostra dettagli della foto","edit_osm":"Modifica OSM","loading_labels_serious":["\ud83d\uddfa\ufe0f Caricamento dei dati della mappa","\ud83d\udda5\ufe0f Interrogazione delle API","\ud83d\uddbc\ufe0f Caricamento delle miniature","\ud83d\udd0d Analisi dei metadata EXIF","\ud83c\udfd8\ufe0f Creazione del rendering 3D","\ud83d\udcf7 Inizializzazione delle foto a 360\xb0","\ud83d\udfe0 Bilanciamento del colore","\ud83d\udcaf Calcolo del punteggio della qualit\xe0 \xa9","\ud83d\udce1 Scaricamento degli aggiornamenti","\ud83c\udf0d Recupero dei tasselli della mappa","\ud83d\udcf8 Elaborazione delle ombre"],"loading_labels_fun":["\ud83e\udd8c Rilevazione dei cartelli di attraversamento dei cervi","\ud83d\ude98 Ricerca dell\u2019auto Panoramax \xa9","\u2615 Iniezione di caffeina","\ud83d\ude00 Sorridete, siete stati mappati!","\ud83d\udc08 Condivisione delle foto di gatti","\ud83d\ude34 Riduzione della procrastinazione","\ud83e\uded6 Preparazione del t\xe8","\ud83d\udc27 Apertura del codice sorgente","\ud83d\ude87 Indicizzazione delle stazioni della metro","\ud83e\uddf9 Pulizia dei metadata","\ud83d\ude92 Invio delle foto delle stazioni dei pompieri","\ud83d\udeb2 Aggiornamento delle strade verdi","\ud83d\ude89 Passeggiata sulle banchine della stazione","\ud83d\udef0\ufe0f Ricerca dei satelliti","\ud83d\udc65 Scrittura delle persone","\ud83d\udc1f Ricerca dei negozi di patatine fritte","\ud83e\uddd1\u200d\ud83d\udcbb Debug dell\u2019interfaccia","\ud83d\udcc8 Incremento delle statistiche","\ud83e\udd16 Apprendimento della semantica","\ud83c\udfa8 Riprogettazione dell\u2019interfaccia","\ud83d\udcc5 Pianificazione di eventi di photo-mapping","\ud83e\uddc0 Affinamento dei formaggi","\ud83c\udf04 Calcolo della nebbia in Valpadana","\ud83c\udf0a Misurazione delle grandi maree"],"error_psv":"Il visualizzatore delle foto sferiche non si sta caricando correttamente","error_pic":"La foto richiesta non \xe8 stata trovata","error_nopic":"Nessuna foto disponibile alla posizione richiesta","error_api":"Il server delle foto non \xe8 disponibile","error_webgl":"Il tuo browser non supporta WebGL","error_josm":"JOSM non risponde, \xe8 in esecuzione con il controllo remoto abilitato?","error_api_compatibility":"Il server delle foto non \xe8 compatibile con questa versione del visualizzatore","filter_date":"Data","filter_date_1month":"1 mese","filter_date_1year":"1 anno","filter_user_mypics":"Le mie foto","filter_picture":"Tipo di foto","filter_zoom_in":"Ingrandisci la mappa per vedere questo filtro","picture_flat":"Classica","picture_360":"360\xb0","filter_qualityscore_help":"Clicca per abilitare o disabilitare","map_background":"Sfondo della mappa","map_background_aerial":"Satellite","map_background_streets":"Strade","map_theme":"Tema della mappa","map_theme_default":"Classica","map_theme_age":"Data di acquisizione","map_theme_age_2":"< 2 anni","map_theme_age_3":"< 1 anno","map_theme_age_4":"< 1 mese","map_theme_score":"Punteggio della qualit\xe0","contrast":"Abilita un maggiore contrasto della foto","metadata":"Metadata della foto","metadata_general_picid":"Foto","metadata_general_picid_link":"Vai alla descrizione JSON della foto","metadata_general_seqid_link":"Vai alla descrizione JSON della sequenza","metadata_general_author":"Autore","metadata_general_license":"Licenza","metadata_general_date":"Data di acquisizione","metadata_camera":"Fotocamera","metadata_camera_make":"Costruttore","metadata_camera_model":"Modello","metadata_camera_type":"Tipo","metadata_camera_resolution":"Risoluzione","metadata_location":"Posizione","metadata_location_longitude":"Longitudine","metadata_location_latitude":"Latitudine","metadata_location_precision":"Precisione della posizione","metadata_quality":"Qualit\xe0","metadata_quality_score":"Punteggio globale","metadata_quality_gps_score":"Punteggio della posizione","metadata_quality_resolution_score":"Punteggio della risoluzione","metadata_exif":"EXIF","metadata_exif_name":"Attributo","report_auth":"Questa segnalazione verr\xe0 inviata usando la tua utenza \u201c{a}\u201d","report_nature_label":"Natura del problema","report_nature":{"blur_excess":"Un oggetto che non ha bisogno di essere offuscato lo \xe8","inappropriate":"La foto \xe8 inappropriata (non pertinente, nudo, \u2026)","mislocated":"La foto non \xe8 ben posizionata sulla mappa","copyright":"La foto viola il diritto d\u2019autore","other":"Qualsiasi altro tipo di problema","picture_low_quality":"La foto \xe8 di qualit\xe0 scarsa","":"Selezione la natura del problema\u2026","blur_missing":"Sono visibili la faccia di una persona o la targa di un\u2019auto","privacy":"Sono visibili un sentiero o una propriet\xe0 privati"},"report_whole_sequence":"Riguarda l\u2019intera sequenza","report_details":"Ulteriori dettagli","report_email":"La tua e-mail","report_email_placeholder":"Facoltativo","report_submit":"Invia","report_wait":"Invio della segnalazione\u2026","report_failure":"\xc8 avvenuto un errore durante la creazione della segnalazione: {e}. Riprovare pi\xf9 tardi.","moveMiddle":"Centra la visuale","show_map":"Mostra la mappa","sequence_next":"Prossima foto nella sequenza","map_theme_age_1":"> 2 anni","map_theme_type":"Tipo di fotocamera","minimize":"Nascondi il widget, puoi mostrarlo di nuovo usando il pulsante nell\u2019angolo in basso a sinistra","metadata_general_license_link":"Vedi la descrizione completa della licenza","share_rss":"Feed RSS","show_psv":"Mostra il visualizzatore delle foto","share_rss_title":"Feed RSS delle nuove sequenze nell\u2019attuale area visibile della mappa","sequence_prev":"Foto precedente della sequenza","sequence_more":"Altre opzioni di riproduzione","josm_live":"Abilita la sincronizzazione automatica di JOSM al caricamento delle foto","metadata_general_seqid":"Sequenza","metadata_camera_focal_length":"Lunghezza focale","filter_user":"Utente","metadata_location_orientation":"Direzione","filter_qualityscore":"Punteggio della qualit\xe0","metadata_quality_help":"Per saperne di pi\xf9 sul punteggio della qualit\xe0","metadata_quality_missing":"Nessun valore impostato nella foto","metadata_exif_value":"Valore","report":"Segnala","report_details_placeholder":"Facoltativo, puoi aggiungere dei dettagli sul problema e sul perch\xe9 lo ritieni rilevante","report_success":"La segnalazione \xe8 stata inviata correttamente. Non appena possibile verr\xe0 esaminata.","minimize_short":"Nascondi","qualityscore_title":"Informazioni sul punteggio della qualit\xe0","qualityscore_doc_1":"Panoramax propone un Punteggio della qualit\xe0 per ogni foto. Ci\xf2 permette di filtrare facilmente la mappa e mostrare le foto di alta qualit\xe0 disponibili.","qualityscore_doc_2":"Il voto \xe8 mostrato agli utenti con un valore tipo A/B/C/D/E (A \xe8 il voto migliore, E il peggiore) e graficamente viene mostrato con la seguente scala:","qualityscore_doc_link":"Nella nostra documentazione sono presenti maggiori dettagli sul calcolo del Punteggio della qualit\xe0.","qualityscore_doc_3":"Esso \xe8 calcolato basandosi sulla precisione del GPS e sulla risoluzione della foto. Un sistema professionale avr\xe0 un punteggio A, un action camera a 360\xb0 avr\xe0 un punteggio B e uno smartphone verr\xe0 classificato come C, D o E.","metadata_general_instance":"Istanza di origine","josm":"JOSM","picture_flat_long":"Foto classica","picture_360_long":"Foto panoramica","metadata_summary":"Sintesi","metadata_general_copy_id":"Copia l\u2019ID","metadata_general_copy_picid":"Copia l\u2019ID della foto","id":"iD","contribute_id":"Contribuisci a OpenStreetMap con l\u2019editor iD","geo_uri":"App esterna","filter_date_6months":"6 mesi","picture_all":"Tutte","metadata_exif_doc":"Doc per gli attributi EXIF","metadata_exif_doc_title":"Vai alla documentazione di Exiv2 per i dettagli completi sulle definizioni degli attributi EXIF e XMP","semantics_value":"Valore","semantics_key_doc":"Per saperne di pi\xf9 su questa chiave","semantics_title":"Etichette","semantics_features":"Oggetti rilevati","semantics_features_none":"Non \xe8 ancora stato rilevato alcun oggetto in questa foto.","semantics_features_default_title":"Oggetto #{nb}","semantics_features_subtitle":"{nb} propriet\xe0 associate","semantics_tags":"{nb} attributi","semantics_show_all_tags":"Mostra tutti gli attributi","semantics_hide_all_tags":"Nascondi tutti gli attributi","semantics_key":"Chiave","semantics_value_doc":"Per saperne di pi\xf9 su questa etichetta","semantics_wikidata_properties":{"P361":"parte di","P31":"instanza di","P279":"sottoclasse di"},"semantics_hide_annotations":"Nascondi le annotazioni della foto","semantics_tags_picture":"Etichette della foto","semantics_show_annotations":"Mostra le annotazioni della foto","semantics_annotation_tooltip":"Clicca per vedere i dettagli","semantics_tags_picture_none":"Non \xe8 stata ancora aggiunta alcuna etichetta su questa foto.","semantics_qualifiers":"Qualificatori","metadata_location_coordinates":"Coordinate (longitudine, latitudine)","metadata_location_copy":"Copia {v}","metadata_location_copy_more":"Ulteriori opzioni per la copia delle coordinate","whats_panoramax":"Panoramax \xe8 la geo-commons per le foto dei territori.","panoramax":"Panoramax","semantics_zero_annotations":"Nessuna annotazione impostata per questa immagine","semantics_hashtags":"Hashtag dell\u2019immagine","semantics_editor_error":"La sintassi non \xe8 valida. Le tue etichette devono avere la seguente forma:\\nchiave=valore\\nprefisso|chiave=valore\\nprefisso|chiave[qualif_chiave=qualif_valore]=valore\\n\\nLa lunghezza massima di una chiave \xe8 di 256 caratteri, quella di un valore \xe8 di 2048 caratteri."},"psv":{"loadError":"Impossibile caricare l\u2019immagine panoramica","ctrlZoom":"Utilizza Ctrl + rotellina del mouse per ingrandire l\u2019immagine","twoFingers":"Usa due dita per spostarti"},"maplibre":{"GeolocateControl.FindMyLocation":"Trova la mia posizione","GeolocateControl.LocationNotAvailable":"Posizione non disponibile"},"map":{"loading":"Caricamento\u2026","thumbnail":"Miniatura della foto passata con il mouse","not_public":"Non pubblicamente visibile","slow_loading":"La mappa impiega troppo tempo a caricarsi e potrebbe apparire a pezzi","map_data":"Dati cartografici: {m}","more_panoramax":"Per saperne di pi\xf9 su Panoramax"}}')},3979:at=>{"use strict";at.exports=JSON.parse('{"pnx":{"metadata_general_picid":"\u753b\u50cf\u8b58\u5225\u5b50","loading_labels_fun":["\ud83e\udd8c \u9e7f\u306e\u6a2a\u65ad\u6a19\u8b58\u306e\u691c\u51fa","\ud83d\ude98 Panoramax Car \xa9\u3092\u691c\u7d22","\u2615 \u30ab\u30d5\u30a7\u30a4\u30f3\u306e\u6ce8\u5165","\ud83d\ude00 \u7b11\u3063\u3066\u304f\u3060\u3055\u3044\u3001\u3042\u306a\u305f\u306f\u5730\u56f3\u306b\u8f09\u3063\u3066\u3044\u307e\u3059\uff01","\ud83d\udc08 \u732b\u306e\u5199\u771f\u3092\u5171\u6709\u3059\u308b","\ud83d\ude34 \u5148\u5ef6\u3070\u3057\u3092\u6e1b\u3089\u3059","\ud83e\uded6 \u304a\u8336\u3092\u6df9\u308c\u308b","\ud83d\udc27 \u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u3092\u516c\u958b","\ud83d\ude87 \u5730\u4e0b\u9244\u99c5\u306e\u7d22\u5f15","\ud83e\uddf9 \u30e1\u30bf\u30c7\u30fc\u30bf\u306e\u30af\u30ea\u30fc\u30f3\u30a2\u30c3\u30d7","\ud83d\ude92 \u6d88\u9632\u7f72\u306e\u5199\u771f\u3092\u9001\u4fe1","\ud83d\udeb2 \u30b0\u30ea\u30fc\u30f3\u30a6\u30a7\u30a4\u30ba\u306e\u66f4\u65b0","\ud83d\ude89 \u99c5\u306e\u30db\u30fc\u30e0\u306e\u30a6\u30a9\u30fc\u30af\u30b9\u30eb\u30fc","\ud83d\udef0\ufe0f \u885b\u661f\u306e\u63a2\u7d22","\ud83d\udc65 \u30da\u30eb\u30bd\u30ca\u3092\u66f8\u304f","\ud83d\udc1f \u30c1\u30c3\u30d7\u30b7\u30e7\u30c3\u30d7\u306e\u5834\u6240","\ud83e\uddd1\u200d\ud83d\udcbb \u30c7\u30d0\u30c3\u30b0\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9","\ud83d\udcc8 \u7d71\u8a08\u306e\u5897\u52a0"],"share_embed_docs":"\u57cb\u3081\u8fbc\u307f\u8a2d\u5b9a\u306e\u8a73\u7d30\u3092\u8aad\u3080","filter_zoom_in":"\u3053\u306e\u30d5\u30a3\u30eb\u30bf\u30fc\u3092\u8868\u793a\u3059\u308b\u306b\u306f\u62e1\u5927\u3057\u3066\u304f\u3060\u3055\u3044","metadata_camera_type":"\u30bf\u30a4\u30d7","minimize":"\u3053\u306e\u30a6\u30a3\u30b8\u30a7\u30c3\u30c8\u3092\u975e\u8868\u793a\u306b\u3059\u308b\u306b\u306f\u3001\u5de6\u4e0b\u306e\u30dc\u30bf\u30f3\u3092\u4f7f\u7528\u3057\u3066\u518d\u5ea6\u8868\u793a\u3057\u307e\u3059","error_psv":"Photo Sphere Viewer \u304c\u6b63\u3057\u304f\u8aad\u307f\u8fbc\u307e\u308c\u307e\u305b\u3093\u3067\u3057\u305f","error_josm":"JOSM \u304c\u5fdc\u7b54\u3057\u307e\u305b\u3093\u3002\u5b9f\u884c\u3055\u308c\u3066\u3044\u3066\u3001\u30ea\u30e2\u30fc\u30c8\u304c\u6709\u52b9\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u304b?","filter_user":"\u30e6\u30fc\u30b6\u30fc","qualityscore_doc_3":"\u3053\u308c\u306f GPS \u306e\u7cbe\u5ea6\u3068\u753b\u50cf\u306e\u89e3\u50cf\u5ea6\u306b\u57fa\u3065\u3044\u3066\u8a08\u7b97\u3055\u308c\u307e\u3059\u3002\u30d7\u30ed\u4ed5\u69d8\u306e\u30b7\u30b9\u30c6\u30e0\u306f A \u8a55\u4fa1\u3001360\xb0 \u30a2\u30af\u30b7\u30e7\u30f3 \u30ab\u30e1\u30e9\u306f B \u8a55\u4fa1\u3001\u30b9\u30de\u30fc\u30c8\u30d5\u30a9\u30f3\u306f C/D/E \u8a55\u4fa1\u306b\u306a\u308a\u307e\u3059\u3002","report_nature":{"inappropriate":"\u5199\u771f\u304c\u4e0d\u9069\u5207\u3067\u3059\uff08\u7121\u95a2\u4fc2\u3001\u30cc\u30fc\u30c9\u306a\u3069\uff09","":"\u554f\u984c\u306e\u6027\u8cea\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u2026","blur_missing":"\u4eba\u306e\u9854\u3084\u8eca\u306e\u30ca\u30f3\u30d0\u30fc\u30d7\u30ec\u30fc\u30c8\u304c\u898b\u3048\u308b","blur_excess":"\u307c\u304b\u3059\u5fc5\u8981\u306e\u306a\u3044\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u304c\u307c\u3084\u3051\u3066\u3044\u308b","privacy":"\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8\u30d1\u30b9\u307e\u305f\u306f\u30d7\u30ed\u30d1\u30c6\u30a3\u304c\u8868\u793a\u3055\u308c\u307e\u3059","picture_low_quality":"\u753b\u50cf\u306e\u54c1\u8cea\u304c\u60aa\u3044","mislocated":"\u5730\u56f3\u4e0a\u306e\u5199\u771f\u306e\u4f4d\u7f6e\u304c\u9069\u5207\u3067\u306f\u3042\u308a\u307e\u305b\u3093","copyright":"\u753b\u50cf\u306f\u8457\u4f5c\u6a29\u3092\u4fb5\u5bb3\u3057\u3066\u3044\u307e\u3059","other":"\u305d\u306e\u4ed6\u306e\u554f\u984c"},"sequence_next":"\u6b21\u306e\u753b\u50cf","sequence_play":"\u3053\u306e\u30b7\u30fc\u30b1\u30f3\u30b9\u306b\u6cbf\u3063\u3066\u30d7\u30ec\u30a4\u3057\u3066\u304f\u3060\u3055\u3044","sequence_pause":"\u4e00\u6642\u505c\u6b62\u30b7\u30fc\u30b1\u30f3\u30b9","sequence_prev":"\u524d\u306e\u753b\u50cf","sequence_more":"\u3088\u308a\u591a\u304f\u306e\u30d7\u30ec\u30a4\u30aa\u30d7\u30b7\u30e7\u30f3","sequence_speed":"\u30d7\u30ec\u30a4\u30e4\u30fc\u306e\u30b9\u30d4\u30fc\u30c9","legend_license":"\u30e9\u30a4\u30bb\u30f3\u30b9: {l}","legend_title":"\u5199\u771f\u306e\u8a73\u7d30\u3092\u8868\u793a","edit_osm":"OSM\u306b\u8ca2\u732e\u3059\u308b","josm_live":"\u753b\u50cf\u8aad\u307f\u8fbc\u307f\u6642\u306bJOSM\u81ea\u52d5\u540c\u671f\u3092\u6709\u52b9\u306b\u3059\u308b","loading_labels_serious":["\ud83d\uddfa\ufe0f \u30de\u30c3\u30d7\u30c7\u30fc\u30bf\u306e\u8aad\u307f\u8fbc\u307f","\ud83d\udda5\ufe0f \u30af\u30a8\u30eaAPI","\ud83d\uddbc\ufe0f \u30b5\u30e0\u30cd\u30a4\u30eb\u3092\u8aad\u307f\u8fbc\u3093\u3067\u3044\u307e\u3059","\ud83d\udd0d EXIF\u30e1\u30bf\u30c7\u30fc\u30bf\u306e\u5206\u6790","\ud83c\udfd8\ufe0f 3D\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0","\ud83d\udcf7 360\xb0\u5199\u771f\u3092\u521d\u671f\u5316\u3057\u3066\u3044\u307e\u3059","\ud83d\udfe0 \u8272\u306e\u30d0\u30e9\u30f3\u30b9","\ud83d\udcaf \u30b3\u30f3\u30d4\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u54c1\u8cea\u30b9\u30b3\u30a2 \xa9"],"error_pic":"\u8981\u6c42\u3055\u308c\u305f\u5199\u771f\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f","error_nopic":"\u6307\u5b9a\u3055\u308c\u305f\u4f4d\u7f6e\u306b\u306f\u753b\u50cf\u304c\u3042\u308a\u307e\u305b\u3093","error_api":"\u5199\u771f\u30b5\u30fc\u30d0\u30fc\u304c\u5229\u7528\u3067\u304d\u307e\u305b\u3093","error_webgl":"WebGL\u306f\u30d6\u30e9\u30a6\u30b6\u3067\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093","error_api_compatibility":"\u753b\u50cf\u30b5\u30fc\u30d0\u30fc\u306f\u3053\u306e\u30d3\u30e5\u30fc\u30a2\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u3068\u4e92\u63db\u6027\u304c\u3042\u308a\u307e\u305b\u3093","filter_date":"\u65e5\u4ed8","filter_date_1month":"1\u30f6\u6708","filter_date_1year":"1\u5e74","filter_user_mypics":"\u79c1\u306e\u5199\u771f","filter_picture":"\u753b\u50cf\u30bf\u30a4\u30d7","picture_flat":"\u30af\u30e9\u30b7\u30c3\u30af","picture_360":"360\xb0","filter_qualityscore":"\u54c1\u8cea\u30b9\u30b3\u30a2","filter_qualityscore_help":"\u30af\u30ea\u30c3\u30af\u3057\u3066\u6709\u52b9\u307e\u305f\u306f\u7121\u52b9\u306b\u3057\u307e\u3059","qualityscore_title":"\u54c1\u8cea\u30b9\u30b3\u30a2\u306b\u3064\u3044\u3066","qualityscore_doc_1":"Panoramax \u306f\u3001\u5404\u5199\u771f\u306b\u54c1\u8cea\u30b9\u30b3\u30a2\u3092\u63d0\u4f9b\u3057\u307e\u3059\u3002\u3053\u308c\u306b\u3088\u308a\u3001\u5730\u56f3\u30d5\u30a3\u30eb\u30bf\u30ea\u30f3\u30b0\u304c\u7c21\u5358\u306b\u306a\u308a\u3001\u9ad8\u54c1\u8cea\u306e\u5199\u771f\u306e\u53ef\u7528\u6027\u3092\u5305\u62ec\u7684\u306b\u8868\u793a\u3067\u304d\u307e\u3059\u3002","qualityscore_doc_2":"\u8a55\u4fa1\u306f A/B/C/D/E \u30b9\u30b3\u30a2 (A \u304c\u6700\u9ad8\u3001E \u304c\u6700\u4f4e) \u3068\u3057\u3066\u30e6\u30fc\u30b6\u30fc\u306b\u8868\u793a\u3055\u308c\u3001\u6b21\u306e\u30b9\u30b1\u30fc\u30eb\u3067\u30b0\u30e9\u30d5\u8868\u793a\u3055\u308c\u307e\u3059\u3002","qualityscore_doc_link":"\u54c1\u8cea\u30b9\u30b3\u30a2\u306e\u8a08\u7b97\u306e\u8a73\u7d30\u306b\u3064\u3044\u3066\u306f\u3001\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3092\u3054\u89a7\u304f\u3060\u3055\u3044\u3002","map_background":"\u5730\u56f3\u306e\u80cc\u666f","map_background_aerial":"\u822a\u7a7a\u5199\u771f","map_background_streets":"\u901a\u308a","map_theme":"\u30de\u30c3\u30d7\u30c6\u30fc\u30de","map_theme_default":"\u30af\u30e9\u30b7\u30c3\u30af","map_theme_age":"\u64ae\u5f71\u65e5","map_theme_age_1":"2\u6b73\u4ee5\u4e0a","map_theme_age_2":"2\u6b73\u672a\u6e80","map_theme_age_3":"1\u6b73\u672a\u6e80","map_theme_age_4":"1\u304b\u6708\u672a\u6e80","map_theme_type":"\u30ab\u30e1\u30e9\u30bf\u30a4\u30d7","map_theme_score":"\u54c1\u8cea\u30b9\u30b3\u30a2","contrast":"\u3088\u308a\u9ad8\u3044\u753b\u50cf\u30b3\u30f3\u30c8\u30e9\u30b9\u30c8\u3092\u6709\u52b9\u306b\u3059\u308b","metadata":"\u753b\u50cf\u30e1\u30bf\u30c7\u30fc\u30bf","metadata_general_seqid":"\u30b7\u30fc\u30b1\u30f3\u30b9\u8b58\u5225\u5b50","metadata_general_picid_link":"\u753b\u50cf\u306eJSON\u8aac\u660e\u3078\u79fb\u52d5","metadata_general_seqid_link":"\u30b7\u30fc\u30b1\u30f3\u30b9\u306eJSON\u8a18\u8ff0\u3078\u79fb\u52d5","metadata_general_author":"\u8457\u8005","metadata_general_license":"\u30e9\u30a4\u30bb\u30f3\u30b9","metadata_general_license_link":"\u30e9\u30a4\u30bb\u30f3\u30b9\u306e\u5b8c\u5168\u306a\u8aac\u660e\u3092\u898b\u308b","metadata_general_date":"\u64ae\u5f71\u65e5","metadata_camera":"\u30ab\u30e1\u30e9","metadata_camera_make":"\u30e1\u30fc\u30ab\u30fc","metadata_camera_model":"\u30e2\u30c7\u30eb","metadata_camera_resolution":"\u89e3\u50cf\u5ea6","metadata_camera_focal_length":"\u7126\u70b9\u8ddd\u96e2","metadata_location":"\u4f4d\u7f6e","metadata_location_longitude":"\u7d4c\u5ea6","metadata_location_latitude":"\u7def\u5ea6","metadata_location_orientation":"\u64ae\u5f71\u65b9\u5411","metadata_location_precision":"\u4f4d\u7f6e\u6c7a\u3081\u7cbe\u5ea6","metadata_quality":"\u54c1\u8cea\u30b9\u30b3\u30a2","metadata_quality_help":"\u54c1\u8cea\u30b9\u30b3\u30a2\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u77e5\u308b","metadata_quality_score":"\u30b0\u30ed\u30fc\u30d0\u30eb\u30b9\u30b3\u30a2","metadata_quality_gps_score":"\u30dd\u30b8\u30b7\u30e7\u30cb\u30f3\u30b0\u30b9\u30b3\u30a2","metadata_quality_resolution_score":"\u89e3\u6c7a\u30b9\u30b3\u30a2","metadata_quality_missing":"\u753b\u50cf\u306b\u5024\u304c\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093","metadata_exif":"EXIF / XMP","metadata_exif_name":"\u30bf\u30b0","metadata_exif_value":"\u4fa1\u5024","report":"\u5199\u771f\u3092\u5831\u544a\u3059\u308b","report_auth":"\u3053\u306e\u30ec\u30dd\u30fc\u30c8\u306f\u3042\u306a\u305f\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u300c{a}\u300d\u3092\u4f7f\u7528\u3057\u3066\u9001\u4fe1\u3055\u308c\u307e\u3059","report_nature_label":"\u554f\u984c\u306e\u6027\u8cea","report_whole_sequence":"\u3053\u308c\u306f\u30b7\u30fc\u30b1\u30f3\u30b9\u5168\u4f53\u306b\u95a2\u4fc2\u3059\u308b","report_details":"\u8ffd\u52a0\u306e\u8a73\u7d30","report_details_placeholder":"\u30aa\u30d7\u30b7\u30e7\u30f3\u3068\u3057\u3066\u3001\u554f\u984c\u306e\u8a73\u7d30\u3068\u305d\u308c\u304c\u3069\u306e\u3088\u3046\u306b\u95a2\u4fc2\u3057\u3066\u3044\u308b\u304b\u3092\u8ffd\u52a0\u3067\u304d\u307e\u3059","report_email":"\u3042\u306a\u305f\u306e\u30e1\u30fc\u30eb","report_email_placeholder":"\u30aa\u30d7\u30b7\u30e7\u30f3","report_submit":"\u9001\u4fe1","report_wait":"\u30ec\u30dd\u30fc\u30c8\u3092\u9001\u4fe1\u3057\u3066\u3044\u307e\u3059\u2026","report_success":"\u30ec\u30dd\u30fc\u30c8\u306f\u6b63\u5e38\u306b\u9001\u4fe1\u3055\u308c\u307e\u3057\u305f\u3002\u3067\u304d\u308b\u3060\u3051\u65e9\u304f\u78ba\u8a8d\u3055\u308c\u307e\u3059\u3002","report_failure":"\u30ec\u30dd\u30fc\u30c8\u306e\u4f5c\u6210\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f: {e}\u3002\u3057\u3070\u3089\u304f\u3057\u3066\u304b\u3089\u3082\u3046\u4e00\u5ea6\u304a\u8a66\u3057\u304f\u3060\u3055\u3044\u3002","zoom":"\u30ba\u30fc\u30e0","zoomOut":"\u30ba\u30fc\u30e0\u30a2\u30a6\u30c8","zoomIn":"\u30ba\u30fc\u30e0\u30a4\u30f3","moveUp":"\u4e0a\u306b\u79fb\u52d5","moveDown":"\u4e0b\u306b\u79fb\u52d5","moveLeft":"\u5de6\u306b\u79fb\u52d5","moveRight":"\u53f3\u306b\u79fb\u52d5","moveMiddle":"\u30d3\u30e5\u30fc\u3092\u4e2d\u592e\u306b\u914d\u7f6e\u3059\u308b","expand":"\u62e1\u5927\u3059\u308b","expand_info":"\u30a6\u30a3\u30b8\u30a7\u30c3\u30c8\u3092\u5168\u30da\u30fc\u30b8\u306b\u8868\u793a\u3059\u308b","show_psv":"\u753b\u50cf\u30d3\u30e5\u30fc\u30a2\u3092\u8868\u793a\u3059\u308b","show_map":"\u5730\u56f3\u3092\u8868\u793a","minimize_short":"\u96a0\u308c\u308b","options":"\u30aa\u30d7\u30b7\u30e7\u30f3","filters":"\u30d5\u30a3\u30eb\u30bf\u30fc","layers":"\u30ec\u30a4\u30e4\u30fc","search":"\u691c\u7d22","search_empty":"\u7d50\u679c\u306a\u3057","search_address":"\u4f4f\u6240\u3001\u5e02\u533a\u753a\u6751\u306a\u3069\u3092\u691c\u7d22","search_user":"\u30e6\u30fc\u30b6\u30fc\u540d\u3092\u691c\u7d22\u2026","share":"\u5171\u6709","share_links":"\u30ea\u30f3\u30af","share_page":"\u3053\u306e\u30da\u30fc\u30b8\u3078\u306e\u30ea\u30f3\u30af","share_image":"HD\u753b\u50cf","share_rss":"RSS\u30d5\u30a3\u30fc\u30c9","share_rss_title":"\u73fe\u5728\u8868\u793a\u3055\u308c\u3066\u3044\u308b\u30de\u30c3\u30d7\u30a8\u30ea\u30a2\u5185\u306e\u65b0\u3057\u3044\u30b7\u30fc\u30b1\u30f3\u30b9\u306e RSS \u30d5\u30a3\u30fc\u30c9","share_embed":"\u30a6\u30a7\u30d6\u30b5\u30a4\u30c8\u306b\u57cb\u3081\u8fbc\u3080","share_print":"\u5370\u5237","copy":"\u30b3\u30d4\u30fc","copied":"\u30b3\u30d4\u30fc\u3057\u307e\u3057\u305f","error":"\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u2026","error_click":"\u7d9a\u304f","error_retry":"\u5f8c\u3067\u3082\u3046\u4e00\u5ea6\u304a\u8a66\u3057\u304f\u3060\u3055\u3044"},"map":{"loading":"\u8aad\u307f\u8fbc\u307f\u4e2d\u2026","thumbnail":"\u30db\u30d0\u30fc\u3057\u305f\u753b\u50cf\u306e\u30b5\u30e0\u30cd\u30a4\u30eb","not_public":"\u516c\u958b\u3055\u308c\u306a\u3044","slow_loading":"\u30de\u30c3\u30d7\u306e\u8aad\u307f\u8fbc\u307f\u304c\u9045\u304f\u3001\u58ca\u308c\u3066\u3044\u308b\u3088\u3046\u306b\u898b\u3048\u308b\u5834\u5408\u304c\u3042\u308a\u307e\u3059"},"psv":{"twoFingers":"2\u672c\u306e\u6307\u3067\u79fb\u52d5\u3057\u307e\u3059","ctrlZoom":"Ctrl + \u30b9\u30af\u30ed\u30fc\u30eb\u3067\u753b\u50cf\u3092\u62e1\u5927\u3057\u307e\u3059","loadError":"\u753b\u50cf\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093"},"maplibre":{"GeolocateControl.FindMyLocation":"\u81ea\u5206\u306e\u4f4d\u7f6e\u3092\u8868\u793a","GeolocateControl.LocationNotAvailable":"GPS\u306f\u5229\u7528\u3067\u304d\u307e\u305b\u3093"}}')},6920:at=>{"use strict";at.exports=JSON.parse('{"pnx":{"zoomIn":"Zoom in","zoom":"Zoom","zoomOut":"Zoom uit","moveDown":"Naar beneden","search_user":"Zoek een gebruikersnaam\u2026","moveUp":"Ga omhoog","share_rss":"RSS-feed","loading_labels_serious":["\ud83d\uddfa\ufe0f Kaart aan het laden","\ud83d\udda5\ufe0f API opvragen","\ud83d\uddbc\ufe0f Miniatuurweergaven laden","\ud83d\udd0d EXIF metadata analyseren","\ud83c\udfd8\ufe0f 3D-rendering","\ud83d\udcf7 360\xb0 afbeelden initialiseren","\ud83d\udfe0 Kleur balancering","\ud83d\udcaf Bereken kwaliteits-score \xa9","\ud83d\udce1 Updates downloaden","\ud83c\udf0d Kaarttegels ophalen","\ud83d\udcf8 Schaduwen verwerken"],"share_embed_docs":"Lees meer over embedded instellingen","sequence_pause":"Pauzeer sequentie","sequence_prev":"Vorige afbeelding uit de sequentie","id":"iD","josm":"JOSM","sequence_more":"Meer afspeelmogelijkheden","sequence_speed":"Afspeel snelheid","edit_osm":"OSM aanpassen","moveLeft":"Naar links","moveRight":"Naar rechts","moveMiddle":"Middelpunt","expand":"Vergroot","show_psv":"Toon de afbeeldingsviewer","show_map":"Toon de kaart","options":"Opties","filters":"Filters","layers":"Lagen","search":"Zoek","search_empty":"Geen resultaat gevonden","search_address":"Zoek een adres, stad\u2026","share":"Deel","share_links":"Links","share_page":"Link naar deze foto","share_image":"HD afbeelding","share_embed":"Embedden op uw website","share_print":"Afdrukken","copy":"Kopieer","copied":"Gekopieerd","error":"We hebben een probleem\u2026","sequence_next":"Volgende afbeelding van de sequentie","error_click":"Klik om verder te gaan","error_retry":"Probeer later opnieuw","legend_license":"Licentie: {l}","legend_title":"Toon gegevens van de afbeelding","sequence_play":"Speel deze sequentie af","expand_info":"De widget op de volledige pagina weergeven","minimize":"Verberg deze widget, je kan hem terug tonen met de knop linksonder","loading_labels_fun":["\ud83e\udd8c Detectie verkeersborden overstekende herten","\ud83d\ude98 Panoramax auto zoeken \xa9","\u2615 Cafe\xefne-injectie","\ud83d\ude00 Gelukt, je kaart is gekaart!","\ud83d\udc08 Foto\'s delen van katten","\ud83d\ude34 Uitstelgedrag verminderen","\ud83e\uded6 Thee zetten","\ud83d\udc27 Broncode openen","\ud83d\ude87 Indexering metrostations","\ud83e\uddf9 Metadata opschonen","\ud83d\ude92 Foto\'s van brandweerkazernes versturen","\ud83d\udeb2 Fiets- en wandelpaden bijwerken","\ud83d\ude89 Perron doorgang","\ud83d\udef0\ufe0f Satellieten zoeken","\ud83d\udc65 Personas opslaan","\ud83e\udd5e Pannenkoekenhuizen localiseren","\ud83e\uddd1\u200d\ud83d\udcbb Interface debuggen","\ud83d\udcc8 Statistieken verhogen","\ud83e\udd16 Semantiek aanleren","\ud83c\udfa8 Interface herontwerpen","\ud83d\udcc5 Fotomappingparty\'s plannen","\ud83e\uddc0 Kazen laten rijpen","\ud83c\udf04 Prachtige zonneschijn berekenen","\ud83c\udf0a Meten van het hoogwater"],"share_rss_title":"RSS-feed van nieuwe reeksen in het nu zichtbare kaartgebied","josm_live":"Schakel JOSM automatische synchronisatie in bij het laden van afbeeldingen","minimize_short":"Verbergen","error_psv":"Photo Sphere Viewer werd niet correct geladen","error_nopic":"Geen foto beschikbaar op de aangegeven locatie","error_api":"De fotoserver is niet beschikbaar","error_webgl":"WebGL wordt niet ondersteund door je browser","error_api_compatibility":"De fotoserver is niet compatibel met deze viewer","filter_date_1month":"1 maand","filter_date_1year":"1 jaar","filter_user":"Gebruiker","filter_user_mypics":"Mijn foto\'s","filter_picture":"Afbeeldingstype","picture_flat":"Klassiek","picture_360":"360\xb0","filter_qualityscore":"Kwaliteitsscore","qualityscore_doc_2":"De score wordt getoond als een letter A/B/C/D/E (waarbij A het beste is en E het slechtse), en wordt grafisch weergegeven volgens deze schaal:","qualityscore_doc_link":"Meer weten over de Kwaliteitsscore","map_background":"Kaartachtergrond","map_background_aerial":"Satelliet","map_background_streets":"Straten","map_theme":"Kaartthema","map_theme_default":"Klassiek","map_theme_age":"Opnamedatum","map_theme_age_3":"< 1 jaar","map_theme_age_4":"< 1 maand","filter_qualityscore_help":"Klik om aan- of uit te schakelen","report_failure":"Er is een fout opgetreden bij het aanmaken van het rapport: {e}. Probleem later opnieuw.","map_theme_score":"Kwaliteitsscore","contrast":"Afbeeldingscontrast verhogen","metadata":"Metadata van de foto","metadata_camera_make":"Fabrikant","filter_date":"Datum","filter_zoom_in":"Zoom in om dit filter te zien","metadata_general_license_link":"De volledige beschrijving van de licentie bekijken","metadata_general_seqid":"Serie","metadata_general_picid_link":"Ga naar de JSON-beschrijving van de foto","metadata_general_seqid_link":"Ga naar de JSON-beschrijving van de sequentie","metadata_general_author":"Auteur","error_josm":"JOSM antwoord niet, is het actief en is afstandsbediening ingeschakeld?","qualityscore_title":"Over de kwaliteitsscore","metadata_general_license":"Licentie","error_pic":"The gevraagde foto werd niet gevonden","map_theme_age_2":"< 2 jaar","metadata_general_picid":"Afbeelding","metadata_general_date":"Opnamedatum","map_theme_type":"Cameratype","qualityscore_doc_1":"Panoramax toont een Kwaliteitsscore voor elke foto. Dit vergemakkelijkt filtering en laat toe om foto\'s van hoge kwaliteit te vinden.","qualityscore_doc_3":"Hij wordt berekend op basis van de GPS-nauwkeurigheid en resolutie van de foto. Een professioneel systeem zal een A-score hebben, een 360\xb0 actiecamera een B-score, en een smartphone een C/D/E-score.","map_theme_age_1":"> 2 jaar","report_details_placeholder":"Je kan, optioneel, details over het probleem toevoegen","metadata_camera":"Apparaat","metadata_camera_model":"Model","metadata_camera_type":"Type","metadata_camera_resolution":"Resolutie","metadata_camera_focal_length":"Brandpuntsafstand","metadata_location":"Positie","metadata_location_longitude":"Longitude","metadata_location_latitude":"Latitude","metadata_location_orientation":"Richting","metadata_location_precision":"Nauwkeurigheid van de positionering","metadata_quality":"Kwaliteit","metadata_quality_help":"Meer weten over de Kwaliteitsscore","metadata_quality_score":"Globale score","metadata_quality_gps_score":"Positioneringsscore","metadata_quality_resolution_score":"Resolutiescore","metadata_quality_missing":"geen info in de afbeelding","metadata_exif":"EXIF","metadata_exif_name":"Tag","metadata_exif_value":"Waarde","report":"Rapporteer","report_auth":"Dit rapport zal worden verstuurd met je account \\"{a}\\"","report_nature_label":"Aard van het probleem","report_nature":{"":"Selecteer de aard van het probleem \u2026","blur_missing":"Het gezicht van een persoon of een nummerplaat is zichtbaar","blur_excess":"Een object dat niet vervaagd moet worden is vervaagd","inappropriate":"De foto is ongepast (ongerelateerd, naaktheid \u2026)","privacy":"Een private weg of een privaat eigendom is zichtbaar","picture_low_quality":"De foto is van slechte kwaliteit","mislocated":"De foto is slecht gepositioneerd","copyright":"De foto schendt het auteursrecht","other":"Een ander soort probleem"},"report_whole_sequence":"Dit betreft de volledige sequentie","report_details":"Aanvullende details","report_email":"Je e-mail","report_email_placeholder":"Optioneel","report_submit":"Verzenden","report_wait":"Rapport verzenden \u2026","report_success":"Het rapport werd succesvol verzonden. Het zal zo snel mogelijk behandeld worden.","whats_panoramax":"Panoramax is de geo-commons voor foto\'s van gebieden.","contribute_id":"Bijdragen aan OpenStreetMap met de iD-editor","geo_uri":"Externe app","semantics_hide_all_tags":"Verberg alle tags","semantics_key":"Sleutel","semantics_value":"Waarde","semantics_key_doc":"Meer weten over deze sleutel","semantics_value_doc":"Meer weten over deze tag","semantics_title":"Tags","semantics_tags":"{nb} tags","semantics_features":"Gedetecteerde eigenschappen","semantics_features_none":"Er is nog geen eigenschap gedetecteerd of geannoteerd in deze afbeelding.","semantics_features_default_title":"Eigenschap #{nb}","semantics_features_subtitle":"{nb} geassocieerde eigenschappen","semantics_show_all_tags":"Toon alle tags","metadata_general_instance":"Bron instance","semantics_annotation_tooltip":"Klik om details te zien","semantics_tags_picture":"Afbeelding tags","semantics_tags_picture_none":"Er zijn nog geen tags ingesteld voor deze afbeelding.","semantics_qualifiers":"Kwalificaties","semantics_show_annotations":"afbeelding-annotaties weergeven","semantics_hide_annotations":"afbeelding-annotaties verbergen","semantics_wikidata_properties":{"P31":"Instance van","P279":"subklasse van","P361":"onderdeel van"},"metadata_exif_doc":"Documenten voor EXIF-tags","metadata_exif_doc_title":"Ga naar documentatie van Exiv2 voor volledige informatie over definities van EXIF- en XMP-tags","metadata_location_copy":"Kopieer {v}","metadata_location_copy_more":"Meer kopieeropties voor co\xf6rdinaten","metadata_general_copy_picid":"Kopieer afbeelding ID","filter_date_6months":"6 maanden","picture_360_long":"Panorama afbeelding","metadata_summary":"Samenvatting","metadata_general_copy_id":"Kopieer ID","picture_flat_long":"Klassieke afbeelding","metadata_location_coordinates":"Co\xf6rdinaten (lengtegraad, breedtegraad)","picture_all":"Alles","semantics_zero_annotations":"Geen annotatie op deze afbeelding","semantics_hashtags":"Foto-hashtags","panoramax":"Panoramax","semantics_editor_error":"De syntax is ongeldig. Je tags moeten eruit zien als:\\nsleutel=waarde\\nprefix|sleutel=waarde\\nprefix|sleutel[qualif_sleutel=qualif_waarde]=waarde\\n\\nMaximale lengte van de sleutel: 256 karakters, maximale lengte van de waarde: 2048 karakters."},"psv":{"twoFingers":"Gebruik twee vingers om te navigeren","ctrlZoom":"Gebruik ctrl + scroll om de afbeelding in en uit te zoomen","loadError":"Het panorama kan niet worden geupload"},"maplibre":{"GeolocateControl.FindMyLocation":"Mijn locatie zoeken","GeolocateControl.LocationNotAvailable":"Locatitie niet beschikbaar"},"map":{"loading":"Laden \u2026","slow_loading":"De kaart laadt traag en kan er gebroken uitzien","thumbnail":"Thumbnail van de aangeduide foto","not_public":"Niet openbaar zichtbaar","map_data":"Kaartdata: {m}","more_panoramax":"Meer weten over Panoramax"}}')},9026:at=>{"use strict";at.exports=JSON.parse('{"pnx":{"moveRight":"Przesu\u0144 w prawo","sequence_speed":"Pr\u0119dko\u015b\u0107 odtwarzania","metadata_camera_model":"Model","search_address":"Szukaj adres, miasto\u2026","zoom":"Przybli\u017cenie","zoomIn":"Przybli\u017c","moveUp":"Przesu\u0144 w g\xf3r\u0119","moveDown":"Przesu\u0144 w d\xf3\u0142","moveLeft":"Przesu\u0144 w lewo","moveMiddle":"Wycentruj widok","expand":"Rozszerz","show_psv":"Poka\u017c przegl\u0105dark\u0119 zdj\u0119\u0107","show_map":"Poka\u017c map\u0119","options":"Opcje","filters":"Filtry","layers":"Warstwy","search":"Szukaj","search_empty":"Brak wynik\xf3w","search_user":"Szukaj nazwy u\u017cytkownika\u2026","share":"Udost\u0119pnij","share_links":"Linki","share_page":"Link do tej strony","share_rss":"Kana\u0142 RSS","share_print":"Drukuj","copy":"Kopiuj","copied":"Skopiowano","error":"Mamy problem\u2026","error_click":"Kliknij, aby kontynuowa\u0107","error_retry":"Prosz\u0119 spr\xf3buj p\xf3\u017aniej","sequence_next":"Nast\u0119pne zdj\u0119cie w sekwencji","sequence_pause":"Spauzuj sekwencj\u0119","sequence_prev":"Poprzednie zdj\u0119cie w sekwencji","sequence_more":"Wi\u0119cej opcji odtwarzania","legend_license":"Licencja: {l}","legend_title":"Poka\u017c szczeg\xf3\u0142y zdj\u0119cia","edit_osm":"Edytuj OSM","loading_labels_serious":["\ud83d\uddfa\ufe0f Wczytywanie danych mapy","\ud83d\udda5\ufe0f Odpytywanie API","\ud83d\uddbc\ufe0f Wczytywanie miniaturek","\ud83d\udd0d Analizowanie metadanych EXIF","\ud83c\udfd8\ufe0f Renderowanie 3D","\ud83d\udcf7 Inicjowanie zdj\u0119\u0107 360\xb0","\ud83d\udfe0 Balansowanie kolor\xf3w","\ud83d\udcaf Obliczanie oceny jako\u015bci \xa9"],"map_theme_age_2":"< 2 lata","map_theme_age_1":"> 2 lata","map_theme_age":"Data zrobienia","filter_picture":"Typ zdj\u0119cia","map_theme_age_3":"< rok","map_theme_age_4":"< miesi\u0105c","map_theme_type":"Typ aparatu","metadata":"Metadane zdj\u0119cia","metadata_general_picid":"Identyfikator zdj\u0119cia","metadata_general_seqid":"Identyfikator sekwencji","metadata_general_license":"Licencja","metadata_general_author":"Autor","metadata_camera":"Aparat","metadata_camera_type":"Typ","metadata_camera_resolution":"Rozdzielczo\u015b\u0107","metadata_location":"Lokalizacja","metadata_exif":"EXIF / XMP","metadata_quality_missing":"Brak warto\u015bci ustawionej w zdj\u0119ciu","metadata_exif_name":"Tag","metadata_exif_value":"Warto\u015b\u0107","report":"Zg\u0142o\u015b zdj\u0119cie","report_nature":{"privacy":"Prywatna droga lub w\u0142asno\u015b\u0107 widoczna","mislocated":"Zdj\u0119cie jest w z\u0142ym miejscu na mapie","copyright":"Zdj\u0119cie narusza prawa autorskie","picture_low_quality":"Zdj\u0119cie jest bardzo niskiej jako\u015bci","other":"Inny problem","":"Wybierz typ problemu\u2026","blur_missing":"Twarz osoby lub rejestracja samochodu jest widoczna","blur_excess":"Obiekt, kt\xf3ry nie wymaga zamazania jest zamazany","inappropriate":"Zdj\u0119cie jest niestosowne (niezwi\u0105zane, nago\u015b\u0107\u2026)"},"zoomOut":"Oddal","report_whole_sequence":"Dotyczy ca\u0142ej sekwencji","report_details":"Dodatkowe szczeg\xf3\u0142y","report_email":"Tw\xf3j adres email","report_email_placeholder":"Opcjonalne","report_submit":"Wy\u015blij","report_wait":"Wysy\u0142anie zg\u0142oszenia\u2026","report_success":"Zg\u0142oszenie zosta\u0142o wys\u0142ane. Zostanie przejrzane tak szybko jak to mo\u017cliwe.","share_rss_title":"Kana\u0142 RSS nowych sekwencji na widocznym obszarze mapy","loading_labels_fun":["\ud83e\udd8c Wykrywanie znak\xf3w przechodzenia jeleni",null,"\u2615 Wstrzykiwanie kofeiny","\ud83d\ude00 U\u015bmiechnij si\u0119, jeste\u015b mapowany!","\ud83d\udc08 Udost\u0119pnianie zdj\u0119\u0107 kot\xf3w","\ud83d\ude34 Zmniejszania prokrastynacji","\ud83e\uded6 Parzenie herbaty","\ud83d\udc27 Otwieranie kodu \u017ar\xf3d\u0142owego","\ud83d\ude87 Indeksowanie stacji metra","\ud83e\uddf9 Czyszczenie metadanych","\ud83d\ude92 Przesy\u0142anie zdj\u0119\u0107 remiz",null,"\ud83d\ude89 Przechodzenie peron\xf3w stacji","\ud83d\udef0\ufe0f Wyszukiwanie satelit",null,"\ud83d\udc1f Szukanie sklep\xf3w z frytkami i ryb\u0105","\ud83e\uddd1\u200d\ud83d\udcbb Interfejs debugowania","\ud83d\udcc8 Zwi\u0119kszanie statystyk"],"share_embed_docs":"Przeczytaj wi\u0119cej o konfiguracji osadzenia","sequence_play":"Odtw\xf3rz t\u0119 sekwencj\u0119","josm_live":"W\u0142\u0105cz automatyczn\u0105 synchronizacj\u0119 JOSM przy \u0142adowaniu zdj\u0119\u0107","error_api":"Serwer zdj\u0119\u0107 nie jest dost\u0119pny","error_webgl":"WebGL nie jest obs\u0142ugiwany przez t\u0119 przegl\u0105dark\u0119","error_api_compatibility":"Serwer zdj\u0119\u0107 nie jest kompatybilny z t\u0105 wersj\u0105 przegl\u0105darki","filter_date":"Data","filter_date_1month":"1 miesi\u0105c","filter_date_1year":"1 rok","filter_user":"U\u017cytkownik","filter_user_mypics":"Moje zdj\u0119cia","filter_zoom_in":"Przybli\u017c, aby filtry by\u0142y widoczne","picture_flat":"Klasyczne","picture_360":"360\xb0","filter_qualityscore":"Ocena jako\u015bci","map_background":"Podk\u0142ad mapowy","map_background_aerial":"Zdj\u0119cia lotnicze","map_background_streets":"Ulice","map_theme":"Motyw mapy","map_theme_default":"Klasyczny","map_theme_score":"Ocena jako\u015bci","contrast":"W\u0142\u0105cz wy\u017cszy kontrast zdj\u0119cia","metadata_general_picid_link":"Id\u017a do opisu zdj\u0119cia w JSON","metadata_general_seqid_link":"Id\u017a do opisu sekwencji w JSON","metadata_general_license_link":"Id\u017a do strony z pelnym opisem licencji","metadata_general_date":"Data zrobienia","metadata_camera_make":"Marka","metadata_camera_focal_length":"Ogniskowa","metadata_location_longitude":"D\u0142ugo\u015b\u0107 geograficzna","metadata_location_latitude":"Szeroko\u015b\u0107 geograficzna","metadata_location_orientation":"Kierunek robienia zdj\u0119cia","metadata_location_precision":"Precyzja lokalizacji","metadata_quality":"Ocena jako\u015bci","metadata_quality_help":"Dowiedz si\u0119 wi\u0119cej o ocenie jako\u015bci","metadata_quality_score":"Ocena globalna","metadata_quality_gps_score":"Ocena pozycji","metadata_quality_resolution_score":"Ocena rozdzielczo\u015bci","report_auth":"To zg\u0142oszenie b\u0119dzie wys\u0142anie przy pomocy Twojego konta \\"{a}\\"","report_nature_label":"Typ problemu","report_details_placeholder":"Opcjonalnie, mo\u017cesz doda\u0107 szczeg\xf3\u0142y o problemie","report_failure":"B\u0142\u0105d wyst\u0105pi\u0142 podczas tworzenia zg\u0142oszenia: {e}. Prosz\u0119 spr\xf3buj ponownie.","filter_qualityscore_help":"Kliknij, aby w\u0142\u0105czy\u0107 lub wy\u0142\u0105czy\u0107","error_josm":"JOSM nie odpowiada, czy jest uruchomiony i czy dost\u0119p zdalny jest w\u0142\u0105czony?"},"psv":{"twoFingers":"U\u017cyj dw\xf3ch palc\xf3w do nawigacji","ctrlZoom":"U\u017cyj ctrl + rolka myszy, aby powi\u0119kszy\u0107 zdj\u0119cie","loadError":"Panorama nie mo\u017ce by\u0107 za\u0142adowana"},"maplibre":{"GeolocateControl.FindMyLocation":"Znajd\u017a moj\u0105 lokalizacj\u0119","GeolocateControl.LocationNotAvailable":"Lokalizacja niedost\u0119pna"},"map":{"thumbnail":"Miniaturki najechanego zdj\u0119cia","not_public":"Niewidoczne publicznie","slow_loading":"Mapa \u0142aduje si\u0119 wolno i mo\u017ce si\u0119 wydawaj popsuta","loading":"\u0141adowanie\u2026"}}')},991:at=>{"use strict";at.exports=JSON.parse('{"psv":{"twoFingers":"Anv\xe4nd tv\xe5 fingrar f\xf6r att panorera","loadError":"Panoramat kan inte laddas","ctrlZoom":"Anv\xe4nd ctrl + scroll f\xf6r att zooma in p\xe5 bilden"},"pnx":{"moveUp":"Flytta upp","zoom":"Zoom","zoomOut":"Zooma ut","zoomIn":"Zooma in","moveDown":"Flytta ner","moveLeft":"Flytta v\xe4nster","moveRight":"Flytta h\xf6ger","moveMiddle":"Centrera vy","expand":"Expandera","show_psv":"Visa bildvisaren","show_map":"Visa kartan","expand_info":"Visa widgeten p\xe5 hela sidan","minimize":"G\xf6m denna flik, du kan visa den igen genom att anv\xe4nda knappen i nedersta v\xe4nstra h\xf6rnet","minimize_short":"G\xf6m","options":"Alternativ","search":"S\xf6k","search_empty":"Inga resultat hittade","filters":"Filter","layers":"Lager","share":"Dela","share_links":"L\xe4nkar","share_page":"L\xe4nka till denna sida","share_image":"HD bild","share_rss":"RSS feed","share_embed":"B\xe4dda in p\xe5 din hemsida","share_embed_docs":"L\xe4s mer om inb\xe4ddad konfiguration","share_print":"Skriv ut","copy":"Kopiera","copied":"Kopierad","error":"Vi har ett problem\u2026","error_click":"Forts\xe4tt","error_retry":"V\xe4nligen f\xf6rs\xf6k igen senare","sequence_next":"N\xe4sta bild i sekvensen","sequence_play":"Spela upp bilder i sekvensen","sequence_pause":"Pausa sekvens","sequence_more":"Mera uppspelningsalternativ","sequence_speed":"Uppspelningshastighet","legend_license":"Licens: {l}","search_address":"S\xf6k en adress, stad\u2026","edit_osm":"Redigera OSM","loading_labels_serious":["\ud83d\uddfa\ufe0f Laddar kartdata","\ud83d\udda5\ufe0f Anropar API","\ud83d\uddbc\ufe0f Laddar miniatyrer","\ud83d\udd0d Analyserar EXIF metadata","\ud83c\udfd8\ufe0f 3D rendering","\ud83d\udcf7 Initialiserar 360\xb0 bilder","\ud83d\udfe0 F\xe4rg balansering","\ud83d\udcaf Ber\xe4kna Kvalitetspo\xe4ng \xa9"],"loading_labels_fun":["\ud83e\udd8c R\xe4knar \xe4lgar","R\xe4knar gula bilar","\u2615 Bunkrar upp med kaffe","Kaj nu simmar du ur bild!","\ud83d\udc08 Delar kattbilder","\ud83d\ude34 Prokastinerar","\ud83e\uded6 Kokar te","\ud83d\udc27 \xd6ppnar k\xe4llkod","\ud83d\ude87 R\xe4knar t\xe5g","\ud83e\uddf9 St\xe4dar upp bland metadata","\ud83d\udc3f\ufe0f R\xe4knar ekorrar","\ud83d\udeb2 R\xe4knar cykelst\xe4ll","\ud83d\ude89 G\xe5r igenom stationer","\ud83d\udef0\ufe0f S\xf6ker satelliter","\ud83e\uddd1\u200d\ud83c\udf73 Lagar k\xf6ttbullar","\ud83e\uddcdSt\xe5r i k\xf6","\ud83e\uddd1\u200d\ud83d\udcbb Fels\xf6ker gr\xe4nsnitt","\ud83d\udcc8 \xd6kar statistik"],"error_psv":"Foto-sf\xe4r visaren laddar inte ordentligt","error_nopic":"Ingen bild finns p\xe5 angiven position","error_api":"Bildservern \xe4r inte tillg\xe4nlig","error_webgl":"WebGL st\xf6ds inte i din webbl\xe4sare","error_api_compatibility":"Bildservern \xe4r inte kompatibel med den h\xe4r visarens version","filter_date":"Datum","filter_date_1month":"1 m\xe5nad","filter_date_1year":"1 \xe5r","filter_user":"Anv\xe4ndare","filter_user_mypics":"Mina bilder","filter_picture":"Bildtyp","filter_zoom_in":"Zooma in f\xf6r att se detta filter","picture_360":"360\xb0","filter_qualityscore_help":"Klicka f\xf6r att sl\xe5 p\xe5 eller av","qualityscore_title":"Om Kvalitetspo\xe4ng","filter_qualityscore":"Kvalitetspo\xe4ng","qualityscore_doc_2":"Kvalitet visas som en skala p\xe5 A/B/C/D/E (A \xe4r b\xe4st, E \xe4r s\xe4mst) och visas grafisk genom skalan:","map_theme_default":"Klassisk","map_theme_age_1":"> 2 \xe5r","map_theme_age_2":"< 2 \xe5r","map_theme_age_3":"< 1 \xe5r","map_theme_age_4":"< 1 m\xe5nad","map_theme_type":"Kameratyp","contrast":"Aktivera h\xf6gre bildkontrast","metadata":"Bildmetadata","metadata_general_picid":"Bild-identifierare","metadata_general_seqid":"Sekvens-identifierare","qualityscore_doc_link":"Mer information om hur Kvalitetspo\xe4ng ber\xe4knas finns i v\xe5r dokumentation.","map_theme_score":"Kvalitetspo\xe4ng","metadata_general_seqid_link":"G\xe5 till JSON beskrivning av sekvensen","metadata_general_author":"Upphovsman","metadata_general_license":"Licens","metadata_general_license_link":"Se full licensbeskrivning","metadata_general_date":"Bild tagen","metadata_camera":"Kamera","metadata_camera_make":"M\xe4rke","metadata_camera_model":"Modell","metadata_camera_type":"Typ","metadata_camera_resolution":"Uppl\xf6sning","metadata_location":"Plats","metadata_location_longitude":"Longitud","metadata_location_latitude":"Latitud","metadata_location_orientation":"Kamerariktning","metadata_location_precision":"Positionsprecision","metadata_quality":"Kvalitetspo\xe4ng","metadata_quality_score":"Global po\xe4ng","metadata_quality_gps_score":"Positioneringspo\xe4ng","metadata_quality_resolution_score":"Uppl\xf6sningspo\xe4ng","metadata_quality_missing":"Inget v\xe4rde satt i bilden","metadata_exif":"EXIF / XMP","metadata_exif_name":"Tag","metadata_exif_value":"V\xe4rde","report":"Rapportera bild","search_user":"S\xf6k anv\xe4ndarnamn\u2026","legend_title":"Visa detaljer f\xf6r bild","report_auth":"Denna rapport kommer skickas genom ditt konto \\"{a}\\"","share_rss_title":"RSS feed av nya sekvensen f\xf6r karta i bild","error_josm":"JOSM svarar inte, k\xf6rs det och \xe4r remote p\xe5slaget?","sequence_prev":"F\xf6reg\xe5ende bild i sekvensen","josm_live":"Aktivera automatisk JOSM synkronisering vid inladdning av bild","metadata_general_picid_link":"G\xe5 till JSON beskrivning av bilden","metadata_quality_help":"L\xe4s mer om Kvalitetspo\xe4ng","error_pic":"Beg\xe4rd bild hittades inte","qualityscore_doc_3":"Det r\xe4knas ut baserat p\xe5 GPS precision och bildens uppl\xf6sning. Ett profesionellt system kommer ha A-kvalit\xe9, en 360\xb0 actionkamera kommer ha B-kvalit\xe9 och en telefon kommer ha C/D/E-kvalit\xe9.","qualityscore_doc_1":"Panoramax erbjuder en Kvalitetspo\xe4ng f\xf6r varje bild. Det m\xf6jlig\xf6r enkel kartfiltrering och en omfattande uppvisning av tillg\xe4nligheten av bilder av h\xf6g kvalitet.","metadata_camera_focal_length":"Br\xe4nnvidd","picture_flat":"Klassisk","map_background":"Kartbakgrund","map_background_aerial":"Sattelit","map_background_streets":"Gator","map_theme":"Karttema","map_theme_age":"Fotodatum","report_nature_label":"Typ av problem","report_nature":{"":"V\xe4lj typen av problem\u2026","blur_missing":"En persons ansikte eller en registreringspl\xe5t \xe4r synlig","blur_excess":"Ett objekt som inte beh\xf6ver suddas \xe4r suddad","inappropriate":"Bilden \xe4r ol\xe4mplig(orelaterat, nakenhet...)","privacy":"En privat v\xe4g eller fastighet \xe4r synlig","picture_low_quality":"Bilden \xe4r av mycket d\xe5lig kvalitet","mislocated":"Bilden \xe4r placerat d\xe5lig p\xe5 kartan","copyright":"Bilden inkr\xe4nker p\xe5 upphovsr\xe4tt","other":"N\xe5got annat typ av problem"},"report_whole_sequence":"Detta g\xe4ller hela sekvensen","report_details":"Ytterligare detaljer","report_details_placeholder":"Valfritt, kan du l\xe4gga till information om problemet och varf\xf6r det \xe4r ett problem","report_email":"Din e-post","report_email_placeholder":"Valfri","report_submit":"Skicka","report_wait":"Skickar rapport \u2026","report_success":"Rapporten har skickats. Det kommer att ses \xf6ver s\xe5 snart som m\xf6jligt.","report_failure":"Ett fel uppstod n\xe4r rapporten skapades: {e}. F\xf6rs\xf6k igen senare."},"maplibre":{"GeolocateControl.FindMyLocation":"Hitta min postion","GeolocateControl.LocationNotAvailable":"Plats inte tillg\xe4nlig"},"map":{"loading":"Laddar\u2026","thumbnail":"Miniatyrbild av r\xf6rd bild","not_public":"Inte offentligt synligt","slow_loading":"Kartan laddas l\xe5ngsamt och kan verka trasig"}}')},6984:at=>{"use strict";at.exports=JSON.parse('{"pnx":{"contrast":"\u589e\u52a0\u76f8\u7247\u5c0d\u6bd4\u5ea6","copied":"\u5df2\u8907\u88fd","copy":"\u8907\u88fd","edit_osm":"\u7de8\u8f2f OSM","error":"Panoramax \u7576\u6a5f\u4e86\u2026","error_api":"\u76f8\u7247\u4f3a\u670d\u5668\u7121\u6cd5\u4f7f\u7528","error_api_compatibility":"\u76f8\u7247\u4f3a\u670d\u5668\u548c\u6b64\u6aa2\u8996\u5668\u7684\u7248\u672c\u4e0d\u76f8\u5bb9","error_josm":"JOSM \u6c92\u6709\u56de\u61c9\uff0c\u5b83\u5df2\u7d93\u555f\u52d5\u4e14\u555f\u7528\u9060\u7aef\u63a7\u5236\u4e86\u55ce?","error_nopic":"\u641c\u5c0b\u7684\u4f4d\u7f6e\u9644\u8fd1\u6c92\u6709\u76f8\u7247","error_pic":"\u627e\u4e0d\u5230\u6307\u5b9a\u7684\u76f8\u7247","error_psv":"\u7121\u6cd5\u6b63\u78ba\u8f09\u5165 Photo Sphere Viewer","error_subtitle":"\u8acb\u7a0d\u5f8c\u91cd\u8a66\u6216\u6aa2\u67e5\u700f\u89bd\u5668\u7684\u4e3b\u63a7\u53f0\u4ee5\u4e86\u89e3\u8a73\u60c5\u3002","error_webgl":"\u60a8\u7684\u700f\u89bd\u5668\u4e0d\u652f\u63f4 WebGL","expand":"\u5c55\u958b","expand_info":"\u5728\u6574\u500b\u756b\u9762\u986f\u793a\u6b64\u5c0f\u5de5\u5177","filter_camera_model":"\u6309\u76f8\u6a5f\u578b\u865f","filter_date":"\u65e5\u671f","filter_picture":"\u76f8\u7247\u985e\u578b","filter_user":"\u4f7f\u7528\u8005","filter_zoom_in":"\u62c9\u8fd1\u5730\u5716\u4ee5\u986f\u793a\u7be9\u9078\u7d50\u679c","filters":"\u7be9\u9078\u5668","id":"iD","josm":"JOSM","josm_live":"\u555f\u7528\u8f09\u5165\u76f8\u7247\u6642\u81ea\u52d5\u540c\u6b65 JOSM","layers":"\u5716\u5c64","legend_license":"\u6388\u6b0a: {l}","loading_labels_fun":["\ud83e\udd8c \u5075\u6e2c\u5230\u7576\u5fc3\u6885\u82b1\u9e7f\u6a19\u8a8c","\ud83d\ude98 \u6b63\u5728\u641c\u5c0b Panoramax \u6c7d\u8eca \xa9","\u2615 \u6ce8\u5165\u5496\u5561\u56e0","\ud83d\ude00 \u8acb\u5fae\u7b11\uff0c\u60a8\u5df2\u88ab\u6a19\u8a18\u5728\u5730\u5716\u4e0a\u4e86\uff01","\ud83d\udc08 \u6b63\u5728\u5206\u4eab\u8c93\u54aa\u7684\u76f8\u7247","\ud83d\ude34 \u6b63\u5728\u6e1b\u5c11\u5ef6\u9072","\ud83e\uded6 \u6b63\u5728\u6c8f\u58fa\u597d\u8336","\ud83d\udc27 \u6b63\u5728\u958b\u555f\u539f\u59cb\u78bc","\ud83d\ude87 \u6b63\u5728\u7d22\u5f15\u5730\u9435\u8eca\u7ad9","\ud83e\uddf9 \u6e05\u7406\u8a6e\u91cb\u8cc7\u6599","\ud83d\ude92 \u6b63\u5728\u50b3\u9001\u6d88\u9632\u968a\u7684\u76f8\u7247","\ud83d\udeb2 \u66f4\u65b0\u7da0\u9053","\ud83d\ude89 \u6b63\u5728\u901a\u904e\u8eca\u7ad9\u6708\u53f0","\ud83d\udef0\ufe0f \u6b63\u5728\u641c\u5c0b\u885b\u661f","\ud83d\udc65 \u6b63\u5728\u64b0\u5beb\u4eba\u7269\u8a8c","\ud83c\udf57 \u6b63\u5728\u5b9a\u4f4d\u9e79\u9165\u96de\u5e97","\ud83e\uddd1\u200d\ud83d\udcbb \u6b63\u5728\u5075\u932f\u4ecb\u9762","\ud83d\udcc8 \u7d71\u8a08\u6578\u64da\u6b63\u5728\u589e\u52a0","\ud83e\udd16 \u6b63\u5728\u5b78\u7fd2\u8a9e\u7fa9","\ud83c\udfa8 \u91cd\u65b0\u8a2d\u8a08\u4ecb\u9762","\ud83d\udcc5 \u6b63\u5728\u898f\u5283\u76f8\u7247\u5730\u5716\u7e6a\u5716\u805a\u6703","\ud83e\uddc0 \u6b63\u5728\u719f\u6210\u5207\u9054\u8d77\u53f8","\ud83c\udf04 \u6b63\u5728\u8a08\u7b97\u6046\u6625\u7684\u65e5\u7167\u6642\u6578","\ud83c\udf0a \u6b63\u5728\u6e2c\u91cf\u6f6e\u6c50"],"loading_labels_serious":["\ud83d\uddfa\ufe0f \u6b63\u5728\u8f09\u5165\u5730\u5716\u8cc7\u6599","\ud83d\udda5\ufe0f \u6b63\u5728\u67e5\u8a62 API","\ud83d\uddbc\ufe0f \u6b63\u5728\u8f09\u5165\u7e2e\u5716","\ud83d\udd0d \u6b63\u5728\u5206\u6790 EXIF \u8a6e\u91cb\u8cc7\u6599","\ud83c\udfd8\ufe0f \u6b63\u5728\u7b97\u7e6a 3D","\ud83d\udcf7 \u6b63\u5728\u521d\u59cb\u5316 360\xb0 \u76f8\u7247","\ud83d\udfe0 \u6b63\u5728\u5e73\u8861\u8272\u5f69","\ud83d\udcaf \u6b63\u5728\u8a08\u7b97\u54c1\u8cea\u5206\u6578 \xa9","\ud83d\udce1 \u6b63\u5728\u4e0b\u8f09\u66f4\u65b0","\ud83c\udf0d \u6b63\u5728\u53d6\u5f97\u5730\u5716\u5716\u78da","\ud83d\udcf8 \u6b63\u5728\u8655\u7406\u9670\u5f71"],"map_background":"\u5730\u5716\u80cc\u666f","map_background_aerial":"\u885b\u661f","map_background_streets":"\u9810\u8a2d","map_theme":"\u5730\u5716\u4e3b\u984c","map_theme_age":"\u62cd\u651d\u6642\u9593","map_theme_age_1":"> 2 \u5e74","map_theme_age_2":"< 2 \u5e74","map_theme_age_3":"< 1 \u5e74","map_theme_age_4":"< 1 \u500b\u6708","map_theme_default":"\u7d93\u5178","map_theme_type":"\u76f8\u6a5f\u985e\u578b","metadata":"\u76f8\u7247\u8a6e\u91cb\u8cc7\u6599","metadata_camera":"\u76f8\u6a5f","metadata_camera_focal_length":"\u7126\u8ddd","metadata_camera_make":"\u88fd\u9020\u5546","metadata_camera_model":"\u578b\u865f","metadata_camera_type":"\u985e\u578b","metadata_exif":"EXIF","metadata_exif_name":"\u6a19\u7c64","metadata_exif_value":"\u503c","metadata_general_author":"\u4f5c\u8005","metadata_general_date":"\u62cd\u651d\u6642\u9593","metadata_general_license":"\u6388\u6b0a","metadata_general_license_link":"\u67e5\u770b\u5b8c\u6574\u6388\u6b0a\u689d\u6b3e","metadata_general_picid":"\u76f8\u7247","metadata_general_picid_link":"\u524d\u5f80\u672c\u76f8\u7247\u7684 JSON \u8aaa\u660e","metadata_general_seqid":"\u5e8f\u5217","metadata_general_seqid_link":"\u524d\u5f80\u672c\u5e8f\u5217\u7684 JSON \u8aaa\u660e","metadata_location":"\u4f4d\u7f6e","metadata_location_latitude":"\u7def\u5ea6","metadata_location_longitude":"\u7d93\u5ea6","metadata_location_orientation":"\u65b9\u5411","metadata_location_precision":"\u5b9a\u4f4d\u7cbe\u5ea6","minimize":"\u96b1\u85cf\u9019\u500b\u5c0f\u5de5\u5177\uff0c\u60a8\u53ef\u4ee5\u6309\u5de6\u4e0b\u89d2\u7684\u6309\u9215\u518d\u6b21\u986f\u793a\u5b83","moveDown":"\u4e0b\u79fb","moveLeft":"\u5de6\u79fb","moveMiddle":"\u756b\u9762\u7f6e\u4e2d","moveRight":"\u53f3\u79fb","moveUp":"\u4e0a\u79fb","options":"\u9078\u9805","picture_360":"360\xb0","picture_flat":"\u7d93\u5178","search":"\u641c\u5c0b","search_address":"\u641c\u5c0b\u5730\u5740\u3001\u57ce\u5e02\u2026","search_empty":"\u627e\u4e0d\u5230\u7d50\u679c","search_user":"\u641c\u5c0b\u5e33\u865f\u2026","sequence_more":"\u66f4\u591a\u64ad\u653e\u9078\u9805","sequence_next":"\u5e8f\u5217\u4e2d\u7684\u4e0b\u4e00\u5f35\u76f8\u7247","sequence_pause":"\u66ab\u505c\u5e8f\u5217","sequence_play":"\u64ad\u653e\u5e8f\u5217","sequence_prev":"\u5e8f\u5217\u4e2d\u7684\u4e0a\u4e00\u5f35\u76f8\u7247","sequence_speed":"\u64ad\u653e\u901f\u5ea6","share":"\u5206\u4eab","share_embed":"\u5d4c\u5165\u5230\u60a8\u7684\u7db2\u7ad9","share_image":"\u9ad8\u756b\u8cea\u76f8\u7247","share_links":"\u8d85\u9023\u7d50","share_page":"\u9019\u5f35\u76f8\u7247\u7684\u9023\u7d50","share_print":"\u5217\u5370","share_rss":"RSS \u6458\u8981","share_rss_title":"\u76ee\u524d\u5730\u5716\u53ef\u898b\u5340\u57df\u4e2d\u65b0\u76f8\u7247\u5e8f\u5217\u7684 RSS \u6458\u8981","show_map":"\u986f\u793a\u5730\u5716","show_psv":"\u986f\u793a\u76f8\u7247\u6aa2\u8996\u5668","zoom":"\u7e2e\u653e","zoomIn":"\u62c9\u8fd1","zoomOut":"\u62c9\u9060","report_submit":"\u9001\u51fa","report_email":"\u60a8\u7684 email","report_nature_label":"\u554f\u984c\u7684\u985e\u578b","report_nature":{"":"\u9078\u64c7\u554f\u984c\u7684\u985e\u578b\u2026","blur_missing":"\u53ef\u4ee5\u770b\u898b\u4eba\u81c9\u6216\u8eca\u724c","blur_excess":"\u4e0d\u9700\u8981\u6a21\u7cca\u7684\u7269\u4ef6\u88ab\u6a21\u7cca\u8655\u7406\u4e86","inappropriate":"\u4e0d\u7576\u7684\u76f8\u7247 (\u4e0d\u76f8\u95dc\u3001\u88f8\u9ad4\u2026)","privacy":"\u53ef\u4ee5\u770b\u898b\u79c1\u4eba\u7684\u9053\u8def\u6216\u8cc7\u7522","picture_low_quality":"\u76f8\u7247\u7684\u54c1\u8cea\u5f88\u5dee","mislocated":"\u76f8\u7247\u5728\u5730\u5716\u4e0a\u7684\u4f4d\u7f6e\u4e0d\u6b63\u78ba","copyright":"\u76f8\u7247\u4fb5\u72af\u4e86\u7248\u6b0a","other":"\u4efb\u4f55\u5176\u4ed6\u985e\u578b\u7684\u554f\u984c"},"share_embed_docs":"\u6df1\u5165\u4e86\u89e3\u5d4c\u5165\u8a2d\u5b9a\u503c","error_retry":"\u8acb\u7a0d\u5f8c\u518d\u8a66","error_click":"\u7e7c\u7e8c","legend_title":"\u986f\u793a\u76f8\u7247\u7684\u8a73\u7d30\u8cc7\u6599","report_email_placeholder":"\u9078\u586b","report_whole_sequence":"\u9019\u500b\u554f\u984c\u5f71\u97ff\u6574\u500b\u5e8f\u5217","report_details":"\u66f4\u591a\u8cc7\u8a0a","report_details_placeholder":"\u9078\u586b\uff0c\u60a8\u53ef\u4ee5\u8a73\u8ff0\u6b64\u554f\u984c\u548c\u5b83\u9020\u6210\u7684\u5f71\u97ff","report_wait":"\u6b63\u5728\u50b3\u9001\u5831\u544a\u2026","report_success":"\u5df2\u6210\u529f\u767c\u9001\u5831\u544a\uff0c\u6211\u5011\u5c07\u5118\u5feb\u5c0d\u5b83\u9032\u884c\u5be9\u6838\u3002","report_failure":"\u5efa\u7acb\u5831\u544a\u6642\u767c\u9001\u932f\u8aa4: {e}\uff0c\u8acb\u7a0d\u5f8c\u518d\u8a66\u3002","report_auth":"\u6b64\u5831\u544a\u5c07\u4f7f\u7528\u60a8\u7684\u5e33\u6236\u300c{a}\u300d\u767c\u9001","filter_qualityscore":"\u54c1\u8cea\u5206\u6578","filter_qualityscore_help":"\u9ede\u64ca\u4ee5\u555f\u7528\u6216\u505c\u7528","map_theme_score":"\u54c1\u8cea\u5206\u6578","metadata_camera_resolution":"\u89e3\u6790\u5ea6","metadata_quality":"\u54c1\u8cea","metadata_quality_help":"\u6df1\u5165\u4e86\u89e3\u54c1\u8cea\u5206\u6578","metadata_quality_gps_score":"\u5b9a\u4f4d\u5206\u6578","metadata_quality_resolution_score":"\u89e3\u6790\u5ea6\u5206\u6578","metadata_quality_missing":"\u76f8\u7247\u672a\u5305\u542b\u8cc7\u8a0a","report":"\u6aa2\u8209","metadata_quality_score":"\u6574\u9ad4\u5206\u6578","filter_user_mypics":"\u6211\u7684\u76f8\u7247","filter_date_1month":"1 \u500b\u6708","filter_date_1year":"1 \u5e74","qualityscore_doc_2":"\u5206\u6578\u4ee5 A/B/C/D/E \u7b49\u7d1a\u7684\u5f62\u5f0f\u986f\u793a (A \u6700\u4f73\u3001E \u6700\u5dee) \uff0c\u4e26\u900f\u904e\u9019\u500b\u91cf\u5c3a\u8996\u89ba\u5316\u986f\u793a:","qualityscore_doc_link":"\u6df1\u5165\u4e86\u89e3\u54c1\u8cea\u5206\u6578","qualityscore_title":"\u95dc\u65bc\u54c1\u8cea\u5206\u6578","qualityscore_doc_1":"Panoramax \u70ba\u6bcf\u5f35\u76f8\u7247\u63d0\u4f9b\u54c1\u8cea\u5206\u6578\uff0c\u9019\u80fd\u5e6b\u52a9\u6211\u5011\u8f15\u9b06\u5730\u5728\u5730\u5716\u4e0a\u7be9\u9078\u548c\u986f\u793a\u9ad8\u54c1\u8cea\u76f8\u7247\u3002","qualityscore_doc_3":"\u5b83\u6839\u64da GPS \u7cbe\u78ba\u5ea6\u548c\u76f8\u7247\u89e3\u6790\u5ea6\u8a08\u7b97\u5f97\u51fa\uff0c\u5c08\u696d\u8a2d\u5099\u7684\u7b49\u7d1a\u70ba A\u3001360\xb0 \u904b\u52d5\u76f8\u6a5f\u7684\u7b49\u7d1a\u70ba B\u3001\u667a\u6167\u578b\u624b\u6a5f\u7684\u7b49\u7d1a\u70ba C/D/E\u3002","minimize_short":"\u96b1\u85cf","metadata_general_instance":"\u4f86\u6e90\u57f7\u884c\u500b\u9ad4","metadata_general_copy_picid":"\u8907\u88fd\u76f8\u7247 ID","metadata_general_copy_id":"\u8907\u88fd ID","picture_360_long":"\u5168\u666f\u76f8\u7247","metadata_summary":"\u6458\u8981","picture_flat_long":"\u7d93\u5178\u76f8\u7247","geo_uri":"\u5916\u90e8\u7a0b\u5f0f","contribute_id":"\u900f\u904e iD \u7de8\u8f2f\u5668\u4f86\u8ca2\u737b OpenStreetMap","filter_date_6months":"6 \u500b\u6708","picture_all":"\u5168\u90e8","metadata_exif_doc":"EXIF \u6a19\u7c64\u6587\u4ef6","metadata_exif_doc_title":"\u8acb\u53c3\u95b1 Exiv2 \u6587\u4ef6\u4ee5\u53d6\u5f97 EXIF \u548c XMP \u6a19\u7c64\u5b9a\u7fa9\u7684\u5b8c\u6574\u8aaa\u660e","metadata_location_coordinates":"\u5ea7\u6a19 (\u7d93\u5ea6, \u7def\u5ea6)","metadata_location_copy":"\u8907\u88fd {v}","metadata_location_copy_more":"\u66f4\u591a\u5ea7\u6a19\u8907\u88fd\u9078\u9805","semantics_title":"\u6a19\u7c64","semantics_tags":"{nb} \u500b\u6a19\u7c64","semantics_show_annotations":"\u986f\u793a\u76f8\u7247\u6a19\u8a3b","semantics_show_all_tags":"\u986f\u793a\u6240\u6709\u6a19\u7c64","semantics_key":"\u7d22\u5f15\u9375","semantics_annotation_tooltip":"\u9ede\u64ca\u67e5\u770b\u8a73\u60c5","semantics_features_default_title":"\u7279\u5fb5 #{nb}","semantics_features_subtitle":"{nb} \u500b\u95dc\u806f\u7684\u5c6c\u6027","semantics_hide_all_tags":"\u96b1\u85cf\u6240\u6709\u6a19\u7c64","semantics_features_none":"\u6b64\u76f8\u7247\u5c1a\u672a\u6aa2\u6e2c\u5230\u6216\u8a3b\u91cb\u4efb\u4f55\u7279\u5fb5\u3002","semantics_value":"\u503c","semantics_tags_picture_none":"\u6b64\u76f8\u7247\u5c1a\u672a\u52a0\u4e0a\u4efb\u4f55\u6a19\u7c64\u3002","semantics_tags_picture":"\u76f8\u7247\u6a19\u7c64","whats_panoramax":"Panoramax \u662f\u5404\u5730\u76f8\u7247\u7684\u5730\u7406\u5171\u4eab\u8cc7\u6e90\u3002","semantics_features":"\u5075\u6e2c\u5230\u7684\u7279\u5fb5","semantics_key_doc":"\u6df1\u5165\u4e86\u89e3\u6b64\u7d22\u5f15\u9375","semantics_value_doc":"\u6df1\u5165\u4e86\u89e3\u6b64\u6a19\u7c64","semantics_qualifiers":"\u9650\u5b9a\u689d\u4ef6","semantics_hide_annotations":"\u96b1\u85cf\u76f8\u7247\u6a19\u8a3b","semantics_zero_annotations":"\u6b64\u76f8\u7247\u5c1a\u672a\u52a0\u4e0a\u4efb\u4f55\u6a19\u8a3b","semantics_hashtags":"\u76f8\u7247\u4e3b\u984c\u6a19\u7c64","semantics_wikidata_properties":{"P31":"\u96b8\u5c6c\u65bc","P279":"\u4e0a\u7d1a\u5206\u985e","P361":"\u6240\u5c6c\u5be6\u9ad4"},"panoramax":"Panoramax"},"map":{"loading":"\u6b63\u5728\u8f09\u5165\u2026","not_public":"\u672a\u516c\u958b\u986f\u793a","thumbnail":"\u904a\u6a19\u61f8\u505c\u76f8\u7247\u7684\u7e2e\u5716","slow_loading":"\u5730\u5716\u8f09\u5165\u901f\u5ea6\u7de9\u6162\u800c\u4e14\u53ef\u80fd\u51fa\u73fe\u640d\u58de","more_panoramax":"\u6df1\u5165\u4e86\u89e3 Panoramax","map_data":"\u5730\u5716\u8cc7\u6599: {m}"},"psv":{"ctrlZoom":"\u4f7f\u7528 CTRL + \u6ed1\u9f20\u6efe\u8f2a\u7e2e\u653e\u5716\u7247","loadError":"\u7121\u6cd5\u8f09\u5165\u5168\u666f\u5716","twoFingers":"\u4f7f\u7528\u96d9\u6307\u79fb\u52d5"},"maplibre":{"GeolocateControl.FindMyLocation":"\u5c0b\u627e\u6211\u7684\u4f4d\u7f6e","GeolocateControl.LocationNotAvailable":"\u7121\u6cd5\u4f7f\u7528\u4f4d\u7f6e\u8cc7\u8a0a"}}')}},st={};function __webpack_require__(ot){var ut=st[ot];if(void 0!==ut)return ut.exports;var Hl=st[ot]={exports:{}};return at[ot].call(Hl.exports,Hl,Hl.exports,__webpack_require__),Hl.exports}__webpack_require__.n=at=>{var st=at&&at.__esModule?()=>at.default:()=>at;return __webpack_require__.d(st,{a:st}),st},__webpack_require__.d=(at,st)=>{for(var ot in st)__webpack_require__.o(st,ot)&&!__webpack_require__.o(at,ot)&&Object.defineProperty(at,ot,{enumerable:!0,get:st[ot]})},__webpack_require__.o=(at,st)=>Object.prototype.hasOwnProperty.call(at,st),__webpack_require__.r=at=>{"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(at,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(at,"__esModule",{value:!0})};var ot={};return(()=>{"use strict";__webpack_require__.r(ot),__webpack_require__.d(ot,{CoverageMap:()=>Hl.A,Editor:()=>rc.A,PhotoViewer:()=>sc.Ay,Viewer:()=>ut.A,components:()=>at,utils:()=>st});var at=__webpack_require__(9341),st=__webpack_require__(2030),ut=__webpack_require__(8743),Hl=__webpack_require__(153),rc=__webpack_require__(1752),sc=__webpack_require__(3407)})(),ot})()));
2707
+ */function WebGLAnimation(){let at=null,st=!1,ot=null,ut=null;function onAnimationFrame(st,Hl){ot(st,Hl),ut=at.requestAnimationFrame(onAnimationFrame)}return{start:function(){!0!==st&&null!==ot&&(ut=at.requestAnimationFrame(onAnimationFrame),st=!0)},stop:function(){at.cancelAnimationFrame(ut),st=!1},setAnimationLoop:function(at){ot=at},setContext:function(st){at=st}}}function WebGLAttributes(at){const st=new WeakMap;return{get:function(at){return at.isInterleavedBufferAttribute&&(at=at.data),st.get(at)},remove:function(ot){ot.isInterleavedBufferAttribute&&(ot=ot.data);const ut=st.get(ot);ut&&(at.deleteBuffer(ut.buffer),st.delete(ot))},update:function(ot,ut){if(ot.isInterleavedBufferAttribute&&(ot=ot.data),ot.isGLBufferAttribute){const at=st.get(ot);return void((!at||at.version<ot.version)&&st.set(ot,{buffer:ot.buffer,type:ot.type,bytesPerElement:ot.elementSize,version:ot.version}))}const Hl=st.get(ot);if(void 0===Hl)st.set(ot,function(st,ot){const ut=st.array,Hl=st.usage,rc=ut.byteLength,sc=at.createBuffer();let oc;if(at.bindBuffer(ot,sc),at.bufferData(ot,ut,Hl),st.onUploadCallback(),ut instanceof Float32Array)oc=at.FLOAT;else if(ut instanceof Uint16Array)oc=st.isFloat16BufferAttribute?at.HALF_FLOAT:at.UNSIGNED_SHORT;else if(ut instanceof Int16Array)oc=at.SHORT;else if(ut instanceof Uint32Array)oc=at.UNSIGNED_INT;else if(ut instanceof Int32Array)oc=at.INT;else if(ut instanceof Int8Array)oc=at.BYTE;else if(ut instanceof Uint8Array)oc=at.UNSIGNED_BYTE;else{if(!(ut instanceof Uint8ClampedArray))throw new Error("THREE.WebGLAttributes: Unsupported buffer data format: "+ut);oc=at.UNSIGNED_BYTE}return{buffer:sc,type:oc,bytesPerElement:ut.BYTES_PER_ELEMENT,version:st.version,size:rc}}(ot,ut));else if(Hl.version<ot.version){if(Hl.size!==ot.array.byteLength)throw new Error("THREE.WebGLAttributes: The size of the buffer attribute's array buffer does not match the original size. Resizing buffer attributes is not supported.");!function(st,ot,ut){const Hl=ot.array,rc=ot.updateRanges;if(at.bindBuffer(ut,st),0===rc.length)at.bufferSubData(ut,0,Hl);else{rc.sort(((at,st)=>at.start-st.start));let st=0;for(let at=1;at<rc.length;at++){const ot=rc[st],ut=rc[at];ut.start<=ot.start+ot.count+1?ot.count=Math.max(ot.count,ut.start+ut.count-ot.start):(++st,rc[st]=ut)}rc.length=st+1;for(let ot=0,sc=rc.length;ot<sc;ot++){const st=rc[ot];at.bufferSubData(ut,st.start*Hl.BYTES_PER_ELEMENT,Hl,st.start,st.count)}ot.clearUpdateRanges()}ot.onUploadCallback()}(Hl.buffer,ot,ut),Hl.version=ot.version}}}}const Hl={alphahash_fragment:"#ifdef USE_ALPHAHASH\n\tif ( diffuseColor.a < getAlphaHashThreshold( vPosition ) ) discard;\n#endif",alphahash_pars_fragment:"#ifdef USE_ALPHAHASH\n\tconst float ALPHA_HASH_SCALE = 0.05;\n\tfloat hash2D( vec2 value ) {\n\t\treturn fract( 1.0e4 * sin( 17.0 * value.x + 0.1 * value.y ) * ( 0.1 + abs( sin( 13.0 * value.y + value.x ) ) ) );\n\t}\n\tfloat hash3D( vec3 value ) {\n\t\treturn hash2D( vec2( hash2D( value.xy ), value.z ) );\n\t}\n\tfloat getAlphaHashThreshold( vec3 position ) {\n\t\tfloat maxDeriv = max(\n\t\t\tlength( dFdx( position.xyz ) ),\n\t\t\tlength( dFdy( position.xyz ) )\n\t\t);\n\t\tfloat pixScale = 1.0 / ( ALPHA_HASH_SCALE * maxDeriv );\n\t\tvec2 pixScales = vec2(\n\t\t\texp2( floor( log2( pixScale ) ) ),\n\t\t\texp2( ceil( log2( pixScale ) ) )\n\t\t);\n\t\tvec2 alpha = vec2(\n\t\t\thash3D( floor( pixScales.x * position.xyz ) ),\n\t\t\thash3D( floor( pixScales.y * position.xyz ) )\n\t\t);\n\t\tfloat lerpFactor = fract( log2( pixScale ) );\n\t\tfloat x = ( 1.0 - lerpFactor ) * alpha.x + lerpFactor * alpha.y;\n\t\tfloat a = min( lerpFactor, 1.0 - lerpFactor );\n\t\tvec3 cases = vec3(\n\t\t\tx * x / ( 2.0 * a * ( 1.0 - a ) ),\n\t\t\t( x - 0.5 * a ) / ( 1.0 - a ),\n\t\t\t1.0 - ( ( 1.0 - x ) * ( 1.0 - x ) / ( 2.0 * a * ( 1.0 - a ) ) )\n\t\t);\n\t\tfloat threshold = ( x < ( 1.0 - a ) )\n\t\t\t? ( ( x < a ) ? cases.x : cases.y )\n\t\t\t: cases.z;\n\t\treturn clamp( threshold , 1.0e-6, 1.0 );\n\t}\n#endif",alphamap_fragment:"#ifdef USE_ALPHAMAP\n\tdiffuseColor.a *= texture2D( alphaMap, vAlphaMapUv ).g;\n#endif",alphamap_pars_fragment:"#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",alphatest_fragment:"#ifdef USE_ALPHATEST\n\t#ifdef ALPHA_TO_COVERAGE\n\tdiffuseColor.a = smoothstep( alphaTest, alphaTest + fwidth( diffuseColor.a ), diffuseColor.a );\n\tif ( diffuseColor.a == 0.0 ) discard;\n\t#else\n\tif ( diffuseColor.a < alphaTest ) discard;\n\t#endif\n#endif",alphatest_pars_fragment:"#ifdef USE_ALPHATEST\n\tuniform float alphaTest;\n#endif",aomap_fragment:"#ifdef USE_AOMAP\n\tfloat ambientOcclusion = ( texture2D( aoMap, vAoMapUv ).r - 1.0 ) * aoMapIntensity + 1.0;\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\t#if defined( USE_CLEARCOAT ) \n\t\tclearcoatSpecularIndirect *= ambientOcclusion;\n\t#endif\n\t#if defined( USE_SHEEN ) \n\t\tsheenSpecularIndirect *= ambientOcclusion;\n\t#endif\n\t#if defined( USE_ENVMAP ) && defined( STANDARD )\n\t\tfloat dotNV = saturate( dot( geometryNormal, geometryViewDir ) );\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\n\t#endif\n#endif",aomap_pars_fragment:"#ifdef USE_AOMAP\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n#endif",batching_pars_vertex:"#ifdef USE_BATCHING\n\t#if ! defined( GL_ANGLE_multi_draw )\n\t#define gl_DrawID _gl_DrawID\n\tuniform int _gl_DrawID;\n\t#endif\n\tuniform highp sampler2D batchingTexture;\n\tuniform highp usampler2D batchingIdTexture;\n\tmat4 getBatchingMatrix( const in float i ) {\n\t\tint size = textureSize( batchingTexture, 0 ).x;\n\t\tint j = int( i ) * 4;\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\tvec4 v1 = texelFetch( batchingTexture, ivec2( x, y ), 0 );\n\t\tvec4 v2 = texelFetch( batchingTexture, ivec2( x + 1, y ), 0 );\n\t\tvec4 v3 = texelFetch( batchingTexture, ivec2( x + 2, y ), 0 );\n\t\tvec4 v4 = texelFetch( batchingTexture, ivec2( x + 3, y ), 0 );\n\t\treturn mat4( v1, v2, v3, v4 );\n\t}\n\tfloat getIndirectIndex( const in int i ) {\n\t\tint size = textureSize( batchingIdTexture, 0 ).x;\n\t\tint x = i % size;\n\t\tint y = i / size;\n\t\treturn float( texelFetch( batchingIdTexture, ivec2( x, y ), 0 ).r );\n\t}\n#endif\n#ifdef USE_BATCHING_COLOR\n\tuniform sampler2D batchingColorTexture;\n\tvec3 getBatchingColor( const in float i ) {\n\t\tint size = textureSize( batchingColorTexture, 0 ).x;\n\t\tint j = int( i );\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\treturn texelFetch( batchingColorTexture, ivec2( x, y ), 0 ).rgb;\n\t}\n#endif",batching_vertex:"#ifdef USE_BATCHING\n\tmat4 batchingMatrix = getBatchingMatrix( getIndirectIndex( gl_DrawID ) );\n#endif",begin_vertex:"vec3 transformed = vec3( position );\n#ifdef USE_ALPHAHASH\n\tvPosition = vec3( position );\n#endif",beginnormal_vertex:"vec3 objectNormal = vec3( normal );\n#ifdef USE_TANGENT\n\tvec3 objectTangent = vec3( tangent.xyz );\n#endif",bsdfs:"float 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} // validated",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\treturn 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 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",bumpmap_pars_fragment:"#ifdef USE_BUMPMAP\n\tuniform sampler2D bumpMap;\n\tuniform float bumpScale;\n\tvec2 dHdxy_fwd() {\n\t\tvec2 dSTdx = dFdx( vBumpMapUv );\n\t\tvec2 dSTdy = dFdy( vBumpMapUv );\n\t\tfloat Hll = bumpScale * texture2D( bumpMap, vBumpMapUv ).x;\n\t\tfloat dBx = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdx ).x - Hll;\n\t\tfloat dBy = bumpScale * texture2D( bumpMap, vBumpMapUv + 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 = normalize( dFdx( surf_pos.xyz ) );\n\t\tvec3 vSigmaY = normalize( 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",clipping_planes_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvec4 plane;\n\t#ifdef ALPHA_TO_COVERAGE\n\t\tfloat distanceToPlane, distanceGradient;\n\t\tfloat clipOpacity = 1.0;\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\n\t\t\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\n\t\t\tclipOpacity *= smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\n\t\t\tif ( clipOpacity == 0.0 ) discard;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\t\tfloat unionClipOpacity = 1.0;\n\t\t\t#pragma unroll_loop_start\n\t\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\t\tplane = clippingPlanes[ i ];\n\t\t\t\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\n\t\t\t\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\n\t\t\t\tunionClipOpacity *= 1.0 - smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\n\t\t\t}\n\t\t\t#pragma unroll_loop_end\n\t\t\tclipOpacity *= 1.0 - unionClipOpacity;\n\t\t#endif\n\t\tdiffuseColor.a *= clipOpacity;\n\t\tif ( diffuseColor.a == 0.0 ) discard;\n\t#else\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\n\t\t\tplane = clippingPlanes[ i ];\n\t\t\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\n\t\t}\n\t\t#pragma unroll_loop_end\n\t\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\n\t\t\tbool clipped = true;\n\t\t\t#pragma unroll_loop_start\n\t\t\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\n\t\t\t\tplane = clippingPlanes[ i ];\n\t\t\t\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\n\t\t\t}\n\t\t\t#pragma unroll_loop_end\n\t\t\tif ( clipped ) discard;\n\t\t#endif\n\t#endif\n#endif",clipping_planes_pars_fragment:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\n#endif",clipping_planes_pars_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvarying vec3 vClipPosition;\n#endif",clipping_planes_vertex:"#if NUM_CLIPPING_PLANES > 0\n\tvClipPosition = - mvPosition.xyz;\n#endif",color_fragment:"#if defined( USE_COLOR_ALPHA )\n\tdiffuseColor *= vColor;\n#elif defined( USE_COLOR )\n\tdiffuseColor.rgb *= vColor;\n#endif",color_pars_fragment:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR )\n\tvarying vec3 vColor;\n#endif",color_pars_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvarying vec4 vColor;\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\n\tvarying vec3 vColor;\n#endif",color_vertex:"#if defined( USE_COLOR_ALPHA )\n\tvColor = vec4( 1.0 );\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_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#ifdef USE_BATCHING_COLOR\n\tvec3 batchingColor = getBatchingColor( getIndirectIndex( gl_DrawID ) );\n\tvColor.xyz *= batchingColor.xyz;\n#endif",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};\n#ifdef USE_ALPHAHASH\n\tvarying vec3 vPosition;\n#endif\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}\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}\nvec3 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} // validated",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_m0 - 2.0\n\t#define cubeUV_r1 0.8\n\t#define cubeUV_m1 - 1.0\n\t#define cubeUV_r4 0.4\n\t#define cubeUV_m4 2.0\n\t#define cubeUV_r5 0.305\n\t#define cubeUV_m5 3.0\n\t#define cubeUV_r6 0.21\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",defaultnormal_vertex:"vec3 transformedNormal = objectNormal;\n#ifdef USE_TANGENT\n\tvec3 transformedTangent = objectTangent;\n#endif\n#ifdef USE_BATCHING\n\tmat3 bm = mat3( batchingMatrix );\n\ttransformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) );\n\ttransformedNormal = bm * transformedNormal;\n\t#ifdef USE_TANGENT\n\t\ttransformedTangent = bm * transformedTangent;\n\t#endif\n#endif\n#ifdef USE_INSTANCING\n\tmat3 im = mat3( instanceMatrix );\n\ttransformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) );\n\ttransformedNormal = im * transformedNormal;\n\t#ifdef USE_TANGENT\n\t\ttransformedTangent = im * transformedTangent;\n\t#endif\n#endif\ntransformedNormal = normalMatrix * transformedNormal;\n#ifdef FLIP_SIDED\n\ttransformedNormal = - transformedNormal;\n#endif\n#ifdef USE_TANGENT\n\ttransformedTangent = ( modelViewMatrix * vec4( transformedTangent, 0.0 ) ).xyz;\n\t#ifdef FLIP_SIDED\n\t\ttransformedTangent = - transformedTangent;\n\t#endif\n#endif",displacementmap_pars_vertex:"#ifdef USE_DISPLACEMENTMAP\n\tuniform sampler2D displacementMap;\n\tuniform float displacementScale;\n\tuniform float displacementBias;\n#endif",displacementmap_vertex:"#ifdef USE_DISPLACEMENTMAP\n\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias );\n#endif",emissivemap_fragment:"#ifdef USE_EMISSIVEMAP\n\tvec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv );\n\t#ifdef DECODE_VIDEO_TEXTURE_EMISSIVE\n\t\temissiveColor = sRGBTransferEOTF( emissiveColor );\n\t#endif\n\ttotalEmissiveRadiance *= emissiveColor.rgb;\n#endif",emissivemap_pars_fragment:"#ifdef USE_EMISSIVEMAP\n\tuniform sampler2D emissiveMap;\n#endif",colorspace_fragment:"gl_FragColor = linearToOutputTexel( gl_FragColor );",colorspace_pars_fragment:"vec4 LinearTransferOETF( in vec4 value ) {\n\treturn value;\n}\nvec4 sRGBTransferEOTF( in vec4 value ) {\n\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\n}\nvec4 sRGBTransferOETF( 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}",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, envMapRotation * 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",envmap_common_pars_fragment:"#ifdef USE_ENVMAP\n\tuniform float envMapIntensity;\n\tuniform float flipEnvMap;\n\tuniform mat3 envMapRotation;\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",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",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",envmap_physical_pars_fragment:"#ifdef USE_ENVMAP\n\tvec3 getIBLIrradiance( const in vec3 normal ) {\n\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\t\t\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * 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#ifdef 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, envMapRotation * 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\t#ifdef USE_ANISOTROPY\n\t\tvec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {\n\t\t\t#ifdef ENVMAP_TYPE_CUBE_UV\n\t\t\t\tvec3 bentNormal = cross( bitangent, viewDir );\n\t\t\t\tbentNormal = normalize( cross( bentNormal, bitangent ) );\n\t\t\t\tbentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) );\n\t\t\t\treturn getIBLRadiance( viewDir, bentNormal, roughness );\n\t\t\t#else\n\t\t\t\treturn vec3( 0.0 );\n\t\t\t#endif\n\t\t}\n\t#endif\n#endif",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",fog_vertex:"#ifdef USE_FOG\n\tvFogDepth = - mvPosition.z;\n#endif",fog_pars_vertex:"#ifdef USE_FOG\n\tvarying float vFogDepth;\n#endif",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",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",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}",lightmap_pars_fragment:"#ifdef USE_LIGHTMAP\n\tuniform sampler2D lightMap;\n\tuniform float lightMapIntensity;\n#endif",lights_lambert_fragment:"LambertMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularStrength = specularStrength;",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 vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, 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 vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, 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",lights_pars_begin:"uniform bool receiveShadow;\nuniform vec3 ambientLightColor;\n#if defined( USE_LIGHT_PROBES )\n\tuniform vec3 lightProbe[ 9 ];\n#endif\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\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\n\tif ( cutoffDistance > 0.0 ) {\n\t\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\n\t}\n\treturn distanceFalloff;\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, 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 vec3 geometryPosition, out IncidentLight light ) {\n\t\tvec3 lVector = pointLight.position - geometryPosition;\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 vec3 geometryPosition, out IncidentLight light ) {\n\t\tvec3 lVector = spotLight.position - geometryPosition;\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",lights_toon_fragment:"ToonMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;",lights_toon_pars_fragment:"varying vec3 vViewPosition;\nstruct ToonMaterial {\n\tvec3 diffuseColor;\n};\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\n\tvec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, 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",lights_phong_fragment:"BlinnPhongMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb;\nmaterial.specularColor = specular;\nmaterial.specularShininess = shininess;\nmaterial.specularStrength = specularStrength;",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 vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength;\n}\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, 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",lights_physical_fragment:"PhysicalMaterial material;\nmaterial.diffuseColor = diffuseColor.rgb * ( 1.0 - metalnessFactor );\nvec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );\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 USE_SPECULAR\n\t\tfloat specularIntensityFactor = specularIntensity;\n\t\tvec3 specularColorFactor = specularColor;\n\t\t#ifdef USE_SPECULAR_COLORMAP\n\t\t\tspecularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\n\t\t#endif\n\t\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\t\tspecularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\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, vClearcoatMapUv ).x;\n\t#endif\n\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\t\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).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_DISPERSION\n\tmaterial.dispersion = dispersion;\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, vIridescenceMapUv ).r;\n\t#endif\n\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\t\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).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_SHEEN_COLORMAP\n\t\tmaterial.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\n\t#endif\n\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.07, 1.0 );\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\t#ifdef USE_ANISOTROPYMAP\n\t\tmat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\n\t\tvec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\n\t\tvec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\n\t#else\n\t\tvec2 anisotropyV = anisotropyVector;\n\t#endif\n\tmaterial.anisotropy = length( anisotropyV );\n\tif( material.anisotropy == 0.0 ) {\n\t\tanisotropyV = vec2( 1.0, 0.0 );\n\t} else {\n\t\tanisotropyV /= material.anisotropy;\n\t\tmaterial.anisotropy = saturate( material.anisotropy );\n\t}\n\tmaterial.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\n\tmaterial.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;\n\tmaterial.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;\n#endif",lights_physical_pars_fragment:"struct PhysicalMaterial {\n\tvec3 diffuseColor;\n\tfloat roughness;\n\tvec3 specularColor;\n\tfloat specularF90;\n\tfloat dispersion;\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\t#ifdef USE_ANISOTROPY\n\t\tfloat anisotropy;\n\t\tfloat alphaT;\n\t\tvec3 anisotropyT;\n\t\tvec3 anisotropyB;\n\t#endif\n};\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\nvec3 sheenSpecularDirect = vec3( 0.0 );\nvec3 sheenSpecularIndirect = vec3(0.0 );\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}\n#ifdef USE_ANISOTROPY\n\tfloat V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\n\t\tfloat gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\n\t\tfloat gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\n\t\tfloat v = 0.5 / ( gv + gl );\n\t\treturn saturate(v);\n\t}\n\tfloat D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\n\t\tfloat a2 = alphaT * alphaB;\n\t\thighp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\n\t\thighp float v2 = dot( v, v );\n\t\tfloat w2 = a2 / v2;\n\t\treturn RECIPROCAL_PI * a2 * pow2 ( w2 );\n\t}\n#endif\n#ifdef USE_CLEARCOAT\n\tvec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\n\t\tvec3 f0 = material.clearcoatF0;\n\t\tfloat f90 = material.clearcoatF90;\n\t\tfloat roughness = material.clearcoatRoughness;\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 = F_Schlick( f0, f90, dotVH );\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\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\n\tvec3 f0 = material.specularColor;\n\tfloat f90 = material.specularF90;\n\tfloat roughness = material.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\t#ifdef USE_IRIDESCENCE\n\t\tF = mix( F, material.iridescenceFresnel, material.iridescence );\n\t#endif\n\t#ifdef USE_ANISOTROPY\n\t\tfloat dotTL = dot( material.anisotropyT, lightDir );\n\t\tfloat dotTV = dot( material.anisotropyT, viewDir );\n\t\tfloat dotTH = dot( material.anisotropyT, halfDir );\n\t\tfloat dotBL = dot( material.anisotropyB, lightDir );\n\t\tfloat dotBV = dot( material.anisotropyB, viewDir );\n\t\tfloat dotBH = dot( material.anisotropyB, halfDir );\n\t\tfloat V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\n\t\tfloat D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\n\t#else\n\t\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\n\t\tfloat D = D_GGX( alpha, dotNH );\n\t#endif\n\treturn F * ( V * D );\n}\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}\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\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 vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\t\tvec3 normal = geometryNormal;\n\t\tvec3 viewDir = geometryViewDir;\n\t\tvec3 position = geometryPosition;\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 vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\n\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\n\tvec3 irradiance = dotNL * directLight.color;\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\n\t\tvec3 ccIrradiance = dotNLcc * directLight.color;\n\t\tclearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\n\t#endif\n\treflectedLight.directSpecular += irradiance * BRDF_GGX( directLight.direction, geometryViewDir, geometryNormal, material );\n\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\n}\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, 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 vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\n\t#endif\n\t#ifdef USE_SHEEN\n\t\tsheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, 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( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnel, material.roughness, singleScattering, multiScattering );\n\t#else\n\t\tcomputeMultiscattering( geometryNormal, geometryViewDir, 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}",lights_fragment_begin:"\nvec3 geometryPosition = - vViewPosition;\nvec3 geometryNormal = normal;\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\nvec3 geometryClearcoatNormal = vec3( 0.0 );\n#ifdef USE_CLEARCOAT\n\tgeometryClearcoatNormal = clearcoatNormal;\n#endif\n#ifdef USE_IRIDESCENCE\n\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\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, geometryPosition, 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.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, 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, geometryPosition, 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.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, 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, 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.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, 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, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, 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\t#if defined( USE_LIGHT_PROBES )\n\t\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\n\t#endif\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 ], geometryNormal );\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",lights_fragment_maps:"#if defined( RE_IndirectDiffuse )\n\t#ifdef USE_LIGHTMAP\n\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\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( geometryNormal );\n\t#endif\n#endif\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\n\t#ifdef USE_ANISOTROPY\n\t\tradiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\n\t#else\n\t\tradiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tclearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\n\t#endif\n#endif",lights_fragment_end:"#if defined( RE_IndirectDiffuse )\n\tRE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif\n#if defined( RE_IndirectSpecular )\n\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n#endif",logdepthbuf_fragment:"#if defined( USE_LOGDEPTHBUF )\n\tgl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\n#endif",logdepthbuf_pars_fragment:"#if defined( USE_LOGDEPTHBUF )\n\tuniform float logDepthBufFC;\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_pars_vertex:"#ifdef USE_LOGDEPTHBUF\n\tvarying float vFragDepth;\n\tvarying float vIsPerspective;\n#endif",logdepthbuf_vertex:"#ifdef USE_LOGDEPTHBUF\n\tvFragDepth = 1.0 + gl_Position.w;\n\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\n#endif",map_fragment:"#ifdef USE_MAP\n\tvec4 sampledDiffuseColor = texture2D( map, vMapUv );\n\t#ifdef DECODE_VIDEO_TEXTURE\n\t\tsampledDiffuseColor = sRGBTransferEOTF( sampledDiffuseColor );\n\t#endif\n\tdiffuseColor *= sampledDiffuseColor;\n#endif",map_pars_fragment:"#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif",map_particle_fragment:"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\t#if defined( USE_POINTS_UV )\n\t\tvec2 uv = vUv;\n\t#else\n\t\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\n\t#endif\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",map_particle_pars_fragment:"#if defined( USE_POINTS_UV )\n\tvarying vec2 vUv;\n#else\n\t#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\n\t\tuniform mat3 uvTransform;\n\t#endif\n#endif\n#ifdef USE_MAP\n\tuniform sampler2D map;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform sampler2D alphaMap;\n#endif",metalnessmap_fragment:"float metalnessFactor = metalness;\n#ifdef USE_METALNESSMAP\n\tvec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv );\n\tmetalnessFactor *= texelMetalness.b;\n#endif",metalnessmap_pars_fragment:"#ifdef USE_METALNESSMAP\n\tuniform sampler2D metalnessMap;\n#endif",morphinstance_vertex:"#ifdef USE_INSTANCING_MORPH\n\tfloat morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\tfloat morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tmorphTargetInfluences[i] = texelFetch( morphTexture, ivec2( i + 1, gl_InstanceID ), 0 ).r;\n\t}\n#endif",morphcolor_vertex:"#if defined( USE_MORPHCOLORS )\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",morphnormal_vertex:"#ifdef USE_MORPHNORMALS\n\tobjectNormal *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\n\t}\n#endif",morphtarget_pars_vertex:"#ifdef USE_MORPHTARGETS\n\t#ifndef USE_INSTANCING_MORPH\n\t\tuniform float morphTargetBaseInfluence;\n\t\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\n\t#endif\n\tuniform sampler2DArray morphTargetsTexture;\n\tuniform ivec2 morphTargetsTextureSize;\n\tvec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\n\t\tint texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\n\t\tint y = texelIndex / morphTargetsTextureSize.x;\n\t\tint x = texelIndex - y * morphTargetsTextureSize.x;\n\t\tivec3 morphUV = ivec3( x, y, morphTargetIndex );\n\t\treturn texelFetch( morphTargetsTexture, morphUV, 0 );\n\t}\n#endif",morphtarget_vertex:"#ifdef USE_MORPHTARGETS\n\ttransformed *= morphTargetBaseInfluence;\n\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\n\t\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\n\t}\n#endif",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 *= faceDirection;\n\t#endif\n#endif\n#if defined( USE_NORMALMAP_TANGENTSPACE ) || defined( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY )\n\t#ifdef USE_TANGENT\n\t\tmat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n\t#else\n\t\tmat3 tbn = getTangentFrame( - vViewPosition, normal,\n\t\t#if defined( USE_NORMALMAP )\n\t\t\tvNormalMapUv\n\t\t#elif defined( USE_CLEARCOAT_NORMALMAP )\n\t\t\tvClearcoatNormalMapUv\n\t\t#else\n\t\t\tvUv\n\t\t#endif\n\t\t);\n\t#endif\n\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n\t\ttbn[0] *= faceDirection;\n\t\ttbn[1] *= faceDirection;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\t#ifdef USE_TANGENT\n\t\tmat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\n\t#else\n\t\tmat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv );\n\t#endif\n\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\n\t\ttbn2[0] *= faceDirection;\n\t\ttbn2[1] *= faceDirection;\n\t#endif\n#endif\nvec3 nonPerturbedNormal = normal;",normal_fragment_maps:"#ifdef USE_NORMALMAP_OBJECTSPACE\n\tnormal = texture2D( normalMap, vNormalMapUv ).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( USE_NORMALMAP_TANGENTSPACE )\n\tvec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\n\tmapN.xy *= normalScale;\n\tnormal = normalize( tbn * mapN );\n#elif defined( USE_BUMPMAP )\n\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\n#endif",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",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",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",normalmap_pars_fragment:"#ifdef USE_NORMALMAP\n\tuniform sampler2D normalMap;\n\tuniform vec2 normalScale;\n#endif\n#ifdef USE_NORMALMAP_OBJECTSPACE\n\tuniform mat3 normalMatrix;\n#endif\n#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) )\n\tmat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) {\n\t\tvec3 q0 = dFdx( eye_pos.xyz );\n\t\tvec3 q1 = dFdy( eye_pos.xyz );\n\t\tvec2 st0 = dFdx( uv.st );\n\t\tvec2 st1 = dFdy( uv.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 : inversesqrt( det );\n\t\treturn mat3( T * scale, B * scale, N );\n\t}\n#endif",clearcoat_normal_fragment_begin:"#ifdef USE_CLEARCOAT\n\tvec3 clearcoatNormal = nonPerturbedNormal;\n#endif",clearcoat_normal_fragment_maps:"#ifdef USE_CLEARCOAT_NORMALMAP\n\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0;\n\tclearcoatMapN.xy *= clearcoatNormalScale;\n\tclearcoatNormal = normalize( tbn2 * clearcoatMapN );\n#endif",clearcoat_pars_fragment:"#ifdef USE_CLEARCOATMAP\n\tuniform sampler2D clearcoatMap;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform sampler2D clearcoatNormalMap;\n\tuniform vec2 clearcoatNormalScale;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform sampler2D clearcoatRoughnessMap;\n#endif",iridescence_pars_fragment:"#ifdef USE_IRIDESCENCEMAP\n\tuniform sampler2D iridescenceMap;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform sampler2D iridescenceThicknessMap;\n#endif",opaque_fragment:"#ifdef OPAQUE\ndiffuseColor.a = 1.0;\n#endif\n#ifdef USE_TRANSMISSION\ndiffuseColor.a *= material.transmissionAlpha;\n#endif\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );",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.;const float ShiftRight8 = 1. / 256.;\nconst float Inv255 = 1. / 255.;\nconst vec4 PackFactors = vec4( 1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0 );\nconst vec2 UnpackFactors2 = vec2( UnpackDownscale, 1.0 / PackFactors.g );\nconst vec3 UnpackFactors3 = vec3( UnpackDownscale / PackFactors.rg, 1.0 / PackFactors.b );\nconst vec4 UnpackFactors4 = vec4( UnpackDownscale / PackFactors.rgb, 1.0 / PackFactors.a );\nvec4 packDepthToRGBA( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec4( 0., 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec4( 1., 1., 1., 1. );\n\tfloat vuf;\n\tfloat af = modf( v * PackFactors.a, vuf );\n\tfloat bf = modf( vuf * ShiftRight8, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec4( vuf * Inv255, gf * PackUpscale, bf * PackUpscale, af );\n}\nvec3 packDepthToRGB( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec3( 0., 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec3( 1., 1., 1. );\n\tfloat vuf;\n\tfloat bf = modf( v * PackFactors.b, vuf );\n\tfloat gf = modf( vuf * ShiftRight8, vuf );\n\treturn vec3( vuf * Inv255, gf * PackUpscale, bf );\n}\nvec2 packDepthToRG( const in float v ) {\n\tif( v <= 0.0 )\n\t\treturn vec2( 0., 0. );\n\tif( v >= 1.0 )\n\t\treturn vec2( 1., 1. );\n\tfloat vuf;\n\tfloat gf = modf( v * 256., vuf );\n\treturn vec2( vuf * Inv255, gf );\n}\nfloat unpackRGBAToDepth( const in vec4 v ) {\n\treturn dot( v, UnpackFactors4 );\n}\nfloat unpackRGBToDepth( const in vec3 v ) {\n\treturn dot( v, UnpackFactors3 );\n}\nfloat unpackRGToDepth( const in vec2 v ) {\n\treturn v.r * UnpackFactors2.r + v.g * UnpackFactors2.g;\n}\nvec4 pack2HalfToRGBA( const in 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( const in 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 depth, const in float near, const in float far ) {\n\treturn depth * ( 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 depth, const in float near, const in float far ) {\n\treturn ( near * far ) / ( ( far - near ) * depth - far );\n}",premultiplied_alpha_fragment:"#ifdef PREMULTIPLIED_ALPHA\n\tgl_FragColor.rgb *= gl_FragColor.a;\n#endif",project_vertex:"vec4 mvPosition = vec4( transformed, 1.0 );\n#ifdef USE_BATCHING\n\tmvPosition = batchingMatrix * mvPosition;\n#endif\n#ifdef USE_INSTANCING\n\tmvPosition = instanceMatrix * mvPosition;\n#endif\nmvPosition = modelViewMatrix * mvPosition;\ngl_Position = projectionMatrix * mvPosition;",dithering_fragment:"#ifdef DITHERING\n\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\n#endif",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",roughnessmap_fragment:"float roughnessFactor = roughness;\n#ifdef USE_ROUGHNESSMAP\n\tvec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv );\n\troughnessFactor *= texelRoughness.g;\n#endif",roughnessmap_pars_fragment:"#ifdef USE_ROUGHNESSMAP\n\tuniform sampler2D roughnessMap;\n#endif",shadowmap_pars_fragment:"#if NUM_SPOT_LIGHT_COORDS > 0\n\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\n#endif\n#if NUM_SPOT_LIGHT_MAPS > 0\n\tuniform 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 shadowIntensity;\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 shadowIntensity;\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 shadowIntensity;\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 shadowIntensity, 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 mix( 1.0, shadow, shadowIntensity );\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 shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\n\t\tfloat shadow = 1.0;\n\t\tvec3 lightToPosition = shadowCoord.xyz;\n\t\t\n\t\tfloat lightToPositionLength = length( lightToPosition );\n\t\tif ( lightToPositionLength - shadowCameraFar <= 0.0 && lightToPositionLength - shadowCameraNear >= 0.0 ) {\n\t\t\tfloat dp = ( lightToPositionLength - shadowCameraNear ) / ( shadowCameraFar - shadowCameraNear );\t\t\tdp += shadowBias;\n\t\t\tvec3 bd3D = normalize( lightToPosition );\n\t\t\tvec2 texelSize = vec2( 1.0 ) / ( shadowMapSize * vec2( 4.0, 2.0 ) );\n\t\t\t#if defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_PCF_SOFT ) || defined( SHADOWMAP_TYPE_VSM )\n\t\t\t\tvec2 offset = vec2( - 1, 1 ) * shadowRadius * texelSize.y;\n\t\t\t\tshadow = (\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xyx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yyx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxy, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.xxx, texelSize.y ), dp ) +\n\t\t\t\t\ttexture2DCompare( shadowMap, cubeToUV( bd3D + offset.yxx, texelSize.y ), dp )\n\t\t\t\t) * ( 1.0 / 9.0 );\n\t\t\t#else\n\t\t\t\tshadow = texture2DCompare( shadowMap, cubeToUV( bd3D, texelSize.y ), dp );\n\t\t\t#endif\n\t\t}\n\t\treturn mix( 1.0, shadow, shadowIntensity );\n\t}\n#endif",shadowmap_pars_vertex:"#if NUM_SPOT_LIGHT_COORDS > 0\n\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\n\tvarying 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 shadowIntensity;\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 shadowIntensity;\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 shadowIntensity;\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",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",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.shadowIntensity, 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.shadowIntensity, 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.shadowIntensity, 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}",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",skinning_pars_vertex:"#ifdef USE_SKINNING\n\tuniform mat4 bindMatrix;\n\tuniform mat4 bindMatrixInverse;\n\tuniform highp sampler2D boneTexture;\n\tmat4 getBoneMatrix( const in float i ) {\n\t\tint size = textureSize( boneTexture, 0 ).x;\n\t\tint j = int( i ) * 4;\n\t\tint x = j % size;\n\t\tint y = j / size;\n\t\tvec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 );\n\t\tvec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 );\n\t\tvec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 );\n\t\tvec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 );\n\t\treturn mat4( v1, v2, v3, v4 );\n\t}\n#endif",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",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",specularmap_fragment:"float specularStrength;\n#ifdef USE_SPECULARMAP\n\tvec4 texelSpecular = texture2D( specularMap, vSpecularMapUv );\n\tspecularStrength = texelSpecular.r;\n#else\n\tspecularStrength = 1.0;\n#endif",specularmap_pars_fragment:"#ifdef USE_SPECULARMAP\n\tuniform sampler2D specularMap;\n#endif",tonemapping_fragment:"#if defined( TONE_MAPPING )\n\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\n#endif",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 saturate( toneMappingExposure * color );\n}\nvec3 ReinhardToneMapping( vec3 color ) {\n\tcolor *= toneMappingExposure;\n\treturn saturate( color / ( vec3( 1.0 ) + color ) );\n}\nvec3 CineonToneMapping( 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}\nconst mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(\n\tvec3( 1.6605, - 0.1246, - 0.0182 ),\n\tvec3( - 0.5876, 1.1329, - 0.1006 ),\n\tvec3( - 0.0728, - 0.0083, 1.1187 )\n);\nconst mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(\n\tvec3( 0.6274, 0.0691, 0.0164 ),\n\tvec3( 0.3293, 0.9195, 0.0880 ),\n\tvec3( 0.0433, 0.0113, 0.8956 )\n);\nvec3 agxDefaultContrastApprox( vec3 x ) {\n\tvec3 x2 = x * x;\n\tvec3 x4 = x2 * x2;\n\treturn + 15.5 * x4 * x2\n\t\t- 40.14 * x4 * x\n\t\t+ 31.96 * x4\n\t\t- 6.868 * x2 * x\n\t\t+ 0.4298 * x2\n\t\t+ 0.1191 * x\n\t\t- 0.00232;\n}\nvec3 AgXToneMapping( vec3 color ) {\n\tconst mat3 AgXInsetMatrix = mat3(\n\t\tvec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ),\n\t\tvec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ),\n\t\tvec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 )\n\t);\n\tconst mat3 AgXOutsetMatrix = mat3(\n\t\tvec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ),\n\t\tvec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ),\n\t\tvec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 )\n\t);\n\tconst float AgxMinEv = - 12.47393;\tconst float AgxMaxEv = 4.026069;\n\tcolor *= toneMappingExposure;\n\tcolor = LINEAR_SRGB_TO_LINEAR_REC2020 * color;\n\tcolor = AgXInsetMatrix * color;\n\tcolor = max( color, 1e-10 );\tcolor = log2( color );\n\tcolor = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv );\n\tcolor = clamp( color, 0.0, 1.0 );\n\tcolor = agxDefaultContrastApprox( color );\n\tcolor = AgXOutsetMatrix * color;\n\tcolor = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) );\n\tcolor = LINEAR_REC2020_TO_LINEAR_SRGB * color;\n\tcolor = clamp( color, 0.0, 1.0 );\n\treturn color;\n}\nvec3 NeutralToneMapping( vec3 color ) {\n\tconst float StartCompression = 0.8 - 0.04;\n\tconst float Desaturation = 0.15;\n\tcolor *= toneMappingExposure;\n\tfloat x = min( color.r, min( color.g, color.b ) );\n\tfloat offset = x < 0.08 ? x - 6.25 * x * x : 0.04;\n\tcolor -= offset;\n\tfloat peak = max( color.r, max( color.g, color.b ) );\n\tif ( peak < StartCompression ) return color;\n\tfloat d = 1. - StartCompression;\n\tfloat newPeak = 1. - d * d / ( peak + d - StartCompression );\n\tcolor *= newPeak / peak;\n\tfloat g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. );\n\treturn mix( color, vec3( newPeak ), g );\n}\nvec3 CustomToneMapping( vec3 color ) { return color; }",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, vTransmissionMapUv ).r;\n\t#endif\n\t#ifdef USE_THICKNESSMAP\n\t\tmaterial.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\n\t#endif\n\tvec3 pos = vWorldPosition;\n\tvec3 v = normalize( cameraPosition - pos );\n\tvec3 n = inverseTransformDirection( normal, viewMatrix );\n\tvec4 transmitted = getIBLVolumeRefraction(\n\t\tn, v, material.roughness, material.diffuseColor, material.specularColor, material.specularF90,\n\t\tpos, modelMatrix, viewMatrix, projectionMatrix, material.dispersion, material.ior, material.thickness,\n\t\tmaterial.attenuationColor, material.attenuationDistance );\n\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\n\ttotalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission );\n#endif",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\tfloat w0( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\n\t}\n\tfloat w1( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * ( 3.0 * a - 6.0 ) + 4.0 );\n\t}\n\tfloat w2( float a ){\n\t\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\n\t}\n\tfloat w3( float a ) {\n\t\treturn ( 1.0 / 6.0 ) * ( a * a * a );\n\t}\n\tfloat g0( float a ) {\n\t\treturn w0( a ) + w1( a );\n\t}\n\tfloat g1( float a ) {\n\t\treturn w2( a ) + w3( a );\n\t}\n\tfloat h0( float a ) {\n\t\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\n\t}\n\tfloat h1( float a ) {\n\t\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\n\t}\n\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\n\t\tuv = uv * texelSize.zw + 0.5;\n\t\tvec2 iuv = floor( uv );\n\t\tvec2 fuv = fract( uv );\n\t\tfloat g0x = g0( fuv.x );\n\t\tfloat g1x = g1( fuv.x );\n\t\tfloat h0x = h0( fuv.x );\n\t\tfloat h1x = h1( fuv.x );\n\t\tfloat h0y = h0( fuv.y );\n\t\tfloat h1y = h1( fuv.y );\n\t\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\n\t\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\n\t\t\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\n\t}\n\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\n\t\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\n\t\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\n\t\tvec2 fLodSizeInv = 1.0 / fLodSize;\n\t\tvec2 cLodSizeInv = 1.0 / cLodSize;\n\t\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\n\t\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\n\t\treturn mix( fSample, cSample, fract( lod ) );\n\t}\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 lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\n\t\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\n\t}\n\tvec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tif ( isinf( attenuationDistance ) ) {\n\t\t\treturn vec3( 1.0 );\n\t\t} else {\n\t\t\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\n\t\t\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\t\t\treturn transmittance;\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 dispersion, const in float ior, const in float thickness,\n\t\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\n\t\tvec4 transmittedLight;\n\t\tvec3 transmittance;\n\t\t#ifdef USE_DISPERSION\n\t\t\tfloat halfSpread = ( ior - 1.0 ) * 0.025 * dispersion;\n\t\t\tvec3 iors = vec3( ior - halfSpread, ior, ior + halfSpread );\n\t\t\tfor ( int i = 0; i < 3; i ++ ) {\n\t\t\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, iors[ i ], modelMatrix );\n\t\t\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\t\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\t\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\t\t\trefractionCoords += 1.0;\n\t\t\t\trefractionCoords /= 2.0;\n\t\t\t\tvec4 transmissionSample = getTransmissionSample( refractionCoords, roughness, iors[ i ] );\n\t\t\t\ttransmittedLight[ i ] = transmissionSample[ i ];\n\t\t\t\ttransmittedLight.a += transmissionSample.a;\n\t\t\t\ttransmittance[ i ] = diffuseColor[ i ] * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance )[ i ];\n\t\t\t}\n\t\t\ttransmittedLight.a /= 3.0;\n\t\t#else\n\t\t\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\t\tvec3 refractedRayExit = position + transmissionRay;\n\t\t\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\n\t\t\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\n\t\t\trefractionCoords += 1.0;\n\t\t\trefractionCoords /= 2.0;\n\t\t\ttransmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\t\ttransmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\n\t\t#endif\n\t\tvec3 attenuatedColor = transmittance * transmittedLight.rgb;\n\t\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\n\t\tfloat transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\n\t\treturn vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\n\t}\n#endif",uv_pars_fragment:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\n\tvarying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n\tvarying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n\tvarying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n\tvarying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n\tvarying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n\tvarying vec2 vNormalMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tvarying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n\tvarying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tvarying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tvarying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tvarying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvarying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tvarying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tvarying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tvarying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tvarying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tvarying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n\tvarying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tvarying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tvarying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tuniform mat3 transmissionMapTransform;\n\tvarying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n\tuniform mat3 thicknessMapTransform;\n\tvarying vec2 vThicknessMapUv;\n#endif",uv_pars_vertex:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvarying vec2 vUv;\n#endif\n#ifdef USE_MAP\n\tuniform mat3 mapTransform;\n\tvarying vec2 vMapUv;\n#endif\n#ifdef USE_ALPHAMAP\n\tuniform mat3 alphaMapTransform;\n\tvarying vec2 vAlphaMapUv;\n#endif\n#ifdef USE_LIGHTMAP\n\tuniform mat3 lightMapTransform;\n\tvarying vec2 vLightMapUv;\n#endif\n#ifdef USE_AOMAP\n\tuniform mat3 aoMapTransform;\n\tvarying vec2 vAoMapUv;\n#endif\n#ifdef USE_BUMPMAP\n\tuniform mat3 bumpMapTransform;\n\tvarying vec2 vBumpMapUv;\n#endif\n#ifdef USE_NORMALMAP\n\tuniform mat3 normalMapTransform;\n\tvarying vec2 vNormalMapUv;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n\tuniform mat3 displacementMapTransform;\n\tvarying vec2 vDisplacementMapUv;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tuniform mat3 emissiveMapTransform;\n\tvarying vec2 vEmissiveMapUv;\n#endif\n#ifdef USE_METALNESSMAP\n\tuniform mat3 metalnessMapTransform;\n\tvarying vec2 vMetalnessMapUv;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tuniform mat3 roughnessMapTransform;\n\tvarying vec2 vRoughnessMapUv;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tuniform mat3 anisotropyMapTransform;\n\tvarying vec2 vAnisotropyMapUv;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tuniform mat3 clearcoatMapTransform;\n\tvarying vec2 vClearcoatMapUv;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tuniform mat3 clearcoatNormalMapTransform;\n\tvarying vec2 vClearcoatNormalMapUv;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tuniform mat3 clearcoatRoughnessMapTransform;\n\tvarying vec2 vClearcoatRoughnessMapUv;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tuniform mat3 sheenColorMapTransform;\n\tvarying vec2 vSheenColorMapUv;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tuniform mat3 sheenRoughnessMapTransform;\n\tvarying vec2 vSheenRoughnessMapUv;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tuniform mat3 iridescenceMapTransform;\n\tvarying vec2 vIridescenceMapUv;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tuniform mat3 iridescenceThicknessMapTransform;\n\tvarying vec2 vIridescenceThicknessMapUv;\n#endif\n#ifdef USE_SPECULARMAP\n\tuniform mat3 specularMapTransform;\n\tvarying vec2 vSpecularMapUv;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tuniform mat3 specularColorMapTransform;\n\tvarying vec2 vSpecularColorMapUv;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tuniform mat3 specularIntensityMapTransform;\n\tvarying vec2 vSpecularIntensityMapUv;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tuniform mat3 transmissionMapTransform;\n\tvarying vec2 vTransmissionMapUv;\n#endif\n#ifdef USE_THICKNESSMAP\n\tuniform mat3 thicknessMapTransform;\n\tvarying vec2 vThicknessMapUv;\n#endif",uv_vertex:"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\n\tvUv = vec3( uv, 1 ).xy;\n#endif\n#ifdef USE_MAP\n\tvMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ALPHAMAP\n\tvAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_LIGHTMAP\n\tvLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_AOMAP\n\tvAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_BUMPMAP\n\tvBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_NORMALMAP\n\tvNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_DISPLACEMENTMAP\n\tvDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_EMISSIVEMAP\n\tvEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_METALNESSMAP\n\tvMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ROUGHNESSMAP\n\tvRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_ANISOTROPYMAP\n\tvAnisotropyMapUv = ( anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOATMAP\n\tvClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_NORMALMAP\n\tvClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\n\tvClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCEMAP\n\tvIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\n\tvIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_COLORMAP\n\tvSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SHEEN_ROUGHNESSMAP\n\tvSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULARMAP\n\tvSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_COLORMAP\n\tvSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_SPECULAR_INTENSITYMAP\n\tvSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_TRANSMISSIONMAP\n\tvTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy;\n#endif\n#ifdef USE_THICKNESSMAP\n\tvThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy;\n#endif",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_BATCHING\n\t\tworldPosition = batchingMatrix * worldPosition;\n\t#endif\n\t#ifdef USE_INSTANCING\n\t\tworldPosition = instanceMatrix * worldPosition;\n\t#endif\n\tworldPosition = modelMatrix * worldPosition;\n#endif",background_vert:"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}",background_frag:"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 <colorspace_fragment>\n}",backgroundCube_vert:"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}",backgroundCube_frag:"#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;\nuniform mat3 backgroundRotation;\nvarying vec3 vWorldDirection;\n#include <cube_uv_reflection_fragment>\nvoid main() {\n\t#ifdef ENVMAP_TYPE_CUBE\n\t\tvec4 texColor = textureCube( envMap, backgroundRotation * vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\n\t#elif defined( ENVMAP_TYPE_CUBE_UV )\n\t\tvec4 texColor = textureCubeUV( envMap, backgroundRotation * 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 <colorspace_fragment>\n}",cube_vert:"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}",cube_frag:"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 <colorspace_fragment>\n}",depth_vert:"#include <common>\n#include <batching_pars_vertex>\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 <batching_vertex>\n\t#include <skinbase_vertex>\n\t#include <morphinstance_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}",depth_frag:"#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 <alphahash_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvarying vec2 vHighPrecisionZW;\nvoid main() {\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include <clipping_planes_fragment>\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 <alphahash_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#elif DEPTH_PACKING == 3202\n\t\tgl_FragColor = vec4( packDepthToRGB( fragCoordZ ), 1.0 );\n\t#elif DEPTH_PACKING == 3203\n\t\tgl_FragColor = vec4( packDepthToRG( fragCoordZ ), 0.0, 1.0 );\n\t#endif\n}",distanceRGBA_vert:"#define DISTANCE\nvarying vec3 vWorldPosition;\n#include <common>\n#include <batching_pars_vertex>\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 <batching_vertex>\n\t#include <skinbase_vertex>\n\t#include <morphinstance_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}",distanceRGBA_frag:"#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 <alphahash_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main () {\n\tvec4 diffuseColor = vec4( 1.0 );\n\t#include <clipping_planes_fragment>\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\tfloat dist = length( vWorldPosition - referencePosition );\n\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\n\tdist = saturate( dist );\n\tgl_FragColor = packDepthToRGBA( dist );\n}",equirect_vert:"varying vec3 vWorldDirection;\n#include <common>\nvoid main() {\n\tvWorldDirection = transformDirection( position, modelMatrix );\n\t#include <begin_vertex>\n\t#include <project_vertex>\n}",equirect_frag:"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 <colorspace_fragment>\n}",linedashed_vert:"uniform float scale;\nattribute float lineDistance;\nvarying float vLineDistance;\n#include <common>\n#include <uv_pars_vertex>\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 <uv_vertex>\n\t#include <color_vertex>\n\t#include <morphinstance_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}",linedashed_frag:"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 <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <clipping_planes_fragment>\n\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\n\t\tdiscard;\n\t}\n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <color_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}",meshbasic_vert:"#include <common>\n#include <batching_pars_vertex>\n#include <uv_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 <color_vertex>\n\t#include <morphinstance_vertex>\n\t#include <morphcolor_vertex>\n\t#include <batching_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}",meshbasic_frag:"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 <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_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\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <clipping_planes_fragment>\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 <alphahash_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, vLightMapUv );\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 <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshlambert_vert:"#define LAMBERT\nvarying vec3 vViewPosition;\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_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 <color_vertex>\n\t#include <morphinstance_vertex>\n\t#include <morphcolor_vertex>\n\t#include <batching_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}",meshlambert_frag:"#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 <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_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\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <clipping_planes_fragment>\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 <alphahash_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 <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshmatcap_vert:"#define MATCAP\nvarying vec3 vViewPosition;\n#include <common>\n#include <batching_pars_vertex>\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 <morphinstance_vertex>\n\t#include <morphcolor_vertex>\n\t#include <batching_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}",meshmatcap_frag:"#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 <alphahash_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\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <clipping_planes_fragment>\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 <alphahash_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 <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshnormal_vert:"#define NORMAL\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\tvarying vec3 vViewPosition;\n#endif\n#include <common>\n#include <batching_pars_vertex>\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 <batching_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphinstance_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( USE_NORMALMAP_TANGENTSPACE )\n\tvViewPosition = - mvPosition.xyz;\n#endif\n}",meshnormal_frag:"#define NORMAL\nuniform float opacity;\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\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\tvec4 diffuseColor = vec4( 0.0, 0.0, 0.0, opacity );\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 ), diffuseColor.a );\n\t#ifdef OPAQUE\n\t\tgl_FragColor.a = 1.0;\n\t#endif\n}",meshphong_vert:"#define PHONG\nvarying vec3 vViewPosition;\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_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 <color_vertex>\n\t#include <morphcolor_vertex>\n\t#include <batching_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphinstance_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}",meshphong_frag:"#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 <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_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\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <clipping_planes_fragment>\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 <alphahash_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 <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshphysical_vert:"#define STANDARD\nvarying vec3 vViewPosition;\n#ifdef USE_TRANSMISSION\n\tvarying vec3 vWorldPosition;\n#endif\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_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 <color_vertex>\n\t#include <morphinstance_vertex>\n\t#include <morphcolor_vertex>\n\t#include <batching_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}",meshphysical_frag:"#define STANDARD\n#ifdef PHYSICAL\n\t#define IOR\n\t#define USE_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 USE_SPECULAR\n\tuniform float specularIntensity;\n\tuniform vec3 specularColor;\n\t#ifdef USE_SPECULAR_COLORMAP\n\t\tuniform sampler2D specularColorMap;\n\t#endif\n\t#ifdef USE_SPECULAR_INTENSITYMAP\n\t\tuniform sampler2D specularIntensityMap;\n\t#endif\n#endif\n#ifdef USE_CLEARCOAT\n\tuniform float clearcoat;\n\tuniform float clearcoatRoughness;\n#endif\n#ifdef USE_DISPERSION\n\tuniform float dispersion;\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_SHEEN_COLORMAP\n\t\tuniform sampler2D sheenColorMap;\n\t#endif\n\t#ifdef USE_SHEEN_ROUGHNESSMAP\n\t\tuniform sampler2D sheenRoughnessMap;\n\t#endif\n#endif\n#ifdef USE_ANISOTROPY\n\tuniform vec2 anisotropyVector;\n\t#ifdef USE_ANISOTROPYMAP\n\t\tuniform sampler2D anisotropyMap;\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 <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lightmap_pars_fragment>\n#include <emissivemap_pars_fragment>\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\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <clipping_planes_fragment>\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 <alphahash_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 + sheenSpecularDirect + sheenSpecularIndirect;\n\t#endif\n\t#ifdef USE_CLEARCOAT\n\t\tfloat dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) );\n\t\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\n\t\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;\n\t#endif\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",meshtoon_vert:"#define TOON\nvarying vec3 vViewPosition;\n#include <common>\n#include <batching_pars_vertex>\n#include <uv_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 <color_vertex>\n\t#include <morphinstance_vertex>\n\t#include <morphcolor_vertex>\n\t#include <batching_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}",meshtoon_frag:"#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 <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_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\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <clipping_planes_fragment>\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 <alphahash_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 <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n\t#include <dithering_fragment>\n}",points_vert:"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>\n#ifdef USE_POINTS_UV\n\tvarying vec2 vUv;\n\tuniform mat3 uvTransform;\n#endif\nvoid main() {\n\t#ifdef USE_POINTS_UV\n\t\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\n\t#endif\n\t#include <color_vertex>\n\t#include <morphinstance_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}",points_frag:"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 <alphahash_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include <logdepthbuf_fragment>\n\t#include <map_particle_fragment>\n\t#include <color_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n\t#include <premultiplied_alpha_fragment>\n}",shadow_vert:"#include <common>\n#include <batching_pars_vertex>\n#include <fog_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <shadowmap_pars_vertex>\nvoid main() {\n\t#include <batching_vertex>\n\t#include <beginnormal_vertex>\n\t#include <morphinstance_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 <logdepthbuf_vertex>\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\t#include <fog_vertex>\n}",shadow_frag:"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 <logdepthbuf_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <shadowmask_pars_fragment>\nvoid main() {\n\t#include <logdepthbuf_fragment>\n\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n}",sprite_vert:"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[ 3 ];\n\tvec2 scale = vec2( length( modelMatrix[ 0 ].xyz ), length( modelMatrix[ 1 ].xyz ) );\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}",sprite_frag:"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 <alphahash_pars_fragment>\n#include <fog_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\nvoid main() {\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t#include <clipping_planes_fragment>\n\tvec3 outgoingLight = vec3( 0.0 );\n\t#include <logdepthbuf_fragment>\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\toutgoingLight = diffuseColor.rgb;\n\t#include <opaque_fragment>\n\t#include <tonemapping_fragment>\n\t#include <colorspace_fragment>\n\t#include <fog_fragment>\n}"},rc={common:{diffuse:{value:new ut.Q1f(16777215)},opacity:{value:1},map:{value:null},mapTransform:{value:new ut.dwI},alphaMap:{value:null},alphaMapTransform:{value:new ut.dwI},alphaTest:{value:0}},specularmap:{specularMap:{value:null},specularMapTransform:{value:new ut.dwI}},envmap:{envMap:{value:null},envMapRotation:{value:new ut.dwI},flipEnvMap:{value:-1},reflectivity:{value:1},ior:{value:1.5},refractionRatio:{value:.98}},aomap:{aoMap:{value:null},aoMapIntensity:{value:1},aoMapTransform:{value:new ut.dwI}},lightmap:{lightMap:{value:null},lightMapIntensity:{value:1},lightMapTransform:{value:new ut.dwI}},bumpmap:{bumpMap:{value:null},bumpMapTransform:{value:new ut.dwI},bumpScale:{value:1}},normalmap:{normalMap:{value:null},normalMapTransform:{value:new ut.dwI},normalScale:{value:new ut.I9Y(1,1)}},displacementmap:{displacementMap:{value:null},displacementMapTransform:{value:new ut.dwI},displacementScale:{value:1},displacementBias:{value:0}},emissivemap:{emissiveMap:{value:null},emissiveMapTransform:{value:new ut.dwI}},metalnessmap:{metalnessMap:{value:null},metalnessMapTransform:{value:new ut.dwI}},roughnessmap:{roughnessMap:{value:null},roughnessMapTransform:{value:new ut.dwI}},gradientmap:{gradientMap:{value:null}},fog:{fogDensity:{value:25e-5},fogNear:{value:1},fogFar:{value:2e3},fogColor:{value:new ut.Q1f(16777215)}},lights:{ambientLightColor:{value:[]},lightProbe:{value:[]},directionalLights:{value:[],properties:{direction:{},color:{}}},directionalLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},directionalShadowMap:{value:[]},directionalShadowMatrix:{value:[]},spotLights:{value:[],properties:{color:{},position:{},direction:{},distance:{},coneCos:{},penumbraCos:{},decay:{}}},spotLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{}}},spotLightMap:{value:[]},spotShadowMap:{value:[]},spotLightMatrix:{value:[]},pointLights:{value:[],properties:{color:{},position:{},decay:{},distance:{}}},pointLightShadows:{value:[],properties:{shadowIntensity:1,shadowBias:{},shadowNormalBias:{},shadowRadius:{},shadowMapSize:{},shadowCameraNear:{},shadowCameraFar:{}}},pointShadowMap:{value:[]},pointShadowMatrix:{value:[]},hemisphereLights:{value:[],properties:{direction:{},skyColor:{},groundColor:{}}},rectAreaLights:{value:[],properties:{color:{},position:{},width:{},height:{}}},ltc_1:{value:null},ltc_2:{value:null}},points:{diffuse:{value:new ut.Q1f(16777215)},opacity:{value:1},size:{value:1},scale:{value:1},map:{value:null},alphaMap:{value:null},alphaMapTransform:{value:new ut.dwI},alphaTest:{value:0},uvTransform:{value:new ut.dwI}},sprite:{diffuse:{value:new ut.Q1f(16777215)},opacity:{value:1},center:{value:new ut.I9Y(.5,.5)},rotation:{value:0},map:{value:null},mapTransform:{value:new ut.dwI},alphaMap:{value:null},alphaMapTransform:{value:new ut.dwI},alphaTest:{value:0}}},sc={basic:{uniforms:(0,ut.Iit)([rc.common,rc.specularmap,rc.envmap,rc.aomap,rc.lightmap,rc.fog]),vertexShader:Hl.meshbasic_vert,fragmentShader:Hl.meshbasic_frag},lambert:{uniforms:(0,ut.Iit)([rc.common,rc.specularmap,rc.envmap,rc.aomap,rc.lightmap,rc.emissivemap,rc.bumpmap,rc.normalmap,rc.displacementmap,rc.fog,rc.lights,{emissive:{value:new ut.Q1f(0)}}]),vertexShader:Hl.meshlambert_vert,fragmentShader:Hl.meshlambert_frag},phong:{uniforms:(0,ut.Iit)([rc.common,rc.specularmap,rc.envmap,rc.aomap,rc.lightmap,rc.emissivemap,rc.bumpmap,rc.normalmap,rc.displacementmap,rc.fog,rc.lights,{emissive:{value:new ut.Q1f(0)},specular:{value:new ut.Q1f(1118481)},shininess:{value:30}}]),vertexShader:Hl.meshphong_vert,fragmentShader:Hl.meshphong_frag},standard:{uniforms:(0,ut.Iit)([rc.common,rc.envmap,rc.aomap,rc.lightmap,rc.emissivemap,rc.bumpmap,rc.normalmap,rc.displacementmap,rc.roughnessmap,rc.metalnessmap,rc.fog,rc.lights,{emissive:{value:new ut.Q1f(0)},roughness:{value:1},metalness:{value:0},envMapIntensity:{value:1}}]),vertexShader:Hl.meshphysical_vert,fragmentShader:Hl.meshphysical_frag},toon:{uniforms:(0,ut.Iit)([rc.common,rc.aomap,rc.lightmap,rc.emissivemap,rc.bumpmap,rc.normalmap,rc.displacementmap,rc.gradientmap,rc.fog,rc.lights,{emissive:{value:new ut.Q1f(0)}}]),vertexShader:Hl.meshtoon_vert,fragmentShader:Hl.meshtoon_frag},matcap:{uniforms:(0,ut.Iit)([rc.common,rc.bumpmap,rc.normalmap,rc.displacementmap,rc.fog,{matcap:{value:null}}]),vertexShader:Hl.meshmatcap_vert,fragmentShader:Hl.meshmatcap_frag},points:{uniforms:(0,ut.Iit)([rc.points,rc.fog]),vertexShader:Hl.points_vert,fragmentShader:Hl.points_frag},dashed:{uniforms:(0,ut.Iit)([rc.common,rc.fog,{scale:{value:1},dashSize:{value:1},totalSize:{value:2}}]),vertexShader:Hl.linedashed_vert,fragmentShader:Hl.linedashed_frag},depth:{uniforms:(0,ut.Iit)([rc.common,rc.displacementmap]),vertexShader:Hl.depth_vert,fragmentShader:Hl.depth_frag},normal:{uniforms:(0,ut.Iit)([rc.common,rc.bumpmap,rc.normalmap,rc.displacementmap,{opacity:{value:1}}]),vertexShader:Hl.meshnormal_vert,fragmentShader:Hl.meshnormal_frag},sprite:{uniforms:(0,ut.Iit)([rc.sprite,rc.fog]),vertexShader:Hl.sprite_vert,fragmentShader:Hl.sprite_frag},background:{uniforms:{uvTransform:{value:new ut.dwI},t2D:{value:null},backgroundIntensity:{value:1}},vertexShader:Hl.background_vert,fragmentShader:Hl.background_frag},backgroundCube:{uniforms:{envMap:{value:null},flipEnvMap:{value:-1},backgroundBlurriness:{value:0},backgroundIntensity:{value:1},backgroundRotation:{value:new ut.dwI}},vertexShader:Hl.backgroundCube_vert,fragmentShader:Hl.backgroundCube_frag},cube:{uniforms:{tCube:{value:null},tFlip:{value:-1},opacity:{value:1}},vertexShader:Hl.cube_vert,fragmentShader:Hl.cube_frag},equirect:{uniforms:{tEquirect:{value:null}},vertexShader:Hl.equirect_vert,fragmentShader:Hl.equirect_frag},distanceRGBA:{uniforms:(0,ut.Iit)([rc.common,rc.displacementmap,{referencePosition:{value:new ut.Pq0},nearDistance:{value:1},farDistance:{value:1e3}}]),vertexShader:Hl.distanceRGBA_vert,fragmentShader:Hl.distanceRGBA_frag},shadow:{uniforms:(0,ut.Iit)([rc.lights,rc.fog,{color:{value:new ut.Q1f(0)},opacity:{value:1}}]),vertexShader:Hl.shadow_vert,fragmentShader:Hl.shadow_frag}};sc.physical={uniforms:(0,ut.Iit)([sc.standard.uniforms,{clearcoat:{value:0},clearcoatMap:{value:null},clearcoatMapTransform:{value:new ut.dwI},clearcoatNormalMap:{value:null},clearcoatNormalMapTransform:{value:new ut.dwI},clearcoatNormalScale:{value:new ut.I9Y(1,1)},clearcoatRoughness:{value:0},clearcoatRoughnessMap:{value:null},clearcoatRoughnessMapTransform:{value:new ut.dwI},dispersion:{value:0},iridescence:{value:0},iridescenceMap:{value:null},iridescenceMapTransform:{value:new ut.dwI},iridescenceIOR:{value:1.3},iridescenceThicknessMinimum:{value:100},iridescenceThicknessMaximum:{value:400},iridescenceThicknessMap:{value:null},iridescenceThicknessMapTransform:{value:new ut.dwI},sheen:{value:0},sheenColor:{value:new ut.Q1f(0)},sheenColorMap:{value:null},sheenColorMapTransform:{value:new ut.dwI},sheenRoughness:{value:1},sheenRoughnessMap:{value:null},sheenRoughnessMapTransform:{value:new ut.dwI},transmission:{value:0},transmissionMap:{value:null},transmissionMapTransform:{value:new ut.dwI},transmissionSamplerSize:{value:new ut.I9Y},transmissionSamplerMap:{value:null},thickness:{value:0},thicknessMap:{value:null},thicknessMapTransform:{value:new ut.dwI},attenuationDistance:{value:0},attenuationColor:{value:new ut.Q1f(0)},specularColor:{value:new ut.Q1f(1,1,1)},specularColorMap:{value:null},specularColorMapTransform:{value:new ut.dwI},specularIntensity:{value:1},specularIntensityMap:{value:null},specularIntensityMapTransform:{value:new ut.dwI},anisotropyVector:{value:new ut.I9Y},anisotropyMap:{value:null},anisotropyMapTransform:{value:new ut.dwI}}]),vertexShader:Hl.meshphysical_vert,fragmentShader:Hl.meshphysical_frag};const oc={r:0,b:0,g:0},_c=new ut.O9p,wc=new ut.kn4;function WebGLBackground(at,st,ot,Hl,rc,Sc,iu){const su=new ut.Q1f(0);let lu,cu,uu=!0===Sc?0:1,pu=null,mu=0,gu=null;function getBackground(at){let ut=!0===at.isScene?at.background:null;if(ut&&ut.isTexture){ut=(at.backgroundBlurriness>0?ot:st).get(ut)}return ut}function setClear(st,ot){st.getRGB(oc,(0,ut._Ut)(at)),Hl.buffers.color.setClear(oc.r,oc.g,oc.b,ot,iu)}return{getClearColor:function(){return su},setClearColor:function(at,st){void 0===st&&(st=1),su.set(at),uu=st,setClear(su,uu)},getClearAlpha:function(){return uu},setClearAlpha:function(at){uu=at,setClear(su,uu)},render:function(st){let ot=!1;const ut=getBackground(st);null===ut?setClear(su,uu):ut&&ut.isColor&&(setClear(ut,1),ot=!0);const rc=at.xr.getEnvironmentBlendMode();"additive"===rc?Hl.buffers.color.setClear(0,0,0,1,iu):"alpha-blend"===rc&&Hl.buffers.color.setClear(0,0,0,0,iu),(at.autoClear||ot)&&(Hl.buffers.depth.setTest(!0),Hl.buffers.depth.setMask(!0),Hl.buffers.color.setMask(!0),at.clear(at.autoClearColor,at.autoClearDepth,at.autoClearStencil))},addToRenderList:function(st,ot){const Hl=getBackground(ot);Hl&&(Hl.isCubeTexture||Hl.mapping===ut.Om)?(void 0===cu&&(cu=new ut.eaF(new ut.iNn(1,1,1),new ut.BKk({name:"BackgroundCubeMaterial",uniforms:(0,ut.lxW)(sc.backgroundCube.uniforms),vertexShader:sc.backgroundCube.vertexShader,fragmentShader:sc.backgroundCube.fragmentShader,side:ut.hsX,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),cu.geometry.deleteAttribute("normal"),cu.geometry.deleteAttribute("uv"),cu.onBeforeRender=function(at,st,ot){this.matrixWorld.copyPosition(ot.matrixWorld)},Object.defineProperty(cu.material,"envMap",{get:function(){return this.uniforms.envMap.value}}),rc.update(cu)),_c.copy(ot.backgroundRotation),_c.x*=-1,_c.y*=-1,_c.z*=-1,Hl.isCubeTexture&&!1===Hl.isRenderTargetTexture&&(_c.y*=-1,_c.z*=-1),cu.material.uniforms.envMap.value=Hl,cu.material.uniforms.flipEnvMap.value=Hl.isCubeTexture&&!1===Hl.isRenderTargetTexture?-1:1,cu.material.uniforms.backgroundBlurriness.value=ot.backgroundBlurriness,cu.material.uniforms.backgroundIntensity.value=ot.backgroundIntensity,cu.material.uniforms.backgroundRotation.value.setFromMatrix4(wc.makeRotationFromEuler(_c)),cu.material.toneMapped=ut.ppV.getTransfer(Hl.colorSpace)!==ut.KLL,pu===Hl&&mu===Hl.version&&gu===at.toneMapping||(cu.material.needsUpdate=!0,pu=Hl,mu=Hl.version,gu=at.toneMapping),cu.layers.enableAll(),st.unshift(cu,cu.geometry,cu.material,0,0,null)):Hl&&Hl.isTexture&&(void 0===lu&&(lu=new ut.eaF(new ut.bdM(2,2),new ut.BKk({name:"BackgroundMaterial",uniforms:(0,ut.lxW)(sc.background.uniforms),vertexShader:sc.background.vertexShader,fragmentShader:sc.background.fragmentShader,side:ut.hB5,depthTest:!1,depthWrite:!1,fog:!1,allowOverride:!1})),lu.geometry.deleteAttribute("normal"),Object.defineProperty(lu.material,"map",{get:function(){return this.uniforms.t2D.value}}),rc.update(lu)),lu.material.uniforms.t2D.value=Hl,lu.material.uniforms.backgroundIntensity.value=ot.backgroundIntensity,lu.material.toneMapped=ut.ppV.getTransfer(Hl.colorSpace)!==ut.KLL,!0===Hl.matrixAutoUpdate&&Hl.updateMatrix(),lu.material.uniforms.uvTransform.value.copy(Hl.matrix),pu===Hl&&mu===Hl.version&&gu===at.toneMapping||(lu.material.needsUpdate=!0,pu=Hl,mu=Hl.version,gu=at.toneMapping),lu.layers.enableAll(),st.unshift(lu,lu.geometry,lu.material,0,0,null))},dispose:function(){void 0!==cu&&(cu.geometry.dispose(),cu.material.dispose(),cu=void 0),void 0!==lu&&(lu.geometry.dispose(),lu.material.dispose(),lu=void 0)}}}function WebGLBindingStates(at,st){const ot=at.getParameter(at.MAX_VERTEX_ATTRIBS),Hl={},rc=createBindingState(null);let sc=rc,oc=!1;function bindVertexArrayObject(st){return at.bindVertexArray(st)}function deleteVertexArrayObject(st){return at.deleteVertexArray(st)}function createBindingState(at){const st=[],ut=[],Hl=[];for(let rc=0;rc<ot;rc++)st[rc]=0,ut[rc]=0,Hl[rc]=0;return{geometry:null,program:null,wireframe:!1,newAttributes:st,enabledAttributes:ut,attributeDivisors:Hl,object:at,attributes:{},index:null}}function initAttributes(){const at=sc.newAttributes;for(let st=0,ot=at.length;st<ot;st++)at[st]=0}function enableAttribute(at){enableAttributeAndDivisor(at,0)}function enableAttributeAndDivisor(st,ot){const ut=sc.newAttributes,Hl=sc.enabledAttributes,rc=sc.attributeDivisors;ut[st]=1,0===Hl[st]&&(at.enableVertexAttribArray(st),Hl[st]=1),rc[st]!==ot&&(at.vertexAttribDivisor(st,ot),rc[st]=ot)}function disableUnusedAttributes(){const st=sc.newAttributes,ot=sc.enabledAttributes;for(let ut=0,Hl=ot.length;ut<Hl;ut++)ot[ut]!==st[ut]&&(at.disableVertexAttribArray(ut),ot[ut]=0)}function vertexAttribPointer(st,ot,ut,Hl,rc,sc,oc){!0===oc?at.vertexAttribIPointer(st,ot,ut,rc,sc):at.vertexAttribPointer(st,ot,ut,Hl,rc,sc)}function reset(){resetDefaultState(),oc=!0,sc!==rc&&(sc=rc,bindVertexArrayObject(sc.object))}function resetDefaultState(){rc.geometry=null,rc.program=null,rc.wireframe=!1}return{setup:function(ot,rc,_c,wc,Sc){let iu=!1;const su=function(st,ot,ut){const rc=!0===ut.wireframe;let sc=Hl[st.id];void 0===sc&&(sc={},Hl[st.id]=sc);let oc=sc[ot.id];void 0===oc&&(oc={},sc[ot.id]=oc);let _c=oc[rc];void 0===_c&&(_c=createBindingState(at.createVertexArray()),oc[rc]=_c);return _c}(wc,_c,rc);sc!==su&&(sc=su,bindVertexArrayObject(sc.object)),iu=function(at,st,ot,ut){const Hl=sc.attributes,rc=st.attributes;let oc=0;const _c=ot.getAttributes();for(const sc in _c){if(_c[sc].location>=0){const st=Hl[sc];let ot=rc[sc];if(void 0===ot&&("instanceMatrix"===sc&&at.instanceMatrix&&(ot=at.instanceMatrix),"instanceColor"===sc&&at.instanceColor&&(ot=at.instanceColor)),void 0===st)return!0;if(st.attribute!==ot)return!0;if(ot&&st.data!==ot.data)return!0;oc++}}return sc.attributesNum!==oc||sc.index!==ut}(ot,wc,_c,Sc),iu&&function(at,st,ot,ut){const Hl={},rc=st.attributes;let oc=0;const _c=ot.getAttributes();for(const sc in _c){if(_c[sc].location>=0){let st=rc[sc];void 0===st&&("instanceMatrix"===sc&&at.instanceMatrix&&(st=at.instanceMatrix),"instanceColor"===sc&&at.instanceColor&&(st=at.instanceColor));const ot={};ot.attribute=st,st&&st.data&&(ot.data=st.data),Hl[sc]=ot,oc++}}sc.attributes=Hl,sc.attributesNum=oc,sc.index=ut}(ot,wc,_c,Sc),null!==Sc&&st.update(Sc,at.ELEMENT_ARRAY_BUFFER),(iu||oc)&&(oc=!1,function(ot,Hl,rc,sc){initAttributes();const oc=sc.attributes,_c=rc.getAttributes(),wc=Hl.defaultAttributeValues;for(const Sc in _c){const Hl=_c[Sc];if(Hl.location>=0){let rc=oc[Sc];if(void 0===rc&&("instanceMatrix"===Sc&&ot.instanceMatrix&&(rc=ot.instanceMatrix),"instanceColor"===Sc&&ot.instanceColor&&(rc=ot.instanceColor)),void 0!==rc){const oc=rc.normalized,_c=rc.itemSize,wc=st.get(rc);if(void 0===wc)continue;const Sc=wc.buffer,iu=wc.type,su=wc.bytesPerElement,lu=iu===at.INT||iu===at.UNSIGNED_INT||rc.gpuType===ut.Yuy;if(rc.isInterleavedBufferAttribute){const st=rc.data,ut=st.stride,wc=rc.offset;if(st.isInstancedInterleavedBuffer){for(let at=0;at<Hl.locationSize;at++)enableAttributeAndDivisor(Hl.location+at,st.meshPerAttribute);!0!==ot.isInstancedMesh&&void 0===sc._maxInstanceCount&&(sc._maxInstanceCount=st.meshPerAttribute*st.count)}else for(let at=0;at<Hl.locationSize;at++)enableAttribute(Hl.location+at);at.bindBuffer(at.ARRAY_BUFFER,Sc);for(let at=0;at<Hl.locationSize;at++)vertexAttribPointer(Hl.location+at,_c/Hl.locationSize,iu,oc,ut*su,(wc+_c/Hl.locationSize*at)*su,lu)}else{if(rc.isInstancedBufferAttribute){for(let at=0;at<Hl.locationSize;at++)enableAttributeAndDivisor(Hl.location+at,rc.meshPerAttribute);!0!==ot.isInstancedMesh&&void 0===sc._maxInstanceCount&&(sc._maxInstanceCount=rc.meshPerAttribute*rc.count)}else for(let at=0;at<Hl.locationSize;at++)enableAttribute(Hl.location+at);at.bindBuffer(at.ARRAY_BUFFER,Sc);for(let at=0;at<Hl.locationSize;at++)vertexAttribPointer(Hl.location+at,_c/Hl.locationSize,iu,oc,_c*su,_c/Hl.locationSize*at*su,lu)}}else if(void 0!==wc){const st=wc[Sc];if(void 0!==st)switch(st.length){case 2:at.vertexAttrib2fv(Hl.location,st);break;case 3:at.vertexAttrib3fv(Hl.location,st);break;case 4:at.vertexAttrib4fv(Hl.location,st);break;default:at.vertexAttrib1fv(Hl.location,st)}}}}disableUnusedAttributes()}(ot,rc,_c,wc),null!==Sc&&at.bindBuffer(at.ELEMENT_ARRAY_BUFFER,st.get(Sc).buffer))},reset:reset,resetDefaultState:resetDefaultState,dispose:function(){reset();for(const at in Hl){const st=Hl[at];for(const at in st){const ot=st[at];for(const at in ot)deleteVertexArrayObject(ot[at].object),delete ot[at];delete st[at]}delete Hl[at]}},releaseStatesOfGeometry:function(at){if(void 0===Hl[at.id])return;const st=Hl[at.id];for(const ot in st){const at=st[ot];for(const st in at)deleteVertexArrayObject(at[st].object),delete at[st];delete st[ot]}delete Hl[at.id]},releaseStatesOfProgram:function(at){for(const st in Hl){const ot=Hl[st];if(void 0===ot[at.id])continue;const ut=ot[at.id];for(const at in ut)deleteVertexArrayObject(ut[at].object),delete ut[at];delete ot[at.id]}},initAttributes:initAttributes,enableAttribute:enableAttribute,disableUnusedAttributes:disableUnusedAttributes}}function WebGLBufferRenderer(at,st,ot){let ut;function renderInstances(st,Hl,rc){0!==rc&&(at.drawArraysInstanced(ut,st,Hl,rc),ot.update(Hl,ut,rc))}this.setMode=function(at){ut=at},this.render=function(st,Hl){at.drawArrays(ut,st,Hl),ot.update(Hl,ut,1)},this.renderInstances=renderInstances,this.renderMultiDraw=function(at,Hl,rc){if(0===rc)return;st.get("WEBGL_multi_draw").multiDrawArraysWEBGL(ut,at,0,Hl,0,rc);let sc=0;for(let st=0;st<rc;st++)sc+=Hl[st];ot.update(sc,ut,1)},this.renderMultiDrawInstances=function(at,Hl,rc,sc){if(0===rc)return;const oc=st.get("WEBGL_multi_draw");if(null===oc)for(let st=0;st<at.length;st++)renderInstances(at[st],Hl[st],sc[st]);else{oc.multiDrawArraysInstancedWEBGL(ut,at,0,Hl,0,sc,0,rc);let st=0;for(let at=0;at<rc;at++)st+=Hl[at]*sc[at];ot.update(st,ut,1)}}}function WebGLCapabilities(at,st,ot,Hl){let rc;function getMaxPrecision(st){if("highp"===st){if(at.getShaderPrecisionFormat(at.VERTEX_SHADER,at.HIGH_FLOAT).precision>0&&at.getShaderPrecisionFormat(at.FRAGMENT_SHADER,at.HIGH_FLOAT).precision>0)return"highp";st="mediump"}return"mediump"===st&&at.getShaderPrecisionFormat(at.VERTEX_SHADER,at.MEDIUM_FLOAT).precision>0&&at.getShaderPrecisionFormat(at.FRAGMENT_SHADER,at.MEDIUM_FLOAT).precision>0?"mediump":"lowp"}let sc=void 0!==ot.precision?ot.precision:"highp";const oc=getMaxPrecision(sc);oc!==sc&&(console.warn("THREE.WebGLRenderer:",sc,"not supported, using",oc,"instead."),sc=oc);const _c=!0===ot.logarithmicDepthBuffer,wc=!0===ot.reverseDepthBuffer&&st.has("EXT_clip_control"),Sc=at.getParameter(at.MAX_TEXTURE_IMAGE_UNITS),iu=at.getParameter(at.MAX_VERTEX_TEXTURE_IMAGE_UNITS);return{isWebGL2:!0,getMaxAnisotropy:function(){if(void 0!==rc)return rc;if(!0===st.has("EXT_texture_filter_anisotropic")){const ot=st.get("EXT_texture_filter_anisotropic");rc=at.getParameter(ot.MAX_TEXTURE_MAX_ANISOTROPY_EXT)}else rc=0;return rc},getMaxPrecision:getMaxPrecision,textureFormatReadable:function(st){return st===ut.GWd||Hl.convert(st)===at.getParameter(at.IMPLEMENTATION_COLOR_READ_FORMAT)},textureTypeReadable:function(ot){const rc=ot===ut.ix0&&(st.has("EXT_color_buffer_half_float")||st.has("EXT_color_buffer_float"));return!(ot!==ut.OUM&&Hl.convert(ot)!==at.getParameter(at.IMPLEMENTATION_COLOR_READ_TYPE)&&ot!==ut.RQf&&!rc)},precision:sc,logarithmicDepthBuffer:_c,reverseDepthBuffer:wc,maxTextures:Sc,maxVertexTextures:iu,maxTextureSize:at.getParameter(at.MAX_TEXTURE_SIZE),maxCubemapSize:at.getParameter(at.MAX_CUBE_MAP_TEXTURE_SIZE),maxAttributes:at.getParameter(at.MAX_VERTEX_ATTRIBS),maxVertexUniforms:at.getParameter(at.MAX_VERTEX_UNIFORM_VECTORS),maxVaryings:at.getParameter(at.MAX_VARYING_VECTORS),maxFragmentUniforms:at.getParameter(at.MAX_FRAGMENT_UNIFORM_VECTORS),vertexTextures:iu>0,maxSamples:at.getParameter(at.MAX_SAMPLES)}}function WebGLClipping(at){const st=this;let ot=null,Hl=0,rc=!1,sc=!1;const oc=new ut.Zcv,_c=new ut.dwI,wc={value:null,needsUpdate:!1};function projectPlanes(at,ot,ut,Hl){const rc=null!==at?at.length:0;let sc=null;if(0!==rc){if(sc=wc.value,!0!==Hl||null===sc){const st=ut+4*rc,Hl=ot.matrixWorldInverse;_c.getNormalMatrix(Hl),(null===sc||sc.length<st)&&(sc=new Float32Array(st));for(let ot=0,wc=ut;ot!==rc;++ot,wc+=4)oc.copy(at[ot]).applyMatrix4(Hl,_c),oc.normal.toArray(sc,wc),sc[wc+3]=oc.constant}wc.value=sc,wc.needsUpdate=!0}return st.numPlanes=rc,st.numIntersection=0,sc}this.uniform=wc,this.numPlanes=0,this.numIntersection=0,this.init=function(at,st){const ot=0!==at.length||st||0!==Hl||rc;return rc=st,Hl=at.length,ot},this.beginShadows=function(){sc=!0,projectPlanes(null)},this.endShadows=function(){sc=!1},this.setGlobalState=function(at,st){ot=projectPlanes(at,st,0)},this.setState=function(ut,oc,_c){const Sc=ut.clippingPlanes,iu=ut.clipIntersection,su=ut.clipShadows,lu=at.get(ut);if(!rc||null===Sc||0===Sc.length||sc&&!su)sc?projectPlanes(null):function(){wc.value!==ot&&(wc.value=ot,wc.needsUpdate=Hl>0);st.numPlanes=Hl,st.numIntersection=0}();else{const at=sc?0:Hl,st=4*at;let ut=lu.clippingState||null;wc.value=ut,ut=projectPlanes(Sc,oc,st,_c);for(let Hl=0;Hl!==st;++Hl)ut[Hl]=ot[Hl];lu.clippingState=ut,this.numIntersection=iu?this.numPlanes:0,this.numPlanes+=at}}}function WebGLCubeMaps(at){let st=new WeakMap;function mapTextureMapping(at,st){return st===ut.wfO?at.mapping=ut.hy7:st===ut.uV5&&(at.mapping=ut.xFO),at}function onTextureDispose(at){const ot=at.target;ot.removeEventListener("dispose",onTextureDispose);const ut=st.get(ot);void 0!==ut&&(st.delete(ot),ut.dispose())}return{get:function(ot){if(ot&&ot.isTexture){const Hl=ot.mapping;if(Hl===ut.wfO||Hl===ut.uV5){if(st.has(ot)){return mapTextureMapping(st.get(ot).texture,ot.mapping)}{const Hl=ot.image;if(Hl&&Hl.height>0){const rc=new ut.o6l(Hl.height);return rc.fromEquirectangularTexture(at,ot),st.set(ot,rc),ot.addEventListener("dispose",onTextureDispose),mapTextureMapping(rc.texture,ot.mapping)}return null}}}return ot},dispose:function(){st=new WeakMap}}}const Sc=[.125,.215,.35,.446,.526,.582],iu=20,su=new ut.qUd,lu=new ut.Q1f;let cu=null,uu=0,pu=0,mu=!1;const gu=(1+Math.sqrt(5))/2,Au=1/gu,yu=[new ut.Pq0(-gu,Au,0),new ut.Pq0(gu,Au,0),new ut.Pq0(-Au,0,gu),new ut.Pq0(Au,0,gu),new ut.Pq0(0,gu,-Au),new ut.Pq0(0,gu,Au),new ut.Pq0(-1,1,-1),new ut.Pq0(1,1,-1),new ut.Pq0(-1,1,1),new ut.Pq0(1,1,1)],_u=new ut.Pq0;class PMREMGenerator{constructor(at){this._renderer=at,this._pingPongRenderTarget=null,this._lodMax=0,this._cubeSize=0,this._lodPlanes=[],this._sizeLods=[],this._sigmas=[],this._blurMaterial=null,this._cubemapMaterial=null,this._equirectMaterial=null,this._compileMaterial(this._blurMaterial)}fromScene(at,st,ot,ut,Hl){void 0===st&&(st=0),void 0===ot&&(ot=.1),void 0===ut&&(ut=100),void 0===Hl&&(Hl={});const{size:rc=256,position:sc=_u}=Hl;cu=this._renderer.getRenderTarget(),uu=this._renderer.getActiveCubeFace(),pu=this._renderer.getActiveMipmapLevel(),mu=this._renderer.xr.enabled,this._renderer.xr.enabled=!1,this._setSize(rc);const oc=this._allocateTargets();return oc.depthBuffer=!0,this._sceneToCubeUV(at,ot,ut,oc,sc),st>0&&this._blur(oc,0,0,st),this._applyPMREM(oc),this._cleanup(oc),oc}fromEquirectangular(at,st){return void 0===st&&(st=null),this._fromTexture(at,st)}fromCubemap(at,st){return void 0===st&&(st=null),this._fromTexture(at,st)}compileCubemapShader(){null===this._cubemapMaterial&&(this._cubemapMaterial=_getCubemapMaterial(),this._compileMaterial(this._cubemapMaterial))}compileEquirectangularShader(){null===this._equirectMaterial&&(this._equirectMaterial=_getEquirectMaterial(),this._compileMaterial(this._equirectMaterial))}dispose(){this._dispose(),null!==this._cubemapMaterial&&this._cubemapMaterial.dispose(),null!==this._equirectMaterial&&this._equirectMaterial.dispose()}_setSize(at){this._lodMax=Math.floor(Math.log2(at)),this._cubeSize=Math.pow(2,this._lodMax)}_dispose(){null!==this._blurMaterial&&this._blurMaterial.dispose(),null!==this._pingPongRenderTarget&&this._pingPongRenderTarget.dispose();for(let at=0;at<this._lodPlanes.length;at++)this._lodPlanes[at].dispose()}_cleanup(at){this._renderer.setRenderTarget(cu,uu,pu),this._renderer.xr.enabled=mu,at.scissorTest=!1,_setViewport(at,0,0,at.width,at.height)}_fromTexture(at,st){at.mapping===ut.hy7||at.mapping===ut.xFO?this._setSize(0===at.image.length?16:at.image[0].width||at.image[0].image.width):this._setSize(at.image.width/4),cu=this._renderer.getRenderTarget(),uu=this._renderer.getActiveCubeFace(),pu=this._renderer.getActiveMipmapLevel(),mu=this._renderer.xr.enabled,this._renderer.xr.enabled=!1;const ot=st||this._allocateTargets();return this._textureToCubeUV(at,ot),this._applyPMREM(ot),this._cleanup(ot),ot}_allocateTargets(){const at=3*Math.max(this._cubeSize,112),st=4*this._cubeSize,ot={magFilter:ut.k6q,minFilter:ut.k6q,generateMipmaps:!1,type:ut.ix0,format:ut.GWd,colorSpace:ut.Zr2,depthBuffer:!1},Hl=_createRenderTarget(at,st,ot);if(null===this._pingPongRenderTarget||this._pingPongRenderTarget.width!==at||this._pingPongRenderTarget.height!==st){null!==this._pingPongRenderTarget&&this._dispose(),this._pingPongRenderTarget=_createRenderTarget(at,st,ot);const{_lodMax:Hl}=this;({sizeLods:this._sizeLods,lodPlanes:this._lodPlanes,sigmas:this._sigmas}=function(at){const st=[],ot=[],Hl=[];let rc=at;const sc=at-4+1+Sc.length;for(let oc=0;oc<sc;oc++){const sc=Math.pow(2,rc);ot.push(sc);let _c=1/sc;oc>at-4?_c=Sc[oc-at+4-1]:0===oc&&(_c=0),Hl.push(_c);const wc=1/(sc-2),iu=-wc,su=1+wc,lu=[iu,iu,su,iu,su,su,iu,iu,su,su,iu,su],cu=6,uu=6,pu=3,mu=2,gu=1,Au=new Float32Array(pu*uu*cu),yu=new Float32Array(mu*uu*cu),_u=new Float32Array(gu*uu*cu);for(let at=0;at<cu;at++){const st=at%3*2/3-1,ot=at>2?0:-1,ut=[st,ot,0,st+2/3,ot,0,st+2/3,ot+1,0,st,ot,0,st+2/3,ot+1,0,st,ot+1,0];Au.set(ut,pu*uu*at),yu.set(lu,mu*uu*at);const Hl=[at,at,at,at,at,at];_u.set(Hl,gu*uu*at)}const xu=new ut.LoY;xu.setAttribute("position",new ut.THS(Au,pu)),xu.setAttribute("uv",new ut.THS(yu,mu)),xu.setAttribute("faceIndex",new ut.THS(_u,gu)),st.push(xu),rc>4&&rc--}return{lodPlanes:st,sizeLods:ot,sigmas:Hl}}(Hl)),this._blurMaterial=function(at,st,ot){const Hl=new Float32Array(iu),rc=new ut.Pq0(0,1,0),sc=new ut.BKk({name:"SphericalGaussianBlur",defines:{n:iu,CUBEUV_TEXEL_WIDTH:1/st,CUBEUV_TEXEL_HEIGHT:1/ot,CUBEUV_MAX_MIP:`${at}.0`},uniforms:{envMap:{value:null},samples:{value:1},weights:{value:Hl},latitudinal:{value:!1},dTheta:{value:0},mipInt:{value:0},poleAxis:{value:rc}},vertexShader:_getCommonVertexShader(),fragmentShader:"\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",blending:ut.XIg,depthTest:!1,depthWrite:!1});return sc}(Hl,at,st)}return Hl}_compileMaterial(at){const st=new ut.eaF(this._lodPlanes[0],at);this._renderer.compile(st,su)}_sceneToCubeUV(at,st,ot,Hl,rc){const sc=new ut.ubm(90,1,st,ot),oc=[1,-1,1,1,1,1],_c=[1,1,1,-1,-1,-1],wc=this._renderer,Sc=wc.autoClear,iu=wc.toneMapping;wc.getClearColor(lu),wc.toneMapping=ut.y_p,wc.autoClear=!1;const su=new ut.V9B({name:"PMREM.Background",side:ut.hsX,depthWrite:!1,depthTest:!1}),cu=new ut.eaF(new ut.iNn,su);let uu=!1;const pu=at.background;pu?pu.isColor&&(su.color.copy(pu),at.background=null,uu=!0):(su.color.copy(lu),uu=!0);for(let ut=0;ut<6;ut++){const st=ut%3;0===st?(sc.up.set(0,oc[ut],0),sc.position.set(rc.x,rc.y,rc.z),sc.lookAt(rc.x+_c[ut],rc.y,rc.z)):1===st?(sc.up.set(0,0,oc[ut]),sc.position.set(rc.x,rc.y,rc.z),sc.lookAt(rc.x,rc.y+_c[ut],rc.z)):(sc.up.set(0,oc[ut],0),sc.position.set(rc.x,rc.y,rc.z),sc.lookAt(rc.x,rc.y,rc.z+_c[ut]));const ot=this._cubeSize;_setViewport(Hl,st*ot,ut>2?ot:0,ot,ot),wc.setRenderTarget(Hl),uu&&wc.render(cu,sc),wc.render(at,sc)}cu.geometry.dispose(),cu.material.dispose(),wc.toneMapping=iu,wc.autoClear=Sc,at.background=pu}_textureToCubeUV(at,st){const ot=this._renderer,Hl=at.mapping===ut.hy7||at.mapping===ut.xFO;Hl?(null===this._cubemapMaterial&&(this._cubemapMaterial=_getCubemapMaterial()),this._cubemapMaterial.uniforms.flipEnvMap.value=!1===at.isRenderTargetTexture?-1:1):null===this._equirectMaterial&&(this._equirectMaterial=_getEquirectMaterial());const rc=Hl?this._cubemapMaterial:this._equirectMaterial,sc=new ut.eaF(this._lodPlanes[0],rc);rc.uniforms.envMap.value=at;const oc=this._cubeSize;_setViewport(st,0,0,3*oc,2*oc),ot.setRenderTarget(st),ot.render(sc,su)}_applyPMREM(at){const st=this._renderer,ot=st.autoClear;st.autoClear=!1;const ut=this._lodPlanes.length;for(let Hl=1;Hl<ut;Hl++){const st=Math.sqrt(this._sigmas[Hl]*this._sigmas[Hl]-this._sigmas[Hl-1]*this._sigmas[Hl-1]),ot=yu[(ut-Hl-1)%yu.length];this._blur(at,Hl-1,Hl,st,ot)}st.autoClear=ot}_blur(at,st,ot,ut,Hl){const rc=this._pingPongRenderTarget;this._halfBlur(at,rc,st,ot,ut,"latitudinal",Hl),this._halfBlur(rc,at,ot,ot,ut,"longitudinal",Hl)}_halfBlur(at,st,ot,Hl,rc,sc,oc){const _c=this._renderer,wc=this._blurMaterial;"latitudinal"!==sc&&"longitudinal"!==sc&&console.error("blur direction must be either latitudinal or longitudinal!");const Sc=new ut.eaF(this._lodPlanes[Hl],wc),lu=wc.uniforms,cu=this._sizeLods[ot]-1,uu=isFinite(rc)?Math.PI/(2*cu):2*Math.PI/39,pu=rc/uu,mu=isFinite(rc)?1+Math.floor(3*pu):iu;mu>iu&&console.warn(`sigmaRadians, ${rc}, is too large and will clip, as it requested ${mu} samples when the maximum is set to 20`);const gu=[];let Au=0;for(let ut=0;ut<iu;++ut){const at=ut/pu,st=Math.exp(-at*at/2);gu.push(st),0===ut?Au+=st:ut<mu&&(Au+=2*st)}for(let ut=0;ut<gu.length;ut++)gu[ut]=gu[ut]/Au;lu.envMap.value=at.texture,lu.samples.value=mu,lu.weights.value=gu,lu.latitudinal.value="latitudinal"===sc,oc&&(lu.poleAxis.value=oc);const{_lodMax:yu}=this;lu.dTheta.value=uu,lu.mipInt.value=yu-ot;const _u=this._sizeLods[Hl];_setViewport(st,3*_u*(Hl>yu-4?Hl-yu+4:0),4*(this._cubeSize-_u),3*_u,2*_u),_c.setRenderTarget(st),_c.render(Sc,su)}}function _createRenderTarget(at,st,ot){const Hl=new ut.nWS(at,st,ot);return Hl.texture.mapping=ut.Om,Hl.texture.name="PMREM.cubeUv",Hl.scissorTest=!0,Hl}function _setViewport(at,st,ot,ut,Hl){at.viewport.set(st,ot,ut,Hl),at.scissor.set(st,ot,ut,Hl)}function _getEquirectMaterial(){return new ut.BKk({name:"EquirectangularToCubeUV",uniforms:{envMap:{value:null}},vertexShader:_getCommonVertexShader(),fragmentShader:"\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",blending:ut.XIg,depthTest:!1,depthWrite:!1})}function _getCubemapMaterial(){return new ut.BKk({name:"CubemapToCubeUV",uniforms:{envMap:{value:null},flipEnvMap:{value:-1}},vertexShader:_getCommonVertexShader(),fragmentShader:"\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",blending:ut.XIg,depthTest:!1,depthWrite:!1})}function _getCommonVertexShader(){return"\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"}function WebGLCubeUVMaps(at){let st=new WeakMap,ot=null;function onTextureDispose(at){const ot=at.target;ot.removeEventListener("dispose",onTextureDispose);const ut=st.get(ot);void 0!==ut&&(st.delete(ot),ut.dispose())}return{get:function(Hl){if(Hl&&Hl.isTexture){const rc=Hl.mapping,sc=rc===ut.wfO||rc===ut.uV5,oc=rc===ut.hy7||rc===ut.xFO;if(sc||oc){let ut=st.get(Hl);const rc=void 0!==ut?ut.texture.pmremVersion:0;if(Hl.isRenderTargetTexture&&Hl.pmremVersion!==rc)return null===ot&&(ot=new PMREMGenerator(at)),ut=sc?ot.fromEquirectangular(Hl,ut):ot.fromCubemap(Hl,ut),ut.texture.pmremVersion=Hl.pmremVersion,st.set(Hl,ut),ut.texture;if(void 0!==ut)return ut.texture;{const rc=Hl.image;return sc&&rc&&rc.height>0||oc&&rc&&function(at){let st=0;const ot=6;for(let ut=0;ut<ot;ut++)void 0!==at[ut]&&st++;return st===ot}(rc)?(null===ot&&(ot=new PMREMGenerator(at)),ut=sc?ot.fromEquirectangular(Hl):ot.fromCubemap(Hl),ut.texture.pmremVersion=Hl.pmremVersion,st.set(Hl,ut),Hl.addEventListener("dispose",onTextureDispose),ut.texture):null}}}return Hl},dispose:function(){st=new WeakMap,null!==ot&&(ot.dispose(),ot=null)}}}function WebGLExtensions(at){const st={};function getExtension(ot){if(void 0!==st[ot])return st[ot];let ut;switch(ot){case"WEBGL_depth_texture":ut=at.getExtension("WEBGL_depth_texture")||at.getExtension("MOZ_WEBGL_depth_texture")||at.getExtension("WEBKIT_WEBGL_depth_texture");break;case"EXT_texture_filter_anisotropic":ut=at.getExtension("EXT_texture_filter_anisotropic")||at.getExtension("MOZ_EXT_texture_filter_anisotropic")||at.getExtension("WEBKIT_EXT_texture_filter_anisotropic");break;case"WEBGL_compressed_texture_s3tc":ut=at.getExtension("WEBGL_compressed_texture_s3tc")||at.getExtension("MOZ_WEBGL_compressed_texture_s3tc")||at.getExtension("WEBKIT_WEBGL_compressed_texture_s3tc");break;case"WEBGL_compressed_texture_pvrtc":ut=at.getExtension("WEBGL_compressed_texture_pvrtc")||at.getExtension("WEBKIT_WEBGL_compressed_texture_pvrtc");break;default:ut=at.getExtension(ot)}return st[ot]=ut,ut}return{has:function(at){return null!==getExtension(at)},init:function(){getExtension("EXT_color_buffer_float"),getExtension("WEBGL_clip_cull_distance"),getExtension("OES_texture_float_linear"),getExtension("EXT_color_buffer_half_float"),getExtension("WEBGL_multisampled_render_to_texture"),getExtension("WEBGL_render_shared_exponent")},get:function(at){const st=getExtension(at);return null===st&&(0,ut.mcG)("THREE.WebGLRenderer: "+at+" extension not supported."),st}}}function WebGLGeometries(at,st,ot,Hl){const rc={},sc=new WeakMap;function onGeometryDispose(at){const ut=at.target;null!==ut.index&&st.remove(ut.index);for(const ot in ut.attributes)st.remove(ut.attributes[ot]);ut.removeEventListener("dispose",onGeometryDispose),delete rc[ut.id];const oc=sc.get(ut);oc&&(st.remove(oc),sc.delete(ut)),Hl.releaseStatesOfGeometry(ut),!0===ut.isInstancedBufferGeometry&&delete ut._maxInstanceCount,ot.memory.geometries--}function updateWireframeAttribute(at){const ot=[],Hl=at.index,rc=at.attributes.position;let oc=0;if(null!==Hl){const at=Hl.array;oc=Hl.version;for(let st=0,ut=at.length;st<ut;st+=3){const ut=at[st+0],Hl=at[st+1],rc=at[st+2];ot.push(ut,Hl,Hl,rc,rc,ut)}}else{if(void 0===rc)return;{const at=rc.array;oc=rc.version;for(let st=0,ut=at.length/3-1;st<ut;st+=3){const at=st+0,ut=st+1,Hl=st+2;ot.push(at,ut,ut,Hl,Hl,at)}}}const _c=new((0,ut.AQS)(ot)?ut.MW4:ut.A$4)(ot,1);_c.version=oc;const wc=sc.get(at);wc&&st.remove(wc),sc.set(at,_c)}return{get:function(at,st){return!0===rc[st.id]||(st.addEventListener("dispose",onGeometryDispose),rc[st.id]=!0,ot.memory.geometries++),st},update:function(ot){const ut=ot.attributes;for(const Hl in ut)st.update(ut[Hl],at.ARRAY_BUFFER)},getWireframeAttribute:function(at){const st=sc.get(at);if(st){const ot=at.index;null!==ot&&st.version<ot.version&&updateWireframeAttribute(at)}else updateWireframeAttribute(at);return sc.get(at)}}}function WebGLIndexedBufferRenderer(at,st,ot){let ut,Hl,rc;function renderInstances(st,sc,oc){0!==oc&&(at.drawElementsInstanced(ut,sc,Hl,st*rc,oc),ot.update(sc,ut,oc))}this.setMode=function(at){ut=at},this.setIndex=function(at){Hl=at.type,rc=at.bytesPerElement},this.render=function(st,sc){at.drawElements(ut,sc,Hl,st*rc),ot.update(sc,ut,1)},this.renderInstances=renderInstances,this.renderMultiDraw=function(at,rc,sc){if(0===sc)return;st.get("WEBGL_multi_draw").multiDrawElementsWEBGL(ut,rc,0,Hl,at,0,sc);let oc=0;for(let st=0;st<sc;st++)oc+=rc[st];ot.update(oc,ut,1)},this.renderMultiDrawInstances=function(at,sc,oc,_c){if(0===oc)return;const wc=st.get("WEBGL_multi_draw");if(null===wc)for(let st=0;st<at.length;st++)renderInstances(at[st]/rc,sc[st],_c[st]);else{wc.multiDrawElementsInstancedWEBGL(ut,sc,0,Hl,at,0,_c,0,oc);let st=0;for(let at=0;at<oc;at++)st+=sc[at]*_c[at];ot.update(st,ut,1)}}}function WebGLInfo(at){const st={frame:0,calls:0,triangles:0,points:0,lines:0};return{memory:{geometries:0,textures:0},render:st,programs:null,autoReset:!0,reset:function(){st.calls=0,st.triangles=0,st.points=0,st.lines=0},update:function(ot,ut,Hl){switch(st.calls++,ut){case at.TRIANGLES:st.triangles+=Hl*(ot/3);break;case at.LINES:st.lines+=Hl*(ot/2);break;case at.LINE_STRIP:st.lines+=Hl*(ot-1);break;case at.LINE_LOOP:st.lines+=Hl*ot;break;case at.POINTS:st.points+=Hl*ot;break;default:console.error("THREE.WebGLInfo: Unknown draw mode:",ut)}}}}function WebGLMorphtargets(at,st,ot){const Hl=new WeakMap,rc=new ut.IUQ;return{update:function(sc,oc,_c){const wc=sc.morphTargetInfluences,Sc=oc.morphAttributes.position||oc.morphAttributes.normal||oc.morphAttributes.color,iu=void 0!==Sc?Sc.length:0;let su=Hl.get(oc);if(void 0===su||su.count!==iu){void 0!==su&&su.texture.dispose();const lu=void 0!==oc.morphAttributes.position,cu=void 0!==oc.morphAttributes.normal,uu=void 0!==oc.morphAttributes.color,pu=oc.morphAttributes.position||[],mu=oc.morphAttributes.normal||[],gu=oc.morphAttributes.color||[];let Au=0;!0===lu&&(Au=1),!0===cu&&(Au=2),!0===uu&&(Au=3);let yu=oc.attributes.position.count*Au,_u=1;yu>st.maxTextureSize&&(_u=Math.ceil(yu/st.maxTextureSize),yu=st.maxTextureSize);const xu=new Float32Array(yu*_u*4*iu),Su=new ut.rFo(xu,yu,_u,iu);Su.type=ut.RQf,Su.needsUpdate=!0;const Du=4*Au;for(let Lu=0;Lu<iu;Lu++){const $u=pu[Lu],hh=mu[Lu],ed=gu[Lu],td=yu*_u*4*Lu;for(let id=0;id<$u.count;id++){const nd=id*Du;!0===lu&&(rc.fromBufferAttribute($u,id),xu[td+nd+0]=rc.x,xu[td+nd+1]=rc.y,xu[td+nd+2]=rc.z,xu[td+nd+3]=0),!0===cu&&(rc.fromBufferAttribute(hh,id),xu[td+nd+4]=rc.x,xu[td+nd+5]=rc.y,xu[td+nd+6]=rc.z,xu[td+nd+7]=0),!0===uu&&(rc.fromBufferAttribute(ed,id),xu[td+nd+8]=rc.x,xu[td+nd+9]=rc.y,xu[td+nd+10]=rc.z,xu[td+nd+11]=4===ed.itemSize?rc.w:1)}}function disposeTexture(){Su.dispose(),Hl.delete(oc),oc.removeEventListener("dispose",disposeTexture)}su={count:iu,texture:Su,size:new ut.I9Y(yu,_u)},Hl.set(oc,su),oc.addEventListener("dispose",disposeTexture)}if(!0===sc.isInstancedMesh&&null!==sc.morphTexture)_c.getUniforms().setValue(at,"morphTexture",sc.morphTexture,ot);else{let rd=0;for(let sd=0;sd<wc.length;sd++)rd+=wc[sd];const ad=oc.morphTargetsRelative?1:1-rd;_c.getUniforms().setValue(at,"morphTargetBaseInfluence",ad),_c.getUniforms().setValue(at,"morphTargetInfluences",wc)}_c.getUniforms().setValue(at,"morphTargetsTexture",su.texture,ot),_c.getUniforms().setValue(at,"morphTargetsTextureSize",su.size)}}}function WebGLObjects(at,st,ot,ut){let Hl=new WeakMap;function onInstancedMeshDispose(at){const st=at.target;st.removeEventListener("dispose",onInstancedMeshDispose),ot.remove(st.instanceMatrix),null!==st.instanceColor&&ot.remove(st.instanceColor)}return{update:function(rc){const sc=ut.render.frame,oc=rc.geometry,_c=st.get(rc,oc);if(Hl.get(_c)!==sc&&(st.update(_c),Hl.set(_c,sc)),rc.isInstancedMesh&&(!1===rc.hasEventListener("dispose",onInstancedMeshDispose)&&rc.addEventListener("dispose",onInstancedMeshDispose),Hl.get(rc)!==sc&&(ot.update(rc.instanceMatrix,at.ARRAY_BUFFER),null!==rc.instanceColor&&ot.update(rc.instanceColor,at.ARRAY_BUFFER),Hl.set(rc,sc))),rc.isSkinnedMesh){const at=rc.skeleton;Hl.get(at)!==sc&&(at.update(),Hl.set(at,sc))}return _c},dispose:function(){Hl=new WeakMap}}}const xu=new ut.gPd,Su=new ut.VCu(1,1),Du=new ut.rFo,Lu=new ut.dYF,$u=new ut.b4q,hh=[],ed=[],td=new Float32Array(16),id=new Float32Array(9),nd=new Float32Array(4);function flatten(at,st,ot){const ut=at[0];if(ut<=0||ut>0)return at;const Hl=st*ot;let rc=hh[Hl];if(void 0===rc&&(rc=new Float32Array(Hl),hh[Hl]=rc),0!==st){ut.toArray(rc,0);for(let ut=1,Hl=0;ut!==st;++ut)Hl+=ot,at[ut].toArray(rc,Hl)}return rc}function arraysEqual(at,st){if(at.length!==st.length)return!1;for(let ot=0,ut=at.length;ot<ut;ot++)if(at[ot]!==st[ot])return!1;return!0}function copyArray(at,st){for(let ot=0,ut=st.length;ot<ut;ot++)at[ot]=st[ot]}function allocTexUnits(at,st){let ot=ed[st];void 0===ot&&(ot=new Int32Array(st),ed[st]=ot);for(let ut=0;ut!==st;++ut)ot[ut]=at.allocateTextureUnit();return ot}function setValueV1f(at,st){const ot=this.cache;ot[0]!==st&&(at.uniform1f(this.addr,st),ot[0]=st)}function setValueV2f(at,st){const ot=this.cache;if(void 0!==st.x)ot[0]===st.x&&ot[1]===st.y||(at.uniform2f(this.addr,st.x,st.y),ot[0]=st.x,ot[1]=st.y);else{if(arraysEqual(ot,st))return;at.uniform2fv(this.addr,st),copyArray(ot,st)}}function setValueV3f(at,st){const ot=this.cache;if(void 0!==st.x)ot[0]===st.x&&ot[1]===st.y&&ot[2]===st.z||(at.uniform3f(this.addr,st.x,st.y,st.z),ot[0]=st.x,ot[1]=st.y,ot[2]=st.z);else if(void 0!==st.r)ot[0]===st.r&&ot[1]===st.g&&ot[2]===st.b||(at.uniform3f(this.addr,st.r,st.g,st.b),ot[0]=st.r,ot[1]=st.g,ot[2]=st.b);else{if(arraysEqual(ot,st))return;at.uniform3fv(this.addr,st),copyArray(ot,st)}}function setValueV4f(at,st){const ot=this.cache;if(void 0!==st.x)ot[0]===st.x&&ot[1]===st.y&&ot[2]===st.z&&ot[3]===st.w||(at.uniform4f(this.addr,st.x,st.y,st.z,st.w),ot[0]=st.x,ot[1]=st.y,ot[2]=st.z,ot[3]=st.w);else{if(arraysEqual(ot,st))return;at.uniform4fv(this.addr,st),copyArray(ot,st)}}function setValueM2(at,st){const ot=this.cache,ut=st.elements;if(void 0===ut){if(arraysEqual(ot,st))return;at.uniformMatrix2fv(this.addr,!1,st),copyArray(ot,st)}else{if(arraysEqual(ot,ut))return;nd.set(ut),at.uniformMatrix2fv(this.addr,!1,nd),copyArray(ot,ut)}}function setValueM3(at,st){const ot=this.cache,ut=st.elements;if(void 0===ut){if(arraysEqual(ot,st))return;at.uniformMatrix3fv(this.addr,!1,st),copyArray(ot,st)}else{if(arraysEqual(ot,ut))return;id.set(ut),at.uniformMatrix3fv(this.addr,!1,id),copyArray(ot,ut)}}function setValueM4(at,st){const ot=this.cache,ut=st.elements;if(void 0===ut){if(arraysEqual(ot,st))return;at.uniformMatrix4fv(this.addr,!1,st),copyArray(ot,st)}else{if(arraysEqual(ot,ut))return;td.set(ut),at.uniformMatrix4fv(this.addr,!1,td),copyArray(ot,ut)}}function setValueV1i(at,st){const ot=this.cache;ot[0]!==st&&(at.uniform1i(this.addr,st),ot[0]=st)}function setValueV2i(at,st){const ot=this.cache;if(void 0!==st.x)ot[0]===st.x&&ot[1]===st.y||(at.uniform2i(this.addr,st.x,st.y),ot[0]=st.x,ot[1]=st.y);else{if(arraysEqual(ot,st))return;at.uniform2iv(this.addr,st),copyArray(ot,st)}}function setValueV3i(at,st){const ot=this.cache;if(void 0!==st.x)ot[0]===st.x&&ot[1]===st.y&&ot[2]===st.z||(at.uniform3i(this.addr,st.x,st.y,st.z),ot[0]=st.x,ot[1]=st.y,ot[2]=st.z);else{if(arraysEqual(ot,st))return;at.uniform3iv(this.addr,st),copyArray(ot,st)}}function setValueV4i(at,st){const ot=this.cache;if(void 0!==st.x)ot[0]===st.x&&ot[1]===st.y&&ot[2]===st.z&&ot[3]===st.w||(at.uniform4i(this.addr,st.x,st.y,st.z,st.w),ot[0]=st.x,ot[1]=st.y,ot[2]=st.z,ot[3]=st.w);else{if(arraysEqual(ot,st))return;at.uniform4iv(this.addr,st),copyArray(ot,st)}}function setValueV1ui(at,st){const ot=this.cache;ot[0]!==st&&(at.uniform1ui(this.addr,st),ot[0]=st)}function setValueV2ui(at,st){const ot=this.cache;if(void 0!==st.x)ot[0]===st.x&&ot[1]===st.y||(at.uniform2ui(this.addr,st.x,st.y),ot[0]=st.x,ot[1]=st.y);else{if(arraysEqual(ot,st))return;at.uniform2uiv(this.addr,st),copyArray(ot,st)}}function setValueV3ui(at,st){const ot=this.cache;if(void 0!==st.x)ot[0]===st.x&&ot[1]===st.y&&ot[2]===st.z||(at.uniform3ui(this.addr,st.x,st.y,st.z),ot[0]=st.x,ot[1]=st.y,ot[2]=st.z);else{if(arraysEqual(ot,st))return;at.uniform3uiv(this.addr,st),copyArray(ot,st)}}function setValueV4ui(at,st){const ot=this.cache;if(void 0!==st.x)ot[0]===st.x&&ot[1]===st.y&&ot[2]===st.z&&ot[3]===st.w||(at.uniform4ui(this.addr,st.x,st.y,st.z,st.w),ot[0]=st.x,ot[1]=st.y,ot[2]=st.z,ot[3]=st.w);else{if(arraysEqual(ot,st))return;at.uniform4uiv(this.addr,st),copyArray(ot,st)}}function setValueT1(at,st,ot){const Hl=this.cache,rc=ot.allocateTextureUnit();let sc;Hl[0]!==rc&&(at.uniform1i(this.addr,rc),Hl[0]=rc),this.type===at.SAMPLER_2D_SHADOW?(Su.compareFunction=ut.TiK,sc=Su):sc=xu,ot.setTexture2D(st||sc,rc)}function setValueT3D1(at,st,ot){const ut=this.cache,Hl=ot.allocateTextureUnit();ut[0]!==Hl&&(at.uniform1i(this.addr,Hl),ut[0]=Hl),ot.setTexture3D(st||Lu,Hl)}function setValueT6(at,st,ot){const ut=this.cache,Hl=ot.allocateTextureUnit();ut[0]!==Hl&&(at.uniform1i(this.addr,Hl),ut[0]=Hl),ot.setTextureCube(st||$u,Hl)}function setValueT2DArray1(at,st,ot){const ut=this.cache,Hl=ot.allocateTextureUnit();ut[0]!==Hl&&(at.uniform1i(this.addr,Hl),ut[0]=Hl),ot.setTexture2DArray(st||Du,Hl)}function setValueV1fArray(at,st){at.uniform1fv(this.addr,st)}function setValueV2fArray(at,st){const ot=flatten(st,this.size,2);at.uniform2fv(this.addr,ot)}function setValueV3fArray(at,st){const ot=flatten(st,this.size,3);at.uniform3fv(this.addr,ot)}function setValueV4fArray(at,st){const ot=flatten(st,this.size,4);at.uniform4fv(this.addr,ot)}function setValueM2Array(at,st){const ot=flatten(st,this.size,4);at.uniformMatrix2fv(this.addr,!1,ot)}function setValueM3Array(at,st){const ot=flatten(st,this.size,9);at.uniformMatrix3fv(this.addr,!1,ot)}function setValueM4Array(at,st){const ot=flatten(st,this.size,16);at.uniformMatrix4fv(this.addr,!1,ot)}function setValueV1iArray(at,st){at.uniform1iv(this.addr,st)}function setValueV2iArray(at,st){at.uniform2iv(this.addr,st)}function setValueV3iArray(at,st){at.uniform3iv(this.addr,st)}function setValueV4iArray(at,st){at.uniform4iv(this.addr,st)}function setValueV1uiArray(at,st){at.uniform1uiv(this.addr,st)}function setValueV2uiArray(at,st){at.uniform2uiv(this.addr,st)}function setValueV3uiArray(at,st){at.uniform3uiv(this.addr,st)}function setValueV4uiArray(at,st){at.uniform4uiv(this.addr,st)}function setValueT1Array(at,st,ot){const ut=this.cache,Hl=st.length,rc=allocTexUnits(ot,Hl);arraysEqual(ut,rc)||(at.uniform1iv(this.addr,rc),copyArray(ut,rc));for(let sc=0;sc!==Hl;++sc)ot.setTexture2D(st[sc]||xu,rc[sc])}function setValueT3DArray(at,st,ot){const ut=this.cache,Hl=st.length,rc=allocTexUnits(ot,Hl);arraysEqual(ut,rc)||(at.uniform1iv(this.addr,rc),copyArray(ut,rc));for(let sc=0;sc!==Hl;++sc)ot.setTexture3D(st[sc]||Lu,rc[sc])}function setValueT6Array(at,st,ot){const ut=this.cache,Hl=st.length,rc=allocTexUnits(ot,Hl);arraysEqual(ut,rc)||(at.uniform1iv(this.addr,rc),copyArray(ut,rc));for(let sc=0;sc!==Hl;++sc)ot.setTextureCube(st[sc]||$u,rc[sc])}function setValueT2DArrayArray(at,st,ot){const ut=this.cache,Hl=st.length,rc=allocTexUnits(ot,Hl);arraysEqual(ut,rc)||(at.uniform1iv(this.addr,rc),copyArray(ut,rc));for(let sc=0;sc!==Hl;++sc)ot.setTexture2DArray(st[sc]||Du,rc[sc])}class SingleUniform{constructor(at,st,ot){this.id=at,this.addr=ot,this.cache=[],this.type=st.type,this.setValue=function(at){switch(at){case 5126:return setValueV1f;case 35664:return setValueV2f;case 35665:return setValueV3f;case 35666:return setValueV4f;case 35674:return setValueM2;case 35675:return setValueM3;case 35676:return setValueM4;case 5124:case 35670:return setValueV1i;case 35667:case 35671:return setValueV2i;case 35668:case 35672:return setValueV3i;case 35669:case 35673:return setValueV4i;case 5125:return setValueV1ui;case 36294:return setValueV2ui;case 36295:return setValueV3ui;case 36296:return setValueV4ui;case 35678:case 36198:case 36298:case 36306:case 35682:return setValueT1;case 35679:case 36299:case 36307:return setValueT3D1;case 35680:case 36300:case 36308:case 36293:return setValueT6;case 36289:case 36303:case 36311:case 36292:return setValueT2DArray1}}(st.type)}}class PureArrayUniform{constructor(at,st,ot){this.id=at,this.addr=ot,this.cache=[],this.type=st.type,this.size=st.size,this.setValue=function(at){switch(at){case 5126:return setValueV1fArray;case 35664:return setValueV2fArray;case 35665:return setValueV3fArray;case 35666:return setValueV4fArray;case 35674:return setValueM2Array;case 35675:return setValueM3Array;case 35676:return setValueM4Array;case 5124:case 35670:return setValueV1iArray;case 35667:case 35671:return setValueV2iArray;case 35668:case 35672:return setValueV3iArray;case 35669:case 35673:return setValueV4iArray;case 5125:return setValueV1uiArray;case 36294:return setValueV2uiArray;case 36295:return setValueV3uiArray;case 36296:return setValueV4uiArray;case 35678:case 36198:case 36298:case 36306:case 35682:return setValueT1Array;case 35679:case 36299:case 36307:return setValueT3DArray;case 35680:case 36300:case 36308:case 36293:return setValueT6Array;case 36289:case 36303:case 36311:case 36292:return setValueT2DArrayArray}}(st.type)}}class StructuredUniform{constructor(at){this.id=at,this.seq=[],this.map={}}setValue(at,st,ot){const ut=this.seq;for(let Hl=0,rc=ut.length;Hl!==rc;++Hl){const rc=ut[Hl];rc.setValue(at,st[rc.id],ot)}}}const rd=/(\w+)(\])?(\[|\.)?/g;function addUniform(at,st){at.seq.push(st),at.map[st.id]=st}function parseUniform(at,st,ot){const ut=at.name,Hl=ut.length;for(rd.lastIndex=0;;){const rc=rd.exec(ut),sc=rd.lastIndex;let oc=rc[1];const _c="]"===rc[2],wc=rc[3];if(_c&&(oc|=0),void 0===wc||"["===wc&&sc+2===Hl){addUniform(ot,void 0===wc?new SingleUniform(oc,at,st):new PureArrayUniform(oc,at,st));break}{let at=ot.map[oc];void 0===at&&(at=new StructuredUniform(oc),addUniform(ot,at)),ot=at}}}class WebGLUniforms{constructor(at,st){this.seq=[],this.map={};const ot=at.getProgramParameter(st,at.ACTIVE_UNIFORMS);for(let ut=0;ut<ot;++ut){const ot=at.getActiveUniform(st,ut);parseUniform(ot,at.getUniformLocation(st,ot.name),this)}}setValue(at,st,ot,ut){const Hl=this.map[st];void 0!==Hl&&Hl.setValue(at,ot,ut)}setOptional(at,st,ot){const ut=st[ot];void 0!==ut&&this.setValue(at,ot,ut)}static upload(at,st,ot,ut){for(let Hl=0,rc=st.length;Hl!==rc;++Hl){const rc=st[Hl],sc=ot[rc.id];!1!==sc.needsUpdate&&rc.setValue(at,sc.value,ut)}}static seqWithValue(at,st){const ot=[];for(let ut=0,Hl=at.length;ut!==Hl;++ut){const Hl=at[ut];Hl.id in st&&ot.push(Hl)}return ot}}function WebGLShader(at,st,ot){const ut=at.createShader(st);return at.shaderSource(ut,ot),at.compileShader(ut),ut}let ad=0;const sd=new ut.dwI;function getShaderErrors(at,st,ot){const ut=at.getShaderParameter(st,at.COMPILE_STATUS),Hl=at.getShaderInfoLog(st).trim();if(ut&&""===Hl)return"";const rc=/ERROR: 0:(\d+)/.exec(Hl);if(rc){const ut=parseInt(rc[1]);return ot.toUpperCase()+"\n\n"+Hl+"\n\n"+function(at,st){const ot=at.split("\n"),ut=[],Hl=Math.max(st-6,0),rc=Math.min(st+6,ot.length);for(let sc=Hl;sc<rc;sc++){const at=sc+1;ut.push(`${at===st?">":" "} ${at}: ${ot[sc]}`)}return ut.join("\n")}(at.getShaderSource(st),ut)}return Hl}function getTexelEncodingFunction(at,st){const ot=function(at){ut.ppV._getMatrix(sd,ut.ppV.workingColorSpace,at);const st=`mat3( ${sd.elements.map((at=>at.toFixed(4)))} )`;switch(ut.ppV.getTransfer(at)){case ut.VxR:return[st,"LinearTransferOETF"];case ut.KLL:return[st,"sRGBTransferOETF"];default:return console.warn("THREE.WebGLProgram: Unsupported color space: ",at),[st,"LinearTransferOETF"]}}(st);return[`vec4 ${at}( vec4 value ) {`,`\treturn ${ot[1]}( vec4( value.rgb * ${ot[0]}, value.a ) );`,"}"].join("\n")}function getToneMappingFunction(at,st){let ot;switch(st){case ut.kyO:ot="Linear";break;case ut.Mjd:ot="Reinhard";break;case ut.nNL:ot="Cineon";break;case ut.FV:ot="ACESFilmic";break;case ut.LAk:ot="AgX";break;case ut.aJ8:ot="Neutral";break;case ut.g7M:ot="Custom";break;default:console.warn("THREE.WebGLProgram: Unsupported toneMapping:",st),ot="Linear"}return"vec3 "+at+"( vec3 color ) { return "+ot+"ToneMapping( color ); }"}const od=new ut.Pq0;function getLuminanceFunction(){ut.ppV.getLuminanceCoefficients(od);return["float luminance( const in vec3 rgb ) {",`\tconst vec3 weights = vec3( ${od.x.toFixed(4)}, ${od.y.toFixed(4)}, ${od.z.toFixed(4)} );`,"\treturn dot( weights, rgb );","}"].join("\n")}function filterEmptyLine(at){return""!==at}function replaceLightNums(at,st){const ot=st.numSpotLightShadows+st.numSpotLightMaps-st.numSpotLightShadowsWithMaps;return at.replace(/NUM_DIR_LIGHTS/g,st.numDirLights).replace(/NUM_SPOT_LIGHTS/g,st.numSpotLights).replace(/NUM_SPOT_LIGHT_MAPS/g,st.numSpotLightMaps).replace(/NUM_SPOT_LIGHT_COORDS/g,ot).replace(/NUM_RECT_AREA_LIGHTS/g,st.numRectAreaLights).replace(/NUM_POINT_LIGHTS/g,st.numPointLights).replace(/NUM_HEMI_LIGHTS/g,st.numHemiLights).replace(/NUM_DIR_LIGHT_SHADOWS/g,st.numDirLightShadows).replace(/NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g,st.numSpotLightShadowsWithMaps).replace(/NUM_SPOT_LIGHT_SHADOWS/g,st.numSpotLightShadows).replace(/NUM_POINT_LIGHT_SHADOWS/g,st.numPointLightShadows)}function replaceClippingPlaneNums(at,st){return at.replace(/NUM_CLIPPING_PLANES/g,st.numClippingPlanes).replace(/UNION_CLIPPING_PLANES/g,st.numClippingPlanes-st.numClipIntersection)}const ld=/^[ \t]*#include +<([\w\d./]+)>/gm;function resolveIncludes(at){return at.replace(ld,includeReplacer)}const cd=new Map;function includeReplacer(at,st){let ot=Hl[st];if(void 0===ot){const at=cd.get(st);if(void 0===at)throw new Error("Can not resolve #include <"+st+">");ot=Hl[at],console.warn('THREE.WebGLRenderer: Shader chunk "%s" has been deprecated. Use "%s" instead.',st,at)}return resolveIncludes(ot)}const ud=/#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;function unrollLoops(at){return at.replace(ud,loopReplacer)}function loopReplacer(at,st,ot,ut){let Hl="";for(let rc=parseInt(st);rc<parseInt(ot);rc++)Hl+=ut.replace(/\[\s*i\s*\]/g,"[ "+rc+" ]").replace(/UNROLLED_LOOP_INDEX/g,rc);return Hl}function generatePrecision(at){let st=`precision ${at.precision} float;\n\tprecision ${at.precision} int;\n\tprecision ${at.precision} sampler2D;\n\tprecision ${at.precision} samplerCube;\n\tprecision ${at.precision} sampler3D;\n\tprecision ${at.precision} sampler2DArray;\n\tprecision ${at.precision} sampler2DShadow;\n\tprecision ${at.precision} samplerCubeShadow;\n\tprecision ${at.precision} sampler2DArrayShadow;\n\tprecision ${at.precision} isampler2D;\n\tprecision ${at.precision} isampler3D;\n\tprecision ${at.precision} isamplerCube;\n\tprecision ${at.precision} isampler2DArray;\n\tprecision ${at.precision} usampler2D;\n\tprecision ${at.precision} usampler3D;\n\tprecision ${at.precision} usamplerCube;\n\tprecision ${at.precision} usampler2DArray;\n\t`;return"highp"===at.precision?st+="\n#define HIGH_PRECISION":"mediump"===at.precision?st+="\n#define MEDIUM_PRECISION":"lowp"===at.precision&&(st+="\n#define LOW_PRECISION"),st}function WebGLProgram(at,st,ot,rc){const sc=at.getContext(),oc=ot.defines;let _c=ot.vertexShader,wc=ot.fragmentShader;const Sc=function(at){let st="SHADOWMAP_TYPE_BASIC";return at.shadowMapType===ut.QP0?st="SHADOWMAP_TYPE_PCF":at.shadowMapType===ut.Wk7?st="SHADOWMAP_TYPE_PCF_SOFT":at.shadowMapType===ut.RyA&&(st="SHADOWMAP_TYPE_VSM"),st}(ot),iu=function(at){let st="ENVMAP_TYPE_CUBE";if(at.envMap)switch(at.envMapMode){case ut.hy7:case ut.xFO:st="ENVMAP_TYPE_CUBE";break;case ut.Om:st="ENVMAP_TYPE_CUBE_UV"}return st}(ot),su=function(at){let st="ENVMAP_MODE_REFLECTION";at.envMap&&at.envMapMode===ut.xFO&&(st="ENVMAP_MODE_REFRACTION");return st}(ot),lu=function(at){let st="ENVMAP_BLENDING_NONE";if(at.envMap)switch(at.combine){case ut.caT:st="ENVMAP_BLENDING_MULTIPLY";break;case ut.KRh:st="ENVMAP_BLENDING_MIX";break;case ut.XrR:st="ENVMAP_BLENDING_ADD"}return st}(ot),cu=function(at){const st=at.envMapCubeUVHeight;if(null===st)return null;const ot=Math.log2(st)-2,ut=1/st;return{texelWidth:1/(3*Math.max(Math.pow(2,ot),112)),texelHeight:ut,maxMip:ot}}(ot),uu=function(at){return[at.extensionClipCullDistance?"#extension GL_ANGLE_clip_cull_distance : require":"",at.extensionMultiDraw?"#extension GL_ANGLE_multi_draw : require":""].filter(filterEmptyLine).join("\n")}(ot),pu=function(at){const st=[];for(const ot in at){const ut=at[ot];!1!==ut&&st.push("#define "+ot+" "+ut)}return st.join("\n")}(oc),mu=sc.createProgram();let gu,Au,yu=ot.glslVersion?"#version "+ot.glslVersion+"\n":"";ot.isRawShaderMaterial?(gu=["#define SHADER_TYPE "+ot.shaderType,"#define SHADER_NAME "+ot.shaderName,pu].filter(filterEmptyLine).join("\n"),gu.length>0&&(gu+="\n"),Au=["#define SHADER_TYPE "+ot.shaderType,"#define SHADER_NAME "+ot.shaderName,pu].filter(filterEmptyLine).join("\n"),Au.length>0&&(Au+="\n")):(gu=[generatePrecision(ot),"#define SHADER_TYPE "+ot.shaderType,"#define SHADER_NAME "+ot.shaderName,pu,ot.extensionClipCullDistance?"#define USE_CLIP_DISTANCE":"",ot.batching?"#define USE_BATCHING":"",ot.batchingColor?"#define USE_BATCHING_COLOR":"",ot.instancing?"#define USE_INSTANCING":"",ot.instancingColor?"#define USE_INSTANCING_COLOR":"",ot.instancingMorph?"#define USE_INSTANCING_MORPH":"",ot.useFog&&ot.fog?"#define USE_FOG":"",ot.useFog&&ot.fogExp2?"#define FOG_EXP2":"",ot.map?"#define USE_MAP":"",ot.envMap?"#define USE_ENVMAP":"",ot.envMap?"#define "+su:"",ot.lightMap?"#define USE_LIGHTMAP":"",ot.aoMap?"#define USE_AOMAP":"",ot.bumpMap?"#define USE_BUMPMAP":"",ot.normalMap?"#define USE_NORMALMAP":"",ot.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",ot.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",ot.displacementMap?"#define USE_DISPLACEMENTMAP":"",ot.emissiveMap?"#define USE_EMISSIVEMAP":"",ot.anisotropy?"#define USE_ANISOTROPY":"",ot.anisotropyMap?"#define USE_ANISOTROPYMAP":"",ot.clearcoatMap?"#define USE_CLEARCOATMAP":"",ot.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",ot.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",ot.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",ot.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",ot.specularMap?"#define USE_SPECULARMAP":"",ot.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",ot.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",ot.roughnessMap?"#define USE_ROUGHNESSMAP":"",ot.metalnessMap?"#define USE_METALNESSMAP":"",ot.alphaMap?"#define USE_ALPHAMAP":"",ot.alphaHash?"#define USE_ALPHAHASH":"",ot.transmission?"#define USE_TRANSMISSION":"",ot.transmissionMap?"#define USE_TRANSMISSIONMAP":"",ot.thicknessMap?"#define USE_THICKNESSMAP":"",ot.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",ot.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",ot.mapUv?"#define MAP_UV "+ot.mapUv:"",ot.alphaMapUv?"#define ALPHAMAP_UV "+ot.alphaMapUv:"",ot.lightMapUv?"#define LIGHTMAP_UV "+ot.lightMapUv:"",ot.aoMapUv?"#define AOMAP_UV "+ot.aoMapUv:"",ot.emissiveMapUv?"#define EMISSIVEMAP_UV "+ot.emissiveMapUv:"",ot.bumpMapUv?"#define BUMPMAP_UV "+ot.bumpMapUv:"",ot.normalMapUv?"#define NORMALMAP_UV "+ot.normalMapUv:"",ot.displacementMapUv?"#define DISPLACEMENTMAP_UV "+ot.displacementMapUv:"",ot.metalnessMapUv?"#define METALNESSMAP_UV "+ot.metalnessMapUv:"",ot.roughnessMapUv?"#define ROUGHNESSMAP_UV "+ot.roughnessMapUv:"",ot.anisotropyMapUv?"#define ANISOTROPYMAP_UV "+ot.anisotropyMapUv:"",ot.clearcoatMapUv?"#define CLEARCOATMAP_UV "+ot.clearcoatMapUv:"",ot.clearcoatNormalMapUv?"#define CLEARCOAT_NORMALMAP_UV "+ot.clearcoatNormalMapUv:"",ot.clearcoatRoughnessMapUv?"#define CLEARCOAT_ROUGHNESSMAP_UV "+ot.clearcoatRoughnessMapUv:"",ot.iridescenceMapUv?"#define IRIDESCENCEMAP_UV "+ot.iridescenceMapUv:"",ot.iridescenceThicknessMapUv?"#define IRIDESCENCE_THICKNESSMAP_UV "+ot.iridescenceThicknessMapUv:"",ot.sheenColorMapUv?"#define SHEEN_COLORMAP_UV "+ot.sheenColorMapUv:"",ot.sheenRoughnessMapUv?"#define SHEEN_ROUGHNESSMAP_UV "+ot.sheenRoughnessMapUv:"",ot.specularMapUv?"#define SPECULARMAP_UV "+ot.specularMapUv:"",ot.specularColorMapUv?"#define SPECULAR_COLORMAP_UV "+ot.specularColorMapUv:"",ot.specularIntensityMapUv?"#define SPECULAR_INTENSITYMAP_UV "+ot.specularIntensityMapUv:"",ot.transmissionMapUv?"#define TRANSMISSIONMAP_UV "+ot.transmissionMapUv:"",ot.thicknessMapUv?"#define THICKNESSMAP_UV "+ot.thicknessMapUv:"",ot.vertexTangents&&!1===ot.flatShading?"#define USE_TANGENT":"",ot.vertexColors?"#define USE_COLOR":"",ot.vertexAlphas?"#define USE_COLOR_ALPHA":"",ot.vertexUv1s?"#define USE_UV1":"",ot.vertexUv2s?"#define USE_UV2":"",ot.vertexUv3s?"#define USE_UV3":"",ot.pointsUvs?"#define USE_POINTS_UV":"",ot.flatShading?"#define FLAT_SHADED":"",ot.skinning?"#define USE_SKINNING":"",ot.morphTargets?"#define USE_MORPHTARGETS":"",ot.morphNormals&&!1===ot.flatShading?"#define USE_MORPHNORMALS":"",ot.morphColors?"#define USE_MORPHCOLORS":"",ot.morphTargetsCount>0?"#define MORPHTARGETS_TEXTURE_STRIDE "+ot.morphTextureStride:"",ot.morphTargetsCount>0?"#define MORPHTARGETS_COUNT "+ot.morphTargetsCount:"",ot.doubleSided?"#define DOUBLE_SIDED":"",ot.flipSided?"#define FLIP_SIDED":"",ot.shadowMapEnabled?"#define USE_SHADOWMAP":"",ot.shadowMapEnabled?"#define "+Sc:"",ot.sizeAttenuation?"#define USE_SIZEATTENUATION":"",ot.numLightProbes>0?"#define USE_LIGHT_PROBES":"",ot.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",ot.reverseDepthBuffer?"#define USE_REVERSEDEPTHBUF":"","uniform mat4 modelMatrix;","uniform mat4 modelViewMatrix;","uniform mat4 projectionMatrix;","uniform mat4 viewMatrix;","uniform mat3 normalMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;","#ifdef USE_INSTANCING","\tattribute mat4 instanceMatrix;","#endif","#ifdef USE_INSTANCING_COLOR","\tattribute vec3 instanceColor;","#endif","#ifdef USE_INSTANCING_MORPH","\tuniform sampler2D morphTexture;","#endif","attribute vec3 position;","attribute vec3 normal;","attribute vec2 uv;","#ifdef USE_UV1","\tattribute vec2 uv1;","#endif","#ifdef USE_UV2","\tattribute vec2 uv2;","#endif","#ifdef USE_UV3","\tattribute vec2 uv3;","#endif","#ifdef USE_TANGENT","\tattribute vec4 tangent;","#endif","#if defined( USE_COLOR_ALPHA )","\tattribute vec4 color;","#elif defined( USE_COLOR )","\tattribute vec3 color;","#endif","#ifdef USE_SKINNING","\tattribute vec4 skinIndex;","\tattribute vec4 skinWeight;","#endif","\n"].filter(filterEmptyLine).join("\n"),Au=[generatePrecision(ot),"#define SHADER_TYPE "+ot.shaderType,"#define SHADER_NAME "+ot.shaderName,pu,ot.useFog&&ot.fog?"#define USE_FOG":"",ot.useFog&&ot.fogExp2?"#define FOG_EXP2":"",ot.alphaToCoverage?"#define ALPHA_TO_COVERAGE":"",ot.map?"#define USE_MAP":"",ot.matcap?"#define USE_MATCAP":"",ot.envMap?"#define USE_ENVMAP":"",ot.envMap?"#define "+iu:"",ot.envMap?"#define "+su:"",ot.envMap?"#define "+lu:"",cu?"#define CUBEUV_TEXEL_WIDTH "+cu.texelWidth:"",cu?"#define CUBEUV_TEXEL_HEIGHT "+cu.texelHeight:"",cu?"#define CUBEUV_MAX_MIP "+cu.maxMip+".0":"",ot.lightMap?"#define USE_LIGHTMAP":"",ot.aoMap?"#define USE_AOMAP":"",ot.bumpMap?"#define USE_BUMPMAP":"",ot.normalMap?"#define USE_NORMALMAP":"",ot.normalMapObjectSpace?"#define USE_NORMALMAP_OBJECTSPACE":"",ot.normalMapTangentSpace?"#define USE_NORMALMAP_TANGENTSPACE":"",ot.emissiveMap?"#define USE_EMISSIVEMAP":"",ot.anisotropy?"#define USE_ANISOTROPY":"",ot.anisotropyMap?"#define USE_ANISOTROPYMAP":"",ot.clearcoat?"#define USE_CLEARCOAT":"",ot.clearcoatMap?"#define USE_CLEARCOATMAP":"",ot.clearcoatRoughnessMap?"#define USE_CLEARCOAT_ROUGHNESSMAP":"",ot.clearcoatNormalMap?"#define USE_CLEARCOAT_NORMALMAP":"",ot.dispersion?"#define USE_DISPERSION":"",ot.iridescence?"#define USE_IRIDESCENCE":"",ot.iridescenceMap?"#define USE_IRIDESCENCEMAP":"",ot.iridescenceThicknessMap?"#define USE_IRIDESCENCE_THICKNESSMAP":"",ot.specularMap?"#define USE_SPECULARMAP":"",ot.specularColorMap?"#define USE_SPECULAR_COLORMAP":"",ot.specularIntensityMap?"#define USE_SPECULAR_INTENSITYMAP":"",ot.roughnessMap?"#define USE_ROUGHNESSMAP":"",ot.metalnessMap?"#define USE_METALNESSMAP":"",ot.alphaMap?"#define USE_ALPHAMAP":"",ot.alphaTest?"#define USE_ALPHATEST":"",ot.alphaHash?"#define USE_ALPHAHASH":"",ot.sheen?"#define USE_SHEEN":"",ot.sheenColorMap?"#define USE_SHEEN_COLORMAP":"",ot.sheenRoughnessMap?"#define USE_SHEEN_ROUGHNESSMAP":"",ot.transmission?"#define USE_TRANSMISSION":"",ot.transmissionMap?"#define USE_TRANSMISSIONMAP":"",ot.thicknessMap?"#define USE_THICKNESSMAP":"",ot.vertexTangents&&!1===ot.flatShading?"#define USE_TANGENT":"",ot.vertexColors||ot.instancingColor||ot.batchingColor?"#define USE_COLOR":"",ot.vertexAlphas?"#define USE_COLOR_ALPHA":"",ot.vertexUv1s?"#define USE_UV1":"",ot.vertexUv2s?"#define USE_UV2":"",ot.vertexUv3s?"#define USE_UV3":"",ot.pointsUvs?"#define USE_POINTS_UV":"",ot.gradientMap?"#define USE_GRADIENTMAP":"",ot.flatShading?"#define FLAT_SHADED":"",ot.doubleSided?"#define DOUBLE_SIDED":"",ot.flipSided?"#define FLIP_SIDED":"",ot.shadowMapEnabled?"#define USE_SHADOWMAP":"",ot.shadowMapEnabled?"#define "+Sc:"",ot.premultipliedAlpha?"#define PREMULTIPLIED_ALPHA":"",ot.numLightProbes>0?"#define USE_LIGHT_PROBES":"",ot.decodeVideoTexture?"#define DECODE_VIDEO_TEXTURE":"",ot.decodeVideoTextureEmissive?"#define DECODE_VIDEO_TEXTURE_EMISSIVE":"",ot.logarithmicDepthBuffer?"#define USE_LOGDEPTHBUF":"",ot.reverseDepthBuffer?"#define USE_REVERSEDEPTHBUF":"","uniform mat4 viewMatrix;","uniform vec3 cameraPosition;","uniform bool isOrthographic;",ot.toneMapping!==ut.y_p?"#define TONE_MAPPING":"",ot.toneMapping!==ut.y_p?Hl.tonemapping_pars_fragment:"",ot.toneMapping!==ut.y_p?getToneMappingFunction("toneMapping",ot.toneMapping):"",ot.dithering?"#define DITHERING":"",ot.opaque?"#define OPAQUE":"",Hl.colorspace_pars_fragment,getTexelEncodingFunction("linearToOutputTexel",ot.outputColorSpace),getLuminanceFunction(),ot.useDepthPacking?"#define DEPTH_PACKING "+ot.depthPacking:"","\n"].filter(filterEmptyLine).join("\n")),_c=resolveIncludes(_c),_c=replaceLightNums(_c,ot),_c=replaceClippingPlaneNums(_c,ot),wc=resolveIncludes(wc),wc=replaceLightNums(wc,ot),wc=replaceClippingPlaneNums(wc,ot),_c=unrollLoops(_c),wc=unrollLoops(wc),!0!==ot.isRawShaderMaterial&&(yu="#version 300 es\n",gu=[uu,"#define attribute in","#define varying out","#define texture2D texture"].join("\n")+"\n"+gu,Au=["#define varying in",ot.glslVersion===ut.Wdf?"":"layout(location = 0) out highp vec4 pc_fragColor;",ot.glslVersion===ut.Wdf?"":"#define gl_FragColor pc_fragColor","#define gl_FragDepthEXT gl_FragDepth","#define texture2D texture","#define textureCube texture","#define texture2DProj textureProj","#define texture2DLodEXT textureLod","#define texture2DProjLodEXT textureProjLod","#define textureCubeLodEXT textureLod","#define texture2DGradEXT textureGrad","#define texture2DProjGradEXT textureProjGrad","#define textureCubeGradEXT textureGrad"].join("\n")+"\n"+Au);const _u=yu+gu+_c,xu=yu+Au+wc,Su=WebGLShader(sc,sc.VERTEX_SHADER,_u),Du=WebGLShader(sc,sc.FRAGMENT_SHADER,xu);function onFirstUse(st){if(at.debug.checkShaderErrors){const ot=sc.getProgramInfoLog(mu).trim(),ut=sc.getShaderInfoLog(Su).trim(),Hl=sc.getShaderInfoLog(Du).trim();let rc=!0,oc=!0;if(!1===sc.getProgramParameter(mu,sc.LINK_STATUS))if(rc=!1,"function"===typeof at.debug.onShaderError)at.debug.onShaderError(sc,mu,Su,Du);else{const at=getShaderErrors(sc,Su,"vertex"),ut=getShaderErrors(sc,Du,"fragment");console.error("THREE.WebGLProgram: Shader Error "+sc.getError()+" - VALIDATE_STATUS "+sc.getProgramParameter(mu,sc.VALIDATE_STATUS)+"\n\nMaterial Name: "+st.name+"\nMaterial Type: "+st.type+"\n\nProgram Info Log: "+ot+"\n"+at+"\n"+ut)}else""!==ot?console.warn("THREE.WebGLProgram: Program Info Log:",ot):""!==ut&&""!==Hl||(oc=!1);oc&&(st.diagnostics={runnable:rc,programLog:ot,vertexShader:{log:ut,prefix:gu},fragmentShader:{log:Hl,prefix:Au}})}sc.deleteShader(Su),sc.deleteShader(Du),Lu=new WebGLUniforms(sc,mu),$u=function(at,st){const ot={},ut=at.getProgramParameter(st,at.ACTIVE_ATTRIBUTES);for(let Hl=0;Hl<ut;Hl++){const ut=at.getActiveAttrib(st,Hl),rc=ut.name;let sc=1;ut.type===at.FLOAT_MAT2&&(sc=2),ut.type===at.FLOAT_MAT3&&(sc=3),ut.type===at.FLOAT_MAT4&&(sc=4),ot[rc]={type:ut.type,location:at.getAttribLocation(st,rc),locationSize:sc}}return ot}(sc,mu)}let Lu,$u;sc.attachShader(mu,Su),sc.attachShader(mu,Du),void 0!==ot.index0AttributeName?sc.bindAttribLocation(mu,0,ot.index0AttributeName):!0===ot.morphTargets&&sc.bindAttribLocation(mu,0,"position"),sc.linkProgram(mu),this.getUniforms=function(){return void 0===Lu&&onFirstUse(this),Lu},this.getAttributes=function(){return void 0===$u&&onFirstUse(this),$u};let hh=!1===ot.rendererExtensionParallelShaderCompile;return this.isReady=function(){return!1===hh&&(hh=sc.getProgramParameter(mu,37297)),hh},this.destroy=function(){rc.releaseStatesOfProgram(this),sc.deleteProgram(mu),this.program=void 0},this.type=ot.shaderType,this.name=ot.shaderName,this.id=ad++,this.cacheKey=st,this.usedTimes=1,this.program=mu,this.vertexShader=Su,this.fragmentShader=Du,this}let hd=0;class WebGLShaderCache{constructor(){this.shaderCache=new Map,this.materialCache=new Map}update(at){const st=at.vertexShader,ot=at.fragmentShader,ut=this._getShaderStage(st),Hl=this._getShaderStage(ot),rc=this._getShaderCacheForMaterial(at);return!1===rc.has(ut)&&(rc.add(ut),ut.usedTimes++),!1===rc.has(Hl)&&(rc.add(Hl),Hl.usedTimes++),this}remove(at){const st=this.materialCache.get(at);for(const ot of st)ot.usedTimes--,0===ot.usedTimes&&this.shaderCache.delete(ot.code);return this.materialCache.delete(at),this}getVertexShaderID(at){return this._getShaderStage(at.vertexShader).id}getFragmentShaderID(at){return this._getShaderStage(at.fragmentShader).id}dispose(){this.shaderCache.clear(),this.materialCache.clear()}_getShaderCacheForMaterial(at){const st=this.materialCache;let ot=st.get(at);return void 0===ot&&(ot=new Set,st.set(at,ot)),ot}_getShaderStage(at){const st=this.shaderCache;let ot=st.get(at);return void 0===ot&&(ot=new WebGLShaderStage(at),st.set(at,ot)),ot}}class WebGLShaderStage{constructor(at){this.id=hd++,this.code=at,this.usedTimes=0}}function WebGLPrograms(at,st,ot,Hl,rc,oc,_c){const wc=new ut.zgK,Sc=new WebGLShaderCache,iu=new Set,su=[],lu=rc.logarithmicDepthBuffer,cu=rc.vertexTextures;let uu=rc.precision;const pu={MeshDepthMaterial:"depth",MeshDistanceMaterial:"distanceRGBA",MeshNormalMaterial:"normal",MeshBasicMaterial:"basic",MeshLambertMaterial:"lambert",MeshPhongMaterial:"phong",MeshToonMaterial:"toon",MeshStandardMaterial:"physical",MeshPhysicalMaterial:"physical",MeshMatcapMaterial:"matcap",LineBasicMaterial:"basic",LineDashedMaterial:"dashed",PointsMaterial:"points",ShadowMaterial:"shadow",SpriteMaterial:"sprite"};function getChannel(at){return iu.add(at),0===at?"uv":`uv${at}`}return{getParameters:function(oc,wc,su,mu,gu){const Au=mu.fog,yu=gu.geometry,_u=oc.isMeshStandardMaterial?mu.environment:null,xu=(oc.isMeshStandardMaterial?ot:st).get(oc.envMap||_u),Su=xu&&xu.mapping===ut.Om?xu.image.height:null,Du=pu[oc.type];null!==oc.precision&&(uu=rc.getMaxPrecision(oc.precision),uu!==oc.precision&&console.warn("THREE.WebGLProgram.getParameters:",oc.precision,"not supported, using",uu,"instead."));const Lu=yu.morphAttributes.position||yu.morphAttributes.normal||yu.morphAttributes.color,$u=void 0!==Lu?Lu.length:0;let hh,ed,td,id,nd=0;if(void 0!==yu.morphAttributes.position&&(nd=1),void 0!==yu.morphAttributes.normal&&(nd=2),void 0!==yu.morphAttributes.color&&(nd=3),Du){const at=sc[Du];hh=at.vertexShader,ed=at.fragmentShader}else hh=oc.vertexShader,ed=oc.fragmentShader,Sc.update(oc),td=Sc.getVertexShaderID(oc),id=Sc.getFragmentShaderID(oc);const rd=at.getRenderTarget(),ad=at.state.buffers.depth.getReversed(),sd=!0===gu.isInstancedMesh,od=!0===gu.isBatchedMesh,ld=!!oc.map,cd=!!oc.matcap,ud=!!xu,hd=!!oc.aoMap,dd=!!oc.lightMap,pd=!!oc.bumpMap,md=!!oc.normalMap,fd=!!oc.displacementMap,gd=!!oc.emissiveMap,Ad=!!oc.metalnessMap,yd=!!oc.roughnessMap,vd=oc.anisotropy>0,_d=oc.clearcoat>0,xd=oc.dispersion>0,bd=oc.iridescence>0,wd=oc.sheen>0,Ed=oc.transmission>0,Md=vd&&!!oc.anisotropyMap,Sd=_d&&!!oc.clearcoatMap,Td=_d&&!!oc.clearcoatNormalMap,Cd=_d&&!!oc.clearcoatRoughnessMap,kd=bd&&!!oc.iridescenceMap,Id=bd&&!!oc.iridescenceThicknessMap,Dd=wd&&!!oc.sheenColorMap,Ld=wd&&!!oc.sheenRoughnessMap,Pd=!!oc.specularMap,zd=!!oc.specularColorMap,Nd=!!oc.specularIntensityMap,Rd=Ed&&!!oc.transmissionMap,Od=Ed&&!!oc.thicknessMap,Bd=!!oc.gradientMap,Fd=!!oc.alphaMap,jd=oc.alphaTest>0,Ud=!!oc.alphaHash,Vd=!!oc.extensions;let Gd=ut.y_p;oc.toneMapped&&(null!==rd&&!0!==rd.isXRRenderTarget||(Gd=at.toneMapping));const Zd={shaderID:Du,shaderType:oc.type,shaderName:oc.name,vertexShader:hh,fragmentShader:ed,defines:oc.defines,customVertexShaderID:td,customFragmentShaderID:id,isRawShaderMaterial:!0===oc.isRawShaderMaterial,glslVersion:oc.glslVersion,precision:uu,batching:od,batchingColor:od&&null!==gu._colorsTexture,instancing:sd,instancingColor:sd&&null!==gu.instanceColor,instancingMorph:sd&&null!==gu.morphTexture,supportsVertexTextures:cu,outputColorSpace:null===rd?at.outputColorSpace:!0===rd.isXRRenderTarget?rd.texture.colorSpace:ut.Zr2,alphaToCoverage:!!oc.alphaToCoverage,map:ld,matcap:cd,envMap:ud,envMapMode:ud&&xu.mapping,envMapCubeUVHeight:Su,aoMap:hd,lightMap:dd,bumpMap:pd,normalMap:md,displacementMap:cu&&fd,emissiveMap:gd,normalMapObjectSpace:md&&oc.normalMapType===ut.vyJ,normalMapTangentSpace:md&&oc.normalMapType===ut.bI3,metalnessMap:Ad,roughnessMap:yd,anisotropy:vd,anisotropyMap:Md,clearcoat:_d,clearcoatMap:Sd,clearcoatNormalMap:Td,clearcoatRoughnessMap:Cd,dispersion:xd,iridescence:bd,iridescenceMap:kd,iridescenceThicknessMap:Id,sheen:wd,sheenColorMap:Dd,sheenRoughnessMap:Ld,specularMap:Pd,specularColorMap:zd,specularIntensityMap:Nd,transmission:Ed,transmissionMap:Rd,thicknessMap:Od,gradientMap:Bd,opaque:!1===oc.transparent&&oc.blending===ut.NTi&&!1===oc.alphaToCoverage,alphaMap:Fd,alphaTest:jd,alphaHash:Ud,combine:oc.combine,mapUv:ld&&getChannel(oc.map.channel),aoMapUv:hd&&getChannel(oc.aoMap.channel),lightMapUv:dd&&getChannel(oc.lightMap.channel),bumpMapUv:pd&&getChannel(oc.bumpMap.channel),normalMapUv:md&&getChannel(oc.normalMap.channel),displacementMapUv:fd&&getChannel(oc.displacementMap.channel),emissiveMapUv:gd&&getChannel(oc.emissiveMap.channel),metalnessMapUv:Ad&&getChannel(oc.metalnessMap.channel),roughnessMapUv:yd&&getChannel(oc.roughnessMap.channel),anisotropyMapUv:Md&&getChannel(oc.anisotropyMap.channel),clearcoatMapUv:Sd&&getChannel(oc.clearcoatMap.channel),clearcoatNormalMapUv:Td&&getChannel(oc.clearcoatNormalMap.channel),clearcoatRoughnessMapUv:Cd&&getChannel(oc.clearcoatRoughnessMap.channel),iridescenceMapUv:kd&&getChannel(oc.iridescenceMap.channel),iridescenceThicknessMapUv:Id&&getChannel(oc.iridescenceThicknessMap.channel),sheenColorMapUv:Dd&&getChannel(oc.sheenColorMap.channel),sheenRoughnessMapUv:Ld&&getChannel(oc.sheenRoughnessMap.channel),specularMapUv:Pd&&getChannel(oc.specularMap.channel),specularColorMapUv:zd&&getChannel(oc.specularColorMap.channel),specularIntensityMapUv:Nd&&getChannel(oc.specularIntensityMap.channel),transmissionMapUv:Rd&&getChannel(oc.transmissionMap.channel),thicknessMapUv:Od&&getChannel(oc.thicknessMap.channel),alphaMapUv:Fd&&getChannel(oc.alphaMap.channel),vertexTangents:!!yu.attributes.tangent&&(md||vd),vertexColors:oc.vertexColors,vertexAlphas:!0===oc.vertexColors&&!!yu.attributes.color&&4===yu.attributes.color.itemSize,pointsUvs:!0===gu.isPoints&&!!yu.attributes.uv&&(ld||Fd),fog:!!Au,useFog:!0===oc.fog,fogExp2:!!Au&&Au.isFogExp2,flatShading:!0===oc.flatShading,sizeAttenuation:!0===oc.sizeAttenuation,logarithmicDepthBuffer:lu,reverseDepthBuffer:ad,skinning:!0===gu.isSkinnedMesh,morphTargets:void 0!==yu.morphAttributes.position,morphNormals:void 0!==yu.morphAttributes.normal,morphColors:void 0!==yu.morphAttributes.color,morphTargetsCount:$u,morphTextureStride:nd,numDirLights:wc.directional.length,numPointLights:wc.point.length,numSpotLights:wc.spot.length,numSpotLightMaps:wc.spotLightMap.length,numRectAreaLights:wc.rectArea.length,numHemiLights:wc.hemi.length,numDirLightShadows:wc.directionalShadowMap.length,numPointLightShadows:wc.pointShadowMap.length,numSpotLightShadows:wc.spotShadowMap.length,numSpotLightShadowsWithMaps:wc.numSpotLightShadowsWithMaps,numLightProbes:wc.numLightProbes,numClippingPlanes:_c.numPlanes,numClipIntersection:_c.numIntersection,dithering:oc.dithering,shadowMapEnabled:at.shadowMap.enabled&&su.length>0,shadowMapType:at.shadowMap.type,toneMapping:Gd,decodeVideoTexture:ld&&!0===oc.map.isVideoTexture&&ut.ppV.getTransfer(oc.map.colorSpace)===ut.KLL,decodeVideoTextureEmissive:gd&&!0===oc.emissiveMap.isVideoTexture&&ut.ppV.getTransfer(oc.emissiveMap.colorSpace)===ut.KLL,premultipliedAlpha:oc.premultipliedAlpha,doubleSided:oc.side===ut.$EB,flipSided:oc.side===ut.hsX,useDepthPacking:oc.depthPacking>=0,depthPacking:oc.depthPacking||0,index0AttributeName:oc.index0AttributeName,extensionClipCullDistance:Vd&&!0===oc.extensions.clipCullDistance&&Hl.has("WEBGL_clip_cull_distance"),extensionMultiDraw:(Vd&&!0===oc.extensions.multiDraw||od)&&Hl.has("WEBGL_multi_draw"),rendererExtensionParallelShaderCompile:Hl.has("KHR_parallel_shader_compile"),customProgramCacheKey:oc.customProgramCacheKey()};return Zd.vertexUv1s=iu.has(1),Zd.vertexUv2s=iu.has(2),Zd.vertexUv3s=iu.has(3),iu.clear(),Zd},getProgramCacheKey:function(st){const ot=[];if(st.shaderID?ot.push(st.shaderID):(ot.push(st.customVertexShaderID),ot.push(st.customFragmentShaderID)),void 0!==st.defines)for(const at in st.defines)ot.push(at),ot.push(st.defines[at]);return!1===st.isRawShaderMaterial&&(!function(at,st){at.push(st.precision),at.push(st.outputColorSpace),at.push(st.envMapMode),at.push(st.envMapCubeUVHeight),at.push(st.mapUv),at.push(st.alphaMapUv),at.push(st.lightMapUv),at.push(st.aoMapUv),at.push(st.bumpMapUv),at.push(st.normalMapUv),at.push(st.displacementMapUv),at.push(st.emissiveMapUv),at.push(st.metalnessMapUv),at.push(st.roughnessMapUv),at.push(st.anisotropyMapUv),at.push(st.clearcoatMapUv),at.push(st.clearcoatNormalMapUv),at.push(st.clearcoatRoughnessMapUv),at.push(st.iridescenceMapUv),at.push(st.iridescenceThicknessMapUv),at.push(st.sheenColorMapUv),at.push(st.sheenRoughnessMapUv),at.push(st.specularMapUv),at.push(st.specularColorMapUv),at.push(st.specularIntensityMapUv),at.push(st.transmissionMapUv),at.push(st.thicknessMapUv),at.push(st.combine),at.push(st.fogExp2),at.push(st.sizeAttenuation),at.push(st.morphTargetsCount),at.push(st.morphAttributeCount),at.push(st.numDirLights),at.push(st.numPointLights),at.push(st.numSpotLights),at.push(st.numSpotLightMaps),at.push(st.numHemiLights),at.push(st.numRectAreaLights),at.push(st.numDirLightShadows),at.push(st.numPointLightShadows),at.push(st.numSpotLightShadows),at.push(st.numSpotLightShadowsWithMaps),at.push(st.numLightProbes),at.push(st.shadowMapType),at.push(st.toneMapping),at.push(st.numClippingPlanes),at.push(st.numClipIntersection),at.push(st.depthPacking)}(ot,st),function(at,st){wc.disableAll(),st.supportsVertexTextures&&wc.enable(0);st.instancing&&wc.enable(1);st.instancingColor&&wc.enable(2);st.instancingMorph&&wc.enable(3);st.matcap&&wc.enable(4);st.envMap&&wc.enable(5);st.normalMapObjectSpace&&wc.enable(6);st.normalMapTangentSpace&&wc.enable(7);st.clearcoat&&wc.enable(8);st.iridescence&&wc.enable(9);st.alphaTest&&wc.enable(10);st.vertexColors&&wc.enable(11);st.vertexAlphas&&wc.enable(12);st.vertexUv1s&&wc.enable(13);st.vertexUv2s&&wc.enable(14);st.vertexUv3s&&wc.enable(15);st.vertexTangents&&wc.enable(16);st.anisotropy&&wc.enable(17);st.alphaHash&&wc.enable(18);st.batching&&wc.enable(19);st.dispersion&&wc.enable(20);st.batchingColor&&wc.enable(21);at.push(wc.mask),wc.disableAll(),st.fog&&wc.enable(0);st.useFog&&wc.enable(1);st.flatShading&&wc.enable(2);st.logarithmicDepthBuffer&&wc.enable(3);st.reverseDepthBuffer&&wc.enable(4);st.skinning&&wc.enable(5);st.morphTargets&&wc.enable(6);st.morphNormals&&wc.enable(7);st.morphColors&&wc.enable(8);st.premultipliedAlpha&&wc.enable(9);st.shadowMapEnabled&&wc.enable(10);st.doubleSided&&wc.enable(11);st.flipSided&&wc.enable(12);st.useDepthPacking&&wc.enable(13);st.dithering&&wc.enable(14);st.transmission&&wc.enable(15);st.sheen&&wc.enable(16);st.opaque&&wc.enable(17);st.pointsUvs&&wc.enable(18);st.decodeVideoTexture&&wc.enable(19);st.decodeVideoTextureEmissive&&wc.enable(20);st.alphaToCoverage&&wc.enable(21);at.push(wc.mask)}(ot,st),ot.push(at.outputColorSpace)),ot.push(st.customProgramCacheKey),ot.join()},getUniforms:function(at){const st=pu[at.type];let ot;if(st){const at=sc[st];ot=ut.LlO.clone(at.uniforms)}else ot=at.uniforms;return ot},acquireProgram:function(st,ot){let ut;for(let at=0,Hl=su.length;at<Hl;at++){const st=su[at];if(st.cacheKey===ot){ut=st,++ut.usedTimes;break}}return void 0===ut&&(ut=new WebGLProgram(at,ot,st,oc),su.push(ut)),ut},releaseProgram:function(at){if(0===--at.usedTimes){const st=su.indexOf(at);su[st]=su[su.length-1],su.pop(),at.destroy()}},releaseShaderCache:function(at){Sc.remove(at)},programs:su,dispose:function(){Sc.dispose()}}}function WebGLProperties(){let at=new WeakMap;return{has:function(st){return at.has(st)},get:function(st){let ot=at.get(st);return void 0===ot&&(ot={},at.set(st,ot)),ot},remove:function(st){at.delete(st)},update:function(st,ot,ut){at.get(st)[ot]=ut},dispose:function(){at=new WeakMap}}}function painterSortStable(at,st){return at.groupOrder!==st.groupOrder?at.groupOrder-st.groupOrder:at.renderOrder!==st.renderOrder?at.renderOrder-st.renderOrder:at.material.id!==st.material.id?at.material.id-st.material.id:at.z!==st.z?at.z-st.z:at.id-st.id}function reversePainterSortStable(at,st){return at.groupOrder!==st.groupOrder?at.groupOrder-st.groupOrder:at.renderOrder!==st.renderOrder?at.renderOrder-st.renderOrder:at.z!==st.z?st.z-at.z:at.id-st.id}function WebGLRenderList(){const at=[];let st=0;const ot=[],ut=[],Hl=[];function getNextRenderItem(ot,ut,Hl,rc,sc,oc){let _c=at[st];return void 0===_c?(_c={id:ot.id,object:ot,geometry:ut,material:Hl,groupOrder:rc,renderOrder:ot.renderOrder,z:sc,group:oc},at[st]=_c):(_c.id=ot.id,_c.object=ot,_c.geometry=ut,_c.material=Hl,_c.groupOrder=rc,_c.renderOrder=ot.renderOrder,_c.z=sc,_c.group=oc),st++,_c}return{opaque:ot,transmissive:ut,transparent:Hl,init:function(){st=0,ot.length=0,ut.length=0,Hl.length=0},push:function(at,st,rc,sc,oc,_c){const wc=getNextRenderItem(at,st,rc,sc,oc,_c);rc.transmission>0?ut.push(wc):!0===rc.transparent?Hl.push(wc):ot.push(wc)},unshift:function(at,st,rc,sc,oc,_c){const wc=getNextRenderItem(at,st,rc,sc,oc,_c);rc.transmission>0?ut.unshift(wc):!0===rc.transparent?Hl.unshift(wc):ot.unshift(wc)},finish:function(){for(let ot=st,ut=at.length;ot<ut;ot++){const st=at[ot];if(null===st.id)break;st.id=null,st.object=null,st.geometry=null,st.material=null,st.group=null}},sort:function(at,st){ot.length>1&&ot.sort(at||painterSortStable),ut.length>1&&ut.sort(st||reversePainterSortStable),Hl.length>1&&Hl.sort(st||reversePainterSortStable)}}}function WebGLRenderLists(){let at=new WeakMap;return{get:function(st,ot){const ut=at.get(st);let Hl;return void 0===ut?(Hl=new WebGLRenderList,at.set(st,[Hl])):ot>=ut.length?(Hl=new WebGLRenderList,ut.push(Hl)):Hl=ut[ot],Hl},dispose:function(){at=new WeakMap}}}function UniformsCache(){const at={};return{get:function(st){if(void 0!==at[st.id])return at[st.id];let ot;switch(st.type){case"DirectionalLight":ot={direction:new ut.Pq0,color:new ut.Q1f};break;case"SpotLight":ot={position:new ut.Pq0,direction:new ut.Pq0,color:new ut.Q1f,distance:0,coneCos:0,penumbraCos:0,decay:0};break;case"PointLight":ot={position:new ut.Pq0,color:new ut.Q1f,distance:0,decay:0};break;case"HemisphereLight":ot={direction:new ut.Pq0,skyColor:new ut.Q1f,groundColor:new ut.Q1f};break;case"RectAreaLight":ot={color:new ut.Q1f,position:new ut.Pq0,halfWidth:new ut.Pq0,halfHeight:new ut.Pq0}}return at[st.id]=ot,ot}}}let dd=0;function shadowCastingAndTexturingLightsFirst(at,st){return(st.castShadow?2:0)-(at.castShadow?2:0)+(st.map?1:0)-(at.map?1:0)}function WebGLLights(at){const st=new UniformsCache,ot=function(){const at={};return{get:function(st){if(void 0!==at[st.id])return at[st.id];let ot;switch(st.type){case"DirectionalLight":case"SpotLight":ot={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new ut.I9Y};break;case"PointLight":ot={shadowIntensity:1,shadowBias:0,shadowNormalBias:0,shadowRadius:1,shadowMapSize:new ut.I9Y,shadowCameraNear:1,shadowCameraFar:1e3}}return at[st.id]=ot,ot}}}(),Hl={version:0,hash:{directionalLength:-1,pointLength:-1,spotLength:-1,rectAreaLength:-1,hemiLength:-1,numDirectionalShadows:-1,numPointShadows:-1,numSpotShadows:-1,numSpotMaps:-1,numLightProbes:-1},ambient:[0,0,0],probe:[],directional:[],directionalShadow:[],directionalShadowMap:[],directionalShadowMatrix:[],spot:[],spotLightMap:[],spotShadow:[],spotShadowMap:[],spotLightMatrix:[],rectArea:[],rectAreaLTC1:null,rectAreaLTC2:null,point:[],pointShadow:[],pointShadowMap:[],pointShadowMatrix:[],hemi:[],numSpotLightShadowsWithMaps:0,numLightProbes:0};for(let rc=0;rc<9;rc++)Hl.probe.push(new ut.Pq0);const sc=new ut.Pq0,oc=new ut.kn4,_c=new ut.kn4;return{setup:function(ut){let sc=0,oc=0,_c=0;for(let at=0;at<9;at++)Hl.probe[at].set(0,0,0);let wc=0,Sc=0,iu=0,su=0,lu=0,cu=0,uu=0,pu=0,mu=0,gu=0,Au=0;ut.sort(shadowCastingAndTexturingLightsFirst);for(let at=0,rc=ut.length;at<rc;at++){const rc=ut[at],yu=rc.color,_u=rc.intensity,xu=rc.distance,Su=rc.shadow&&rc.shadow.map?rc.shadow.map.texture:null;if(rc.isAmbientLight)sc+=yu.r*_u,oc+=yu.g*_u,_c+=yu.b*_u;else if(rc.isLightProbe){for(let at=0;at<9;at++)Hl.probe[at].addScaledVector(rc.sh.coefficients[at],_u);Au++}else if(rc.isDirectionalLight){const at=st.get(rc);if(at.color.copy(rc.color).multiplyScalar(rc.intensity),rc.castShadow){const at=rc.shadow,st=ot.get(rc);st.shadowIntensity=at.intensity,st.shadowBias=at.bias,st.shadowNormalBias=at.normalBias,st.shadowRadius=at.radius,st.shadowMapSize=at.mapSize,Hl.directionalShadow[wc]=st,Hl.directionalShadowMap[wc]=Su,Hl.directionalShadowMatrix[wc]=rc.shadow.matrix,cu++}Hl.directional[wc]=at,wc++}else if(rc.isSpotLight){const at=st.get(rc);at.position.setFromMatrixPosition(rc.matrixWorld),at.color.copy(yu).multiplyScalar(_u),at.distance=xu,at.coneCos=Math.cos(rc.angle),at.penumbraCos=Math.cos(rc.angle*(1-rc.penumbra)),at.decay=rc.decay,Hl.spot[iu]=at;const ut=rc.shadow;if(rc.map&&(Hl.spotLightMap[mu]=rc.map,mu++,ut.updateMatrices(rc),rc.castShadow&&gu++),Hl.spotLightMatrix[iu]=ut.matrix,rc.castShadow){const at=ot.get(rc);at.shadowIntensity=ut.intensity,at.shadowBias=ut.bias,at.shadowNormalBias=ut.normalBias,at.shadowRadius=ut.radius,at.shadowMapSize=ut.mapSize,Hl.spotShadow[iu]=at,Hl.spotShadowMap[iu]=Su,pu++}iu++}else if(rc.isRectAreaLight){const at=st.get(rc);at.color.copy(yu).multiplyScalar(_u),at.halfWidth.set(.5*rc.width,0,0),at.halfHeight.set(0,.5*rc.height,0),Hl.rectArea[su]=at,su++}else if(rc.isPointLight){const at=st.get(rc);if(at.color.copy(rc.color).multiplyScalar(rc.intensity),at.distance=rc.distance,at.decay=rc.decay,rc.castShadow){const at=rc.shadow,st=ot.get(rc);st.shadowIntensity=at.intensity,st.shadowBias=at.bias,st.shadowNormalBias=at.normalBias,st.shadowRadius=at.radius,st.shadowMapSize=at.mapSize,st.shadowCameraNear=at.camera.near,st.shadowCameraFar=at.camera.far,Hl.pointShadow[Sc]=st,Hl.pointShadowMap[Sc]=Su,Hl.pointShadowMatrix[Sc]=rc.shadow.matrix,uu++}Hl.point[Sc]=at,Sc++}else if(rc.isHemisphereLight){const at=st.get(rc);at.skyColor.copy(rc.color).multiplyScalar(_u),at.groundColor.copy(rc.groundColor).multiplyScalar(_u),Hl.hemi[lu]=at,lu++}}su>0&&(!0===at.has("OES_texture_float_linear")?(Hl.rectAreaLTC1=rc.LTC_FLOAT_1,Hl.rectAreaLTC2=rc.LTC_FLOAT_2):(Hl.rectAreaLTC1=rc.LTC_HALF_1,Hl.rectAreaLTC2=rc.LTC_HALF_2)),Hl.ambient[0]=sc,Hl.ambient[1]=oc,Hl.ambient[2]=_c;const yu=Hl.hash;yu.directionalLength===wc&&yu.pointLength===Sc&&yu.spotLength===iu&&yu.rectAreaLength===su&&yu.hemiLength===lu&&yu.numDirectionalShadows===cu&&yu.numPointShadows===uu&&yu.numSpotShadows===pu&&yu.numSpotMaps===mu&&yu.numLightProbes===Au||(Hl.directional.length=wc,Hl.spot.length=iu,Hl.rectArea.length=su,Hl.point.length=Sc,Hl.hemi.length=lu,Hl.directionalShadow.length=cu,Hl.directionalShadowMap.length=cu,Hl.pointShadow.length=uu,Hl.pointShadowMap.length=uu,Hl.spotShadow.length=pu,Hl.spotShadowMap.length=pu,Hl.directionalShadowMatrix.length=cu,Hl.pointShadowMatrix.length=uu,Hl.spotLightMatrix.length=pu+mu-gu,Hl.spotLightMap.length=mu,Hl.numSpotLightShadowsWithMaps=gu,Hl.numLightProbes=Au,yu.directionalLength=wc,yu.pointLength=Sc,yu.spotLength=iu,yu.rectAreaLength=su,yu.hemiLength=lu,yu.numDirectionalShadows=cu,yu.numPointShadows=uu,yu.numSpotShadows=pu,yu.numSpotMaps=mu,yu.numLightProbes=Au,Hl.version=dd++)},setupView:function(at,st){let ot=0,ut=0,rc=0,wc=0,Sc=0;const iu=st.matrixWorldInverse;for(let su=0,lu=at.length;su<lu;su++){const st=at[su];if(st.isDirectionalLight){const at=Hl.directional[ot];at.direction.setFromMatrixPosition(st.matrixWorld),sc.setFromMatrixPosition(st.target.matrixWorld),at.direction.sub(sc),at.direction.transformDirection(iu),ot++}else if(st.isSpotLight){const at=Hl.spot[rc];at.position.setFromMatrixPosition(st.matrixWorld),at.position.applyMatrix4(iu),at.direction.setFromMatrixPosition(st.matrixWorld),sc.setFromMatrixPosition(st.target.matrixWorld),at.direction.sub(sc),at.direction.transformDirection(iu),rc++}else if(st.isRectAreaLight){const at=Hl.rectArea[wc];at.position.setFromMatrixPosition(st.matrixWorld),at.position.applyMatrix4(iu),_c.identity(),oc.copy(st.matrixWorld),oc.premultiply(iu),_c.extractRotation(oc),at.halfWidth.set(.5*st.width,0,0),at.halfHeight.set(0,.5*st.height,0),at.halfWidth.applyMatrix4(_c),at.halfHeight.applyMatrix4(_c),wc++}else if(st.isPointLight){const at=Hl.point[ut];at.position.setFromMatrixPosition(st.matrixWorld),at.position.applyMatrix4(iu),ut++}else if(st.isHemisphereLight){const at=Hl.hemi[Sc];at.direction.setFromMatrixPosition(st.matrixWorld),at.direction.transformDirection(iu),Sc++}}},state:Hl}}function WebGLRenderState(at){const st=new WebGLLights(at),ot=[],ut=[];const Hl={lightsArray:ot,shadowsArray:ut,camera:null,lights:st,transmissionRenderTarget:{}};return{init:function(at){Hl.camera=at,ot.length=0,ut.length=0},state:Hl,setupLights:function(){st.setup(ot)},setupLightsView:function(at){st.setupView(ot,at)},pushLight:function(at){ot.push(at)},pushShadow:function(at){ut.push(at)}}}function WebGLRenderStates(at){let st=new WeakMap;return{get:function(ot,ut){void 0===ut&&(ut=0);const Hl=st.get(ot);let rc;return void 0===Hl?(rc=new WebGLRenderState(at),st.set(ot,[rc])):ut>=Hl.length?(rc=new WebGLRenderState(at),Hl.push(rc)):rc=Hl[ut],rc},dispose:function(){st=new WeakMap}}}function WebGLShadowMap(at,st,ot){let Hl=new ut.PPD;const rc=new ut.I9Y,sc=new ut.I9Y,oc=new ut.IUQ,_c=new ut.CSG({depthPacking:ut.N5j}),wc=new ut.aVO,Sc={},iu=ot.maxTextureSize,su={[ut.hB5]:ut.hsX,[ut.hsX]:ut.hB5,[ut.$EB]:ut.$EB},lu=new ut.BKk({defines:{VSM_SAMPLES:8},uniforms:{shadow_pass:{value:null},resolution:{value:new ut.I9Y},radius:{value:4}},vertexShader:"void main() {\n\tgl_Position = vec4( position, 1.0 );\n}",fragmentShader:"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}"}),cu=lu.clone();cu.defines.HORIZONTAL_PASS=1;const uu=new ut.LoY;uu.setAttribute("position",new ut.THS(new Float32Array([-1,-1,.5,3,-1,.5,-1,3,.5]),3));const pu=new ut.eaF(uu,lu),mu=this;this.enabled=!1,this.autoUpdate=!0,this.needsUpdate=!1,this.type=ut.QP0;let gu=this.type;function VSMPass(ot,Hl){const sc=st.update(pu);lu.defines.VSM_SAMPLES!==ot.blurSamples&&(lu.defines.VSM_SAMPLES=ot.blurSamples,cu.defines.VSM_SAMPLES=ot.blurSamples,lu.needsUpdate=!0,cu.needsUpdate=!0),null===ot.mapPass&&(ot.mapPass=new ut.nWS(rc.x,rc.y)),lu.uniforms.shadow_pass.value=ot.map.texture,lu.uniforms.resolution.value=ot.mapSize,lu.uniforms.radius.value=ot.radius,at.setRenderTarget(ot.mapPass),at.clear(),at.renderBufferDirect(Hl,null,sc,lu,pu,null),cu.uniforms.shadow_pass.value=ot.mapPass.texture,cu.uniforms.resolution.value=ot.mapSize,cu.uniforms.radius.value=ot.radius,at.setRenderTarget(ot.map),at.clear(),at.renderBufferDirect(Hl,null,sc,cu,pu,null)}function getDepthMaterial(st,ot,Hl,rc){let sc=null;const oc=!0===Hl.isPointLight?st.customDistanceMaterial:st.customDepthMaterial;if(void 0!==oc)sc=oc;else if(sc=!0===Hl.isPointLight?wc:_c,at.localClippingEnabled&&!0===ot.clipShadows&&Array.isArray(ot.clippingPlanes)&&0!==ot.clippingPlanes.length||ot.displacementMap&&0!==ot.displacementScale||ot.alphaMap&&ot.alphaTest>0||ot.map&&ot.alphaTest>0){const at=sc.uuid,st=ot.uuid;let ut=Sc[at];void 0===ut&&(ut={},Sc[at]=ut);let Hl=ut[st];void 0===Hl&&(Hl=sc.clone(),ut[st]=Hl,ot.addEventListener("dispose",onMaterialDispose)),sc=Hl}if(sc.visible=ot.visible,sc.wireframe=ot.wireframe,rc===ut.RyA?sc.side=null!==ot.shadowSide?ot.shadowSide:ot.side:sc.side=null!==ot.shadowSide?ot.shadowSide:su[ot.side],sc.alphaMap=ot.alphaMap,sc.alphaTest=ot.alphaTest,sc.map=ot.map,sc.clipShadows=ot.clipShadows,sc.clippingPlanes=ot.clippingPlanes,sc.clipIntersection=ot.clipIntersection,sc.displacementMap=ot.displacementMap,sc.displacementScale=ot.displacementScale,sc.displacementBias=ot.displacementBias,sc.wireframeLinewidth=ot.wireframeLinewidth,sc.linewidth=ot.linewidth,!0===Hl.isPointLight&&!0===sc.isMeshDistanceMaterial){at.properties.get(sc).light=Hl}return sc}function renderObject(ot,rc,sc,oc,_c){if(!1===ot.visible)return;if(ot.layers.test(rc.layers)&&(ot.isMesh||ot.isLine||ot.isPoints)&&(ot.castShadow||ot.receiveShadow&&_c===ut.RyA)&&(!ot.frustumCulled||Hl.intersectsObject(ot))){ot.modelViewMatrix.multiplyMatrices(sc.matrixWorldInverse,ot.matrixWorld);const ut=st.update(ot),Hl=ot.material;if(Array.isArray(Hl)){const st=ut.groups;for(let wc=0,Sc=st.length;wc<Sc;wc++){const Sc=st[wc],iu=Hl[Sc.materialIndex];if(iu&&iu.visible){const st=getDepthMaterial(ot,iu,oc,_c);ot.onBeforeShadow(at,ot,rc,sc,ut,st,Sc),at.renderBufferDirect(sc,null,ut,st,ot,Sc),ot.onAfterShadow(at,ot,rc,sc,ut,st,Sc)}}}else if(Hl.visible){const st=getDepthMaterial(ot,Hl,oc,_c);ot.onBeforeShadow(at,ot,rc,sc,ut,st,null),at.renderBufferDirect(sc,null,ut,st,ot,null),ot.onAfterShadow(at,ot,rc,sc,ut,st,null)}}const wc=ot.children;for(let at=0,st=wc.length;at<st;at++)renderObject(wc[at],rc,sc,oc,_c)}function onMaterialDispose(at){at.target.removeEventListener("dispose",onMaterialDispose);for(const st in Sc){const ot=Sc[st],ut=at.target.uuid;if(ut in ot){ot[ut].dispose(),delete ot[ut]}}}this.render=function(st,ot,_c){if(!1===mu.enabled)return;if(!1===mu.autoUpdate&&!1===mu.needsUpdate)return;if(0===st.length)return;const wc=at.getRenderTarget(),Sc=at.getActiveCubeFace(),su=at.getActiveMipmapLevel(),lu=at.state;lu.setBlending(ut.XIg),lu.buffers.color.setClear(1,1,1,1),lu.buffers.depth.setTest(!0),lu.setScissorTest(!1);const cu=gu!==ut.RyA&&this.type===ut.RyA,uu=gu===ut.RyA&&this.type!==ut.RyA;for(let pu=0,mu=st.length;pu<mu;pu++){const wc=st[pu],Sc=wc.shadow;if(void 0===Sc){console.warn("THREE.WebGLShadowMap:",wc,"has no shadow.");continue}if(!1===Sc.autoUpdate&&!1===Sc.needsUpdate)continue;rc.copy(Sc.mapSize);const su=Sc.getFrameExtents();if(rc.multiply(su),sc.copy(Sc.mapSize),(rc.x>iu||rc.y>iu)&&(rc.x>iu&&(sc.x=Math.floor(iu/su.x),rc.x=sc.x*su.x,Sc.mapSize.x=sc.x),rc.y>iu&&(sc.y=Math.floor(iu/su.y),rc.y=sc.y*su.y,Sc.mapSize.y=sc.y)),null===Sc.map||!0===cu||!0===uu){const at=this.type!==ut.RyA?{minFilter:ut.hxR,magFilter:ut.hxR}:{};null!==Sc.map&&Sc.map.dispose(),Sc.map=new ut.nWS(rc.x,rc.y,at),Sc.map.texture.name=wc.name+".shadowMap",Sc.camera.updateProjectionMatrix()}at.setRenderTarget(Sc.map),at.clear();const mu=Sc.getViewportCount();for(let at=0;at<mu;at++){const st=Sc.getViewport(at);oc.set(sc.x*st.x,sc.y*st.y,sc.x*st.z,sc.y*st.w),lu.viewport(oc),Sc.updateMatrices(wc,at),Hl=Sc.getFrustum(),renderObject(ot,_c,Sc.camera,wc,this.type)}!0!==Sc.isPointLightShadow&&this.type===ut.RyA&&VSMPass(Sc,_c),Sc.needsUpdate=!1}gu=this.type,mu.needsUpdate=!1,at.setRenderTarget(wc,Sc,su)}}const pd={[ut.eHc]:ut.lGu,[ut.brA]:ut.K52,[ut.U3G]:ut.bw0,[ut.xSv]:ut.Gwm,[ut.lGu]:ut.eHc,[ut.K52]:ut.brA,[ut.bw0]:ut.U3G,[ut.Gwm]:ut.xSv};function WebGLState(at,st){const ot=new function(){let st=!1;const ot=new ut.IUQ;let Hl=null;const rc=new ut.IUQ(0,0,0,0);return{setMask:function(ot){Hl===ot||st||(at.colorMask(ot,ot,ot,ot),Hl=ot)},setLocked:function(at){st=at},setClear:function(st,ut,Hl,sc,oc){!0===oc&&(st*=sc,ut*=sc,Hl*=sc),ot.set(st,ut,Hl,sc),!1===rc.equals(ot)&&(at.clearColor(st,ut,Hl,sc),rc.copy(ot))},reset:function(){st=!1,Hl=null,rc.set(-1,0,0,0)}}},Hl=new function(){let ot=!1,Hl=!1,rc=null,sc=null,oc=null;return{setReversed:function(at){if(Hl!==at){const ot=st.get("EXT_clip_control");at?ot.clipControlEXT(ot.LOWER_LEFT_EXT,ot.ZERO_TO_ONE_EXT):ot.clipControlEXT(ot.LOWER_LEFT_EXT,ot.NEGATIVE_ONE_TO_ONE_EXT),Hl=at;const ut=oc;oc=null,this.setClear(ut)}},getReversed:function(){return Hl},setTest:function(st){st?enable(at.DEPTH_TEST):disable(at.DEPTH_TEST)},setMask:function(st){rc===st||ot||(at.depthMask(st),rc=st)},setFunc:function(st){if(Hl&&(st=pd[st]),sc!==st){switch(st){case ut.eHc:at.depthFunc(at.NEVER);break;case ut.lGu:at.depthFunc(at.ALWAYS);break;case ut.brA:at.depthFunc(at.LESS);break;case ut.xSv:at.depthFunc(at.LEQUAL);break;case ut.U3G:at.depthFunc(at.EQUAL);break;case ut.Gwm:at.depthFunc(at.GEQUAL);break;case ut.K52:at.depthFunc(at.GREATER);break;case ut.bw0:at.depthFunc(at.NOTEQUAL);break;default:at.depthFunc(at.LEQUAL)}sc=st}},setLocked:function(at){ot=at},setClear:function(st){oc!==st&&(Hl&&(st=1-st),at.clearDepth(st),oc=st)},reset:function(){ot=!1,rc=null,sc=null,oc=null,Hl=!1}}},rc=new function(){let st=!1,ot=null,ut=null,Hl=null,rc=null,sc=null,oc=null,_c=null,wc=null;return{setTest:function(ot){st||(ot?enable(at.STENCIL_TEST):disable(at.STENCIL_TEST))},setMask:function(ut){ot===ut||st||(at.stencilMask(ut),ot=ut)},setFunc:function(st,ot,sc){ut===st&&Hl===ot&&rc===sc||(at.stencilFunc(st,ot,sc),ut=st,Hl=ot,rc=sc)},setOp:function(st,ot,ut){sc===st&&oc===ot&&_c===ut||(at.stencilOp(st,ot,ut),sc=st,oc=ot,_c=ut)},setLocked:function(at){st=at},setClear:function(st){wc!==st&&(at.clearStencil(st),wc=st)},reset:function(){st=!1,ot=null,ut=null,Hl=null,rc=null,sc=null,oc=null,_c=null,wc=null}}},sc=new WeakMap,oc=new WeakMap;let _c={},wc={},Sc=new WeakMap,iu=[],su=null,lu=!1,cu=null,uu=null,pu=null,mu=null,gu=null,Au=null,yu=null,_u=new ut.Q1f(0,0,0),xu=0,Su=!1,Du=null,Lu=null,$u=null,hh=null,ed=null;const td=at.getParameter(at.MAX_COMBINED_TEXTURE_IMAGE_UNITS);let id=!1,nd=0;const rd=at.getParameter(at.VERSION);-1!==rd.indexOf("WebGL")?(nd=parseFloat(/^WebGL (\d)/.exec(rd)[1]),id=nd>=1):-1!==rd.indexOf("OpenGL ES")&&(nd=parseFloat(/^OpenGL ES (\d)/.exec(rd)[1]),id=nd>=2);let ad=null,sd={};const od=at.getParameter(at.SCISSOR_BOX),ld=at.getParameter(at.VIEWPORT),cd=(new ut.IUQ).fromArray(od),ud=(new ut.IUQ).fromArray(ld);function createTexture(st,ot,ut,Hl){const rc=new Uint8Array(4),sc=at.createTexture();at.bindTexture(st,sc),at.texParameteri(st,at.TEXTURE_MIN_FILTER,at.NEAREST),at.texParameteri(st,at.TEXTURE_MAG_FILTER,at.NEAREST);for(let oc=0;oc<ut;oc++)st===at.TEXTURE_3D||st===at.TEXTURE_2D_ARRAY?at.texImage3D(ot,0,at.RGBA,1,1,Hl,0,at.RGBA,at.UNSIGNED_BYTE,rc):at.texImage2D(ot+oc,0,at.RGBA,1,1,0,at.RGBA,at.UNSIGNED_BYTE,rc);return sc}const hd={};function enable(st){!0!==_c[st]&&(at.enable(st),_c[st]=!0)}function disable(st){!1!==_c[st]&&(at.disable(st),_c[st]=!1)}hd[at.TEXTURE_2D]=createTexture(at.TEXTURE_2D,at.TEXTURE_2D,1),hd[at.TEXTURE_CUBE_MAP]=createTexture(at.TEXTURE_CUBE_MAP,at.TEXTURE_CUBE_MAP_POSITIVE_X,6),hd[at.TEXTURE_2D_ARRAY]=createTexture(at.TEXTURE_2D_ARRAY,at.TEXTURE_2D_ARRAY,1,1),hd[at.TEXTURE_3D]=createTexture(at.TEXTURE_3D,at.TEXTURE_3D,1,1),ot.setClear(0,0,0,1),Hl.setClear(1),rc.setClear(0),enable(at.DEPTH_TEST),Hl.setFunc(ut.xSv),setFlipSided(!1),setCullFace(ut.Vb5),enable(at.CULL_FACE),setBlending(ut.XIg);const dd={[ut.gO9]:at.FUNC_ADD,[ut.FXf]:at.FUNC_SUBTRACT,[ut.nST]:at.FUNC_REVERSE_SUBTRACT};dd[ut.znC]=at.MIN,dd[ut.$ei]=at.MAX;const md={[ut.ojh]:at.ZERO,[ut.qad]:at.ONE,[ut.f4X]:at.SRC_COLOR,[ut.ie2]:at.SRC_ALPHA,[ut.hgQ]:at.SRC_ALPHA_SATURATE,[ut.wn6]:at.DST_COLOR,[ut.hdd]:at.DST_ALPHA,[ut.LiQ]:at.ONE_MINUS_SRC_COLOR,[ut.OuU]:at.ONE_MINUS_SRC_ALPHA,[ut.aEY]:at.ONE_MINUS_DST_COLOR,[ut.Nt7]:at.ONE_MINUS_DST_ALPHA,[ut.RrE]:at.CONSTANT_COLOR,[ut.$Yl]:at.ONE_MINUS_CONSTANT_COLOR,[ut.e0p]:at.CONSTANT_ALPHA,[ut.ov9]:at.ONE_MINUS_CONSTANT_ALPHA};function setBlending(st,ot,Hl,rc,sc,oc,_c,wc,Sc,iu){if(st!==ut.XIg){if(!1===lu&&(enable(at.BLEND),lu=!0),st===ut.bCz)sc=sc||ot,oc=oc||Hl,_c=_c||rc,ot===uu&&sc===gu||(at.blendEquationSeparate(dd[ot],dd[sc]),uu=ot,gu=sc),Hl===pu&&rc===mu&&oc===Au&&_c===yu||(at.blendFuncSeparate(md[Hl],md[rc],md[oc],md[_c]),pu=Hl,mu=rc,Au=oc,yu=_c),!1!==wc.equals(_u)&&Sc===xu||(at.blendColor(wc.r,wc.g,wc.b,Sc),_u.copy(wc),xu=Sc),cu=st,Su=!1;else if(st!==cu||iu!==Su){if(uu===ut.gO9&&gu===ut.gO9||(at.blendEquation(at.FUNC_ADD),uu=ut.gO9,gu=ut.gO9),iu)switch(st){case ut.NTi:at.blendFuncSeparate(at.ONE,at.ONE_MINUS_SRC_ALPHA,at.ONE,at.ONE_MINUS_SRC_ALPHA);break;case ut.EZo:at.blendFunc(at.ONE,at.ONE);break;case ut.Kwu:at.blendFuncSeparate(at.ZERO,at.ONE_MINUS_SRC_COLOR,at.ZERO,at.ONE);break;case ut.EdD:at.blendFuncSeparate(at.ZERO,at.SRC_COLOR,at.ZERO,at.SRC_ALPHA);break;default:console.error("THREE.WebGLState: Invalid blending: ",st)}else switch(st){case ut.NTi:at.blendFuncSeparate(at.SRC_ALPHA,at.ONE_MINUS_SRC_ALPHA,at.ONE,at.ONE_MINUS_SRC_ALPHA);break;case ut.EZo:at.blendFunc(at.SRC_ALPHA,at.ONE);break;case ut.Kwu:at.blendFuncSeparate(at.ZERO,at.ONE_MINUS_SRC_COLOR,at.ZERO,at.ONE);break;case ut.EdD:at.blendFunc(at.ZERO,at.SRC_COLOR);break;default:console.error("THREE.WebGLState: Invalid blending: ",st)}pu=null,mu=null,Au=null,yu=null,_u.set(0,0,0),xu=0,cu=st,Su=iu}}else!0===lu&&(disable(at.BLEND),lu=!1)}function setFlipSided(st){Du!==st&&(st?at.frontFace(at.CW):at.frontFace(at.CCW),Du=st)}function setCullFace(st){st!==ut.WNZ?(enable(at.CULL_FACE),st!==Lu&&(st===ut.Vb5?at.cullFace(at.BACK):st===ut.Jnc?at.cullFace(at.FRONT):at.cullFace(at.FRONT_AND_BACK))):disable(at.CULL_FACE),Lu=st}function setPolygonOffset(st,ot,ut){st?(enable(at.POLYGON_OFFSET_FILL),hh===ot&&ed===ut||(at.polygonOffset(ot,ut),hh=ot,ed=ut)):disable(at.POLYGON_OFFSET_FILL)}return{buffers:{color:ot,depth:Hl,stencil:rc},enable:enable,disable:disable,bindFramebuffer:function(st,ot){return wc[st]!==ot&&(at.bindFramebuffer(st,ot),wc[st]=ot,st===at.DRAW_FRAMEBUFFER&&(wc[at.FRAMEBUFFER]=ot),st===at.FRAMEBUFFER&&(wc[at.DRAW_FRAMEBUFFER]=ot),!0)},drawBuffers:function(st,ot){let ut=iu,Hl=!1;if(st){ut=Sc.get(ot),void 0===ut&&(ut=[],Sc.set(ot,ut));const rc=st.textures;if(ut.length!==rc.length||ut[0]!==at.COLOR_ATTACHMENT0){for(let st=0,ot=rc.length;st<ot;st++)ut[st]=at.COLOR_ATTACHMENT0+st;ut.length=rc.length,Hl=!0}}else ut[0]!==at.BACK&&(ut[0]=at.BACK,Hl=!0);Hl&&at.drawBuffers(ut)},useProgram:function(st){return su!==st&&(at.useProgram(st),su=st,!0)},setBlending:setBlending,setMaterial:function(st,sc){st.side===ut.$EB?disable(at.CULL_FACE):enable(at.CULL_FACE);let oc=st.side===ut.hsX;sc&&(oc=!oc),setFlipSided(oc),st.blending===ut.NTi&&!1===st.transparent?setBlending(ut.XIg):setBlending(st.blending,st.blendEquation,st.blendSrc,st.blendDst,st.blendEquationAlpha,st.blendSrcAlpha,st.blendDstAlpha,st.blendColor,st.blendAlpha,st.premultipliedAlpha),Hl.setFunc(st.depthFunc),Hl.setTest(st.depthTest),Hl.setMask(st.depthWrite),ot.setMask(st.colorWrite);const _c=st.stencilWrite;rc.setTest(_c),_c&&(rc.setMask(st.stencilWriteMask),rc.setFunc(st.stencilFunc,st.stencilRef,st.stencilFuncMask),rc.setOp(st.stencilFail,st.stencilZFail,st.stencilZPass)),setPolygonOffset(st.polygonOffset,st.polygonOffsetFactor,st.polygonOffsetUnits),!0===st.alphaToCoverage?enable(at.SAMPLE_ALPHA_TO_COVERAGE):disable(at.SAMPLE_ALPHA_TO_COVERAGE)},setFlipSided:setFlipSided,setCullFace:setCullFace,setLineWidth:function(st){st!==$u&&(id&&at.lineWidth(st),$u=st)},setPolygonOffset:setPolygonOffset,setScissorTest:function(st){st?enable(at.SCISSOR_TEST):disable(at.SCISSOR_TEST)},activeTexture:function(st){void 0===st&&(st=at.TEXTURE0+td-1),ad!==st&&(at.activeTexture(st),ad=st)},bindTexture:function(st,ot,ut){void 0===ut&&(ut=null===ad?at.TEXTURE0+td-1:ad);let Hl=sd[ut];void 0===Hl&&(Hl={type:void 0,texture:void 0},sd[ut]=Hl),Hl.type===st&&Hl.texture===ot||(ad!==ut&&(at.activeTexture(ut),ad=ut),at.bindTexture(st,ot||hd[st]),Hl.type=st,Hl.texture=ot)},unbindTexture:function(){const st=sd[ad];void 0!==st&&void 0!==st.type&&(at.bindTexture(st.type,null),st.type=void 0,st.texture=void 0)},compressedTexImage2D:function(){try{at.compressedTexImage2D(...arguments)}catch(st){console.error("THREE.WebGLState:",st)}},compressedTexImage3D:function(){try{at.compressedTexImage3D(...arguments)}catch(st){console.error("THREE.WebGLState:",st)}},texImage2D:function(){try{at.texImage2D(...arguments)}catch(st){console.error("THREE.WebGLState:",st)}},texImage3D:function(){try{at.texImage3D(...arguments)}catch(st){console.error("THREE.WebGLState:",st)}},updateUBOMapping:function(st,ot){let ut=oc.get(ot);void 0===ut&&(ut=new WeakMap,oc.set(ot,ut));let Hl=ut.get(st);void 0===Hl&&(Hl=at.getUniformBlockIndex(ot,st.name),ut.set(st,Hl))},uniformBlockBinding:function(st,ot){const ut=oc.get(ot).get(st);sc.get(ot)!==ut&&(at.uniformBlockBinding(ot,ut,st.__bindingPointIndex),sc.set(ot,ut))},texStorage2D:function(){try{at.texStorage2D(...arguments)}catch(st){console.error("THREE.WebGLState:",st)}},texStorage3D:function(){try{at.texStorage3D(...arguments)}catch(st){console.error("THREE.WebGLState:",st)}},texSubImage2D:function(){try{at.texSubImage2D(...arguments)}catch(st){console.error("THREE.WebGLState:",st)}},texSubImage3D:function(){try{at.texSubImage3D(...arguments)}catch(st){console.error("THREE.WebGLState:",st)}},compressedTexSubImage2D:function(){try{at.compressedTexSubImage2D(...arguments)}catch(st){console.error("THREE.WebGLState:",st)}},compressedTexSubImage3D:function(){try{at.compressedTexSubImage3D(...arguments)}catch(st){console.error("THREE.WebGLState:",st)}},scissor:function(st){!1===cd.equals(st)&&(at.scissor(st.x,st.y,st.z,st.w),cd.copy(st))},viewport:function(st){!1===ud.equals(st)&&(at.viewport(st.x,st.y,st.z,st.w),ud.copy(st))},reset:function(){at.disable(at.BLEND),at.disable(at.CULL_FACE),at.disable(at.DEPTH_TEST),at.disable(at.POLYGON_OFFSET_FILL),at.disable(at.SCISSOR_TEST),at.disable(at.STENCIL_TEST),at.disable(at.SAMPLE_ALPHA_TO_COVERAGE),at.blendEquation(at.FUNC_ADD),at.blendFunc(at.ONE,at.ZERO),at.blendFuncSeparate(at.ONE,at.ZERO,at.ONE,at.ZERO),at.blendColor(0,0,0,0),at.colorMask(!0,!0,!0,!0),at.clearColor(0,0,0,0),at.depthMask(!0),at.depthFunc(at.LESS),Hl.setReversed(!1),at.clearDepth(1),at.stencilMask(4294967295),at.stencilFunc(at.ALWAYS,0,4294967295),at.stencilOp(at.KEEP,at.KEEP,at.KEEP),at.clearStencil(0),at.cullFace(at.BACK),at.frontFace(at.CCW),at.polygonOffset(0,0),at.activeTexture(at.TEXTURE0),at.bindFramebuffer(at.FRAMEBUFFER,null),at.bindFramebuffer(at.DRAW_FRAMEBUFFER,null),at.bindFramebuffer(at.READ_FRAMEBUFFER,null),at.useProgram(null),at.lineWidth(1),at.scissor(0,0,at.canvas.width,at.canvas.height),at.viewport(0,0,at.canvas.width,at.canvas.height),_c={},ad=null,sd={},wc={},Sc=new WeakMap,iu=[],su=null,lu=!1,cu=null,uu=null,pu=null,mu=null,gu=null,Au=null,yu=null,_u=new ut.Q1f(0,0,0),xu=0,Su=!1,Du=null,Lu=null,$u=null,hh=null,ed=null,cd.set(0,0,at.canvas.width,at.canvas.height),ud.set(0,0,at.canvas.width,at.canvas.height),ot.reset(),Hl.reset(),rc.reset()}}}function WebGLTextures(at,st,ot,Hl,rc,sc,oc){const _c=st.has("WEBGL_multisampled_render_to_texture")?st.get("WEBGL_multisampled_render_to_texture"):null,wc="undefined"!==typeof navigator&&/OculusBrowser/g.test(navigator.userAgent),Sc=new ut.I9Y,iu=new WeakMap;let su;const lu=new WeakMap;let cu=!1;try{cu="undefined"!==typeof OffscreenCanvas&&null!==new OffscreenCanvas(1,1).getContext("2d")}catch(_u){}function createCanvas(at,st){return cu?new OffscreenCanvas(at,st):(0,ut.qq$)("canvas")}function resizeImage(at,st,ot){let ut=1;const Hl=getDimensions(at);if((Hl.width>ot||Hl.height>ot)&&(ut=ot/Math.max(Hl.width,Hl.height)),ut<1){if("undefined"!==typeof HTMLImageElement&&at instanceof HTMLImageElement||"undefined"!==typeof HTMLCanvasElement&&at instanceof HTMLCanvasElement||"undefined"!==typeof ImageBitmap&&at instanceof ImageBitmap||"undefined"!==typeof VideoFrame&&at instanceof VideoFrame){const ot=Math.floor(ut*Hl.width),rc=Math.floor(ut*Hl.height);void 0===su&&(su=createCanvas(ot,rc));const sc=st?createCanvas(ot,rc):su;sc.width=ot,sc.height=rc;return sc.getContext("2d").drawImage(at,0,0,ot,rc),console.warn("THREE.WebGLRenderer: Texture has been resized from ("+Hl.width+"x"+Hl.height+") to ("+ot+"x"+rc+")."),sc}return"data"in at&&console.warn("THREE.WebGLRenderer: Image in DataTexture is too big ("+Hl.width+"x"+Hl.height+")."),at}return at}function textureNeedsGenerateMipmaps(at){return at.generateMipmaps}function generateMipmap(st){at.generateMipmap(st)}function getTargetType(st){return st.isWebGLCubeRenderTarget?at.TEXTURE_CUBE_MAP:st.isWebGL3DRenderTarget?at.TEXTURE_3D:st.isWebGLArrayRenderTarget||st.isCompressedArrayTexture?at.TEXTURE_2D_ARRAY:at.TEXTURE_2D}function getInternalFormat(ot,Hl,rc,sc,oc){if(void 0===oc&&(oc=!1),null!==ot){if(void 0!==at[ot])return at[ot];console.warn("THREE.WebGLRenderer: Attempt to use non-existing WebGL internal format '"+ot+"'")}let _c=Hl;if(Hl===at.RED&&(rc===at.FLOAT&&(_c=at.R32F),rc===at.HALF_FLOAT&&(_c=at.R16F),rc===at.UNSIGNED_BYTE&&(_c=at.R8)),Hl===at.RED_INTEGER&&(rc===at.UNSIGNED_BYTE&&(_c=at.R8UI),rc===at.UNSIGNED_SHORT&&(_c=at.R16UI),rc===at.UNSIGNED_INT&&(_c=at.R32UI),rc===at.BYTE&&(_c=at.R8I),rc===at.SHORT&&(_c=at.R16I),rc===at.INT&&(_c=at.R32I)),Hl===at.RG&&(rc===at.FLOAT&&(_c=at.RG32F),rc===at.HALF_FLOAT&&(_c=at.RG16F),rc===at.UNSIGNED_BYTE&&(_c=at.RG8)),Hl===at.RG_INTEGER&&(rc===at.UNSIGNED_BYTE&&(_c=at.RG8UI),rc===at.UNSIGNED_SHORT&&(_c=at.RG16UI),rc===at.UNSIGNED_INT&&(_c=at.RG32UI),rc===at.BYTE&&(_c=at.RG8I),rc===at.SHORT&&(_c=at.RG16I),rc===at.INT&&(_c=at.RG32I)),Hl===at.RGB_INTEGER&&(rc===at.UNSIGNED_BYTE&&(_c=at.RGB8UI),rc===at.UNSIGNED_SHORT&&(_c=at.RGB16UI),rc===at.UNSIGNED_INT&&(_c=at.RGB32UI),rc===at.BYTE&&(_c=at.RGB8I),rc===at.SHORT&&(_c=at.RGB16I),rc===at.INT&&(_c=at.RGB32I)),Hl===at.RGBA_INTEGER&&(rc===at.UNSIGNED_BYTE&&(_c=at.RGBA8UI),rc===at.UNSIGNED_SHORT&&(_c=at.RGBA16UI),rc===at.UNSIGNED_INT&&(_c=at.RGBA32UI),rc===at.BYTE&&(_c=at.RGBA8I),rc===at.SHORT&&(_c=at.RGBA16I),rc===at.INT&&(_c=at.RGBA32I)),Hl===at.RGB&&rc===at.UNSIGNED_INT_5_9_9_9_REV&&(_c=at.RGB9_E5),Hl===at.RGBA){const st=oc?ut.VxR:ut.ppV.getTransfer(sc);rc===at.FLOAT&&(_c=at.RGBA32F),rc===at.HALF_FLOAT&&(_c=at.RGBA16F),rc===at.UNSIGNED_BYTE&&(_c=st===ut.KLL?at.SRGB8_ALPHA8:at.RGBA8),rc===at.UNSIGNED_SHORT_4_4_4_4&&(_c=at.RGBA4),rc===at.UNSIGNED_SHORT_5_5_5_1&&(_c=at.RGB5_A1)}return _c!==at.R16F&&_c!==at.R32F&&_c!==at.RG16F&&_c!==at.RG32F&&_c!==at.RGBA16F&&_c!==at.RGBA32F||st.get("EXT_color_buffer_float"),_c}function getInternalDepthFormat(st,ot){let Hl;return st?null===ot||ot===ut.bkx||ot===ut.V3x?Hl=at.DEPTH24_STENCIL8:ot===ut.RQf?Hl=at.DEPTH32F_STENCIL8:ot===ut.cHt&&(Hl=at.DEPTH24_STENCIL8,console.warn("DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.")):null===ot||ot===ut.bkx||ot===ut.V3x?Hl=at.DEPTH_COMPONENT24:ot===ut.RQf?Hl=at.DEPTH_COMPONENT32F:ot===ut.cHt&&(Hl=at.DEPTH_COMPONENT16),Hl}function getMipLevels(at,st){return!0===textureNeedsGenerateMipmaps(at)||at.isFramebufferTexture&&at.minFilter!==ut.hxR&&at.minFilter!==ut.k6q?Math.log2(Math.max(st.width,st.height))+1:void 0!==at.mipmaps&&at.mipmaps.length>0?at.mipmaps.length:at.isCompressedTexture&&Array.isArray(at.image)?st.mipmaps.length:1}function onTextureDispose(at){const st=at.target;st.removeEventListener("dispose",onTextureDispose),function(at){const st=Hl.get(at);if(void 0===st.__webglInit)return;const ot=at.source,ut=lu.get(ot);if(ut){const Hl=ut[st.__cacheKey];Hl.usedTimes--,0===Hl.usedTimes&&deleteTexture(at),0===Object.keys(ut).length&&lu.delete(ot)}Hl.remove(at)}(st),st.isVideoTexture&&iu.delete(st)}function onRenderTargetDispose(st){const ot=st.target;ot.removeEventListener("dispose",onRenderTargetDispose),function(st){const ot=Hl.get(st);st.depthTexture&&(st.depthTexture.dispose(),Hl.remove(st.depthTexture));if(st.isWebGLCubeRenderTarget)for(let Hl=0;Hl<6;Hl++){if(Array.isArray(ot.__webglFramebuffer[Hl]))for(let st=0;st<ot.__webglFramebuffer[Hl].length;st++)at.deleteFramebuffer(ot.__webglFramebuffer[Hl][st]);else at.deleteFramebuffer(ot.__webglFramebuffer[Hl]);ot.__webglDepthbuffer&&at.deleteRenderbuffer(ot.__webglDepthbuffer[Hl])}else{if(Array.isArray(ot.__webglFramebuffer))for(let st=0;st<ot.__webglFramebuffer.length;st++)at.deleteFramebuffer(ot.__webglFramebuffer[st]);else at.deleteFramebuffer(ot.__webglFramebuffer);if(ot.__webglDepthbuffer&&at.deleteRenderbuffer(ot.__webglDepthbuffer),ot.__webglMultisampledFramebuffer&&at.deleteFramebuffer(ot.__webglMultisampledFramebuffer),ot.__webglColorRenderbuffer)for(let st=0;st<ot.__webglColorRenderbuffer.length;st++)ot.__webglColorRenderbuffer[st]&&at.deleteRenderbuffer(ot.__webglColorRenderbuffer[st]);ot.__webglDepthRenderbuffer&&at.deleteRenderbuffer(ot.__webglDepthRenderbuffer)}const ut=st.textures;for(let rc=0,sc=ut.length;rc<sc;rc++){const st=Hl.get(ut[rc]);st.__webglTexture&&(at.deleteTexture(st.__webglTexture),oc.memory.textures--),Hl.remove(ut[rc])}Hl.remove(st)}(ot)}function deleteTexture(st){const ot=Hl.get(st);at.deleteTexture(ot.__webglTexture);const ut=st.source;delete lu.get(ut)[ot.__cacheKey],oc.memory.textures--}let uu=0;function setTexture2D(st,ut){const rc=Hl.get(st);if(st.isVideoTexture&&function(at){const st=oc.render.frame;iu.get(at)!==st&&(iu.set(at,st),at.update())}(st),!1===st.isRenderTargetTexture&&st.version>0&&rc.__version!==st.version){const at=st.image;if(null===at)console.warn("THREE.WebGLRenderer: Texture marked for update but no image data found.");else{if(!1!==at.complete)return void uploadTexture(rc,st,ut);console.warn("THREE.WebGLRenderer: Texture marked for update but image is incomplete")}}ot.bindTexture(at.TEXTURE_2D,rc.__webglTexture,at.TEXTURE0+ut)}const pu={[ut.GJx]:at.REPEAT,[ut.ghU]:at.CLAMP_TO_EDGE,[ut.kTW]:at.MIRRORED_REPEAT},mu={[ut.hxR]:at.NEAREST,[ut.pHI]:at.NEAREST_MIPMAP_NEAREST,[ut.Cfg]:at.NEAREST_MIPMAP_LINEAR,[ut.k6q]:at.LINEAR,[ut.kRr]:at.LINEAR_MIPMAP_NEAREST,[ut.$_I]:at.LINEAR_MIPMAP_LINEAR},gu={[ut.amv]:at.NEVER,[ut.FFZ]:at.ALWAYS,[ut.vim]:at.LESS,[ut.TiK]:at.LEQUAL,[ut.kO0]:at.EQUAL,[ut.gWB]:at.GEQUAL,[ut.eoi]:at.GREATER,[ut.jzd]:at.NOTEQUAL};function setTextureParameters(ot,sc){if(sc.type!==ut.RQf||!1!==st.has("OES_texture_float_linear")||sc.magFilter!==ut.k6q&&sc.magFilter!==ut.kRr&&sc.magFilter!==ut.Cfg&&sc.magFilter!==ut.$_I&&sc.minFilter!==ut.k6q&&sc.minFilter!==ut.kRr&&sc.minFilter!==ut.Cfg&&sc.minFilter!==ut.$_I||console.warn("THREE.WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device."),at.texParameteri(ot,at.TEXTURE_WRAP_S,pu[sc.wrapS]),at.texParameteri(ot,at.TEXTURE_WRAP_T,pu[sc.wrapT]),ot!==at.TEXTURE_3D&&ot!==at.TEXTURE_2D_ARRAY||at.texParameteri(ot,at.TEXTURE_WRAP_R,pu[sc.wrapR]),at.texParameteri(ot,at.TEXTURE_MAG_FILTER,mu[sc.magFilter]),at.texParameteri(ot,at.TEXTURE_MIN_FILTER,mu[sc.minFilter]),sc.compareFunction&&(at.texParameteri(ot,at.TEXTURE_COMPARE_MODE,at.COMPARE_REF_TO_TEXTURE),at.texParameteri(ot,at.TEXTURE_COMPARE_FUNC,gu[sc.compareFunction])),!0===st.has("EXT_texture_filter_anisotropic")){if(sc.magFilter===ut.hxR)return;if(sc.minFilter!==ut.Cfg&&sc.minFilter!==ut.$_I)return;if(sc.type===ut.RQf&&!1===st.has("OES_texture_float_linear"))return;if(sc.anisotropy>1||Hl.get(sc).__currentAnisotropy){const ut=st.get("EXT_texture_filter_anisotropic");at.texParameterf(ot,ut.TEXTURE_MAX_ANISOTROPY_EXT,Math.min(sc.anisotropy,rc.getMaxAnisotropy())),Hl.get(sc).__currentAnisotropy=sc.anisotropy}}}function initTexture(st,ot){let ut=!1;void 0===st.__webglInit&&(st.__webglInit=!0,ot.addEventListener("dispose",onTextureDispose));const Hl=ot.source;let rc=lu.get(Hl);void 0===rc&&(rc={},lu.set(Hl,rc));const sc=function(at){const st=[];return st.push(at.wrapS),st.push(at.wrapT),st.push(at.wrapR||0),st.push(at.magFilter),st.push(at.minFilter),st.push(at.anisotropy),st.push(at.internalFormat),st.push(at.format),st.push(at.type),st.push(at.generateMipmaps),st.push(at.premultiplyAlpha),st.push(at.flipY),st.push(at.unpackAlignment),st.push(at.colorSpace),st.join()}(ot);if(sc!==st.__cacheKey){void 0===rc[sc]&&(rc[sc]={texture:at.createTexture(),usedTimes:0},oc.memory.textures++,ut=!0),rc[sc].usedTimes++;const Hl=rc[st.__cacheKey];void 0!==Hl&&(rc[st.__cacheKey].usedTimes--,0===Hl.usedTimes&&deleteTexture(ot)),st.__cacheKey=sc,st.__webglTexture=rc[sc].texture}return ut}function uploadTexture(st,oc,_c){let wc=at.TEXTURE_2D;(oc.isDataArrayTexture||oc.isCompressedArrayTexture)&&(wc=at.TEXTURE_2D_ARRAY),oc.isData3DTexture&&(wc=at.TEXTURE_3D);const Sc=initTexture(st,oc),iu=oc.source;ot.bindTexture(wc,st.__webglTexture,at.TEXTURE0+_c);const su=Hl.get(iu);if(iu.version!==su.__version||!0===Sc){ot.activeTexture(at.TEXTURE0+_c);const st=ut.ppV.getPrimaries(ut.ppV.workingColorSpace),Hl=oc.colorSpace===ut.jf0?null:ut.ppV.getPrimaries(oc.colorSpace),lu=oc.colorSpace===ut.jf0||st===Hl?at.NONE:at.BROWSER_DEFAULT_WEBGL;at.pixelStorei(at.UNPACK_FLIP_Y_WEBGL,oc.flipY),at.pixelStorei(at.UNPACK_PREMULTIPLY_ALPHA_WEBGL,oc.premultiplyAlpha),at.pixelStorei(at.UNPACK_ALIGNMENT,oc.unpackAlignment),at.pixelStorei(at.UNPACK_COLORSPACE_CONVERSION_WEBGL,lu);let cu=resizeImage(oc.image,!1,rc.maxTextureSize);cu=verifyColorSpace(oc,cu);const uu=sc.convert(oc.format,oc.colorSpace),pu=sc.convert(oc.type);let mu,gu=getInternalFormat(oc.internalFormat,uu,pu,oc.colorSpace,oc.isVideoTexture);setTextureParameters(wc,oc);const Au=oc.mipmaps,yu=!0!==oc.isVideoTexture,_u=void 0===su.__version||!0===Sc,xu=iu.dataReady,Su=getMipLevels(oc,cu);if(oc.isDepthTexture)gu=getInternalDepthFormat(oc.format===ut.dcC,oc.type),_u&&(yu?ot.texStorage2D(at.TEXTURE_2D,1,gu,cu.width,cu.height):ot.texImage2D(at.TEXTURE_2D,0,gu,cu.width,cu.height,0,uu,pu,null));else if(oc.isDataTexture)if(Au.length>0){yu&&_u&&ot.texStorage2D(at.TEXTURE_2D,Su,gu,Au[0].width,Au[0].height);for(let st=0,ut=Au.length;st<ut;st++)mu=Au[st],yu?xu&&ot.texSubImage2D(at.TEXTURE_2D,st,0,0,mu.width,mu.height,uu,pu,mu.data):ot.texImage2D(at.TEXTURE_2D,st,gu,mu.width,mu.height,0,uu,pu,mu.data);oc.generateMipmaps=!1}else yu?(_u&&ot.texStorage2D(at.TEXTURE_2D,Su,gu,cu.width,cu.height),xu&&ot.texSubImage2D(at.TEXTURE_2D,0,0,0,cu.width,cu.height,uu,pu,cu.data)):ot.texImage2D(at.TEXTURE_2D,0,gu,cu.width,cu.height,0,uu,pu,cu.data);else if(oc.isCompressedTexture)if(oc.isCompressedArrayTexture){yu&&_u&&ot.texStorage3D(at.TEXTURE_2D_ARRAY,Su,gu,Au[0].width,Au[0].height,cu.depth);for(let st=0,Hl=Au.length;st<Hl;st++)if(mu=Au[st],oc.format!==ut.GWd)if(null!==uu)if(yu){if(xu)if(oc.layerUpdates.size>0){const Hl=(0,ut.Nex)(mu.width,mu.height,oc.format,oc.type);for(const ut of oc.layerUpdates){const rc=mu.data.subarray(ut*Hl/mu.data.BYTES_PER_ELEMENT,(ut+1)*Hl/mu.data.BYTES_PER_ELEMENT);ot.compressedTexSubImage3D(at.TEXTURE_2D_ARRAY,st,0,0,ut,mu.width,mu.height,1,uu,rc)}oc.clearLayerUpdates()}else ot.compressedTexSubImage3D(at.TEXTURE_2D_ARRAY,st,0,0,0,mu.width,mu.height,cu.depth,uu,mu.data)}else ot.compressedTexImage3D(at.TEXTURE_2D_ARRAY,st,gu,mu.width,mu.height,cu.depth,0,mu.data,0,0);else console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()");else yu?xu&&ot.texSubImage3D(at.TEXTURE_2D_ARRAY,st,0,0,0,mu.width,mu.height,cu.depth,uu,pu,mu.data):ot.texImage3D(at.TEXTURE_2D_ARRAY,st,gu,mu.width,mu.height,cu.depth,0,uu,pu,mu.data)}else{yu&&_u&&ot.texStorage2D(at.TEXTURE_2D,Su,gu,Au[0].width,Au[0].height);for(let st=0,Hl=Au.length;st<Hl;st++)mu=Au[st],oc.format!==ut.GWd?null!==uu?yu?xu&&ot.compressedTexSubImage2D(at.TEXTURE_2D,st,0,0,mu.width,mu.height,uu,mu.data):ot.compressedTexImage2D(at.TEXTURE_2D,st,gu,mu.width,mu.height,0,mu.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()"):yu?xu&&ot.texSubImage2D(at.TEXTURE_2D,st,0,0,mu.width,mu.height,uu,pu,mu.data):ot.texImage2D(at.TEXTURE_2D,st,gu,mu.width,mu.height,0,uu,pu,mu.data)}else if(oc.isDataArrayTexture)if(yu){if(_u&&ot.texStorage3D(at.TEXTURE_2D_ARRAY,Su,gu,cu.width,cu.height,cu.depth),xu)if(oc.layerUpdates.size>0){const st=(0,ut.Nex)(cu.width,cu.height,oc.format,oc.type);for(const ut of oc.layerUpdates){const Hl=cu.data.subarray(ut*st/cu.data.BYTES_PER_ELEMENT,(ut+1)*st/cu.data.BYTES_PER_ELEMENT);ot.texSubImage3D(at.TEXTURE_2D_ARRAY,0,0,0,ut,cu.width,cu.height,1,uu,pu,Hl)}oc.clearLayerUpdates()}else ot.texSubImage3D(at.TEXTURE_2D_ARRAY,0,0,0,0,cu.width,cu.height,cu.depth,uu,pu,cu.data)}else ot.texImage3D(at.TEXTURE_2D_ARRAY,0,gu,cu.width,cu.height,cu.depth,0,uu,pu,cu.data);else if(oc.isData3DTexture)yu?(_u&&ot.texStorage3D(at.TEXTURE_3D,Su,gu,cu.width,cu.height,cu.depth),xu&&ot.texSubImage3D(at.TEXTURE_3D,0,0,0,0,cu.width,cu.height,cu.depth,uu,pu,cu.data)):ot.texImage3D(at.TEXTURE_3D,0,gu,cu.width,cu.height,cu.depth,0,uu,pu,cu.data);else if(oc.isFramebufferTexture){if(_u)if(yu)ot.texStorage2D(at.TEXTURE_2D,Su,gu,cu.width,cu.height);else{let st=cu.width,ut=cu.height;for(let Hl=0;Hl<Su;Hl++)ot.texImage2D(at.TEXTURE_2D,Hl,gu,st,ut,0,uu,pu,null),st>>=1,ut>>=1}}else if(Au.length>0){if(yu&&_u){const st=getDimensions(Au[0]);ot.texStorage2D(at.TEXTURE_2D,Su,gu,st.width,st.height)}for(let st=0,ut=Au.length;st<ut;st++)mu=Au[st],yu?xu&&ot.texSubImage2D(at.TEXTURE_2D,st,0,0,uu,pu,mu):ot.texImage2D(at.TEXTURE_2D,st,gu,uu,pu,mu);oc.generateMipmaps=!1}else if(yu){if(_u){const st=getDimensions(cu);ot.texStorage2D(at.TEXTURE_2D,Su,gu,st.width,st.height)}xu&&ot.texSubImage2D(at.TEXTURE_2D,0,0,0,uu,pu,cu)}else ot.texImage2D(at.TEXTURE_2D,0,gu,uu,pu,cu);textureNeedsGenerateMipmaps(oc)&&generateMipmap(wc),su.__version=iu.version,oc.onUpdate&&oc.onUpdate(oc)}st.__version=oc.version}function setupFrameBufferTexture(st,ut,rc,oc,wc,Sc){const iu=sc.convert(rc.format,rc.colorSpace),su=sc.convert(rc.type),lu=getInternalFormat(rc.internalFormat,iu,su,rc.colorSpace),cu=Hl.get(ut),uu=Hl.get(rc);if(uu.__renderTarget=ut,!cu.__hasExternalTextures){const st=Math.max(1,ut.width>>Sc),Hl=Math.max(1,ut.height>>Sc);wc===at.TEXTURE_3D||wc===at.TEXTURE_2D_ARRAY?ot.texImage3D(wc,Sc,lu,st,Hl,ut.depth,0,iu,su,null):ot.texImage2D(wc,Sc,lu,st,Hl,0,iu,su,null)}ot.bindFramebuffer(at.FRAMEBUFFER,st),useMultisampledRTT(ut)?_c.framebufferTexture2DMultisampleEXT(at.FRAMEBUFFER,oc,wc,uu.__webglTexture,0,getRenderTargetSamples(ut)):(wc===at.TEXTURE_2D||wc>=at.TEXTURE_CUBE_MAP_POSITIVE_X&&wc<=at.TEXTURE_CUBE_MAP_NEGATIVE_Z)&&at.framebufferTexture2D(at.FRAMEBUFFER,oc,wc,uu.__webglTexture,Sc),ot.bindFramebuffer(at.FRAMEBUFFER,null)}function setupRenderBufferStorage(st,ot,ut){if(at.bindRenderbuffer(at.RENDERBUFFER,st),ot.depthBuffer){const Hl=ot.depthTexture,rc=Hl&&Hl.isDepthTexture?Hl.type:null,sc=getInternalDepthFormat(ot.stencilBuffer,rc),oc=ot.stencilBuffer?at.DEPTH_STENCIL_ATTACHMENT:at.DEPTH_ATTACHMENT,wc=getRenderTargetSamples(ot);useMultisampledRTT(ot)?_c.renderbufferStorageMultisampleEXT(at.RENDERBUFFER,wc,sc,ot.width,ot.height):ut?at.renderbufferStorageMultisample(at.RENDERBUFFER,wc,sc,ot.width,ot.height):at.renderbufferStorage(at.RENDERBUFFER,sc,ot.width,ot.height),at.framebufferRenderbuffer(at.FRAMEBUFFER,oc,at.RENDERBUFFER,st)}else{const st=ot.textures;for(let Hl=0;Hl<st.length;Hl++){const rc=st[Hl],oc=sc.convert(rc.format,rc.colorSpace),wc=sc.convert(rc.type),Sc=getInternalFormat(rc.internalFormat,oc,wc,rc.colorSpace),iu=getRenderTargetSamples(ot);ut&&!1===useMultisampledRTT(ot)?at.renderbufferStorageMultisample(at.RENDERBUFFER,iu,Sc,ot.width,ot.height):useMultisampledRTT(ot)?_c.renderbufferStorageMultisampleEXT(at.RENDERBUFFER,iu,Sc,ot.width,ot.height):at.renderbufferStorage(at.RENDERBUFFER,Sc,ot.width,ot.height)}}at.bindRenderbuffer(at.RENDERBUFFER,null)}function setupDepthRenderbuffer(st){const rc=Hl.get(st),sc=!0===st.isWebGLCubeRenderTarget;if(rc.__boundDepthTexture!==st.depthTexture){const at=st.depthTexture;if(rc.__depthDisposeCallback&&rc.__depthDisposeCallback(),at){const disposeEvent=()=>{delete rc.__boundDepthTexture,delete rc.__depthDisposeCallback,at.removeEventListener("dispose",disposeEvent)};at.addEventListener("dispose",disposeEvent),rc.__depthDisposeCallback=disposeEvent}rc.__boundDepthTexture=at}if(st.depthTexture&&!rc.__autoAllocateDepthBuffer){if(sc)throw new Error("target.depthTexture not supported in Cube render targets");!function(st,rc){if(rc&&rc.isWebGLCubeRenderTarget)throw new Error("Depth Texture with cube render targets is not supported");if(ot.bindFramebuffer(at.FRAMEBUFFER,st),!rc.depthTexture||!rc.depthTexture.isDepthTexture)throw new Error("renderTarget.depthTexture must be an instance of THREE.DepthTexture");const sc=Hl.get(rc.depthTexture);sc.__renderTarget=rc,sc.__webglTexture&&rc.depthTexture.image.width===rc.width&&rc.depthTexture.image.height===rc.height||(rc.depthTexture.image.width=rc.width,rc.depthTexture.image.height=rc.height,rc.depthTexture.needsUpdate=!0),setTexture2D(rc.depthTexture,0);const oc=sc.__webglTexture,wc=getRenderTargetSamples(rc);if(rc.depthTexture.format===ut.zdS)useMultisampledRTT(rc)?_c.framebufferTexture2DMultisampleEXT(at.FRAMEBUFFER,at.DEPTH_ATTACHMENT,at.TEXTURE_2D,oc,0,wc):at.framebufferTexture2D(at.FRAMEBUFFER,at.DEPTH_ATTACHMENT,at.TEXTURE_2D,oc,0);else{if(rc.depthTexture.format!==ut.dcC)throw new Error("Unknown depthTexture format");useMultisampledRTT(rc)?_c.framebufferTexture2DMultisampleEXT(at.FRAMEBUFFER,at.DEPTH_STENCIL_ATTACHMENT,at.TEXTURE_2D,oc,0,wc):at.framebufferTexture2D(at.FRAMEBUFFER,at.DEPTH_STENCIL_ATTACHMENT,at.TEXTURE_2D,oc,0)}}(rc.__webglFramebuffer,st)}else if(sc){rc.__webglDepthbuffer=[];for(let ut=0;ut<6;ut++)if(ot.bindFramebuffer(at.FRAMEBUFFER,rc.__webglFramebuffer[ut]),void 0===rc.__webglDepthbuffer[ut])rc.__webglDepthbuffer[ut]=at.createRenderbuffer(),setupRenderBufferStorage(rc.__webglDepthbuffer[ut],st,!1);else{const ot=st.stencilBuffer?at.DEPTH_STENCIL_ATTACHMENT:at.DEPTH_ATTACHMENT,Hl=rc.__webglDepthbuffer[ut];at.bindRenderbuffer(at.RENDERBUFFER,Hl),at.framebufferRenderbuffer(at.FRAMEBUFFER,ot,at.RENDERBUFFER,Hl)}}else if(ot.bindFramebuffer(at.FRAMEBUFFER,rc.__webglFramebuffer),void 0===rc.__webglDepthbuffer)rc.__webglDepthbuffer=at.createRenderbuffer(),setupRenderBufferStorage(rc.__webglDepthbuffer,st,!1);else{const ot=st.stencilBuffer?at.DEPTH_STENCIL_ATTACHMENT:at.DEPTH_ATTACHMENT,ut=rc.__webglDepthbuffer;at.bindRenderbuffer(at.RENDERBUFFER,ut),at.framebufferRenderbuffer(at.FRAMEBUFFER,ot,at.RENDERBUFFER,ut)}ot.bindFramebuffer(at.FRAMEBUFFER,null)}const Au=[],yu=[];function getRenderTargetSamples(at){return Math.min(rc.maxSamples,at.samples)}function useMultisampledRTT(at){const ot=Hl.get(at);return at.samples>0&&!0===st.has("WEBGL_multisampled_render_to_texture")&&!1!==ot.__useRenderToTexture}function verifyColorSpace(at,st){const ot=at.colorSpace,Hl=at.format,rc=at.type;return!0===at.isCompressedTexture||!0===at.isVideoTexture||ot!==ut.Zr2&&ot!==ut.jf0&&(ut.ppV.getTransfer(ot)===ut.KLL?Hl===ut.GWd&&rc===ut.OUM||console.warn("THREE.WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType."):console.error("THREE.WebGLTextures: Unsupported texture color space:",ot)),st}function getDimensions(at){return"undefined"!==typeof HTMLImageElement&&at instanceof HTMLImageElement?(Sc.width=at.naturalWidth||at.width,Sc.height=at.naturalHeight||at.height):"undefined"!==typeof VideoFrame&&at instanceof VideoFrame?(Sc.width=at.displayWidth,Sc.height=at.displayHeight):(Sc.width=at.width,Sc.height=at.height),Sc}this.allocateTextureUnit=function(){const at=uu;return at>=rc.maxTextures&&console.warn("THREE.WebGLTextures: Trying to use "+at+" texture units while this GPU supports only "+rc.maxTextures),uu+=1,at},this.resetTextureUnits=function(){uu=0},this.setTexture2D=setTexture2D,this.setTexture2DArray=function(st,ut){const rc=Hl.get(st);st.version>0&&rc.__version!==st.version?uploadTexture(rc,st,ut):ot.bindTexture(at.TEXTURE_2D_ARRAY,rc.__webglTexture,at.TEXTURE0+ut)},this.setTexture3D=function(st,ut){const rc=Hl.get(st);st.version>0&&rc.__version!==st.version?uploadTexture(rc,st,ut):ot.bindTexture(at.TEXTURE_3D,rc.__webglTexture,at.TEXTURE0+ut)},this.setTextureCube=function(st,oc){const _c=Hl.get(st);st.version>0&&_c.__version!==st.version?function(st,oc,_c){if(6!==oc.image.length)return;const wc=initTexture(st,oc),Sc=oc.source;ot.bindTexture(at.TEXTURE_CUBE_MAP,st.__webglTexture,at.TEXTURE0+_c);const iu=Hl.get(Sc);if(Sc.version!==iu.__version||!0===wc){ot.activeTexture(at.TEXTURE0+_c);const st=ut.ppV.getPrimaries(ut.ppV.workingColorSpace),Hl=oc.colorSpace===ut.jf0?null:ut.ppV.getPrimaries(oc.colorSpace),su=oc.colorSpace===ut.jf0||st===Hl?at.NONE:at.BROWSER_DEFAULT_WEBGL;at.pixelStorei(at.UNPACK_FLIP_Y_WEBGL,oc.flipY),at.pixelStorei(at.UNPACK_PREMULTIPLY_ALPHA_WEBGL,oc.premultiplyAlpha),at.pixelStorei(at.UNPACK_ALIGNMENT,oc.unpackAlignment),at.pixelStorei(at.UNPACK_COLORSPACE_CONVERSION_WEBGL,su);const lu=oc.isCompressedTexture||oc.image[0].isCompressedTexture,cu=oc.image[0]&&oc.image[0].isDataTexture,uu=[];for(let at=0;at<6;at++)uu[at]=lu||cu?cu?oc.image[at].image:oc.image[at]:resizeImage(oc.image[at],!0,rc.maxCubemapSize),uu[at]=verifyColorSpace(oc,uu[at]);const pu=uu[0],mu=sc.convert(oc.format,oc.colorSpace),gu=sc.convert(oc.type),Au=getInternalFormat(oc.internalFormat,mu,gu,oc.colorSpace),yu=!0!==oc.isVideoTexture,_u=void 0===iu.__version||!0===wc,xu=Sc.dataReady;let Su,Du=getMipLevels(oc,pu);if(setTextureParameters(at.TEXTURE_CUBE_MAP,oc),lu){yu&&_u&&ot.texStorage2D(at.TEXTURE_CUBE_MAP,Du,Au,pu.width,pu.height);for(let st=0;st<6;st++){Su=uu[st].mipmaps;for(let Hl=0;Hl<Su.length;Hl++){const rc=Su[Hl];oc.format!==ut.GWd?null!==mu?yu?xu&&ot.compressedTexSubImage2D(at.TEXTURE_CUBE_MAP_POSITIVE_X+st,Hl,0,0,rc.width,rc.height,mu,rc.data):ot.compressedTexImage2D(at.TEXTURE_CUBE_MAP_POSITIVE_X+st,Hl,Au,rc.width,rc.height,0,rc.data):console.warn("THREE.WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()"):yu?xu&&ot.texSubImage2D(at.TEXTURE_CUBE_MAP_POSITIVE_X+st,Hl,0,0,rc.width,rc.height,mu,gu,rc.data):ot.texImage2D(at.TEXTURE_CUBE_MAP_POSITIVE_X+st,Hl,Au,rc.width,rc.height,0,mu,gu,rc.data)}}}else{if(Su=oc.mipmaps,yu&&_u){Su.length>0&&Du++;const st=getDimensions(uu[0]);ot.texStorage2D(at.TEXTURE_CUBE_MAP,Du,Au,st.width,st.height)}for(let st=0;st<6;st++)if(cu){yu?xu&&ot.texSubImage2D(at.TEXTURE_CUBE_MAP_POSITIVE_X+st,0,0,0,uu[st].width,uu[st].height,mu,gu,uu[st].data):ot.texImage2D(at.TEXTURE_CUBE_MAP_POSITIVE_X+st,0,Au,uu[st].width,uu[st].height,0,mu,gu,uu[st].data);for(let ut=0;ut<Su.length;ut++){const Hl=Su[ut].image[st].image;yu?xu&&ot.texSubImage2D(at.TEXTURE_CUBE_MAP_POSITIVE_X+st,ut+1,0,0,Hl.width,Hl.height,mu,gu,Hl.data):ot.texImage2D(at.TEXTURE_CUBE_MAP_POSITIVE_X+st,ut+1,Au,Hl.width,Hl.height,0,mu,gu,Hl.data)}}else{yu?xu&&ot.texSubImage2D(at.TEXTURE_CUBE_MAP_POSITIVE_X+st,0,0,0,mu,gu,uu[st]):ot.texImage2D(at.TEXTURE_CUBE_MAP_POSITIVE_X+st,0,Au,mu,gu,uu[st]);for(let ut=0;ut<Su.length;ut++){const Hl=Su[ut];yu?xu&&ot.texSubImage2D(at.TEXTURE_CUBE_MAP_POSITIVE_X+st,ut+1,0,0,mu,gu,Hl.image[st]):ot.texImage2D(at.TEXTURE_CUBE_MAP_POSITIVE_X+st,ut+1,Au,mu,gu,Hl.image[st])}}}textureNeedsGenerateMipmaps(oc)&&generateMipmap(at.TEXTURE_CUBE_MAP),iu.__version=Sc.version,oc.onUpdate&&oc.onUpdate(oc)}st.__version=oc.version}(_c,st,oc):ot.bindTexture(at.TEXTURE_CUBE_MAP,_c.__webglTexture,at.TEXTURE0+oc)},this.rebindTextures=function(st,ot,ut){const rc=Hl.get(st);void 0!==ot&&setupFrameBufferTexture(rc.__webglFramebuffer,st,st.texture,at.COLOR_ATTACHMENT0,at.TEXTURE_2D,0),void 0!==ut&&setupDepthRenderbuffer(st)},this.setupRenderTarget=function(st){const ut=st.texture,rc=Hl.get(st),_c=Hl.get(ut);st.addEventListener("dispose",onRenderTargetDispose);const wc=st.textures,Sc=!0===st.isWebGLCubeRenderTarget,iu=wc.length>1;if(iu||(void 0===_c.__webglTexture&&(_c.__webglTexture=at.createTexture()),_c.__version=ut.version,oc.memory.textures++),Sc){rc.__webglFramebuffer=[];for(let st=0;st<6;st++)if(ut.mipmaps&&ut.mipmaps.length>0){rc.__webglFramebuffer[st]=[];for(let ot=0;ot<ut.mipmaps.length;ot++)rc.__webglFramebuffer[st][ot]=at.createFramebuffer()}else rc.__webglFramebuffer[st]=at.createFramebuffer()}else{if(ut.mipmaps&&ut.mipmaps.length>0){rc.__webglFramebuffer=[];for(let st=0;st<ut.mipmaps.length;st++)rc.__webglFramebuffer[st]=at.createFramebuffer()}else rc.__webglFramebuffer=at.createFramebuffer();if(iu)for(let st=0,ot=wc.length;st<ot;st++){const ot=Hl.get(wc[st]);void 0===ot.__webglTexture&&(ot.__webglTexture=at.createTexture(),oc.memory.textures++)}if(st.samples>0&&!1===useMultisampledRTT(st)){rc.__webglMultisampledFramebuffer=at.createFramebuffer(),rc.__webglColorRenderbuffer=[],ot.bindFramebuffer(at.FRAMEBUFFER,rc.__webglMultisampledFramebuffer);for(let ot=0;ot<wc.length;ot++){const ut=wc[ot];rc.__webglColorRenderbuffer[ot]=at.createRenderbuffer(),at.bindRenderbuffer(at.RENDERBUFFER,rc.__webglColorRenderbuffer[ot]);const Hl=sc.convert(ut.format,ut.colorSpace),oc=sc.convert(ut.type),_c=getInternalFormat(ut.internalFormat,Hl,oc,ut.colorSpace,!0===st.isXRRenderTarget),Sc=getRenderTargetSamples(st);at.renderbufferStorageMultisample(at.RENDERBUFFER,Sc,_c,st.width,st.height),at.framebufferRenderbuffer(at.FRAMEBUFFER,at.COLOR_ATTACHMENT0+ot,at.RENDERBUFFER,rc.__webglColorRenderbuffer[ot])}at.bindRenderbuffer(at.RENDERBUFFER,null),st.depthBuffer&&(rc.__webglDepthRenderbuffer=at.createRenderbuffer(),setupRenderBufferStorage(rc.__webglDepthRenderbuffer,st,!0)),ot.bindFramebuffer(at.FRAMEBUFFER,null)}}if(Sc){ot.bindTexture(at.TEXTURE_CUBE_MAP,_c.__webglTexture),setTextureParameters(at.TEXTURE_CUBE_MAP,ut);for(let ot=0;ot<6;ot++)if(ut.mipmaps&&ut.mipmaps.length>0)for(let Hl=0;Hl<ut.mipmaps.length;Hl++)setupFrameBufferTexture(rc.__webglFramebuffer[ot][Hl],st,ut,at.COLOR_ATTACHMENT0,at.TEXTURE_CUBE_MAP_POSITIVE_X+ot,Hl);else setupFrameBufferTexture(rc.__webglFramebuffer[ot],st,ut,at.COLOR_ATTACHMENT0,at.TEXTURE_CUBE_MAP_POSITIVE_X+ot,0);textureNeedsGenerateMipmaps(ut)&&generateMipmap(at.TEXTURE_CUBE_MAP),ot.unbindTexture()}else if(iu){for(let ut=0,sc=wc.length;ut<sc;ut++){const sc=wc[ut],oc=Hl.get(sc);ot.bindTexture(at.TEXTURE_2D,oc.__webglTexture),setTextureParameters(at.TEXTURE_2D,sc),setupFrameBufferTexture(rc.__webglFramebuffer,st,sc,at.COLOR_ATTACHMENT0+ut,at.TEXTURE_2D,0),textureNeedsGenerateMipmaps(sc)&&generateMipmap(at.TEXTURE_2D)}ot.unbindTexture()}else{let Hl=at.TEXTURE_2D;if((st.isWebGL3DRenderTarget||st.isWebGLArrayRenderTarget)&&(Hl=st.isWebGL3DRenderTarget?at.TEXTURE_3D:at.TEXTURE_2D_ARRAY),ot.bindTexture(Hl,_c.__webglTexture),setTextureParameters(Hl,ut),ut.mipmaps&&ut.mipmaps.length>0)for(let ot=0;ot<ut.mipmaps.length;ot++)setupFrameBufferTexture(rc.__webglFramebuffer[ot],st,ut,at.COLOR_ATTACHMENT0,Hl,ot);else setupFrameBufferTexture(rc.__webglFramebuffer,st,ut,at.COLOR_ATTACHMENT0,Hl,0);textureNeedsGenerateMipmaps(ut)&&generateMipmap(Hl),ot.unbindTexture()}st.depthBuffer&&setupDepthRenderbuffer(st)},this.updateRenderTargetMipmap=function(at){const st=at.textures;for(let ut=0,rc=st.length;ut<rc;ut++){const rc=st[ut];if(textureNeedsGenerateMipmaps(rc)){const st=getTargetType(at),ut=Hl.get(rc).__webglTexture;ot.bindTexture(st,ut),generateMipmap(st),ot.unbindTexture()}}},this.updateMultisampleRenderTarget=function(st){if(st.samples>0)if(!1===useMultisampledRTT(st)){const ut=st.textures,rc=st.width,sc=st.height;let oc=at.COLOR_BUFFER_BIT;const _c=st.stencilBuffer?at.DEPTH_STENCIL_ATTACHMENT:at.DEPTH_ATTACHMENT,Sc=Hl.get(st),iu=ut.length>1;if(iu)for(let st=0;st<ut.length;st++)ot.bindFramebuffer(at.FRAMEBUFFER,Sc.__webglMultisampledFramebuffer),at.framebufferRenderbuffer(at.FRAMEBUFFER,at.COLOR_ATTACHMENT0+st,at.RENDERBUFFER,null),ot.bindFramebuffer(at.FRAMEBUFFER,Sc.__webglFramebuffer),at.framebufferTexture2D(at.DRAW_FRAMEBUFFER,at.COLOR_ATTACHMENT0+st,at.TEXTURE_2D,null,0);ot.bindFramebuffer(at.READ_FRAMEBUFFER,Sc.__webglMultisampledFramebuffer),ot.bindFramebuffer(at.DRAW_FRAMEBUFFER,Sc.__webglFramebuffer);for(let ot=0;ot<ut.length;ot++){if(st.resolveDepthBuffer&&(st.depthBuffer&&(oc|=at.DEPTH_BUFFER_BIT),st.stencilBuffer&&st.resolveStencilBuffer&&(oc|=at.STENCIL_BUFFER_BIT)),iu){at.framebufferRenderbuffer(at.READ_FRAMEBUFFER,at.COLOR_ATTACHMENT0,at.RENDERBUFFER,Sc.__webglColorRenderbuffer[ot]);const st=Hl.get(ut[ot]).__webglTexture;at.framebufferTexture2D(at.DRAW_FRAMEBUFFER,at.COLOR_ATTACHMENT0,at.TEXTURE_2D,st,0)}at.blitFramebuffer(0,0,rc,sc,0,0,rc,sc,oc,at.NEAREST),!0===wc&&(Au.length=0,yu.length=0,Au.push(at.COLOR_ATTACHMENT0+ot),st.depthBuffer&&!1===st.resolveDepthBuffer&&(Au.push(_c),yu.push(_c),at.invalidateFramebuffer(at.DRAW_FRAMEBUFFER,yu)),at.invalidateFramebuffer(at.READ_FRAMEBUFFER,Au))}if(ot.bindFramebuffer(at.READ_FRAMEBUFFER,null),ot.bindFramebuffer(at.DRAW_FRAMEBUFFER,null),iu)for(let st=0;st<ut.length;st++){ot.bindFramebuffer(at.FRAMEBUFFER,Sc.__webglMultisampledFramebuffer),at.framebufferRenderbuffer(at.FRAMEBUFFER,at.COLOR_ATTACHMENT0+st,at.RENDERBUFFER,Sc.__webglColorRenderbuffer[st]);const rc=Hl.get(ut[st]).__webglTexture;ot.bindFramebuffer(at.FRAMEBUFFER,Sc.__webglFramebuffer),at.framebufferTexture2D(at.DRAW_FRAMEBUFFER,at.COLOR_ATTACHMENT0+st,at.TEXTURE_2D,rc,0)}ot.bindFramebuffer(at.DRAW_FRAMEBUFFER,Sc.__webglMultisampledFramebuffer)}else if(st.depthBuffer&&!1===st.resolveDepthBuffer&&wc){const ot=st.stencilBuffer?at.DEPTH_STENCIL_ATTACHMENT:at.DEPTH_ATTACHMENT;at.invalidateFramebuffer(at.DRAW_FRAMEBUFFER,[ot])}},this.setupDepthRenderbuffer=setupDepthRenderbuffer,this.setupFrameBufferTexture=setupFrameBufferTexture,this.useMultisampledRTT=useMultisampledRTT}function WebGLUtils(at,st){return{convert:function(ot,Hl){let rc;void 0===Hl&&(Hl=ut.jf0);const sc=ut.ppV.getTransfer(Hl);if(ot===ut.OUM)return at.UNSIGNED_BYTE;if(ot===ut.Wew)return at.UNSIGNED_SHORT_4_4_4_4;if(ot===ut.gJ2)return at.UNSIGNED_SHORT_5_5_5_1;if(ot===ut.Dmk)return at.UNSIGNED_INT_5_9_9_9_REV;if(ot===ut.tJf)return at.BYTE;if(ot===ut.fBL)return at.SHORT;if(ot===ut.cHt)return at.UNSIGNED_SHORT;if(ot===ut.Yuy)return at.INT;if(ot===ut.bkx)return at.UNSIGNED_INT;if(ot===ut.RQf)return at.FLOAT;if(ot===ut.ix0)return at.HALF_FLOAT;if(ot===ut.wrO)return at.ALPHA;if(ot===ut.HIg)return at.RGB;if(ot===ut.GWd)return at.RGBA;if(ot===ut.Kzv)return at.LUMINANCE;if(ot===ut.CMB)return at.LUMINANCE_ALPHA;if(ot===ut.zdS)return at.DEPTH_COMPONENT;if(ot===ut.dcC)return at.DEPTH_STENCIL;if(ot===ut.VT0)return at.RED;if(ot===ut.ZQM)return at.RED_INTEGER;if(ot===ut.paN)return at.RG;if(ot===ut.TkQ)return at.RG_INTEGER;if(ot===ut.c90)return at.RGBA_INTEGER;if(ot===ut.IE4||ot===ut.Nz6||ot===ut.jR7||ot===ut.BXX)if(sc===ut.KLL){if(rc=st.get("WEBGL_compressed_texture_s3tc_srgb"),null===rc)return null;if(ot===ut.IE4)return rc.COMPRESSED_SRGB_S3TC_DXT1_EXT;if(ot===ut.Nz6)return rc.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;if(ot===ut.jR7)return rc.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;if(ot===ut.BXX)return rc.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT}else{if(rc=st.get("WEBGL_compressed_texture_s3tc"),null===rc)return null;if(ot===ut.IE4)return rc.COMPRESSED_RGB_S3TC_DXT1_EXT;if(ot===ut.Nz6)return rc.COMPRESSED_RGBA_S3TC_DXT1_EXT;if(ot===ut.jR7)return rc.COMPRESSED_RGBA_S3TC_DXT3_EXT;if(ot===ut.BXX)return rc.COMPRESSED_RGBA_S3TC_DXT5_EXT}if(ot===ut.k6Q||ot===ut.kTp||ot===ut.HXV||ot===ut.pBf){if(rc=st.get("WEBGL_compressed_texture_pvrtc"),null===rc)return null;if(ot===ut.k6Q)return rc.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;if(ot===ut.kTp)return rc.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;if(ot===ut.HXV)return rc.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;if(ot===ut.pBf)return rc.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG}if(ot===ut.CVz||ot===ut.Riy||ot===ut.KDk){if(rc=st.get("WEBGL_compressed_texture_etc"),null===rc)return null;if(ot===ut.CVz||ot===ut.Riy)return sc===ut.KLL?rc.COMPRESSED_SRGB8_ETC2:rc.COMPRESSED_RGB8_ETC2;if(ot===ut.KDk)return sc===ut.KLL?rc.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:rc.COMPRESSED_RGBA8_ETC2_EAC}if(ot===ut.qa3||ot===ut.B_h||ot===ut.czI||ot===ut.rSH||ot===ut.Qrf||ot===ut.psI||ot===ut.a5J||ot===ut._QJ||ot===ut.uB5||ot===ut.lyL||ot===ut.bC7||ot===ut.y3Z||ot===ut.ojs||ot===ut.S$4){if(rc=st.get("WEBGL_compressed_texture_astc"),null===rc)return null;if(ot===ut.qa3)return sc===ut.KLL?rc.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR:rc.COMPRESSED_RGBA_ASTC_4x4_KHR;if(ot===ut.B_h)return sc===ut.KLL?rc.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR:rc.COMPRESSED_RGBA_ASTC_5x4_KHR;if(ot===ut.czI)return sc===ut.KLL?rc.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR:rc.COMPRESSED_RGBA_ASTC_5x5_KHR;if(ot===ut.rSH)return sc===ut.KLL?rc.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR:rc.COMPRESSED_RGBA_ASTC_6x5_KHR;if(ot===ut.Qrf)return sc===ut.KLL?rc.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR:rc.COMPRESSED_RGBA_ASTC_6x6_KHR;if(ot===ut.psI)return sc===ut.KLL?rc.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR:rc.COMPRESSED_RGBA_ASTC_8x5_KHR;if(ot===ut.a5J)return sc===ut.KLL?rc.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR:rc.COMPRESSED_RGBA_ASTC_8x6_KHR;if(ot===ut._QJ)return sc===ut.KLL?rc.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR:rc.COMPRESSED_RGBA_ASTC_8x8_KHR;if(ot===ut.uB5)return sc===ut.KLL?rc.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR:rc.COMPRESSED_RGBA_ASTC_10x5_KHR;if(ot===ut.lyL)return sc===ut.KLL?rc.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR:rc.COMPRESSED_RGBA_ASTC_10x6_KHR;if(ot===ut.bC7)return sc===ut.KLL?rc.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR:rc.COMPRESSED_RGBA_ASTC_10x8_KHR;if(ot===ut.y3Z)return sc===ut.KLL?rc.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR:rc.COMPRESSED_RGBA_ASTC_10x10_KHR;if(ot===ut.ojs)return sc===ut.KLL?rc.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR:rc.COMPRESSED_RGBA_ASTC_12x10_KHR;if(ot===ut.S$4)return sc===ut.KLL?rc.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR:rc.COMPRESSED_RGBA_ASTC_12x12_KHR}if(ot===ut.Fn||ot===ut.H23||ot===ut.W9U){if(rc=st.get("EXT_texture_compression_bptc"),null===rc)return null;if(ot===ut.Fn)return sc===ut.KLL?rc.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT:rc.COMPRESSED_RGBA_BPTC_UNORM_EXT;if(ot===ut.H23)return rc.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;if(ot===ut.W9U)return rc.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT}if(ot===ut.Kef||ot===ut.XG_||ot===ut.HO_||ot===ut.CWW){if(rc=st.get("EXT_texture_compression_rgtc"),null===rc)return null;if(ot===ut.Fn)return rc.COMPRESSED_RED_RGTC1_EXT;if(ot===ut.XG_)return rc.COMPRESSED_SIGNED_RED_RGTC1_EXT;if(ot===ut.HO_)return rc.COMPRESSED_RED_GREEN_RGTC2_EXT;if(ot===ut.CWW)return rc.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT}return ot===ut.V3x?at.UNSIGNED_INT_24_8:void 0!==at[ot]?at[ot]:null}}}class WebXRDepthSensing{constructor(){this.texture=null,this.mesh=null,this.depthNear=0,this.depthFar=0}init(at,st,ot){if(null===this.texture){const Hl=new ut.gPd;at.properties.get(Hl).__webglTexture=st.texture,st.depthNear===ot.depthNear&&st.depthFar===ot.depthFar||(this.depthNear=st.depthNear,this.depthFar=st.depthFar),this.texture=Hl}}getMesh(at){if(null!==this.texture&&null===this.mesh){const st=at.cameras[0].viewport,ot=new ut.BKk({vertexShader:"\nvoid main() {\n\n\tgl_Position = vec4( position, 1.0 );\n\n}",fragmentShader:"\nuniform sampler2DArray depthColor;\nuniform float depthWidth;\nuniform float depthHeight;\n\nvoid main() {\n\n\tvec2 coord = vec2( gl_FragCoord.x / depthWidth, gl_FragCoord.y / depthHeight );\n\n\tif ( coord.x >= 1.0 ) {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x - 1.0, coord.y, 1 ) ).r;\n\n\t} else {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x, coord.y, 0 ) ).r;\n\n\t}\n\n}",uniforms:{depthColor:{value:this.texture},depthWidth:{value:st.z},depthHeight:{value:st.w}}});this.mesh=new ut.eaF(new ut.bdM(20,20),ot)}return this.mesh}reset(){this.texture=null,this.mesh=null}getDepthTexture(){return this.texture}}class WebXRManager extends ut.Qev{constructor(at,st){super();const ot=this;let Hl=null,rc=1,sc=null,oc="local-floor",_c=1,wc=null,Sc=null,iu=null,su=null,lu=null,cu=null;const uu=new WebXRDepthSensing,pu=st.getContextAttributes();let mu=null,gu=null;const Au=[],yu=[],_u=new ut.I9Y;let xu=null;const Su=new ut.ubm;Su.viewport=new ut.IUQ;const Du=new ut.ubm;Du.viewport=new ut.IUQ;const Lu=[Su,Du],$u=new ut.nZQ;let hh=null,ed=null;function onSessionEvent(at){const st=yu.indexOf(at.inputSource);if(-1===st)return;const ot=Au[st];void 0!==ot&&(ot.update(at.inputSource,at.frame,wc||sc),ot.dispatchEvent({type:at.type,data:at.inputSource}))}function onSessionEnd(){Hl.removeEventListener("select",onSessionEvent),Hl.removeEventListener("selectstart",onSessionEvent),Hl.removeEventListener("selectend",onSessionEvent),Hl.removeEventListener("squeeze",onSessionEvent),Hl.removeEventListener("squeezestart",onSessionEvent),Hl.removeEventListener("squeezeend",onSessionEvent),Hl.removeEventListener("end",onSessionEnd),Hl.removeEventListener("inputsourceschange",onInputSourcesChange);for(let at=0;at<Au.length;at++){const st=yu[at];null!==st&&(yu[at]=null,Au[at].disconnect(st))}hh=null,ed=null,uu.reset(),at.setRenderTarget(mu),lu=null,su=null,iu=null,Hl=null,gu=null,rd.stop(),ot.isPresenting=!1,at.setPixelRatio(xu),at.setSize(_u.width,_u.height,!1),ot.dispatchEvent({type:"sessionend"})}function onInputSourcesChange(at){for(let st=0;st<at.removed.length;st++){const ot=at.removed[st],ut=yu.indexOf(ot);ut>=0&&(yu[ut]=null,Au[ut].disconnect(ot))}for(let st=0;st<at.added.length;st++){const ot=at.added[st];let ut=yu.indexOf(ot);if(-1===ut){for(let at=0;at<Au.length;at++){if(at>=yu.length){yu.push(ot),ut=at;break}if(null===yu[at]){yu[at]=ot,ut=at;break}}if(-1===ut)break}const Hl=Au[ut];Hl&&Hl.connect(ot)}}this.cameraAutoUpdate=!0,this.enabled=!1,this.isPresenting=!1,this.getController=function(at){let st=Au[at];return void 0===st&&(st=new ut.R3r,Au[at]=st),st.getTargetRaySpace()},this.getControllerGrip=function(at){let st=Au[at];return void 0===st&&(st=new ut.R3r,Au[at]=st),st.getGripSpace()},this.getHand=function(at){let st=Au[at];return void 0===st&&(st=new ut.R3r,Au[at]=st),st.getHandSpace()},this.setFramebufferScaleFactor=function(at){rc=at,!0===ot.isPresenting&&console.warn("THREE.WebXRManager: Cannot change framebuffer scale while presenting.")},this.setReferenceSpaceType=function(at){oc=at,!0===ot.isPresenting&&console.warn("THREE.WebXRManager: Cannot change reference space type while presenting.")},this.getReferenceSpace=function(){return wc||sc},this.setReferenceSpace=function(at){wc=at},this.getBaseLayer=function(){return null!==su?su:lu},this.getBinding=function(){return iu},this.getFrame=function(){return cu},this.getSession=function(){return Hl},this.setSession=async function(Sc){if(Hl=Sc,null!==Hl){mu=at.getRenderTarget(),Hl.addEventListener("select",onSessionEvent),Hl.addEventListener("selectstart",onSessionEvent),Hl.addEventListener("selectend",onSessionEvent),Hl.addEventListener("squeeze",onSessionEvent),Hl.addEventListener("squeezestart",onSessionEvent),Hl.addEventListener("squeezeend",onSessionEvent),Hl.addEventListener("end",onSessionEnd),Hl.addEventListener("inputsourceschange",onInputSourcesChange),!0!==pu.xrCompatible&&await st.makeXRCompatible(),xu=at.getPixelRatio(),at.getSize(_u);if("undefined"!==typeof XRWebGLBinding&&"createProjectionLayer"in XRWebGLBinding.prototype){let ot=null,sc=null,oc=null;pu.depth&&(oc=pu.stencil?st.DEPTH24_STENCIL8:st.DEPTH_COMPONENT24,ot=pu.stencil?ut.dcC:ut.zdS,sc=pu.stencil?ut.V3x:ut.bkx);const _c={colorFormat:st.RGBA8,depthFormat:oc,scaleFactor:rc};iu=new XRWebGLBinding(Hl,st),su=iu.createProjectionLayer(_c),Hl.updateRenderState({layers:[su]}),at.setPixelRatio(1),at.setSize(su.textureWidth,su.textureHeight,!1),gu=new ut.nWS(su.textureWidth,su.textureHeight,{format:ut.GWd,type:ut.OUM,depthTexture:new ut.VCu(su.textureWidth,su.textureHeight,sc,void 0,void 0,void 0,void 0,void 0,void 0,ot),stencilBuffer:pu.stencil,colorSpace:at.outputColorSpace,samples:pu.antialias?4:0,resolveDepthBuffer:!1===su.ignoreDepthValues,resolveStencilBuffer:!1===su.ignoreDepthValues})}else{const ot={antialias:pu.antialias,alpha:!0,depth:pu.depth,stencil:pu.stencil,framebufferScaleFactor:rc};lu=new XRWebGLLayer(Hl,st,ot),Hl.updateRenderState({baseLayer:lu}),at.setPixelRatio(1),at.setSize(lu.framebufferWidth,lu.framebufferHeight,!1),gu=new ut.nWS(lu.framebufferWidth,lu.framebufferHeight,{format:ut.GWd,type:ut.OUM,colorSpace:at.outputColorSpace,stencilBuffer:pu.stencil,resolveDepthBuffer:!1===lu.ignoreDepthValues,resolveStencilBuffer:!1===lu.ignoreDepthValues})}gu.isXRRenderTarget=!0,this.setFoveation(_c),wc=null,sc=await Hl.requestReferenceSpace(oc),rd.setContext(Hl),rd.start(),ot.isPresenting=!0,ot.dispatchEvent({type:"sessionstart"})}},this.getEnvironmentBlendMode=function(){if(null!==Hl)return Hl.environmentBlendMode},this.getDepthTexture=function(){return uu.getDepthTexture()};const td=new ut.Pq0,id=new ut.Pq0;function updateCamera(at,st){null===st?at.matrixWorld.copy(at.matrix):at.matrixWorld.multiplyMatrices(st.matrixWorld,at.matrix),at.matrixWorldInverse.copy(at.matrixWorld).invert()}this.updateCamera=function(at){if(null===Hl)return;let st=at.near,ot=at.far;null!==uu.texture&&(uu.depthNear>0&&(st=uu.depthNear),uu.depthFar>0&&(ot=uu.depthFar)),$u.near=Du.near=Su.near=st,$u.far=Du.far=Su.far=ot,hh===$u.near&&ed===$u.far||(Hl.updateRenderState({depthNear:$u.near,depthFar:$u.far}),hh=$u.near,ed=$u.far),Su.layers.mask=2|at.layers.mask,Du.layers.mask=4|at.layers.mask,$u.layers.mask=Su.layers.mask|Du.layers.mask;const rc=at.parent,sc=$u.cameras;updateCamera($u,rc);for(let ut=0;ut<sc.length;ut++)updateCamera(sc[ut],rc);2===sc.length?function(at,st,ot){td.setFromMatrixPosition(st.matrixWorld),id.setFromMatrixPosition(ot.matrixWorld);const ut=td.distanceTo(id),Hl=st.projectionMatrix.elements,rc=ot.projectionMatrix.elements,sc=Hl[14]/(Hl[10]-1),oc=Hl[14]/(Hl[10]+1),_c=(Hl[9]+1)/Hl[5],wc=(Hl[9]-1)/Hl[5],Sc=(Hl[8]-1)/Hl[0],iu=(rc[8]+1)/rc[0],su=sc*Sc,lu=sc*iu,cu=ut/(-Sc+iu),uu=cu*-Sc;if(st.matrixWorld.decompose(at.position,at.quaternion,at.scale),at.translateX(uu),at.translateZ(cu),at.matrixWorld.compose(at.position,at.quaternion,at.scale),at.matrixWorldInverse.copy(at.matrixWorld).invert(),-1===Hl[10])at.projectionMatrix.copy(st.projectionMatrix),at.projectionMatrixInverse.copy(st.projectionMatrixInverse);else{const st=sc+cu,ot=oc+cu,Hl=su-uu,rc=lu+(ut-uu),Sc=_c*oc/ot*st,iu=wc*oc/ot*st;at.projectionMatrix.makePerspective(Hl,rc,Sc,iu,st,ot),at.projectionMatrixInverse.copy(at.projectionMatrix).invert()}}($u,Su,Du):$u.projectionMatrix.copy(Su.projectionMatrix),function(at,st,ot){null===ot?at.matrix.copy(st.matrixWorld):(at.matrix.copy(ot.matrixWorld),at.matrix.invert(),at.matrix.multiply(st.matrixWorld));at.matrix.decompose(at.position,at.quaternion,at.scale),at.updateMatrixWorld(!0),at.projectionMatrix.copy(st.projectionMatrix),at.projectionMatrixInverse.copy(st.projectionMatrixInverse),at.isPerspectiveCamera&&(at.fov=2*ut.a55*Math.atan(1/at.projectionMatrix.elements[5]),at.zoom=1)}(at,$u,rc)},this.getCamera=function(){return $u},this.getFoveation=function(){if(null!==su||null!==lu)return _c},this.setFoveation=function(at){_c=at,null!==su&&(su.fixedFoveation=at),null!==lu&&void 0!==lu.fixedFoveation&&(lu.fixedFoveation=at)},this.hasDepthSensing=function(){return null!==uu.texture},this.getDepthSensingMesh=function(){return uu.getMesh($u)};let nd=null;const rd=new WebGLAnimation;rd.setAnimationLoop((function(st,rc){if(Sc=rc.getViewerPose(wc||sc),cu=rc,null!==Sc){const st=Sc.views;null!==lu&&(at.setRenderTargetFramebuffer(gu,lu.framebuffer),at.setRenderTarget(gu));let ot=!1;st.length!==$u.cameras.length&&($u.cameras.length=0,ot=!0);for(let Hl=0;Hl<st.length;Hl++){const rc=st[Hl];let sc=null;if(null!==lu)sc=lu.getViewport(rc);else{const st=iu.getViewSubImage(su,rc);sc=st.viewport,0===Hl&&(at.setRenderTargetTextures(gu,st.colorTexture,st.depthStencilTexture),at.setRenderTarget(gu))}let oc=Lu[Hl];void 0===oc&&(oc=new ut.ubm,oc.layers.enable(Hl),oc.viewport=new ut.IUQ,Lu[Hl]=oc),oc.matrix.fromArray(rc.transform.matrix),oc.matrix.decompose(oc.position,oc.quaternion,oc.scale),oc.projectionMatrix.fromArray(rc.projectionMatrix),oc.projectionMatrixInverse.copy(oc.projectionMatrix).invert(),oc.viewport.set(sc.x,sc.y,sc.width,sc.height),0===Hl&&($u.matrix.copy(oc.matrix),$u.matrix.decompose($u.position,$u.quaternion,$u.scale)),!0===ot&&$u.cameras.push(oc)}const rc=Hl.enabledFeatures;if(rc&&rc.includes("depth-sensing")&&"gpu-optimized"==Hl.depthUsage&&iu){const ot=iu.getDepthInformation(st[0]);ot&&ot.isValid&&ot.texture&&uu.init(at,ot,Hl.renderState)}}for(let at=0;at<Au.length;at++){const st=yu[at],ot=Au[at];null!==st&&void 0!==ot&&ot.update(st,rc,wc||sc)}nd&&nd(st,rc),rc.detectedPlanes&&ot.dispatchEvent({type:"planesdetected",data:rc}),cu=null})),this.setAnimationLoop=function(at){nd=at},this.dispose=function(){}}}const md=new ut.O9p,fd=new ut.kn4;function WebGLMaterials(at,st){function refreshTransformUniform(at,st){!0===at.matrixAutoUpdate&&at.updateMatrix(),st.value.copy(at.matrix)}function refreshUniformsCommon(at,ot){at.opacity.value=ot.opacity,ot.color&&at.diffuse.value.copy(ot.color),ot.emissive&&at.emissive.value.copy(ot.emissive).multiplyScalar(ot.emissiveIntensity),ot.map&&(at.map.value=ot.map,refreshTransformUniform(ot.map,at.mapTransform)),ot.alphaMap&&(at.alphaMap.value=ot.alphaMap,refreshTransformUniform(ot.alphaMap,at.alphaMapTransform)),ot.bumpMap&&(at.bumpMap.value=ot.bumpMap,refreshTransformUniform(ot.bumpMap,at.bumpMapTransform),at.bumpScale.value=ot.bumpScale,ot.side===ut.hsX&&(at.bumpScale.value*=-1)),ot.normalMap&&(at.normalMap.value=ot.normalMap,refreshTransformUniform(ot.normalMap,at.normalMapTransform),at.normalScale.value.copy(ot.normalScale),ot.side===ut.hsX&&at.normalScale.value.negate()),ot.displacementMap&&(at.displacementMap.value=ot.displacementMap,refreshTransformUniform(ot.displacementMap,at.displacementMapTransform),at.displacementScale.value=ot.displacementScale,at.displacementBias.value=ot.displacementBias),ot.emissiveMap&&(at.emissiveMap.value=ot.emissiveMap,refreshTransformUniform(ot.emissiveMap,at.emissiveMapTransform)),ot.specularMap&&(at.specularMap.value=ot.specularMap,refreshTransformUniform(ot.specularMap,at.specularMapTransform)),ot.alphaTest>0&&(at.alphaTest.value=ot.alphaTest);const Hl=st.get(ot),rc=Hl.envMap,sc=Hl.envMapRotation;rc&&(at.envMap.value=rc,md.copy(sc),md.x*=-1,md.y*=-1,md.z*=-1,rc.isCubeTexture&&!1===rc.isRenderTargetTexture&&(md.y*=-1,md.z*=-1),at.envMapRotation.value.setFromMatrix4(fd.makeRotationFromEuler(md)),at.flipEnvMap.value=rc.isCubeTexture&&!1===rc.isRenderTargetTexture?-1:1,at.reflectivity.value=ot.reflectivity,at.ior.value=ot.ior,at.refractionRatio.value=ot.refractionRatio),ot.lightMap&&(at.lightMap.value=ot.lightMap,at.lightMapIntensity.value=ot.lightMapIntensity,refreshTransformUniform(ot.lightMap,at.lightMapTransform)),ot.aoMap&&(at.aoMap.value=ot.aoMap,at.aoMapIntensity.value=ot.aoMapIntensity,refreshTransformUniform(ot.aoMap,at.aoMapTransform))}return{refreshFogUniforms:function(st,ot){ot.color.getRGB(st.fogColor.value,(0,ut._Ut)(at)),ot.isFog?(st.fogNear.value=ot.near,st.fogFar.value=ot.far):ot.isFogExp2&&(st.fogDensity.value=ot.density)},refreshMaterialUniforms:function(at,ot,Hl,rc,sc){ot.isMeshBasicMaterial||ot.isMeshLambertMaterial?refreshUniformsCommon(at,ot):ot.isMeshToonMaterial?(refreshUniformsCommon(at,ot),function(at,st){st.gradientMap&&(at.gradientMap.value=st.gradientMap)}(at,ot)):ot.isMeshPhongMaterial?(refreshUniformsCommon(at,ot),function(at,st){at.specular.value.copy(st.specular),at.shininess.value=Math.max(st.shininess,1e-4)}(at,ot)):ot.isMeshStandardMaterial?(refreshUniformsCommon(at,ot),function(at,st){at.metalness.value=st.metalness,st.metalnessMap&&(at.metalnessMap.value=st.metalnessMap,refreshTransformUniform(st.metalnessMap,at.metalnessMapTransform));at.roughness.value=st.roughness,st.roughnessMap&&(at.roughnessMap.value=st.roughnessMap,refreshTransformUniform(st.roughnessMap,at.roughnessMapTransform));st.envMap&&(at.envMapIntensity.value=st.envMapIntensity)}(at,ot),ot.isMeshPhysicalMaterial&&function(at,st,ot){at.ior.value=st.ior,st.sheen>0&&(at.sheenColor.value.copy(st.sheenColor).multiplyScalar(st.sheen),at.sheenRoughness.value=st.sheenRoughness,st.sheenColorMap&&(at.sheenColorMap.value=st.sheenColorMap,refreshTransformUniform(st.sheenColorMap,at.sheenColorMapTransform)),st.sheenRoughnessMap&&(at.sheenRoughnessMap.value=st.sheenRoughnessMap,refreshTransformUniform(st.sheenRoughnessMap,at.sheenRoughnessMapTransform)));st.clearcoat>0&&(at.clearcoat.value=st.clearcoat,at.clearcoatRoughness.value=st.clearcoatRoughness,st.clearcoatMap&&(at.clearcoatMap.value=st.clearcoatMap,refreshTransformUniform(st.clearcoatMap,at.clearcoatMapTransform)),st.clearcoatRoughnessMap&&(at.clearcoatRoughnessMap.value=st.clearcoatRoughnessMap,refreshTransformUniform(st.clearcoatRoughnessMap,at.clearcoatRoughnessMapTransform)),st.clearcoatNormalMap&&(at.clearcoatNormalMap.value=st.clearcoatNormalMap,refreshTransformUniform(st.clearcoatNormalMap,at.clearcoatNormalMapTransform),at.clearcoatNormalScale.value.copy(st.clearcoatNormalScale),st.side===ut.hsX&&at.clearcoatNormalScale.value.negate()));st.dispersion>0&&(at.dispersion.value=st.dispersion);st.iridescence>0&&(at.iridescence.value=st.iridescence,at.iridescenceIOR.value=st.iridescenceIOR,at.iridescenceThicknessMinimum.value=st.iridescenceThicknessRange[0],at.iridescenceThicknessMaximum.value=st.iridescenceThicknessRange[1],st.iridescenceMap&&(at.iridescenceMap.value=st.iridescenceMap,refreshTransformUniform(st.iridescenceMap,at.iridescenceMapTransform)),st.iridescenceThicknessMap&&(at.iridescenceThicknessMap.value=st.iridescenceThicknessMap,refreshTransformUniform(st.iridescenceThicknessMap,at.iridescenceThicknessMapTransform)));st.transmission>0&&(at.transmission.value=st.transmission,at.transmissionSamplerMap.value=ot.texture,at.transmissionSamplerSize.value.set(ot.width,ot.height),st.transmissionMap&&(at.transmissionMap.value=st.transmissionMap,refreshTransformUniform(st.transmissionMap,at.transmissionMapTransform)),at.thickness.value=st.thickness,st.thicknessMap&&(at.thicknessMap.value=st.thicknessMap,refreshTransformUniform(st.thicknessMap,at.thicknessMapTransform)),at.attenuationDistance.value=st.attenuationDistance,at.attenuationColor.value.copy(st.attenuationColor));st.anisotropy>0&&(at.anisotropyVector.value.set(st.anisotropy*Math.cos(st.anisotropyRotation),st.anisotropy*Math.sin(st.anisotropyRotation)),st.anisotropyMap&&(at.anisotropyMap.value=st.anisotropyMap,refreshTransformUniform(st.anisotropyMap,at.anisotropyMapTransform)));at.specularIntensity.value=st.specularIntensity,at.specularColor.value.copy(st.specularColor),st.specularColorMap&&(at.specularColorMap.value=st.specularColorMap,refreshTransformUniform(st.specularColorMap,at.specularColorMapTransform));st.specularIntensityMap&&(at.specularIntensityMap.value=st.specularIntensityMap,refreshTransformUniform(st.specularIntensityMap,at.specularIntensityMapTransform))}(at,ot,sc)):ot.isMeshMatcapMaterial?(refreshUniformsCommon(at,ot),function(at,st){st.matcap&&(at.matcap.value=st.matcap)}(at,ot)):ot.isMeshDepthMaterial?refreshUniformsCommon(at,ot):ot.isMeshDistanceMaterial?(refreshUniformsCommon(at,ot),function(at,ot){const ut=st.get(ot).light;at.referencePosition.value.setFromMatrixPosition(ut.matrixWorld),at.nearDistance.value=ut.shadow.camera.near,at.farDistance.value=ut.shadow.camera.far}(at,ot)):ot.isMeshNormalMaterial?refreshUniformsCommon(at,ot):ot.isLineBasicMaterial?(function(at,st){at.diffuse.value.copy(st.color),at.opacity.value=st.opacity,st.map&&(at.map.value=st.map,refreshTransformUniform(st.map,at.mapTransform))}(at,ot),ot.isLineDashedMaterial&&function(at,st){at.dashSize.value=st.dashSize,at.totalSize.value=st.dashSize+st.gapSize,at.scale.value=st.scale}(at,ot)):ot.isPointsMaterial?function(at,st,ot,ut){at.diffuse.value.copy(st.color),at.opacity.value=st.opacity,at.size.value=st.size*ot,at.scale.value=.5*ut,st.map&&(at.map.value=st.map,refreshTransformUniform(st.map,at.uvTransform));st.alphaMap&&(at.alphaMap.value=st.alphaMap,refreshTransformUniform(st.alphaMap,at.alphaMapTransform));st.alphaTest>0&&(at.alphaTest.value=st.alphaTest)}(at,ot,Hl,rc):ot.isSpriteMaterial?function(at,st){at.diffuse.value.copy(st.color),at.opacity.value=st.opacity,at.rotation.value=st.rotation,st.map&&(at.map.value=st.map,refreshTransformUniform(st.map,at.mapTransform));st.alphaMap&&(at.alphaMap.value=st.alphaMap,refreshTransformUniform(st.alphaMap,at.alphaMapTransform));st.alphaTest>0&&(at.alphaTest.value=st.alphaTest)}(at,ot):ot.isShadowMaterial?(at.color.value.copy(ot.color),at.opacity.value=ot.opacity):ot.isShaderMaterial&&(ot.uniformsNeedUpdate=!1)}}}function WebGLUniformsGroups(at,st,ot,ut){let Hl={},rc={},sc=[];const oc=at.getParameter(at.MAX_UNIFORM_BUFFER_BINDINGS);function hasUniformChanged(at,st,ot,ut){const Hl=at.value,rc=st+"_"+ot;if(void 0===ut[rc])return ut[rc]="number"===typeof Hl||"boolean"===typeof Hl?Hl:Hl.clone(),!0;{const at=ut[rc];if("number"===typeof Hl||"boolean"===typeof Hl){if(at!==Hl)return ut[rc]=Hl,!0}else if(!1===at.equals(Hl))return at.copy(Hl),!0}return!1}function getUniformSize(at){const st={boundary:0,storage:0};return"number"===typeof at||"boolean"===typeof at?(st.boundary=4,st.storage=4):at.isVector2?(st.boundary=8,st.storage=8):at.isVector3||at.isColor?(st.boundary=16,st.storage=12):at.isVector4?(st.boundary=16,st.storage=16):at.isMatrix3?(st.boundary=48,st.storage=48):at.isMatrix4?(st.boundary=64,st.storage=64):at.isTexture?console.warn("THREE.WebGLRenderer: Texture samplers can not be part of an uniforms group."):console.warn("THREE.WebGLRenderer: Unsupported uniform value type.",at),st}function onUniformsGroupsDispose(st){const ot=st.target;ot.removeEventListener("dispose",onUniformsGroupsDispose);const ut=sc.indexOf(ot.__bindingPointIndex);sc.splice(ut,1),at.deleteBuffer(Hl[ot.id]),delete Hl[ot.id],delete rc[ot.id]}return{bind:function(at,st){const ot=st.program;ut.uniformBlockBinding(at,ot)},update:function(ot,_c){let wc=Hl[ot.id];void 0===wc&&(!function(at){const st=at.uniforms;let ot=0;const ut=16;for(let rc=0,sc=st.length;rc<sc;rc++){const at=Array.isArray(st[rc])?st[rc]:[st[rc]];for(let st=0,Hl=at.length;st<Hl;st++){const Hl=at[st],rc=Array.isArray(Hl.value)?Hl.value:[Hl.value];for(let at=0,st=rc.length;at<st;at++){const st=getUniformSize(rc[at]),sc=ot%ut,oc=sc%st.boundary,_c=sc+oc;ot+=oc,0!==_c&&ut-_c<st.storage&&(ot+=ut-_c),Hl.__data=new Float32Array(st.storage/Float32Array.BYTES_PER_ELEMENT),Hl.__offset=ot,ot+=st.storage}}}const Hl=ot%ut;Hl>0&&(ot+=ut-Hl);at.__size=ot,at.__cache={}}(ot),wc=function(st){const ot=function(){for(let at=0;at<oc;at++)if(-1===sc.indexOf(at))return sc.push(at),at;return console.error("THREE.WebGLRenderer: Maximum number of simultaneously usable uniforms groups reached."),0}();st.__bindingPointIndex=ot;const ut=at.createBuffer(),Hl=st.__size,rc=st.usage;return at.bindBuffer(at.UNIFORM_BUFFER,ut),at.bufferData(at.UNIFORM_BUFFER,Hl,rc),at.bindBuffer(at.UNIFORM_BUFFER,null),at.bindBufferBase(at.UNIFORM_BUFFER,ot,ut),ut}(ot),Hl[ot.id]=wc,ot.addEventListener("dispose",onUniformsGroupsDispose));const Sc=_c.program;ut.updateUBOMapping(ot,Sc);const iu=st.render.frame;rc[ot.id]!==iu&&(!function(st){const ot=Hl[st.id],ut=st.uniforms,rc=st.__cache;at.bindBuffer(at.UNIFORM_BUFFER,ot);for(let Hl=0,sc=ut.length;Hl<sc;Hl++){const st=Array.isArray(ut[Hl])?ut[Hl]:[ut[Hl]];for(let ot=0,ut=st.length;ot<ut;ot++){const ut=st[ot];if(!0===hasUniformChanged(ut,Hl,ot,rc)){const st=ut.__offset,ot=Array.isArray(ut.value)?ut.value:[ut.value];let Hl=0;for(let rc=0;rc<ot.length;rc++){const sc=ot[rc],oc=getUniformSize(sc);"number"===typeof sc||"boolean"===typeof sc?(ut.__data[0]=sc,at.bufferSubData(at.UNIFORM_BUFFER,st+Hl,ut.__data)):sc.isMatrix3?(ut.__data[0]=sc.elements[0],ut.__data[1]=sc.elements[1],ut.__data[2]=sc.elements[2],ut.__data[3]=0,ut.__data[4]=sc.elements[3],ut.__data[5]=sc.elements[4],ut.__data[6]=sc.elements[5],ut.__data[7]=0,ut.__data[8]=sc.elements[6],ut.__data[9]=sc.elements[7],ut.__data[10]=sc.elements[8],ut.__data[11]=0):(sc.toArray(ut.__data,Hl),Hl+=oc.storage/Float32Array.BYTES_PER_ELEMENT)}at.bufferSubData(at.UNIFORM_BUFFER,st,ut.__data)}}}at.bindBuffer(at.UNIFORM_BUFFER,null)}(ot),rc[ot.id]=iu)},dispose:function(){for(const st in Hl)at.deleteBuffer(Hl[st]);sc=[],Hl={},rc={}}}}class WebGLRenderer{constructor(at){void 0===at&&(at={});const{canvas:st=(0,ut.lPF)(),context:ot=null,depth:Hl=!0,stencil:rc=!1,alpha:sc=!1,antialias:oc=!1,premultipliedAlpha:_c=!0,preserveDrawingBuffer:wc=!1,powerPreference:Sc="default",failIfMajorPerformanceCaveat:iu=!1,reverseDepthBuffer:su=!1}=at;let lu;if(this.isWebGLRenderer=!0,null!==ot){if("undefined"!==typeof WebGLRenderingContext&&ot instanceof WebGLRenderingContext)throw new Error("THREE.WebGLRenderer: WebGL 1 is not supported since r163.");lu=ot.getContextAttributes().alpha}else lu=sc;const cu=new Uint32Array(4),uu=new Int32Array(4);let pu=null,mu=null;const gu=[],Au=[];this.domElement=st,this.debug={checkShaderErrors:!0,onShaderError:null},this.autoClear=!0,this.autoClearColor=!0,this.autoClearDepth=!0,this.autoClearStencil=!0,this.sortObjects=!0,this.clippingPlanes=[],this.localClippingEnabled=!1,this.toneMapping=ut.y_p,this.toneMappingExposure=1,this.transmissionResolutionScale=1;const yu=this;let _u=!1;this._outputColorSpace=ut.er$;let xu=0,Su=0,Du=null,Lu=-1,$u=null;const hh=new ut.IUQ,ed=new ut.IUQ;let td=null;const id=new ut.Q1f(0);let nd=0,rd=st.width,ad=st.height,sd=1,od=null,ld=null;const cd=new ut.IUQ(0,0,rd,ad),ud=new ut.IUQ(0,0,rd,ad);let hd=!1;const dd=new ut.PPD;let pd=!1,md=!1;const fd=new ut.kn4,gd=new ut.kn4,Ad=new ut.Pq0,yd=new ut.IUQ,vd={background:null,fog:null,environment:null,overrideMaterial:null,isScene:!0};let _d=!1;function getTargetPixelRatio(){return null===Du?sd:1}let xd,bd,wd,Ed,Md,Sd,Td,Cd,kd,Id,Dd,Ld,Pd,zd,Nd,Rd,Od,Bd,Fd,jd,Ud,Vd,Gd,Zd,Hd=ot;function getContext(at,ot){return st.getContext(at,ot)}try{const at={alpha:!0,depth:Hl,stencil:rc,antialias:oc,premultipliedAlpha:_c,preserveDrawingBuffer:wc,powerPreference:Sc,failIfMajorPerformanceCaveat:iu};if("setAttribute"in st&&st.setAttribute("data-engine",`three.js r${ut.sPf}`),st.addEventListener("webglcontextlost",onContextLost,!1),st.addEventListener("webglcontextrestored",onContextRestore,!1),st.addEventListener("webglcontextcreationerror",onContextCreationError,!1),null===Hd){const st="webgl2";if(Hd=getContext(st,at),null===Hd)throw getContext(st)?new Error("Error creating WebGL context with your selected attributes."):new Error("Error creating WebGL context.")}}catch(Jd){throw console.error("THREE.WebGLRenderer: "+Jd.message),Jd}function initGLContext(){xd=new WebGLExtensions(Hd),xd.init(),Vd=new WebGLUtils(Hd,xd),bd=new WebGLCapabilities(Hd,xd,at,Vd),wd=new WebGLState(Hd,xd),bd.reverseDepthBuffer&&su&&wd.buffers.depth.setReversed(!0),Ed=new WebGLInfo(Hd),Md=new WebGLProperties,Sd=new WebGLTextures(Hd,xd,wd,Md,bd,Vd,Ed),Td=new WebGLCubeMaps(yu),Cd=new WebGLCubeUVMaps(yu),kd=new WebGLAttributes(Hd),Gd=new WebGLBindingStates(Hd,kd),Id=new WebGLGeometries(Hd,kd,Ed,Gd),Dd=new WebGLObjects(Hd,Id,kd,Ed),Fd=new WebGLMorphtargets(Hd,bd,Sd),Rd=new WebGLClipping(Md),Ld=new WebGLPrograms(yu,Td,Cd,xd,bd,Gd,Rd),Pd=new WebGLMaterials(yu,Md),zd=new WebGLRenderLists,Nd=new WebGLRenderStates(xd),Bd=new WebGLBackground(yu,Td,Cd,wd,Dd,lu,_c),Od=new WebGLShadowMap(yu,Dd,bd),Zd=new WebGLUniformsGroups(Hd,Ed,bd,wd),jd=new WebGLBufferRenderer(Hd,xd,Ed),Ud=new WebGLIndexedBufferRenderer(Hd,xd,Ed),Ed.programs=Ld.programs,yu.capabilities=bd,yu.extensions=xd,yu.properties=Md,yu.renderLists=zd,yu.shadowMap=Od,yu.state=wd,yu.info=Ed}initGLContext();const Wd=new WebXRManager(yu,Hd);function onContextLost(at){at.preventDefault(),console.log("THREE.WebGLRenderer: Context Lost."),_u=!0}function onContextRestore(){console.log("THREE.WebGLRenderer: Context Restored."),_u=!1;const at=Ed.autoReset,st=Od.enabled,ot=Od.autoUpdate,ut=Od.needsUpdate,Hl=Od.type;initGLContext(),Ed.autoReset=at,Od.enabled=st,Od.autoUpdate=ot,Od.needsUpdate=ut,Od.type=Hl}function onContextCreationError(at){console.error("THREE.WebGLRenderer: A WebGL context could not be created. Reason: ",at.statusMessage)}function onMaterialDispose(at){const st=at.target;st.removeEventListener("dispose",onMaterialDispose),function(at){(function(at){const st=Md.get(at).programs;void 0!==st&&(st.forEach((function(at){Ld.releaseProgram(at)})),at.isShaderMaterial&&Ld.releaseShaderCache(at))})(at),Md.remove(at)}(st)}function prepareMaterial(at,st,ot){!0===at.transparent&&at.side===ut.$EB&&!1===at.forceSinglePass?(at.side=ut.hsX,at.needsUpdate=!0,getProgram(at,st,ot),at.side=ut.hB5,at.needsUpdate=!0,getProgram(at,st,ot),at.side=ut.$EB):getProgram(at,st,ot)}this.xr=Wd,this.getContext=function(){return Hd},this.getContextAttributes=function(){return Hd.getContextAttributes()},this.forceContextLoss=function(){const at=xd.get("WEBGL_lose_context");at&&at.loseContext()},this.forceContextRestore=function(){const at=xd.get("WEBGL_lose_context");at&&at.restoreContext()},this.getPixelRatio=function(){return sd},this.setPixelRatio=function(at){void 0!==at&&(sd=at,this.setSize(rd,ad,!1))},this.getSize=function(at){return at.set(rd,ad)},this.setSize=function(at,ot,ut){void 0===ut&&(ut=!0),Wd.isPresenting?console.warn("THREE.WebGLRenderer: Can't change size while VR device is presenting."):(rd=at,ad=ot,st.width=Math.floor(at*sd),st.height=Math.floor(ot*sd),!0===ut&&(st.style.width=at+"px",st.style.height=ot+"px"),this.setViewport(0,0,at,ot))},this.getDrawingBufferSize=function(at){return at.set(rd*sd,ad*sd).floor()},this.setDrawingBufferSize=function(at,ot,ut){rd=at,ad=ot,sd=ut,st.width=Math.floor(at*ut),st.height=Math.floor(ot*ut),this.setViewport(0,0,at,ot)},this.getCurrentViewport=function(at){return at.copy(hh)},this.getViewport=function(at){return at.copy(cd)},this.setViewport=function(at,st,ot,ut){at.isVector4?cd.set(at.x,at.y,at.z,at.w):cd.set(at,st,ot,ut),wd.viewport(hh.copy(cd).multiplyScalar(sd).round())},this.getScissor=function(at){return at.copy(ud)},this.setScissor=function(at,st,ot,ut){at.isVector4?ud.set(at.x,at.y,at.z,at.w):ud.set(at,st,ot,ut),wd.scissor(ed.copy(ud).multiplyScalar(sd).round())},this.getScissorTest=function(){return hd},this.setScissorTest=function(at){wd.setScissorTest(hd=at)},this.setOpaqueSort=function(at){od=at},this.setTransparentSort=function(at){ld=at},this.getClearColor=function(at){return at.copy(Bd.getClearColor())},this.setClearColor=function(){Bd.setClearColor(...arguments)},this.getClearAlpha=function(){return Bd.getClearAlpha()},this.setClearAlpha=function(){Bd.setClearAlpha(...arguments)},this.clear=function(at,st,ot){void 0===at&&(at=!0),void 0===st&&(st=!0),void 0===ot&&(ot=!0);let Hl=0;if(at){let at=!1;if(null!==Du){const st=Du.texture.format;at=st===ut.c90||st===ut.TkQ||st===ut.ZQM}if(at){const at=Du.texture.type,st=at===ut.OUM||at===ut.bkx||at===ut.cHt||at===ut.V3x||at===ut.Wew||at===ut.gJ2,ot=Bd.getClearColor(),Hl=Bd.getClearAlpha(),rc=ot.r,sc=ot.g,oc=ot.b;st?(cu[0]=rc,cu[1]=sc,cu[2]=oc,cu[3]=Hl,Hd.clearBufferuiv(Hd.COLOR,0,cu)):(uu[0]=rc,uu[1]=sc,uu[2]=oc,uu[3]=Hl,Hd.clearBufferiv(Hd.COLOR,0,uu))}else Hl|=Hd.COLOR_BUFFER_BIT}st&&(Hl|=Hd.DEPTH_BUFFER_BIT),ot&&(Hl|=Hd.STENCIL_BUFFER_BIT,this.state.buffers.stencil.setMask(4294967295)),Hd.clear(Hl)},this.clearColor=function(){this.clear(!0,!1,!1)},this.clearDepth=function(){this.clear(!1,!0,!1)},this.clearStencil=function(){this.clear(!1,!1,!0)},this.dispose=function(){st.removeEventListener("webglcontextlost",onContextLost,!1),st.removeEventListener("webglcontextrestored",onContextRestore,!1),st.removeEventListener("webglcontextcreationerror",onContextCreationError,!1),Bd.dispose(),zd.dispose(),Nd.dispose(),Md.dispose(),Td.dispose(),Cd.dispose(),Dd.dispose(),Gd.dispose(),Zd.dispose(),Ld.dispose(),Wd.dispose(),Wd.removeEventListener("sessionstart",onXRSessionStart),Wd.removeEventListener("sessionend",onXRSessionEnd),Yd.stop()},this.renderBufferDirect=function(at,st,ot,Hl,rc,sc){null===st&&(st=vd);const oc=rc.isMesh&&rc.matrixWorld.determinant()<0,_c=function(at,st,ot,Hl,rc){!0!==st.isScene&&(st=vd);Sd.resetTextureUnits();const sc=st.fog,oc=Hl.isMeshStandardMaterial?st.environment:null,_c=null===Du?yu.outputColorSpace:!0===Du.isXRRenderTarget?Du.texture.colorSpace:ut.Zr2,wc=(Hl.isMeshStandardMaterial?Cd:Td).get(Hl.envMap||oc),Sc=!0===Hl.vertexColors&&!!ot.attributes.color&&4===ot.attributes.color.itemSize,iu=!!ot.attributes.tangent&&(!!Hl.normalMap||Hl.anisotropy>0),su=!!ot.morphAttributes.position,lu=!!ot.morphAttributes.normal,cu=!!ot.morphAttributes.color;let uu=ut.y_p;Hl.toneMapped&&(null!==Du&&!0!==Du.isXRRenderTarget||(uu=yu.toneMapping));const pu=ot.morphAttributes.position||ot.morphAttributes.normal||ot.morphAttributes.color,gu=void 0!==pu?pu.length:0,Au=Md.get(Hl),_u=mu.state.lights;if(!0===pd&&(!0===md||at!==$u)){const st=at===$u&&Hl.id===Lu;Rd.setState(Hl,at,st)}let xu=!1;Hl.version===Au.__version?Au.needsLights&&Au.lightsStateVersion!==_u.state.version||Au.outputColorSpace!==_c||rc.isBatchedMesh&&!1===Au.batching?xu=!0:rc.isBatchedMesh||!0!==Au.batching?rc.isBatchedMesh&&!0===Au.batchingColor&&null===rc.colorTexture||rc.isBatchedMesh&&!1===Au.batchingColor&&null!==rc.colorTexture||rc.isInstancedMesh&&!1===Au.instancing?xu=!0:rc.isInstancedMesh||!0!==Au.instancing?rc.isSkinnedMesh&&!1===Au.skinning?xu=!0:rc.isSkinnedMesh||!0!==Au.skinning?rc.isInstancedMesh&&!0===Au.instancingColor&&null===rc.instanceColor||rc.isInstancedMesh&&!1===Au.instancingColor&&null!==rc.instanceColor||rc.isInstancedMesh&&!0===Au.instancingMorph&&null===rc.morphTexture||rc.isInstancedMesh&&!1===Au.instancingMorph&&null!==rc.morphTexture||Au.envMap!==wc||!0===Hl.fog&&Au.fog!==sc?xu=!0:void 0===Au.numClippingPlanes||Au.numClippingPlanes===Rd.numPlanes&&Au.numIntersection===Rd.numIntersection?(Au.vertexAlphas!==Sc||Au.vertexTangents!==iu||Au.morphTargets!==su||Au.morphNormals!==lu||Au.morphColors!==cu||Au.toneMapping!==uu||Au.morphTargetsCount!==gu)&&(xu=!0):xu=!0:xu=!0:xu=!0:xu=!0:(xu=!0,Au.__version=Hl.version);let Su=Au.currentProgram;!0===xu&&(Su=getProgram(Hl,st,rc));let hh=!1,ed=!1,td=!1;const id=Su.getUniforms(),nd=Au.uniforms;wd.useProgram(Su.program)&&(hh=!0,ed=!0,td=!0);Hl.id!==Lu&&(Lu=Hl.id,ed=!0);if(hh||$u!==at){wd.buffers.depth.getReversed()?(fd.copy(at.projectionMatrix),(0,ut.xiE)(fd),(0,ut.Mmk)(fd),id.setValue(Hd,"projectionMatrix",fd)):id.setValue(Hd,"projectionMatrix",at.projectionMatrix),id.setValue(Hd,"viewMatrix",at.matrixWorldInverse);const st=id.map.cameraPosition;void 0!==st&&st.setValue(Hd,Ad.setFromMatrixPosition(at.matrixWorld)),bd.logarithmicDepthBuffer&&id.setValue(Hd,"logDepthBufFC",2/(Math.log(at.far+1)/Math.LN2)),(Hl.isMeshPhongMaterial||Hl.isMeshToonMaterial||Hl.isMeshLambertMaterial||Hl.isMeshBasicMaterial||Hl.isMeshStandardMaterial||Hl.isShaderMaterial)&&id.setValue(Hd,"isOrthographic",!0===at.isOrthographicCamera),$u!==at&&($u=at,ed=!0,td=!0)}if(rc.isSkinnedMesh){id.setOptional(Hd,rc,"bindMatrix"),id.setOptional(Hd,rc,"bindMatrixInverse");const at=rc.skeleton;at&&(null===at.boneTexture&&at.computeBoneTexture(),id.setValue(Hd,"boneTexture",at.boneTexture,Sd))}rc.isBatchedMesh&&(id.setOptional(Hd,rc,"batchingTexture"),id.setValue(Hd,"batchingTexture",rc._matricesTexture,Sd),id.setOptional(Hd,rc,"batchingIdTexture"),id.setValue(Hd,"batchingIdTexture",rc._indirectTexture,Sd),id.setOptional(Hd,rc,"batchingColorTexture"),null!==rc._colorsTexture&&id.setValue(Hd,"batchingColorTexture",rc._colorsTexture,Sd));const rd=ot.morphAttributes;void 0===rd.position&&void 0===rd.normal&&void 0===rd.color||Fd.update(rc,ot,Su);(ed||Au.receiveShadow!==rc.receiveShadow)&&(Au.receiveShadow=rc.receiveShadow,id.setValue(Hd,"receiveShadow",rc.receiveShadow));Hl.isMeshGouraudMaterial&&null!==Hl.envMap&&(nd.envMap.value=wc,nd.flipEnvMap.value=wc.isCubeTexture&&!1===wc.isRenderTargetTexture?-1:1);Hl.isMeshStandardMaterial&&null===Hl.envMap&&null!==st.environment&&(nd.envMapIntensity.value=st.environmentIntensity);ed&&(id.setValue(Hd,"toneMappingExposure",yu.toneMappingExposure),Au.needsLights&&(ld=td,(od=nd).ambientLightColor.needsUpdate=ld,od.lightProbe.needsUpdate=ld,od.directionalLights.needsUpdate=ld,od.directionalLightShadows.needsUpdate=ld,od.pointLights.needsUpdate=ld,od.pointLightShadows.needsUpdate=ld,od.spotLights.needsUpdate=ld,od.spotLightShadows.needsUpdate=ld,od.rectAreaLights.needsUpdate=ld,od.hemisphereLights.needsUpdate=ld),sc&&!0===Hl.fog&&Pd.refreshFogUniforms(nd,sc),Pd.refreshMaterialUniforms(nd,Hl,sd,ad,mu.state.transmissionRenderTarget[at.id]),WebGLUniforms.upload(Hd,getUniformList(Au),nd,Sd));var od,ld;Hl.isShaderMaterial&&!0===Hl.uniformsNeedUpdate&&(WebGLUniforms.upload(Hd,getUniformList(Au),nd,Sd),Hl.uniformsNeedUpdate=!1);Hl.isSpriteMaterial&&id.setValue(Hd,"center",rc.center);if(id.setValue(Hd,"modelViewMatrix",rc.modelViewMatrix),id.setValue(Hd,"normalMatrix",rc.normalMatrix),id.setValue(Hd,"modelMatrix",rc.matrixWorld),Hl.isShaderMaterial||Hl.isRawShaderMaterial){const at=Hl.uniformsGroups;for(let st=0,ot=at.length;st<ot;st++){const ot=at[st];Zd.update(ot,Su),Zd.bind(ot,Su)}}return Su}(at,st,ot,Hl,rc);wd.setMaterial(Hl,oc);let wc=ot.index,Sc=1;if(!0===Hl.wireframe){if(wc=Id.getWireframeAttribute(ot),void 0===wc)return;Sc=2}const iu=ot.drawRange,su=ot.attributes.position;let lu=iu.start*Sc,cu=(iu.start+iu.count)*Sc;null!==sc&&(lu=Math.max(lu,sc.start*Sc),cu=Math.min(cu,(sc.start+sc.count)*Sc)),null!==wc?(lu=Math.max(lu,0),cu=Math.min(cu,wc.count)):void 0!==su&&null!==su&&(lu=Math.max(lu,0),cu=Math.min(cu,su.count));const uu=cu-lu;if(uu<0||uu===1/0)return;let pu;Gd.setup(rc,Hl,_c,ot,wc);let gu=jd;if(null!==wc&&(pu=kd.get(wc),gu=Ud,gu.setIndex(pu)),rc.isMesh)!0===Hl.wireframe?(wd.setLineWidth(Hl.wireframeLinewidth*getTargetPixelRatio()),gu.setMode(Hd.LINES)):gu.setMode(Hd.TRIANGLES);else if(rc.isLine){let at=Hl.linewidth;void 0===at&&(at=1),wd.setLineWidth(at*getTargetPixelRatio()),rc.isLineSegments?gu.setMode(Hd.LINES):rc.isLineLoop?gu.setMode(Hd.LINE_LOOP):gu.setMode(Hd.LINE_STRIP)}else rc.isPoints?gu.setMode(Hd.POINTS):rc.isSprite&&gu.setMode(Hd.TRIANGLES);if(rc.isBatchedMesh)if(null!==rc._multiDrawInstances)(0,ut.mcG)("THREE.WebGLRenderer: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection."),gu.renderMultiDrawInstances(rc._multiDrawStarts,rc._multiDrawCounts,rc._multiDrawCount,rc._multiDrawInstances);else if(xd.get("WEBGL_multi_draw"))gu.renderMultiDraw(rc._multiDrawStarts,rc._multiDrawCounts,rc._multiDrawCount);else{const at=rc._multiDrawStarts,st=rc._multiDrawCounts,ot=rc._multiDrawCount,ut=wc?kd.get(wc).bytesPerElement:1,sc=Md.get(Hl).currentProgram.getUniforms();for(let Hl=0;Hl<ot;Hl++)sc.setValue(Hd,"_gl_DrawID",Hl),gu.render(at[Hl]/ut,st[Hl])}else if(rc.isInstancedMesh)gu.renderInstances(lu,uu,rc.count);else if(ot.isInstancedBufferGeometry){const at=void 0!==ot._maxInstanceCount?ot._maxInstanceCount:1/0,st=Math.min(ot.instanceCount,at);gu.renderInstances(lu,uu,st)}else gu.render(lu,uu)},this.compile=function(at,st,ot){void 0===ot&&(ot=null),null===ot&&(ot=at),mu=Nd.get(ot),mu.init(st),Au.push(mu),ot.traverseVisible((function(at){at.isLight&&at.layers.test(st.layers)&&(mu.pushLight(at),at.castShadow&&mu.pushShadow(at))})),at!==ot&&at.traverseVisible((function(at){at.isLight&&at.layers.test(st.layers)&&(mu.pushLight(at),at.castShadow&&mu.pushShadow(at))})),mu.setupLights();const ut=new Set;return at.traverse((function(at){if(!(at.isMesh||at.isPoints||at.isLine||at.isSprite))return;const st=at.material;if(st)if(Array.isArray(st))for(let Hl=0;Hl<st.length;Hl++){const rc=st[Hl];prepareMaterial(rc,ot,at),ut.add(rc)}else prepareMaterial(st,ot,at),ut.add(st)})),mu=Au.pop(),ut},this.compileAsync=function(at,st,ot){void 0===ot&&(ot=null);const ut=this.compile(at,st,ot);return new Promise((st=>{function checkMaterialsReady(){ut.forEach((function(at){Md.get(at).currentProgram.isReady()&&ut.delete(at)})),0!==ut.size?setTimeout(checkMaterialsReady,10):st(at)}null!==xd.get("KHR_parallel_shader_compile")?checkMaterialsReady():setTimeout(checkMaterialsReady,10)}))};let qd=null;function onXRSessionStart(){Yd.stop()}function onXRSessionEnd(){Yd.start()}const Yd=new WebGLAnimation;function projectObject(at,st,ot,ut){if(!1===at.visible)return;if(at.layers.test(st.layers))if(at.isGroup)ot=at.renderOrder;else if(at.isLOD)!0===at.autoUpdate&&at.update(st);else if(at.isLight)mu.pushLight(at),at.castShadow&&mu.pushShadow(at);else if(at.isSprite){if(!at.frustumCulled||dd.intersectsSprite(at)){ut&&yd.setFromMatrixPosition(at.matrixWorld).applyMatrix4(gd);const st=Dd.update(at),Hl=at.material;Hl.visible&&pu.push(at,st,Hl,ot,yd.z,null)}}else if((at.isMesh||at.isLine||at.isPoints)&&(!at.frustumCulled||dd.intersectsObject(at))){const st=Dd.update(at),Hl=at.material;if(ut&&(void 0!==at.boundingSphere?(null===at.boundingSphere&&at.computeBoundingSphere(),yd.copy(at.boundingSphere.center)):(null===st.boundingSphere&&st.computeBoundingSphere(),yd.copy(st.boundingSphere.center)),yd.applyMatrix4(at.matrixWorld).applyMatrix4(gd)),Array.isArray(Hl)){const ut=st.groups;for(let rc=0,sc=ut.length;rc<sc;rc++){const sc=ut[rc],oc=Hl[sc.materialIndex];oc&&oc.visible&&pu.push(at,st,oc,ot,yd.z,sc)}}else Hl.visible&&pu.push(at,st,Hl,ot,yd.z,null)}const Hl=at.children;for(let rc=0,sc=Hl.length;rc<sc;rc++)projectObject(Hl[rc],st,ot,ut)}function renderScene(at,st,ot,ut){const Hl=at.opaque,rc=at.transmissive,sc=at.transparent;mu.setupLightsView(ot),!0===pd&&Rd.setGlobalState(yu.clippingPlanes,ot),ut&&wd.viewport(hh.copy(ut)),Hl.length>0&&renderObjects(Hl,st,ot),rc.length>0&&renderObjects(rc,st,ot),sc.length>0&&renderObjects(sc,st,ot),wd.buffers.depth.setTest(!0),wd.buffers.depth.setMask(!0),wd.buffers.color.setMask(!0),wd.setPolygonOffset(!1)}function renderTransmissionPass(at,st,ot,Hl){if(null!==(!0===ot.isScene?ot.overrideMaterial:null))return;void 0===mu.state.transmissionRenderTarget[Hl.id]&&(mu.state.transmissionRenderTarget[Hl.id]=new ut.nWS(1,1,{generateMipmaps:!0,type:xd.has("EXT_color_buffer_half_float")||xd.has("EXT_color_buffer_float")?ut.ix0:ut.OUM,minFilter:ut.$_I,samples:4,stencilBuffer:rc,resolveDepthBuffer:!1,resolveStencilBuffer:!1,colorSpace:ut.ppV.workingColorSpace}));const sc=mu.state.transmissionRenderTarget[Hl.id],oc=Hl.viewport||hh;sc.setSize(oc.z*yu.transmissionResolutionScale,oc.w*yu.transmissionResolutionScale);const _c=yu.getRenderTarget();yu.setRenderTarget(sc),yu.getClearColor(id),nd=yu.getClearAlpha(),nd<1&&yu.setClearColor(16777215,.5),yu.clear(),_d&&Bd.render(ot);const wc=yu.toneMapping;yu.toneMapping=ut.y_p;const Sc=Hl.viewport;if(void 0!==Hl.viewport&&(Hl.viewport=void 0),mu.setupLightsView(Hl),!0===pd&&Rd.setGlobalState(yu.clippingPlanes,Hl),renderObjects(at,ot,Hl),Sd.updateMultisampleRenderTarget(sc),Sd.updateRenderTargetMipmap(sc),!1===xd.has("WEBGL_multisampled_render_to_texture")){let at=!1;for(let rc=0,sc=st.length;rc<sc;rc++){const sc=st[rc],oc=sc.object,_c=sc.geometry,wc=sc.material,Sc=sc.group;if(wc.side===ut.$EB&&oc.layers.test(Hl.layers)){const st=wc.side;wc.side=ut.hsX,wc.needsUpdate=!0,renderObject(oc,ot,Hl,_c,wc,Sc),wc.side=st,wc.needsUpdate=!0,at=!0}}!0===at&&(Sd.updateMultisampleRenderTarget(sc),Sd.updateRenderTargetMipmap(sc))}yu.setRenderTarget(_c),yu.setClearColor(id,nd),void 0!==Sc&&(Hl.viewport=Sc),yu.toneMapping=wc}function renderObjects(at,st,ot){const ut=!0===st.isScene?st.overrideMaterial:null;for(let Hl=0,rc=at.length;Hl<rc;Hl++){const rc=at[Hl],sc=rc.object,oc=rc.geometry,_c=rc.group;let wc=rc.material;!0===wc.allowOverride&&null!==ut&&(wc=ut),sc.layers.test(ot.layers)&&renderObject(sc,st,ot,oc,wc,_c)}}function renderObject(at,st,ot,Hl,rc,sc){at.onBeforeRender(yu,st,ot,Hl,rc,sc),at.modelViewMatrix.multiplyMatrices(ot.matrixWorldInverse,at.matrixWorld),at.normalMatrix.getNormalMatrix(at.modelViewMatrix),rc.onBeforeRender(yu,st,ot,Hl,at,sc),!0===rc.transparent&&rc.side===ut.$EB&&!1===rc.forceSinglePass?(rc.side=ut.hsX,rc.needsUpdate=!0,yu.renderBufferDirect(ot,st,Hl,rc,at,sc),rc.side=ut.hB5,rc.needsUpdate=!0,yu.renderBufferDirect(ot,st,Hl,rc,at,sc),rc.side=ut.$EB):yu.renderBufferDirect(ot,st,Hl,rc,at,sc),at.onAfterRender(yu,st,ot,Hl,rc,sc)}function getProgram(at,st,ot){!0!==st.isScene&&(st=vd);const ut=Md.get(at),Hl=mu.state.lights,rc=mu.state.shadowsArray,sc=Hl.state.version,oc=Ld.getParameters(at,Hl.state,rc,st,ot),_c=Ld.getProgramCacheKey(oc);let wc=ut.programs;ut.environment=at.isMeshStandardMaterial?st.environment:null,ut.fog=st.fog,ut.envMap=(at.isMeshStandardMaterial?Cd:Td).get(at.envMap||ut.environment),ut.envMapRotation=null!==ut.environment&&null===at.envMap?st.environmentRotation:at.envMapRotation,void 0===wc&&(at.addEventListener("dispose",onMaterialDispose),wc=new Map,ut.programs=wc);let Sc=wc.get(_c);if(void 0!==Sc){if(ut.currentProgram===Sc&&ut.lightsStateVersion===sc)return updateCommonMaterialProperties(at,oc),Sc}else oc.uniforms=Ld.getUniforms(at),at.onBeforeCompile(oc,yu),Sc=Ld.acquireProgram(oc,_c),wc.set(_c,Sc),ut.uniforms=oc.uniforms;const iu=ut.uniforms;return(at.isShaderMaterial||at.isRawShaderMaterial)&&!0!==at.clipping||(iu.clippingPlanes=Rd.uniform),updateCommonMaterialProperties(at,oc),ut.needsLights=function(at){return at.isMeshLambertMaterial||at.isMeshToonMaterial||at.isMeshPhongMaterial||at.isMeshStandardMaterial||at.isShadowMaterial||at.isShaderMaterial&&!0===at.lights}(at),ut.lightsStateVersion=sc,ut.needsLights&&(iu.ambientLightColor.value=Hl.state.ambient,iu.lightProbe.value=Hl.state.probe,iu.directionalLights.value=Hl.state.directional,iu.directionalLightShadows.value=Hl.state.directionalShadow,iu.spotLights.value=Hl.state.spot,iu.spotLightShadows.value=Hl.state.spotShadow,iu.rectAreaLights.value=Hl.state.rectArea,iu.ltc_1.value=Hl.state.rectAreaLTC1,iu.ltc_2.value=Hl.state.rectAreaLTC2,iu.pointLights.value=Hl.state.point,iu.pointLightShadows.value=Hl.state.pointShadow,iu.hemisphereLights.value=Hl.state.hemi,iu.directionalShadowMap.value=Hl.state.directionalShadowMap,iu.directionalShadowMatrix.value=Hl.state.directionalShadowMatrix,iu.spotShadowMap.value=Hl.state.spotShadowMap,iu.spotLightMatrix.value=Hl.state.spotLightMatrix,iu.spotLightMap.value=Hl.state.spotLightMap,iu.pointShadowMap.value=Hl.state.pointShadowMap,iu.pointShadowMatrix.value=Hl.state.pointShadowMatrix),ut.currentProgram=Sc,ut.uniformsList=null,Sc}function getUniformList(at){if(null===at.uniformsList){const st=at.currentProgram.getUniforms();at.uniformsList=WebGLUniforms.seqWithValue(st.seq,at.uniforms)}return at.uniformsList}function updateCommonMaterialProperties(at,st){const ot=Md.get(at);ot.outputColorSpace=st.outputColorSpace,ot.batching=st.batching,ot.batchingColor=st.batchingColor,ot.instancing=st.instancing,ot.instancingColor=st.instancingColor,ot.instancingMorph=st.instancingMorph,ot.skinning=st.skinning,ot.morphTargets=st.morphTargets,ot.morphNormals=st.morphNormals,ot.morphColors=st.morphColors,ot.morphTargetsCount=st.morphTargetsCount,ot.numClippingPlanes=st.numClippingPlanes,ot.numIntersection=st.numClipIntersection,ot.vertexAlphas=st.vertexAlphas,ot.vertexTangents=st.vertexTangents,ot.toneMapping=st.toneMapping}Yd.setAnimationLoop((function(at){qd&&qd(at)})),"undefined"!==typeof self&&Yd.setContext(self),this.setAnimationLoop=function(at){qd=at,Wd.setAnimationLoop(at),null===at?Yd.stop():Yd.start()},Wd.addEventListener("sessionstart",onXRSessionStart),Wd.addEventListener("sessionend",onXRSessionEnd),this.render=function(at,st){if(void 0!==st&&!0!==st.isCamera)return void console.error("THREE.WebGLRenderer.render: camera is not an instance of THREE.Camera.");if(!0===_u)return;if(!0===at.matrixWorldAutoUpdate&&at.updateMatrixWorld(),null===st.parent&&!0===st.matrixWorldAutoUpdate&&st.updateMatrixWorld(),!0===Wd.enabled&&!0===Wd.isPresenting&&(!0===Wd.cameraAutoUpdate&&Wd.updateCamera(st),st=Wd.getCamera()),!0===at.isScene&&at.onBeforeRender(yu,at,st,Du),mu=Nd.get(at,Au.length),mu.init(st),Au.push(mu),gd.multiplyMatrices(st.projectionMatrix,st.matrixWorldInverse),dd.setFromProjectionMatrix(gd),md=this.localClippingEnabled,pd=Rd.init(this.clippingPlanes,md),pu=zd.get(at,gu.length),pu.init(),gu.push(pu),!0===Wd.enabled&&!0===Wd.isPresenting){const at=yu.xr.getDepthSensingMesh();null!==at&&projectObject(at,st,-1/0,yu.sortObjects)}projectObject(at,st,0,yu.sortObjects),pu.finish(),!0===yu.sortObjects&&pu.sort(od,ld),_d=!1===Wd.enabled||!1===Wd.isPresenting||!1===Wd.hasDepthSensing(),_d&&Bd.addToRenderList(pu,at),this.info.render.frame++,!0===pd&&Rd.beginShadows();const ot=mu.state.shadowsArray;Od.render(ot,at,st),!0===pd&&Rd.endShadows(),!0===this.info.autoReset&&this.info.reset();const ut=pu.opaque,Hl=pu.transmissive;if(mu.setupLights(),st.isArrayCamera){const ot=st.cameras;if(Hl.length>0)for(let st=0,rc=ot.length;st<rc;st++){renderTransmissionPass(ut,Hl,at,ot[st])}_d&&Bd.render(at);for(let st=0,ut=ot.length;st<ut;st++){const ut=ot[st];renderScene(pu,at,ut,ut.viewport)}}else Hl.length>0&&renderTransmissionPass(ut,Hl,at,st),_d&&Bd.render(at),renderScene(pu,at,st);null!==Du&&0===Su&&(Sd.updateMultisampleRenderTarget(Du),Sd.updateRenderTargetMipmap(Du)),!0===at.isScene&&at.onAfterRender(yu,at,st),Gd.resetDefaultState(),Lu=-1,$u=null,Au.pop(),Au.length>0?(mu=Au[Au.length-1],!0===pd&&Rd.setGlobalState(yu.clippingPlanes,mu.state.camera)):mu=null,gu.pop(),pu=gu.length>0?gu[gu.length-1]:null},this.getActiveCubeFace=function(){return xu},this.getActiveMipmapLevel=function(){return Su},this.getRenderTarget=function(){return Du},this.setRenderTargetTextures=function(at,st,ot){const ut=Md.get(at);ut.__autoAllocateDepthBuffer=!1===at.resolveDepthBuffer,!1===ut.__autoAllocateDepthBuffer&&(ut.__useRenderToTexture=!1),Md.get(at.texture).__webglTexture=st,Md.get(at.depthTexture).__webglTexture=ut.__autoAllocateDepthBuffer?void 0:ot,ut.__hasExternalTextures=!0},this.setRenderTargetFramebuffer=function(at,st){const ot=Md.get(at);ot.__webglFramebuffer=st,ot.__useDefaultFramebuffer=void 0===st};const Qd=Hd.createFramebuffer();this.setRenderTarget=function(at,st,ot){void 0===st&&(st=0),void 0===ot&&(ot=0),Du=at,xu=st,Su=ot;let ut=!0,Hl=null,rc=!1,sc=!1;if(at){const oc=Md.get(at);if(void 0!==oc.__useDefaultFramebuffer)wd.bindFramebuffer(Hd.FRAMEBUFFER,null),ut=!1;else if(void 0===oc.__webglFramebuffer)Sd.setupRenderTarget(at);else if(oc.__hasExternalTextures)Sd.rebindTextures(at,Md.get(at.texture).__webglTexture,Md.get(at.depthTexture).__webglTexture);else if(at.depthBuffer){const st=at.depthTexture;if(oc.__boundDepthTexture!==st){if(null!==st&&Md.has(st)&&(at.width!==st.image.width||at.height!==st.image.height))throw new Error("WebGLRenderTarget: Attached DepthTexture is initialized to the incorrect size.");Sd.setupDepthRenderbuffer(at)}}const _c=at.texture;(_c.isData3DTexture||_c.isDataArrayTexture||_c.isCompressedArrayTexture)&&(sc=!0);const wc=Md.get(at).__webglFramebuffer;at.isWebGLCubeRenderTarget?(Hl=Array.isArray(wc[st])?wc[st][ot]:wc[st],rc=!0):Hl=at.samples>0&&!1===Sd.useMultisampledRTT(at)?Md.get(at).__webglMultisampledFramebuffer:Array.isArray(wc)?wc[ot]:wc,hh.copy(at.viewport),ed.copy(at.scissor),td=at.scissorTest}else hh.copy(cd).multiplyScalar(sd).floor(),ed.copy(ud).multiplyScalar(sd).floor(),td=hd;0!==ot&&(Hl=Qd);if(wd.bindFramebuffer(Hd.FRAMEBUFFER,Hl)&&ut&&wd.drawBuffers(at,Hl),wd.viewport(hh),wd.scissor(ed),wd.setScissorTest(td),rc){const ut=Md.get(at.texture);Hd.framebufferTexture2D(Hd.FRAMEBUFFER,Hd.COLOR_ATTACHMENT0,Hd.TEXTURE_CUBE_MAP_POSITIVE_X+st,ut.__webglTexture,ot)}else if(sc){const ut=Md.get(at.texture),Hl=st;Hd.framebufferTextureLayer(Hd.FRAMEBUFFER,Hd.COLOR_ATTACHMENT0,ut.__webglTexture,ot,Hl)}else if(null!==at&&0!==ot){const st=Md.get(at.texture);Hd.framebufferTexture2D(Hd.FRAMEBUFFER,Hd.COLOR_ATTACHMENT0,Hd.TEXTURE_2D,st.__webglTexture,ot)}Lu=-1},this.readRenderTargetPixels=function(at,st,ot,ut,Hl,rc,sc){if(!at||!at.isWebGLRenderTarget)return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let oc=Md.get(at).__webglFramebuffer;if(at.isWebGLCubeRenderTarget&&void 0!==sc&&(oc=oc[sc]),oc){wd.bindFramebuffer(Hd.FRAMEBUFFER,oc);try{const sc=at.texture,oc=sc.format,_c=sc.type;if(!bd.textureFormatReadable(oc))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.");if(!bd.textureTypeReadable(_c))return void console.error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.");st>=0&&st<=at.width-ut&&ot>=0&&ot<=at.height-Hl&&Hd.readPixels(st,ot,ut,Hl,Vd.convert(oc),Vd.convert(_c),rc)}finally{const at=null!==Du?Md.get(Du).__webglFramebuffer:null;wd.bindFramebuffer(Hd.FRAMEBUFFER,at)}}},this.readRenderTargetPixelsAsync=async function(at,st,ot,Hl,rc,sc,oc){if(!at||!at.isWebGLRenderTarget)throw new Error("THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.");let _c=Md.get(at).__webglFramebuffer;if(at.isWebGLCubeRenderTarget&&void 0!==oc&&(_c=_c[oc]),_c){if(st>=0&&st<=at.width-Hl&&ot>=0&&ot<=at.height-rc){wd.bindFramebuffer(Hd.FRAMEBUFFER,_c);const oc=at.texture,wc=oc.format,Sc=oc.type;if(!bd.textureFormatReadable(wc))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.");if(!bd.textureTypeReadable(Sc))throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.");const iu=Hd.createBuffer();Hd.bindBuffer(Hd.PIXEL_PACK_BUFFER,iu),Hd.bufferData(Hd.PIXEL_PACK_BUFFER,sc.byteLength,Hd.STREAM_READ),Hd.readPixels(st,ot,Hl,rc,Vd.convert(wc),Vd.convert(Sc),0);const su=null!==Du?Md.get(Du).__webglFramebuffer:null;wd.bindFramebuffer(Hd.FRAMEBUFFER,su);const lu=Hd.fenceSync(Hd.SYNC_GPU_COMMANDS_COMPLETE,0);return Hd.flush(),await(0,ut.jej)(Hd,lu,4),Hd.bindBuffer(Hd.PIXEL_PACK_BUFFER,iu),Hd.getBufferSubData(Hd.PIXEL_PACK_BUFFER,0,sc),Hd.deleteBuffer(iu),Hd.deleteSync(lu),sc}throw new Error("THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.")}},this.copyFramebufferToTexture=function(at,st,ot){void 0===st&&(st=null),void 0===ot&&(ot=0);const ut=Math.pow(2,-ot),Hl=Math.floor(at.image.width*ut),rc=Math.floor(at.image.height*ut),sc=null!==st?st.x:0,oc=null!==st?st.y:0;Sd.setTexture2D(at,0),Hd.copyTexSubImage2D(Hd.TEXTURE_2D,ot,0,0,sc,oc,Hl,rc),wd.unbindTexture()};const Xd=Hd.createFramebuffer(),Kd=Hd.createFramebuffer();this.copyTextureToTexture=function(at,st,ot,Hl,rc,sc){let oc,_c,wc,Sc,iu,su,lu,cu,uu;void 0===ot&&(ot=null),void 0===Hl&&(Hl=null),void 0===rc&&(rc=0),void 0===sc&&(sc=null),null===sc&&(0!==rc?((0,ut.mcG)("WebGLRenderer: copyTextureToTexture function signature has changed to support src and dst mipmap levels."),sc=rc,rc=0):sc=0);const pu=at.isCompressedTexture?at.mipmaps[sc]:at.image;if(null!==ot)oc=ot.max.x-ot.min.x,_c=ot.max.y-ot.min.y,wc=ot.isBox3?ot.max.z-ot.min.z:1,Sc=ot.min.x,iu=ot.min.y,su=ot.isBox3?ot.min.z:0;else{const st=Math.pow(2,-rc);oc=Math.floor(pu.width*st),_c=Math.floor(pu.height*st),wc=at.isDataArrayTexture?pu.depth:at.isData3DTexture?Math.floor(pu.depth*st):1,Sc=0,iu=0,su=0}null!==Hl?(lu=Hl.x,cu=Hl.y,uu=Hl.z):(lu=0,cu=0,uu=0);const mu=Vd.convert(st.format),gu=Vd.convert(st.type);let Au;st.isData3DTexture?(Sd.setTexture3D(st,0),Au=Hd.TEXTURE_3D):st.isDataArrayTexture||st.isCompressedArrayTexture?(Sd.setTexture2DArray(st,0),Au=Hd.TEXTURE_2D_ARRAY):(Sd.setTexture2D(st,0),Au=Hd.TEXTURE_2D),Hd.pixelStorei(Hd.UNPACK_FLIP_Y_WEBGL,st.flipY),Hd.pixelStorei(Hd.UNPACK_PREMULTIPLY_ALPHA_WEBGL,st.premultiplyAlpha),Hd.pixelStorei(Hd.UNPACK_ALIGNMENT,st.unpackAlignment);const yu=Hd.getParameter(Hd.UNPACK_ROW_LENGTH),_u=Hd.getParameter(Hd.UNPACK_IMAGE_HEIGHT),xu=Hd.getParameter(Hd.UNPACK_SKIP_PIXELS),Su=Hd.getParameter(Hd.UNPACK_SKIP_ROWS),Du=Hd.getParameter(Hd.UNPACK_SKIP_IMAGES);Hd.pixelStorei(Hd.UNPACK_ROW_LENGTH,pu.width),Hd.pixelStorei(Hd.UNPACK_IMAGE_HEIGHT,pu.height),Hd.pixelStorei(Hd.UNPACK_SKIP_PIXELS,Sc),Hd.pixelStorei(Hd.UNPACK_SKIP_ROWS,iu),Hd.pixelStorei(Hd.UNPACK_SKIP_IMAGES,su);const Lu=at.isDataArrayTexture||at.isData3DTexture,$u=st.isDataArrayTexture||st.isData3DTexture;if(at.isDepthTexture){const ot=Md.get(at),ut=Md.get(st),Hl=Md.get(ot.__renderTarget),pu=Md.get(ut.__renderTarget);wd.bindFramebuffer(Hd.READ_FRAMEBUFFER,Hl.__webglFramebuffer),wd.bindFramebuffer(Hd.DRAW_FRAMEBUFFER,pu.__webglFramebuffer);for(let mu=0;mu<wc;mu++)Lu&&(Hd.framebufferTextureLayer(Hd.READ_FRAMEBUFFER,Hd.COLOR_ATTACHMENT0,Md.get(at).__webglTexture,rc,su+mu),Hd.framebufferTextureLayer(Hd.DRAW_FRAMEBUFFER,Hd.COLOR_ATTACHMENT0,Md.get(st).__webglTexture,sc,uu+mu)),Hd.blitFramebuffer(Sc,iu,oc,_c,lu,cu,oc,_c,Hd.DEPTH_BUFFER_BIT,Hd.NEAREST);wd.bindFramebuffer(Hd.READ_FRAMEBUFFER,null),wd.bindFramebuffer(Hd.DRAW_FRAMEBUFFER,null)}else if(0!==rc||at.isRenderTargetTexture||Md.has(at)){const ot=Md.get(at),ut=Md.get(st);wd.bindFramebuffer(Hd.READ_FRAMEBUFFER,Xd),wd.bindFramebuffer(Hd.DRAW_FRAMEBUFFER,Kd);for(let at=0;at<wc;at++)Lu?Hd.framebufferTextureLayer(Hd.READ_FRAMEBUFFER,Hd.COLOR_ATTACHMENT0,ot.__webglTexture,rc,su+at):Hd.framebufferTexture2D(Hd.READ_FRAMEBUFFER,Hd.COLOR_ATTACHMENT0,Hd.TEXTURE_2D,ot.__webglTexture,rc),$u?Hd.framebufferTextureLayer(Hd.DRAW_FRAMEBUFFER,Hd.COLOR_ATTACHMENT0,ut.__webglTexture,sc,uu+at):Hd.framebufferTexture2D(Hd.DRAW_FRAMEBUFFER,Hd.COLOR_ATTACHMENT0,Hd.TEXTURE_2D,ut.__webglTexture,sc),0!==rc?Hd.blitFramebuffer(Sc,iu,oc,_c,lu,cu,oc,_c,Hd.COLOR_BUFFER_BIT,Hd.NEAREST):$u?Hd.copyTexSubImage3D(Au,sc,lu,cu,uu+at,Sc,iu,oc,_c):Hd.copyTexSubImage2D(Au,sc,lu,cu,Sc,iu,oc,_c);wd.bindFramebuffer(Hd.READ_FRAMEBUFFER,null),wd.bindFramebuffer(Hd.DRAW_FRAMEBUFFER,null)}else $u?at.isDataTexture||at.isData3DTexture?Hd.texSubImage3D(Au,sc,lu,cu,uu,oc,_c,wc,mu,gu,pu.data):st.isCompressedArrayTexture?Hd.compressedTexSubImage3D(Au,sc,lu,cu,uu,oc,_c,wc,mu,pu.data):Hd.texSubImage3D(Au,sc,lu,cu,uu,oc,_c,wc,mu,gu,pu):at.isDataTexture?Hd.texSubImage2D(Hd.TEXTURE_2D,sc,lu,cu,oc,_c,mu,gu,pu.data):at.isCompressedTexture?Hd.compressedTexSubImage2D(Hd.TEXTURE_2D,sc,lu,cu,pu.width,pu.height,mu,pu.data):Hd.texSubImage2D(Hd.TEXTURE_2D,sc,lu,cu,oc,_c,mu,gu,pu);Hd.pixelStorei(Hd.UNPACK_ROW_LENGTH,yu),Hd.pixelStorei(Hd.UNPACK_IMAGE_HEIGHT,_u),Hd.pixelStorei(Hd.UNPACK_SKIP_PIXELS,xu),Hd.pixelStorei(Hd.UNPACK_SKIP_ROWS,Su),Hd.pixelStorei(Hd.UNPACK_SKIP_IMAGES,Du),0===sc&&st.generateMipmaps&&Hd.generateMipmap(Au),wd.unbindTexture()},this.copyTextureToTexture3D=function(at,st,ot,Hl,rc){return void 0===ot&&(ot=null),void 0===Hl&&(Hl=null),void 0===rc&&(rc=0),(0,ut.mcG)('WebGLRenderer: copyTextureToTexture3D function has been deprecated. Use "copyTextureToTexture" instead.'),this.copyTextureToTexture(at,st,ot,Hl,rc)},this.initRenderTarget=function(at){void 0===Md.get(at).__webglFramebuffer&&Sd.setupRenderTarget(at)},this.initTexture=function(at){at.isCubeTexture?Sd.setTextureCube(at,0):at.isData3DTexture?Sd.setTexture3D(at,0):at.isDataArrayTexture||at.isCompressedArrayTexture?Sd.setTexture2DArray(at,0):Sd.setTexture2D(at,0),wd.unbindTexture()},this.resetState=function(){xu=0,Su=0,Du=null,wd.reset(),Gd.reset()},"undefined"!==typeof __THREE_DEVTOOLS__&&__THREE_DEVTOOLS__.dispatchEvent(new CustomEvent("observe",{detail:this}))}get coordinateSystem(){return ut.TdN}get outputColorSpace(){return this._outputColorSpace}set outputColorSpace(at){this._outputColorSpace=at;const st=this.getContext();st.drawingBufferColorSpace=ut.ppV._getDrawingBufferColorSpace(at),st.unpackColorSpace=ut.ppV._getUnpackColorSpace()}}},8330:at=>{"use strict";at.exports=JSON.parse('{"rE":"4.1.0","Jk":{"O":"https://gitlab.com/panoramax/clients/web-viewer"}}')},4149:at=>{"use strict";at.exports=JSON.parse('{"maplibre":{"GeolocateControl.LocationNotAvailable":"Placering ikke tilg\xe6ngelig","GeolocateControl.FindMyLocation":"Find min placering"},"pnx":{"minimize":"Skjul dette modul, du kan vise det igen ved hj\xe6lp af knappen i nederste venstre hj\xf8rne","share_embed_docs":"L\xe6s mere om indlejringskonfiguration","zoom":"Zoom","zoomOut":"Zoom ud","zoomIn":"Zoom ind","moveUp":"Ryk opad","moveDown":"Ryk nedad","moveLeft":"Ryk til venstre","moveRight":"Ryk til h\xf8jre","moveMiddle":"Centreret visning","expand":"Udvid","expand_info":"F\xe5 modulet til at blive vist p\xe5 hele siden","show_psv":"Vis billedfremviseren","show_map":"Vis kortet","options":"Valgmuligheder","filters":"Filtre","layers":"Lag","search":"S\xf8g","search_empty":"Ingen resultater fundet","search_user":"S\xf8g efter et brugernavn\u2026","share":"Del","share_links":"Links","share_page":"Link til dette billede","share_image":"HD-billede","share_rss":"RSS-feed","share_rss_title":"RSS-feed med nye sekvenser i det aktuelt synlige kortomr\xe5de","share_embed":"Indlejr p\xe5 din hjemmeside","share_print":"Udskriv","copy":"Kopi\xe9r","copied":"Kopieret","error_retry":"Pr\xf8v igen senere","sequence_next":"N\xe6ste billede i sekvensen","sequence_play":"Afspil denne sekvens","sequence_more":"Flere afspilningsmuligheder","sequence_speed":"Afspillerens hastighed","legend_license":"Licens: {l}","legend_title":"Vis detaljer om billedet","error_click":"Forts\xe6t","error":"Vi har et problem\u2026","search_address":"S\xf8g efter en adresse, by\u2026","sequence_pause":"S\xe6t sekvensen p\xe5 pause","sequence_prev":"Forrige billede i sekvensen","loading_labels_serious":["\ud83d\uddfa\ufe0f Indl\xe6ser kortdata","\ud83d\udda5\ufe0f Anmoder API","\ud83d\uddbc\ufe0f Indl\xe6ser thumbnails","\ud83d\udd0d Analyserer EXIF-metadata","\ud83c\udfd8\ufe0f 3D-rendering","\ud83d\udcf7 Initialiserer 360\xb0-billeder","\ud83d\udfe0 Farveafstemning","\ud83d\udcaf Beregning af kvalitetsscore \xa9","\ud83d\udce1 Downloader opdateringer","\ud83c\udf0d Henter kortfliser","\ud83d\udcf8 Behandler skygger"],"edit_osm":"Rediger OSM","josm_live":"Aktiv\xe9r automatisk JOSM-synkronisering ved indl\xe6sning af billeder","loading_labels_fun":["\ud83e\udd8c Registrering af skilte om hjortekrydsning","\ud83d\ude98 S\xf8ger Panoramax Car \xa9","\u2615 Injicerer koffein","\ud83d\ude00 Smil, du er blevet kortlagt!","\ud83d\udc08 Deler kattebilleder","\ud83d\ude34 Reducerer overspringshandlinger","\ud83e\uded6 Brygger te","\ud83d\udc27 \xc5bner kildekode","\ud83d\ude87 Indekser undergrundsstationer","\ud83e\uddf9 Metadata-oprydning","\ud83d\ude92 Sender billeder af brandstation","\ud83d\udeb2 Opdatering af Greenways","\ud83d\ude89 Gennemgang af perron p\xe5 station","\ud83d\udef0\ufe0f S\xf8ger efter satellitter","\ud83d\udc65 Skriver personaer","\ud83d\udc1f Finder fish and chip butik","\ud83e\uddd1\u200d\ud83d\udcbb Gr\xe6nseflade til fejlfinding","\ud83d\udcc8 Inkrementelle statistikker","\ud83e\udd16 L\xe6rer semantik","\ud83c\udfa8 Redesign af gr\xe6nseflade","\ud83d\udcc5 Planl\xe6gning af foto-kortl\xe6gningsfester","\ud83e\uddc0 Modning af cheddars","\ud83c\udf04 Beregning af Cornwalls solskin","\ud83c\udf0a M\xe5ling af h\xf8jvande"],"error_psv":"Photo Sphere Viewer indl\xe6ses ikke korrekt","error_nopic":"Intet billede tilg\xe6ngeligt p\xe5 den givne position","error_api":"Billedserveren er ikke tilg\xe6ngelig","error_webgl":"WebGL underst\xf8ttes ikke af din browser","filter_date":"Dato","filter_date_1month":"1 m\xe5ned","filter_date_1year":"1 \xe5r","filter_user":"Bruger","filter_user_mypics":"Mine billeder","filter_picture":"Billedtype","filter_zoom_in":"Zoom ind p\xe5 kortet for at se dette filter","picture_flat":"Klassisk","picture_360":"360\xb0","filter_qualityscore_help":"Klik for at aktivere eller deaktivere","map_background":"Kortbaggrund","map_background_aerial":"Luftfoto","map_background_streets":"Gader","map_theme":"Korttema","error_pic":"Det \xf8nskede billede blev ikke fundet","error_api_compatibility":"Billedserveren er ikke kompatibel med denne version af fremviseren","filter_qualityscore":"Kvalitetsscore","error_josm":"JOSM svarer ikke, k\xf8rer den, og er fjernstyring aktiveret?","metadata_general_seqid_link":"G\xe5 til JSON-beskrivelse af sekvensen","map_theme_default":"Klassisk","map_theme_age_1":"> 2 \xe5r","map_theme_age_2":"< 2 \xe5r","map_theme_age_3":"< 1 \xe5r","map_theme_age_4":"< 1 m\xe5ned","map_theme_type":"Kameratype","map_theme_score":"Kvalitetsscore","contrast":"Aktiv\xe9r h\xf8jere billedkontrast","metadata_general_picid":"Billede","metadata_general_seqid":"Sekvens","metadata_general_picid_link":"G\xe5 til JSON-beskrivelse af billedet","metadata_general_author":"Forfatter","metadata_general_license":"Licens","metadata_general_license_link":"Se den fulde licensbeskrivelse","metadata_general_date":"Optagelsesdato","metadata_camera":"Kamera","metadata_camera_make":"Fabrikat","metadata_camera_model":"Model","metadata_camera_type":"Type","metadata_camera_resolution":"Opl\xf8sning","metadata_camera_focal_length":"Br\xe6ndvidde","metadata_location_latitude":"Breddegrad","metadata_location_orientation":"Retning","metadata_location_precision":"Pr\xe6cision i positionering","metadata_quality":"Kvalitet","metadata_quality_score":"Global score","metadata_quality_gps_score":"Positioneringsscore","metadata_quality_help":"F\xe5 mere at vide om kvalitetsscore","map_theme_age":"Optagelsesdato","metadata_location":"Position","metadata":"Metadata for billede","metadata_location_longitude":"L\xe6ngdegrad","metadata_quality_resolution_score":"Opl\xf8sningsscore","metadata_quality_missing":"ingen v\xe6rdi indstillet i billedet","metadata_exif":"EXIF","metadata_exif_name":"Tag","metadata_exif_value":"V\xe6rdi","report":"Indberet","report_auth":"Denne indberetning vil blive sendt via din konto \\"{a}\\"","report_nature_label":"Problemets karakter","report_nature":{"":"V\xe6lg problemets art\u2026","blur_missing":"En persons ansigt eller bils nummerplade er synlig","blur_excess":"Et objekt, der ikke har brug for sl\xf8ring, sl\xf8res","inappropriate":"Billedet er upassende (ikke relevant, n\xf8genhed\u2026)","privacy":"En privat sti eller ejendom er synlig","picture_low_quality":"Billedet er af meget d\xe5rlig kvalitet","mislocated":"Billedet er d\xe5rligt placeret p\xe5 kortet","copyright":"Billedet kr\xe6nker ophavsretten","other":"Enhver anden form for problem"},"report_whole_sequence":"Det g\xe6lder hele sekvensen","report_details":"Yderligere detaljer","report_details_placeholder":"Hvis du vil, kan du tilf\xf8je detaljer om problemet, og hvad det drejer sig om","report_email":"Din e-mail","report_email_placeholder":"Valgfri","report_submit":"Indsend","report_wait":"Sender indberetning \u2026","report_success":"Indberetningen er blevet sendt. Den vil blive gennemg\xe5et s\xe5 hurtigt som muligt.","report_failure":"Der opstod en fejl under oprettelse af indberetning: {e}. Pr\xf8v venligst igen senere.","qualityscore_title":"Om kvalitetsscoren","qualityscore_doc_2":"Bed\xf8mmelsen vises for brugerne som en A/B/C/D/E-score (A er den bedste, E den d\xe5rligste) og vises grafisk via denne skala:","qualityscore_doc_3":"Den beregnes ud fra GPS-pr\xe6cision og billedopl\xf8sning. Et professionelt system vil have en A-rating, et 360\xb0 actionkamera vil have en B-rating, og en smartphone vil have en C/D/E-rating.","qualityscore_doc_link":"Yderligere oplysninger om kvalitetsscoren","qualityscore_doc_1":"Panoramax tilbyder en kvalitetsscore for hvert billede. Det giver mulighed for nem kortfiltrering og overskuelig visning af tilg\xe6ngelige billeder af h\xf8j kvalitet.","minimize_short":"Skjul","id":"iD","josm":"JOSM","metadata_general_instance":"Oprindelse instans","contribute_id":"Bidrag til OpenStreetMap med iD-editor","geo_uri":"Ekstern app","picture_flat_long":"Klassisk billede","picture_360_long":"Panoramabillede","metadata_summary":"Opsummering","metadata_general_copy_id":"Kopi-ID","metadata_general_copy_picid":"Kopi billed-ID","filter_date_6months":"6 m\xe5neder","picture_all":"Alle","panoramax":"Panoramax","semantics_send_ok":"Dine redigeringer blev indsendt"},"psv":{"loadError":"Panoramaet kan ikke indl\xe6ses","twoFingers":"Brug to fingre til at navigere","ctrlZoom":"Brug ctrl + scroll til at zoome ind p\xe5 billedet"},"map":{"loading":"Indl\xe6ser\u2026","thumbnail":"Miniature af billedet, der holdes","not_public":"Ikke offentligt synlig","slow_loading":"Kortet indl\xe6ses langsomt og kan virke defekt","map_data":"Kortdata: {m}","more_panoramax":"F\xe5 mere at vide om Panoramax"}}')},369:at=>{"use strict";at.exports=JSON.parse('{"pnx":{"options":"Optionen","filters":"Filter","search":"Suche","layers":"Ebenen","share_links":"Links","share_page":"Link zu diesem Bild","loading_labels_fun":["\ud83e\udd8c Erkennung der \\"Reh kreuzt\\"-Schilder","\ud83d\ude98 Suche Panoramax-Auto \xa9","\u2615 Koffeininjektion","\ud83d\ude00 L\xe4chle, du wirst kartografiert!","\ud83d\udc08 Katzenfotos teilen","\ud83d\ude34 Reduzieren der Prokrastination","\ud83c\udf7a\ufe0f Bier brauen","\ud83d\udc27 Quellcode \xf6ffnen","\ud83d\udee3\ufe0f Indizierung der Autobahnen","\ud83e\uddf9 Metadatenreinigung","\ud83d\ude92 Senden der Fotos der Feuerwehren","\ud83d\udeb2 Gr\xfcne Radwege identifiziert","\ud83d\ude89 Durchgang zum Bahnsteig","\ud83d\udef0\ufe0f Suche Satelliten","\ud83d\udc65 Personas anlegen","\ud83c\udf2d\ufe0f Lokalisierung der Currywurst","\ud83e\uddd1\u200d\ud83d\udcbb Debugging des Interfaces","\ud83d\udcc8 Hochz\xe4hlen der Statistiken","\ud83e\udd16 Lerne Semantik","\ud83c\udfa8 \xdcberarbeitung des Interface","\ud83d\udcc5 Plane Fotomapping-Parties","\ud83e\uddc0 Reifen des Emmentalers","\ud83c\udf04 Berechnen des Sonnenscheins","\ud83c\udf0a Messung der Gezeiten"],"search_empty":"Keine Ergebnisse gefunden","share":"Teilen","metadata_general_picid":"Bild","zoom":"Zoom","zoomOut":"Herauszoomen","zoomIn":"Hereinzoomen","moveUp":"Nach oben","moveDown":"Nach unten","moveRight":"Nach rechts","moveMiddle":"Sicht zentrieren","map_theme_age":"Aufnahmedatum","expand":"Vergr\xf6\xdfern","expand_info":"Widget im Vollbild anzeigen","show_psv":"Bildbetrachter anzeigen","show_map":"Karte anzeigen","search_user":"Benutzernamen suchen\u2026","filter_zoom_in":"Vergr\xf6\xdfere die Karte, um diesen Filter zu sehen","picture_flat":"Klassisch","picture_360":"360\xb0","filter_camera_model":"Nach Kameramodell","map_background":"Kartenhintergrund","map_background_aerial":"Satelliten","map_background_streets":"Stra\xdfen","map_theme":"Karten-Art","metadata_exif_name":"Schlagwort","metadata_exif_value":"Wert","map_theme_age_2":"<2 Jahre","map_theme_age_3":"<1 Jahr","map_theme_type":"Kameratyp","contrast":"H\xf6heren Bildkontrast aktivieren","metadata":"Bildmetadaten","metadata_general_seqid":"Sequenz","metadata_general_picid_link":"Zur JOSN-Beschreibung des Bildes gehen","loading_labels_serious":["\ud83d\uddfa\ufe0f Laden der Kartendaten","\ud83d\udda5\ufe0f API anfragen","\ud83d\uddbc\ufe0f Vorschaubilder laden","\ud83d\udd0d EXIF Metadaten analysieren","\ud83c\udfd8\ufe0f 3D-Rendering","\ud83d\udcf7 360\xb0 Fotos initialisieren","\ud83d\udfe0 Farben balancieren","\ud83d\udcaf Berechnung der Qualit\xe4tsbewertung \xa9","\ud83d\udce1 Herunterladen von Updates","\ud83c\udf0d Laden von Kartenteilen","\ud83d\udcf8 Bearbeitung der Schatten"],"search_address":"Suchen sie eine Adresse, Stadt, \u2026","share_image":"HD Bild","share_rss":"RSS Feed","share_embed":"Auf Webseite einbetten","share_print":"Druck","copy":"Kopieren","copied":"Kopiert","error":"Panoramax ist abgest\xfcrzt\u2026","sequence_next":"N\xe4chstes Foto in der Sequenz","sequence_play":"Sequenz abspielen","sequence_pause":"Sequenz pausieren","sequence_prev":"Vorheriges Foto in der Sequenz","sequence_more":"Mehr Abspieloptionen","sequence_speed":"Abspielgeschwindigkeit","legend_license":"Lizenz: {l}","edit_osm":"OSM editieren","id":"iD","josm":"JOSM","josm_live":"Einschalten der automatischen JOSM-Synchronisierung beim Laden eines Bildes","error_psv":"Betrachter f\xfcr die Photospheres wurde nicht richtig geladen","error_pic":"Gesuchtes Foto wurde nicht gefunden","error_nopic":"Kein Foto verf\xfcgbar an dieser Position","error_api":"Foto-Server ist nicht verf\xfcgbar","error_josm":"JOSM reagiert nicht, ist es ge\xf6ffnet und die Remote eingeschaltet?","error_api_compatibility":"Der Foto-Server ist nicht mit dieser Version des Betrachters kompatibel","filter_date":"Datum","filter_user":"Benutzer","filter_picture":"Foto-Art","map_theme_default":"Klassisch","map_theme_age_1":">2 Jahre","metadata_general_seqid_link":"Zur JSON-Beschreibung der Sequenz gehen","metadata_general_author":"Autor","metadata_general_license":"Lizenz","metadata_general_date":"Aufnahmedatum","metadata_camera":"Kamera","metadata_camera_make":"Hersteller","metadata_camera_model":"Modell","metadata_camera_type":"Typ","metadata_camera_focal_length":"Brennweite","metadata_location":"Position","metadata_location_longitude":"L\xe4ngengrad","metadata_location_latitude":"Breitengrad","metadata_location_orientation":"Richtung","metadata_location_precision":"Pr\xe4zision der Positionierung","metadata_exif":"EXIF","minimize":"Widget verbergen, sie k\xf6nnen es \xfcber die Schaltfl\xe4che in der linken unteren Ecke wieder einblenden","map_theme_age_4":"< 1 Monat","error_subtitle":"Bitte versuchen sie es sp\xe4ter erneut, oder schauen sie in die Web-Browser-Konsole f\xfcr mehr Details.","moveLeft":"Nach links","share_rss_title":"RSS Feed neuer Sequenzen auf dem aktuell sichtbaren Kartenbereich","error_webgl":"WebGL wird von ihrem Browser nicht unterst\xfctzt","metadata_general_license_link":"Volle Lizenzbeschreibung ansehen","share_embed_docs":"Mehr \xfcber die Einbettungs-Konfiguration lesen","report_nature":{"":"Art des Problems ausw\xe4hlen\u2026","inappropriate":"Bild ist unangemessen (irrelevant, Nacktheit, ...)","picture_low_quality":"Bild hat eine sehr schlechte Qualit\xe4t","blur_missing":"Das Gesicht einer Person oder ein KFZ-Kennzeichen ist sichtbar","blur_excess":"Ein Objekt das nicht unkenntlich gemacht werden muss wurde unkenntlich gemacht","privacy":"Ein privater Pfad oder ein privates Grundst\xfcck ist sichtbar","mislocated":"Bild ist falsch auf der Karte verortet","copyright":"Bild verletzt das Urheberrecht","other":"Andere Art von Problem"},"report_details_placeholder":"Sie k\xf6nnen optionale Details \xfcber das Problem hinzuf\xfcgen","report_auth":"Dieser Report wird durch ihren Account \\"{a}\\" gesendet","report_nature_label":"Art des Problems","report_whole_sequence":"Dies betrifft die gesamte Sequenz","report_details":"Weitere Details","report_email":"Ihre Email","report_email_placeholder":"Optional","report_submit":"Absenden","report_success":"Ihr Report wurde erfolgreich gesendet. Er wird so schnell wie m\xf6glich \xfcberpr\xfcft.","report_failure":"Ein Fehler ist bei der Erstellung des Reports aufgetreten: {e}. Bitte versuchen sie es erneut.","report":"Melden","legend_title":"Zeige Bilderdetails","report_wait":"Bericht senden\u2026","error_click":"Weiter","error_retry":"Bitte sp\xe4ter erneut versuchen","metadata_camera_resolution":"Aufl\xf6sung","filter_user_mypics":"Meine Fotos","metadata_quality_missing":"kein Wert im Foto gesetzt","filter_date_1month":"1 Monat","filter_date_1year":"1 Jahr","filter_qualityscore":"Qualit\xe4tswert","filter_qualityscore_help":"Klicken, um zu aktivieren oder deaktivieren","map_theme_score":"Qualit\xe4tswert","metadata_quality":"Qualit\xe4t","metadata_quality_help":"Erfahre mehr \xfcber den Qualit\xe4tswert","metadata_quality_resolution_score":"Aufl\xf6sungswertung","metadata_quality_gps_score":"Positionswertung","metadata_quality_score":"Gesamtwertung","qualityscore_title":"\xdcber den Qualit\xe4tsfaktor","qualityscore_doc_link":"Weitere Informationen zur Berechnung des Qualit\xe4tsfaktors findest du in unserer Dokumentation","qualityscore_doc_1":"Panoramax bietet einen Qualit\xe4tsfaktor f\xfcr jedes Bild. Es erm\xf6glicht eine einfache Kartenfilterung und eine umfassende Anzeige der Verf\xfcgbarkeit hochwertiger Bilder.","qualityscore_doc_2":"Die Note wird den Benutzern als A/B/C/D/E-Bewertung angezeigt (A ist die beste, E die schlechteste) und anhand dieser Skala grafisch dargestellt:","qualityscore_doc_3":"Die Berechnung erfolgt auf der Grundlage der GPS-Genauigkeit und der Bildaufl\xf6sung. Ein professionelles System wird mit A bewertet, eine 360-Grad-Action-Kamera mit B und ein Smartphone mit C/D/E.","minimize_short":"Verbergen","semantics_features_none":"Bislang wurde kein Feature erkannt oder annotiert in diesem Bild.","semantics_features_default_title":"Feature #{nb}","semantics_features_subtitle":"{nb} assozierte Eigenschaften","semantics_show_all_tags":"Alle Schlagworte anzeigen","semantics_title":"Schlagworte","semantics_tags":"{nb] Schlagworte","semantics_features":"Erkannte Features","semantics_hide_all_tags":"Alle Schlagworte verbergen","semantics_annotation_tooltip":"Klicken um Details zu sehen","semantics_key":"Schl\xfcssel","semantics_value":"Wert","semantics_key_doc":"Mehr \xfcber diesen Schl\xfcssel erfahren","semantics_value_doc":"Mehr \xfcber dieses Schlagwort erfahren","semantics_tags_picture":"Foto-Schlagworte","semantics_tags_picture_none":"Bislang wurden keine Schlagworte f\xfcr dieses Foto gesetzt.","semantics_show_annotations":"Fotoannotierungen anzeigen","semantics_hide_annotations":"Fotoannotierungen verbergen","semantics_wikidata_properties":{"P31":"Instanz von","P279":"Unterklasse von","P361":"Teil von"},"metadata_exif_doc":"Dokumentation der EXIF Tags","metadata_exif_doc_title":"Zur Exiv2 Dokumentation f\xfcr die vollen Details zu EXIF und den XMP Tag Definitionen","metadata_location_coordinates":"Koordinaten (L\xe4ngengrad, Breitengrad)","metadata_location_copy":"Kopiere {v}","metadata_location_copy_more":"Mehr Optionen zum Kopieren der Koordinaten","whats_panoramax":"Panoramax ist eine Geo-Commons f\xfcr Gebietsfotos.","picture_360_long":"Panoramafoto","metadata_summary":"Zusammenfassung","filter_date_6months":"6 Monate","picture_all":"Alle","picture_flat_long":"Klassisches Foto","metadata_general_instance":"Quellinstanz","geo_uri":"Externe App","contribute_id":"Zu OpenStreetMap mit dem iD Editor beitragen","metadata_general_copy_id":"ID kopieren","metadata_general_copy_picid":"Kopiere Foto ID","semantics_qualifiers":"Qualifikationskriterien","panoramax":"Panoramax","semantics_zero_annotations":"Zu diesem Bild sind keine Anmerkungen vorhanden","semantics_hashtags":"Bild-Hashtags"},"psv":{"twoFingers":"Nutzen sie zwei Finger zum navigieren","ctrlZoom":"Nutzen sie Strg+Scrollen um das Bild zu zoomen","loadError":"Das Panorama konnte nicht geladen werden"},"map":{"thumbnail":"Vorschau des marktierten Fotos","not_public":"Nicht \xf6ffentlich sichtbar","loading":"Laden\u2026","slow_loading":"Die Karte wird nur langsam geladen und k\xf6nnte fehlerhaft erscheinen","map_data":"Kartendaten: {m}","more_panoramax":"Mehr Infos \xfcber Panoramax"},"maplibre":{"GeolocateControl.FindMyLocation":"Meinen Standort finden","GeolocateControl.LocationNotAvailable":"Standort nicht verf\xfcgbar"}}')},389:at=>{"use strict";at.exports=JSON.parse('{"psv":{"twoFingers":"Use two fingers to navigate","ctrlZoom":"Use ctrl + scroll to zoom the image","loadError":"The panorama can\'t be loaded"},"maplibre":{"GeolocateControl.FindMyLocation":"Find my location","GeolocateControl.LocationNotAvailable":"Location not available"},"pnx":{"zoom":"Zoom","zoomOut":"Zoom out","zoomIn":"Zoom in","moveUp":"Move up","moveDown":"Move down","moveLeft":"Move left","moveRight":"Move right","moveMiddle":"Center view","expand":"Expand","expand_info":"Make the widget appear in full page","show_psv":"Show the picture viewer","show_map":"Show the map","minimize":"Hide this widget, you can show it again using button in bottom left corner","minimize_short":"Hide","options":"Options","filters":"Filters","layers":"Layers","search":"Search","search_empty":"No results found","search_address":"Search an address, city\u2026","search_user":"Search a username\u2026","share":"Share","share_links":"Links","share_page":"Link to this picture","share_image":"HD Image","share_rss":"RSS feed","share_rss_title":"RSS feed of new sequences in the currently visible map area","share_embed":"Embed on your website","share_embed_docs":"Read more about embed configuration","share_print":"Print","panoramax":"Panoramax","whats_panoramax":"Panoramax is the geo-commons for territories\' pictures.","copy":"Copy","copied":"Copied","error":"We have a problem\u2026","error_click":"Continue","error_retry":"Please retry later","sequence_next":"Next picture in sequence","sequence_play":"Play along this sequence","sequence_pause":"Pause sequence","sequence_prev":"Previous picture in sequence","sequence_more":"More play options","sequence_speed":"Player speed","legend_license":"License: {l}","legend_title":"Show details of picture","id":"iD","contribute_id":"Contribute to OpenStreetMap with iD editor","geo_uri":"External app","josm":"JOSM","josm_live":"Enable JOSM automatic sync on picture loading","loading_labels_serious":["\ud83d\uddfa\ufe0f Loading map data","\ud83d\udda5\ufe0f Querying API","\ud83d\uddbc\ufe0f Loading thumbnails","\ud83d\udd0d Analyzing EXIF metadata","\ud83c\udfd8\ufe0f 3D rendering","\ud83d\udcf7 Initializing 360\xb0 pictures","\ud83d\udfe0 Colour balancing","\ud83d\udcaf Computing Quality Score \xa9","\ud83d\udce1 Downloading updates","\ud83c\udf0d Fetching map tiles","\ud83d\udcf8 Processing shadows"],"loading_labels_fun":["\ud83e\udd8c Detecting deer crossing signs","\ud83d\ude98 Searching Panoramax Car \xa9","\u2615 Injecting caffeine","\ud83d\ude00 Smile, you\'re mapped!","\ud83d\udc08 Sharing cat pictures","\ud83d\ude34 Reducing procrastination","\ud83e\uded6 Brewing tea","\ud83d\udc27 Opening source code","\ud83d\ude87 Indexing Underground stations","\ud83e\uddf9 Metadata cleanup","\ud83d\ude92 Sending fire station photos","\ud83d\udeb2 Greenways update","\ud83d\ude89 Station platform walkthrough","\ud83d\udef0\ufe0f Searching satellites","\ud83d\udc65 Writing personas","\ud83d\udc1f Locating chip shops","\ud83e\uddd1\u200d\ud83d\udcbb Debugging interface","\ud83d\udcc8 Incrementing statistics","\ud83e\udd16 Learning semantics","\ud83c\udfa8 Interface redesign","\ud83d\udcc5 Planning photo-mapping-parties","\ud83e\uddc0 Maturing cheddars","\ud83c\udf04 Calculating Cornish sunshine","\ud83c\udf0a Measuring the high tides"],"error_psv":"Photo Sphere Viewer is not loading properly","error_pic":"Requested picture wasn\'t found","error_nopic":"No picture available at given position","error_api":"The pictures server is not available","error_webgl":"WebGL is not supported by your browser","error_josm":"JOSM doesn\'t respond, is it running and is remote enabled?","error_api_compatibility":"The pictures server is not compatible with this viewer version","filter_date":"Date","filter_date_1month":"1 month","filter_date_6months":"6 months","filter_date_1year":"1 year","filter_user":"User","filter_user_mypics":"My pictures","filter_picture":"Picture type","filter_zoom_in":"Zoom-in the map to see this filter","picture_all":"All","picture_flat":"Classic","picture_360":"360\xb0","picture_flat_long":"Classic picture","picture_360_long":"Panoramic picture","filter_qualityscore":"Quality score","filter_qualityscore_help":"Click to enable or disable","qualityscore_title":"About the quality score","qualityscore_doc_1":"Panoramax offers a Quality Score for each picture. It allows easy map filtering and comprehensive display of high-quality pictures availability.","qualityscore_doc_2":"The grade is shown to users as a A/B/C/D/E score (A is the best, E the worst), and shown graphically through this scale:","qualityscore_doc_3":"It is computed based on GPS precision and picture resolution. A professional system will have an A-rating, a 360\xb0 action camera will have a B-rating, and a smartphone will be C/D/E-rated.","qualityscore_doc_link":"Know more about the Quality Score","map_background":"Map background","map_background_aerial":"Aerial","map_background_streets":"Streets","map_theme":"Map theme","map_theme_default":"Classic","map_theme_age":"Capture date","map_theme_age_1":"> 2 years","map_theme_age_2":"< 2 years","map_theme_age_3":"< 1 year","map_theme_age_4":"< 1 month","map_theme_type":"Camera type","map_theme_score":"Quality score","contrast":"Enable higher image contrast","metadata":"Picture metadata","metadata_summary":"Summary","metadata_general_copy_id":"Copy ID","metadata_general_copy_picid":"Copy picture ID","metadata_general_picid":"Picture","metadata_general_seqid":"Sequence","metadata_general_picid_link":"Go to JSON description of the picture","metadata_general_seqid_link":"Go to JSON description of the sequence","metadata_general_author":"Author","metadata_general_license":"License","metadata_general_license_link":"See the full licence description","metadata_general_date":"Capture date","metadata_general_instance":"Origin instance","metadata_camera":"Camera","metadata_camera_make":"Make","metadata_camera_model":"Model","metadata_camera_type":"Type","metadata_camera_resolution":"Resolution","metadata_camera_focal_length":"Focal length","metadata_location":"Position","metadata_location_coordinates":"Coordinates (longitude, latitude)","metadata_location_orientation":"Direction","metadata_location_precision":"Positioning precision","metadata_location_copy":"Copy {v}","metadata_location_copy_more":"More coordinates copy options","metadata_quality":"Quality","metadata_quality_help":"Know more about Quality Score","metadata_quality_score":"Global score","metadata_quality_gps_score":"Positioning score","metadata_quality_resolution_score":"Resolution score","metadata_quality_missing":"no value set in picture","metadata_exif":"EXIF","metadata_exif_name":"Tag","metadata_exif_value":"Value","metadata_exif_doc":"Docs for EXIF tags","metadata_exif_doc_title":"Go to Exiv2 documentation to have full details on EXIF and XMP tags definitions","semantics_title":"Tags","semantics_tags":"{nb} tags","semantics_features":"Detected features","semantics_features_none":"No feature has been detected or annotated in this picture yet.","semantics_features_default_title":"Feature #{nb}","semantics_features_subtitle":"{nb} associated properties","semantics_annotation_tooltip":"Click to see details","semantics_show_all_tags":"Show all tags","semantics_hide_all_tags":"Hide all tags","semantics_key":"Key","semantics_value":"Value","semantics_key_doc":"Know more about this key","semantics_value_doc":"Know more about this tag","semantics_tags_picture":"Picture tags","semantics_tags_picture_none":"No tags has been set for this picture yet.","semantics_qualifiers":"Qualifiers","semantics_show_annotations":"Display picture annotations","semantics_hide_annotations":"Hide picture annotations","semantics_zero_annotations":"No annotation set on this picture","semantics_hashtags":"Picture hashtags","semantics_wikidata_properties":{"P31":"instance of","P279":"subclass of","P361":"part of"},"semantics_editor_error":"The syntax is invalid. Your tags may look like:\\nkey=value\\nprefix|key=value\\nprefix|key[qualif_key=qualif_val]=value\\n\\nMax key length is 256 characters, max value length 2048 characters.","semantics_editor_example":"key=value\\nprefix|key=value","semantics_edit":"Edit attributes","semantics_save":"Save your changes","semantics_undo":"Cancel your edits","semantics_cantsave_invalid":"Cannot save changes, input is invalid","semantics_send_fail":"Unable to save your changes, please try again later","semantics_send_ok":"Your edits were sent successfully","report":"Report","report_auth":"This report will be sent using your account \\"{a}\\"","report_nature_label":"Cause of the issue","report_nature":{"":"Select the nature of issue\u2026","blur_missing":"A person\'s face or car license plate is visible","blur_excess":"An unnecessary blur was applied to an object","inappropriate":"Picture is inappropriate (unrelated, nudity\u2026)","privacy":"A private path or property is visible","picture_low_quality":"Image is low quality","mislocated":"Picture is poorly positioned on map","copyright":"Picture infringes copyright","other":"Any other kind of issue"},"report_whole_sequence":"This concerns the entire sequence","report_details":"Additional details","report_details_placeholder":"Optionally, you can add details about the issue","report_email":"Your email","report_email_placeholder":"Optional","report_submit":"Submit","report_wait":"Sending report\u2026","report_success":"Report was sent successfully. It will be reviewed as soon as possible.","report_failure":"An error occurred when creating report: {e}. Please try again later."},"map":{"loading":"Loading\u2026","thumbnail":"Thumbnail of hovered picture","not_public":"Not publicly visible","slow_loading":"Map is slow to load and could appear broken","map_data":"Map based on {m}","more_panoramax":"Discover more about Panoramax"}}')},9946:at=>{"use strict";at.exports=JSON.parse('{"psv":{"twoFingers":"Uzu du fingrojn por navigi","ctrlZoom":"Uzu ctrl + rulumo por zomi la bildon","loadError":"La bildo ne povas esti \u015dar\u011dita"},"pnx":{"zoom":"Zomo","zoomOut":"Malzomo","zoomIn":"Zomi","moveUp":"Movi supren","moveDown":"Movi malsupren","moveLeft":"Movi maldekstren","moveRight":"Movi dekstren","moveMiddle":"Centri vido","expand":"Pligrandigi","expand_info":"Aperigu la fenestra\u0135on en plena pa\u011do","show_psv":"Montri la bildspektilo","show_map":"Montri la mapo","minimize":"Maski la fenestra\u0135o, vu povas montri \u011din denove kun la butono en malsupra maldekstra angulo","sequence_prev":"Anta\u016da foto en la sekvenco","sequence_more":"Pli da ludopcioj","sequence_speed":"Rapideco de legado","sequence_next":"Sekva foto en la sekvenco","sequence_play":"Foliumi \u0109i tiun sinsekvon","sequence_pause":"Pa\u016dzi la sekvenco","copy":"Kopii","copied":"Kopiita","error":"Ni havas problemon\u2026","error_click":"Kontinui","error_retry":"Bonvolu reprovi poste","search_address":"Ser\u0109i adreson, urbon\u2026","filters":"Filtriloj","layers":"Tavoloj","search":"Ser\u0109i","share_embed_docs":"Pli pri enigito sur via retpa\u011daro","search_empty":"Neniu rezulto trovita","search_user":"Ser\u0109i uzantnomon\u2026","share":"Kunhavigi","share_links":"Ligiloj","share_page":"Ligilo de la foto","share_image":"HD bildo","share_rss":"RSS abonfluo","share_rss_title":"RSS abonfluo de la novaj sekvecoj en la nuntempe videbla mapzono","share_embed":"Enigita en via retpa\u011daro","share_print":"Presi","edit_osm":"Modifi OSM","legend_license":"Rajtigilo : {l}","josm_live":"Ebligas a\u016dtomatan JOSM-sinkronigon dum \u015dar\u011do de bildo","loading_labels_serious":["\ud83d\uddfa\ufe0f \u015cargo de la bazmapon","\ud83d\udda5\ufe0f API demandado","\ud83d\uddbc\ufe0f \u015car\u011do de miniaturoj","\ud83d\udd0d Analizo de EXIF-metadatumoj","\ud83c\udfd8\ufe0f 3D-rendumo","\ud83d\udcf7 Inico de 360\xb0-bildoj","\ud83d\udfe0 Kolora ekvilibrigo","\ud83d\udcaf Kalkulo de kvalitpoentaro \xa9","\ud83d\udce1 El\u015dutante \u011disdatoj","\ud83c\udf0d Reakirante mapkaheloj","\ud83d\udcf8 Traktadante ombroj"],"legend_title":"Montri la detaloj de la bildo","error_api":"La bildservilo ne estas disponebla","error_josm":"JOSM ne respondis. \u0108u \u011di funkcias kaj la regilo estas \u015daltita?","error_webgl":"WebGL ne estas subtenata per via retumilo","loading_labels_fun":["\ud83e\udd8c Detekto de cervinaj vojmontriloj","\ud83d\ude98 Ser\u0109o de Panoramax-a\u016dto \xa9","\u2615 Injekto de kafeino","\ud83d\ude00 Ridetu, vi estas mapita!","\ud83d\udc08 Kunhavigo de katbildoj","\ud83d\ude34 Redukto de prokrastado","\ud83d\udcd6 Lernado de Esperanto","\ud83d\udc27 Malfermo de fontkodo","\ud83d\ude87 Indekso de subteraj stacioj","\ud83e\uddf9 Purigo de metadatumoj","\ud83d\ude92 Sendado de fotoj de fajrostacioj","\ud83d\udeb2 \u011cisdatigo de verdaj vojoj","\ud83d\ude89 Promenado tra stacioplatformoj","\ud83d\udef0\ufe0f Ser\u0109o de satelitoj","\ud83d\udc65 Verkado de roluloj","\u2747\ufe0f Lokalizo de la Esperanto-flagoj","\ud83e\uddd1\u200d\ud83d\udcbb Sencimigado de la interfaco","\ud83d\udcc8 Alkrementi de la statistikoj","\ud83e\udd16 Lernadante semantiko","\ud83c\udfa8 Interfaca redezajno","\ud83d\udcc5 Planante fota-mapa-festoj","\ud83e\uddc0 Finmaturigo de la froma\u011doj","\ud83c\udf04 Kalkulante la sunbrilon de la Saharo","\ud83c\udf0a Mezurado de la altaj tajdoj"],"picture_360":"360\xb0","picture_flat":"Klasika","report_nature_label":"Speco de problemo","report_nature":{"":"Elektu la specon de problemo\u2026","blur_missing":"Viza\u011do a\u016d numerplato estas videbla","copyright":"La bildo malobeas kopirajton","blur_excess":"Objekto kiu ne bezonis malklari\u011don estas malklarigita","inappropriate":"La bildo estas neta\u016dga (nevera, nudeco...)","privacy":"Privata vojo a\u016d poseda\u0135o estas videbla","picture_low_quality":"La bildo estas de tre malbona kvalito","mislocated":"La bildo estas malbone poziciigita sur la mapo","other":"\u0108ia alia speco de problemo"},"report":"Raporti","report_auth":"\u0108i tiu raporto estos sendita per via konto \\"{a}\\"","filter_date":"Dato","filter_user_mypics":"Miaj fotoj","options":"Opcioj","error_api_compatibility":"La fotoservilo ne kongruas kun \u0109i tiu spektilo","filter_qualityscore":"Kvalitpoentaro","filter_qualityscore_help":"Alllaku por aktivigi a\u016d mal\u015dalti","map_theme_age":"Dato de fotado","map_theme_age_1":"> 2 jaroj","map_theme_age_2":"< 2 jaroj","map_theme_age_3":"< 1 jaro","map_theme_age_4":"< 1 monato","map_theme_score":"Kvalitpoentaro","metadata":"Metadatenoj de la bildo","map_theme_type":"Fotiltipo","metadata_general_seqid":"Sekvenco","metadata_camera_resolution":"Difino","metadata_quality_resolution_score":"Rezolucia poentaro","error_psv":"Foto-Sfera Spektilo ne \u015dar\u011di\u011das \u011duste","error_pic":"La petita bildo ne estis trovita","error_nopic":"Neniu bildo disponeblas \u0109e la donita pozicio","filter_user":"Uzanto","map_theme_default":"Klasika","filter_date_1month":"1 monato","filter_date_1year":"1 jaro","contrast":"Pliigi bildkontraston","metadata_general_picid":"Foto","filter_picture":"Bilda tipo","filter_zoom_in":"Zomu en la mapo por vidi tiun filtrilon","map_background":"Bazmapo","map_background_aerial":"Aera","map_background_streets":"Stratoj","map_theme":"Mapa etoso","metadata_general_picid_link":"Iru al la JSON-priskribo de la foto","metadata_general_seqid_link":"Iru al la JSON-priskribo de la sekvenco","metadata_general_author":"A\u016dtoro","metadata_general_license":"Rajtigilo","metadata_general_license_link":"Vidi la kompletan rajtigilon en la priskribo","metadata_general_date":"Dato de la fotado","metadata_camera":"Fotilo","metadata_camera_make":"Faristo","metadata_camera_model":"\u015cablono","metadata_camera_type":"Tipo","metadata_camera_focal_length":"Fokuslongo","metadata_location":"Pozicio","metadata_location_longitude":"Longitudo","metadata_location_latitude":"Latitudo","metadata_location_orientation":"Direkto","metadata_location_precision":"Pozicia precizeco","metadata_quality":"Kvalito","metadata_quality_help":"Pli pri la Kvalitapoentaro","metadata_quality_score":"Malloka poentaro","metadata_quality_gps_score":"Pozicia poentaro","metadata_quality_missing":"neniu valoro en la bildo","metadata_exif":"EXIF","metadata_exif_name":"Etikedo","metadata_exif_value":"Valoro","report_whole_sequence":"\u0108i tio koncernas la tutan sekvencon","report_details":"Aliaj detaloj","report_email":"Via retpo\u015dto","report_submit":"Sendi","report_wait":"Sendante raporton\u2026","report_success":"La raporto estis sukcese sendita. \u011ci estos reviziita balda\u016d.","report_details_placeholder":"Opcie, vi povas aldoni detalojn pri la problemo","report_email_placeholder":"Opcie","report_failure":"Eraro okazis dum kreo de la raporto: {e}. Bonvolu provi denove poste.","qualityscore_doc_3":"\u011ci estas kalkulita surbaze de GPS-precizeco kaj bildrezolucio. Profesiaj sistemoj havos A-poentaron, 360\xb0-akcifotilo havos B-poentaron, kaj po\u015dtelefono havos C/D/E-poentaron.","qualityscore_title":"Pri la kvalita poentaro","qualityscore_doc_1":"Panoramax ofertas Kvalitan Poentaron por \u0109iu bildo. \u011ci ebligas facilan mapfiltradon kaj ampleksan vidigon de la havebleco de altkvalitaj bildoj.","qualityscore_doc_link":"Pli da detaloj pri la kalkulo de la Kvalita Poentaro estas disponeblaj en nia dokumentado","minimize_short":"Maski","qualityscore_doc_2":"La poentaro estas montrita al uzantoj kiel litero A/B/C/D/E (A estas la plej bona, E la plej malbona) kaj grafike prezentita per \u0109i tiu skalo:","id":"iD","josm":"JOSM","contribute_id":"Kontribuu al OpenStreetMap kun iD-modifilo","filter_date_6months":"6 monatoj","picture_all":"\u0108iuj","picture_flat_long":"Klasika foto","picture_360_long":"Panorama foto","metadata_summary":"Resumo","metadata_general_copy_id":"Kopii la ID-on","metadata_general_copy_picid":"Kopii la fotan ID-on","metadata_general_instance":"Origina instanco","geo_uri":"Ekseteraj aplika\u0135oj","semantics_title":"Etikedoj","semantics_tags":"{nb} etikedoj","semantics_features":"Detektitaj objektoj","semantics_features_none":"No objekto estis ankora\u016d detektita a\u016d prinotita en \u0109i tiu foto.","semantics_features_default_title":"Objekto #{nb}","metadata_exif_doc":"Dokumentoj por EXIF-etikedoj","metadata_exif_doc_title":"Iru al la dokumentaro de Exiv2 por havi plenajn detalojn pri difinoj de EXIF kaj XMP-etikedoj","metadata_location_coordinates":"Koordinatoj (longitudo, latitudo)","metadata_location_copy":"Kopii {v}","metadata_location_copy_more":"Pli da ebloj por kopii koordinatojn","whats_panoramax":"Panoramax estas la geokomuna\u0135o por teritoriaj fotoj.","semantics_features_subtitle":"{nb} asociitaj atributoj","semantics_tags_picture_none":"Ankora\u016d neniuj atributoj estas difinitaj por \u0109i tiu foto.","semantics_hide_all_tags":"Maski la atributojn","semantics_key":"\u015closilo","semantics_value":"Valoro","semantics_show_all_tags":"Vidi \u0109iujn atributojn","semantics_tags_picture":"Foto-atributoj","semantics_value_doc":"Lernu pli pri \u0109i tiu atributo","semantics_qualifiers":"Kvalifikiloj","semantics_hide_annotations":"Maski bildajn komentojn","semantics_wikidata_properties":{"P279":"subklaso de","P361":"parto de","P31":"instanco de"},"share_picture":"Foto","semantics_annotation_tooltip":"Alklaku por vidi la detalojn","semantics_show_annotations":"Montri bildajn komentojn","semantics_key_doc":"Lernu pli pri \u0109i tiu \u015dlosilo"},"maplibre":{"GeolocateControl.FindMyLocation":"Trovi mian pozicion","GeolocateControl.LocationNotAvailable":"Loko ne disponeblas"},"map":{"slow_loading":"La mapo \u015dar\u011das malrapide kaj povus aperi rompi\u011dinta","loading":"\u015car\u011danto\u2026","thumbnail":"Miniaturo de la surflikta bildo","not_public":"Ne publike videbla","more_panoramax":"Malkovri pli pri Panoramax","map_data":"Kartaj datumoj : {m}"}}')},8302:at=>{"use strict";at.exports=JSON.parse('{"pnx":{"report_auth":"La denuncia se enviar\xe1 usando tu cuenta \xab{a}\xbb","report":"Denunciar imagen","report_nature_label":"Tipo de problema","report_nature":{"":"Selecciona el tipo de problema\u2026","blur_missing":"Se ve el rostro de una persona, o una matr\xedcula","blur_excess":"Est\xe1 borroso un objeto que no hac\xeda falta ocultar","inappropriate":"La imagen no es apropiada (irrelevante, desnudez, \u2026)","privacy":"Se ve un camino privado, o una propiedad privada","mislocated":"La localizaci\xf3n de la imagen en el mapa no es correcta","picture_low_quality":"La calidad de la imagen es pobre","copyright":"La imagen infringe derechos de autor","other":"Otro tipo de problema"},"sequence_more":"M\xe1s opciones de reproducci\xf3n","sequence_speed":"Velocidad de reproducci\xf3n","legend_license":"Licencia: {l}","edit_osm":"Editar OpenStreetMap","id":"iD","josm":"JOSM","josm_live":"Activar la sincronizaci\xf3n autom\xe1tica de JOSM cuando se carga una imagen","loading_labels_serious":["\ud83d\uddfa\ufe0f Cargando datos del mapa","\ud83d\udda5\ufe0f Consultando la API","\ud83d\uddbc\ufe0f Cargando vistas previas","\ud83d\udd0d Analizando metadatos EXIF","\ud83c\udfd8\ufe0f Renderizado 3D","\ud83d\udcf7 Preparando im\xe1genes 360\xb0","\ud83d\udfe0 Ajustando balance de color","\ud83d\udcaf C\xe1lculo del nivel de calidad \xa9"],"metadata":"Metadatos de la imagen","map_theme_type":"Tipo de c\xe1mara","contrast":"Dar m\xe1s contraste a la imagen","zoom":"Acercar/alejar","zoomOut":"Alejar","map_background_streets":"Calles","loading_labels_fun":["\ud83e\udd8c Detectando paneles de cruce de alces","\ud83d\ude98 Buscando el Coche Panoramax \xa9","\u2615 Inyectando cafe\xedna","\ud83d\ude00 \xa1Sonr\xede, est\xe1s siendo mapeado!","\ud83d\udc08 Compartiendo fotos de gatos","\ud83d\ude34 Reduciendo la procrastinaci\xf3n","\ud83e\uded6 Preparando el t\xe9","\ud83d\udc27 Abriendo el c\xf3digo fuente","\ud83d\ude87 Indexando estaciones del metro","\ud83e\uddf9 Limpieza de metadatos","\ud83d\ude92 Enviando fotos de estaciones de bomberos","\ud83d\udeb2 Actualizando v\xedas verdes","\ud83d\ude89 Paseo por el and\xe9n de la estaci\xf3n","\ud83d\udef0\ufe0f Buscando sat\xe9lites","\ud83d\udc65 Describiendo tipolog\xedas de persona","\ud83d\udc1f Localizando tiendas de fish & chips","\ud83e\uddd1\u200d\ud83d\udcbb Buscando gazapos de la interfaz","\ud83d\udcc8 Incrementando estad\xedsticas"],"metadata_general_license_link":"Ir a la descripci\xf3n completa de la licencia","metadata_general_picid":"Identificador de la imagen","metadata_general_license":"Licencia","report_details_placeholder":"Opcional; puedes a\xf1adir m\xe1s detalles sobre el problema y por qu\xe9 te preocupa","expand":"Expandir","expand_info":"Mostrar el elemento ocupando toda la p\xe1gina","show_psv":"Mostrar el visor de im\xe1genes","show_map":"Mostrar el mapa","zoomIn":"Acercar","moveUp":"Desplazar hacia arriba","moveDown":"Desplazar hacia abajo","moveLeft":"Desplazar hacia la izquierda","moveRight":"Desplazar hacia la derecha","moveMiddle":"Centrar la vista","minimize":"Esconder este elemento. Para mostrarlo de nuevo, pulsa el bot\xf3n en la esquina inferior izquierda","options":"Opciones","filters":"Filtros","layers":"Capas","search":"Buscar","search_empty":"No se encontraron resultados","search_address":"Buscar una direcci\xf3n, una ciudad, \u2026","search_user":"Buscar un usuario\u2026","share":"Compartir","share_links":"Enlaces","share_page":"Enlace a esta p\xe1gina","share_image":"Imagen de alta calidad","share_rss":"Flujo RSS","share_rss_title":"Flujo RSS de las nuevas secuencias en el \xe1rea visible del mapa","share_embed":"Incrustar en tu p\xe1gina web","share_embed_docs":"M\xe1s informaci\xf3n sobre c\xf3mo configurar el incrustado","share_print":"Imprimir","copy":"Copiar","copied":"Copiado","error":"Hay un problema\u2026","sequence_next":"Siguiente imagen de la secuencia","sequence_play":"Reproducir esta secuencia","sequence_pause":"Pausar la secuencia","sequence_prev":"Imagen anterior de la secuencia","error_click":"Continuar","error_retry":"Por favor, int\xe9ntalo m\xe1s tarde","error_psv":"El visor de fotos esf\xe9ricas no se carga correctamente","error_pic":"No se encuentra la imagen que quer\xedamos","error_nopic":"No hay im\xe1genes para la posici\xf3n dada","error_api":"El servidor de im\xe1genes no est\xe1 disponible","error_webgl":"Este navegador no admite WebGL","error_josm":"JOSM no responde. \xbfEst\xe1 abierto, y admite el modo de Control Remoto?","error_api_compatibility":"El servidor de im\xe1genes no es compatible con esta versi\xf3n del visor","filter_date":"Fecha","filter_user":"Usuario","filter_picture":"Tipo de imagen","filter_zoom_in":"Ac\xe9rcate para poder ver filtros","picture_flat":"Cl\xe1sico","picture_360":"360\xb0","filter_camera_model":"Por modelo de c\xe1mara","map_background":"Fondo de mapa","map_background_aerial":"Vista a\xe9rea","map_theme":"Tema de mapa","map_theme_default":"Cl\xe1sico","map_theme_age":"Fecha de toma de imagen","map_theme_age_1":"M\xe1s de dos a\xf1os","map_theme_age_2":"Menos de dos a\xf1os","map_theme_age_3":"Menos de un a\xf1o","map_theme_age_4":"Menos de un mes","metadata_general_seqid":"Identificador de la secuencia","metadata_general_picid_link":"Ir a la descripci\xf3n de la imagen en formato JSON","metadata_general_seqid_link":"Ir a la descripci\xf3n de la secuencia en formato JSON","metadata_general_author":"Autor","metadata_general_date":"Fecha de toma de imagen","metadata_camera":"C\xe1mara","metadata_camera_make":"Marca","metadata_camera_model":"Modelo","metadata_camera_type":"Tipo","metadata_camera_focal_length":"Distancia focal","metadata_location":"Localizaci\xf3n","metadata_location_longitude":"Longitud","metadata_location_latitude":"Latitud","metadata_location_orientation":"Orientaci\xf3n","metadata_location_precision":"Precisi\xf3n de la localizaci\xf3n","metadata_exif":"EXIF / XMP","metadata_exif_name":"Etiqueta","metadata_exif_value":"Valor","report_whole_sequence":"El problema afecta a la secuencia entera","report_details":"M\xe1s detalles","report_email":"Tu direcci\xf3n de correo electr\xf3nico","report_email_placeholder":"Opcional","report_submit":"Enviar","report_success":"La denuncia se ha enviado correctamente. Ser\xe1 revisada lo antes posible.","report_failure":"Ocurri\xf3 un error al crear la denuncia: {e}. Por favor, int\xe9ntalo m\xe1s tarde.","map_theme_score":"Nivel de calidad","filter_qualityscore":"Nivel de calidad","filter_qualityscore_help":"Haga clic para habilitar o deshabilitar","legend_title":"Ver detalles de la imagen","metadata_camera_resolution":"Resoluci\xf3n","metadata_quality":"Puntuaci\xf3n de calidad","metadata_quality_help":"M\xe1s informaci\xf3n sobre el nivel de calidad","metadata_quality_score":"Valoraci\xf3n general","metadata_quality_gps_score":"Puntuaci\xf3n de posicionamiento","metadata_quality_resolution_score":"Puntuaci\xf3n de resoluci\xf3n","metadata_quality_missing":"no hay informaci\xf3n en la imagen","report_wait":"Env\xedo del informe\u2026"},"psv":{"ctrlZoom":"Utiliza Control+rueda de desplazamiento para acercar/alejar","loadError":"Este panorama no se puede cargar","twoFingers":"Desplaza el mapa con dos dedos"},"maplibre":{"GeolocateControl.FindMyLocation":"Local\xedzame","GeolocateControl.LocationNotAvailable":"Localizaci\xf3n no disponible"},"map":{"loading":"Cargando\u2026","thumbnail":"Vista previa de la imagen bajo el cursor","not_public":"No es visible p\xfablicamente","slow_loading":"La mapa tarda mucho en cargarse y puede parecer rota"}}')},5222:at=>{"use strict";at.exports=JSON.parse('{"psv":{"twoFingers":"Utilisez deux doigts pour vous d\xe9placer","ctrlZoom":"Utilisez ctrl + scroll pour zoomer dans l\'image","loadError":"L\'image ne peut pas \xeatre charg\xe9e"},"maplibre":{"GeolocateControl.FindMyLocation":"Afficher ma position","GeolocateControl.LocationNotAvailable":"GPS non-disponible"},"pnx":{"zoom":"Zoom","zoomOut":"D\xe9zoomer","zoomIn":"Zoomer","moveUp":"Vers le haut","moveDown":"Vers le bas","moveLeft":"Vers la gauche","moveRight":"Vers la droite","moveMiddle":"Centrer la vue","expand":"Agrandir","expand_info":"Faire appara\xeetre ce widget en pleine page","show_psv":"Afficher la visionneuse de photos","show_map":"Afficher la carte","minimize":"Masquer ce widget, vous pouvez l\'afficher de nouveau gr\xe2ce au bouton dans le coin en bas \xe0 gauche","minimize_short":"Masquer","options":"Options","filters":"Filtres","layers":"Calques","search":"Rechercher","search_empty":"Aucun r\xe9sultat","search_address":"Rechercher une adresse, ville\u2026","search_user":"Rechercher un nom d\'utilisateur\u2026","share":"Partager","share_links":"Liens utiles","share_page":"Lien de la photo","share_image":"Image HD","share_rss":"Flux RSS","share_rss_title":"Flux RSS des nouvelles s\xe9quences dans la zone visible sur la carte","share_embed":"Int\xe9gration sur votre site","share_embed_docs":"D\xe9couvrir plus de possibilit\xe9s pour l\'int\xe9gration sur votre site","share_print":"Imprimer","panoramax":"Panoramax","whats_panoramax":"Panoramax est le g\xe9ocommun des photos des territoires.","copy":"Copier","copied":"Copi\xe9","error":"On a un probl\xe8me\u2026","error_click":"Continuer","error_retry":"Merci de r\xe9essayer plus tard","sequence_next":"Photo suivante dans la s\xe9quence","sequence_play":"Parcourir cette s\xe9quence","sequence_pause":"Mettre en pause la s\xe9quence","sequence_prev":"Photo pr\xe9c\xe9dente dans la s\xe9quence","sequence_more":"Plus d\'options de lecture","sequence_speed":"Vitesse de lecture","legend_license":"Licence : {l}","legend_title":"Afficher les d\xe9tails de l\'image","id":"iD","contribute_id":"Contribuez \xe0 OpenStreetMap avec l\'\xe9diteur iD","geo_uri":"App externe","josm":"JOSM","josm_live":"Active la synchronisation automatique de JOSM lors du chargement d\'une photo","loading_labels_serious":["\ud83d\uddfa\ufe0f Chargement du fond de carte","\ud83d\udda5\ufe0f Interrogation de l\'API","\ud83d\uddbc\ufe0f Chargement des miniatures","\ud83d\udd0d Analyse des m\xe9tadonn\xe9es EXIF","\ud83c\udfd8\ufe0f Cr\xe9ation du rendu 3D","\ud83d\udcf7 Initialisation des vues 360\xb0","\ud83d\udfe0 \xc9quilibrage des couleurs","\ud83d\udcaf Calcul du score qualit\xe9 \xa9","\ud83d\udce1 T\xe9l\xe9chargement des mises \xe0 jour","\ud83c\udf0d R\xe9cup\xe9ration des tuiles","\ud83d\udcf8 Traitement des ombres"],"loading_labels_fun":["\ud83e\udd8c D\xe9tection des panneaux biche","\ud83d\ude98 Recherche de la Panoramax Car \xa9","\u2615 Injection de caf\xe9ine","\ud83d\ude00 Souriez, vous \xeates mapp\xe9s !","\ud83d\udc08 Partage de photos de chats","\ud83d\ude34 R\xe9duction de la procrastination","\ud83c\uddf7\ud83c\uddea Chargement : 974%","\ud83d\udc27 Ouverture du code source","\ud83e\udd81 Indexation des traboules","\ud83e\uddf9 Nettoyage des m\xe9tadonn\xe9es","\ud83d\ude92 Envoi des photos du SDIS","\ud83d\udeb2 Mise \xe0 jour des voies vertes","\ud83d\ude89 Remont\xe9e des quais de gare","\ud83d\udef0\ufe0f Recherche de satellites","\ud83d\udc65 \xc9criture des personas","\ud83e\udd5e Localisation des cr\xeaperies","\ud83e\uddd1\u200d\ud83d\udcbb D\xe9boguage de l\'interface","\ud83d\udcc8 Incr\xe9mentation des statistiques","\ud83e\udd16 Apprentissage de la s\xe9mantique","\ud83c\udfa8 Redesign de l\'interface","\ud83d\udcc5 Planification des photos-carto-parties","\ud83e\uddc0 Affinage des fromages","\ud83c\udf04 Calcul de l\'ensoleillement corse","\ud83c\udf0a Mesure des grandes mar\xe9es"],"error_psv":"Photo Sphere Viewer ne s\'est pas charg\xe9 correctement","error_pic":"La photo demand\xe9e est introuvable","error_nopic":"Aucune photo disponible autour de la localisation recherch\xe9e","error_api":"Le serveur de photos n\'est pas disponible","error_webgl":"WebGL n\'est pas support\xe9 par votre navigateur","error_josm":"JOSM n\'a pas r\xe9pondu, est-il bien lanc\xe9 et la t\xe9l\xe9commande activ\xe9e ?","error_api_compatibility":"Le serveur de photos n\'est pas compatible avec cette visionneuse","filter_date":"Date","filter_date_1month":"1 mois","filter_date_6months":"6 mois","filter_date_1year":"1 an","filter_user":"Utilisateur","filter_user_mypics":"Mes photos","filter_picture":"Type d\'image","picture_all":"Tout","picture_flat":"Classique","picture_360":"360\xb0","picture_flat_long":"Photo classique","picture_360_long":"Photo panoramique","filter_qualityscore":"Score de qualit\xe9","filter_qualityscore_help":"Cliquez pour activer ou d\xe9sactiver","qualityscore_title":"\xc0 propos du score de qualit\xe9","qualityscore_doc_1":"Panoramax propose un Score de Qualit\xe9 pour chacune de ses photos. Cela facilite le filtre et la recherche de photos de bonne qualit\xe9 sur la carte.","qualityscore_doc_2":"Le score est affich\xe9 sous la forme d\'une lettre A/B/C/D/E (A \xe9tant le meilleur, E le moins bon), et visualisable gr\xe2ce \xe0 cette \xe9chelle :","qualityscore_doc_3":"Il est calcul\xe9 en fonction de la pr\xe9cision du GPS ainsi que la r\xe9solution de la photo. Un mat\xe9riel professionnel aura une note de A, une cam\xe9ra sportive 360\xb0 une note de B, et un smartphone une note de C \xe0 E.","qualityscore_doc_link":"En savoir plus sur le Score de Qualit\xe9","filter_zoom_in":"Zoomez la carte pour voir ce filtre","map_background":"Fond de carte","map_background_aerial":"Satellite","map_background_streets":"Plan","map_theme":"Rendu de carte","map_theme_default":"Classique","map_theme_age":"Date de prise de vue","map_theme_age_1":"> 2 ans","map_theme_age_2":"< 2 ans","map_theme_age_3":"< 1 an","map_theme_age_4":"< 1 mois","map_theme_type":"Type de cam\xe9ra","map_theme_score":"Score de qualit\xe9","contrast":"Augmenter le contraste de l\'image","metadata":"M\xe9tadonn\xe9es de la photo","metadata_summary":"R\xe9sum\xe9","metadata_general_copy_id":"Copier l\'ID","metadata_general_copy_picid":"Copier l\'ID de photo","metadata_general_picid":"Photo","metadata_general_seqid":"S\xe9quence","metadata_general_picid_link":"Aller au descriptif JSON de la photo","metadata_general_seqid_link":"Aller au descriptif JSON de la s\xe9quence","metadata_general_author":"Auteur","metadata_general_license":"Licence","metadata_general_license_link":"Voir la description compl\xe8te de la licence","metadata_general_date":"Date de prise de vue","metadata_general_instance":"Instance d\'origine","metadata_camera":"Appareil","metadata_camera_make":"Fabricant","metadata_camera_model":"Mod\xe8le","metadata_camera_type":"Type","metadata_camera_resolution":"R\xe9solution","metadata_camera_focal_length":"Longueur focale","metadata_location":"Position","metadata_location_coordinates":"Coordonn\xe9es (longitude, latitude)","metadata_location_orientation":"Direction","metadata_location_precision":"Pr\xe9cision du positionnement","metadata_location_copy":"Copier {v}","metadata_location_copy_more":"Copier d\'autres formats de coordonn\xe9es","metadata_quality":"Qualit\xe9","metadata_quality_help":"En savoir plus sur le score de qualit\xe9","metadata_quality_score":"Note globale","metadata_quality_gps_score":"Note du positionnement","metadata_quality_resolution_score":"Note de la r\xe9solution","metadata_quality_missing":"pas d\'info dans l\'image","metadata_exif":"EXIF","metadata_exif_name":"Balise","metadata_exif_value":"Valeur","metadata_exif_doc":"Doc des attributs EXIF","metadata_exif_doc_title":"Ac\xe9\xe9der \xe0 la doc Exiv2 pour en savoir plus sur les attributs EXIF et XMP","semantics_title":"Tags","semantics_tags":"{nb} attributs","semantics_features":"Objets d\xe9tect\xe9s","semantics_features_none":"Aucun objet n\'a \xe9t\xe9 d\xe9tect\xe9 ou annot\xe9 dans cette photo pour l\'instant.","semantics_features_default_title":"Objet #{nb}","semantics_features_subtitle":"{nb} attributs associ\xe9s","semantics_annotation_tooltip":"Cliquez pour voir les d\xe9tails","semantics_show_all_tags":"Voir tous les attributs","semantics_hide_all_tags":"Masquer les attributs","semantics_key":"Cl\xe9","semantics_value":"Valeur","semantics_key_doc":"En savoir plus \xe0 propos de cette cl\xe9","semantics_value_doc":"En savoir plus \xe0 propos de cet attribut","semantics_tags_picture":"Attributs de la photo","semantics_tags_picture_none":"Aucun attribut n\'a \xe9t\xe9 d\xe9fini pour cette photo pour l\'instant.","semantics_qualifiers":"Qualificateurs","semantics_show_annotations":"Afficher les annotations de photo","semantics_hide_annotations":"Masquer les annotations de photo","semantics_zero_annotations":"Aucune annotation sur cette image","semantics_hashtags":"Mots-di\xe8se de la photo","semantics_wikidata_properties":{"P31":"instance de","P279":"sous-classe de","P361":"partie de"},"semantics_editor_error":"La syntaxe est invalide. Vos attributs doivent avoir cette forme:\\ncl\xe9=valeur\\npr\xe9fixe|cl\xe9=valeur\\npr\xe9fixe|cl\xe9[qualif_cl\xe9=qualif_val]=valeur\\n\\nLongueur max des cl\xe9s : 256 caract\xe8res, max des valeurs 2048 caract\xe8res.","semantics_editor_example":"cl\xe9=valeur\\npr\xe9fixe|cl\xe9=valeur","semantics_edit":"Modifier les attributs","semantics_save":"Enregistrer vos modifications","semantics_undo":"Annuler vos modifications","semantics_cantsave_invalid":"Impossible de sauvegarder les modifications, les attributs ne sont pas valides","semantics_send_fail":"Nous n\'avons pas pu enregistrer vos modifications, merci de r\xe9essayer plus tard","semantics_send_ok":"Vos modifications ont bien \xe9t\xe9 enregistr\xe9es","report":"Signaler","report_auth":"Ce signalement sera envoy\xe9 en utilisant votre compte \\"{a}\\"","report_nature_label":"Nature du probl\xe8me","report_nature":{"":"S\xe9lectionnez la nature du probl\xe8me\u2026","blur_missing":"Un visage ou une plaque d\'immatriculation est visible","blur_excess":"Un objet qui ne n\xe9cessite pas de floutage est flout\xe9","inappropriate":"L\'image est inappropri\xe9e (non pertinente, nudit\xe9\u2026)","privacy":"Un chemin priv\xe9 ou une propri\xe9t\xe9 priv\xe9e est visible","picture_low_quality":"L\'image est de mauvaise qualit\xe9","mislocated":"L\'image est mal g\xe9olocalis\xe9e","copyright":"L\'image enfreint les droits d\'auteur","other":"Tout autre type de probl\xe8me"},"report_whole_sequence":"Cela concerne toute la s\xe9quence","report_details":"D\xe9tails suppl\xe9mentaires","report_details_placeholder":"Optionnel, vous pouvez ajouter des d\xe9tails sur le probl\xe8me","report_email":"Votre email","report_email_placeholder":"Optionnel","report_submit":"Envoyer","report_wait":"Envoi du signalement en cours\u2026","report_success":"Le signalement a \xe9t\xe9 envoy\xe9 avec succ\xe8s. Il sera examin\xe9 d\xe8s que possible.","report_failure":"Une erreur est survenue lors de la cr\xe9ation du signalement : {e}. Veuillez r\xe9essayer plus tard."},"map":{"loading":"Chargement\u2026","thumbnail":"Miniature de la photo survol\xe9e","not_public":"Masqu\xe9 au public","slow_loading":"La carte est longue \xe0 charger et pourrait appara\xeetre cass\xe9e","map_data":"Carte bas\xe9e sur {m}","more_panoramax":"En savoir plus sur Panoramax"}}')},6909:at=>{"use strict";at.exports=JSON.parse('{"psv":{"twoFingers":"K\xe9t ujjal navig\xe1lhat","ctrlZoom":"K\xf6zel\xedt\xe9s vagy t\xe1vol\xedt\xe1s: Ctrl + g\xf6rget\xe9s","loadError":"A panor\xe1ma nem t\xf6lthet\u0151 be"},"pnx":{"zoom":"Nagy\xedt\xe1s","zoomOut":"T\xe1vol\xedt\xe1s","zoomIn":"K\xf6zel\xedt\xe9s","moveUp":"Mozg\xe1s fel","moveDown":"Mozg\xe1s le","moveLeft":"Mozg\xe1s balra","moveRight":"Mozg\xe1s jobbra","moveMiddle":"N\xe9zet k\xf6z\xe9pre hoz\xe1sa","expand":"B\u0151v\xedt\xe9s","expand_info":"Widget megjelen\xedt\xe9se teljes oldalon","show_psv":"K\xe9pn\xe9zeget\u0151 megjelen\xedt\xe9se","show_map":"T\xe9rk\xe9p megjelen\xedt\xe9se","minimize":"Widget elrejt\xe9se; a bal als\xf3 sarokban l\xe9v\u0151 gombbal \xfajra megjelen\xedtheti","options":"Be\xe1ll\xedt\xe1sok","filters":"Sz\u0171r\u0151k","layers":"R\xe9tegek","share":"Megoszt\xe1s","search":"Keres\xe9s","search_empty":"Nincs tal\xe1lat","share_links":"Linkek","share_page":"Link erre az oldalra","share_image":"Nagy felbont\xe1s\xfa (HD) k\xe9p","share_rss":"RSS h\xedrcsatorna","share_rss_title":"A t\xe9rk\xe9p l\xe1that\xf3 ter\xfclet\xe9n l\xe9v\u0151 \xfaj sorozatok RSS-h\xedrcsatorn\xe1ja","share_embed":"Be\xe1gyaz\xe1s a weboldaladon","share_print":"Nyomtat\xe1s","copy":"M\xe1sol\xe1s","copied":"M\xe1solva","error":"Ajjaj, baj van\u2026","error_subtitle":"Pr\xf3b\xe1lja \xfajra k\xe9s\u0151bb, vagy n\xe9zze meg a b\xf6ng\xe9sz\u0151konzolt a tov\xe1bbi r\xe9szletek\xe9rt.","sequence_next":"A sorozat k\xf6vetkez\u0151 k\xe9pe","sequence_play":"Sorozat lej\xe1tsz\xe1sa","sequence_pause":"Sorozatlej\xe1tsz\xe1s sz\xfcneteltet\xe9se","sequence_prev":"A sorozat el\u0151z\u0151 k\xe9pe","sequence_more":"Tov\xe1bbi lej\xe1tsz\xe1si lehet\u0151s\xe9gek","sequence_speed":"Lej\xe1tsz\xe1s sebess\xe9ge","legend_license":"Licenc: {l}","edit_osm":"OSM szerkeszt\xe9se","id":"iD","josm":"JOSM","josm_live":"JOSM automatikus szinkroniz\xe1l\xe1s\xe1nak enged\xe9lyez\xe9se k\xe9pbet\xf6lt\xe9skor","loading_labels_serious":["\ud83d\uddfa\ufe0f T\xe9rk\xe9padatok bet\xf6lt\xe9se","\ud83d\udda5\ufe0f API lek\xe9rdez\xe9se","\ud83d\uddbc\ufe0f B\xe9lyegk\xe9pek bet\xf6lt\xe9se","\ud83d\udd0d EXIF metaadatok elemz\xe9se","\ud83c\udfd8\ufe0f 3D megjelen\xedt\xe9s","\ud83d\udcf7 360\xb0-os k\xe9pek inicializ\xe1l\xe1sa","\ud83d\udfe0 Sz\xednek kiegyenl\xedt\xe9se","\ud83d\udcaf Min\u0151s\xe9gi pontsz\xe1m kisz\xe1m\xedt\xe1sa \xa9"],"loading_labels_fun":["\ud83e\udd8c Vadvesz\xe9lyt jelz\u0151 t\xe1bla \xe9szlel\xe9se","\ud83d\ude98 Panoramax aut\xf3 \xa9 keres\xe9se","\u2615 Koffeininjekci\xf3","\ud83d\ude00 Mosolyogj, fel lett\xe9l t\xe9rk\xe9pezve!","\ud83d\udc08 Kiscic\xe1s k\xe9pek megoszt\xe1sa","\ud83d\ude34 Halogat\xe1s cs\xf6kkent\xe9se","\ud83e\uded6 Tea megf\u0151z\xe9se","\ud83d\udc27 Forr\xe1sk\xf3d felnyit\xe1sa","\ud83d\ude87 Metr\xf3\xe1llom\xe1sok indexel\xe9se","\ud83e\uddf9 Metaadatok tisztogat\xe1sa","\ud83d\ude92 T\u0171zolt\xf3s\xe1gr\xf3l sz\xf3l\xf3 fot\xf3k bek\xfcld\xe9se","\ud83d\udeb2 Z\xf6ldutak friss\xedt\xe9se","\ud83d\ude89 Peronok bej\xe1r\xe1sa","\ud83d\udef0\ufe0f M\u0171holdak keres\xe9se","\ud83d\udc65 Person\xe1k meg\xedr\xe1sa","\ud83d\udc1f S\xfcltkrumplikap\xf3k lokaliz\xe1l\xe1sa","\ud83e\uddd1\u200d\ud83d\udcbb Hibakeres\u0151 fel\xfclet","\ud83d\udcc8 Statisztika n\xf6vel\xe9se"],"error_psv":"A Photo Sphere Viewer (g\xf6mbpanor\xe1ma-n\xe9zeget\u0151) nem t\xf6lt\u0151dik be megfelel\u0151en","error_pic":"A k\xe9rt k\xe9p nem tal\xe1lhat\xf3","error_nopic":"Az adott helyen nem \xe9rhet\u0151 el k\xe9p","error_api":"A k\xe9pkiszolg\xe1l\xf3 nem \xe9rhet\u0151 el","error_webgl":"A WebGL nem t\xe1mogatott ebben a b\xf6ng\xe9sz\u0151ben","error_josm":"A JOSM nem v\xe1laszol. Val\xf3ban fut \xe9s el\xe9rhet\u0151 t\xe1volr\xf3l?","error_api_compatibility":"A k\xe9pkiszolg\xe1l\xf3 nem kompatibilis a k\xe9pn\xe9zeget\u0151 ezen verzi\xf3j\xe1val","filter_date":"D\xe1tum szerint","filter_user":"Felhaszn\xe1l\xf3 szerint","filter_picture":"K\xe9pt\xedpus szerint","picture_flat":"Klasszikus","picture_360":"360\xb0","filter_camera_model":"Kameramodell szerint","map_background":"T\xe9rk\xe9ph\xe1tt\xe9r","map_background_aerial":"L\xe9gi felv\xe9tel","map_background_streets":"k\xe9pUtca","map_theme":"T\xe9rk\xe9p t\xe9m\xe1ja","map_theme_default":"Klasszikus","map_theme_age":"K\xe9pk\xe9sz\xedt\xe9s ideje","map_theme_age_1":"> 2 \xe9ve","map_theme_age_2":"< 2 \xe9ve","map_theme_age_3":"< 1 \xe9ve","map_theme_age_4":"< 1 h\xf3napja","map_theme_type":"Kamerat\xedpus","contrast":"Nagyobb k\xe9pkontraszt enged\xe9lyez\xe9se","metadata":"K\xe9p metaadatai","metadata_general_picid":"K\xe9p azonos\xedt\xf3js","metadata_general_seqid":"Sorozat azonos\xedt\xf3ja","metadata_general_picid_link":"Ugr\xe1s a k\xe9p JSON le\xedr\xe1s\xe1hoz","metadata_general_seqid_link":"Ugr\xe1s a sorozat JSON le\xedr\xe1s\xe1hoz","metadata_general_author":"Szerz\u0151","metadata_general_license":"Licenc (enged\xe9ly)","metadata_general_license_link":"Ugr\xe1s a licenc teljes le\xedr\xe1s\xe1hoz","metadata_general_date":"K\xe9sz\xedt\xe9s d\xe1tuma","metadata_camera":"Kamera","metadata_camera_make":"Gy\xe1rt\xf3","metadata_camera_model":"Modell","metadata_camera_type":"T\xedpus","metadata_camera_focal_length":"Gy\xfajt\xf3t\xe1vols\xe1g","metadata_location":"Helysz\xedn","metadata_location_longitude":"Hossz\xfas\xe1g","metadata_location_latitude":"Sz\xe9less\xe9g","metadata_location_orientation":"Felv\xe9tel ir\xe1nya","metadata_location_precision":"Helymeghat\xe1roz\xe1s pontoss\xe1ga","metadata_exif":"EXIF / XMP","metadata_exif_name":"C\xedmke","metadata_exif_value":"\xc9rt\xe9k","report":"K\xe9p bejelent\xe9se","report_auth":"A jelent\xe9s a fi\xf3kod ({a}) felhaszn\xe1l\xe1s\xe1val lesz elk\xfcldve","report_nature":{"":"Probl\xe9ma jelleg\xe9nek kiv\xe1laszt\xe1sa\u2026","blur_missing":"A k\xe9pen l\xe1tszik egy szem\xe9ly arca vagy egy rendsz\xe1mt\xe1bla","blur_excess":"A k\xe9pen el van hom\xe1lyos\xedtva egy olyan objektum, amelynek \xe9lesnek kellene lennie","inappropriate":"A k\xe9p nem megfelel\u0151 (irrelev\xe1ns, meztelens\xe9get jelen\xedt meg stb.)","privacy":"A k\xe9pen mag\xe1n\xfat vagy mag\xe1nter\xfclet l\xe1that\xf3","picture_low_quality":"A k\xe9p nagyon rossz min\u0151s\xe9g\u0171","mislocated":"A k\xe9p rosszul van elhelyezve a t\xe9rk\xe9pen","copyright":"A k\xe9p szerz\u0151i jogot s\xe9rt","other":"B\xe1rmilyen m\xe1s jelleg\u0171 probl\xe9ma"},"report_nature_label":"Probl\xe9ma jellege","report_details":"Tov\xe1bbi r\xe9szletek","filter_zoom_in":"Nagy\xedts a sz\u0171r\u0151k l\xe1that\xf3v\xe1 t\xe9tel\xe9hez","report_email":"E-mail-c\xedm","report_email_placeholder":"Nem k\xf6telez\u0151","report_submit":"Bek\xfcld\xe9s","report_success":"A jelent\xe9s sikeresen be lett k\xfcldve; a lehet\u0151 leghamarabb megvizsg\xe1ljuk.","report_failure":"Hiba t\xf6rt\xe9nt a jelent\xe9s l\xe9trehoz\xe1sakor: {e}. K\xe9rj\xfck, pr\xf3b\xe1ld meg k\xe9s\u0151bb \xfajra.","search_user":"Felhaszn\xe1l\xf3n\xe9v keres\xe9se\u2026","search_address":"C\xedm, v\xe1ros stb. keres\xe9se\u2026","share_embed_docs":"Tov\xe1bbi inform\xe1ci\xf3 a be\xe1gyaz\xe1s konfigur\xe1l\xe1s\xe1r\xf3l","error_click":"Kattints a folytat\xe1shoz","error_retry":"K\xe9rj\xfck, pr\xf3b\xe1ld meg k\xe9s\u0151bb","legend_title":"K\xe9p adatainak megjelen\xedt\xe9se","report_whole_sequence":"A teljes sorozatra vonatkozik","report_wait":"Jelent\xe9s bek\xfcld\xe9se folyamatban\u2026","report_details_placeholder":"Megadhatsz tov\xe1bbi r\xe9szleteket a probl\xe9m\xe1r\xf3l (nem k\xf6telez\u0151)","filter_qualityscore_help":"Kattints az enged\xe9lyez\xe9shez vagy a letilt\xe1shoz","filter_qualityscore":"Min\u0151s\xe9gi pontsz\xe1m","map_theme_score":"Min\u0151s\xe9gi pontsz\xe1m","metadata_camera_resolution":"Felbont\xe1s","metadata_quality":"Min\u0151s\xe9gi pontsz\xe1m","metadata_quality_help":"Tov\xe1bbi tudnival\xf3k a min\u0151s\xe9gi pontsz\xe1mr\xf3l","metadata_quality_score":"\xd6sszes\xedtett pontsz\xe1m","metadata_quality_gps_score":"Pozicion\xe1l\xe1si pontsz\xe1m","metadata_quality_resolution_score":"Felbont\xe1si pontsz\xe1m","metadata_quality_missing":"a k\xe9pben nincs megadva \xe9rt\xe9k"},"map":{"loading":"Bet\xf6lt\xe9s\u2026","thumbnail":"A kurzor alatti k\xe9p b\xe9lyegk\xe9pe","not_public":"Nem l\xe1that\xf3 nyilv\xe1nosan","slow_loading":"A t\xe9rk\xe9p lassan t\xf6lt\u0151dik be, \xe9s lehet, hogy lerobbant"},"maplibre":{"GeolocateControl.FindMyLocation":"Tart\xf3zkod\xe1si hely megtal\xe1l\xe1sa","GeolocateControl.LocationNotAvailable":"Tart\xf3zkod\xe1si hely nem \xe9rhet\u0151 el"}}')},4895:at=>{"use strict";at.exports=JSON.parse('{"pnx":{"expand":"Espandi","zoomOut":"Rimpicciolisci","zoomIn":"Ingrandisci","zoom":"Zoom","moveUp":"Muovi in alto","moveDown":"Muovi in basso","moveLeft":"Muovi a sinistra","moveRight":"Muovi a destra","expand_info":"Fai apparire il widget a schermo pieno","options":"Opzioni","filters":"Filtri","layers":"Livelli","search":"Cerca","search_empty":"Nessun risultato trovato","search_address":"Cerca un indirizzo, citt\xe0\u2026","search_user":"Cerca un nome utente\u2026","share":"Condividi","share_links":"Collegamenti","share_page":"Collegamento a questa immagine","share_image":"Immagine HD","share_embed":"Incorpora nel tuo sito web","share_embed_docs":"Scopri di pi\xf9 sulla configurazione della incorporazione","share_print":"Stampa","copy":"Copia","copied":"Copiato","error":"Abbiamo un problema\u2026","error_click":"Continuare","error_retry":"Riprovare pi\xf9 tardi","sequence_play":"Riproduci questa sequenza","sequence_pause":"Pausa la sequenza","sequence_speed":"Velocit\xe0 di riproduzione","legend_license":"Licenza: {l}","legend_title":"Mostra dettagli della foto","edit_osm":"Modifica OSM","loading_labels_serious":["\ud83d\uddfa\ufe0f Caricamento dei dati della mappa","\ud83d\udda5\ufe0f Interrogazione delle API","\ud83d\uddbc\ufe0f Caricamento delle miniature","\ud83d\udd0d Analisi dei metadata EXIF","\ud83c\udfd8\ufe0f Creazione del rendering 3D","\ud83d\udcf7 Inizializzazione delle foto a 360\xb0","\ud83d\udfe0 Bilanciamento del colore","\ud83d\udcaf Calcolo del punteggio della qualit\xe0 \xa9","\ud83d\udce1 Scaricamento degli aggiornamenti","\ud83c\udf0d Recupero dei tasselli della mappa","\ud83d\udcf8 Elaborazione delle ombre"],"loading_labels_fun":["\ud83e\udd8c Rilevazione dei cartelli di attraversamento dei cervi","\ud83d\ude98 Ricerca dell\u2019auto Panoramax \xa9","\u2615 Iniezione di caffeina","\ud83d\ude00 Sorridete, siete stati mappati!","\ud83d\udc08 Condivisione delle foto di gatti","\ud83d\ude34 Riduzione della procrastinazione","\ud83e\uded6 Preparazione del t\xe8","\ud83d\udc27 Apertura del codice sorgente","\ud83d\ude87 Indicizzazione delle stazioni della metro","\ud83e\uddf9 Pulizia dei metadata","\ud83d\ude92 Invio delle foto delle stazioni dei pompieri","\ud83d\udeb2 Aggiornamento delle strade verdi","\ud83d\ude89 Passeggiata sulle banchine della stazione","\ud83d\udef0\ufe0f Ricerca dei satelliti","\ud83d\udc65 Scrittura delle persone","\ud83d\udc1f Ricerca dei negozi di patatine fritte","\ud83e\uddd1\u200d\ud83d\udcbb Debug dell\u2019interfaccia","\ud83d\udcc8 Incremento delle statistiche","\ud83e\udd16 Apprendimento della semantica","\ud83c\udfa8 Riprogettazione dell\u2019interfaccia","\ud83d\udcc5 Pianificazione di eventi di photo-mapping","\ud83e\uddc0 Affinamento dei formaggi","\ud83c\udf04 Calcolo della nebbia in Valpadana","\ud83c\udf0a Misurazione delle grandi maree"],"error_psv":"Il visualizzatore delle foto sferiche non si sta caricando correttamente","error_pic":"La foto richiesta non \xe8 stata trovata","error_nopic":"Nessuna foto disponibile alla posizione richiesta","error_api":"Il server delle foto non \xe8 disponibile","error_webgl":"Il tuo browser non supporta WebGL","error_josm":"JOSM non risponde, \xe8 in esecuzione con il controllo remoto abilitato?","error_api_compatibility":"Il server delle foto non \xe8 compatibile con questa versione del visualizzatore","filter_date":"Data","filter_date_1month":"1 mese","filter_date_1year":"1 anno","filter_user_mypics":"Le mie foto","filter_picture":"Tipo di foto","filter_zoom_in":"Ingrandisci la mappa per vedere questo filtro","picture_flat":"Classica","picture_360":"360\xb0","filter_qualityscore_help":"Clicca per abilitare o disabilitare","map_background":"Sfondo della mappa","map_background_aerial":"Satellite","map_background_streets":"Strade","map_theme":"Tema della mappa","map_theme_default":"Classica","map_theme_age":"Data di acquisizione","map_theme_age_2":"< 2 anni","map_theme_age_3":"< 1 anno","map_theme_age_4":"< 1 mese","map_theme_score":"Punteggio della qualit\xe0","contrast":"Abilita un maggiore contrasto della foto","metadata":"Metadata della foto","metadata_general_picid":"Foto","metadata_general_picid_link":"Vai alla descrizione JSON della foto","metadata_general_seqid_link":"Vai alla descrizione JSON della sequenza","metadata_general_author":"Autore","metadata_general_license":"Licenza","metadata_general_date":"Data di acquisizione","metadata_camera":"Fotocamera","metadata_camera_make":"Costruttore","metadata_camera_model":"Modello","metadata_camera_type":"Tipo","metadata_camera_resolution":"Risoluzione","metadata_location":"Posizione","metadata_location_longitude":"Longitudine","metadata_location_latitude":"Latitudine","metadata_location_precision":"Precisione della posizione","metadata_quality":"Qualit\xe0","metadata_quality_score":"Punteggio globale","metadata_quality_gps_score":"Punteggio della posizione","metadata_quality_resolution_score":"Punteggio della risoluzione","metadata_exif":"EXIF","metadata_exif_name":"Attributo","report_auth":"Questa segnalazione verr\xe0 inviata usando la tua utenza \u201c{a}\u201d","report_nature_label":"Natura del problema","report_nature":{"blur_excess":"Un oggetto che non ha bisogno di essere offuscato lo \xe8","inappropriate":"La foto \xe8 inappropriata (non pertinente, nudo, \u2026)","mislocated":"La foto non \xe8 ben posizionata sulla mappa","copyright":"La foto viola il diritto d\u2019autore","other":"Qualsiasi altro tipo di problema","picture_low_quality":"La foto \xe8 di qualit\xe0 scarsa","":"Selezione la natura del problema\u2026","blur_missing":"Sono visibili la faccia di una persona o la targa di un\u2019auto","privacy":"Sono visibili un sentiero o una propriet\xe0 privati"},"report_whole_sequence":"Riguarda l\u2019intera sequenza","report_details":"Ulteriori dettagli","report_email":"La tua e-mail","report_email_placeholder":"Facoltativo","report_submit":"Invia","report_wait":"Invio della segnalazione\u2026","report_failure":"\xc8 avvenuto un errore durante la creazione della segnalazione: {e}. Riprovare pi\xf9 tardi.","moveMiddle":"Centra la visuale","show_map":"Mostra la mappa","sequence_next":"Prossima foto nella sequenza","map_theme_age_1":"> 2 anni","map_theme_type":"Tipo di fotocamera","minimize":"Nascondi il widget, puoi mostrarlo di nuovo usando il pulsante nell\u2019angolo in basso a sinistra","metadata_general_license_link":"Vedi la descrizione completa della licenza","share_rss":"Feed RSS","show_psv":"Mostra il visualizzatore delle foto","share_rss_title":"Feed RSS delle nuove sequenze nell\u2019attuale area visibile della mappa","sequence_prev":"Foto precedente della sequenza","sequence_more":"Altre opzioni di riproduzione","josm_live":"Abilita la sincronizzazione automatica di JOSM al caricamento delle foto","metadata_general_seqid":"Sequenza","metadata_camera_focal_length":"Lunghezza focale","filter_user":"Utente","metadata_location_orientation":"Direzione","filter_qualityscore":"Punteggio della qualit\xe0","metadata_quality_help":"Per saperne di pi\xf9 sul punteggio della qualit\xe0","metadata_quality_missing":"Nessun valore impostato nella foto","metadata_exif_value":"Valore","report":"Segnala","report_details_placeholder":"Facoltativo, puoi aggiungere dei dettagli sul problema e sul perch\xe9 lo ritieni rilevante","report_success":"La segnalazione \xe8 stata inviata correttamente. Non appena possibile verr\xe0 esaminata.","minimize_short":"Nascondi","qualityscore_title":"Informazioni sul punteggio della qualit\xe0","qualityscore_doc_1":"Panoramax propone un Punteggio della qualit\xe0 per ogni foto. Ci\xf2 permette di filtrare facilmente la mappa e mostrare le foto di alta qualit\xe0 disponibili.","qualityscore_doc_2":"Il voto \xe8 mostrato agli utenti con un valore tipo A/B/C/D/E (A \xe8 il voto migliore, E il peggiore) e graficamente viene mostrato con la seguente scala:","qualityscore_doc_link":"Nella nostra documentazione sono presenti maggiori dettagli sul calcolo del Punteggio della qualit\xe0.","qualityscore_doc_3":"Esso \xe8 calcolato basandosi sulla precisione del GPS e sulla risoluzione della foto. Un sistema professionale avr\xe0 un punteggio A, un action camera a 360\xb0 avr\xe0 un punteggio B e uno smartphone verr\xe0 classificato come C, D o E.","metadata_general_instance":"Istanza di origine","josm":"JOSM","picture_flat_long":"Foto classica","picture_360_long":"Foto panoramica","metadata_summary":"Sintesi","metadata_general_copy_id":"Copia l\u2019ID","metadata_general_copy_picid":"Copia l\u2019ID della foto","id":"iD","contribute_id":"Contribuisci a OpenStreetMap con l\u2019editor iD","geo_uri":"App esterna","filter_date_6months":"6 mesi","picture_all":"Tutte","metadata_exif_doc":"Doc per gli attributi EXIF","metadata_exif_doc_title":"Vai alla documentazione di Exiv2 per i dettagli completi sulle definizioni degli attributi EXIF e XMP","semantics_value":"Valore","semantics_key_doc":"Per saperne di pi\xf9 su questa chiave","semantics_title":"Etichette","semantics_features":"Oggetti rilevati","semantics_features_none":"Non \xe8 ancora stato rilevato alcun oggetto in questa foto.","semantics_features_default_title":"Oggetto #{nb}","semantics_features_subtitle":"{nb} propriet\xe0 associate","semantics_tags":"{nb} attributi","semantics_show_all_tags":"Mostra tutti gli attributi","semantics_hide_all_tags":"Nascondi tutti gli attributi","semantics_key":"Chiave","semantics_value_doc":"Per saperne di pi\xf9 su questa etichetta","semantics_wikidata_properties":{"P361":"parte di","P31":"instanza di","P279":"sottoclasse di"},"semantics_hide_annotations":"Nascondi le annotazioni della foto","semantics_tags_picture":"Etichette della foto","semantics_show_annotations":"Mostra le annotazioni della foto","semantics_annotation_tooltip":"Clicca per vedere i dettagli","semantics_tags_picture_none":"Non \xe8 stata ancora aggiunta alcuna etichetta su questa foto.","semantics_qualifiers":"Qualificatori","metadata_location_coordinates":"Coordinate (longitudine, latitudine)","metadata_location_copy":"Copia {v}","metadata_location_copy_more":"Ulteriori opzioni per la copia delle coordinate","whats_panoramax":"Panoramax \xe8 la geo-commons per le foto dei territori.","panoramax":"Panoramax","semantics_zero_annotations":"Nessuna annotazione impostata per questa immagine","semantics_hashtags":"Hashtag dell\u2019immagine","semantics_editor_error":"La sintassi non \xe8 valida. Le tue etichette devono avere la seguente forma:\\nchiave=valore\\nprefisso|chiave=valore\\nprefisso|chiave[qualif_chiave=qualif_valore]=valore\\n\\nLa lunghezza massima di una chiave \xe8 di 256 caratteri, quella di un valore \xe8 di 2048 caratteri."},"psv":{"loadError":"Impossibile caricare l\u2019immagine panoramica","ctrlZoom":"Utilizza Ctrl + rotellina del mouse per ingrandire l\u2019immagine","twoFingers":"Usa due dita per spostarti"},"maplibre":{"GeolocateControl.FindMyLocation":"Trova la mia posizione","GeolocateControl.LocationNotAvailable":"Posizione non disponibile"},"map":{"loading":"Caricamento\u2026","thumbnail":"Miniatura della foto passata con il mouse","not_public":"Non pubblicamente visibile","slow_loading":"La mappa impiega troppo tempo a caricarsi e potrebbe apparire a pezzi","map_data":"Dati cartografici: {m}","more_panoramax":"Per saperne di pi\xf9 su Panoramax"}}')},3979:at=>{"use strict";at.exports=JSON.parse('{"pnx":{"metadata_general_picid":"\u753b\u50cf\u8b58\u5225\u5b50","loading_labels_fun":["\ud83e\udd8c \u9e7f\u306e\u6a2a\u65ad\u6a19\u8b58\u306e\u691c\u51fa","\ud83d\ude98 Panoramax Car \xa9\u3092\u691c\u7d22","\u2615 \u30ab\u30d5\u30a7\u30a4\u30f3\u306e\u6ce8\u5165","\ud83d\ude00 \u7b11\u3063\u3066\u304f\u3060\u3055\u3044\u3001\u3042\u306a\u305f\u306f\u5730\u56f3\u306b\u8f09\u3063\u3066\u3044\u307e\u3059\uff01","\ud83d\udc08 \u732b\u306e\u5199\u771f\u3092\u5171\u6709\u3059\u308b","\ud83d\ude34 \u5148\u5ef6\u3070\u3057\u3092\u6e1b\u3089\u3059","\ud83e\uded6 \u304a\u8336\u3092\u6df9\u308c\u308b","\ud83d\udc27 \u30bd\u30fc\u30b9\u30b3\u30fc\u30c9\u3092\u516c\u958b","\ud83d\ude87 \u5730\u4e0b\u9244\u99c5\u306e\u7d22\u5f15","\ud83e\uddf9 \u30e1\u30bf\u30c7\u30fc\u30bf\u306e\u30af\u30ea\u30fc\u30f3\u30a2\u30c3\u30d7","\ud83d\ude92 \u6d88\u9632\u7f72\u306e\u5199\u771f\u3092\u9001\u4fe1","\ud83d\udeb2 \u30b0\u30ea\u30fc\u30f3\u30a6\u30a7\u30a4\u30ba\u306e\u66f4\u65b0","\ud83d\ude89 \u99c5\u306e\u30db\u30fc\u30e0\u306e\u30a6\u30a9\u30fc\u30af\u30b9\u30eb\u30fc","\ud83d\udef0\ufe0f \u885b\u661f\u306e\u63a2\u7d22","\ud83d\udc65 \u30da\u30eb\u30bd\u30ca\u3092\u66f8\u304f","\ud83d\udc1f \u30c1\u30c3\u30d7\u30b7\u30e7\u30c3\u30d7\u306e\u5834\u6240","\ud83e\uddd1\u200d\ud83d\udcbb \u30c7\u30d0\u30c3\u30b0\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30fc\u30b9","\ud83d\udcc8 \u7d71\u8a08\u306e\u5897\u52a0"],"share_embed_docs":"\u57cb\u3081\u8fbc\u307f\u8a2d\u5b9a\u306e\u8a73\u7d30\u3092\u8aad\u3080","filter_zoom_in":"\u3053\u306e\u30d5\u30a3\u30eb\u30bf\u30fc\u3092\u8868\u793a\u3059\u308b\u306b\u306f\u62e1\u5927\u3057\u3066\u304f\u3060\u3055\u3044","metadata_camera_type":"\u30bf\u30a4\u30d7","minimize":"\u3053\u306e\u30a6\u30a3\u30b8\u30a7\u30c3\u30c8\u3092\u975e\u8868\u793a\u306b\u3059\u308b\u306b\u306f\u3001\u5de6\u4e0b\u306e\u30dc\u30bf\u30f3\u3092\u4f7f\u7528\u3057\u3066\u518d\u5ea6\u8868\u793a\u3057\u307e\u3059","error_psv":"Photo Sphere Viewer \u304c\u6b63\u3057\u304f\u8aad\u307f\u8fbc\u307e\u308c\u307e\u305b\u3093\u3067\u3057\u305f","error_josm":"JOSM \u304c\u5fdc\u7b54\u3057\u307e\u305b\u3093\u3002\u5b9f\u884c\u3055\u308c\u3066\u3044\u3066\u3001\u30ea\u30e2\u30fc\u30c8\u304c\u6709\u52b9\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u304b?","filter_user":"\u30e6\u30fc\u30b6\u30fc","qualityscore_doc_3":"\u3053\u308c\u306f GPS \u306e\u7cbe\u5ea6\u3068\u753b\u50cf\u306e\u89e3\u50cf\u5ea6\u306b\u57fa\u3065\u3044\u3066\u8a08\u7b97\u3055\u308c\u307e\u3059\u3002\u30d7\u30ed\u4ed5\u69d8\u306e\u30b7\u30b9\u30c6\u30e0\u306f A \u8a55\u4fa1\u3001360\xb0 \u30a2\u30af\u30b7\u30e7\u30f3 \u30ab\u30e1\u30e9\u306f B \u8a55\u4fa1\u3001\u30b9\u30de\u30fc\u30c8\u30d5\u30a9\u30f3\u306f C/D/E \u8a55\u4fa1\u306b\u306a\u308a\u307e\u3059\u3002","report_nature":{"inappropriate":"\u5199\u771f\u304c\u4e0d\u9069\u5207\u3067\u3059\uff08\u7121\u95a2\u4fc2\u3001\u30cc\u30fc\u30c9\u306a\u3069\uff09","":"\u554f\u984c\u306e\u6027\u8cea\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u2026","blur_missing":"\u4eba\u306e\u9854\u3084\u8eca\u306e\u30ca\u30f3\u30d0\u30fc\u30d7\u30ec\u30fc\u30c8\u304c\u898b\u3048\u308b","blur_excess":"\u307c\u304b\u3059\u5fc5\u8981\u306e\u306a\u3044\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u304c\u307c\u3084\u3051\u3066\u3044\u308b","privacy":"\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8\u30d1\u30b9\u307e\u305f\u306f\u30d7\u30ed\u30d1\u30c6\u30a3\u304c\u8868\u793a\u3055\u308c\u307e\u3059","picture_low_quality":"\u753b\u50cf\u306e\u54c1\u8cea\u304c\u60aa\u3044","mislocated":"\u5730\u56f3\u4e0a\u306e\u5199\u771f\u306e\u4f4d\u7f6e\u304c\u9069\u5207\u3067\u306f\u3042\u308a\u307e\u305b\u3093","copyright":"\u753b\u50cf\u306f\u8457\u4f5c\u6a29\u3092\u4fb5\u5bb3\u3057\u3066\u3044\u307e\u3059","other":"\u305d\u306e\u4ed6\u306e\u554f\u984c"},"sequence_next":"\u6b21\u306e\u753b\u50cf","sequence_play":"\u3053\u306e\u30b7\u30fc\u30b1\u30f3\u30b9\u306b\u6cbf\u3063\u3066\u30d7\u30ec\u30a4\u3057\u3066\u304f\u3060\u3055\u3044","sequence_pause":"\u4e00\u6642\u505c\u6b62\u30b7\u30fc\u30b1\u30f3\u30b9","sequence_prev":"\u524d\u306e\u753b\u50cf","sequence_more":"\u3088\u308a\u591a\u304f\u306e\u30d7\u30ec\u30a4\u30aa\u30d7\u30b7\u30e7\u30f3","sequence_speed":"\u30d7\u30ec\u30a4\u30e4\u30fc\u306e\u30b9\u30d4\u30fc\u30c9","legend_license":"\u30e9\u30a4\u30bb\u30f3\u30b9: {l}","legend_title":"\u5199\u771f\u306e\u8a73\u7d30\u3092\u8868\u793a","edit_osm":"OSM\u306b\u8ca2\u732e\u3059\u308b","josm_live":"\u753b\u50cf\u8aad\u307f\u8fbc\u307f\u6642\u306bJOSM\u81ea\u52d5\u540c\u671f\u3092\u6709\u52b9\u306b\u3059\u308b","loading_labels_serious":["\ud83d\uddfa\ufe0f \u30de\u30c3\u30d7\u30c7\u30fc\u30bf\u306e\u8aad\u307f\u8fbc\u307f","\ud83d\udda5\ufe0f \u30af\u30a8\u30eaAPI","\ud83d\uddbc\ufe0f \u30b5\u30e0\u30cd\u30a4\u30eb\u3092\u8aad\u307f\u8fbc\u3093\u3067\u3044\u307e\u3059","\ud83d\udd0d EXIF\u30e1\u30bf\u30c7\u30fc\u30bf\u306e\u5206\u6790","\ud83c\udfd8\ufe0f 3D\u30ec\u30f3\u30c0\u30ea\u30f3\u30b0","\ud83d\udcf7 360\xb0\u5199\u771f\u3092\u521d\u671f\u5316\u3057\u3066\u3044\u307e\u3059","\ud83d\udfe0 \u8272\u306e\u30d0\u30e9\u30f3\u30b9","\ud83d\udcaf \u30b3\u30f3\u30d4\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u54c1\u8cea\u30b9\u30b3\u30a2 \xa9"],"error_pic":"\u8981\u6c42\u3055\u308c\u305f\u5199\u771f\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f","error_nopic":"\u6307\u5b9a\u3055\u308c\u305f\u4f4d\u7f6e\u306b\u306f\u753b\u50cf\u304c\u3042\u308a\u307e\u305b\u3093","error_api":"\u5199\u771f\u30b5\u30fc\u30d0\u30fc\u304c\u5229\u7528\u3067\u304d\u307e\u305b\u3093","error_webgl":"WebGL\u306f\u30d6\u30e9\u30a6\u30b6\u3067\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093","error_api_compatibility":"\u753b\u50cf\u30b5\u30fc\u30d0\u30fc\u306f\u3053\u306e\u30d3\u30e5\u30fc\u30a2\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u3068\u4e92\u63db\u6027\u304c\u3042\u308a\u307e\u305b\u3093","filter_date":"\u65e5\u4ed8","filter_date_1month":"1\u30f6\u6708","filter_date_1year":"1\u5e74","filter_user_mypics":"\u79c1\u306e\u5199\u771f","filter_picture":"\u753b\u50cf\u30bf\u30a4\u30d7","picture_flat":"\u30af\u30e9\u30b7\u30c3\u30af","picture_360":"360\xb0","filter_qualityscore":"\u54c1\u8cea\u30b9\u30b3\u30a2","filter_qualityscore_help":"\u30af\u30ea\u30c3\u30af\u3057\u3066\u6709\u52b9\u307e\u305f\u306f\u7121\u52b9\u306b\u3057\u307e\u3059","qualityscore_title":"\u54c1\u8cea\u30b9\u30b3\u30a2\u306b\u3064\u3044\u3066","qualityscore_doc_1":"Panoramax \u306f\u3001\u5404\u5199\u771f\u306b\u54c1\u8cea\u30b9\u30b3\u30a2\u3092\u63d0\u4f9b\u3057\u307e\u3059\u3002\u3053\u308c\u306b\u3088\u308a\u3001\u5730\u56f3\u30d5\u30a3\u30eb\u30bf\u30ea\u30f3\u30b0\u304c\u7c21\u5358\u306b\u306a\u308a\u3001\u9ad8\u54c1\u8cea\u306e\u5199\u771f\u306e\u53ef\u7528\u6027\u3092\u5305\u62ec\u7684\u306b\u8868\u793a\u3067\u304d\u307e\u3059\u3002","qualityscore_doc_2":"\u8a55\u4fa1\u306f A/B/C/D/E \u30b9\u30b3\u30a2 (A \u304c\u6700\u9ad8\u3001E \u304c\u6700\u4f4e) \u3068\u3057\u3066\u30e6\u30fc\u30b6\u30fc\u306b\u8868\u793a\u3055\u308c\u3001\u6b21\u306e\u30b9\u30b1\u30fc\u30eb\u3067\u30b0\u30e9\u30d5\u8868\u793a\u3055\u308c\u307e\u3059\u3002","qualityscore_doc_link":"\u54c1\u8cea\u30b9\u30b3\u30a2\u306e\u8a08\u7b97\u306e\u8a73\u7d30\u306b\u3064\u3044\u3066\u306f\u3001\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3092\u3054\u89a7\u304f\u3060\u3055\u3044\u3002","map_background":"\u5730\u56f3\u306e\u80cc\u666f","map_background_aerial":"\u822a\u7a7a\u5199\u771f","map_background_streets":"\u901a\u308a","map_theme":"\u30de\u30c3\u30d7\u30c6\u30fc\u30de","map_theme_default":"\u30af\u30e9\u30b7\u30c3\u30af","map_theme_age":"\u64ae\u5f71\u65e5","map_theme_age_1":"2\u6b73\u4ee5\u4e0a","map_theme_age_2":"2\u6b73\u672a\u6e80","map_theme_age_3":"1\u6b73\u672a\u6e80","map_theme_age_4":"1\u304b\u6708\u672a\u6e80","map_theme_type":"\u30ab\u30e1\u30e9\u30bf\u30a4\u30d7","map_theme_score":"\u54c1\u8cea\u30b9\u30b3\u30a2","contrast":"\u3088\u308a\u9ad8\u3044\u753b\u50cf\u30b3\u30f3\u30c8\u30e9\u30b9\u30c8\u3092\u6709\u52b9\u306b\u3059\u308b","metadata":"\u753b\u50cf\u30e1\u30bf\u30c7\u30fc\u30bf","metadata_general_seqid":"\u30b7\u30fc\u30b1\u30f3\u30b9\u8b58\u5225\u5b50","metadata_general_picid_link":"\u753b\u50cf\u306eJSON\u8aac\u660e\u3078\u79fb\u52d5","metadata_general_seqid_link":"\u30b7\u30fc\u30b1\u30f3\u30b9\u306eJSON\u8a18\u8ff0\u3078\u79fb\u52d5","metadata_general_author":"\u8457\u8005","metadata_general_license":"\u30e9\u30a4\u30bb\u30f3\u30b9","metadata_general_license_link":"\u30e9\u30a4\u30bb\u30f3\u30b9\u306e\u5b8c\u5168\u306a\u8aac\u660e\u3092\u898b\u308b","metadata_general_date":"\u64ae\u5f71\u65e5","metadata_camera":"\u30ab\u30e1\u30e9","metadata_camera_make":"\u30e1\u30fc\u30ab\u30fc","metadata_camera_model":"\u30e2\u30c7\u30eb","metadata_camera_resolution":"\u89e3\u50cf\u5ea6","metadata_camera_focal_length":"\u7126\u70b9\u8ddd\u96e2","metadata_location":"\u4f4d\u7f6e","metadata_location_longitude":"\u7d4c\u5ea6","metadata_location_latitude":"\u7def\u5ea6","metadata_location_orientation":"\u64ae\u5f71\u65b9\u5411","metadata_location_precision":"\u4f4d\u7f6e\u6c7a\u3081\u7cbe\u5ea6","metadata_quality":"\u54c1\u8cea\u30b9\u30b3\u30a2","metadata_quality_help":"\u54c1\u8cea\u30b9\u30b3\u30a2\u306b\u3064\u3044\u3066\u8a73\u3057\u304f\u77e5\u308b","metadata_quality_score":"\u30b0\u30ed\u30fc\u30d0\u30eb\u30b9\u30b3\u30a2","metadata_quality_gps_score":"\u30dd\u30b8\u30b7\u30e7\u30cb\u30f3\u30b0\u30b9\u30b3\u30a2","metadata_quality_resolution_score":"\u89e3\u6c7a\u30b9\u30b3\u30a2","metadata_quality_missing":"\u753b\u50cf\u306b\u5024\u304c\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093","metadata_exif":"EXIF / XMP","metadata_exif_name":"\u30bf\u30b0","metadata_exif_value":"\u4fa1\u5024","report":"\u5199\u771f\u3092\u5831\u544a\u3059\u308b","report_auth":"\u3053\u306e\u30ec\u30dd\u30fc\u30c8\u306f\u3042\u306a\u305f\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u300c{a}\u300d\u3092\u4f7f\u7528\u3057\u3066\u9001\u4fe1\u3055\u308c\u307e\u3059","report_nature_label":"\u554f\u984c\u306e\u6027\u8cea","report_whole_sequence":"\u3053\u308c\u306f\u30b7\u30fc\u30b1\u30f3\u30b9\u5168\u4f53\u306b\u95a2\u4fc2\u3059\u308b","report_details":"\u8ffd\u52a0\u306e\u8a73\u7d30","report_details_placeholder":"\u30aa\u30d7\u30b7\u30e7\u30f3\u3068\u3057\u3066\u3001\u554f\u984c\u306e\u8a73\u7d30\u3068\u305d\u308c\u304c\u3069\u306e\u3088\u3046\u306b\u95a2\u4fc2\u3057\u3066\u3044\u308b\u304b\u3092\u8ffd\u52a0\u3067\u304d\u307e\u3059","report_email":"\u3042\u306a\u305f\u306e\u30e1\u30fc\u30eb","report_email_placeholder":"\u30aa\u30d7\u30b7\u30e7\u30f3","report_submit":"\u9001\u4fe1","report_wait":"\u30ec\u30dd\u30fc\u30c8\u3092\u9001\u4fe1\u3057\u3066\u3044\u307e\u3059\u2026","report_success":"\u30ec\u30dd\u30fc\u30c8\u306f\u6b63\u5e38\u306b\u9001\u4fe1\u3055\u308c\u307e\u3057\u305f\u3002\u3067\u304d\u308b\u3060\u3051\u65e9\u304f\u78ba\u8a8d\u3055\u308c\u307e\u3059\u3002","report_failure":"\u30ec\u30dd\u30fc\u30c8\u306e\u4f5c\u6210\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f: {e}\u3002\u3057\u3070\u3089\u304f\u3057\u3066\u304b\u3089\u3082\u3046\u4e00\u5ea6\u304a\u8a66\u3057\u304f\u3060\u3055\u3044\u3002","zoom":"\u30ba\u30fc\u30e0","zoomOut":"\u30ba\u30fc\u30e0\u30a2\u30a6\u30c8","zoomIn":"\u30ba\u30fc\u30e0\u30a4\u30f3","moveUp":"\u4e0a\u306b\u79fb\u52d5","moveDown":"\u4e0b\u306b\u79fb\u52d5","moveLeft":"\u5de6\u306b\u79fb\u52d5","moveRight":"\u53f3\u306b\u79fb\u52d5","moveMiddle":"\u30d3\u30e5\u30fc\u3092\u4e2d\u592e\u306b\u914d\u7f6e\u3059\u308b","expand":"\u62e1\u5927\u3059\u308b","expand_info":"\u30a6\u30a3\u30b8\u30a7\u30c3\u30c8\u3092\u5168\u30da\u30fc\u30b8\u306b\u8868\u793a\u3059\u308b","show_psv":"\u753b\u50cf\u30d3\u30e5\u30fc\u30a2\u3092\u8868\u793a\u3059\u308b","show_map":"\u5730\u56f3\u3092\u8868\u793a","minimize_short":"\u96a0\u308c\u308b","options":"\u30aa\u30d7\u30b7\u30e7\u30f3","filters":"\u30d5\u30a3\u30eb\u30bf\u30fc","layers":"\u30ec\u30a4\u30e4\u30fc","search":"\u691c\u7d22","search_empty":"\u7d50\u679c\u306a\u3057","search_address":"\u4f4f\u6240\u3001\u5e02\u533a\u753a\u6751\u306a\u3069\u3092\u691c\u7d22","search_user":"\u30e6\u30fc\u30b6\u30fc\u540d\u3092\u691c\u7d22\u2026","share":"\u5171\u6709","share_links":"\u30ea\u30f3\u30af","share_page":"\u3053\u306e\u30da\u30fc\u30b8\u3078\u306e\u30ea\u30f3\u30af","share_image":"HD\u753b\u50cf","share_rss":"RSS\u30d5\u30a3\u30fc\u30c9","share_rss_title":"\u73fe\u5728\u8868\u793a\u3055\u308c\u3066\u3044\u308b\u30de\u30c3\u30d7\u30a8\u30ea\u30a2\u5185\u306e\u65b0\u3057\u3044\u30b7\u30fc\u30b1\u30f3\u30b9\u306e RSS \u30d5\u30a3\u30fc\u30c9","share_embed":"\u30a6\u30a7\u30d6\u30b5\u30a4\u30c8\u306b\u57cb\u3081\u8fbc\u3080","share_print":"\u5370\u5237","copy":"\u30b3\u30d4\u30fc","copied":"\u30b3\u30d4\u30fc\u3057\u307e\u3057\u305f","error":"\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u2026","error_click":"\u7d9a\u304f","error_retry":"\u5f8c\u3067\u3082\u3046\u4e00\u5ea6\u304a\u8a66\u3057\u304f\u3060\u3055\u3044"},"map":{"loading":"\u8aad\u307f\u8fbc\u307f\u4e2d\u2026","thumbnail":"\u30db\u30d0\u30fc\u3057\u305f\u753b\u50cf\u306e\u30b5\u30e0\u30cd\u30a4\u30eb","not_public":"\u516c\u958b\u3055\u308c\u306a\u3044","slow_loading":"\u30de\u30c3\u30d7\u306e\u8aad\u307f\u8fbc\u307f\u304c\u9045\u304f\u3001\u58ca\u308c\u3066\u3044\u308b\u3088\u3046\u306b\u898b\u3048\u308b\u5834\u5408\u304c\u3042\u308a\u307e\u3059"},"psv":{"twoFingers":"2\u672c\u306e\u6307\u3067\u79fb\u52d5\u3057\u307e\u3059","ctrlZoom":"Ctrl + \u30b9\u30af\u30ed\u30fc\u30eb\u3067\u753b\u50cf\u3092\u62e1\u5927\u3057\u307e\u3059","loadError":"\u753b\u50cf\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093"},"maplibre":{"GeolocateControl.FindMyLocation":"\u81ea\u5206\u306e\u4f4d\u7f6e\u3092\u8868\u793a","GeolocateControl.LocationNotAvailable":"GPS\u306f\u5229\u7528\u3067\u304d\u307e\u305b\u3093"}}')},6920:at=>{"use strict";at.exports=JSON.parse('{"pnx":{"zoomIn":"Zoom in","zoom":"Zoom","zoomOut":"Zoom uit","moveDown":"Naar beneden","search_user":"Zoek een gebruikersnaam\u2026","moveUp":"Ga omhoog","share_rss":"RSS-feed","loading_labels_serious":["\ud83d\uddfa\ufe0f Kaart aan het laden","\ud83d\udda5\ufe0f API opvragen","\ud83d\uddbc\ufe0f Miniatuurweergaven laden","\ud83d\udd0d EXIF metadata analyseren","\ud83c\udfd8\ufe0f 3D-rendering","\ud83d\udcf7 360\xb0 afbeelden initialiseren","\ud83d\udfe0 Kleur balancering","\ud83d\udcaf Bereken kwaliteits-score \xa9","\ud83d\udce1 Updates downloaden","\ud83c\udf0d Kaarttegels ophalen","\ud83d\udcf8 Schaduwen verwerken"],"share_embed_docs":"Lees meer over embedded instellingen","sequence_pause":"Pauzeer sequentie","sequence_prev":"Vorige afbeelding uit de sequentie","id":"iD","josm":"JOSM","sequence_more":"Meer afspeelmogelijkheden","sequence_speed":"Afspeel snelheid","edit_osm":"OSM aanpassen","moveLeft":"Naar links","moveRight":"Naar rechts","moveMiddle":"Middelpunt","expand":"Vergroot","show_psv":"Toon de afbeeldingsviewer","show_map":"Toon de kaart","options":"Opties","filters":"Filters","layers":"Lagen","search":"Zoek","search_empty":"Geen resultaat gevonden","search_address":"Zoek een adres, stad\u2026","share":"Deel","share_links":"Links","share_page":"Link naar deze foto","share_image":"HD afbeelding","share_embed":"Embedden op uw website","share_print":"Afdrukken","copy":"Kopieer","copied":"Gekopieerd","error":"We hebben een probleem\u2026","sequence_next":"Volgende afbeelding van de sequentie","error_click":"Klik om verder te gaan","error_retry":"Probeer later opnieuw","legend_license":"Licentie: {l}","legend_title":"Toon gegevens van de afbeelding","sequence_play":"Speel deze sequentie af","expand_info":"De widget op de volledige pagina weergeven","minimize":"Verberg deze widget, je kan hem terug tonen met de knop linksonder","loading_labels_fun":["\ud83e\udd8c Detectie verkeersborden overstekende herten","\ud83d\ude98 Panoramax auto zoeken \xa9","\u2615 Cafe\xefne-injectie","\ud83d\ude00 Gelukt, je kaart is gekaart!","\ud83d\udc08 Foto\'s delen van katten","\ud83d\ude34 Uitstelgedrag verminderen","\ud83e\uded6 Thee zetten","\ud83d\udc27 Broncode openen","\ud83d\ude87 Indexering metrostations","\ud83e\uddf9 Metadata opschonen","\ud83d\ude92 Foto\'s van brandweerkazernes versturen","\ud83d\udeb2 Fiets- en wandelpaden bijwerken","\ud83d\ude89 Perron doorgang","\ud83d\udef0\ufe0f Satellieten zoeken","\ud83d\udc65 Personas opslaan","\ud83e\udd5e Pannenkoekenhuizen localiseren","\ud83e\uddd1\u200d\ud83d\udcbb Interface debuggen","\ud83d\udcc8 Statistieken verhogen","\ud83e\udd16 Semantiek aanleren","\ud83c\udfa8 Interface herontwerpen","\ud83d\udcc5 Fotomappingparty\'s plannen","\ud83e\uddc0 Kazen laten rijpen","\ud83c\udf04 Prachtige zonneschijn berekenen","\ud83c\udf0a Meten van het hoogwater"],"share_rss_title":"RSS-feed van nieuwe reeksen in het nu zichtbare kaartgebied","josm_live":"Schakel JOSM automatische synchronisatie in bij het laden van afbeeldingen","minimize_short":"Verbergen","error_psv":"Photo Sphere Viewer werd niet correct geladen","error_nopic":"Geen foto beschikbaar op de aangegeven locatie","error_api":"De fotoserver is niet beschikbaar","error_webgl":"WebGL wordt niet ondersteund door je browser","error_api_compatibility":"De fotoserver is niet compatibel met deze viewer","filter_date_1month":"1 maand","filter_date_1year":"1 jaar","filter_user":"Gebruiker","filter_user_mypics":"Mijn foto\'s","filter_picture":"Afbeeldingstype","picture_flat":"Klassiek","picture_360":"360\xb0","filter_qualityscore":"Kwaliteitsscore","qualityscore_doc_2":"De score wordt getoond als een letter A/B/C/D/E (waarbij A het beste is en E het slechtse), en wordt grafisch weergegeven volgens deze schaal:","qualityscore_doc_link":"Meer weten over de Kwaliteitsscore","map_background":"Kaartachtergrond","map_background_aerial":"Satelliet","map_background_streets":"Straten","map_theme":"Kaartthema","map_theme_default":"Klassiek","map_theme_age":"Opnamedatum","map_theme_age_3":"< 1 jaar","map_theme_age_4":"< 1 maand","filter_qualityscore_help":"Klik om aan- of uit te schakelen","report_failure":"Er is een fout opgetreden bij het aanmaken van het rapport: {e}. Probleem later opnieuw.","map_theme_score":"Kwaliteitsscore","contrast":"Afbeeldingscontrast verhogen","metadata":"Metadata van de foto","metadata_camera_make":"Fabrikant","filter_date":"Datum","filter_zoom_in":"Zoom in om dit filter te zien","metadata_general_license_link":"De volledige beschrijving van de licentie bekijken","metadata_general_seqid":"Serie","metadata_general_picid_link":"Ga naar de JSON-beschrijving van de foto","metadata_general_seqid_link":"Ga naar de JSON-beschrijving van de sequentie","metadata_general_author":"Auteur","error_josm":"JOSM antwoord niet, is het actief en is afstandsbediening ingeschakeld?","qualityscore_title":"Over de kwaliteitsscore","metadata_general_license":"Licentie","error_pic":"The gevraagde foto werd niet gevonden","map_theme_age_2":"< 2 jaar","metadata_general_picid":"Afbeelding","metadata_general_date":"Opnamedatum","map_theme_type":"Cameratype","qualityscore_doc_1":"Panoramax toont een Kwaliteitsscore voor elke foto. Dit vergemakkelijkt filtering en laat toe om foto\'s van hoge kwaliteit te vinden.","qualityscore_doc_3":"Hij wordt berekend op basis van de GPS-nauwkeurigheid en resolutie van de foto. Een professioneel systeem zal een A-score hebben, een 360\xb0 actiecamera een B-score, en een smartphone een C/D/E-score.","map_theme_age_1":"> 2 jaar","report_details_placeholder":"Je kan, optioneel, details over het probleem toevoegen","metadata_camera":"Apparaat","metadata_camera_model":"Model","metadata_camera_type":"Type","metadata_camera_resolution":"Resolutie","metadata_camera_focal_length":"Brandpuntsafstand","metadata_location":"Positie","metadata_location_longitude":"Longitude","metadata_location_latitude":"Latitude","metadata_location_orientation":"Richting","metadata_location_precision":"Nauwkeurigheid van de positionering","metadata_quality":"Kwaliteit","metadata_quality_help":"Meer weten over de Kwaliteitsscore","metadata_quality_score":"Globale score","metadata_quality_gps_score":"Positioneringsscore","metadata_quality_resolution_score":"Resolutiescore","metadata_quality_missing":"geen info in de afbeelding","metadata_exif":"EXIF","metadata_exif_name":"Tag","metadata_exif_value":"Waarde","report":"Rapporteer","report_auth":"Dit rapport zal worden verstuurd met je account \\"{a}\\"","report_nature_label":"Aard van het probleem","report_nature":{"":"Selecteer de aard van het probleem \u2026","blur_missing":"Het gezicht van een persoon of een nummerplaat is zichtbaar","blur_excess":"Een object dat niet vervaagd moet worden is vervaagd","inappropriate":"De foto is ongepast (ongerelateerd, naaktheid \u2026)","privacy":"Een private weg of een privaat eigendom is zichtbaar","picture_low_quality":"De foto is van slechte kwaliteit","mislocated":"De foto is slecht gepositioneerd","copyright":"De foto schendt het auteursrecht","other":"Een ander soort probleem"},"report_whole_sequence":"Dit betreft de volledige sequentie","report_details":"Aanvullende details","report_email":"Je e-mail","report_email_placeholder":"Optioneel","report_submit":"Verzenden","report_wait":"Rapport verzenden \u2026","report_success":"Het rapport werd succesvol verzonden. Het zal zo snel mogelijk behandeld worden.","whats_panoramax":"Panoramax is de geo-commons voor foto\'s van gebieden.","contribute_id":"Bijdragen aan OpenStreetMap met de iD-editor","geo_uri":"Externe app","semantics_hide_all_tags":"Verberg alle tags","semantics_key":"Sleutel","semantics_value":"Waarde","semantics_key_doc":"Meer weten over deze sleutel","semantics_value_doc":"Meer weten over deze tag","semantics_title":"Tags","semantics_tags":"{nb} tags","semantics_features":"Gedetecteerde eigenschappen","semantics_features_none":"Er is nog geen eigenschap gedetecteerd of geannoteerd in deze afbeelding.","semantics_features_default_title":"Eigenschap #{nb}","semantics_features_subtitle":"{nb} geassocieerde eigenschappen","semantics_show_all_tags":"Toon alle tags","metadata_general_instance":"Bron instance","semantics_annotation_tooltip":"Klik om details te zien","semantics_tags_picture":"Afbeelding tags","semantics_tags_picture_none":"Er zijn nog geen tags ingesteld voor deze afbeelding.","semantics_qualifiers":"Kwalificaties","semantics_show_annotations":"afbeelding-annotaties weergeven","semantics_hide_annotations":"afbeelding-annotaties verbergen","semantics_wikidata_properties":{"P31":"Instance van","P279":"subklasse van","P361":"onderdeel van"},"metadata_exif_doc":"Documenten voor EXIF-tags","metadata_exif_doc_title":"Ga naar documentatie van Exiv2 voor volledige informatie over definities van EXIF- en XMP-tags","metadata_location_copy":"Kopieer {v}","metadata_location_copy_more":"Meer kopieeropties voor co\xf6rdinaten","metadata_general_copy_picid":"Kopieer afbeelding ID","filter_date_6months":"6 maanden","picture_360_long":"Panorama afbeelding","metadata_summary":"Samenvatting","metadata_general_copy_id":"Kopieer ID","picture_flat_long":"Klassieke afbeelding","metadata_location_coordinates":"Co\xf6rdinaten (lengtegraad, breedtegraad)","picture_all":"Alles","semantics_zero_annotations":"Geen annotatie op deze afbeelding","semantics_hashtags":"Foto-hashtags","panoramax":"Panoramax","semantics_editor_error":"De syntax is ongeldig. Je tags moeten eruit zien als:\\nsleutel=waarde\\nprefix|sleutel=waarde\\nprefix|sleutel[qualif_sleutel=qualif_waarde]=waarde\\n\\nMaximale lengte van de sleutel: 256 karakters, maximale lengte van de waarde: 2048 karakters."},"psv":{"twoFingers":"Gebruik twee vingers om te navigeren","ctrlZoom":"Gebruik ctrl + scroll om de afbeelding in en uit te zoomen","loadError":"Het panorama kan niet worden geupload"},"maplibre":{"GeolocateControl.FindMyLocation":"Mijn locatie zoeken","GeolocateControl.LocationNotAvailable":"Locatitie niet beschikbaar"},"map":{"loading":"Laden \u2026","slow_loading":"De kaart laadt traag en kan er gebroken uitzien","thumbnail":"Thumbnail van de aangeduide foto","not_public":"Niet openbaar zichtbaar","map_data":"Kaartdata: {m}","more_panoramax":"Meer weten over Panoramax"}}')},9026:at=>{"use strict";at.exports=JSON.parse('{"pnx":{"moveRight":"Przesu\u0144 w prawo","sequence_speed":"Pr\u0119dko\u015b\u0107 odtwarzania","metadata_camera_model":"Model","search_address":"Szukaj adres, miasto\u2026","zoom":"Przybli\u017cenie","zoomIn":"Przybli\u017c","moveUp":"Przesu\u0144 w g\xf3r\u0119","moveDown":"Przesu\u0144 w d\xf3\u0142","moveLeft":"Przesu\u0144 w lewo","moveMiddle":"Wycentruj widok","expand":"Rozszerz","show_psv":"Poka\u017c przegl\u0105dark\u0119 zdj\u0119\u0107","show_map":"Poka\u017c map\u0119","options":"Opcje","filters":"Filtry","layers":"Warstwy","search":"Szukaj","search_empty":"Brak wynik\xf3w","search_user":"Szukaj nazwy u\u017cytkownika\u2026","share":"Udost\u0119pnij","share_links":"Linki","share_page":"Link do tej strony","share_rss":"Kana\u0142 RSS","share_print":"Drukuj","copy":"Kopiuj","copied":"Skopiowano","error":"Mamy problem\u2026","error_click":"Kliknij, aby kontynuowa\u0107","error_retry":"Prosz\u0119 spr\xf3buj p\xf3\u017aniej","sequence_next":"Nast\u0119pne zdj\u0119cie w sekwencji","sequence_pause":"Spauzuj sekwencj\u0119","sequence_prev":"Poprzednie zdj\u0119cie w sekwencji","sequence_more":"Wi\u0119cej opcji odtwarzania","legend_license":"Licencja: {l}","legend_title":"Poka\u017c szczeg\xf3\u0142y zdj\u0119cia","edit_osm":"Edytuj OSM","loading_labels_serious":["\ud83d\uddfa\ufe0f Wczytywanie danych mapy","\ud83d\udda5\ufe0f Odpytywanie API","\ud83d\uddbc\ufe0f Wczytywanie miniaturek","\ud83d\udd0d Analizowanie metadanych EXIF","\ud83c\udfd8\ufe0f Renderowanie 3D","\ud83d\udcf7 Inicjowanie zdj\u0119\u0107 360\xb0","\ud83d\udfe0 Balansowanie kolor\xf3w","\ud83d\udcaf Obliczanie oceny jako\u015bci \xa9"],"map_theme_age_2":"< 2 lata","map_theme_age_1":"> 2 lata","map_theme_age":"Data zrobienia","filter_picture":"Typ zdj\u0119cia","map_theme_age_3":"< rok","map_theme_age_4":"< miesi\u0105c","map_theme_type":"Typ aparatu","metadata":"Metadane zdj\u0119cia","metadata_general_picid":"Identyfikator zdj\u0119cia","metadata_general_seqid":"Identyfikator sekwencji","metadata_general_license":"Licencja","metadata_general_author":"Autor","metadata_camera":"Aparat","metadata_camera_type":"Typ","metadata_camera_resolution":"Rozdzielczo\u015b\u0107","metadata_location":"Lokalizacja","metadata_exif":"EXIF / XMP","metadata_quality_missing":"Brak warto\u015bci ustawionej w zdj\u0119ciu","metadata_exif_name":"Tag","metadata_exif_value":"Warto\u015b\u0107","report":"Zg\u0142o\u015b zdj\u0119cie","report_nature":{"privacy":"Prywatna droga lub w\u0142asno\u015b\u0107 widoczna","mislocated":"Zdj\u0119cie jest w z\u0142ym miejscu na mapie","copyright":"Zdj\u0119cie narusza prawa autorskie","picture_low_quality":"Zdj\u0119cie jest bardzo niskiej jako\u015bci","other":"Inny problem","":"Wybierz typ problemu\u2026","blur_missing":"Twarz osoby lub rejestracja samochodu jest widoczna","blur_excess":"Obiekt, kt\xf3ry nie wymaga zamazania jest zamazany","inappropriate":"Zdj\u0119cie jest niestosowne (niezwi\u0105zane, nago\u015b\u0107\u2026)"},"zoomOut":"Oddal","report_whole_sequence":"Dotyczy ca\u0142ej sekwencji","report_details":"Dodatkowe szczeg\xf3\u0142y","report_email":"Tw\xf3j adres email","report_email_placeholder":"Opcjonalne","report_submit":"Wy\u015blij","report_wait":"Wysy\u0142anie zg\u0142oszenia\u2026","report_success":"Zg\u0142oszenie zosta\u0142o wys\u0142ane. Zostanie przejrzane tak szybko jak to mo\u017cliwe.","share_rss_title":"Kana\u0142 RSS nowych sekwencji na widocznym obszarze mapy","loading_labels_fun":["\ud83e\udd8c Wykrywanie znak\xf3w przechodzenia jeleni",null,"\u2615 Wstrzykiwanie kofeiny","\ud83d\ude00 U\u015bmiechnij si\u0119, jeste\u015b mapowany!","\ud83d\udc08 Udost\u0119pnianie zdj\u0119\u0107 kot\xf3w","\ud83d\ude34 Zmniejszania prokrastynacji","\ud83e\uded6 Parzenie herbaty","\ud83d\udc27 Otwieranie kodu \u017ar\xf3d\u0142owego","\ud83d\ude87 Indeksowanie stacji metra","\ud83e\uddf9 Czyszczenie metadanych","\ud83d\ude92 Przesy\u0142anie zdj\u0119\u0107 remiz",null,"\ud83d\ude89 Przechodzenie peron\xf3w stacji","\ud83d\udef0\ufe0f Wyszukiwanie satelit",null,"\ud83d\udc1f Szukanie sklep\xf3w z frytkami i ryb\u0105","\ud83e\uddd1\u200d\ud83d\udcbb Interfejs debugowania","\ud83d\udcc8 Zwi\u0119kszanie statystyk"],"share_embed_docs":"Przeczytaj wi\u0119cej o konfiguracji osadzenia","sequence_play":"Odtw\xf3rz t\u0119 sekwencj\u0119","josm_live":"W\u0142\u0105cz automatyczn\u0105 synchronizacj\u0119 JOSM przy \u0142adowaniu zdj\u0119\u0107","error_api":"Serwer zdj\u0119\u0107 nie jest dost\u0119pny","error_webgl":"WebGL nie jest obs\u0142ugiwany przez t\u0119 przegl\u0105dark\u0119","error_api_compatibility":"Serwer zdj\u0119\u0107 nie jest kompatybilny z t\u0105 wersj\u0105 przegl\u0105darki","filter_date":"Data","filter_date_1month":"1 miesi\u0105c","filter_date_1year":"1 rok","filter_user":"U\u017cytkownik","filter_user_mypics":"Moje zdj\u0119cia","filter_zoom_in":"Przybli\u017c, aby filtry by\u0142y widoczne","picture_flat":"Klasyczne","picture_360":"360\xb0","filter_qualityscore":"Ocena jako\u015bci","map_background":"Podk\u0142ad mapowy","map_background_aerial":"Zdj\u0119cia lotnicze","map_background_streets":"Ulice","map_theme":"Motyw mapy","map_theme_default":"Klasyczny","map_theme_score":"Ocena jako\u015bci","contrast":"W\u0142\u0105cz wy\u017cszy kontrast zdj\u0119cia","metadata_general_picid_link":"Id\u017a do opisu zdj\u0119cia w JSON","metadata_general_seqid_link":"Id\u017a do opisu sekwencji w JSON","metadata_general_license_link":"Id\u017a do strony z pelnym opisem licencji","metadata_general_date":"Data zrobienia","metadata_camera_make":"Marka","metadata_camera_focal_length":"Ogniskowa","metadata_location_longitude":"D\u0142ugo\u015b\u0107 geograficzna","metadata_location_latitude":"Szeroko\u015b\u0107 geograficzna","metadata_location_orientation":"Kierunek robienia zdj\u0119cia","metadata_location_precision":"Precyzja lokalizacji","metadata_quality":"Ocena jako\u015bci","metadata_quality_help":"Dowiedz si\u0119 wi\u0119cej o ocenie jako\u015bci","metadata_quality_score":"Ocena globalna","metadata_quality_gps_score":"Ocena pozycji","metadata_quality_resolution_score":"Ocena rozdzielczo\u015bci","report_auth":"To zg\u0142oszenie b\u0119dzie wys\u0142anie przy pomocy Twojego konta \\"{a}\\"","report_nature_label":"Typ problemu","report_details_placeholder":"Opcjonalnie, mo\u017cesz doda\u0107 szczeg\xf3\u0142y o problemie","report_failure":"B\u0142\u0105d wyst\u0105pi\u0142 podczas tworzenia zg\u0142oszenia: {e}. Prosz\u0119 spr\xf3buj ponownie.","filter_qualityscore_help":"Kliknij, aby w\u0142\u0105czy\u0107 lub wy\u0142\u0105czy\u0107","error_josm":"JOSM nie odpowiada, czy jest uruchomiony i czy dost\u0119p zdalny jest w\u0142\u0105czony?"},"psv":{"twoFingers":"U\u017cyj dw\xf3ch palc\xf3w do nawigacji","ctrlZoom":"U\u017cyj ctrl + rolka myszy, aby powi\u0119kszy\u0107 zdj\u0119cie","loadError":"Panorama nie mo\u017ce by\u0107 za\u0142adowana"},"maplibre":{"GeolocateControl.FindMyLocation":"Znajd\u017a moj\u0105 lokalizacj\u0119","GeolocateControl.LocationNotAvailable":"Lokalizacja niedost\u0119pna"},"map":{"thumbnail":"Miniaturki najechanego zdj\u0119cia","not_public":"Niewidoczne publicznie","slow_loading":"Mapa \u0142aduje si\u0119 wolno i mo\u017ce si\u0119 wydawaj popsuta","loading":"\u0141adowanie\u2026"}}')},991:at=>{"use strict";at.exports=JSON.parse('{"psv":{"twoFingers":"Anv\xe4nd tv\xe5 fingrar f\xf6r att panorera","loadError":"Panoramat kan inte laddas","ctrlZoom":"Anv\xe4nd ctrl + scroll f\xf6r att zooma in p\xe5 bilden"},"pnx":{"moveUp":"Flytta upp","zoom":"Zoom","zoomOut":"Zooma ut","zoomIn":"Zooma in","moveDown":"Flytta ner","moveLeft":"Flytta v\xe4nster","moveRight":"Flytta h\xf6ger","moveMiddle":"Centrera vy","expand":"Expandera","show_psv":"Visa bildvisaren","show_map":"Visa kartan","expand_info":"Visa widgeten p\xe5 hela sidan","minimize":"G\xf6m denna flik, du kan visa den igen genom att anv\xe4nda knappen i nedersta v\xe4nstra h\xf6rnet","minimize_short":"G\xf6m","options":"Alternativ","search":"S\xf6k","search_empty":"Inga resultat hittade","filters":"Filter","layers":"Lager","share":"Dela","share_links":"L\xe4nkar","share_page":"L\xe4nka till denna sida","share_image":"HD bild","share_rss":"RSS feed","share_embed":"B\xe4dda in p\xe5 din hemsida","share_embed_docs":"L\xe4s mer om inb\xe4ddad konfiguration","share_print":"Skriv ut","copy":"Kopiera","copied":"Kopierad","error":"Vi har ett problem\u2026","error_click":"Forts\xe4tt","error_retry":"V\xe4nligen f\xf6rs\xf6k igen senare","sequence_next":"N\xe4sta bild i sekvensen","sequence_play":"Spela upp bilder i sekvensen","sequence_pause":"Pausa sekvens","sequence_more":"Mera uppspelningsalternativ","sequence_speed":"Uppspelningshastighet","legend_license":"Licens: {l}","search_address":"S\xf6k en adress, stad\u2026","edit_osm":"Redigera OSM","loading_labels_serious":["\ud83d\uddfa\ufe0f Laddar kartdata","\ud83d\udda5\ufe0f Anropar API","\ud83d\uddbc\ufe0f Laddar miniatyrer","\ud83d\udd0d Analyserar EXIF metadata","\ud83c\udfd8\ufe0f 3D rendering","\ud83d\udcf7 Initialiserar 360\xb0 bilder","\ud83d\udfe0 F\xe4rg balansering","\ud83d\udcaf Ber\xe4kna Kvalitetspo\xe4ng \xa9"],"loading_labels_fun":["\ud83e\udd8c R\xe4knar \xe4lgar","R\xe4knar gula bilar","\u2615 Bunkrar upp med kaffe","Kaj nu simmar du ur bild!","\ud83d\udc08 Delar kattbilder","\ud83d\ude34 Prokastinerar","\ud83e\uded6 Kokar te","\ud83d\udc27 \xd6ppnar k\xe4llkod","\ud83d\ude87 R\xe4knar t\xe5g","\ud83e\uddf9 St\xe4dar upp bland metadata","\ud83d\udc3f\ufe0f R\xe4knar ekorrar","\ud83d\udeb2 R\xe4knar cykelst\xe4ll","\ud83d\ude89 G\xe5r igenom stationer","\ud83d\udef0\ufe0f S\xf6ker satelliter","\ud83e\uddd1\u200d\ud83c\udf73 Lagar k\xf6ttbullar","\ud83e\uddcdSt\xe5r i k\xf6","\ud83e\uddd1\u200d\ud83d\udcbb Fels\xf6ker gr\xe4nsnitt","\ud83d\udcc8 \xd6kar statistik"],"error_psv":"Foto-sf\xe4r visaren laddar inte ordentligt","error_nopic":"Ingen bild finns p\xe5 angiven position","error_api":"Bildservern \xe4r inte tillg\xe4nlig","error_webgl":"WebGL st\xf6ds inte i din webbl\xe4sare","error_api_compatibility":"Bildservern \xe4r inte kompatibel med den h\xe4r visarens version","filter_date":"Datum","filter_date_1month":"1 m\xe5nad","filter_date_1year":"1 \xe5r","filter_user":"Anv\xe4ndare","filter_user_mypics":"Mina bilder","filter_picture":"Bildtyp","filter_zoom_in":"Zooma in f\xf6r att se detta filter","picture_360":"360\xb0","filter_qualityscore_help":"Klicka f\xf6r att sl\xe5 p\xe5 eller av","qualityscore_title":"Om Kvalitetspo\xe4ng","filter_qualityscore":"Kvalitetspo\xe4ng","qualityscore_doc_2":"Kvalitet visas som en skala p\xe5 A/B/C/D/E (A \xe4r b\xe4st, E \xe4r s\xe4mst) och visas grafisk genom skalan:","map_theme_default":"Klassisk","map_theme_age_1":"> 2 \xe5r","map_theme_age_2":"< 2 \xe5r","map_theme_age_3":"< 1 \xe5r","map_theme_age_4":"< 1 m\xe5nad","map_theme_type":"Kameratyp","contrast":"Aktivera h\xf6gre bildkontrast","metadata":"Bildmetadata","metadata_general_picid":"Bild-identifierare","metadata_general_seqid":"Sekvens-identifierare","qualityscore_doc_link":"Mer information om hur Kvalitetspo\xe4ng ber\xe4knas finns i v\xe5r dokumentation.","map_theme_score":"Kvalitetspo\xe4ng","metadata_general_seqid_link":"G\xe5 till JSON beskrivning av sekvensen","metadata_general_author":"Upphovsman","metadata_general_license":"Licens","metadata_general_license_link":"Se full licensbeskrivning","metadata_general_date":"Bild tagen","metadata_camera":"Kamera","metadata_camera_make":"M\xe4rke","metadata_camera_model":"Modell","metadata_camera_type":"Typ","metadata_camera_resolution":"Uppl\xf6sning","metadata_location":"Plats","metadata_location_longitude":"Longitud","metadata_location_latitude":"Latitud","metadata_location_orientation":"Kamerariktning","metadata_location_precision":"Positionsprecision","metadata_quality":"Kvalitetspo\xe4ng","metadata_quality_score":"Global po\xe4ng","metadata_quality_gps_score":"Positioneringspo\xe4ng","metadata_quality_resolution_score":"Uppl\xf6sningspo\xe4ng","metadata_quality_missing":"Inget v\xe4rde satt i bilden","metadata_exif":"EXIF / XMP","metadata_exif_name":"Tag","metadata_exif_value":"V\xe4rde","report":"Rapportera bild","search_user":"S\xf6k anv\xe4ndarnamn\u2026","legend_title":"Visa detaljer f\xf6r bild","report_auth":"Denna rapport kommer skickas genom ditt konto \\"{a}\\"","share_rss_title":"RSS feed av nya sekvensen f\xf6r karta i bild","error_josm":"JOSM svarar inte, k\xf6rs det och \xe4r remote p\xe5slaget?","sequence_prev":"F\xf6reg\xe5ende bild i sekvensen","josm_live":"Aktivera automatisk JOSM synkronisering vid inladdning av bild","metadata_general_picid_link":"G\xe5 till JSON beskrivning av bilden","metadata_quality_help":"L\xe4s mer om Kvalitetspo\xe4ng","error_pic":"Beg\xe4rd bild hittades inte","qualityscore_doc_3":"Det r\xe4knas ut baserat p\xe5 GPS precision och bildens uppl\xf6sning. Ett profesionellt system kommer ha A-kvalit\xe9, en 360\xb0 actionkamera kommer ha B-kvalit\xe9 och en telefon kommer ha C/D/E-kvalit\xe9.","qualityscore_doc_1":"Panoramax erbjuder en Kvalitetspo\xe4ng f\xf6r varje bild. Det m\xf6jlig\xf6r enkel kartfiltrering och en omfattande uppvisning av tillg\xe4nligheten av bilder av h\xf6g kvalitet.","metadata_camera_focal_length":"Br\xe4nnvidd","picture_flat":"Klassisk","map_background":"Kartbakgrund","map_background_aerial":"Sattelit","map_background_streets":"Gator","map_theme":"Karttema","map_theme_age":"Fotodatum","report_nature_label":"Typ av problem","report_nature":{"":"V\xe4lj typen av problem\u2026","blur_missing":"En persons ansikte eller en registreringspl\xe5t \xe4r synlig","blur_excess":"Ett objekt som inte beh\xf6ver suddas \xe4r suddad","inappropriate":"Bilden \xe4r ol\xe4mplig(orelaterat, nakenhet...)","privacy":"En privat v\xe4g eller fastighet \xe4r synlig","picture_low_quality":"Bilden \xe4r av mycket d\xe5lig kvalitet","mislocated":"Bilden \xe4r placerat d\xe5lig p\xe5 kartan","copyright":"Bilden inkr\xe4nker p\xe5 upphovsr\xe4tt","other":"N\xe5got annat typ av problem"},"report_whole_sequence":"Detta g\xe4ller hela sekvensen","report_details":"Ytterligare detaljer","report_details_placeholder":"Valfritt, kan du l\xe4gga till information om problemet och varf\xf6r det \xe4r ett problem","report_email":"Din e-post","report_email_placeholder":"Valfri","report_submit":"Skicka","report_wait":"Skickar rapport \u2026","report_success":"Rapporten har skickats. Det kommer att ses \xf6ver s\xe5 snart som m\xf6jligt.","report_failure":"Ett fel uppstod n\xe4r rapporten skapades: {e}. F\xf6rs\xf6k igen senare."},"maplibre":{"GeolocateControl.FindMyLocation":"Hitta min postion","GeolocateControl.LocationNotAvailable":"Plats inte tillg\xe4nlig"},"map":{"loading":"Laddar\u2026","thumbnail":"Miniatyrbild av r\xf6rd bild","not_public":"Inte offentligt synligt","slow_loading":"Kartan laddas l\xe5ngsamt och kan verka trasig"}}')},6984:at=>{"use strict";at.exports=JSON.parse('{"pnx":{"contrast":"\u589e\u52a0\u76f8\u7247\u5c0d\u6bd4\u5ea6","copied":"\u5df2\u8907\u88fd","copy":"\u8907\u88fd","edit_osm":"\u7de8\u8f2f OSM","error":"Panoramax \u7576\u6a5f\u4e86\u2026","error_api":"\u76f8\u7247\u4f3a\u670d\u5668\u7121\u6cd5\u4f7f\u7528","error_api_compatibility":"\u76f8\u7247\u4f3a\u670d\u5668\u548c\u6b64\u6aa2\u8996\u5668\u7684\u7248\u672c\u4e0d\u76f8\u5bb9","error_josm":"JOSM \u6c92\u6709\u56de\u61c9\uff0c\u5b83\u5df2\u7d93\u555f\u52d5\u4e14\u555f\u7528\u9060\u7aef\u63a7\u5236\u4e86\u55ce?","error_nopic":"\u641c\u5c0b\u7684\u4f4d\u7f6e\u9644\u8fd1\u6c92\u6709\u76f8\u7247","error_pic":"\u627e\u4e0d\u5230\u6307\u5b9a\u7684\u76f8\u7247","error_psv":"\u7121\u6cd5\u6b63\u78ba\u8f09\u5165 Photo Sphere Viewer","error_subtitle":"\u8acb\u7a0d\u5f8c\u91cd\u8a66\u6216\u6aa2\u67e5\u700f\u89bd\u5668\u7684\u4e3b\u63a7\u53f0\u4ee5\u4e86\u89e3\u8a73\u60c5\u3002","error_webgl":"\u60a8\u7684\u700f\u89bd\u5668\u4e0d\u652f\u63f4 WebGL","expand":"\u5c55\u958b","expand_info":"\u5728\u6574\u500b\u756b\u9762\u986f\u793a\u6b64\u5c0f\u5de5\u5177","filter_camera_model":"\u6309\u76f8\u6a5f\u578b\u865f","filter_date":"\u65e5\u671f","filter_picture":"\u76f8\u7247\u985e\u578b","filter_user":"\u4f7f\u7528\u8005","filter_zoom_in":"\u62c9\u8fd1\u5730\u5716\u4ee5\u986f\u793a\u7be9\u9078\u7d50\u679c","filters":"\u7be9\u9078\u5668","id":"iD","josm":"JOSM","josm_live":"\u555f\u7528\u8f09\u5165\u76f8\u7247\u6642\u81ea\u52d5\u540c\u6b65 JOSM","layers":"\u5716\u5c64","legend_license":"\u6388\u6b0a: {l}","loading_labels_fun":["\ud83e\udd8c \u5075\u6e2c\u5230\u7576\u5fc3\u6885\u82b1\u9e7f\u6a19\u8a8c","\ud83d\ude98 \u6b63\u5728\u641c\u5c0b Panoramax \u6c7d\u8eca \xa9","\u2615 \u6ce8\u5165\u5496\u5561\u56e0","\ud83d\ude00 \u8acb\u5fae\u7b11\uff0c\u60a8\u5df2\u88ab\u6a19\u8a18\u5728\u5730\u5716\u4e0a\u4e86\uff01","\ud83d\udc08 \u6b63\u5728\u5206\u4eab\u8c93\u54aa\u7684\u76f8\u7247","\ud83d\ude34 \u6b63\u5728\u6e1b\u5c11\u5ef6\u9072","\ud83e\uded6 \u6b63\u5728\u6c8f\u58fa\u597d\u8336","\ud83d\udc27 \u6b63\u5728\u958b\u555f\u539f\u59cb\u78bc","\ud83d\ude87 \u6b63\u5728\u7d22\u5f15\u5730\u9435\u8eca\u7ad9","\ud83e\uddf9 \u6e05\u7406\u8a6e\u91cb\u8cc7\u6599","\ud83d\ude92 \u6b63\u5728\u50b3\u9001\u6d88\u9632\u968a\u7684\u76f8\u7247","\ud83d\udeb2 \u66f4\u65b0\u7da0\u9053","\ud83d\ude89 \u6b63\u5728\u901a\u904e\u8eca\u7ad9\u6708\u53f0","\ud83d\udef0\ufe0f \u6b63\u5728\u641c\u5c0b\u885b\u661f","\ud83d\udc65 \u6b63\u5728\u64b0\u5beb\u4eba\u7269\u8a8c","\ud83c\udf57 \u6b63\u5728\u5b9a\u4f4d\u9e79\u9165\u96de\u5e97","\ud83e\uddd1\u200d\ud83d\udcbb \u6b63\u5728\u5075\u932f\u4ecb\u9762","\ud83d\udcc8 \u7d71\u8a08\u6578\u64da\u6b63\u5728\u589e\u52a0","\ud83e\udd16 \u6b63\u5728\u5b78\u7fd2\u8a9e\u7fa9","\ud83c\udfa8 \u91cd\u65b0\u8a2d\u8a08\u4ecb\u9762","\ud83d\udcc5 \u6b63\u5728\u898f\u5283\u76f8\u7247\u5730\u5716\u7e6a\u5716\u805a\u6703","\ud83e\uddc0 \u6b63\u5728\u719f\u6210\u5207\u9054\u8d77\u53f8","\ud83c\udf04 \u6b63\u5728\u8a08\u7b97\u6046\u6625\u7684\u65e5\u7167\u6642\u6578","\ud83c\udf0a \u6b63\u5728\u6e2c\u91cf\u6f6e\u6c50"],"loading_labels_serious":["\ud83d\uddfa\ufe0f \u6b63\u5728\u8f09\u5165\u5730\u5716\u8cc7\u6599","\ud83d\udda5\ufe0f \u6b63\u5728\u67e5\u8a62 API","\ud83d\uddbc\ufe0f \u6b63\u5728\u8f09\u5165\u7e2e\u5716","\ud83d\udd0d \u6b63\u5728\u5206\u6790 EXIF \u8a6e\u91cb\u8cc7\u6599","\ud83c\udfd8\ufe0f \u6b63\u5728\u7b97\u7e6a 3D","\ud83d\udcf7 \u6b63\u5728\u521d\u59cb\u5316 360\xb0 \u76f8\u7247","\ud83d\udfe0 \u6b63\u5728\u5e73\u8861\u8272\u5f69","\ud83d\udcaf \u6b63\u5728\u8a08\u7b97\u54c1\u8cea\u5206\u6578 \xa9","\ud83d\udce1 \u6b63\u5728\u4e0b\u8f09\u66f4\u65b0","\ud83c\udf0d \u6b63\u5728\u53d6\u5f97\u5730\u5716\u5716\u78da","\ud83d\udcf8 \u6b63\u5728\u8655\u7406\u9670\u5f71"],"map_background":"\u5730\u5716\u80cc\u666f","map_background_aerial":"\u885b\u661f","map_background_streets":"\u9810\u8a2d","map_theme":"\u5730\u5716\u4e3b\u984c","map_theme_age":"\u62cd\u651d\u6642\u9593","map_theme_age_1":"> 2 \u5e74","map_theme_age_2":"< 2 \u5e74","map_theme_age_3":"< 1 \u5e74","map_theme_age_4":"< 1 \u500b\u6708","map_theme_default":"\u7d93\u5178","map_theme_type":"\u76f8\u6a5f\u985e\u578b","metadata":"\u76f8\u7247\u8a6e\u91cb\u8cc7\u6599","metadata_camera":"\u76f8\u6a5f","metadata_camera_focal_length":"\u7126\u8ddd","metadata_camera_make":"\u88fd\u9020\u5546","metadata_camera_model":"\u578b\u865f","metadata_camera_type":"\u985e\u578b","metadata_exif":"EXIF","metadata_exif_name":"\u6a19\u7c64","metadata_exif_value":"\u503c","metadata_general_author":"\u4f5c\u8005","metadata_general_date":"\u62cd\u651d\u6642\u9593","metadata_general_license":"\u6388\u6b0a","metadata_general_license_link":"\u67e5\u770b\u5b8c\u6574\u6388\u6b0a\u689d\u6b3e","metadata_general_picid":"\u76f8\u7247","metadata_general_picid_link":"\u524d\u5f80\u672c\u76f8\u7247\u7684 JSON \u8aaa\u660e","metadata_general_seqid":"\u5e8f\u5217","metadata_general_seqid_link":"\u524d\u5f80\u672c\u5e8f\u5217\u7684 JSON \u8aaa\u660e","metadata_location":"\u4f4d\u7f6e","metadata_location_latitude":"\u7def\u5ea6","metadata_location_longitude":"\u7d93\u5ea6","metadata_location_orientation":"\u65b9\u5411","metadata_location_precision":"\u5b9a\u4f4d\u7cbe\u5ea6","minimize":"\u96b1\u85cf\u9019\u500b\u5c0f\u5de5\u5177\uff0c\u60a8\u53ef\u4ee5\u6309\u5de6\u4e0b\u89d2\u7684\u6309\u9215\u518d\u6b21\u986f\u793a\u5b83","moveDown":"\u4e0b\u79fb","moveLeft":"\u5de6\u79fb","moveMiddle":"\u756b\u9762\u7f6e\u4e2d","moveRight":"\u53f3\u79fb","moveUp":"\u4e0a\u79fb","options":"\u9078\u9805","picture_360":"360\xb0","picture_flat":"\u7d93\u5178","search":"\u641c\u5c0b","search_address":"\u641c\u5c0b\u5730\u5740\u3001\u57ce\u5e02\u2026","search_empty":"\u627e\u4e0d\u5230\u7d50\u679c","search_user":"\u641c\u5c0b\u5e33\u865f\u2026","sequence_more":"\u66f4\u591a\u64ad\u653e\u9078\u9805","sequence_next":"\u5e8f\u5217\u4e2d\u7684\u4e0b\u4e00\u5f35\u76f8\u7247","sequence_pause":"\u66ab\u505c\u5e8f\u5217","sequence_play":"\u64ad\u653e\u5e8f\u5217","sequence_prev":"\u5e8f\u5217\u4e2d\u7684\u4e0a\u4e00\u5f35\u76f8\u7247","sequence_speed":"\u64ad\u653e\u901f\u5ea6","share":"\u5206\u4eab","share_embed":"\u5d4c\u5165\u5230\u60a8\u7684\u7db2\u7ad9","share_image":"\u9ad8\u756b\u8cea\u76f8\u7247","share_links":"\u8d85\u9023\u7d50","share_page":"\u9019\u5f35\u76f8\u7247\u7684\u9023\u7d50","share_print":"\u5217\u5370","share_rss":"RSS \u6458\u8981","share_rss_title":"\u76ee\u524d\u5730\u5716\u53ef\u898b\u5340\u57df\u4e2d\u65b0\u76f8\u7247\u5e8f\u5217\u7684 RSS \u6458\u8981","show_map":"\u986f\u793a\u5730\u5716","show_psv":"\u986f\u793a\u76f8\u7247\u6aa2\u8996\u5668","zoom":"\u7e2e\u653e","zoomIn":"\u62c9\u8fd1","zoomOut":"\u62c9\u9060","report_submit":"\u9001\u51fa","report_email":"\u60a8\u7684 email","report_nature_label":"\u554f\u984c\u7684\u985e\u578b","report_nature":{"":"\u9078\u64c7\u554f\u984c\u7684\u985e\u578b\u2026","blur_missing":"\u53ef\u4ee5\u770b\u898b\u4eba\u81c9\u6216\u8eca\u724c","blur_excess":"\u4e0d\u9700\u8981\u6a21\u7cca\u7684\u7269\u4ef6\u88ab\u6a21\u7cca\u8655\u7406\u4e86","inappropriate":"\u4e0d\u7576\u7684\u76f8\u7247 (\u4e0d\u76f8\u95dc\u3001\u88f8\u9ad4\u2026)","privacy":"\u53ef\u4ee5\u770b\u898b\u79c1\u4eba\u7684\u9053\u8def\u6216\u8cc7\u7522","picture_low_quality":"\u76f8\u7247\u7684\u54c1\u8cea\u5f88\u5dee","mislocated":"\u76f8\u7247\u5728\u5730\u5716\u4e0a\u7684\u4f4d\u7f6e\u4e0d\u6b63\u78ba","copyright":"\u76f8\u7247\u4fb5\u72af\u4e86\u7248\u6b0a","other":"\u4efb\u4f55\u5176\u4ed6\u985e\u578b\u7684\u554f\u984c"},"share_embed_docs":"\u6df1\u5165\u4e86\u89e3\u5d4c\u5165\u8a2d\u5b9a\u503c","error_retry":"\u8acb\u7a0d\u5f8c\u518d\u8a66","error_click":"\u7e7c\u7e8c","legend_title":"\u986f\u793a\u76f8\u7247\u7684\u8a73\u7d30\u8cc7\u6599","report_email_placeholder":"\u9078\u586b","report_whole_sequence":"\u9019\u500b\u554f\u984c\u5f71\u97ff\u6574\u500b\u5e8f\u5217","report_details":"\u66f4\u591a\u8cc7\u8a0a","report_details_placeholder":"\u9078\u586b\uff0c\u60a8\u53ef\u4ee5\u8a73\u8ff0\u6b64\u554f\u984c\u548c\u5b83\u9020\u6210\u7684\u5f71\u97ff","report_wait":"\u6b63\u5728\u50b3\u9001\u5831\u544a\u2026","report_success":"\u5df2\u6210\u529f\u767c\u9001\u5831\u544a\uff0c\u6211\u5011\u5c07\u5118\u5feb\u5c0d\u5b83\u9032\u884c\u5be9\u6838\u3002","report_failure":"\u5efa\u7acb\u5831\u544a\u6642\u767c\u9001\u932f\u8aa4: {e}\uff0c\u8acb\u7a0d\u5f8c\u518d\u8a66\u3002","report_auth":"\u6b64\u5831\u544a\u5c07\u4f7f\u7528\u60a8\u7684\u5e33\u6236\u300c{a}\u300d\u767c\u9001","filter_qualityscore":"\u54c1\u8cea\u5206\u6578","filter_qualityscore_help":"\u9ede\u64ca\u4ee5\u555f\u7528\u6216\u505c\u7528","map_theme_score":"\u54c1\u8cea\u5206\u6578","metadata_camera_resolution":"\u89e3\u6790\u5ea6","metadata_quality":"\u54c1\u8cea","metadata_quality_help":"\u6df1\u5165\u4e86\u89e3\u54c1\u8cea\u5206\u6578","metadata_quality_gps_score":"\u5b9a\u4f4d\u5206\u6578","metadata_quality_resolution_score":"\u89e3\u6790\u5ea6\u5206\u6578","metadata_quality_missing":"\u76f8\u7247\u672a\u5305\u542b\u8cc7\u8a0a","report":"\u6aa2\u8209","metadata_quality_score":"\u6574\u9ad4\u5206\u6578","filter_user_mypics":"\u6211\u7684\u76f8\u7247","filter_date_1month":"1 \u500b\u6708","filter_date_1year":"1 \u5e74","qualityscore_doc_2":"\u5206\u6578\u4ee5 A/B/C/D/E \u7b49\u7d1a\u7684\u5f62\u5f0f\u986f\u793a (A \u6700\u4f73\u3001E \u6700\u5dee) \uff0c\u4e26\u900f\u904e\u9019\u500b\u91cf\u5c3a\u8996\u89ba\u5316\u986f\u793a:","qualityscore_doc_link":"\u6df1\u5165\u4e86\u89e3\u54c1\u8cea\u5206\u6578","qualityscore_title":"\u95dc\u65bc\u54c1\u8cea\u5206\u6578","qualityscore_doc_1":"Panoramax \u70ba\u6bcf\u5f35\u76f8\u7247\u63d0\u4f9b\u54c1\u8cea\u5206\u6578\uff0c\u9019\u80fd\u5e6b\u52a9\u6211\u5011\u8f15\u9b06\u5730\u5728\u5730\u5716\u4e0a\u7be9\u9078\u548c\u986f\u793a\u9ad8\u54c1\u8cea\u76f8\u7247\u3002","qualityscore_doc_3":"\u5b83\u6839\u64da GPS \u7cbe\u78ba\u5ea6\u548c\u76f8\u7247\u89e3\u6790\u5ea6\u8a08\u7b97\u5f97\u51fa\uff0c\u5c08\u696d\u8a2d\u5099\u7684\u7b49\u7d1a\u70ba A\u3001360\xb0 \u904b\u52d5\u76f8\u6a5f\u7684\u7b49\u7d1a\u70ba B\u3001\u667a\u6167\u578b\u624b\u6a5f\u7684\u7b49\u7d1a\u70ba C/D/E\u3002","minimize_short":"\u96b1\u85cf","metadata_general_instance":"\u4f86\u6e90\u57f7\u884c\u500b\u9ad4","metadata_general_copy_picid":"\u8907\u88fd\u76f8\u7247 ID","metadata_general_copy_id":"\u8907\u88fd ID","picture_360_long":"\u5168\u666f\u76f8\u7247","metadata_summary":"\u6458\u8981","picture_flat_long":"\u7d93\u5178\u76f8\u7247","geo_uri":"\u5916\u90e8\u7a0b\u5f0f","contribute_id":"\u900f\u904e iD \u7de8\u8f2f\u5668\u4f86\u8ca2\u737b OpenStreetMap","filter_date_6months":"6 \u500b\u6708","picture_all":"\u5168\u90e8","metadata_exif_doc":"EXIF \u6a19\u7c64\u6587\u4ef6","metadata_exif_doc_title":"\u8acb\u53c3\u95b1 Exiv2 \u6587\u4ef6\u4ee5\u53d6\u5f97 EXIF \u548c XMP \u6a19\u7c64\u5b9a\u7fa9\u7684\u5b8c\u6574\u8aaa\u660e","metadata_location_coordinates":"\u5ea7\u6a19 (\u7d93\u5ea6, \u7def\u5ea6)","metadata_location_copy":"\u8907\u88fd {v}","metadata_location_copy_more":"\u66f4\u591a\u5ea7\u6a19\u8907\u88fd\u9078\u9805","semantics_title":"\u6a19\u7c64","semantics_tags":"{nb} \u500b\u6a19\u7c64","semantics_show_annotations":"\u986f\u793a\u76f8\u7247\u6a19\u8a3b","semantics_show_all_tags":"\u986f\u793a\u6240\u6709\u6a19\u7c64","semantics_key":"\u7d22\u5f15\u9375","semantics_annotation_tooltip":"\u9ede\u64ca\u67e5\u770b\u8a73\u60c5","semantics_features_default_title":"\u7279\u5fb5 #{nb}","semantics_features_subtitle":"{nb} \u500b\u95dc\u806f\u7684\u5c6c\u6027","semantics_hide_all_tags":"\u96b1\u85cf\u6240\u6709\u6a19\u7c64","semantics_features_none":"\u6b64\u76f8\u7247\u5c1a\u672a\u6aa2\u6e2c\u5230\u6216\u8a3b\u91cb\u4efb\u4f55\u7279\u5fb5\u3002","semantics_value":"\u503c","semantics_tags_picture_none":"\u6b64\u76f8\u7247\u5c1a\u672a\u52a0\u4e0a\u4efb\u4f55\u6a19\u7c64\u3002","semantics_tags_picture":"\u76f8\u7247\u6a19\u7c64","whats_panoramax":"Panoramax \u662f\u5404\u5730\u76f8\u7247\u7684\u5730\u7406\u5171\u4eab\u8cc7\u6e90\u3002","semantics_features":"\u5075\u6e2c\u5230\u7684\u7279\u5fb5","semantics_key_doc":"\u6df1\u5165\u4e86\u89e3\u6b64\u7d22\u5f15\u9375","semantics_value_doc":"\u6df1\u5165\u4e86\u89e3\u6b64\u6a19\u7c64","semantics_qualifiers":"\u9650\u5b9a\u689d\u4ef6","semantics_hide_annotations":"\u96b1\u85cf\u76f8\u7247\u6a19\u8a3b","semantics_zero_annotations":"\u6b64\u76f8\u7247\u5c1a\u672a\u52a0\u4e0a\u4efb\u4f55\u6a19\u8a3b","semantics_hashtags":"\u76f8\u7247\u4e3b\u984c\u6a19\u7c64","semantics_wikidata_properties":{"P31":"\u96b8\u5c6c\u65bc","P279":"\u4e0a\u7d1a\u5206\u985e","P361":"\u6240\u5c6c\u5be6\u9ad4"},"panoramax":"Panoramax"},"map":{"loading":"\u6b63\u5728\u8f09\u5165\u2026","not_public":"\u672a\u516c\u958b\u986f\u793a","thumbnail":"\u904a\u6a19\u61f8\u505c\u76f8\u7247\u7684\u7e2e\u5716","slow_loading":"\u5730\u5716\u8f09\u5165\u901f\u5ea6\u7de9\u6162\u800c\u4e14\u53ef\u80fd\u51fa\u73fe\u640d\u58de","more_panoramax":"\u6df1\u5165\u4e86\u89e3 Panoramax","map_data":"\u5730\u5716\u8cc7\u6599: {m}"},"psv":{"ctrlZoom":"\u4f7f\u7528 CTRL + \u6ed1\u9f20\u6efe\u8f2a\u7e2e\u653e\u5716\u7247","loadError":"\u7121\u6cd5\u8f09\u5165\u5168\u666f\u5716","twoFingers":"\u4f7f\u7528\u96d9\u6307\u79fb\u52d5"},"maplibre":{"GeolocateControl.FindMyLocation":"\u5c0b\u627e\u6211\u7684\u4f4d\u7f6e","GeolocateControl.LocationNotAvailable":"\u7121\u6cd5\u4f7f\u7528\u4f4d\u7f6e\u8cc7\u8a0a"}}')}},st={};function __webpack_require__(ot){var ut=st[ot];if(void 0!==ut)return ut.exports;var Hl=st[ot]={exports:{}};return at[ot].call(Hl.exports,Hl,Hl.exports,__webpack_require__),Hl.exports}__webpack_require__.n=at=>{var st=at&&at.__esModule?()=>at.default:()=>at;return __webpack_require__.d(st,{a:st}),st},__webpack_require__.d=(at,st)=>{for(var ot in st)__webpack_require__.o(st,ot)&&!__webpack_require__.o(at,ot)&&Object.defineProperty(at,ot,{enumerable:!0,get:st[ot]})},__webpack_require__.o=(at,st)=>Object.prototype.hasOwnProperty.call(at,st),__webpack_require__.r=at=>{"undefined"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(at,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(at,"__esModule",{value:!0})};var ot={};return(()=>{"use strict";__webpack_require__.r(ot),__webpack_require__.d(ot,{CoverageMap:()=>Hl.A,Editor:()=>rc.A,PhotoViewer:()=>sc.Ay,Viewer:()=>ut.A,components:()=>at,utils:()=>st});var at=__webpack_require__(9341),st=__webpack_require__(2030),ut=__webpack_require__(8743),Hl=__webpack_require__(153),rc=__webpack_require__(1752),sc=__webpack_require__(3407)})(),ot})()));
2708
2708
  //# sourceMappingURL=index.js.map