[1,["d22g3IMw5IzpMfninR1QfO","3bU1udWEdEV5LirasgV6Ru@3b522","6634xj979N/bBvff2eJPD9","abLWrE4X9CmYkn5pXzNcFe","01Nhs3NP5D5aV0P/lIWw1a@f8e9c","a60Cwe2cVA0pRqxYFsUhK6","3dsSTelbxBG6URcg8QZvZK@154d6","00h2OJM6dFKqwYfJjGbyx6@c41b8","7fy+0qt6VHKpdVSVNVUAI1@b62d4","51RoxqqjxGOpkoM1IWksyX@4b954","fekHgkSNBE/bqwAxoFtuMa","36cT62M5lMUKc5Iv9IBiqJ","1brw/JvvpFnIvdrxpFCgMZ","8bXaheS69IJL/Dmztxs71L@8a328","a6a9JfitxAIYgzYk9Im4p1","08ryx8HKZN2bhewwbug5Zl","e1OFIz5YhEPYFgHEIavaYE@5a6d1","dcNT+gPDdL24vbSnEmSSdt@6c48a","e8cN6vS11KzJfM+nNvPgdL@6d7c8","7dldaWLlVBYqEEPrP2rMLJ@a0c1c","b9wl5BYxxMtp3bzUg/VVsK@1ad5b","1afpXTdv1AMJGiKgrF+qlM","d4SIl42HVFlocYRoyauYMD@e6d7a","a8g3QqFNlKO4aSdFuThDAX","daVwovurJAxYdGDNq5jB0B@48a5a","bf7j1FHttF3bt6QmBPVGUh","64ZBxf1RtL/rCPtj42agG0","20g1ukYUVPvKWKBRznAKo+@f9941","12pTU6BeJBlLBHoW2Bd1pl","1duKDpLk5DvarITnQzeFIb@6c48a","bb2mvGDylIcahcPPjTuKpr@39ac5","bbRNPuvEBA24rzLB+uQ1bs","feSYbjqk9Hn5m15u3dI0Vq","30nbLPeNVIcoLjZr4lanyx","c5Rv2/jN5PIaC1I7XP73KV@6c48a","79cbfNygZEKKjyrV8F1og7@9021c","52O46HsXdCgJnTdSjOKHXW","45xWN0T/hC/oBZ9uiAMSS/","46848DDnRPAKdUJqGptbQU@0e52b","6bTmaF+ONA/7Ltyo1V/Uc0@6c48a","8dzqYsko1PYYsJ95Xb26Y0@6c48a","e75ZEdizBCdYadC5WtHmCN@6c48a","3fbr8TuvxD1rle0oSJOTOG@bd24f","f08LLYqa5LxLf3SEETEkv6@e53ec","aeE2FIh5hKIL1a3o8d+Fw+","84icjHwZNJM505DWZJK0ha","54TknWPwVPqJqeCR+Y/Czo@f9941","95EkngnxZFbYuFpsqVTaFr@f9941","23V61SChNOMJibVj7WiApi@6c48a","9bZ7uweUhGiog/bu8lzt0N@6c48a","a8ivwC/TFEG7HFUIEaV/YO@6c48a","07M047gFNJ+r7yIdzkP7VW@6c48a","935/uPnxRLmomuHN4RPIOr@219ed","048QLzmk5BAIDlw7CXgaXp@4d8fe","b36AQZ17ZNGYCcd6Eu2xO5@c833f","13/dTHga9CuaB/6RDLynmX@68e7e","7dj5uJT9FMn6OrOOx83tfK@f9941","92tJa928FOSolIwSBiDPTN@6c48a","d5ZCvySB5PdbR3UyTkbhRu@6c48a","63Czi4tTND8ogaIKHe0Sj/@6c48a","d5o/jK7XtDYJrUuqspYmoS@6c48a","64LTr1xshMlpl9zYWyJvmh","a9zBiCVbRJQoF5GhHeU54o@d707d","4dheLxdj5AzYx1mzUWVjAB","76vTZBIURPj4txJYMaCOpe","cb3+eBb7xABIeaBpMrroNk","1dIAWF7y9ErIAkZJlLCX4j@b5707","72jCNVVelPHY5bmtYhqJNx@71669","b9qZRKueRKtr5vqE8ZDYaW@1d92b","4figNAbrlE74lB9qi5QoNd@cca33","2bbgCO9BlDzLv5/8PbskL6@898a8","b3YBUdedxMkrkjAF5/319j","a6CB0/G2hGYZ/IiyFFRQOl@43d1f","deOQ7UIOtHaIfZQ+xqrIRF@e99e8","73sSgBUGpF2LqHpkgjdGpe@ebad6","e9yauzDbBJea1L4YKjKDFM@a8f6d","4fetvhm9ROr7UMO3fPvrxR","300JPlcqtIKJQ2NNL3jlIM","20g1ukYUVPvKWKBRznAKo+@6c48a","b8Ye30tvpLGrBg4LssYBe3@6c48a","fa1paFv4BL16Bx4KvbAekk@6c48a","a4DX6NluhH6Lzt9FSvoHd+@6c48a","2cZ5HCMJpGYoZf5PU1mEkn@6c48a","54TknWPwVPqJqeCR+Y/Czo@6c48a","c1C+B7twpDoowSxoMCaRcI@6c48a","10hvssTWNH7bzn5/Rlfdmk@6c48a","93EAONjepGVYZN1UyeIlOt@6c48a","7dj5uJT9FMn6OrOOx83tfK@6c48a","95EkngnxZFbYuFpsqVTaFr@6c48a","bcSxhDJqBPw7PBzoTxVyRu@6c48a","d6mV7UMrNP4qo+epgPDZ38@6c48a","21VE9mk9hEv6F9b9Pt//Wj@6c48a","daX+VsczNJHZdsIzUA5Yrq@59253","daX+VsczNJHZdsIzUA5Yrq@566ed","daX+VsczNJHZdsIzUA5Yrq@7cad6","307a3LinNA5plkeOTrmI7p","c0Ko1KoZlPJpcOZRRWxVO7","be20zJBQtJC6n7kHppr4RC","9fi+TetqdKEYojJtTgyPuz","389W2FzWJEFLFakw8nZy5u","39zwCYD4pLrZhZMS4HKpMU","97ab+bOdtNtJq+ZQQnJ6nR@eaff2","0fKewOSbNOsa7ZvQ/scQvg@cae0d","e7gxhl0aRKMI+K35Lahdfg@2d096","72H81TAtVNl4x0D9Fn9bkP@df195","d8qr8CLHdCw5F1fh6t1f5+@7a771","24S5yPBc1JjZ9mZNc5JyKU@2608a","c1yt9xUxBBOYyi3dJtlPpD@5e03c","02RMAnArhGJqMVWDwXBdUs@ec90f","bfiT7V+oJD1Jve/XPU8y4V@1524d","fcV4FNVI9DDIT/yjHAZZ8G@144aa","366ELjGN1CJ61ZaxvAw/0+@693f3","45yuiHcq9JMI60Ib9/w/lr@25a86","f7b4Jo+cRM04ZZ/Nt7MkUT@6eb45","59XGlWwY1HTJL79Xm1RYS7@9fc74","bahngGMydO8rVQzMYNNHVF@727a5","f9oOjTlhVJNZQWPesvPAaB@f49c7","6edc0yDIhAB6ESvB90pbTS@021fc","50pTtLV81BLLV7Dn7qFxEL","caUNvYgy5Dlpd42s0I/Vff","e2qpNBhANCWYQRKMejV6hv@b18e2","2cxfBl1IRJYaMthU/PiLNT","0arhv+xsRB+5YWajEV9ngn@59115","08eUIemvNBOqndFcat9jQs","c0ZRk24CFErZgo9aIvh4IW@3849c","9cgxYqc4RDhqgt3fVO5vag","464KoQARtB+JHP1Ad9/5j6@bb35a","72i6PZXlJAIYx9/iYZ9qGU","c1kPSOd81Ps5mXvqvk2iag@11ea4","daYoKq82dFyYKb54ZuNQ96","79x6rqM91BsqsMZvo+S4L9","28ekLW8VZJg4HIZUuCPCRh@3c464","4aDIqCb2hLxoLduPEg8tDE","a2hXW4vgRMAZTjBYA691fv@b18cc","b6CkPvnnpKt4glUz1OwTx3","13y4XsnYRBkqHdmGIjRVdS","f41yIn7yxA9I0tHjirwelB","757r9/0BtNMrQFW75f0EuZ","41XpdbIURK5rVw9rEqIOnt","e5jeomwg1JfaZ+n7uSWSLM@f633f","acjVh8MXVLa7tMgwXmsB/F","d3JugtPsdCY5hF2d9b4R4W@96d52","8d6RiqZ1VNM5dr+wpDTJPw","03nJ3ii+5FmI/mF/3xlRa2","eajyIAvWFF5JuxINvxNuoc@49ac4","a8T3sbSzROm63/BjjbCZL5","b2V85VrMhF+LYGYUrocfGx@6ee8a","a4M3AFTZJAhreCurUzPfsK","88m9u6yYdHLbSNeB6GzKik","01ISK+g11NIIDDvjDF/zJv@055fc","15d/thedhL7Y4/Q5EFDWl7","a6BQ7SyDtFyZxULe9y8cnp","11OXPWwn1B/oJhHE88dCEP","66JbhhFMZO54P2RuHqk0GW","eb596dO9VPjbUZ24MafgCO","62bNq7WFxNYLWD5QZLrIvG","b7lGbPvM1JurxE9Chsi0RD@8e79e","93jfEVJKNN9qImen7kJio2","705yRFSctJRYjxZF1IFha5@20229","4eQc7+nf1I06z1fDNYS1cJ@c5bf8","b2Hi5c4/dKy5XSlA0HNMSw@f5dba","86qY5BoeBN6qWJFkfZy4JY@bcb92","b60i3gzjFGiZEUxxIVGPsq@4ae60","cbqnJvYzNKDaXJ8Fqq4RlW@8d53a","b5wvZRa49GMrNJF5qBtF+C@1a23a","51Bq2PjdVAGqubo27seksl@37640","4cNygRBgJFzrXz7rgl1Q0D","e79iopqJ9Forf3wJc3975u@d4ba8","20tzdSQDNK3KlLLVISPAEe","e5SXdvE11HBKEfOD2M2QW4","5c4TvmVxhHSJgheViQduRv","2c00UkAHhACKSbymhcxYM2@6c48a","249HVCnc5FmYBqg1bP1WIi@f9941","3d11+l6S1BcKcDn2CHrGEB@f9941","b9oGSMZtVOO609Bnmgw0Qg","c743z9lKJKsqRfs0GshLOY","aeOl04Lo5PvLadrmthXmCg","08Ou9M0BdOwJtLzLyDSmdd@6c48a","44MB59GvZEapjzea5He1QD@6c48a","f7qzUQJ/5DkrghV6/fhEvV@6c48a","d9bRU68h1Bf7yAK7qH/5b6@6c48a"],["node","_mesh","_effectAsset","mainTexture","emissiveMap","_parent","_spriteFrame","_clip","_normalSprite","_textureSource","_defaultClip","_hoverSprite","_pressedSprite","_disabledSprite","root","data","node_pipes","node_tasks","node_events","node_bodys","node_cameraMeeting","node_cctvs","node_playrs","doorClip","clip","_cameraComponent","player","bg","DITU","camera","btn_loadJson","btn_gameMode","btn_reset","btn_json","scene","blockPb","bgBlock","mapPre"],[["cc.Node",["_name","_active","_layer","_id","_objFlags","_parent","_prefab","_lpos","_components","_euler","_lrot","_children","_lscale"],-2,1,4,5,9,5,5,2,5],"cc.SpriteFrame",["cc.ModelLightmapSettings",["_lightmapSize","uvParam"],2,5],["cc.Camera",["_visibility","_clearFlags","_name","_projection","_priority","_orthoHeight","_far","node","__prefab","_color"],-4,1,4,5],["cc.Sprite",["_sizeMode","_type","_enabled","node","_spriteFrame","__prefab","_color"],0,1,6,4,5],["cc.Material",["_states","_defines","_techIdx","_name","_props"],-1,12],["cc.Node",["_name","_objFlags","_parent","_prefab","_components","_lpos","_children","_lrot","_euler"],1,1,4,2,5,12,5,5],["cc.Animation",["playOnLoad","node","__prefab","_clips","_defaultClip"],2,1,4,3,6],["5924c/YrHxDE54jLIjcwNjj",["tipsId","isKillerVisible","node","__prefab"],1,1,4],["cc.UITransform",["node","_contentSize","_anchorPoint","__prefab"],3,1,5,5,4],["cc.PrefabInfo",["fileId","root","asset"],2,1,1],["cc.BoxCollider",["node","__prefab","_size"],3,1,4,5],["76d34GadZpAlIF49Q6GxHid",["soundDistance","soundLoop","node","__prefab"],1,1,4],["cc.AudioSource",["_loop","_playOnAwake","_volume","node","__prefab","_clip"],0,1,4,6],["cc.MeshRenderer",["_shadowCastingMode","node","__prefab","_materials","lightmapSettings","_mesh"],2,1,4,3,4,6],["cc.Button",["_transition","node","__prefab","_normalSprite","_normalColor","_target"],2,1,4,6,5,1],["cc.Widget",["_alignFlags","_left","node"],1,1],["cc.Mesh",["_native","_hash","_struct"],1,11],["cc.EffectAsset",["_name","shaders","techniques"],0],["cc.AudioClip",["_name","_native","_duration"],0],["cc.Prefab",["_name"],2],["cc.Node",["_name","_layer","_parent","_children","_components","_lpos"],1,1,2,12,5],["0745dxIetVHbo0qlRpuKwhQ",["node","__prefab","node_playrs","node_cctvs","node_cameraMeeting","node_bodys","node_events","node_tasks","node_pipes","doorClip"],3,1,4,1,1,1,1,1,1,1,6],["cc.CompPrefabInfo",["fileId"],2],["f2b45oJwa5JPZt99EHkbXPR",["loop","node","__prefab","clip"],2,1,4,6],["fbff3jdCehJHapaOcaFN5nO",["node","__prefab"],3,1,4],["cc.RigidBody",["_group","_type","node","__prefab"],1,1,4],["43969HJJzpKbZ9rd2jnjuXU",["eventId","node","__prefab"],2,1,4],["c9798b9F1FB1Lp5+PdKO6OY",["areaId","stepSfxId","node","__prefab"],1,1,4],["ab0acY/aa9A86HH2PC+GflZ",["pipelineId","node","__prefab"],2,1,4],["ba8b7DGqEdEa4S6zCBUhVOY",["taskId","node","__prefab"],2,1,4],["0bcb0HMrshPM65EctJLhkB/",["node","__prefab"],3,1,4],["cc.SceneAsset",["_name"],2],["cc.Canvas",["node","_cameraComponent"],3,1,1],["019b2Fp94NHe5Q9K0ZTDMG0",["node","btn_json","btn_reset","btn_gameMode","btn_loadJson","camera","DITU","bg","player","blockPb","bgBlock","mapPre"],3,1,1,1,1,1,1,1,1,1,6,6,6],["cc.Scene",["_name","_children","_prefab","_globals"],2,2,4,4],["cc.SceneGlobals",["ambient","shadows","_skybox","fog","octree"],3,4,4,4,4,4],["cc.AmbientInfo",["_skyIllumLDR","_skyColorHDR","_skyColorLDR"],2,5,5],["cc.ShadowsInfo",["_shadowColor"],3,5],["cc.SkyboxInfo",[],3],["cc.FogInfo",["_fogColor"],3,5],["cc.OctreeInfo",[],3],["cc.Label",["_string","_actualFontSize","_fontSize","node","_color"],0,1,5],["cc.DirectionalLight",["_shadowSaturation","node","_staticSettings"],2,1,4],["cc.StaticLightSettings",[],3]],[[23,0,2],[10,0,1,2,2],[2,0,1,2],[0,0,5,8,6,7,10,12,9,2],[14,0,1,2,3,4,5,2],[14,1,2,3,4,5,1],[0,0,5,8,6,7,12,2],[17,0,1,2,3],[26,0,1,2,3,3],[11,0,1,2,1],[5,0,1,4,3],[0,0,5,8,6,7,10,9,2],[2,1],[30,0,1,2,2],[7,1,2,3,1],[0,0,5,11,8,6,7,2],[2,1,1],[0,0,5,11,8,6,7,10,9,2],[0,0,1,5,8,6,7,10,9,3],[28,0,1,2,3,3],[29,0,1,2,2],[3,1,0,7,8,3],[9,0,1,1],[0,0,1,5,8,6,7,10,12,9,3],[0,0,5,8,6,7,2],[2,0,2],[0,0,11,6,7,2],[19,0,1,2,4],[0,0,5,11,6,2],[0,0,5,11,6,7,2],[11,0,1,1],[0,0,2,5,8,3],[21,0,1,2,3,4,5,3],[8,0,1,2,3,3],[4,1,0,3,4,3],[15,0,1,4,5,2],[16,0,1,2,3],[42,0,1,2,3,4,4],[20,0,2],[7,0,1,2,3,4,2],[12,0,1,2,3,3],[13,0,1,2,3,4,5,4],[9,0,1,2,1],[5,3,0,1,4,4],[18,0,1,2,4],[0,0,5,6,7,2],[0,0,1,5,11,6,7,3],[0,0,5,11,8,6,7,10,12,9,2],[0,0,5,8,6,10,9,2],[0,0,2,8,6,7,3],[0,0,2,5,8,7,10,9,3],[6,0,1,2,6,3,3],[27,0,1,2,2],[12,0,2,3,2],[13,0,1,3,4,5,3],[8,0,2,3,2],[9,0,3,1,2,1],[4,0,3,5,6,4,2],[5,2,0,1,4,4],[0,0,11,8,6,2],[0,0,5,6,7,12,2],[0,0,1,5,6,7,3],[0,0,5,11,6,7,12,2],[0,0,5,11,6,7,10,9,2],[0,0,5,11,8,6,7,12,2],[0,0,5,8,6,10,12,9,2],[0,0,5,8,6,7,9,2],[0,0,5,6,2],[0,0,4,5,6,3],[0,0,4,3,11,8,7,4],[0,0,5,8,7,10,9,2],[0,0,3,5,8,10,9,3],[0,0,3,5,8,7,10,9,3],[6,0,2,4,3,5,7,8,2],[6,0,2,4,5,2],[22,0,1,2,3,4,5,6,7,8,9,1],[24,0,1,2,3,2],[10,0,2],[7,1,2,3,4,1],[25,0,1,1],[8,2,3,1],[3,2,0,7,8,9,3],[3,3,4,5,6,1,0,9,7],[3,0,7,2],[4,2,0,3,4,3],[4,0,3,4,2],[15,1,2,3,1],[31,0,1,1],[32,0,2],[33,0,1,1],[16,0,2,2],[34,0,1,2,3,4,5,6,7,8,9,10,11,1],[35,0,1,2,3,2],[36,0,1,2,3,4,1],[37,0,1,2,2],[38,0,1],[39,1],[40,0,1],[41,1],[43,0,1,2,2],[44,1]],[[[[7,".bin",2681983573,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":10640,"length":1260,"count":315,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":10640,"count":190,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.5241674780845642,-1.4343249797821045,0.007359313778579235],"maxPosition",8,[1,0.5241675972938538,1.4343252182006836,2.4954395294189453]]],-1],0,0,[],[],[]],[[[7,".bin",2505866208,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":19376,"length":4896,"count":1224,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":19376,"count":346,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.03452049195766449,-0.2096063196659088,-0.21005553007125854],"maxPosition",8,[1,1.3253358602523804,1.3885505199432373,0.21005550026893616]]],-1],0,0,[],[],[]],[[[7,".bin",1443497683,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":5880,"length":636,"count":159,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":5880,"count":105,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.01934608444571495,-0.019512176513671875,0.0000035815685350826243],"maxPosition",8,[1,0.01934608444571495,0.019512176513671875,0.11159774661064148]]],-1],0,0,[],[],[]],[[[7,".bin",815861722,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":2240,"length":576,"count":144,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":2240,"count":40,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.008121108636260033,-0.008121337741613388,-0.00008837699715513736],"maxPosition",8,[1,0.008121108636260033,0.008120880462229252,0.033443860709667206]]],-1],0,0,[],[],[]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true,"USE_EMISSIVE_MAP":true},{"USE_INSTANCING":true},{},{},{}],[[[{"roughness":1,"metallic":0},"mainTexture",6,0,"emissiveMap",6,1],[{},"rimColor",8,[4,4280414714],"outlineParams",8,[2,10,0.1,0.1,1]],{},{},{}],11,11,0,0,0]]],0,0,[0,0,0],[3,4,2],[17,17,11]],[[[7,".bin",1750253217,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":4872,"length":504,"count":126,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":4872,"count":87,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.12458434700965881,-0.1372007429599762,-0.007676410488784313],"maxPosition",8,[1,0.12458313256502151,0.13720069825649261,0.044263992458581924]]],-1],0,0,[],[],[]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true,"USE_EMISSIVE_MAP":true},{"USE_INSTANCING":true},{},{},{}],[[[{"roughness":1,"metallic":0},"emissive",8,[4,4279966491],"mainTexture",6,0,"emissiveMap",6,1],[{},"rimColor",8,[4,4280414714],"outlineParams",8,[2,10,0.1,1,1]],{},{},{}],11,11,0,0,0]]],0,0,[0,0,0],[3,4,2],[48,57,11]],[[[7,".bin",498990447,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":8288,"length":1176,"count":294,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":8288,"count":148,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.5618792772293091,-0.05448196455836296,-0.3628566265106201],"maxPosition",8,[1,0.561875581741333,0.0004974365001544356,0.3628566861152649]]],-1],0,0,[],[],[]],[[[7,".bin",1264257172,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":14000,"length":4608,"count":1152,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":14000,"count":250,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.09094726294279099,-0.14725860953330994,-0.0001619792019482702],"maxPosition",8,[1,0.090947225689888,0.14725860953330994,0.042152050882577896]]],-1],0,0,[],[],[]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{},{}],[{"USE_INSTANCING":true},{"USE_INSTANCING":true},{},{},{}],[[[{"roughness":1,"metallic":0},"mainColor",8,[4,4280230693]],[{},"rimColor",8,[4,4280414714],"outlineParams",8,[2,10,0.1,0.1,1]],{},{},{}],11,11,0,0,0]]],0,0,[0],[2],[11]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true,"USE_EMISSIVE_MAP":true},{},{}],[[[{"roughness":1,"metallic":0},"emissive",8,[4,4285558896],"mainTexture",6,0,"emissiveMap",6,1],{},{}],11,0,0]]],0,0,[0,0,0],[3,4,2],[29,29,12]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{},{}],[{"USE_INSTANCING":true},{"USE_INSTANCING":true},{},{},{}],[[[{"roughness":1,"metallic":0},"mainColor",8,[4,4280230693]],[{},"rimColor",8,[4,4280414714],"outlineParams",8,[2,10,0.1,0.1,1]],{},{},{}],11,11,0,0,0]]],0,0,[0],[2],[11]],[[[7,".bin",877207896,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":45024,"length":7920,"count":1980,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":45024,"count":804,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.7154687643051147,-6.281406402587891,0.00021636963356286287],"maxPosition",8,[1,2.959456205368042,0.7164990305900574,1.5143972635269165]]],-1],0,0,[],[],[]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true,"USE_EMISSIVE_MAP":true},{"USE_INSTANCING":true},{},{},{}],[[[{"roughness":1,"metallic":0},"emissive",8,[4,4285558896],"mainTexture",6,0,"emissiveMap",6,1],[{},"rimColor",8,[4,4280414714],"outlineParams",8,[2,10,0.1,0.1,1]],{},{},{}],11,11,0,0,0]]],0,0,[0,0,0],[3,4,2],[29,29,11]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{},{}],[{"USE_INSTANCING":true},{},{},{}],[[[{"roughness":1,"metallic":0},"mainColor",8,[4,4293781978]],{},{},{}],11,0,0,0]]],0,0,[0],[2],[12]],[[[44,"builtin-standard",[{"hash":4079105024,"name":"builtin-standard|standard-vs|standard-fs","blocks":[{"name":"Constants","stageFlags":17,"binding":0,"members":[{"name":"tilingOffset","type":16,"count":1},{"name":"albedo","type":16,"count":1},{"name":"albedoScaleAndCutoff","type":16,"count":1},{"name":"pbrParams","type":16,"count":1},{"name":"emissive","type":16,"count":1},{"name":"emissiveScaleParam","type":16,"count":1}],"defines":[]}],"samplerTextures":[{"name":"albedoMap","type":28,"count":1,"stageFlags":16,"binding":1,"defines":["USE_ALBEDO_MAP"]},{"name":"normalMap","type":28,"count":1,"stageFlags":16,"binding":2,"defines":["USE_NORMAL_MAP"]},{"name":"pbrMap","type":28,"count":1,"stageFlags":16,"binding":3,"defines":["USE_PBR_MAP"]},{"name":"metallicRoughnessMap","type":28,"count":1,"stageFlags":16,"binding":4,"defines":["USE_METALLIC_ROUGHNESS_MAP"]},{"name":"occlusionMap","type":28,"count":1,"stageFlags":16,"binding":5,"defines":["USE_OCCLUSION_MAP"]},{"name":"emissiveMap","type":28,"count":1,"stageFlags":16,"binding":6,"defines":["USE_EMISSIVE_MAP"]}],"samplers":[],"textures":[],"buffers":[{"name":"b_ccLightsBuffer","memoryAccess":1,"stageFlags":16,"binding":7,"defines":["CC_FORWARD_ADD","CC_ENABLE_CLUSTERED_LIGHT_CULLING"]},{"name":"b_clusterLightIndicesBuffer","memoryAccess":1,"stageFlags":16,"binding":8,"defines":["CC_FORWARD_ADD","CC_ENABLE_CLUSTERED_LIGHT_CULLING"]},{"name":"b_clusterLightGridBuffer","memoryAccess":1,"stageFlags":16,"binding":9,"defines":["CC_FORWARD_ADD","CC_ENABLE_CLUSTERED_LIGHT_CULLING"]}],"images":[],"subpassInputs":[],"attributes":[{"name":"a_position","format":32,"location":0,"defines":[]},{"name":"a_normal","format":32,"location":1,"defines":[]},{"name":"a_texCoord","format":21,"location":2,"defines":[]},{"name":"a_tangent","format":44,"location":3,"defines":[]},{"name":"a_joints","location":4,"defines":["CC_USE_SKINNING"]},{"name":"a_weights","format":44,"location":5,"defines":["CC_USE_SKINNING"]},{"name":"a_jointAnimInfo","format":44,"isInstanced":true,"location":6,"defines":["USE_INSTANCING","CC_USE_BAKED_ANIMATION"]},{"name":"a_matWorld0","format":44,"isInstanced":true,"location":7,"defines":["USE_INSTANCING"]},{"name":"a_matWorld1","format":44,"isInstanced":true,"location":8,"defines":["USE_INSTANCING"]},{"name":"a_matWorld2","format":44,"isInstanced":true,"location":9,"defines":["USE_INSTANCING"]},{"name":"a_lightingMapUVParam","format":44,"isInstanced":true,"location":10,"defines":["USE_INSTANCING","CC_USE_LIGHTMAP"]},{"name":"a_localShadowBias","format":21,"isInstanced":true,"location":11,"defines":["USE_INSTANCING","CC_RECEIVE_SHADOW"]},{"name":"a_dyn_batch_id","format":11,"location":12,"defines":["!USE_INSTANCING","USE_BATCHING"]},{"name":"a_vertexId","format":11,"location":13,"defines":["CC_USE_MORPH"]},{"name":"a_color","format":44,"location":14,"defines":["USE_VERTEX_COLOR"]},{"name":"a_texCoord1","format":21,"location":15,"defines":[]}],"varyings":[{"name":"v_fog_factor","type":13,"count":1,"stageFlags":17,"location":0,"defines":["!CC_USE_ACCURATE_FOG"]},{"name":"v_shadowPos","type":16,"count":1,"stageFlags":17,"location":1,"defines":[]},{"name":"v_color","type":16,"count":1,"stageFlags":17,"location":2,"defines":["USE_VERTEX_COLOR"]},{"name":"v_position","type":15,"count":1,"stageFlags":17,"location":3,"defines":[]},{"name":"v_normal","type":15,"count":1,"stageFlags":17,"location":4,"defines":[]},{"name":"v_uv","type":14,"count":1,"stageFlags":17,"location":5,"defines":[]},{"name":"v_uv1","type":14,"count":1,"stageFlags":17,"location":6,"defines":["HAS_SECOND_UV"]},{"name":"v_shadowBias","type":14,"count":1,"stageFlags":17,"location":7,"defines":["CC_RECEIVE_SHADOW"]},{"name":"v_tangent","type":16,"count":1,"stageFlags":17,"location":8,"defines":["USE_NORMAL_MAP"]},{"name":"v_luv","type":15,"count":1,"stageFlags":17,"location":9,"defines":["CC_USE_LIGHTMAP","!USE_BATCHING","!CC_FORWARD_ADD"]}],"fragColors":[{"name":"fragColorX","typename":"vec4","type":16,"count":1,"stageFlags":16,"location":0,"defines":["CC_FORWARD_ADD"]},{"name":"fragColor0","typename":"vec4","type":16,"count":1,"stageFlags":16,"location":1,"defines":["!CC_FORWARD_ADD","CC_PIPELINE_TYPE"]},{"name":"fragColor1","typename":"vec4","type":16,"count":1,"stageFlags":16,"location":2,"defines":["!CC_FORWARD_ADD","CC_PIPELINE_TYPE"]},{"name":"fragColor2","typename":"vec4","type":16,"count":1,"stageFlags":16,"location":3,"defines":["!CC_FORWARD_ADD","CC_PIPELINE_TYPE"]}],"glsl4":{"vert":"#extension GL_EXT_shader_explicit_arithmetic_types_int32: require\nprecision highp float;\n#define QUATER_PI         0.78539816340\n#define HALF_PI           1.57079632679\n#define PI                3.14159265359\n#define PI2               6.28318530718\n#define PI4               12.5663706144\n#define INV_QUATER_PI     1.27323954474\n#define INV_HALF_PI       0.63661977237\n#define INV_PI            0.31830988618\n#define INV_PI2           0.15915494309\n#define INV_PI4           0.07957747155\n#define EPSILON           1e-6\n#define EPSILON_LOWP      1e-4\n#define LOG2              1.442695\n#define EXP_VALUE         2.71828183f\n#define FP_MAX            65504.0\n#define FP_SCALE          0.0009765625\n#define FP_SCALE_INV      1024.0\n#define GRAY_VECTOR       vec3(0.299, 0.587, 0.114)\nhighp float decode32 (highp vec4 rgba) {\n  rgba = rgba * 255.0;\n  highp float Sign = 1.0 - (step(128.0, (rgba[3]) + 0.5)) * 2.0;\n  highp float Exponent = 2.0 * (mod(float(int((rgba[3]) + 0.5)), 128.0)) + (step(128.0, (rgba[2]) + 0.5)) - 127.0;\n  highp float Mantissa = (mod(float(int((rgba[2]) + 0.5)), 128.0)) * 65536.0 + rgba[1] * 256.0 + rgba[0] + 8388608.0;\n  return Sign * exp2(Exponent - 23.0) * Mantissa;\n}\nstruct StandardVertInput {\n  highp vec4 position;\n  vec3 normal;\n  vec4 tangent;\n};\nlayout(location = 0) in vec3 a_position;\nlayout(location = 1) in vec3 a_normal;\nlayout(location = 2) in vec2 a_texCoord;\nlayout(location = 3) in vec4 a_tangent;\n#if CC_USE_SKINNING\n    layout(location = 4) in u32vec4 a_joints;\n  layout(location = 5) in vec4 a_weights;\n#endif\n#if USE_INSTANCING\n  #if CC_USE_BAKED_ANIMATION\n    layout(location = 6) in highp vec4 a_jointAnimInfo;\n  #endif\n  layout(location = 7) in vec4 a_matWorld0;\n  layout(location = 8) in vec4 a_matWorld1;\n  layout(location = 9) in vec4 a_matWorld2;\n  #if CC_USE_LIGHTMAP\n    layout(location = 10) in vec4 a_lightingMapUVParam;\n  #endif\n  #if CC_RECEIVE_SHADOW\n    layout(location = 11) in vec2 a_localShadowBias;\n  #endif\n#elif USE_BATCHING\n  layout(location = 12) in float a_dyn_batch_id;\n#endif\n#if CC_USE_MORPH\n    int getVertexId() {\n      return gl_VertexIndex;\n    }\n#endif\n#if CC_USE_MORPH\n  layout(set = 2, binding = 4) uniform CCMorph {\n    vec4 cc_displacementWeights[15];\n    vec4 cc_displacementTextureInfo;\n  };\n  vec2 getPixelLocation(vec2 textureResolution, int pixelIndex) {\n    float pixelIndexF = float(pixelIndex);\n    float x = mod(pixelIndexF, textureResolution.x);\n    float y = floor(pixelIndexF / textureResolution.x);\n    return vec2(x, y);\n  }\n  vec2 getPixelCoordFromLocation(vec2 location, vec2 textureResolution) {\n    return (vec2(location.x, location.y) + .5) / textureResolution;\n  }\n  #if CC_DEVICE_SUPPORT_FLOAT_TEXTURE\n      vec4 fetchVec3ArrayFromTexture(sampler2D tex, int pixelIndex) {\n        ivec2 texSize = textureSize(tex, 0);\n        return texelFetch(tex, ivec2(pixelIndex % texSize.x, pixelIndex / texSize.x), 0);\n      }\n  #else\n    vec4 fetchVec3ArrayFromTexture(sampler2D tex, int elementIndex) {\n      int pixelIndex = elementIndex * 4;\n      vec2 location = getPixelLocation(cc_displacementTextureInfo.xy, pixelIndex);\n      vec2 x = getPixelCoordFromLocation(location + vec2(0.0, 0.0), cc_displacementTextureInfo.xy);\n      vec2 y = getPixelCoordFromLocation(location + vec2(1.0, 0.0), cc_displacementTextureInfo.xy);\n      vec2 z = getPixelCoordFromLocation(location + vec2(2.0, 0.0), cc_displacementTextureInfo.xy);\n      return vec4(\n        decode32(texture(tex, x)),\n        decode32(texture(tex, y)),\n        decode32(texture(tex, z)),\n        1.0\n      );\n    }\n  #endif\n  float getDisplacementWeight(int index) {\n    int quot = index / 4;\n    int remainder = index - quot * 4;\n    if (remainder == 0) {\n      return cc_displacementWeights[quot].x;\n    } else if (remainder == 1) {\n      return cc_displacementWeights[quot].y;\n    } else if (remainder == 2) {\n      return cc_displacementWeights[quot].z;\n    } else {\n      return cc_displacementWeights[quot].w;\n    }\n  }\n  vec3 getVec3DisplacementFromTexture(sampler2D tex, int vertexIndex) {\n  #if CC_MORPH_PRECOMPUTED\n    return fetchVec3ArrayFromTexture(tex, vertexIndex).rgb;\n  #else\n    vec3 result = vec3(0, 0, 0);\n    int nVertices = int(cc_displacementTextureInfo.z);\n    for (int iTarget = 0; iTarget < CC_MORPH_TARGET_COUNT; ++iTarget) {\n      result += (fetchVec3ArrayFromTexture(tex, nVertices * iTarget + vertexIndex).rgb * getDisplacementWeight(iTarget));\n    }\n    return result;\n  #endif\n  }\n  #if CC_MORPH_TARGET_HAS_POSITION\n    layout(set = 2, binding = 7) uniform sampler2D cc_PositionDisplacements;\n    vec3 getPositionDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_PositionDisplacements, vertexId);\n    }\n  #endif\n  #if CC_MORPH_TARGET_HAS_NORMAL\n    layout(set = 2, binding = 8) uniform sampler2D cc_NormalDisplacements;\n    vec3 getNormalDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_NormalDisplacements, vertexId);\n    }\n  #endif\n  #if CC_MORPH_TARGET_HAS_TANGENT\n    layout(set = 2, binding = 9) uniform sampler2D cc_TangentDisplacements;\n    vec3 getTangentDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_TangentDisplacements, vertexId);\n    }\n  #endif\n  void applyMorph (inout vec4 position, inout vec3 normal, inout vec4 tangent) {\n    int vertexId = getVertexId();\n  #if CC_MORPH_TARGET_HAS_POSITION\n    position.xyz = position.xyz + getPositionDisplacement(vertexId);\n  #endif\n  #if CC_MORPH_TARGET_HAS_NORMAL\n    normal.xyz = normal.xyz + getNormalDisplacement(vertexId);\n  #endif\n  #if CC_MORPH_TARGET_HAS_TANGENT\n    tangent.xyz = tangent.xyz + getTangentDisplacement(vertexId);\n  #endif\n  }\n  void applyMorph (inout vec4 position) {\n  #if CC_MORPH_TARGET_HAS_POSITION\n    position.xyz = position.xyz + getPositionDisplacement(getVertexId());\n  #endif\n  }\n#endif\n#if CC_USE_SKINNING\n  #if CC_USE_BAKED_ANIMATION\n    layout(set = 2, binding = 3) uniform CCSkinningTexture {\n      highp vec4 cc_jointTextureInfo;\n    };\n    layout(set = 2, binding = 2) uniform CCSkinningAnimation {\n      highp vec4 cc_jointAnimInfo;\n    };\n    layout(set = 2, binding = 6) uniform highp sampler2D cc_jointTexture;\n    void CCGetJointTextureCoords(float pixelsPerJoint, float jointIdx, out highp float x, out highp float y, out highp float invSize)\n    {\n      #if USE_INSTANCING\n        highp float temp = pixelsPerJoint * (a_jointAnimInfo.x * a_jointAnimInfo.y + jointIdx) + a_jointAnimInfo.z;\n      #else\n        highp float temp = pixelsPerJoint * (cc_jointAnimInfo.x * cc_jointTextureInfo.y + jointIdx) + cc_jointTextureInfo.z;\n      #endif\n      invSize = cc_jointTextureInfo.w;\n      highp float tempY = floor(temp * invSize);\n      x = floor(temp - tempY * cc_jointTextureInfo.x);\n      y = (tempY + 0.5) * invSize;\n    }\n  #else\n    layout(set = 2, binding = 3) uniform CCSkinning {\n      highp vec4 cc_joints[30 * 3];\n    };\n  #endif\n  #if CC_USE_BAKED_ANIMATION\n    #if CC_DEVICE_SUPPORT_FLOAT_TEXTURE\n      mat4 getJointMatrix (float i) {\n        highp float x, y, invSize;\n        CCGetJointTextureCoords(3.0, i, x, y, invSize);\n        vec4 v1 = texture(cc_jointTexture, vec2((x + 0.5) * invSize, y));\n        vec4 v2 = texture(cc_jointTexture, vec2((x + 1.5) * invSize, y));\n        vec4 v3 = texture(cc_jointTexture, vec2((x + 2.5) * invSize, y));\n        return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n      }\n    #else\n      mat4 getJointMatrix (float i) {\n        highp float x, y, invSize;\n        CCGetJointTextureCoords(12.0, i, x, y, invSize);\n        vec4 v1 = vec4(\n          decode32(texture(cc_jointTexture, vec2((x + 0.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 1.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 2.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 3.5) * invSize, y)))\n        );\n        vec4 v2 = vec4(\n          decode32(texture(cc_jointTexture, vec2((x + 4.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 5.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 6.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 7.5) * invSize, y)))\n        );\n        vec4 v3 = vec4(\n          decode32(texture(cc_jointTexture, vec2((x + 8.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 9.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 10.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 11.5) * invSize, y)))\n        );\n        return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n      }\n    #endif\n  #else\n    mat4 getJointMatrix (float i) {\n      int idx = int(i);\n      vec4 v1 = cc_joints[idx * 3];\n      vec4 v2 = cc_joints[idx * 3 + 1];\n      vec4 v3 = cc_joints[idx * 3 + 2];\n      return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n    }\n  #endif\n  mat4 skinMatrix () {\n    vec4 joints = vec4(a_joints);\n    return getJointMatrix(joints.x) * a_weights.x\n         + getJointMatrix(joints.y) * a_weights.y\n         + getJointMatrix(joints.z) * a_weights.z\n         + getJointMatrix(joints.w) * a_weights.w;\n  }\n  void CCSkin (inout vec4 position) {\n    mat4 m = skinMatrix();\n    position = m * position;\n  }\n  void CCSkin (inout vec4 position, inout vec3 normal, inout vec4 tangent) {\n    mat4 m = skinMatrix();\n    position = m * position;\n    normal = (m * vec4(normal, 0.0)).xyz;\n    tangent.xyz = (m * vec4(tangent.xyz, 0.0)).xyz;\n  }\n#endif\nvoid CCVertInput(inout StandardVertInput In)\n{\n    In.position = vec4(a_position, 1.0);\n    In.normal = a_normal;\n    In.tangent = a_tangent;\n  #if CC_USE_MORPH\n    applyMorph(In.position, In.normal, In.tangent);\n  #endif\n  #if CC_USE_SKINNING\n    CCSkin(In.position, In.normal, In.tangent);\n  #endif\n}\nlayout(set = 0, binding = 0) uniform CCGlobal {\n  highp   vec4 cc_time;\n  mediump vec4 cc_screenSize;\n  mediump vec4 cc_nativeSize;\n};\nlayout(set = 0, binding = 1) uniform CCCamera {\n  highp   mat4 cc_matView;\n  highp   mat4 cc_matViewInv;\n  highp   mat4 cc_matProj;\n  highp   mat4 cc_matProjInv;\n  highp   mat4 cc_matViewProj;\n  highp   mat4 cc_matViewProjInv;\n  highp   vec4 cc_cameraPos;\n  mediump vec4 cc_screenScale;\n  mediump vec4 cc_exposure;\n  mediump vec4 cc_mainLitDir;\n  mediump vec4 cc_mainLitColor;\n  mediump vec4 cc_ambientSky;\n  mediump vec4 cc_ambientGround;\n  mediump vec4 cc_fogColor;\n  mediump vec4 cc_fogBase;\n  mediump vec4 cc_fogAdd;\n  mediump vec4 cc_nearFar;\n  mediump vec4 cc_viewPort;\n};\n#if !USE_INSTANCING\n  #if USE_BATCHING\n    layout(set = 2, binding = 0) uniform CCLocalBatched {\n      highp mat4 cc_matWorlds[10];\n    };\n  #else\n    layout(set = 2, binding = 0) uniform CCLocal {\n      highp mat4 cc_matWorld;\n      highp mat4 cc_matWorldIT;\n      highp vec4 cc_lightingMapUVParam;\n      highp vec4 cc_localShadowBias;\n    };\n  #endif\n#endif\nvoid CCGetWorldMatrixFull(out mat4 matWorld, out mat4 matWorldIT)\n{\n  #if USE_INSTANCING\n    matWorld = mat4(\n      vec4(a_matWorld0.xyz, 0.0),\n      vec4(a_matWorld1.xyz, 0.0),\n      vec4(a_matWorld2.xyz, 0.0),\n      vec4(a_matWorld0.w, a_matWorld1.w, a_matWorld2.w, 1.0)\n    );\n    matWorldIT = matWorld;\n  #elif USE_BATCHING\n    matWorld = cc_matWorlds[int(a_dyn_batch_id)];\n    matWorldIT = matWorld;\n  #else\n    matWorld = cc_matWorld;\n    matWorldIT = cc_matWorldIT;\n  #endif\n}\nlayout(set = 1, binding = 0) uniform Constants {\n  vec4 tilingOffset;\n  vec4 albedo;\n  vec4 albedoScaleAndCutoff;\n  vec4 pbrParams;\n  vec4 emissive;\n  vec4 emissiveScaleParam;\n};\nfloat LinearFog(vec4 pos) {\n  vec4 wPos = pos;\n  float cam_dis = distance(cc_cameraPos, wPos);\n  float fogStart = cc_fogBase.x;\n  float fogEnd = cc_fogBase.y;\n  return clamp((fogEnd - cam_dis) / (fogEnd - fogStart), 0., 1.);\n}\nfloat ExpFog(vec4 pos) {\n  vec4 wPos = pos;\n  float fogAtten = cc_fogAdd.z;\n  float fogStart = cc_fogBase.x;\n  float fogDensity = cc_fogBase.z;\n  float cam_dis = max(distance(cc_cameraPos, wPos) - fogStart, 0.0) / fogAtten * 4.;\n  float f = exp(-cam_dis * fogDensity);\n  return f;\n}\nfloat ExpSquaredFog(vec4 pos) {\n  vec4 wPos = pos;\n  float fogAtten = cc_fogAdd.z;\n  float fogStart = cc_fogBase.x;\n  float fogDensity = cc_fogBase.z;\n  float cam_dis = max(distance(cc_cameraPos, wPos) - fogStart, 0.0) / fogAtten * 4.;\n  float f = exp(-cam_dis * cam_dis * fogDensity * fogDensity);\n  return f;\n}\nfloat LayeredFog(vec4 pos) {\n  vec4 wPos = pos;\n  float fogAtten = cc_fogAdd.z;\n  float _FogTop = cc_fogAdd.x;\n  float _FogRange = cc_fogAdd.y;\n  vec3 camWorldProj = cc_cameraPos.xyz;\n  camWorldProj.y = 0.;\n  vec3 worldPosProj = wPos.xyz;\n  worldPosProj.y = 0.;\n  float fDeltaD = distance(worldPosProj, camWorldProj) / fogAtten * 2.0;\n  float fDeltaY, fDensityIntegral;\n  if (cc_cameraPos.y > _FogTop) {\n    if (wPos.y < _FogTop) {\n      fDeltaY = (_FogTop - wPos.y) / _FogRange * 2.0;\n      fDensityIntegral = fDeltaY * fDeltaY * 0.5;\n    } else {\n      fDeltaY = 0.;\n      fDensityIntegral = 0.;\n    }\n  } else {\n    if (wPos.y < _FogTop) {\n      float fDeltaA = (_FogTop - cc_cameraPos.y) / _FogRange * 2.;\n      float fDeltaB = (_FogTop - wPos.y) / _FogRange * 2.;\n      fDeltaY = abs(fDeltaA - fDeltaB);\n      fDensityIntegral = abs((fDeltaA * fDeltaA * 0.5) - (fDeltaB * fDeltaB * 0.5));\n    } else {\n      fDeltaY = abs(_FogTop - cc_cameraPos.y) / _FogRange * 2.;\n      fDensityIntegral = abs(fDeltaY * fDeltaY * 0.5);\n    }\n  }\n  float fDensity;\n  if (fDeltaY != 0.) {\n    fDensity = (sqrt(1.0 + ((fDeltaD / fDeltaY) * (fDeltaD / fDeltaY)))) * fDensityIntegral;\n  } else {\n    fDensity = 0.;\n  }\n  float f = exp(-fDensity);\n  return f;\n}\nvoid CC_TRANSFER_FOG_BASE(vec4 pos, out float factor)\n{\n  #if CC_USE_FOG == 0\n\tfactor = LinearFog(pos);\n  #elif CC_USE_FOG == 1\n    factor = ExpFog(pos);\n  #elif CC_USE_FOG == 2\n    factor = ExpSquaredFog(pos);\n  #elif CC_USE_FOG == 3\n    factor = LayeredFog(pos);\n  #else\n    factor = 1.0;\n  #endif\n}\n#if !CC_USE_ACCURATE_FOG\nlayout(location = 0) out float v_fog_factor;\n#endif\nvoid CC_TRANSFER_FOG(vec4 pos) {\n#if !CC_USE_ACCURATE_FOG\n    CC_TRANSFER_FOG_BASE(pos, v_fog_factor);\n#endif\n}\nlayout(location = 1) out highp vec4 v_shadowPos;\nlayout(set = 0, binding = 2) uniform CCShadow {\n  highp mat4 cc_matLightPlaneProj;\n  highp mat4 cc_matLightView;\n  highp mat4 cc_matLightViewProj;\n  highp vec4 cc_shadowInvProjDepthInfo;\n  highp vec4 cc_shadowProjDepthInfo;\n  highp vec4 cc_shadowProjInfo;\n  mediump vec4 cc_shadowNFLSInfo;\n  mediump vec4 cc_shadowWHPBInfo;\n  mediump vec4 cc_shadowLPNNInfo;\n  lowp vec4 cc_shadowColor;\n  mediump vec4 cc_planarNDInfo;\n};\n#if CC_RECEIVE_SHADOW\n  layout(set = 0, binding = 3) uniform highp sampler2D cc_shadowMap;\n  layout(set = 0, binding = 5) uniform highp sampler2D cc_spotLightingMap;\n#endif\n#if CC_RECEIVE_SHADOW\nvec2 CCGetShadowBias()\n{\n  #if USE_INSTANCING\n    return vec2(a_localShadowBias.x + cc_shadowWHPBInfo.w, a_localShadowBias.y + cc_shadowLPNNInfo.z);\n  #elif !USE_BATCHING\n    return vec2(cc_localShadowBias.x + cc_shadowWHPBInfo.w, cc_localShadowBias.y + cc_shadowLPNNInfo.z);\n  #else\n    return vec2(cc_shadowWHPBInfo.w, cc_shadowLPNNInfo.z);\n  #endif\n}\n#endif\n#if USE_VERTEX_COLOR\n  layout(location = 14) in vec4 a_color;\n  layout(location = 2) out lowp vec4 v_color;\n#endif\nlayout(location = 3) out vec3 v_position;\nlayout(location = 4) out mediump vec3 v_normal;\nlayout(location = 5) out vec2 v_uv;\n#if HAS_SECOND_UV\n  layout(location = 6) out mediump vec2 v_uv1;\n#endif\n#if CC_RECEIVE_SHADOW\n  layout(location = 7) out mediump vec2 v_shadowBias;\n#endif\n#if USE_NORMAL_MAP\n  layout(location = 8) out mediump vec4 v_tangent;\n#endif\n#if HAS_SECOND_UV || CC_USE_LIGHTMAP\n  layout(location = 15) in vec2 a_texCoord1;\n#endif\n#if CC_USE_LIGHTMAP && !USE_BATCHING && !CC_FORWARD_ADD\n  layout(location = 9) out vec3 v_luv;\n  void CCLightingMapCaclUV()\n  {\n  #if !USE_INSTANCING\n    v_luv.xy = cc_lightingMapUVParam.xy + a_texCoord1 * cc_lightingMapUVParam.z;\n    v_luv.z = cc_lightingMapUVParam.w;\n  #else\n    v_luv.xy = a_lightingMapUVParam.xy + a_texCoord1 * a_lightingMapUVParam.z;\n    v_luv.z = a_lightingMapUVParam.w;\n  #endif\n  }\n#endif\nvoid main () {\n  StandardVertInput In;\n  CCVertInput(In);\n  mat4 matWorld, matWorldIT;\n  CCGetWorldMatrixFull(matWorld, matWorldIT);\n  vec4 pos = matWorld * In.position;\n  v_position = pos.xyz;\n  v_normal = normalize((matWorldIT * vec4(In.normal, 0.0)).xyz);\n  #if CC_RECEIVE_SHADOW\n    v_shadowBias = CCGetShadowBias();\n  #endif\n  #if USE_TWOSIDE\n    vec3 viewDirect = normalize(cc_cameraPos.xyz - v_position);\n    v_normal *= dot(v_normal, viewDirect) < 0.0 ? -1.0 : 1.0;\n  #endif\n  #if USE_NORMAL_MAP\n    v_tangent.xyz = normalize((matWorld * vec4(In.tangent.xyz, 0.0)).xyz);\n    v_tangent.w = In.tangent.w;\n  #endif\n  v_uv = a_texCoord * tilingOffset.xy + tilingOffset.zw;\n  #if SAMPLE_FROM_RT\n    v_uv = cc_cameraPos.w > 1.0 ? vec2(v_uv.x, 1.0 - v_uv.y) : v_uv;\n  #endif\n  #if HAS_SECOND_UV\n    v_uv1 = a_texCoord1 * tilingOffset.xy + tilingOffset.zw;\n    #if SAMPLE_FROM_RT\n      v_uv1 = cc_cameraPos.w > 1.0 ? vec2(v_uv1.x, 1.0 - v_uv1.y) : v_uv1;\n    #endif\n  #endif\n  #if USE_VERTEX_COLOR\n    v_color = a_color;\n  #endif\n  CC_TRANSFER_FOG(pos);\n  v_shadowPos = cc_matLightViewProj * pos;\n  #if CC_USE_LIGHTMAP && !USE_BATCHING && !CC_FORWARD_ADD\n    CCLightingMapCaclUV();\n  #endif\n  gl_Position = cc_matProj * (cc_matView * matWorld) * In.position;\n}","frag":"\nprecision highp float;\nlayout(set = 0, binding = 0) uniform CCGlobal {\n  highp   vec4 cc_time;\n  mediump vec4 cc_screenSize;\n  mediump vec4 cc_nativeSize;\n};\nlayout(set = 0, binding = 1) uniform CCCamera {\n  highp   mat4 cc_matView;\n  highp   mat4 cc_matViewInv;\n  highp   mat4 cc_matProj;\n  highp   mat4 cc_matProjInv;\n  highp   mat4 cc_matViewProj;\n  highp   mat4 cc_matViewProjInv;\n  highp   vec4 cc_cameraPos;\n  mediump vec4 cc_screenScale;\n  mediump vec4 cc_exposure;\n  mediump vec4 cc_mainLitDir;\n  mediump vec4 cc_mainLitColor;\n  mediump vec4 cc_ambientSky;\n  mediump vec4 cc_ambientGround;\n  mediump vec4 cc_fogColor;\n  mediump vec4 cc_fogBase;\n  mediump vec4 cc_fogAdd;\n  mediump vec4 cc_nearFar;\n  mediump vec4 cc_viewPort;\n};\nlayout(set = 1, binding = 0) uniform Constants {\n  vec4 tilingOffset;\n  vec4 albedo;\n  vec4 albedoScaleAndCutoff;\n  vec4 pbrParams;\n  vec4 emissive;\n  vec4 emissiveScaleParam;\n};\nfloat LinearFog(vec4 pos) {\n  vec4 wPos = pos;\n  float cam_dis = distance(cc_cameraPos, wPos);\n  float fogStart = cc_fogBase.x;\n  float fogEnd = cc_fogBase.y;\n  return clamp((fogEnd - cam_dis) / (fogEnd - fogStart), 0., 1.);\n}\nfloat ExpFog(vec4 pos) {\n  vec4 wPos = pos;\n  float fogAtten = cc_fogAdd.z;\n  float fogStart = cc_fogBase.x;\n  float fogDensity = cc_fogBase.z;\n  float cam_dis = max(distance(cc_cameraPos, wPos) - fogStart, 0.0) / fogAtten * 4.;\n  float f = exp(-cam_dis * fogDensity);\n  return f;\n}\nfloat ExpSquaredFog(vec4 pos) {\n  vec4 wPos = pos;\n  float fogAtten = cc_fogAdd.z;\n  float fogStart = cc_fogBase.x;\n  float fogDensity = cc_fogBase.z;\n  float cam_dis = max(distance(cc_cameraPos, wPos) - fogStart, 0.0) / fogAtten * 4.;\n  float f = exp(-cam_dis * cam_dis * fogDensity * fogDensity);\n  return f;\n}\nfloat LayeredFog(vec4 pos) {\n  vec4 wPos = pos;\n  float fogAtten = cc_fogAdd.z;\n  float _FogTop = cc_fogAdd.x;\n  float _FogRange = cc_fogAdd.y;\n  vec3 camWorldProj = cc_cameraPos.xyz;\n  camWorldProj.y = 0.;\n  vec3 worldPosProj = wPos.xyz;\n  worldPosProj.y = 0.;\n  float fDeltaD = distance(worldPosProj, camWorldProj) / fogAtten * 2.0;\n  float fDeltaY, fDensityIntegral;\n  if (cc_cameraPos.y > _FogTop) {\n    if (wPos.y < _FogTop) {\n      fDeltaY = (_FogTop - wPos.y) / _FogRange * 2.0;\n      fDensityIntegral = fDeltaY * fDeltaY * 0.5;\n    } else {\n      fDeltaY = 0.;\n      fDensityIntegral = 0.;\n    }\n  } else {\n    if (wPos.y < _FogTop) {\n      float fDeltaA = (_FogTop - cc_cameraPos.y) / _FogRange * 2.;\n      float fDeltaB = (_FogTop - wPos.y) / _FogRange * 2.;\n      fDeltaY = abs(fDeltaA - fDeltaB);\n      fDensityIntegral = abs((fDeltaA * fDeltaA * 0.5) - (fDeltaB * fDeltaB * 0.5));\n    } else {\n      fDeltaY = abs(_FogTop - cc_cameraPos.y) / _FogRange * 2.;\n      fDensityIntegral = abs(fDeltaY * fDeltaY * 0.5);\n    }\n  }\n  float fDensity;\n  if (fDeltaY != 0.) {\n    fDensity = (sqrt(1.0 + ((fDeltaD / fDeltaY) * (fDeltaD / fDeltaY)))) * fDensityIntegral;\n  } else {\n    fDensity = 0.;\n  }\n  float f = exp(-fDensity);\n  return f;\n}\nvoid CC_TRANSFER_FOG_BASE(vec4 pos, out float factor)\n{\n  #if CC_USE_FOG == 0\n\tfactor = LinearFog(pos);\n  #elif CC_USE_FOG == 1\n    factor = ExpFog(pos);\n  #elif CC_USE_FOG == 2\n    factor = ExpSquaredFog(pos);\n  #elif CC_USE_FOG == 3\n    factor = LayeredFog(pos);\n  #else\n    factor = 1.0;\n  #endif\n}\nvoid CC_APPLY_FOG_BASE(inout vec4 color, float factor) {\n  color = vec4(mix(cc_fogColor.rgb, color.rgb, factor), color.a);\n}\n#if !CC_USE_ACCURATE_FOG\nlayout(location = 0) in float v_fog_factor;\n#endif\nvoid CC_APPLY_FOG(inout vec4 color) {\n#if !CC_USE_ACCURATE_FOG\n    CC_APPLY_FOG_BASE(color, v_fog_factor);\n#endif\n}\nvoid CC_APPLY_FOG(inout vec4 color, vec3 worldPos) {\n#if CC_USE_ACCURATE_FOG\n    float factor;\n    CC_TRANSFER_FOG_BASE(vec4(worldPos, 1.0), factor);\n#else\n    float factor = v_fog_factor;\n#endif\n    CC_APPLY_FOG_BASE(color, factor);\n}\n#define QUATER_PI         0.78539816340\n#define HALF_PI           1.57079632679\n#define PI                3.14159265359\n#define PI2               6.28318530718\n#define PI4               12.5663706144\n#define INV_QUATER_PI     1.27323954474\n#define INV_HALF_PI       0.63661977237\n#define INV_PI            0.31830988618\n#define INV_PI2           0.15915494309\n#define INV_PI4           0.07957747155\n#define EPSILON           1e-6\n#define EPSILON_LOWP      1e-4\n#define LOG2              1.442695\n#define EXP_VALUE         2.71828183f\n#define FP_MAX            65504.0\n#define FP_SCALE          0.0009765625\n#define FP_SCALE_INV      1024.0\n#define GRAY_VECTOR       vec3(0.299, 0.587, 0.114)\nvec3 SRGBToLinear (vec3 gamma) {\n  return gamma * gamma;\n}\nlayout(set = 0, binding = 2) uniform CCShadow {\n  highp mat4 cc_matLightPlaneProj;\n  highp mat4 cc_matLightView;\n  highp mat4 cc_matLightViewProj;\n  highp vec4 cc_shadowInvProjDepthInfo;\n  highp vec4 cc_shadowProjDepthInfo;\n  highp vec4 cc_shadowProjInfo;\n  mediump vec4 cc_shadowNFLSInfo;\n  mediump vec4 cc_shadowWHPBInfo;\n  mediump vec4 cc_shadowLPNNInfo;\n  lowp vec4 cc_shadowColor;\n  mediump vec4 cc_planarNDInfo;\n};\nhighp float unpackHighpData (float mainPart, float modPart) {\n  highp float data = mainPart;\n  return data + modPart;\n}\nvoid packHighpData (out float mainPart, out float modPart, highp float data) {\n  mainPart = fract(data);\n  modPart = data - mainPart;\n}\nhighp float unpackHighpData (float mainPart, float modPart, const float modValue) {\n  highp float data = mainPart * modValue;\n  return data + modPart * modValue;\n}\nvoid packHighpData (out float mainPart, out float modPart, highp float data, const float modValue) {\n  highp float divide = data / modValue;\n  mainPart = floor(divide);\n  modPart = (data - mainPart * modValue) / modValue;\n}\nhighp vec2 unpackHighpData (vec2 mainPart, vec2 modPart) {\n  highp vec2 data = mainPart;\n  return data + modPart;\n}\nvoid packHighpData (out vec2 mainPart, out vec2 modPart, highp vec2 data) {\n  mainPart = fract(data);\n  modPart = data - mainPart;\n}\nhighp vec2 unpackHighpData (vec2 mainPart, vec2 modPart, const float modValue) {\n  highp vec2 data = mainPart * modValue;\n  return data + modPart * modValue;\n}\nvoid packHighpData (out vec2 mainPart, out vec2 modPart, highp vec2 data, const float modValue) {\n  highp vec2 divide = data / modValue;\n  mainPart = floor(divide);\n  modPart = (data - mainPart * modValue) / modValue;\n}\nhighp vec3 unpackHighpData (vec3 mainPart, vec3 modPart) {\n  highp vec3 data = mainPart;\n  return data + modPart;\n}\nvoid packHighpData (out vec3 mainPart, out vec3 modPart, highp vec3 data) {\n  mainPart = fract(data);\n  modPart = data - mainPart;\n}\nhighp vec3 unpackHighpData (vec3 mainPart, vec3 modPart, const float modValue) {\n  highp vec3 data = mainPart * modValue;\n  return data + modPart * modValue;\n}\nvoid packHighpData (out vec3 mainPart, out vec3 modPart, highp vec3 data, const float modValue) {\n  highp vec3 divide = data / modValue;\n  mainPart = floor(divide);\n  modPart = (data - mainPart * modValue) / modValue;\n}\nhighp vec4 unpackHighpData (vec4 mainPart, vec4 modPart) {\n  highp vec4 data = mainPart;\n  return data + modPart;\n}\nvoid packHighpData (out vec4 mainPart, out vec4 modPart, highp vec4 data) {\n  mainPart = fract(data);\n  modPart = data - mainPart;\n}\nhighp vec4 unpackHighpData (vec4 mainPart, vec4 modPart, const float modValue) {\n  highp vec4 data = mainPart * modValue;\n  return data + modPart * modValue;\n}\nvoid packHighpData (out vec4 mainPart, out vec4 modPart, highp vec4 data, const float modValue) {\n  highp vec4 divide = data / modValue;\n  mainPart = floor(divide);\n  modPart = (data - mainPart * modValue) / modValue;\n}\nlayout(set = 2, binding = 0) uniform CCLocal {\n  highp mat4 cc_matWorld;\n  highp mat4 cc_matWorldIT;\n  highp vec4 cc_lightingMapUVParam;\n  highp vec4 cc_localShadowBias;\n};\nfloat CCGetLinearDepthFromViewSpace(vec3 viewPos) {\n  float dist = length(viewPos);\n  return (dist - cc_shadowNFLSInfo.x) / (cc_shadowNFLSInfo.y - cc_shadowNFLSInfo.x);\n}\nfloat CCGetLinearDepth(vec3 worldPos) {\n  vec4 viewStartPos = cc_matLightView * vec4(worldPos.xyz, 1.0);\n  return CCGetLinearDepthFromViewSpace(viewStartPos.xyz);\n}\n#if CC_RECEIVE_SHADOW\n  layout(set = 0, binding = 3) uniform highp sampler2D cc_shadowMap;\n  layout(set = 0, binding = 5) uniform highp sampler2D cc_spotLightingMap;\n  vec4 ApplyShadowDepthBias_FaceNormal(vec4 shadowPos, vec3 worldNormal, float normalBias)\n  {\n    vec4 newShadowPos = shadowPos;\n    if(normalBias > EPSILON_LOWP)\n    {\n      vec4 viewNormal = cc_matLightView * vec4(worldNormal, 0.0);\n      if(viewNormal.z < 0.1)\n        newShadowPos.xy += viewNormal.xy * cc_shadowProjInfo.xy * normalBias * clamp(viewNormal.z, 0.001, 0.1);\n    }\n    return newShadowPos;\n  }\n  vec4 ApplyShadowDepthBias_Perspective(vec4 shadowPos, float viewspaceDepthBias)\n  {\n    vec3 viewSpacePos;\n    viewSpacePos.xy = shadowPos.xy * cc_shadowProjInfo.zw;\n    viewSpacePos.z = shadowPos.z * cc_shadowInvProjDepthInfo.x + shadowPos.w * cc_shadowInvProjDepthInfo.y;\n    viewSpacePos.xyz += cc_shadowProjDepthInfo.z * normalize(viewSpacePos.xyz) * viewspaceDepthBias;\n    vec4 clipSpacePos;\n    clipSpacePos.xy = viewSpacePos.xy * cc_shadowProjInfo.xy;\n    clipSpacePos.zw = viewSpacePos.z * cc_shadowProjDepthInfo.xz + vec2(cc_shadowProjDepthInfo.y, 0.0);\n    if (cc_shadowNFLSInfo.z > EPSILON) {\n      clipSpacePos.z = CCGetLinearDepthFromViewSpace(viewSpacePos.xyz);\n      clipSpacePos.z = (clipSpacePos.z * 2.0 - 1.0) * clipSpacePos.w;\n    }\n    return clipSpacePos;\n  }\n  vec4 ApplyShadowDepthBias_Orthographic(vec4 shadowPos, float viewspaceDepthBias)\n  {\n    float coeffA = cc_shadowProjDepthInfo.x;\n    float coeffB = cc_shadowProjDepthInfo.y;\n    float viewSpacePos_z = (shadowPos.z - coeffB) / coeffA;\n    viewSpacePos_z += viewspaceDepthBias;\n    vec4 result = shadowPos;\n    result.z = viewSpacePos_z * coeffA + coeffB;\n    return result;\n  }\n  float CCGetShadowFactorHard (vec4 shadowPos, float bias) {\n    vec4 clipPosNew = ApplyShadowDepthBias_Orthographic(shadowPos, bias);\n    vec3 clipPos = clipPosNew.xyz / clipPosNew.w * 0.5 + 0.5;\n    if (clipPos.x < 0.0 || clipPos.x > 1.0 ||\n        clipPos.y < 0.0 || clipPos.y > 1.0 ||\n        clipPos.z < 0.0 || clipPos.z > 1.0) { return 1.0; }\n    clipPos.xy = cc_cameraPos.w == 1.0 ? vec2(clipPos.xy.x, 1.0 - clipPos.xy.y) : clipPos.xy;\n    float shadow = 0.0;\n    float closestDepth = 0.0;\n    if (cc_shadowLPNNInfo.y > EPSILON) {\n      closestDepth = dot(texture(cc_shadowMap, clipPos.xy), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0));\n    } else {\n      closestDepth = texture(cc_shadowMap, clipPos.xy).x;\n    }\n    shadow = step(clipPos.z, closestDepth);\n    return shadow;\n  }\n  float CCGetShadowFactorSoft (vec4 shadowPos, float bias) {\n    vec4 clipPosNew = ApplyShadowDepthBias_Orthographic(shadowPos, bias);\n    vec3 clipPos = clipPosNew.xyz / clipPosNew.w * 0.5 + 0.5;\n    if (clipPos.x < 0.0 || clipPos.x > 1.0 ||\n        clipPos.y < 0.0 || clipPos.y > 1.0 ||\n        clipPos.z < 0.0 || clipPos.z > 1.0) { return 1.0; }\n    clipPos.xy = cc_cameraPos.w == 1.0 ? vec2(clipPos.xy.x, 1.0 - clipPos.xy.y) : clipPos.xy;\n    float offsetDepth = clipPos.z;\n    vec2 mapSize = cc_shadowWHPBInfo.xy;\n    vec2 oneTap = 1.0 / mapSize;\n    vec2 clipPos_offset = clipPos.xy + oneTap;\n    float block0, block1, block2, block3;\n    if (cc_shadowLPNNInfo.y > EPSILON) {\n      block0 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos.x, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block1 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos_offset.x, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block2 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos.x, clipPos_offset.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block3 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos_offset.x, clipPos_offset.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n    } else {\n      block0 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos.x, clipPos.y)).x);\n      block1 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos_offset.x, clipPos.y)).x);\n      block2 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos.x, clipPos_offset.y)).x);\n      block3 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos_offset.x, clipPos_offset.y)).x);\n    }\n    float coefX   = mod(clipPos.x, oneTap.x) * mapSize.x;\n    float resultX = mix(block0, block1, coefX);\n    float resultY = mix(block2, block3, coefX);\n    float coefY   = mod(clipPos.y, oneTap.y) * mapSize.y;\n    return mix(resultX, resultY, coefY);\n  }\n  float CCGetShadowFactorSoft2X (vec4 shadowPos, float bias) {\n    vec4 clipPosNew = ApplyShadowDepthBias_Orthographic(shadowPos, bias);\n    vec3 clipPos = clipPosNew.xyz / clipPosNew.w * 0.5 + 0.5;\n    if (clipPos.x < 0.0 || clipPos.x > 1.0 ||\n        clipPos.y < 0.0 || clipPos.y > 1.0 ||\n        clipPos.z < 0.0 || clipPos.z > 1.0) { return 1.0; }\n    clipPos.xy = cc_cameraPos.w == 1.0 ? vec2(clipPos.xy.x, 1.0 - clipPos.xy.y) : clipPos.xy;\n    float offsetDepth = clipPos.z;\n    vec2 mapSize = cc_shadowWHPBInfo.xy;\n    vec2 oneTap = 1.0 / mapSize;\n    float clipPos_offset_L = clipPos.x - oneTap.x;\n    float clipPos_offset_R = clipPos.x + oneTap.x;\n    float clipPos_offset_U = clipPos.y - oneTap.y;\n    float clipPos_offset_D = clipPos.y + oneTap.y;\n    float block0, block1, block2, block3, block4, block5, block6, block7, block8;\n    if (cc_shadowLPNNInfo.y > EPSILON) {\n      block0 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos_offset_L, clipPos_offset_U)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block1 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos.x, clipPos_offset_U)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block2 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos_offset_R, clipPos_offset_U)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block3 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos_offset_L, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block4 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos.x, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block5 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos_offset_R, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block6 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos_offset_L, clipPos_offset_D)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block7 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos.x, clipPos_offset_D)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block8 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos_offset_R, clipPos_offset_D)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n    } else {\n      block0 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos_offset_L, clipPos_offset_U)).x);\n      block1 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos.x, clipPos_offset_U)).x);\n      block2 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos_offset_R, clipPos_offset_U)).x);\n      block3 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos_offset_L, clipPos.y)).x);\n      block4 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos.x, clipPos.y)).x);\n      block5 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos_offset_R, clipPos.y)).x);\n      block6 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos_offset_L, clipPos_offset_D)).x);\n      block7 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos.x, clipPos_offset_D)).x);\n      block8 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos_offset_R, clipPos_offset_D)).x);\n    }\n    float coefX = mod(clipPos.x, oneTap.x) * mapSize.x;\n    float coefY = mod(clipPos.y, oneTap.y) * mapSize.y;\n    float shadow = 0.0;\n    float resultX = mix(block0, block1, coefX);\n    float resultY = mix(block3, block4, coefX);\n    shadow += mix(resultX , resultY, coefY);\n    resultX = mix(block1, block2, coefX);\n    resultY = mix(block4, block5, coefX);\n    shadow += mix(resultX , resultY, coefY);\n    resultX = mix(block3, block4, coefX);\n    resultY = mix(block6, block7, coefX);\n    shadow += mix(resultX, resultY, coefY);\n    resultX = mix(block4, block5, coefX);\n    resultY = mix(block7, block8, coefX);\n    shadow += mix(resultX, resultY, coefY);\n    return shadow * 0.25;\n  }\n  float CCGetSpotLightShadowFactorHard (vec4 shadowPos, vec3 worldPos, float bias) {\n    vec4 clipPosNew = ApplyShadowDepthBias_Perspective(shadowPos, bias);\n    vec3 clipPos = clipPosNew.xyz / clipPosNew.w * 0.5 + 0.5;\n    if (clipPos.x < 0.0 || clipPos.x > 1.0 ||\n        clipPos.y < 0.0 || clipPos.y > 1.0 ||\n        clipPos.z < 0.0 || clipPos.z > 1.0) { return 1.0; }\n    clipPos.xy = cc_cameraPos.w == 1.0 ? vec2(clipPos.xy.x, 1.0 - clipPos.xy.y) : clipPos.xy;\n    float shadow = 0.0;\n    float closestDepth = 0.0;\n    float depth = clipPos.z;\n    if (cc_shadowLPNNInfo.y > EPSILON) {\n      closestDepth = dot(texture(cc_spotLightingMap, clipPos.xy), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0));\n    } else {\n      closestDepth = texture(cc_spotLightingMap, clipPos.xy).x;\n    }\n    shadow = step(depth, closestDepth);\n    return shadow;\n  }\n  float CCGetSpotLightShadowFactorSoft (vec4 shadowPos, vec3 worldPos, float bias) {\n    vec4 clipPosNew = ApplyShadowDepthBias_Perspective(shadowPos, bias);\n    vec3 clipPos = clipPosNew.xyz / clipPosNew.w * 0.5 + 0.5;\n    if (clipPos.x < 0.0 || clipPos.x > 1.0 ||\n        clipPos.y < 0.0 || clipPos.y > 1.0 ||\n        clipPos.z < 0.0 || clipPos.z > 1.0) { return 1.0; }\n    clipPos.xy = cc_cameraPos.w == 1.0 ? vec2(clipPos.xy.x, 1.0 - clipPos.xy.y) : clipPos.xy;\n    float depth = 0.0;\n    if (cc_shadowNFLSInfo.z > EPSILON) {\n      depth = CCGetLinearDepth(worldPos);\n    } else {\n      depth = clipPos.z;\n    }\n    vec2 oneTap = 1.0 / cc_shadowWHPBInfo.xy;\n    vec2 clipPos_offset = clipPos.xy + oneTap;\n    float block0, block1, block2, block3;\n    if (cc_shadowLPNNInfo.y > EPSILON) {\n      block0 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos.x, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block1 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos_offset.x, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block2 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos.x, clipPos_offset.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block3 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos_offset.x, clipPos_offset.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n    } else {\n      block0 = step(depth, texture(cc_spotLightingMap, vec2(clipPos.x, clipPos.y)).x);\n      block1 = step(depth, texture(cc_spotLightingMap, vec2(clipPos_offset.x, clipPos.y)).x);\n      block2 = step(depth, texture(cc_spotLightingMap, vec2(clipPos.x, clipPos_offset.y)).x);\n      block3 = step(depth, texture(cc_spotLightingMap, vec2(clipPos_offset.x, clipPos_offset.y)).x);\n    }\n    float coefX   = mod(clipPos.x, oneTap.x) * cc_shadowWHPBInfo.x;\n    float resultX = mix(block0, block1, coefX);\n    float resultY = mix(block2, block3, coefX);\n    float coefY   = mod(clipPos.y, oneTap.y) * cc_shadowWHPBInfo.y;\n    return mix(resultX, resultY, coefY);\n  }\n  float CCGetSpotLightShadowFactorSoft2X (vec4 shadowPos, vec3 worldPos, float bias) {\n    vec4 clipPosNew = ApplyShadowDepthBias_Perspective(shadowPos, bias);\n    vec3 clipPos = clipPosNew.xyz / clipPosNew.w * 0.5 + 0.5;\n    if (clipPos.x < 0.0 || clipPos.x > 1.0 ||\n        clipPos.y < 0.0 || clipPos.y > 1.0 ||\n        clipPos.z < 0.0 || clipPos.z > 1.0) { return 1.0; }\n    clipPos.xy = cc_cameraPos.w == 1.0 ? vec2(clipPos.xy.x, 1.0 - clipPos.xy.y) : clipPos.xy;\n    float depth = 0.0;\n    if (cc_shadowNFLSInfo.z > EPSILON) {\n      depth = CCGetLinearDepth(worldPos);\n    } else {\n      depth = clipPos.z;\n    }\n    vec2 mapSize = cc_shadowWHPBInfo.xy;\n    vec2 oneTap = 1.0 / mapSize;\n    float clipPos_offset_L = clipPos.x - oneTap.x;\n    float clipPos_offset_R = clipPos.x + oneTap.x;\n    float clipPos_offset_U = clipPos.y - oneTap.y;\n    float clipPos_offset_D = clipPos.y + oneTap.y;\n    float block0, block1, block2, block3, block4, block5, block6, block7, block8;\n    if (cc_shadowLPNNInfo.y > EPSILON) {\n      block0 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos_offset_L, clipPos_offset_U)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block1 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos.x, clipPos_offset_U)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block2 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos_offset_R, clipPos_offset_U)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block3 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos_offset_L, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block4 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos.x, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block5 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos_offset_R, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block6 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos_offset_L, clipPos_offset_D)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block7 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos.x, clipPos_offset_D)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block8 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos_offset_R, clipPos_offset_D)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n    } else {\n      block0 = step(depth, texture(cc_spotLightingMap, vec2(clipPos_offset_L, clipPos_offset_U)).x);\n      block1 = step(depth, texture(cc_spotLightingMap, vec2(clipPos.x, clipPos_offset_U)).x);\n      block2 = step(depth, texture(cc_spotLightingMap, vec2(clipPos_offset_R, clipPos_offset_U)).x);\n      block3 = step(depth, texture(cc_spotLightingMap, vec2(clipPos_offset_L, clipPos.y)).x);\n      block4 = step(depth, texture(cc_spotLightingMap, vec2(clipPos.x, clipPos.y)).x);\n      block5 = step(depth, texture(cc_spotLightingMap, vec2(clipPos_offset_R, clipPos.y)).x);\n      block6 = step(depth, texture(cc_spotLightingMap, vec2(clipPos_offset_L, clipPos_offset_D)).x);\n      block7 = step(depth, texture(cc_spotLightingMap, vec2(clipPos.x, clipPos_offset_D)).x);\n      block8 = step(depth, texture(cc_spotLightingMap, vec2(clipPos_offset_R, clipPos_offset_D)).x);\n    }\n    float coefX = mod(clipPos.x, oneTap.x) * mapSize.x;\n    float coefY = mod(clipPos.y, oneTap.y) * mapSize.y;\n    float shadow = 0.0;\n    float resultX = mix(block0, block1, coefX);\n    float resultY = mix(block3, block4, coefX);\n    shadow += mix(resultX , resultY, coefY);\n    resultX = mix(block1, block2, coefX);\n    resultY = mix(block4, block5, coefX);\n    shadow += mix(resultX , resultY, coefY);\n    resultX = mix(block3, block4, coefX);\n    resultY = mix(block6, block7, coefX);\n    shadow += mix(resultX, resultY, coefY);\n    resultX = mix(block4, block5, coefX);\n    resultY = mix(block7, block8, coefX);\n    shadow += mix(resultX, resultY, coefY);\n    return shadow * 0.25;\n  }\nfloat CCSpotShadowFactorBase(vec4 shadowPos, vec3 worldPos, vec2 shadowBias)\n{\n  float pcf = cc_shadowWHPBInfo.z;\n  if (pcf > 1.9) {\n    return CCGetSpotLightShadowFactorSoft2X(shadowPos, worldPos, shadowBias.x);\n  }else if (pcf > 0.9) {\n    return CCGetSpotLightShadowFactorSoft(shadowPos, worldPos, shadowBias.x);\n  }else {\n    return CCGetSpotLightShadowFactorHard(shadowPos, worldPos, shadowBias.x);\n  }\n}\nfloat CCShadowFactorBase(vec4 shadowPos, vec3 N, vec2 shadowBias)\n{\n  float realtimeShadow = 1.0;\n  vec4 pos = ApplyShadowDepthBias_FaceNormal(shadowPos, N, shadowBias.y);\n  float pcf = cc_shadowWHPBInfo.z;\n  if (pcf > 1.9) {\n    realtimeShadow =  CCGetShadowFactorSoft2X(pos, shadowBias.x);\n  }else if (pcf > 0.9) {\n    realtimeShadow = CCGetShadowFactorSoft(pos, shadowBias.x);\n  }else {\n    realtimeShadow = CCGetShadowFactorHard(pos, shadowBias.x);\n  }\n  return mix(realtimeShadow, 1.0, cc_shadowNFLSInfo.w);\n}\n#endif\n#if CC_USE_IBL\n  layout(set = 0, binding = 4) uniform samplerCube cc_environment;\n  vec4 fragTextureLod (sampler2D tex, vec2 coord, float lod) {\n      return textureLod(tex, coord, lod);\n  }\n  vec4 fragTextureLod (samplerCube tex, vec3 coord, float lod) {\n      return textureLod(tex, coord, lod);\n  }\n  vec3 unpackRGBE (vec4 rgbe) {\n    return rgbe.rgb * pow(1.1, rgbe.a * 255.0 - 128.0);\n  }\n  #if CC_USE_DIFFUSEMAP\n    layout(set = 0, binding = 6) uniform samplerCube cc_diffuseMap;\n  #endif\n#endif\nfloat GGXMobile (float roughness, float NoH, vec3 H, vec3 N) {\n  vec3 NxH = cross(N, H);\n  float OneMinusNoHSqr = dot(NxH, NxH);\n  float a = roughness * roughness;\n  float n = NoH * a;\n  float p = a / (OneMinusNoHSqr + n * n);\n  return p * p;\n}\nfloat CalcSpecular (float roughness, float NoH, vec3 H, vec3 N) {\n  return (roughness * 0.25 + 0.25) * GGXMobile(roughness, NoH, H, N);\n}\nvec3 BRDFApprox (vec3 specular, float roughness, float NoV) {\n  const vec4 c0 = vec4(-1.0, -0.0275, -0.572, 0.022);\n  const vec4 c1 = vec4(1.0, 0.0425, 1.04, -0.04);\n  vec4 r = roughness * c0 + c1;\n  float a004 = min(r.x * r.x, exp2(-9.28 * NoV)) * r.x + r.y;\n  vec2 AB = vec2(-1.04, 1.04) * a004 + r.zw;\n  AB.y *= clamp(50.0 * specular.g, 0.0, 1.0);\n  return specular * AB.x + AB.y;\n}\n#if USE_REFLECTION_DENOISE\n  vec3 GetEnvReflectionWithMipFiltering(vec3 R, float roughness, float mipCount, float denoiseIntensity) {\n    #if CC_USE_IBL\n    \tfloat mip = roughness * mipCount;\n    \tfloat delta = (dot(dFdx(R), dFdy(R))) * 1000.0;\n    \tfloat mipBias = mix(0.0, 5.0, clamp(delta, 0.0, 1.0));\n    \tvec4 biased = fragTextureLod(cc_environment, R, mip + mipBias);\n     \tvec4 filtered = texture(cc_environment, R);\n      #if CC_USE_IBL == 2\n      \tbiased.rgb = unpackRGBE(biased);\n      \tfiltered.rgb = unpackRGBE(filtered);\n      #else\n      \tbiased.rgb = SRGBToLinear(biased.rgb);\n      \tfiltered.rgb = SRGBToLinear(filtered.rgb);\n      #endif\n      return mix(biased.rgb, filtered.rgb, denoiseIntensity);\n    #else\n      return vec3(0.0, 0.0, 0.0);\n    #endif\n  }\n#endif\nstruct StandardSurface {\n  vec4 albedo;\n  #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\n  vec3 position, position_fract_part;\n  #else\n  vec3 position;\n  #endif\n  vec3 normal;\n  vec3 emissive;\n  vec3 lightmap;\n  float lightmap_test;\n  float roughness;\n  float metallic;\n  float occlusion;\n  float specularIntensity;\n  #if CC_RECEIVE_SHADOW\n    vec2 shadowBias;\n  #endif\n};\nvec4 CCStandardShadingBase (StandardSurface s, vec4 shadowPos) {\n  vec3 diffuse = s.albedo.rgb * (1.0 - s.metallic);\n  vec3 specular = mix(vec3(0.08 * s.specularIntensity), s.albedo.rgb, s.metallic);\n  vec3 position;\n  #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\n  position = unpackHighpData(s.position, s.position_fract_part);\n  #else\n  position = s.position;\n  #endif\n  vec3 N = normalize(s.normal);\n  vec3 V = normalize(cc_cameraPos.xyz - position);\n  float NV = max(abs(dot(N, V)), 0.0);\n  specular = BRDFApprox(specular, s.roughness, NV);\n  vec3 L = normalize(-cc_mainLitDir.xyz);\n  vec3 H = normalize(L + V);\n  float NH = max(dot(N, H), 0.0);\n  float NL = max(dot(N, L), 0.0);\n  vec3 finalColor = NL * cc_mainLitColor.rgb * cc_mainLitColor.w;\n  vec3 diffuseContrib = diffuse / PI;\n  vec3 specularContrib = specular * CalcSpecular(s.roughness, NH, H, N);\n  vec3 dirlightContrib = (diffuseContrib + specularContrib);\n  float shadow = 1.0;\n  #if CC_RECEIVE_SHADOW\n    if (NL > 0.0 && cc_mainLitDir.w > 0.0) {\n      shadow = CCShadowFactorBase(shadowPos, N, s.shadowBias);\n    }\n  #endif\n  dirlightContrib *= shadow;\n  finalColor *= dirlightContrib;\n  #if CC_USE_LIGHTMAP && !USE_BATCHING && !CC_FORWARD_ADD\n    if (s.lightmap_test > EPSILON_LOWP) {\n      finalColor = diffuse * s.lightmap.rgb * shadow;\n    }\n  #endif\n  float fAmb = 0.5 - N.y * 0.5;\n  vec3 ambDiff = mix(cc_ambientSky.rgb, cc_ambientGround.rgb, fAmb);\n  #if CC_USE_IBL\n    #if CC_USE_DIFFUSEMAP\n      vec4 diffuseMap = texture(cc_diffuseMap, N);\n      #if CC_USE_DIFFUSEMAP == 2\n        ambDiff = unpackRGBE(diffuseMap);\n      #else\n        ambDiff = SRGBToLinear(diffuseMap.rgb);\n      #endif\n    #endif\n    vec3 R = normalize(reflect(-V, N));\n    #if USE_REFLECTION_DENOISE\n      vec3 env = GetEnvReflectionWithMipFiltering(R, s.roughness, cc_ambientGround.w, 0.6);\n    #else\n      vec4 envmap = fragTextureLod(cc_environment, R, s.roughness * cc_ambientGround.w);\n      #if CC_USE_IBL == 2\n        vec3 env = unpackRGBE(envmap);\n      #else\n        vec3 env = SRGBToLinear(envmap.rgb);\n      #endif\n    #endif\n    finalColor += env * cc_ambientSky.w * specular * s.occlusion;\n  #endif\n  finalColor += ambDiff.rgb * cc_ambientSky.w * diffuse * s.occlusion;\n  finalColor += s.emissive;\n  return vec4(finalColor, s.albedo.a);\n}\nvec3 ACESToneMap (vec3 color) {\n  color = min(color, vec3(8.0));\n  const float A = 2.51;\n  const float B = 0.03;\n  const float C = 2.43;\n  const float D = 0.59;\n  const float E = 0.14;\n  return (color * (A * color + B)) / (color * (C * color + D) + E);\n}\nvec4 CCFragOutput (vec4 color) {\n  #if CC_USE_HDR\n    color.rgb = ACESToneMap(color.rgb);\n  #endif\n  color.rgb = sqrt(color.rgb);\n  return color;\n}\nlayout(location = 1) in highp vec4 v_shadowPos;\n#if CC_RECEIVE_SHADOW\n#endif\n#if CC_USE_LIGHTMAP && !USE_BATCHING && !CC_FORWARD_ADD\n  layout(location = 9) in vec3 v_luv;\n  layout(set = 2, binding = 10) uniform sampler2D cc_lightingMap;\n#endif\nlayout(location = 3) in vec3 v_position;\nlayout(location = 5) in vec2 v_uv;\n#if HAS_SECOND_UV\n  layout(location = 6) in mediump vec2 v_uv1;\n#endif\nlayout(location = 4) in mediump vec3 v_normal;\n#if CC_RECEIVE_SHADOW\n  layout(location = 7) in mediump vec2 v_shadowBias;\n#endif\n#if USE_VERTEX_COLOR\n  layout(location = 2) in lowp vec4 v_color;\n#endif\n#if USE_ALBEDO_MAP\n  layout(set = 1, binding = 1) uniform sampler2D albedoMap;\n#endif\n#if USE_NORMAL_MAP\n  layout(location = 8) in mediump vec4 v_tangent;\n  layout(set = 1, binding = 2) uniform sampler2D normalMap;\n#endif\n#if USE_PBR_MAP\n  layout(set = 1, binding = 3) uniform sampler2D pbrMap;\n#endif\n#if USE_METALLIC_ROUGHNESS_MAP\n  layout(set = 1, binding = 4) uniform sampler2D metallicRoughnessMap;\n#endif\n#if USE_OCCLUSION_MAP\n  layout(set = 1, binding = 5) uniform sampler2D occlusionMap;\n#endif\n#if USE_EMISSIVE_MAP\n  layout(set = 1, binding = 6) uniform sampler2D emissiveMap;\n#endif\n#if USE_ALPHA_TEST\n#endif\nvoid surf (out StandardSurface s) {\n  vec4 baseColor = albedo;\n  #if USE_VERTEX_COLOR\n    baseColor.rgb *= SRGBToLinear(v_color.rgb);\n    baseColor.a *= v_color.a;\n  #endif\n  #if USE_ALBEDO_MAP\n    vec4 texColor = texture(albedoMap, ALBEDO_UV);\n    texColor.rgb = SRGBToLinear(texColor.rgb);\n    baseColor *= texColor;\n  #endif\n  s.albedo = baseColor;\n  s.albedo.rgb *= albedoScaleAndCutoff.xyz;\n  #if USE_ALPHA_TEST\n    if (s.albedo.ALPHA_TEST_CHANNEL < albedoScaleAndCutoff.w) discard;\n  #endif\n  #if CC_USE_LIGHTMAP && !USE_BATCHING && !CC_FORWARD_ADD\n    vec4 lightColor = texture(cc_lightingMap, v_luv.xy);\n    s.lightmap = lightColor.xyz * v_luv.z;\n    s.lightmap_test = v_luv.z;\n  #endif\n  s.normal = v_normal;\n  #if CC_RECEIVE_SHADOW\n    s.shadowBias = v_shadowBias;\n  #endif\n  #if USE_NORMAL_MAP\n    vec3 nmmp = texture(normalMap, NORMAL_UV).xyz - vec3(0.5);\n    vec3 bitangent = cross(v_normal, v_tangent.xyz) * v_tangent.w;\n    s.normal =\n      (nmmp.x * emissiveScaleParam.w) * normalize(v_tangent.xyz) +\n      (nmmp.y * emissiveScaleParam.w) * normalize(bitangent) +\n      nmmp.z * normalize(s.normal);\n  #endif\n  #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\n  packHighpData(s.position, s.position_fract_part, v_position);\n  #else\n  s.position = v_position;\n  #endif\n  vec4 pbr = pbrParams;\n  #if USE_PBR_MAP\n    vec4 res = texture(pbrMap, PBR_UV);\n    pbr.x *= res.r;\n    pbr.y *= res.g;\n    pbr.z *= res.b;\n    pbr.w *= res.a;\n  #endif\n  #if USE_METALLIC_ROUGHNESS_MAP\n    vec4 metallicRoughness = texture(metallicRoughnessMap, PBR_UV);\n    pbr.z *= metallicRoughness.b;\n    pbr.y *= metallicRoughness.g;\n  #endif\n  #if USE_OCCLUSION_MAP\n    pbr.x *= texture(occlusionMap, PBR_UV).r;\n  #endif\n  s.occlusion = pbr.x;\n  s.roughness = pbr.y;\n  s.specularIntensity = 0.5;\n  s.metallic = pbr.z;\n  s.emissive = emissive.rgb * emissiveScaleParam.xyz;\n  #if USE_EMISSIVE_MAP\n    s.emissive *= SRGBToLinear(texture(emissiveMap, EMISSIVE_UV).rgb);\n  #endif\n}\n#if CC_FORWARD_ADD\n  #if CC_PIPELINE_TYPE == 0\n    #define LIGHTS_PER_PASS 1\n  #else\n    #define LIGHTS_PER_PASS 10\n  #endif\n  #if CC_ENABLE_CLUSTERED_LIGHT_CULLING == 0\n  layout(set = 2, binding = 1) uniform CCForwardLight {\n    highp vec4 cc_lightPos[LIGHTS_PER_PASS];\n    vec4 cc_lightColor[LIGHTS_PER_PASS];\n    vec4 cc_lightSizeRangeAngle[LIGHTS_PER_PASS];\n    vec4 cc_lightDir[LIGHTS_PER_PASS];\n  };\n  #endif\n  float SmoothDistAtt (float distSqr, float invSqrAttRadius) {\n    float factor = distSqr * invSqrAttRadius;\n    float smoothFactor = clamp(1.0 - factor * factor, 0.0, 1.0);\n    return smoothFactor * smoothFactor;\n  }\n  float GetDistAtt (float distSqr, float invSqrAttRadius) {\n    float attenuation = 1.0 / max(distSqr, 0.01*0.01);\n    attenuation *= SmoothDistAtt(distSqr , invSqrAttRadius);\n    return attenuation;\n  }\n  float GetAngleAtt (vec3 L, vec3 litDir, float litAngleScale, float litAngleOffset) {\n    float cd = dot(litDir, L);\n    float attenuation = clamp(cd * litAngleScale + litAngleOffset, 0.0, 1.0);\n    return (attenuation * attenuation);\n  }\n  #if CC_ENABLE_CLUSTERED_LIGHT_CULLING == 0\n  vec4 CCStandardShadingAdditive (StandardSurface s, vec4 shadowPos) {\n    vec3 position;\n    #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\n    position = unpackHighpData(s.position, s.position_fract_part);\n    #else\n    position = s.position;\n    #endif\n    vec3 diffuse = s.albedo.rgb * (1.0 - s.metallic);\n    vec3 specular = mix(vec3(0.04), s.albedo.rgb, s.metallic);\n    vec3 diffuseContrib = diffuse / PI;\n    vec3 N = normalize(s.normal);\n    vec3 V = normalize(cc_cameraPos.xyz - position);\n    float NV = max(abs(dot(N, V)), 0.0);\n    specular = BRDFApprox(specular, s.roughness, NV);\n    vec3 finalColor = vec3(0.0);\n    int numLights = CC_PIPELINE_TYPE == 0 ? LIGHTS_PER_PASS : int(cc_lightDir[0].w);\n    for (int i = 0; i < LIGHTS_PER_PASS; i++) {\n      if (i >= numLights) break;\n      vec3 SLU = cc_lightPos[i].xyz - position;\n      vec3 SL = normalize(SLU);\n      vec3 SH = normalize(SL + V);\n      float SNL = max(dot(N, SL), 0.0);\n      float SNH = max(dot(N, SH), 0.0);\n      float distSqr = dot(SLU, SLU);\n      float litRadius = cc_lightSizeRangeAngle[i].x;\n      float litRadiusSqr = litRadius * litRadius;\n      float illum = litRadiusSqr / max(litRadiusSqr, distSqr);\n      float attRadiusSqrInv = 1.0 / max(cc_lightSizeRangeAngle[i].y, 0.01);\n      attRadiusSqrInv *= attRadiusSqrInv;\n      float att = GetDistAtt(distSqr, attRadiusSqrInv);\n      vec3 lspec = specular * CalcSpecular(s.roughness, SNH, SH, N);\n      if (cc_lightPos[i].w > 0.0) {\n        float cosInner = max(dot(-cc_lightDir[i].xyz, SL), 0.01);\n        float cosOuter = cc_lightSizeRangeAngle[i].z;\n        float litAngleScale = 1.0 / max(0.001, cosInner - cosOuter);\n        float litAngleOffset = -cosOuter * litAngleScale;\n        att *= GetAngleAtt(SL, -cc_lightDir[i].xyz, litAngleScale, litAngleOffset);\n      }\n      vec3 lightColor = cc_lightColor[i].rgb;\n      float shadow = 1.0;\n      #if CC_RECEIVE_SHADOW\n        if (cc_lightPos[i].w > 0.0 && cc_lightSizeRangeAngle[i].w > 0.0) {\n          shadow = CCSpotShadowFactorBase(shadowPos, position, s.shadowBias);\n        }\n      #endif\n      lightColor *= shadow;\n      finalColor += SNL * lightColor * cc_lightColor[i].w * illum * att * (diffuseContrib + lspec);\n    }\n    return vec4(finalColor, 0.0);\n  }\n  #endif\n  #if CC_ENABLE_CLUSTERED_LIGHT_CULLING == 1\n  layout(set = 1, binding = 7) readonly buffer b_ccLightsBuffer { vec4 b_ccLights[]; };\n  layout(set = 1, binding = 8) readonly buffer b_clusterLightIndicesBuffer { uint b_clusterLightIndices[]; };\n  layout(set = 1, binding = 9) readonly buffer b_clusterLightGridBuffer { uvec4 b_clusterLightGrid[]; };\n  struct CCLight\n  {\n    vec4 cc_lightPos;\n    vec4 cc_lightColor;\n    vec4 cc_lightSizeRangeAngle;\n    vec4 cc_lightDir;\n  };\n  struct Cluster\n  {\n    vec3 minBounds;\n    vec3 maxBounds;\n  };\n  struct LightGrid\n  {\n    uint offset;\n    uint ccLights;\n  };\n  CCLight getCCLight(uint i)\n  {\n    CCLight light;\n    light.cc_lightPos = b_ccLights[4u * i + 0u];\n    light.cc_lightColor = b_ccLights[4u * i + 1u];\n    light.cc_lightSizeRangeAngle = b_ccLights[4u * i + 2u];\n    light.cc_lightDir = b_ccLights[4u * i + 3u];\n    return light;\n  }\n  LightGrid getLightGrid(uint cluster)\n  {\n    uvec4 gridvec = b_clusterLightGrid[cluster];\n    LightGrid grid;\n    grid.offset = gridvec.x;\n    grid.ccLights = gridvec.y;\n    return grid;\n  }\n  uint getGridLightIndex(uint start, uint offset)\n  {\n    return b_clusterLightIndices[start + offset];\n  }\n  uint getClusterZIndex(vec4 worldPos)\n  {\n    float scale = float(24) / log(cc_nearFar.y / cc_nearFar.x);\n    float bias = -(float(24) * log(cc_nearFar.x) / log(cc_nearFar.y / cc_nearFar.x));\n    float eyeDepth = -(cc_matView * worldPos).z;\n    uint zIndex = uint(max(log(eyeDepth) * scale + bias, 0.0));\n    return zIndex;\n  }\n  uint getClusterIndex(vec4 fragCoord, vec4 worldPos)\n  {\n    uint zIndex = getClusterZIndex(worldPos);\n    float clusterSizeX = ceil(cc_viewPort.z / float(16));\n    float clusterSizeY = ceil(cc_viewPort.w / float(8));\n    uvec3 indices = uvec3(uvec2(fragCoord.xy / vec2(clusterSizeX, clusterSizeY)), zIndex);\n    uint cluster = (16u * 8u) * indices.z + 16u * indices.y + indices.x;\n    return cluster;\n  }\n  vec4 CCClusterShadingAdditive (StandardSurface s, vec4 shadowPos) {\n    vec3 diffuse = s.albedo.rgb * (1.0 - s.metallic);\n    vec3 specular = mix(vec3(0.04), s.albedo.rgb, s.metallic);\n    vec3 diffuseContrib = diffuse / PI;\n    vec3 position;\n    #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\n    position = unpackHighpData(s.position, s.position_fract_part);\n    #else\n    position = s.position;\n    #endif\n    vec3 N = normalize(s.normal);\n    vec3 V = normalize(cc_cameraPos.xyz - position);\n    float NV = max(abs(dot(N, V)), 0.001);\n    specular = BRDFApprox(specular, s.roughness, NV);\n    vec3 finalColor = vec3(0.0);\n    uint cluster = getClusterIndex(gl_FragCoord, vec4(position, 1.0));\n    LightGrid grid = getLightGrid(cluster);\n    uint numLights = grid.ccLights;\n    for (uint i = 0u; i < 100u; i++) {\n      if (i >= numLights) break;\n      uint lightIndex = getGridLightIndex(grid.offset, i);\n      CCLight light = getCCLight(lightIndex);\n      vec3 SLU = light.cc_lightPos.xyz - position;\n      vec3 SL = normalize(SLU);\n      vec3 SH = normalize(SL + V);\n      float SNL = max(dot(N, SL), 0.001);\n      float SNH = max(dot(N, SH), 0.0);\n      float distSqr = dot(SLU, SLU);\n      float litRadius = light.cc_lightSizeRangeAngle.x;\n      float litRadiusSqr = litRadius * litRadius;\n      float illum = PI * (litRadiusSqr / max(litRadiusSqr , distSqr));\n      float attRadiusSqrInv = 1.0 / max(light.cc_lightSizeRangeAngle.y, 0.01);\n      attRadiusSqrInv *= attRadiusSqrInv;\n      float att = GetDistAtt(distSqr, attRadiusSqrInv);\n      vec3 lspec = specular * CalcSpecular(s.roughness, SNH, SH, N);\n      if (light.cc_lightPos.w > 0.0) {\n        float cosInner = max(dot(-light.cc_lightDir.xyz, SL), 0.01);\n        float cosOuter = light.cc_lightSizeRangeAngle.z;\n        float litAngleScale = 1.0 / max(0.001, cosInner - cosOuter);\n        float litAngleOffset = -cosOuter * litAngleScale;\n        att *= GetAngleAtt(SL, -light.cc_lightDir.xyz, litAngleScale, litAngleOffset);\n      }\n      vec3 lightColor = light.cc_lightColor.rgb;\n      float shadow = 1.0;\n      #if CC_RECEIVE_SHADOW\n        if (light.cc_lightPos.w > 0.0) {\n          shadow = CCSpotShadowFactorBase(shadowPos, position, s.shadowBias);\n        }\n      #endif\n      lightColor *= shadow;\n      finalColor += SNL * lightColor * light.cc_lightColor.w * illum * att * (diffuseContrib + lspec);\n    }\n    return vec4(finalColor, 0.0);\n  }\n  #endif\n  layout(location = 0) out vec4 fragColorX;\n  void main () {\n    StandardSurface s; surf(s);\n    #if CC_ENABLE_CLUSTERED_LIGHT_CULLING == 1\n    vec4 color = CCClusterShadingAdditive(s, v_shadowPos);\n    #else\n    vec4 color = CCStandardShadingAdditive(s, v_shadowPos);\n    #endif\n    fragColorX = CCFragOutput(color);\n  }\n#elif (CC_PIPELINE_TYPE == 0 || CC_FORCE_FORWARD_SHADING)\n  layout(location = 0) out vec4 fragColorX;\n  void main () {\n    StandardSurface s; surf(s);\n    vec4 color = CCStandardShadingBase(s, v_shadowPos);\n    CC_APPLY_FOG(color, s.position.xyz);\n    fragColorX = CCFragOutput(color);\n  }\n#elif CC_PIPELINE_TYPE == 1\n  vec2 signNotZero(vec2 v) {\n    return vec2((v.x >= 0.0) ? +1.0 : -1.0, (v.y >= 0.0) ? +1.0 : -1.0);\n  }\n  vec2 float32x3_to_oct(in vec3 v) {\n    vec2 p = v.xy * (1.0 / (abs(v.x) + abs(v.y) + abs(v.z)));\n    return (v.z <= 0.0) ? ((1.0 - abs(p.yx)) * signNotZero(p)) : p;\n  }\n  layout(location = 0) out vec4 fragColor0;\n  layout(location = 1) out vec4 fragColor1;\n  layout(location = 2) out vec4 fragColor2;\n  void main () {\n    StandardSurface s; surf(s);\n    fragColor0 = s.albedo;\n    fragColor1 = vec4(float32x3_to_oct(s.normal), s.roughness, s.metallic);\n    fragColor2 = vec4(s.emissive, s.occlusion);\n  }\n#endif"},"glsl3":{"vert":"\nprecision highp float;\n#define QUATER_PI         0.78539816340\n#define HALF_PI           1.57079632679\n#define PI                3.14159265359\n#define PI2               6.28318530718\n#define PI4               12.5663706144\n#define INV_QUATER_PI     1.27323954474\n#define INV_HALF_PI       0.63661977237\n#define INV_PI            0.31830988618\n#define INV_PI2           0.15915494309\n#define INV_PI4           0.07957747155\n#define EPSILON           1e-6\n#define EPSILON_LOWP      1e-4\n#define LOG2              1.442695\n#define EXP_VALUE         2.71828183f\n#define FP_MAX            65504.0\n#define FP_SCALE          0.0009765625\n#define FP_SCALE_INV      1024.0\n#define GRAY_VECTOR       vec3(0.299, 0.587, 0.114)\nhighp float decode32 (highp vec4 rgba) {\n  rgba = rgba * 255.0;\n  highp float Sign = 1.0 - (step(128.0, (rgba[3]) + 0.5)) * 2.0;\n  highp float Exponent = 2.0 * (mod(float(int((rgba[3]) + 0.5)), 128.0)) + (step(128.0, (rgba[2]) + 0.5)) - 127.0;\n  highp float Mantissa = (mod(float(int((rgba[2]) + 0.5)), 128.0)) * 65536.0 + rgba[1] * 256.0 + rgba[0] + 8388608.0;\n  return Sign * exp2(Exponent - 23.0) * Mantissa;\n}\nstruct StandardVertInput {\n  highp vec4 position;\n  vec3 normal;\n  vec4 tangent;\n};\nin vec3 a_position;\nin vec3 a_normal;\nin vec2 a_texCoord;\nin vec4 a_tangent;\n#if CC_USE_SKINNING\n    in vec4 a_joints;\n  in vec4 a_weights;\n#endif\n#if USE_INSTANCING\n  #if CC_USE_BAKED_ANIMATION\n    in highp vec4 a_jointAnimInfo;\n  #endif\n  in vec4 a_matWorld0;\n  in vec4 a_matWorld1;\n  in vec4 a_matWorld2;\n  #if CC_USE_LIGHTMAP\n    in vec4 a_lightingMapUVParam;\n  #endif\n  #if CC_RECEIVE_SHADOW\n    in vec2 a_localShadowBias;\n  #endif\n#elif USE_BATCHING\n  in float a_dyn_batch_id;\n#endif\n#if CC_USE_MORPH\n    in float a_vertexId;\n    int getVertexId() {\n      return int(a_vertexId);\n    }\n#endif\n#if CC_USE_MORPH\n  layout(std140) uniform CCMorph {\n    vec4 cc_displacementWeights[15];\n    vec4 cc_displacementTextureInfo;\n  };\n  vec2 getPixelLocation(vec2 textureResolution, int pixelIndex) {\n    float pixelIndexF = float(pixelIndex);\n    float x = mod(pixelIndexF, textureResolution.x);\n    float y = floor(pixelIndexF / textureResolution.x);\n    return vec2(x, y);\n  }\n  vec2 getPixelCoordFromLocation(vec2 location, vec2 textureResolution) {\n    return (vec2(location.x, location.y) + .5) / textureResolution;\n  }\n  #if CC_DEVICE_SUPPORT_FLOAT_TEXTURE\n      vec4 fetchVec3ArrayFromTexture(sampler2D tex, int pixelIndex) {\n        ivec2 texSize = textureSize(tex, 0);\n        return texelFetch(tex, ivec2(pixelIndex % texSize.x, pixelIndex / texSize.x), 0);\n      }\n  #else\n    vec4 fetchVec3ArrayFromTexture(sampler2D tex, int elementIndex) {\n      int pixelIndex = elementIndex * 4;\n      vec2 location = getPixelLocation(cc_displacementTextureInfo.xy, pixelIndex);\n      vec2 x = getPixelCoordFromLocation(location + vec2(0.0, 0.0), cc_displacementTextureInfo.xy);\n      vec2 y = getPixelCoordFromLocation(location + vec2(1.0, 0.0), cc_displacementTextureInfo.xy);\n      vec2 z = getPixelCoordFromLocation(location + vec2(2.0, 0.0), cc_displacementTextureInfo.xy);\n      return vec4(\n        decode32(texture(tex, x)),\n        decode32(texture(tex, y)),\n        decode32(texture(tex, z)),\n        1.0\n      );\n    }\n  #endif\n  float getDisplacementWeight(int index) {\n    int quot = index / 4;\n    int remainder = index - quot * 4;\n    if (remainder == 0) {\n      return cc_displacementWeights[quot].x;\n    } else if (remainder == 1) {\n      return cc_displacementWeights[quot].y;\n    } else if (remainder == 2) {\n      return cc_displacementWeights[quot].z;\n    } else {\n      return cc_displacementWeights[quot].w;\n    }\n  }\n  vec3 getVec3DisplacementFromTexture(sampler2D tex, int vertexIndex) {\n  #if CC_MORPH_PRECOMPUTED\n    return fetchVec3ArrayFromTexture(tex, vertexIndex).rgb;\n  #else\n    vec3 result = vec3(0, 0, 0);\n    int nVertices = int(cc_displacementTextureInfo.z);\n    for (int iTarget = 0; iTarget < CC_MORPH_TARGET_COUNT; ++iTarget) {\n      result += (fetchVec3ArrayFromTexture(tex, nVertices * iTarget + vertexIndex).rgb * getDisplacementWeight(iTarget));\n    }\n    return result;\n  #endif\n  }\n  #if CC_MORPH_TARGET_HAS_POSITION\n    uniform sampler2D cc_PositionDisplacements;\n    vec3 getPositionDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_PositionDisplacements, vertexId);\n    }\n  #endif\n  #if CC_MORPH_TARGET_HAS_NORMAL\n    uniform sampler2D cc_NormalDisplacements;\n    vec3 getNormalDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_NormalDisplacements, vertexId);\n    }\n  #endif\n  #if CC_MORPH_TARGET_HAS_TANGENT\n    uniform sampler2D cc_TangentDisplacements;\n    vec3 getTangentDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_TangentDisplacements, vertexId);\n    }\n  #endif\n  void applyMorph (inout vec4 position, inout vec3 normal, inout vec4 tangent) {\n    int vertexId = getVertexId();\n  #if CC_MORPH_TARGET_HAS_POSITION\n    position.xyz = position.xyz + getPositionDisplacement(vertexId);\n  #endif\n  #if CC_MORPH_TARGET_HAS_NORMAL\n    normal.xyz = normal.xyz + getNormalDisplacement(vertexId);\n  #endif\n  #if CC_MORPH_TARGET_HAS_TANGENT\n    tangent.xyz = tangent.xyz + getTangentDisplacement(vertexId);\n  #endif\n  }\n  void applyMorph (inout vec4 position) {\n  #if CC_MORPH_TARGET_HAS_POSITION\n    position.xyz = position.xyz + getPositionDisplacement(getVertexId());\n  #endif\n  }\n#endif\n#if CC_USE_SKINNING\n  #if CC_USE_BAKED_ANIMATION\n    layout(std140) uniform CCSkinningTexture {\n      highp vec4 cc_jointTextureInfo;\n    };\n    layout(std140) uniform CCSkinningAnimation {\n      highp vec4 cc_jointAnimInfo;\n    };\n    uniform highp sampler2D cc_jointTexture;\n    void CCGetJointTextureCoords(float pixelsPerJoint, float jointIdx, out highp float x, out highp float y, out highp float invSize)\n    {\n      #if USE_INSTANCING\n        highp float temp = pixelsPerJoint * (a_jointAnimInfo.x * a_jointAnimInfo.y + jointIdx) + a_jointAnimInfo.z;\n      #else\n        highp float temp = pixelsPerJoint * (cc_jointAnimInfo.x * cc_jointTextureInfo.y + jointIdx) + cc_jointTextureInfo.z;\n      #endif\n      invSize = cc_jointTextureInfo.w;\n      highp float tempY = floor(temp * invSize);\n      x = floor(temp - tempY * cc_jointTextureInfo.x);\n      y = (tempY + 0.5) * invSize;\n    }\n  #else\n    layout(std140) uniform CCSkinning {\n      highp vec4 cc_joints[30 * 3];\n    };\n  #endif\n  #if CC_USE_BAKED_ANIMATION\n    #if CC_DEVICE_SUPPORT_FLOAT_TEXTURE\n      mat4 getJointMatrix (float i) {\n        highp float x, y, invSize;\n        CCGetJointTextureCoords(3.0, i, x, y, invSize);\n        vec4 v1 = texture(cc_jointTexture, vec2((x + 0.5) * invSize, y));\n        vec4 v2 = texture(cc_jointTexture, vec2((x + 1.5) * invSize, y));\n        vec4 v3 = texture(cc_jointTexture, vec2((x + 2.5) * invSize, y));\n        return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n      }\n    #else\n      mat4 getJointMatrix (float i) {\n        highp float x, y, invSize;\n        CCGetJointTextureCoords(12.0, i, x, y, invSize);\n        vec4 v1 = vec4(\n          decode32(texture(cc_jointTexture, vec2((x + 0.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 1.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 2.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 3.5) * invSize, y)))\n        );\n        vec4 v2 = vec4(\n          decode32(texture(cc_jointTexture, vec2((x + 4.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 5.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 6.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 7.5) * invSize, y)))\n        );\n        vec4 v3 = vec4(\n          decode32(texture(cc_jointTexture, vec2((x + 8.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 9.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 10.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 11.5) * invSize, y)))\n        );\n        return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n      }\n    #endif\n  #else\n    mat4 getJointMatrix (float i) {\n      int idx = int(i);\n      vec4 v1 = cc_joints[idx * 3];\n      vec4 v2 = cc_joints[idx * 3 + 1];\n      vec4 v3 = cc_joints[idx * 3 + 2];\n      return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n    }\n  #endif\n  mat4 skinMatrix () {\n    vec4 joints = vec4(a_joints);\n    return getJointMatrix(joints.x) * a_weights.x\n         + getJointMatrix(joints.y) * a_weights.y\n         + getJointMatrix(joints.z) * a_weights.z\n         + getJointMatrix(joints.w) * a_weights.w;\n  }\n  void CCSkin (inout vec4 position) {\n    mat4 m = skinMatrix();\n    position = m * position;\n  }\n  void CCSkin (inout vec4 position, inout vec3 normal, inout vec4 tangent) {\n    mat4 m = skinMatrix();\n    position = m * position;\n    normal = (m * vec4(normal, 0.0)).xyz;\n    tangent.xyz = (m * vec4(tangent.xyz, 0.0)).xyz;\n  }\n#endif\nvoid CCVertInput(inout StandardVertInput In)\n{\n    In.position = vec4(a_position, 1.0);\n    In.normal = a_normal;\n    In.tangent = a_tangent;\n  #if CC_USE_MORPH\n    applyMorph(In.position, In.normal, In.tangent);\n  #endif\n  #if CC_USE_SKINNING\n    CCSkin(In.position, In.normal, In.tangent);\n  #endif\n}\nlayout(std140) uniform CCGlobal {\n  highp   vec4 cc_time;\n  mediump vec4 cc_screenSize;\n  mediump vec4 cc_nativeSize;\n};\nlayout(std140) uniform CCCamera {\n  highp   mat4 cc_matView;\n  highp   mat4 cc_matViewInv;\n  highp   mat4 cc_matProj;\n  highp   mat4 cc_matProjInv;\n  highp   mat4 cc_matViewProj;\n  highp   mat4 cc_matViewProjInv;\n  highp   vec4 cc_cameraPos;\n  mediump vec4 cc_screenScale;\n  mediump vec4 cc_exposure;\n  mediump vec4 cc_mainLitDir;\n  mediump vec4 cc_mainLitColor;\n  mediump vec4 cc_ambientSky;\n  mediump vec4 cc_ambientGround;\n  mediump vec4 cc_fogColor;\n  mediump vec4 cc_fogBase;\n  mediump vec4 cc_fogAdd;\n  mediump vec4 cc_nearFar;\n  mediump vec4 cc_viewPort;\n};\n#if !USE_INSTANCING\n  #if USE_BATCHING\n    layout(std140) uniform CCLocalBatched {\n      highp mat4 cc_matWorlds[10];\n    };\n  #else\n    layout(std140) uniform CCLocal {\n      highp mat4 cc_matWorld;\n      highp mat4 cc_matWorldIT;\n      highp vec4 cc_lightingMapUVParam;\n      highp vec4 cc_localShadowBias;\n    };\n  #endif\n#endif\nvoid CCGetWorldMatrixFull(out mat4 matWorld, out mat4 matWorldIT)\n{\n  #if USE_INSTANCING\n    matWorld = mat4(\n      vec4(a_matWorld0.xyz, 0.0),\n      vec4(a_matWorld1.xyz, 0.0),\n      vec4(a_matWorld2.xyz, 0.0),\n      vec4(a_matWorld0.w, a_matWorld1.w, a_matWorld2.w, 1.0)\n    );\n    matWorldIT = matWorld;\n  #elif USE_BATCHING\n    matWorld = cc_matWorlds[int(a_dyn_batch_id)];\n    matWorldIT = matWorld;\n  #else\n    matWorld = cc_matWorld;\n    matWorldIT = cc_matWorldIT;\n  #endif\n}\nlayout(std140) uniform Constants {\n  vec4 tilingOffset;\n  vec4 albedo;\n  vec4 albedoScaleAndCutoff;\n  vec4 pbrParams;\n  vec4 emissive;\n  vec4 emissiveScaleParam;\n};\nfloat LinearFog(vec4 pos) {\n  vec4 wPos = pos;\n  float cam_dis = distance(cc_cameraPos, wPos);\n  float fogStart = cc_fogBase.x;\n  float fogEnd = cc_fogBase.y;\n  return clamp((fogEnd - cam_dis) / (fogEnd - fogStart), 0., 1.);\n}\nfloat ExpFog(vec4 pos) {\n  vec4 wPos = pos;\n  float fogAtten = cc_fogAdd.z;\n  float fogStart = cc_fogBase.x;\n  float fogDensity = cc_fogBase.z;\n  float cam_dis = max(distance(cc_cameraPos, wPos) - fogStart, 0.0) / fogAtten * 4.;\n  float f = exp(-cam_dis * fogDensity);\n  return f;\n}\nfloat ExpSquaredFog(vec4 pos) {\n  vec4 wPos = pos;\n  float fogAtten = cc_fogAdd.z;\n  float fogStart = cc_fogBase.x;\n  float fogDensity = cc_fogBase.z;\n  float cam_dis = max(distance(cc_cameraPos, wPos) - fogStart, 0.0) / fogAtten * 4.;\n  float f = exp(-cam_dis * cam_dis * fogDensity * fogDensity);\n  return f;\n}\nfloat LayeredFog(vec4 pos) {\n  vec4 wPos = pos;\n  float fogAtten = cc_fogAdd.z;\n  float _FogTop = cc_fogAdd.x;\n  float _FogRange = cc_fogAdd.y;\n  vec3 camWorldProj = cc_cameraPos.xyz;\n  camWorldProj.y = 0.;\n  vec3 worldPosProj = wPos.xyz;\n  worldPosProj.y = 0.;\n  float fDeltaD = distance(worldPosProj, camWorldProj) / fogAtten * 2.0;\n  float fDeltaY, fDensityIntegral;\n  if (cc_cameraPos.y > _FogTop) {\n    if (wPos.y < _FogTop) {\n      fDeltaY = (_FogTop - wPos.y) / _FogRange * 2.0;\n      fDensityIntegral = fDeltaY * fDeltaY * 0.5;\n    } else {\n      fDeltaY = 0.;\n      fDensityIntegral = 0.;\n    }\n  } else {\n    if (wPos.y < _FogTop) {\n      float fDeltaA = (_FogTop - cc_cameraPos.y) / _FogRange * 2.;\n      float fDeltaB = (_FogTop - wPos.y) / _FogRange * 2.;\n      fDeltaY = abs(fDeltaA - fDeltaB);\n      fDensityIntegral = abs((fDeltaA * fDeltaA * 0.5) - (fDeltaB * fDeltaB * 0.5));\n    } else {\n      fDeltaY = abs(_FogTop - cc_cameraPos.y) / _FogRange * 2.;\n      fDensityIntegral = abs(fDeltaY * fDeltaY * 0.5);\n    }\n  }\n  float fDensity;\n  if (fDeltaY != 0.) {\n    fDensity = (sqrt(1.0 + ((fDeltaD / fDeltaY) * (fDeltaD / fDeltaY)))) * fDensityIntegral;\n  } else {\n    fDensity = 0.;\n  }\n  float f = exp(-fDensity);\n  return f;\n}\nvoid CC_TRANSFER_FOG_BASE(vec4 pos, out float factor)\n{\n  #if CC_USE_FOG == 0\n\tfactor = LinearFog(pos);\n  #elif CC_USE_FOG == 1\n    factor = ExpFog(pos);\n  #elif CC_USE_FOG == 2\n    factor = ExpSquaredFog(pos);\n  #elif CC_USE_FOG == 3\n    factor = LayeredFog(pos);\n  #else\n    factor = 1.0;\n  #endif\n}\n#if !CC_USE_ACCURATE_FOG\nout float v_fog_factor;\n#endif\nvoid CC_TRANSFER_FOG(vec4 pos) {\n#if !CC_USE_ACCURATE_FOG\n    CC_TRANSFER_FOG_BASE(pos, v_fog_factor);\n#endif\n}\nout highp vec4 v_shadowPos;\nlayout(std140) uniform CCShadow {\n  highp mat4 cc_matLightPlaneProj;\n  highp mat4 cc_matLightView;\n  highp mat4 cc_matLightViewProj;\n  highp vec4 cc_shadowInvProjDepthInfo;\n  highp vec4 cc_shadowProjDepthInfo;\n  highp vec4 cc_shadowProjInfo;\n  mediump vec4 cc_shadowNFLSInfo;\n  mediump vec4 cc_shadowWHPBInfo;\n  mediump vec4 cc_shadowLPNNInfo;\n  lowp vec4 cc_shadowColor;\n  mediump vec4 cc_planarNDInfo;\n};\n#if CC_RECEIVE_SHADOW\n  uniform highp sampler2D cc_shadowMap;\n  uniform highp sampler2D cc_spotLightingMap;\n#endif\n#if CC_RECEIVE_SHADOW\nvec2 CCGetShadowBias()\n{\n  #if USE_INSTANCING\n    return vec2(a_localShadowBias.x + cc_shadowWHPBInfo.w, a_localShadowBias.y + cc_shadowLPNNInfo.z);\n  #elif !USE_BATCHING\n    return vec2(cc_localShadowBias.x + cc_shadowWHPBInfo.w, cc_localShadowBias.y + cc_shadowLPNNInfo.z);\n  #else\n    return vec2(cc_shadowWHPBInfo.w, cc_shadowLPNNInfo.z);\n  #endif\n}\n#endif\n#if USE_VERTEX_COLOR\n  in vec4 a_color;\n  out lowp vec4 v_color;\n#endif\nout vec3 v_position;\nout mediump vec3 v_normal;\nout vec2 v_uv;\n#if HAS_SECOND_UV\n  out mediump vec2 v_uv1;\n#endif\n#if CC_RECEIVE_SHADOW\n  out mediump vec2 v_shadowBias;\n#endif\n#if USE_NORMAL_MAP\n  out mediump vec4 v_tangent;\n#endif\n#if HAS_SECOND_UV || CC_USE_LIGHTMAP\n  in vec2 a_texCoord1;\n#endif\n#if CC_USE_LIGHTMAP && !USE_BATCHING && !CC_FORWARD_ADD\n  out vec3 v_luv;\n  void CCLightingMapCaclUV()\n  {\n  #if !USE_INSTANCING\n    v_luv.xy = cc_lightingMapUVParam.xy + a_texCoord1 * cc_lightingMapUVParam.z;\n    v_luv.z = cc_lightingMapUVParam.w;\n  #else\n    v_luv.xy = a_lightingMapUVParam.xy + a_texCoord1 * a_lightingMapUVParam.z;\n    v_luv.z = a_lightingMapUVParam.w;\n  #endif\n  }\n#endif\nvoid main () {\n  StandardVertInput In;\n  CCVertInput(In);\n  mat4 matWorld, matWorldIT;\n  CCGetWorldMatrixFull(matWorld, matWorldIT);\n  vec4 pos = matWorld * In.position;\n  v_position = pos.xyz;\n  v_normal = normalize((matWorldIT * vec4(In.normal, 0.0)).xyz);\n  #if CC_RECEIVE_SHADOW\n    v_shadowBias = CCGetShadowBias();\n  #endif\n  #if USE_TWOSIDE\n    vec3 viewDirect = normalize(cc_cameraPos.xyz - v_position);\n    v_normal *= dot(v_normal, viewDirect) < 0.0 ? -1.0 : 1.0;\n  #endif\n  #if USE_NORMAL_MAP\n    v_tangent.xyz = normalize((matWorld * vec4(In.tangent.xyz, 0.0)).xyz);\n    v_tangent.w = In.tangent.w;\n  #endif\n  v_uv = a_texCoord * tilingOffset.xy + tilingOffset.zw;\n  #if SAMPLE_FROM_RT\n    v_uv = cc_cameraPos.w > 1.0 ? vec2(v_uv.x, 1.0 - v_uv.y) : v_uv;\n  #endif\n  #if HAS_SECOND_UV\n    v_uv1 = a_texCoord1 * tilingOffset.xy + tilingOffset.zw;\n    #if SAMPLE_FROM_RT\n      v_uv1 = cc_cameraPos.w > 1.0 ? vec2(v_uv1.x, 1.0 - v_uv1.y) : v_uv1;\n    #endif\n  #endif\n  #if USE_VERTEX_COLOR\n    v_color = a_color;\n  #endif\n  CC_TRANSFER_FOG(pos);\n  v_shadowPos = cc_matLightViewProj * pos;\n  #if CC_USE_LIGHTMAP && !USE_BATCHING && !CC_FORWARD_ADD\n    CCLightingMapCaclUV();\n  #endif\n  gl_Position = cc_matProj * (cc_matView * matWorld) * In.position;\n}","frag":"\nprecision highp float;\nlayout(std140) uniform CCGlobal {\n  highp   vec4 cc_time;\n  mediump vec4 cc_screenSize;\n  mediump vec4 cc_nativeSize;\n};\nlayout(std140) uniform CCCamera {\n  highp   mat4 cc_matView;\n  highp   mat4 cc_matViewInv;\n  highp   mat4 cc_matProj;\n  highp   mat4 cc_matProjInv;\n  highp   mat4 cc_matViewProj;\n  highp   mat4 cc_matViewProjInv;\n  highp   vec4 cc_cameraPos;\n  mediump vec4 cc_screenScale;\n  mediump vec4 cc_exposure;\n  mediump vec4 cc_mainLitDir;\n  mediump vec4 cc_mainLitColor;\n  mediump vec4 cc_ambientSky;\n  mediump vec4 cc_ambientGround;\n  mediump vec4 cc_fogColor;\n  mediump vec4 cc_fogBase;\n  mediump vec4 cc_fogAdd;\n  mediump vec4 cc_nearFar;\n  mediump vec4 cc_viewPort;\n};\nlayout(std140) uniform Constants {\n  vec4 tilingOffset;\n  vec4 albedo;\n  vec4 albedoScaleAndCutoff;\n  vec4 pbrParams;\n  vec4 emissive;\n  vec4 emissiveScaleParam;\n};\nfloat LinearFog(vec4 pos) {\n  vec4 wPos = pos;\n  float cam_dis = distance(cc_cameraPos, wPos);\n  float fogStart = cc_fogBase.x;\n  float fogEnd = cc_fogBase.y;\n  return clamp((fogEnd - cam_dis) / (fogEnd - fogStart), 0., 1.);\n}\nfloat ExpFog(vec4 pos) {\n  vec4 wPos = pos;\n  float fogAtten = cc_fogAdd.z;\n  float fogStart = cc_fogBase.x;\n  float fogDensity = cc_fogBase.z;\n  float cam_dis = max(distance(cc_cameraPos, wPos) - fogStart, 0.0) / fogAtten * 4.;\n  float f = exp(-cam_dis * fogDensity);\n  return f;\n}\nfloat ExpSquaredFog(vec4 pos) {\n  vec4 wPos = pos;\n  float fogAtten = cc_fogAdd.z;\n  float fogStart = cc_fogBase.x;\n  float fogDensity = cc_fogBase.z;\n  float cam_dis = max(distance(cc_cameraPos, wPos) - fogStart, 0.0) / fogAtten * 4.;\n  float f = exp(-cam_dis * cam_dis * fogDensity * fogDensity);\n  return f;\n}\nfloat LayeredFog(vec4 pos) {\n  vec4 wPos = pos;\n  float fogAtten = cc_fogAdd.z;\n  float _FogTop = cc_fogAdd.x;\n  float _FogRange = cc_fogAdd.y;\n  vec3 camWorldProj = cc_cameraPos.xyz;\n  camWorldProj.y = 0.;\n  vec3 worldPosProj = wPos.xyz;\n  worldPosProj.y = 0.;\n  float fDeltaD = distance(worldPosProj, camWorldProj) / fogAtten * 2.0;\n  float fDeltaY, fDensityIntegral;\n  if (cc_cameraPos.y > _FogTop) {\n    if (wPos.y < _FogTop) {\n      fDeltaY = (_FogTop - wPos.y) / _FogRange * 2.0;\n      fDensityIntegral = fDeltaY * fDeltaY * 0.5;\n    } else {\n      fDeltaY = 0.;\n      fDensityIntegral = 0.;\n    }\n  } else {\n    if (wPos.y < _FogTop) {\n      float fDeltaA = (_FogTop - cc_cameraPos.y) / _FogRange * 2.;\n      float fDeltaB = (_FogTop - wPos.y) / _FogRange * 2.;\n      fDeltaY = abs(fDeltaA - fDeltaB);\n      fDensityIntegral = abs((fDeltaA * fDeltaA * 0.5) - (fDeltaB * fDeltaB * 0.5));\n    } else {\n      fDeltaY = abs(_FogTop - cc_cameraPos.y) / _FogRange * 2.;\n      fDensityIntegral = abs(fDeltaY * fDeltaY * 0.5);\n    }\n  }\n  float fDensity;\n  if (fDeltaY != 0.) {\n    fDensity = (sqrt(1.0 + ((fDeltaD / fDeltaY) * (fDeltaD / fDeltaY)))) * fDensityIntegral;\n  } else {\n    fDensity = 0.;\n  }\n  float f = exp(-fDensity);\n  return f;\n}\nvoid CC_TRANSFER_FOG_BASE(vec4 pos, out float factor)\n{\n  #if CC_USE_FOG == 0\n\tfactor = LinearFog(pos);\n  #elif CC_USE_FOG == 1\n    factor = ExpFog(pos);\n  #elif CC_USE_FOG == 2\n    factor = ExpSquaredFog(pos);\n  #elif CC_USE_FOG == 3\n    factor = LayeredFog(pos);\n  #else\n    factor = 1.0;\n  #endif\n}\nvoid CC_APPLY_FOG_BASE(inout vec4 color, float factor) {\n  color = vec4(mix(cc_fogColor.rgb, color.rgb, factor), color.a);\n}\n#if !CC_USE_ACCURATE_FOG\nin float v_fog_factor;\n#endif\nvoid CC_APPLY_FOG(inout vec4 color) {\n#if !CC_USE_ACCURATE_FOG\n    CC_APPLY_FOG_BASE(color, v_fog_factor);\n#endif\n}\nvoid CC_APPLY_FOG(inout vec4 color, vec3 worldPos) {\n#if CC_USE_ACCURATE_FOG\n    float factor;\n    CC_TRANSFER_FOG_BASE(vec4(worldPos, 1.0), factor);\n#else\n    float factor = v_fog_factor;\n#endif\n    CC_APPLY_FOG_BASE(color, factor);\n}\n#define QUATER_PI         0.78539816340\n#define HALF_PI           1.57079632679\n#define PI                3.14159265359\n#define PI2               6.28318530718\n#define PI4               12.5663706144\n#define INV_QUATER_PI     1.27323954474\n#define INV_HALF_PI       0.63661977237\n#define INV_PI            0.31830988618\n#define INV_PI2           0.15915494309\n#define INV_PI4           0.07957747155\n#define EPSILON           1e-6\n#define EPSILON_LOWP      1e-4\n#define LOG2              1.442695\n#define EXP_VALUE         2.71828183f\n#define FP_MAX            65504.0\n#define FP_SCALE          0.0009765625\n#define FP_SCALE_INV      1024.0\n#define GRAY_VECTOR       vec3(0.299, 0.587, 0.114)\nvec3 SRGBToLinear (vec3 gamma) {\n  return gamma * gamma;\n}\nlayout(std140) uniform CCShadow {\n  highp mat4 cc_matLightPlaneProj;\n  highp mat4 cc_matLightView;\n  highp mat4 cc_matLightViewProj;\n  highp vec4 cc_shadowInvProjDepthInfo;\n  highp vec4 cc_shadowProjDepthInfo;\n  highp vec4 cc_shadowProjInfo;\n  mediump vec4 cc_shadowNFLSInfo;\n  mediump vec4 cc_shadowWHPBInfo;\n  mediump vec4 cc_shadowLPNNInfo;\n  lowp vec4 cc_shadowColor;\n  mediump vec4 cc_planarNDInfo;\n};\nhighp float unpackHighpData (float mainPart, float modPart) {\n  highp float data = mainPart;\n  return data + modPart;\n}\nvoid packHighpData (out float mainPart, out float modPart, highp float data) {\n  mainPart = fract(data);\n  modPart = data - mainPart;\n}\nhighp float unpackHighpData (float mainPart, float modPart, const float modValue) {\n  highp float data = mainPart * modValue;\n  return data + modPart * modValue;\n}\nvoid packHighpData (out float mainPart, out float modPart, highp float data, const float modValue) {\n  highp float divide = data / modValue;\n  mainPart = floor(divide);\n  modPart = (data - mainPart * modValue) / modValue;\n}\nhighp vec2 unpackHighpData (vec2 mainPart, vec2 modPart) {\n  highp vec2 data = mainPart;\n  return data + modPart;\n}\nvoid packHighpData (out vec2 mainPart, out vec2 modPart, highp vec2 data) {\n  mainPart = fract(data);\n  modPart = data - mainPart;\n}\nhighp vec2 unpackHighpData (vec2 mainPart, vec2 modPart, const float modValue) {\n  highp vec2 data = mainPart * modValue;\n  return data + modPart * modValue;\n}\nvoid packHighpData (out vec2 mainPart, out vec2 modPart, highp vec2 data, const float modValue) {\n  highp vec2 divide = data / modValue;\n  mainPart = floor(divide);\n  modPart = (data - mainPart * modValue) / modValue;\n}\nhighp vec3 unpackHighpData (vec3 mainPart, vec3 modPart) {\n  highp vec3 data = mainPart;\n  return data + modPart;\n}\nvoid packHighpData (out vec3 mainPart, out vec3 modPart, highp vec3 data) {\n  mainPart = fract(data);\n  modPart = data - mainPart;\n}\nhighp vec3 unpackHighpData (vec3 mainPart, vec3 modPart, const float modValue) {\n  highp vec3 data = mainPart * modValue;\n  return data + modPart * modValue;\n}\nvoid packHighpData (out vec3 mainPart, out vec3 modPart, highp vec3 data, const float modValue) {\n  highp vec3 divide = data / modValue;\n  mainPart = floor(divide);\n  modPart = (data - mainPart * modValue) / modValue;\n}\nhighp vec4 unpackHighpData (vec4 mainPart, vec4 modPart) {\n  highp vec4 data = mainPart;\n  return data + modPart;\n}\nvoid packHighpData (out vec4 mainPart, out vec4 modPart, highp vec4 data) {\n  mainPart = fract(data);\n  modPart = data - mainPart;\n}\nhighp vec4 unpackHighpData (vec4 mainPart, vec4 modPart, const float modValue) {\n  highp vec4 data = mainPart * modValue;\n  return data + modPart * modValue;\n}\nvoid packHighpData (out vec4 mainPart, out vec4 modPart, highp vec4 data, const float modValue) {\n  highp vec4 divide = data / modValue;\n  mainPart = floor(divide);\n  modPart = (data - mainPart * modValue) / modValue;\n}\nlayout(std140) uniform CCLocal {\n  highp mat4 cc_matWorld;\n  highp mat4 cc_matWorldIT;\n  highp vec4 cc_lightingMapUVParam;\n  highp vec4 cc_localShadowBias;\n};\nfloat CCGetLinearDepthFromViewSpace(vec3 viewPos) {\n  float dist = length(viewPos);\n  return (dist - cc_shadowNFLSInfo.x) / (cc_shadowNFLSInfo.y - cc_shadowNFLSInfo.x);\n}\nfloat CCGetLinearDepth(vec3 worldPos) {\n  vec4 viewStartPos = cc_matLightView * vec4(worldPos.xyz, 1.0);\n  return CCGetLinearDepthFromViewSpace(viewStartPos.xyz);\n}\n#if CC_RECEIVE_SHADOW\n  uniform highp sampler2D cc_shadowMap;\n  uniform highp sampler2D cc_spotLightingMap;\n  vec4 ApplyShadowDepthBias_FaceNormal(vec4 shadowPos, vec3 worldNormal, float normalBias)\n  {\n    vec4 newShadowPos = shadowPos;\n    if(normalBias > EPSILON_LOWP)\n    {\n      vec4 viewNormal = cc_matLightView * vec4(worldNormal, 0.0);\n      if(viewNormal.z < 0.1)\n        newShadowPos.xy += viewNormal.xy * cc_shadowProjInfo.xy * normalBias * clamp(viewNormal.z, 0.001, 0.1);\n    }\n    return newShadowPos;\n  }\n  vec4 ApplyShadowDepthBias_Perspective(vec4 shadowPos, float viewspaceDepthBias)\n  {\n    vec3 viewSpacePos;\n    viewSpacePos.xy = shadowPos.xy * cc_shadowProjInfo.zw;\n    viewSpacePos.z = shadowPos.z * cc_shadowInvProjDepthInfo.x + shadowPos.w * cc_shadowInvProjDepthInfo.y;\n    viewSpacePos.xyz += cc_shadowProjDepthInfo.z * normalize(viewSpacePos.xyz) * viewspaceDepthBias;\n    vec4 clipSpacePos;\n    clipSpacePos.xy = viewSpacePos.xy * cc_shadowProjInfo.xy;\n    clipSpacePos.zw = viewSpacePos.z * cc_shadowProjDepthInfo.xz + vec2(cc_shadowProjDepthInfo.y, 0.0);\n    if (cc_shadowNFLSInfo.z > EPSILON) {\n      clipSpacePos.z = CCGetLinearDepthFromViewSpace(viewSpacePos.xyz);\n      clipSpacePos.z = (clipSpacePos.z * 2.0 - 1.0) * clipSpacePos.w;\n    }\n    return clipSpacePos;\n  }\n  vec4 ApplyShadowDepthBias_Orthographic(vec4 shadowPos, float viewspaceDepthBias)\n  {\n    float coeffA = cc_shadowProjDepthInfo.x;\n    float coeffB = cc_shadowProjDepthInfo.y;\n    float viewSpacePos_z = (shadowPos.z - coeffB) / coeffA;\n    viewSpacePos_z += viewspaceDepthBias;\n    vec4 result = shadowPos;\n    result.z = viewSpacePos_z * coeffA + coeffB;\n    return result;\n  }\n  float CCGetShadowFactorHard (vec4 shadowPos, float bias) {\n    vec4 clipPosNew = ApplyShadowDepthBias_Orthographic(shadowPos, bias);\n    vec3 clipPos = clipPosNew.xyz / clipPosNew.w * 0.5 + 0.5;\n    if (clipPos.x < 0.0 || clipPos.x > 1.0 ||\n        clipPos.y < 0.0 || clipPos.y > 1.0 ||\n        clipPos.z < 0.0 || clipPos.z > 1.0) { return 1.0; }\n    clipPos.xy = cc_cameraPos.w == 1.0 ? vec2(clipPos.xy.x, 1.0 - clipPos.xy.y) : clipPos.xy;\n    float shadow = 0.0;\n    float closestDepth = 0.0;\n    if (cc_shadowLPNNInfo.y > EPSILON) {\n      closestDepth = dot(texture(cc_shadowMap, clipPos.xy), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0));\n    } else {\n      closestDepth = texture(cc_shadowMap, clipPos.xy).x;\n    }\n    shadow = step(clipPos.z, closestDepth);\n    return shadow;\n  }\n  float CCGetShadowFactorSoft (vec4 shadowPos, float bias) {\n    vec4 clipPosNew = ApplyShadowDepthBias_Orthographic(shadowPos, bias);\n    vec3 clipPos = clipPosNew.xyz / clipPosNew.w * 0.5 + 0.5;\n    if (clipPos.x < 0.0 || clipPos.x > 1.0 ||\n        clipPos.y < 0.0 || clipPos.y > 1.0 ||\n        clipPos.z < 0.0 || clipPos.z > 1.0) { return 1.0; }\n    clipPos.xy = cc_cameraPos.w == 1.0 ? vec2(clipPos.xy.x, 1.0 - clipPos.xy.y) : clipPos.xy;\n    float offsetDepth = clipPos.z;\n    vec2 mapSize = cc_shadowWHPBInfo.xy;\n    vec2 oneTap = 1.0 / mapSize;\n    vec2 clipPos_offset = clipPos.xy + oneTap;\n    float block0, block1, block2, block3;\n    if (cc_shadowLPNNInfo.y > EPSILON) {\n      block0 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos.x, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block1 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos_offset.x, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block2 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos.x, clipPos_offset.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block3 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos_offset.x, clipPos_offset.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n    } else {\n      block0 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos.x, clipPos.y)).x);\n      block1 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos_offset.x, clipPos.y)).x);\n      block2 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos.x, clipPos_offset.y)).x);\n      block3 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos_offset.x, clipPos_offset.y)).x);\n    }\n    float coefX   = mod(clipPos.x, oneTap.x) * mapSize.x;\n    float resultX = mix(block0, block1, coefX);\n    float resultY = mix(block2, block3, coefX);\n    float coefY   = mod(clipPos.y, oneTap.y) * mapSize.y;\n    return mix(resultX, resultY, coefY);\n  }\n  float CCGetShadowFactorSoft2X (vec4 shadowPos, float bias) {\n    vec4 clipPosNew = ApplyShadowDepthBias_Orthographic(shadowPos, bias);\n    vec3 clipPos = clipPosNew.xyz / clipPosNew.w * 0.5 + 0.5;\n    if (clipPos.x < 0.0 || clipPos.x > 1.0 ||\n        clipPos.y < 0.0 || clipPos.y > 1.0 ||\n        clipPos.z < 0.0 || clipPos.z > 1.0) { return 1.0; }\n    clipPos.xy = cc_cameraPos.w == 1.0 ? vec2(clipPos.xy.x, 1.0 - clipPos.xy.y) : clipPos.xy;\n    float offsetDepth = clipPos.z;\n    vec2 mapSize = cc_shadowWHPBInfo.xy;\n    vec2 oneTap = 1.0 / mapSize;\n    float clipPos_offset_L = clipPos.x - oneTap.x;\n    float clipPos_offset_R = clipPos.x + oneTap.x;\n    float clipPos_offset_U = clipPos.y - oneTap.y;\n    float clipPos_offset_D = clipPos.y + oneTap.y;\n    float block0, block1, block2, block3, block4, block5, block6, block7, block8;\n    if (cc_shadowLPNNInfo.y > EPSILON) {\n      block0 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos_offset_L, clipPos_offset_U)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block1 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos.x, clipPos_offset_U)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block2 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos_offset_R, clipPos_offset_U)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block3 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos_offset_L, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block4 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos.x, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block5 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos_offset_R, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block6 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos_offset_L, clipPos_offset_D)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block7 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos.x, clipPos_offset_D)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block8 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos_offset_R, clipPos_offset_D)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n    } else {\n      block0 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos_offset_L, clipPos_offset_U)).x);\n      block1 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos.x, clipPos_offset_U)).x);\n      block2 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos_offset_R, clipPos_offset_U)).x);\n      block3 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos_offset_L, clipPos.y)).x);\n      block4 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos.x, clipPos.y)).x);\n      block5 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos_offset_R, clipPos.y)).x);\n      block6 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos_offset_L, clipPos_offset_D)).x);\n      block7 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos.x, clipPos_offset_D)).x);\n      block8 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos_offset_R, clipPos_offset_D)).x);\n    }\n    float coefX = mod(clipPos.x, oneTap.x) * mapSize.x;\n    float coefY = mod(clipPos.y, oneTap.y) * mapSize.y;\n    float shadow = 0.0;\n    float resultX = mix(block0, block1, coefX);\n    float resultY = mix(block3, block4, coefX);\n    shadow += mix(resultX , resultY, coefY);\n    resultX = mix(block1, block2, coefX);\n    resultY = mix(block4, block5, coefX);\n    shadow += mix(resultX , resultY, coefY);\n    resultX = mix(block3, block4, coefX);\n    resultY = mix(block6, block7, coefX);\n    shadow += mix(resultX, resultY, coefY);\n    resultX = mix(block4, block5, coefX);\n    resultY = mix(block7, block8, coefX);\n    shadow += mix(resultX, resultY, coefY);\n    return shadow * 0.25;\n  }\n  float CCGetSpotLightShadowFactorHard (vec4 shadowPos, vec3 worldPos, float bias) {\n    vec4 clipPosNew = ApplyShadowDepthBias_Perspective(shadowPos, bias);\n    vec3 clipPos = clipPosNew.xyz / clipPosNew.w * 0.5 + 0.5;\n    if (clipPos.x < 0.0 || clipPos.x > 1.0 ||\n        clipPos.y < 0.0 || clipPos.y > 1.0 ||\n        clipPos.z < 0.0 || clipPos.z > 1.0) { return 1.0; }\n    clipPos.xy = cc_cameraPos.w == 1.0 ? vec2(clipPos.xy.x, 1.0 - clipPos.xy.y) : clipPos.xy;\n    float shadow = 0.0;\n    float closestDepth = 0.0;\n    float depth = clipPos.z;\n    if (cc_shadowLPNNInfo.y > EPSILON) {\n      closestDepth = dot(texture(cc_spotLightingMap, clipPos.xy), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0));\n    } else {\n      closestDepth = texture(cc_spotLightingMap, clipPos.xy).x;\n    }\n    shadow = step(depth, closestDepth);\n    return shadow;\n  }\n  float CCGetSpotLightShadowFactorSoft (vec4 shadowPos, vec3 worldPos, float bias) {\n    vec4 clipPosNew = ApplyShadowDepthBias_Perspective(shadowPos, bias);\n    vec3 clipPos = clipPosNew.xyz / clipPosNew.w * 0.5 + 0.5;\n    if (clipPos.x < 0.0 || clipPos.x > 1.0 ||\n        clipPos.y < 0.0 || clipPos.y > 1.0 ||\n        clipPos.z < 0.0 || clipPos.z > 1.0) { return 1.0; }\n    clipPos.xy = cc_cameraPos.w == 1.0 ? vec2(clipPos.xy.x, 1.0 - clipPos.xy.y) : clipPos.xy;\n    float depth = 0.0;\n    if (cc_shadowNFLSInfo.z > EPSILON) {\n      depth = CCGetLinearDepth(worldPos);\n    } else {\n      depth = clipPos.z;\n    }\n    vec2 oneTap = 1.0 / cc_shadowWHPBInfo.xy;\n    vec2 clipPos_offset = clipPos.xy + oneTap;\n    float block0, block1, block2, block3;\n    if (cc_shadowLPNNInfo.y > EPSILON) {\n      block0 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos.x, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block1 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos_offset.x, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block2 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos.x, clipPos_offset.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block3 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos_offset.x, clipPos_offset.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n    } else {\n      block0 = step(depth, texture(cc_spotLightingMap, vec2(clipPos.x, clipPos.y)).x);\n      block1 = step(depth, texture(cc_spotLightingMap, vec2(clipPos_offset.x, clipPos.y)).x);\n      block2 = step(depth, texture(cc_spotLightingMap, vec2(clipPos.x, clipPos_offset.y)).x);\n      block3 = step(depth, texture(cc_spotLightingMap, vec2(clipPos_offset.x, clipPos_offset.y)).x);\n    }\n    float coefX   = mod(clipPos.x, oneTap.x) * cc_shadowWHPBInfo.x;\n    float resultX = mix(block0, block1, coefX);\n    float resultY = mix(block2, block3, coefX);\n    float coefY   = mod(clipPos.y, oneTap.y) * cc_shadowWHPBInfo.y;\n    return mix(resultX, resultY, coefY);\n  }\n  float CCGetSpotLightShadowFactorSoft2X (vec4 shadowPos, vec3 worldPos, float bias) {\n    vec4 clipPosNew = ApplyShadowDepthBias_Perspective(shadowPos, bias);\n    vec3 clipPos = clipPosNew.xyz / clipPosNew.w * 0.5 + 0.5;\n    if (clipPos.x < 0.0 || clipPos.x > 1.0 ||\n        clipPos.y < 0.0 || clipPos.y > 1.0 ||\n        clipPos.z < 0.0 || clipPos.z > 1.0) { return 1.0; }\n    clipPos.xy = cc_cameraPos.w == 1.0 ? vec2(clipPos.xy.x, 1.0 - clipPos.xy.y) : clipPos.xy;\n    float depth = 0.0;\n    if (cc_shadowNFLSInfo.z > EPSILON) {\n      depth = CCGetLinearDepth(worldPos);\n    } else {\n      depth = clipPos.z;\n    }\n    vec2 mapSize = cc_shadowWHPBInfo.xy;\n    vec2 oneTap = 1.0 / mapSize;\n    float clipPos_offset_L = clipPos.x - oneTap.x;\n    float clipPos_offset_R = clipPos.x + oneTap.x;\n    float clipPos_offset_U = clipPos.y - oneTap.y;\n    float clipPos_offset_D = clipPos.y + oneTap.y;\n    float block0, block1, block2, block3, block4, block5, block6, block7, block8;\n    if (cc_shadowLPNNInfo.y > EPSILON) {\n      block0 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos_offset_L, clipPos_offset_U)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block1 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos.x, clipPos_offset_U)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block2 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos_offset_R, clipPos_offset_U)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block3 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos_offset_L, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block4 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos.x, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block5 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos_offset_R, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block6 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos_offset_L, clipPos_offset_D)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block7 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos.x, clipPos_offset_D)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block8 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos_offset_R, clipPos_offset_D)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n    } else {\n      block0 = step(depth, texture(cc_spotLightingMap, vec2(clipPos_offset_L, clipPos_offset_U)).x);\n      block1 = step(depth, texture(cc_spotLightingMap, vec2(clipPos.x, clipPos_offset_U)).x);\n      block2 = step(depth, texture(cc_spotLightingMap, vec2(clipPos_offset_R, clipPos_offset_U)).x);\n      block3 = step(depth, texture(cc_spotLightingMap, vec2(clipPos_offset_L, clipPos.y)).x);\n      block4 = step(depth, texture(cc_spotLightingMap, vec2(clipPos.x, clipPos.y)).x);\n      block5 = step(depth, texture(cc_spotLightingMap, vec2(clipPos_offset_R, clipPos.y)).x);\n      block6 = step(depth, texture(cc_spotLightingMap, vec2(clipPos_offset_L, clipPos_offset_D)).x);\n      block7 = step(depth, texture(cc_spotLightingMap, vec2(clipPos.x, clipPos_offset_D)).x);\n      block8 = step(depth, texture(cc_spotLightingMap, vec2(clipPos_offset_R, clipPos_offset_D)).x);\n    }\n    float coefX = mod(clipPos.x, oneTap.x) * mapSize.x;\n    float coefY = mod(clipPos.y, oneTap.y) * mapSize.y;\n    float shadow = 0.0;\n    float resultX = mix(block0, block1, coefX);\n    float resultY = mix(block3, block4, coefX);\n    shadow += mix(resultX , resultY, coefY);\n    resultX = mix(block1, block2, coefX);\n    resultY = mix(block4, block5, coefX);\n    shadow += mix(resultX , resultY, coefY);\n    resultX = mix(block3, block4, coefX);\n    resultY = mix(block6, block7, coefX);\n    shadow += mix(resultX, resultY, coefY);\n    resultX = mix(block4, block5, coefX);\n    resultY = mix(block7, block8, coefX);\n    shadow += mix(resultX, resultY, coefY);\n    return shadow * 0.25;\n  }\nfloat CCSpotShadowFactorBase(vec4 shadowPos, vec3 worldPos, vec2 shadowBias)\n{\n  float pcf = cc_shadowWHPBInfo.z;\n  if (pcf > 1.9) {\n    return CCGetSpotLightShadowFactorSoft2X(shadowPos, worldPos, shadowBias.x);\n  }else if (pcf > 0.9) {\n    return CCGetSpotLightShadowFactorSoft(shadowPos, worldPos, shadowBias.x);\n  }else {\n    return CCGetSpotLightShadowFactorHard(shadowPos, worldPos, shadowBias.x);\n  }\n}\nfloat CCShadowFactorBase(vec4 shadowPos, vec3 N, vec2 shadowBias)\n{\n  float realtimeShadow = 1.0;\n  vec4 pos = ApplyShadowDepthBias_FaceNormal(shadowPos, N, shadowBias.y);\n  float pcf = cc_shadowWHPBInfo.z;\n  if (pcf > 1.9) {\n    realtimeShadow =  CCGetShadowFactorSoft2X(pos, shadowBias.x);\n  }else if (pcf > 0.9) {\n    realtimeShadow = CCGetShadowFactorSoft(pos, shadowBias.x);\n  }else {\n    realtimeShadow = CCGetShadowFactorHard(pos, shadowBias.x);\n  }\n  return mix(realtimeShadow, 1.0, cc_shadowNFLSInfo.w);\n}\n#endif\n#if CC_USE_IBL\n  uniform samplerCube cc_environment;\n  vec4 fragTextureLod (sampler2D tex, vec2 coord, float lod) {\n      return textureLod(tex, coord, lod);\n  }\n  vec4 fragTextureLod (samplerCube tex, vec3 coord, float lod) {\n      return textureLod(tex, coord, lod);\n  }\n  vec3 unpackRGBE (vec4 rgbe) {\n    return rgbe.rgb * pow(1.1, rgbe.a * 255.0 - 128.0);\n  }\n  #if CC_USE_DIFFUSEMAP\n    uniform samplerCube cc_diffuseMap;\n  #endif\n#endif\nfloat GGXMobile (float roughness, float NoH, vec3 H, vec3 N) {\n  vec3 NxH = cross(N, H);\n  float OneMinusNoHSqr = dot(NxH, NxH);\n  float a = roughness * roughness;\n  float n = NoH * a;\n  float p = a / (OneMinusNoHSqr + n * n);\n  return p * p;\n}\nfloat CalcSpecular (float roughness, float NoH, vec3 H, vec3 N) {\n  return (roughness * 0.25 + 0.25) * GGXMobile(roughness, NoH, H, N);\n}\nvec3 BRDFApprox (vec3 specular, float roughness, float NoV) {\n  const vec4 c0 = vec4(-1.0, -0.0275, -0.572, 0.022);\n  const vec4 c1 = vec4(1.0, 0.0425, 1.04, -0.04);\n  vec4 r = roughness * c0 + c1;\n  float a004 = min(r.x * r.x, exp2(-9.28 * NoV)) * r.x + r.y;\n  vec2 AB = vec2(-1.04, 1.04) * a004 + r.zw;\n  AB.y *= clamp(50.0 * specular.g, 0.0, 1.0);\n  return specular * AB.x + AB.y;\n}\n#if USE_REFLECTION_DENOISE\n  vec3 GetEnvReflectionWithMipFiltering(vec3 R, float roughness, float mipCount, float denoiseIntensity) {\n    #if CC_USE_IBL\n    \tfloat mip = roughness * mipCount;\n    \tfloat delta = (dot(dFdx(R), dFdy(R))) * 1000.0;\n    \tfloat mipBias = mix(0.0, 5.0, clamp(delta, 0.0, 1.0));\n    \tvec4 biased = fragTextureLod(cc_environment, R, mip + mipBias);\n     \tvec4 filtered = texture(cc_environment, R);\n      #if CC_USE_IBL == 2\n      \tbiased.rgb = unpackRGBE(biased);\n      \tfiltered.rgb = unpackRGBE(filtered);\n      #else\n      \tbiased.rgb = SRGBToLinear(biased.rgb);\n      \tfiltered.rgb = SRGBToLinear(filtered.rgb);\n      #endif\n      return mix(biased.rgb, filtered.rgb, denoiseIntensity);\n    #else\n      return vec3(0.0, 0.0, 0.0);\n    #endif\n  }\n#endif\nstruct StandardSurface {\n  vec4 albedo;\n  #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\n  vec3 position, position_fract_part;\n  #else\n  vec3 position;\n  #endif\n  vec3 normal;\n  vec3 emissive;\n  vec3 lightmap;\n  float lightmap_test;\n  float roughness;\n  float metallic;\n  float occlusion;\n  float specularIntensity;\n  #if CC_RECEIVE_SHADOW\n    vec2 shadowBias;\n  #endif\n};\nvec4 CCStandardShadingBase (StandardSurface s, vec4 shadowPos) {\n  vec3 diffuse = s.albedo.rgb * (1.0 - s.metallic);\n  vec3 specular = mix(vec3(0.08 * s.specularIntensity), s.albedo.rgb, s.metallic);\n  vec3 position;\n  #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\n  position = unpackHighpData(s.position, s.position_fract_part);\n  #else\n  position = s.position;\n  #endif\n  vec3 N = normalize(s.normal);\n  vec3 V = normalize(cc_cameraPos.xyz - position);\n  float NV = max(abs(dot(N, V)), 0.0);\n  specular = BRDFApprox(specular, s.roughness, NV);\n  vec3 L = normalize(-cc_mainLitDir.xyz);\n  vec3 H = normalize(L + V);\n  float NH = max(dot(N, H), 0.0);\n  float NL = max(dot(N, L), 0.0);\n  vec3 finalColor = NL * cc_mainLitColor.rgb * cc_mainLitColor.w;\n  vec3 diffuseContrib = diffuse / PI;\n  vec3 specularContrib = specular * CalcSpecular(s.roughness, NH, H, N);\n  vec3 dirlightContrib = (diffuseContrib + specularContrib);\n  float shadow = 1.0;\n  #if CC_RECEIVE_SHADOW\n    if (NL > 0.0 && cc_mainLitDir.w > 0.0) {\n      shadow = CCShadowFactorBase(shadowPos, N, s.shadowBias);\n    }\n  #endif\n  dirlightContrib *= shadow;\n  finalColor *= dirlightContrib;\n  #if CC_USE_LIGHTMAP && !USE_BATCHING && !CC_FORWARD_ADD\n    if (s.lightmap_test > EPSILON_LOWP) {\n      finalColor = diffuse * s.lightmap.rgb * shadow;\n    }\n  #endif\n  float fAmb = 0.5 - N.y * 0.5;\n  vec3 ambDiff = mix(cc_ambientSky.rgb, cc_ambientGround.rgb, fAmb);\n  #if CC_USE_IBL\n    #if CC_USE_DIFFUSEMAP\n      vec4 diffuseMap = texture(cc_diffuseMap, N);\n      #if CC_USE_DIFFUSEMAP == 2\n        ambDiff = unpackRGBE(diffuseMap);\n      #else\n        ambDiff = SRGBToLinear(diffuseMap.rgb);\n      #endif\n    #endif\n    vec3 R = normalize(reflect(-V, N));\n    #if USE_REFLECTION_DENOISE\n      vec3 env = GetEnvReflectionWithMipFiltering(R, s.roughness, cc_ambientGround.w, 0.6);\n    #else\n      vec4 envmap = fragTextureLod(cc_environment, R, s.roughness * cc_ambientGround.w);\n      #if CC_USE_IBL == 2\n        vec3 env = unpackRGBE(envmap);\n      #else\n        vec3 env = SRGBToLinear(envmap.rgb);\n      #endif\n    #endif\n    finalColor += env * cc_ambientSky.w * specular * s.occlusion;\n  #endif\n  finalColor += ambDiff.rgb * cc_ambientSky.w * diffuse * s.occlusion;\n  finalColor += s.emissive;\n  return vec4(finalColor, s.albedo.a);\n}\nvec3 ACESToneMap (vec3 color) {\n  color = min(color, vec3(8.0));\n  const float A = 2.51;\n  const float B = 0.03;\n  const float C = 2.43;\n  const float D = 0.59;\n  const float E = 0.14;\n  return (color * (A * color + B)) / (color * (C * color + D) + E);\n}\nvec4 CCFragOutput (vec4 color) {\n  #if CC_USE_HDR\n    color.rgb = ACESToneMap(color.rgb);\n  #endif\n  color.rgb = sqrt(color.rgb);\n  return color;\n}\nin highp vec4 v_shadowPos;\n#if CC_RECEIVE_SHADOW\n#endif\n#if CC_USE_LIGHTMAP && !USE_BATCHING && !CC_FORWARD_ADD\n  in vec3 v_luv;\n  uniform sampler2D cc_lightingMap;\n#endif\nin vec3 v_position;\nin vec2 v_uv;\n#if HAS_SECOND_UV\n  in mediump vec2 v_uv1;\n#endif\nin mediump vec3 v_normal;\n#if CC_RECEIVE_SHADOW\n  in mediump vec2 v_shadowBias;\n#endif\n#if USE_VERTEX_COLOR\n  in lowp vec4 v_color;\n#endif\n#if USE_ALBEDO_MAP\n  uniform sampler2D albedoMap;\n#endif\n#if USE_NORMAL_MAP\n  in mediump vec4 v_tangent;\n  uniform sampler2D normalMap;\n#endif\n#if USE_PBR_MAP\n  uniform sampler2D pbrMap;\n#endif\n#if USE_METALLIC_ROUGHNESS_MAP\n  uniform sampler2D metallicRoughnessMap;\n#endif\n#if USE_OCCLUSION_MAP\n  uniform sampler2D occlusionMap;\n#endif\n#if USE_EMISSIVE_MAP\n  uniform sampler2D emissiveMap;\n#endif\n#if USE_ALPHA_TEST\n#endif\nvoid surf (out StandardSurface s) {\n  vec4 baseColor = albedo;\n  #if USE_VERTEX_COLOR\n    baseColor.rgb *= SRGBToLinear(v_color.rgb);\n    baseColor.a *= v_color.a;\n  #endif\n  #if USE_ALBEDO_MAP\n    vec4 texColor = texture(albedoMap, ALBEDO_UV);\n    texColor.rgb = SRGBToLinear(texColor.rgb);\n    baseColor *= texColor;\n  #endif\n  s.albedo = baseColor;\n  s.albedo.rgb *= albedoScaleAndCutoff.xyz;\n  #if USE_ALPHA_TEST\n    if (s.albedo.ALPHA_TEST_CHANNEL < albedoScaleAndCutoff.w) discard;\n  #endif\n  #if CC_USE_LIGHTMAP && !USE_BATCHING && !CC_FORWARD_ADD\n    vec4 lightColor = texture(cc_lightingMap, v_luv.xy);\n    s.lightmap = lightColor.xyz * v_luv.z;\n    s.lightmap_test = v_luv.z;\n  #endif\n  s.normal = v_normal;\n  #if CC_RECEIVE_SHADOW\n    s.shadowBias = v_shadowBias;\n  #endif\n  #if USE_NORMAL_MAP\n    vec3 nmmp = texture(normalMap, NORMAL_UV).xyz - vec3(0.5);\n    vec3 bitangent = cross(v_normal, v_tangent.xyz) * v_tangent.w;\n    s.normal =\n      (nmmp.x * emissiveScaleParam.w) * normalize(v_tangent.xyz) +\n      (nmmp.y * emissiveScaleParam.w) * normalize(bitangent) +\n      nmmp.z * normalize(s.normal);\n  #endif\n  #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\n  packHighpData(s.position, s.position_fract_part, v_position);\n  #else\n  s.position = v_position;\n  #endif\n  vec4 pbr = pbrParams;\n  #if USE_PBR_MAP\n    vec4 res = texture(pbrMap, PBR_UV);\n    pbr.x *= res.r;\n    pbr.y *= res.g;\n    pbr.z *= res.b;\n    pbr.w *= res.a;\n  #endif\n  #if USE_METALLIC_ROUGHNESS_MAP\n    vec4 metallicRoughness = texture(metallicRoughnessMap, PBR_UV);\n    pbr.z *= metallicRoughness.b;\n    pbr.y *= metallicRoughness.g;\n  #endif\n  #if USE_OCCLUSION_MAP\n    pbr.x *= texture(occlusionMap, PBR_UV).r;\n  #endif\n  s.occlusion = pbr.x;\n  s.roughness = pbr.y;\n  s.specularIntensity = 0.5;\n  s.metallic = pbr.z;\n  s.emissive = emissive.rgb * emissiveScaleParam.xyz;\n  #if USE_EMISSIVE_MAP\n    s.emissive *= SRGBToLinear(texture(emissiveMap, EMISSIVE_UV).rgb);\n  #endif\n}\n#if CC_FORWARD_ADD\n  #if CC_PIPELINE_TYPE == 0\n    #define LIGHTS_PER_PASS 1\n  #else\n    #define LIGHTS_PER_PASS 10\n  #endif\n  #if CC_ENABLE_CLUSTERED_LIGHT_CULLING == 0\n  layout(std140) uniform CCForwardLight {\n    highp vec4 cc_lightPos[LIGHTS_PER_PASS];\n    vec4 cc_lightColor[LIGHTS_PER_PASS];\n    vec4 cc_lightSizeRangeAngle[LIGHTS_PER_PASS];\n    vec4 cc_lightDir[LIGHTS_PER_PASS];\n  };\n  #endif\n  float SmoothDistAtt (float distSqr, float invSqrAttRadius) {\n    float factor = distSqr * invSqrAttRadius;\n    float smoothFactor = clamp(1.0 - factor * factor, 0.0, 1.0);\n    return smoothFactor * smoothFactor;\n  }\n  float GetDistAtt (float distSqr, float invSqrAttRadius) {\n    float attenuation = 1.0 / max(distSqr, 0.01*0.01);\n    attenuation *= SmoothDistAtt(distSqr , invSqrAttRadius);\n    return attenuation;\n  }\n  float GetAngleAtt (vec3 L, vec3 litDir, float litAngleScale, float litAngleOffset) {\n    float cd = dot(litDir, L);\n    float attenuation = clamp(cd * litAngleScale + litAngleOffset, 0.0, 1.0);\n    return (attenuation * attenuation);\n  }\n  #if CC_ENABLE_CLUSTERED_LIGHT_CULLING == 0\n  vec4 CCStandardShadingAdditive (StandardSurface s, vec4 shadowPos) {\n    vec3 position;\n    #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\n    position = unpackHighpData(s.position, s.position_fract_part);\n    #else\n    position = s.position;\n    #endif\n    vec3 diffuse = s.albedo.rgb * (1.0 - s.metallic);\n    vec3 specular = mix(vec3(0.04), s.albedo.rgb, s.metallic);\n    vec3 diffuseContrib = diffuse / PI;\n    vec3 N = normalize(s.normal);\n    vec3 V = normalize(cc_cameraPos.xyz - position);\n    float NV = max(abs(dot(N, V)), 0.0);\n    specular = BRDFApprox(specular, s.roughness, NV);\n    vec3 finalColor = vec3(0.0);\n    int numLights = CC_PIPELINE_TYPE == 0 ? LIGHTS_PER_PASS : int(cc_lightDir[0].w);\n    for (int i = 0; i < LIGHTS_PER_PASS; i++) {\n      if (i >= numLights) break;\n      vec3 SLU = cc_lightPos[i].xyz - position;\n      vec3 SL = normalize(SLU);\n      vec3 SH = normalize(SL + V);\n      float SNL = max(dot(N, SL), 0.0);\n      float SNH = max(dot(N, SH), 0.0);\n      float distSqr = dot(SLU, SLU);\n      float litRadius = cc_lightSizeRangeAngle[i].x;\n      float litRadiusSqr = litRadius * litRadius;\n      float illum = litRadiusSqr / max(litRadiusSqr, distSqr);\n      float attRadiusSqrInv = 1.0 / max(cc_lightSizeRangeAngle[i].y, 0.01);\n      attRadiusSqrInv *= attRadiusSqrInv;\n      float att = GetDistAtt(distSqr, attRadiusSqrInv);\n      vec3 lspec = specular * CalcSpecular(s.roughness, SNH, SH, N);\n      if (cc_lightPos[i].w > 0.0) {\n        float cosInner = max(dot(-cc_lightDir[i].xyz, SL), 0.01);\n        float cosOuter = cc_lightSizeRangeAngle[i].z;\n        float litAngleScale = 1.0 / max(0.001, cosInner - cosOuter);\n        float litAngleOffset = -cosOuter * litAngleScale;\n        att *= GetAngleAtt(SL, -cc_lightDir[i].xyz, litAngleScale, litAngleOffset);\n      }\n      vec3 lightColor = cc_lightColor[i].rgb;\n      float shadow = 1.0;\n      #if CC_RECEIVE_SHADOW\n        if (cc_lightPos[i].w > 0.0 && cc_lightSizeRangeAngle[i].w > 0.0) {\n          shadow = CCSpotShadowFactorBase(shadowPos, position, s.shadowBias);\n        }\n      #endif\n      lightColor *= shadow;\n      finalColor += SNL * lightColor * cc_lightColor[i].w * illum * att * (diffuseContrib + lspec);\n    }\n    return vec4(finalColor, 0.0);\n  }\n  #endif\n  #if CC_ENABLE_CLUSTERED_LIGHT_CULLING == 1\n  layout(std430, binding = 4) readonly buffer b_ccLightsBuffer { vec4 b_ccLights[]; };\n  layout(std430, binding = 5) readonly buffer b_clusterLightIndicesBuffer { uint b_clusterLightIndices[]; };\n  layout(std430, binding = 6) readonly buffer b_clusterLightGridBuffer { uvec4 b_clusterLightGrid[]; };\n  struct CCLight\n  {\n    vec4 cc_lightPos;\n    vec4 cc_lightColor;\n    vec4 cc_lightSizeRangeAngle;\n    vec4 cc_lightDir;\n  };\n  struct Cluster\n  {\n    vec3 minBounds;\n    vec3 maxBounds;\n  };\n  struct LightGrid\n  {\n    uint offset;\n    uint ccLights;\n  };\n  CCLight getCCLight(uint i)\n  {\n    CCLight light;\n    light.cc_lightPos = b_ccLights[4u * i + 0u];\n    light.cc_lightColor = b_ccLights[4u * i + 1u];\n    light.cc_lightSizeRangeAngle = b_ccLights[4u * i + 2u];\n    light.cc_lightDir = b_ccLights[4u * i + 3u];\n    return light;\n  }\n  LightGrid getLightGrid(uint cluster)\n  {\n    uvec4 gridvec = b_clusterLightGrid[cluster];\n    LightGrid grid;\n    grid.offset = gridvec.x;\n    grid.ccLights = gridvec.y;\n    return grid;\n  }\n  uint getGridLightIndex(uint start, uint offset)\n  {\n    return b_clusterLightIndices[start + offset];\n  }\n  uint getClusterZIndex(vec4 worldPos)\n  {\n    float scale = float(24) / log(cc_nearFar.y / cc_nearFar.x);\n    float bias = -(float(24) * log(cc_nearFar.x) / log(cc_nearFar.y / cc_nearFar.x));\n    float eyeDepth = -(cc_matView * worldPos).z;\n    uint zIndex = uint(max(log(eyeDepth) * scale + bias, 0.0));\n    return zIndex;\n  }\n  uint getClusterIndex(vec4 fragCoord, vec4 worldPos)\n  {\n    uint zIndex = getClusterZIndex(worldPos);\n    float clusterSizeX = ceil(cc_viewPort.z / float(16));\n    float clusterSizeY = ceil(cc_viewPort.w / float(8));\n    uvec3 indices = uvec3(uvec2(fragCoord.xy / vec2(clusterSizeX, clusterSizeY)), zIndex);\n    uint cluster = (16u * 8u) * indices.z + 16u * indices.y + indices.x;\n    return cluster;\n  }\n  vec4 CCClusterShadingAdditive (StandardSurface s, vec4 shadowPos) {\n    vec3 diffuse = s.albedo.rgb * (1.0 - s.metallic);\n    vec3 specular = mix(vec3(0.04), s.albedo.rgb, s.metallic);\n    vec3 diffuseContrib = diffuse / PI;\n    vec3 position;\n    #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\n    position = unpackHighpData(s.position, s.position_fract_part);\n    #else\n    position = s.position;\n    #endif\n    vec3 N = normalize(s.normal);\n    vec3 V = normalize(cc_cameraPos.xyz - position);\n    float NV = max(abs(dot(N, V)), 0.001);\n    specular = BRDFApprox(specular, s.roughness, NV);\n    vec3 finalColor = vec3(0.0);\n    uint cluster = getClusterIndex(gl_FragCoord, vec4(position, 1.0));\n    LightGrid grid = getLightGrid(cluster);\n    uint numLights = grid.ccLights;\n    for (uint i = 0u; i < 100u; i++) {\n      if (i >= numLights) break;\n      uint lightIndex = getGridLightIndex(grid.offset, i);\n      CCLight light = getCCLight(lightIndex);\n      vec3 SLU = light.cc_lightPos.xyz - position;\n      vec3 SL = normalize(SLU);\n      vec3 SH = normalize(SL + V);\n      float SNL = max(dot(N, SL), 0.001);\n      float SNH = max(dot(N, SH), 0.0);\n      float distSqr = dot(SLU, SLU);\n      float litRadius = light.cc_lightSizeRangeAngle.x;\n      float litRadiusSqr = litRadius * litRadius;\n      float illum = PI * (litRadiusSqr / max(litRadiusSqr , distSqr));\n      float attRadiusSqrInv = 1.0 / max(light.cc_lightSizeRangeAngle.y, 0.01);\n      attRadiusSqrInv *= attRadiusSqrInv;\n      float att = GetDistAtt(distSqr, attRadiusSqrInv);\n      vec3 lspec = specular * CalcSpecular(s.roughness, SNH, SH, N);\n      if (light.cc_lightPos.w > 0.0) {\n        float cosInner = max(dot(-light.cc_lightDir.xyz, SL), 0.01);\n        float cosOuter = light.cc_lightSizeRangeAngle.z;\n        float litAngleScale = 1.0 / max(0.001, cosInner - cosOuter);\n        float litAngleOffset = -cosOuter * litAngleScale;\n        att *= GetAngleAtt(SL, -light.cc_lightDir.xyz, litAngleScale, litAngleOffset);\n      }\n      vec3 lightColor = light.cc_lightColor.rgb;\n      float shadow = 1.0;\n      #if CC_RECEIVE_SHADOW\n        if (light.cc_lightPos.w > 0.0) {\n          shadow = CCSpotShadowFactorBase(shadowPos, position, s.shadowBias);\n        }\n      #endif\n      lightColor *= shadow;\n      finalColor += SNL * lightColor * light.cc_lightColor.w * illum * att * (diffuseContrib + lspec);\n    }\n    return vec4(finalColor, 0.0);\n  }\n  #endif\n  layout(location = 0) out vec4 fragColorX;\n  void main () {\n    StandardSurface s; surf(s);\n    #if CC_ENABLE_CLUSTERED_LIGHT_CULLING == 1\n    vec4 color = CCClusterShadingAdditive(s, v_shadowPos);\n    #else\n    vec4 color = CCStandardShadingAdditive(s, v_shadowPos);\n    #endif\n    fragColorX = CCFragOutput(color);\n  }\n#elif (CC_PIPELINE_TYPE == 0 || CC_FORCE_FORWARD_SHADING)\n  layout(location = 0) out vec4 fragColorX;\n  void main () {\n    StandardSurface s; surf(s);\n    vec4 color = CCStandardShadingBase(s, v_shadowPos);\n    CC_APPLY_FOG(color, s.position.xyz);\n    fragColorX = CCFragOutput(color);\n  }\n#elif CC_PIPELINE_TYPE == 1\n  vec2 signNotZero(vec2 v) {\n    return vec2((v.x >= 0.0) ? +1.0 : -1.0, (v.y >= 0.0) ? +1.0 : -1.0);\n  }\n  vec2 float32x3_to_oct(in vec3 v) {\n    vec2 p = v.xy * (1.0 / (abs(v.x) + abs(v.y) + abs(v.z)));\n    return (v.z <= 0.0) ? ((1.0 - abs(p.yx)) * signNotZero(p)) : p;\n  }\n  layout(location = 0) out vec4 fragColor0;\n  layout(location = 1) out vec4 fragColor1;\n  layout(location = 2) out vec4 fragColor2;\n  void main () {\n    StandardSurface s; surf(s);\n    fragColor0 = s.albedo;\n    fragColor1 = vec4(float32x3_to_oct(s.normal), s.roughness, s.metallic);\n    fragColor2 = vec4(s.emissive, s.occlusion);\n  }\n#endif"},"glsl1":{"vert":"\nprecision highp float;\n#define QUATER_PI         0.78539816340\n#define HALF_PI           1.57079632679\n#define PI                3.14159265359\n#define PI2               6.28318530718\n#define PI4               12.5663706144\n#define INV_QUATER_PI     1.27323954474\n#define INV_HALF_PI       0.63661977237\n#define INV_PI            0.31830988618\n#define INV_PI2           0.15915494309\n#define INV_PI4           0.07957747155\n#define EPSILON           1e-6\n#define EPSILON_LOWP      1e-4\n#define LOG2              1.442695\n#define EXP_VALUE         2.71828183f\n#define FP_MAX            65504.0\n#define FP_SCALE          0.0009765625\n#define FP_SCALE_INV      1024.0\n#define GRAY_VECTOR       vec3(0.299, 0.587, 0.114)\nhighp float decode32 (highp vec4 rgba) {\n  rgba = rgba * 255.0;\n  highp float Sign = 1.0 - (step(128.0, (rgba[3]) + 0.5)) * 2.0;\n  highp float Exponent = 2.0 * (mod(float(int((rgba[3]) + 0.5)), 128.0)) + (step(128.0, (rgba[2]) + 0.5)) - 127.0;\n  highp float Mantissa = (mod(float(int((rgba[2]) + 0.5)), 128.0)) * 65536.0 + rgba[1] * 256.0 + rgba[0] + 8388608.0;\n  return Sign * exp2(Exponent - 23.0) * Mantissa;\n}\nstruct StandardVertInput {\n  highp vec4 position;\n  vec3 normal;\n  vec4 tangent;\n};\nattribute vec3 a_position;\nattribute vec3 a_normal;\nattribute vec2 a_texCoord;\nattribute vec4 a_tangent;\n#if CC_USE_SKINNING\n    attribute vec4 a_joints;\n  attribute vec4 a_weights;\n#endif\n#if USE_INSTANCING\n  #if CC_USE_BAKED_ANIMATION\n    attribute highp vec4 a_jointAnimInfo;\n  #endif\n  attribute vec4 a_matWorld0;\n  attribute vec4 a_matWorld1;\n  attribute vec4 a_matWorld2;\n  #if CC_USE_LIGHTMAP\n    attribute vec4 a_lightingMapUVParam;\n  #endif\n  #if CC_RECEIVE_SHADOW\n    attribute vec2 a_localShadowBias;\n  #endif\n#elif USE_BATCHING\n  attribute float a_dyn_batch_id;\n#endif\n#if CC_USE_MORPH\n    attribute float a_vertexId;\n    int getVertexId() {\n      return int(a_vertexId);\n    }\n#endif\n#if CC_USE_MORPH\n  uniform vec4 cc_displacementWeights[15];\n  uniform vec4 cc_displacementTextureInfo;\n  vec2 getPixelLocation(vec2 textureResolution, int pixelIndex) {\n    float pixelIndexF = float(pixelIndex);\n    float x = mod(pixelIndexF, textureResolution.x);\n    float y = floor(pixelIndexF / textureResolution.x);\n    return vec2(x, y);\n  }\n  vec2 getPixelCoordFromLocation(vec2 location, vec2 textureResolution) {\n    return (vec2(location.x, location.y) + .5) / textureResolution;\n  }\n  #if CC_DEVICE_SUPPORT_FLOAT_TEXTURE\n      vec4 fetchVec3ArrayFromTexture(sampler2D tex, int elementIndex) {\n        int pixelIndex = elementIndex;\n        vec2 location = getPixelLocation(cc_displacementTextureInfo.xy, pixelIndex);\n        vec2 uv = getPixelCoordFromLocation(location, cc_displacementTextureInfo.xy);\n        return texture2D(tex, uv);\n      }\n  #else\n    vec4 fetchVec3ArrayFromTexture(sampler2D tex, int elementIndex) {\n      int pixelIndex = elementIndex * 4;\n      vec2 location = getPixelLocation(cc_displacementTextureInfo.xy, pixelIndex);\n      vec2 x = getPixelCoordFromLocation(location + vec2(0.0, 0.0), cc_displacementTextureInfo.xy);\n      vec2 y = getPixelCoordFromLocation(location + vec2(1.0, 0.0), cc_displacementTextureInfo.xy);\n      vec2 z = getPixelCoordFromLocation(location + vec2(2.0, 0.0), cc_displacementTextureInfo.xy);\n      return vec4(\n        decode32(texture2D(tex, x)),\n        decode32(texture2D(tex, y)),\n        decode32(texture2D(tex, z)),\n        1.0\n      );\n    }\n  #endif\n  float getDisplacementWeight(int index) {\n    int quot = index / 4;\n    int remainder = index - quot * 4;\n    if (remainder == 0) {\n      return cc_displacementWeights[quot].x;\n    } else if (remainder == 1) {\n      return cc_displacementWeights[quot].y;\n    } else if (remainder == 2) {\n      return cc_displacementWeights[quot].z;\n    } else {\n      return cc_displacementWeights[quot].w;\n    }\n  }\n  vec3 getVec3DisplacementFromTexture(sampler2D tex, int vertexIndex) {\n  #if CC_MORPH_PRECOMPUTED\n    return fetchVec3ArrayFromTexture(tex, vertexIndex).rgb;\n  #else\n    vec3 result = vec3(0, 0, 0);\n    int nVertices = int(cc_displacementTextureInfo.z);\n    for (int iTarget = 0; iTarget < CC_MORPH_TARGET_COUNT; ++iTarget) {\n      result += (fetchVec3ArrayFromTexture(tex, nVertices * iTarget + vertexIndex).rgb * getDisplacementWeight(iTarget));\n    }\n    return result;\n  #endif\n  }\n  #if CC_MORPH_TARGET_HAS_POSITION\n    uniform sampler2D cc_PositionDisplacements;\n    vec3 getPositionDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_PositionDisplacements, vertexId);\n    }\n  #endif\n  #if CC_MORPH_TARGET_HAS_NORMAL\n    uniform sampler2D cc_NormalDisplacements;\n    vec3 getNormalDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_NormalDisplacements, vertexId);\n    }\n  #endif\n  #if CC_MORPH_TARGET_HAS_TANGENT\n    uniform sampler2D cc_TangentDisplacements;\n    vec3 getTangentDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_TangentDisplacements, vertexId);\n    }\n  #endif\n  void applyMorph (inout vec4 position, inout vec3 normal, inout vec4 tangent) {\n    int vertexId = getVertexId();\n  #if CC_MORPH_TARGET_HAS_POSITION\n    position.xyz = position.xyz + getPositionDisplacement(vertexId);\n  #endif\n  #if CC_MORPH_TARGET_HAS_NORMAL\n    normal.xyz = normal.xyz + getNormalDisplacement(vertexId);\n  #endif\n  #if CC_MORPH_TARGET_HAS_TANGENT\n    tangent.xyz = tangent.xyz + getTangentDisplacement(vertexId);\n  #endif\n  }\n  void applyMorph (inout vec4 position) {\n  #if CC_MORPH_TARGET_HAS_POSITION\n    position.xyz = position.xyz + getPositionDisplacement(getVertexId());\n  #endif\n  }\n#endif\n#if CC_USE_SKINNING\n  #if CC_USE_BAKED_ANIMATION\n    uniform highp vec4 cc_jointTextureInfo;\n    uniform highp vec4 cc_jointAnimInfo;\n    uniform highp sampler2D cc_jointTexture;\n    void CCGetJointTextureCoords(float pixelsPerJoint, float jointIdx, out highp float x, out highp float y, out highp float invSize)\n    {\n      #if USE_INSTANCING\n        highp float temp = pixelsPerJoint * (a_jointAnimInfo.x * a_jointAnimInfo.y + jointIdx) + a_jointAnimInfo.z;\n      #else\n        highp float temp = pixelsPerJoint * (cc_jointAnimInfo.x * cc_jointTextureInfo.y + jointIdx) + cc_jointTextureInfo.z;\n      #endif\n      invSize = cc_jointTextureInfo.w;\n      highp float tempY = floor(temp * invSize);\n      x = floor(temp - tempY * cc_jointTextureInfo.x);\n      y = (tempY + 0.5) * invSize;\n    }\n  #else\n    uniform highp vec4 cc_joints[90];\n  #endif\n  #if CC_USE_BAKED_ANIMATION\n    #if CC_DEVICE_SUPPORT_FLOAT_TEXTURE\n      mat4 getJointMatrix (float i) {\n        highp float x, y, invSize;\n        CCGetJointTextureCoords(3.0, i, x, y, invSize);\n        vec4 v1 = texture2D(cc_jointTexture, vec2((x + 0.5) * invSize, y));\n        vec4 v2 = texture2D(cc_jointTexture, vec2((x + 1.5) * invSize, y));\n        vec4 v3 = texture2D(cc_jointTexture, vec2((x + 2.5) * invSize, y));\n        return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n      }\n    #else\n      mat4 getJointMatrix (float i) {\n        highp float x, y, invSize;\n        CCGetJointTextureCoords(12.0, i, x, y, invSize);\n        vec4 v1 = vec4(\n          decode32(texture2D(cc_jointTexture, vec2((x + 0.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 1.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 2.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 3.5) * invSize, y)))\n        );\n        vec4 v2 = vec4(\n          decode32(texture2D(cc_jointTexture, vec2((x + 4.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 5.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 6.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 7.5) * invSize, y)))\n        );\n        vec4 v3 = vec4(\n          decode32(texture2D(cc_jointTexture, vec2((x + 8.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 9.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 10.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 11.5) * invSize, y)))\n        );\n        return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n      }\n    #endif\n  #else\n    mat4 getJointMatrix (float i) {\n      int idx = int(i);\n      vec4 v1 = cc_joints[idx * 3];\n      vec4 v2 = cc_joints[idx * 3 + 1];\n      vec4 v3 = cc_joints[idx * 3 + 2];\n      return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n    }\n  #endif\n  mat4 skinMatrix () {\n    vec4 joints = vec4(a_joints);\n    return getJointMatrix(joints.x) * a_weights.x\n         + getJointMatrix(joints.y) * a_weights.y\n         + getJointMatrix(joints.z) * a_weights.z\n         + getJointMatrix(joints.w) * a_weights.w;\n  }\n  void CCSkin (inout vec4 position) {\n    mat4 m = skinMatrix();\n    position = m * position;\n  }\n  void CCSkin (inout vec4 position, inout vec3 normal, inout vec4 tangent) {\n    mat4 m = skinMatrix();\n    position = m * position;\n    normal = (m * vec4(normal, 0.0)).xyz;\n    tangent.xyz = (m * vec4(tangent.xyz, 0.0)).xyz;\n  }\n#endif\nvoid CCVertInput(inout StandardVertInput In)\n{\n    In.position = vec4(a_position, 1.0);\n    In.normal = a_normal;\n    In.tangent = a_tangent;\n  #if CC_USE_MORPH\n    applyMorph(In.position, In.normal, In.tangent);\n  #endif\n  #if CC_USE_SKINNING\n    CCSkin(In.position, In.normal, In.tangent);\n  #endif\n}\nuniform highp mat4 cc_matView;\n  uniform highp mat4 cc_matProj;\n  uniform highp vec4 cc_cameraPos;\n  uniform mediump vec4 cc_fogBase;\n  uniform mediump vec4 cc_fogAdd;\n#if !USE_INSTANCING\n  #if USE_BATCHING\n    uniform highp mat4 cc_matWorlds[10];\n  #else\n    uniform highp mat4 cc_matWorld;\n  uniform highp mat4 cc_matWorldIT;\n  uniform highp vec4 cc_lightingMapUVParam;\n  uniform highp vec4 cc_localShadowBias;\n  #endif\n#endif\nvoid CCGetWorldMatrixFull(out mat4 matWorld, out mat4 matWorldIT)\n{\n  #if USE_INSTANCING\n    matWorld = mat4(\n      vec4(a_matWorld0.xyz, 0.0),\n      vec4(a_matWorld1.xyz, 0.0),\n      vec4(a_matWorld2.xyz, 0.0),\n      vec4(a_matWorld0.w, a_matWorld1.w, a_matWorld2.w, 1.0)\n    );\n    matWorldIT = matWorld;\n  #elif USE_BATCHING\n    matWorld = cc_matWorlds[int(a_dyn_batch_id)];\n    matWorldIT = matWorld;\n  #else\n    matWorld = cc_matWorld;\n    matWorldIT = cc_matWorldIT;\n  #endif\n}\n    uniform vec4 tilingOffset;\nfloat LinearFog(vec4 pos) {\n  vec4 wPos = pos;\n  float cam_dis = distance(cc_cameraPos, wPos);\n  float fogStart = cc_fogBase.x;\n  float fogEnd = cc_fogBase.y;\n  return clamp((fogEnd - cam_dis) / (fogEnd - fogStart), 0., 1.);\n}\nfloat ExpFog(vec4 pos) {\n  vec4 wPos = pos;\n  float fogAtten = cc_fogAdd.z;\n  float fogStart = cc_fogBase.x;\n  float fogDensity = cc_fogBase.z;\n  float cam_dis = max(distance(cc_cameraPos, wPos) - fogStart, 0.0) / fogAtten * 4.;\n  float f = exp(-cam_dis * fogDensity);\n  return f;\n}\nfloat ExpSquaredFog(vec4 pos) {\n  vec4 wPos = pos;\n  float fogAtten = cc_fogAdd.z;\n  float fogStart = cc_fogBase.x;\n  float fogDensity = cc_fogBase.z;\n  float cam_dis = max(distance(cc_cameraPos, wPos) - fogStart, 0.0) / fogAtten * 4.;\n  float f = exp(-cam_dis * cam_dis * fogDensity * fogDensity);\n  return f;\n}\nfloat LayeredFog(vec4 pos) {\n  vec4 wPos = pos;\n  float fogAtten = cc_fogAdd.z;\n  float _FogTop = cc_fogAdd.x;\n  float _FogRange = cc_fogAdd.y;\n  vec3 camWorldProj = cc_cameraPos.xyz;\n  camWorldProj.y = 0.;\n  vec3 worldPosProj = wPos.xyz;\n  worldPosProj.y = 0.;\n  float fDeltaD = distance(worldPosProj, camWorldProj) / fogAtten * 2.0;\n  float fDeltaY, fDensityIntegral;\n  if (cc_cameraPos.y > _FogTop) {\n    if (wPos.y < _FogTop) {\n      fDeltaY = (_FogTop - wPos.y) / _FogRange * 2.0;\n      fDensityIntegral = fDeltaY * fDeltaY * 0.5;\n    } else {\n      fDeltaY = 0.;\n      fDensityIntegral = 0.;\n    }\n  } else {\n    if (wPos.y < _FogTop) {\n      float fDeltaA = (_FogTop - cc_cameraPos.y) / _FogRange * 2.;\n      float fDeltaB = (_FogTop - wPos.y) / _FogRange * 2.;\n      fDeltaY = abs(fDeltaA - fDeltaB);\n      fDensityIntegral = abs((fDeltaA * fDeltaA * 0.5) - (fDeltaB * fDeltaB * 0.5));\n    } else {\n      fDeltaY = abs(_FogTop - cc_cameraPos.y) / _FogRange * 2.;\n      fDensityIntegral = abs(fDeltaY * fDeltaY * 0.5);\n    }\n  }\n  float fDensity;\n  if (fDeltaY != 0.) {\n    fDensity = (sqrt(1.0 + ((fDeltaD / fDeltaY) * (fDeltaD / fDeltaY)))) * fDensityIntegral;\n  } else {\n    fDensity = 0.;\n  }\n  float f = exp(-fDensity);\n  return f;\n}\nvoid CC_TRANSFER_FOG_BASE(vec4 pos, out float factor)\n{\n  #if CC_USE_FOG == 0\n\tfactor = LinearFog(pos);\n  #elif CC_USE_FOG == 1\n    factor = ExpFog(pos);\n  #elif CC_USE_FOG == 2\n    factor = ExpSquaredFog(pos);\n  #elif CC_USE_FOG == 3\n    factor = LayeredFog(pos);\n  #else\n    factor = 1.0;\n  #endif\n}\n#if !CC_USE_ACCURATE_FOG\nvarying float v_fog_factor;\n#endif\nvoid CC_TRANSFER_FOG(vec4 pos) {\n#if !CC_USE_ACCURATE_FOG\n    CC_TRANSFER_FOG_BASE(pos, v_fog_factor);\n#endif\n}\nvarying highp vec4 v_shadowPos;\nuniform highp mat4 cc_matLightViewProj;\n  uniform mediump vec4 cc_shadowWHPBInfo;\n  uniform mediump vec4 cc_shadowLPNNInfo;\n#if CC_RECEIVE_SHADOW\n  uniform highp sampler2D cc_shadowMap;\n  uniform highp sampler2D cc_spotLightingMap;\n#endif\n#if CC_RECEIVE_SHADOW\nvec2 CCGetShadowBias()\n{\n  #if USE_INSTANCING\n    return vec2(a_localShadowBias.x + cc_shadowWHPBInfo.w, a_localShadowBias.y + cc_shadowLPNNInfo.z);\n  #elif !USE_BATCHING\n    return vec2(cc_localShadowBias.x + cc_shadowWHPBInfo.w, cc_localShadowBias.y + cc_shadowLPNNInfo.z);\n  #else\n    return vec2(cc_shadowWHPBInfo.w, cc_shadowLPNNInfo.z);\n  #endif\n}\n#endif\n#if USE_VERTEX_COLOR\n  attribute vec4 a_color;\n  varying lowp vec4 v_color;\n#endif\nvarying vec3 v_position;\nvarying mediump vec3 v_normal;\nvarying vec2 v_uv;\n#if HAS_SECOND_UV\n  varying mediump vec2 v_uv1;\n#endif\n#if CC_RECEIVE_SHADOW\n  varying mediump vec2 v_shadowBias;\n#endif\n#if USE_NORMAL_MAP\n  varying mediump vec4 v_tangent;\n#endif\n#if HAS_SECOND_UV || CC_USE_LIGHTMAP\n  attribute vec2 a_texCoord1;\n#endif\n#if CC_USE_LIGHTMAP && !USE_BATCHING && !CC_FORWARD_ADD\n  varying vec3 v_luv;\n  void CCLightingMapCaclUV()\n  {\n  #if !USE_INSTANCING\n    v_luv.xy = cc_lightingMapUVParam.xy + a_texCoord1 * cc_lightingMapUVParam.z;\n    v_luv.z = cc_lightingMapUVParam.w;\n  #else\n    v_luv.xy = a_lightingMapUVParam.xy + a_texCoord1 * a_lightingMapUVParam.z;\n    v_luv.z = a_lightingMapUVParam.w;\n  #endif\n  }\n#endif\nvoid main () {\n  StandardVertInput In;\n  CCVertInput(In);\n  mat4 matWorld, matWorldIT;\n  CCGetWorldMatrixFull(matWorld, matWorldIT);\n  vec4 pos = matWorld * In.position;\n  v_position = pos.xyz;\n  v_normal = normalize((matWorldIT * vec4(In.normal, 0.0)).xyz);\n  #if CC_RECEIVE_SHADOW\n    v_shadowBias = CCGetShadowBias();\n  #endif\n  #if USE_TWOSIDE\n    vec3 viewDirect = normalize(cc_cameraPos.xyz - v_position);\n    v_normal *= dot(v_normal, viewDirect) < 0.0 ? -1.0 : 1.0;\n  #endif\n  #if USE_NORMAL_MAP\n    v_tangent.xyz = normalize((matWorld * vec4(In.tangent.xyz, 0.0)).xyz);\n    v_tangent.w = In.tangent.w;\n  #endif\n  v_uv = a_texCoord * tilingOffset.xy + tilingOffset.zw;\n  #if SAMPLE_FROM_RT\n    v_uv = cc_cameraPos.w > 1.0 ? vec2(v_uv.x, 1.0 - v_uv.y) : v_uv;\n  #endif\n  #if HAS_SECOND_UV\n    v_uv1 = a_texCoord1 * tilingOffset.xy + tilingOffset.zw;\n    #if SAMPLE_FROM_RT\n      v_uv1 = cc_cameraPos.w > 1.0 ? vec2(v_uv1.x, 1.0 - v_uv1.y) : v_uv1;\n    #endif\n  #endif\n  #if USE_VERTEX_COLOR\n    v_color = a_color;\n  #endif\n  CC_TRANSFER_FOG(pos);\n  v_shadowPos = cc_matLightViewProj * pos;\n  #if CC_USE_LIGHTMAP && !USE_BATCHING && !CC_FORWARD_ADD\n    CCLightingMapCaclUV();\n  #endif\n  gl_Position = cc_matProj * (cc_matView * matWorld) * In.position;\n}","frag":"\n#ifdef GL_EXT_draw_buffers\n#extension GL_EXT_draw_buffers: enable\n#endif\n#ifdef GL_OES_standard_derivatives\n#extension GL_OES_standard_derivatives: enable\n#endif\n#ifdef GL_EXT_shader_texture_lod\n#extension GL_EXT_shader_texture_lod: enable\n#endif\nprecision highp float;\nuniform highp mat4 cc_matView;\n  uniform highp vec4 cc_cameraPos;\n  uniform mediump vec4 cc_mainLitDir;\n  uniform mediump vec4 cc_mainLitColor;\n  uniform mediump vec4 cc_ambientSky;\n  uniform mediump vec4 cc_ambientGround;\n  uniform mediump vec4 cc_fogColor;\n  uniform mediump vec4 cc_fogBase;\n  uniform mediump vec4 cc_fogAdd;\n  uniform mediump vec4 cc_nearFar;\n  uniform mediump vec4 cc_viewPort;\n     uniform vec4 albedo;\n     uniform vec4 albedoScaleAndCutoff;\n     uniform vec4 pbrParams;\n     uniform vec4 emissive;\n     uniform vec4 emissiveScaleParam;\nfloat LinearFog(vec4 pos) {\n  vec4 wPos = pos;\n  float cam_dis = distance(cc_cameraPos, wPos);\n  float fogStart = cc_fogBase.x;\n  float fogEnd = cc_fogBase.y;\n  return clamp((fogEnd - cam_dis) / (fogEnd - fogStart), 0., 1.);\n}\nfloat ExpFog(vec4 pos) {\n  vec4 wPos = pos;\n  float fogAtten = cc_fogAdd.z;\n  float fogStart = cc_fogBase.x;\n  float fogDensity = cc_fogBase.z;\n  float cam_dis = max(distance(cc_cameraPos, wPos) - fogStart, 0.0) / fogAtten * 4.;\n  float f = exp(-cam_dis * fogDensity);\n  return f;\n}\nfloat ExpSquaredFog(vec4 pos) {\n  vec4 wPos = pos;\n  float fogAtten = cc_fogAdd.z;\n  float fogStart = cc_fogBase.x;\n  float fogDensity = cc_fogBase.z;\n  float cam_dis = max(distance(cc_cameraPos, wPos) - fogStart, 0.0) / fogAtten * 4.;\n  float f = exp(-cam_dis * cam_dis * fogDensity * fogDensity);\n  return f;\n}\nfloat LayeredFog(vec4 pos) {\n  vec4 wPos = pos;\n  float fogAtten = cc_fogAdd.z;\n  float _FogTop = cc_fogAdd.x;\n  float _FogRange = cc_fogAdd.y;\n  vec3 camWorldProj = cc_cameraPos.xyz;\n  camWorldProj.y = 0.;\n  vec3 worldPosProj = wPos.xyz;\n  worldPosProj.y = 0.;\n  float fDeltaD = distance(worldPosProj, camWorldProj) / fogAtten * 2.0;\n  float fDeltaY, fDensityIntegral;\n  if (cc_cameraPos.y > _FogTop) {\n    if (wPos.y < _FogTop) {\n      fDeltaY = (_FogTop - wPos.y) / _FogRange * 2.0;\n      fDensityIntegral = fDeltaY * fDeltaY * 0.5;\n    } else {\n      fDeltaY = 0.;\n      fDensityIntegral = 0.;\n    }\n  } else {\n    if (wPos.y < _FogTop) {\n      float fDeltaA = (_FogTop - cc_cameraPos.y) / _FogRange * 2.;\n      float fDeltaB = (_FogTop - wPos.y) / _FogRange * 2.;\n      fDeltaY = abs(fDeltaA - fDeltaB);\n      fDensityIntegral = abs((fDeltaA * fDeltaA * 0.5) - (fDeltaB * fDeltaB * 0.5));\n    } else {\n      fDeltaY = abs(_FogTop - cc_cameraPos.y) / _FogRange * 2.;\n      fDensityIntegral = abs(fDeltaY * fDeltaY * 0.5);\n    }\n  }\n  float fDensity;\n  if (fDeltaY != 0.) {\n    fDensity = (sqrt(1.0 + ((fDeltaD / fDeltaY) * (fDeltaD / fDeltaY)))) * fDensityIntegral;\n  } else {\n    fDensity = 0.;\n  }\n  float f = exp(-fDensity);\n  return f;\n}\nvoid CC_TRANSFER_FOG_BASE(vec4 pos, out float factor)\n{\n  #if CC_USE_FOG == 0\n\tfactor = LinearFog(pos);\n  #elif CC_USE_FOG == 1\n    factor = ExpFog(pos);\n  #elif CC_USE_FOG == 2\n    factor = ExpSquaredFog(pos);\n  #elif CC_USE_FOG == 3\n    factor = LayeredFog(pos);\n  #else\n    factor = 1.0;\n  #endif\n}\nvoid CC_APPLY_FOG_BASE(inout vec4 color, float factor) {\n  color = vec4(mix(cc_fogColor.rgb, color.rgb, factor), color.a);\n}\n#if !CC_USE_ACCURATE_FOG\nvarying float v_fog_factor;\n#endif\nvoid CC_APPLY_FOG(inout vec4 color) {\n#if !CC_USE_ACCURATE_FOG\n    CC_APPLY_FOG_BASE(color, v_fog_factor);\n#endif\n}\nvoid CC_APPLY_FOG(inout vec4 color, vec3 worldPos) {\n#if CC_USE_ACCURATE_FOG\n    float factor;\n    CC_TRANSFER_FOG_BASE(vec4(worldPos, 1.0), factor);\n#else\n    float factor = v_fog_factor;\n#endif\n    CC_APPLY_FOG_BASE(color, factor);\n}\n#define QUATER_PI         0.78539816340\n#define HALF_PI           1.57079632679\n#define PI                3.14159265359\n#define PI2               6.28318530718\n#define PI4               12.5663706144\n#define INV_QUATER_PI     1.27323954474\n#define INV_HALF_PI       0.63661977237\n#define INV_PI            0.31830988618\n#define INV_PI2           0.15915494309\n#define INV_PI4           0.07957747155\n#define EPSILON           1e-6\n#define EPSILON_LOWP      1e-4\n#define LOG2              1.442695\n#define EXP_VALUE         2.71828183f\n#define FP_MAX            65504.0\n#define FP_SCALE          0.0009765625\n#define FP_SCALE_INV      1024.0\n#define GRAY_VECTOR       vec3(0.299, 0.587, 0.114)\nvec3 SRGBToLinear (vec3 gamma) {\n  return gamma * gamma;\n}\nuniform highp mat4 cc_matLightView;\n  uniform highp vec4 cc_shadowInvProjDepthInfo;\n  uniform highp vec4 cc_shadowProjDepthInfo;\n  uniform highp vec4 cc_shadowProjInfo;\n  uniform mediump vec4 cc_shadowNFLSInfo;\n  uniform mediump vec4 cc_shadowWHPBInfo;\n  uniform mediump vec4 cc_shadowLPNNInfo;\nhighp float unpackHighpData (float mainPart, float modPart) {\n  highp float data = mainPart;\n  return data + modPart;\n}\nvoid packHighpData (out float mainPart, out float modPart, highp float data) {\n  mainPart = fract(data);\n  modPart = data - mainPart;\n}\nhighp float unpackHighpData (float mainPart, float modPart, const float modValue) {\n  highp float data = mainPart * modValue;\n  return data + modPart * modValue;\n}\nvoid packHighpData (out float mainPart, out float modPart, highp float data, const float modValue) {\n  highp float divide = data / modValue;\n  mainPart = floor(divide);\n  modPart = (data - mainPart * modValue) / modValue;\n}\nhighp vec2 unpackHighpData (vec2 mainPart, vec2 modPart) {\n  highp vec2 data = mainPart;\n  return data + modPart;\n}\nvoid packHighpData (out vec2 mainPart, out vec2 modPart, highp vec2 data) {\n  mainPart = fract(data);\n  modPart = data - mainPart;\n}\nhighp vec2 unpackHighpData (vec2 mainPart, vec2 modPart, const float modValue) {\n  highp vec2 data = mainPart * modValue;\n  return data + modPart * modValue;\n}\nvoid packHighpData (out vec2 mainPart, out vec2 modPart, highp vec2 data, const float modValue) {\n  highp vec2 divide = data / modValue;\n  mainPart = floor(divide);\n  modPart = (data - mainPart * modValue) / modValue;\n}\nhighp vec3 unpackHighpData (vec3 mainPart, vec3 modPart) {\n  highp vec3 data = mainPart;\n  return data + modPart;\n}\nvoid packHighpData (out vec3 mainPart, out vec3 modPart, highp vec3 data) {\n  mainPart = fract(data);\n  modPart = data - mainPart;\n}\nhighp vec3 unpackHighpData (vec3 mainPart, vec3 modPart, const float modValue) {\n  highp vec3 data = mainPart * modValue;\n  return data + modPart * modValue;\n}\nvoid packHighpData (out vec3 mainPart, out vec3 modPart, highp vec3 data, const float modValue) {\n  highp vec3 divide = data / modValue;\n  mainPart = floor(divide);\n  modPart = (data - mainPart * modValue) / modValue;\n}\nhighp vec4 unpackHighpData (vec4 mainPart, vec4 modPart) {\n  highp vec4 data = mainPart;\n  return data + modPart;\n}\nvoid packHighpData (out vec4 mainPart, out vec4 modPart, highp vec4 data) {\n  mainPart = fract(data);\n  modPart = data - mainPart;\n}\nhighp vec4 unpackHighpData (vec4 mainPart, vec4 modPart, const float modValue) {\n  highp vec4 data = mainPart * modValue;\n  return data + modPart * modValue;\n}\nvoid packHighpData (out vec4 mainPart, out vec4 modPart, highp vec4 data, const float modValue) {\n  highp vec4 divide = data / modValue;\n  mainPart = floor(divide);\n  modPart = (data - mainPart * modValue) / modValue;\n}\nfloat CCGetLinearDepthFromViewSpace(vec3 viewPos) {\n  float dist = length(viewPos);\n  return (dist - cc_shadowNFLSInfo.x) / (cc_shadowNFLSInfo.y - cc_shadowNFLSInfo.x);\n}\nfloat CCGetLinearDepth(vec3 worldPos) {\n  vec4 viewStartPos = cc_matLightView * vec4(worldPos.xyz, 1.0);\n  return CCGetLinearDepthFromViewSpace(viewStartPos.xyz);\n}\n#if CC_RECEIVE_SHADOW\n  uniform highp sampler2D cc_shadowMap;\n  uniform highp sampler2D cc_spotLightingMap;\n  vec4 ApplyShadowDepthBias_FaceNormal(vec4 shadowPos, vec3 worldNormal, float normalBias)\n  {\n    vec4 newShadowPos = shadowPos;\n    if(normalBias > EPSILON_LOWP)\n    {\n      vec4 viewNormal = cc_matLightView * vec4(worldNormal, 0.0);\n      if(viewNormal.z < 0.1)\n        newShadowPos.xy += viewNormal.xy * cc_shadowProjInfo.xy * normalBias * clamp(viewNormal.z, 0.001, 0.1);\n    }\n    return newShadowPos;\n  }\n  vec4 ApplyShadowDepthBias_Perspective(vec4 shadowPos, float viewspaceDepthBias)\n  {\n    vec3 viewSpacePos;\n    viewSpacePos.xy = shadowPos.xy * cc_shadowProjInfo.zw;\n    viewSpacePos.z = shadowPos.z * cc_shadowInvProjDepthInfo.x + shadowPos.w * cc_shadowInvProjDepthInfo.y;\n    viewSpacePos.xyz += cc_shadowProjDepthInfo.z * normalize(viewSpacePos.xyz) * viewspaceDepthBias;\n    vec4 clipSpacePos;\n    clipSpacePos.xy = viewSpacePos.xy * cc_shadowProjInfo.xy;\n    clipSpacePos.zw = viewSpacePos.z * cc_shadowProjDepthInfo.xz + vec2(cc_shadowProjDepthInfo.y, 0.0);\n    if (cc_shadowNFLSInfo.z > EPSILON) {\n      clipSpacePos.z = CCGetLinearDepthFromViewSpace(viewSpacePos.xyz);\n      clipSpacePos.z = (clipSpacePos.z * 2.0 - 1.0) * clipSpacePos.w;\n    }\n    return clipSpacePos;\n  }\n  vec4 ApplyShadowDepthBias_Orthographic(vec4 shadowPos, float viewspaceDepthBias)\n  {\n    float coeffA = cc_shadowProjDepthInfo.x;\n    float coeffB = cc_shadowProjDepthInfo.y;\n    float viewSpacePos_z = (shadowPos.z - coeffB) / coeffA;\n    viewSpacePos_z += viewspaceDepthBias;\n    vec4 result = shadowPos;\n    result.z = viewSpacePos_z * coeffA + coeffB;\n    return result;\n  }\n  float CCGetShadowFactorHard (vec4 shadowPos, float bias) {\n    vec4 clipPosNew = ApplyShadowDepthBias_Orthographic(shadowPos, bias);\n    vec3 clipPos = clipPosNew.xyz / clipPosNew.w * 0.5 + 0.5;\n    if (clipPos.x < 0.0 || clipPos.x > 1.0 ||\n        clipPos.y < 0.0 || clipPos.y > 1.0 ||\n        clipPos.z < 0.0 || clipPos.z > 1.0) { return 1.0; }\n    clipPos.xy = cc_cameraPos.w == 1.0 ? vec2(clipPos.xy.x, 1.0 - clipPos.xy.y) : clipPos.xy;\n    float shadow = 0.0;\n    float closestDepth = 0.0;\n    if (cc_shadowLPNNInfo.y > EPSILON) {\n      closestDepth = dot(texture2D(cc_shadowMap, clipPos.xy), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0));\n    } else {\n      closestDepth = texture2D(cc_shadowMap, clipPos.xy).x;\n    }\n    shadow = step(clipPos.z, closestDepth);\n    return shadow;\n  }\n  float CCGetShadowFactorSoft (vec4 shadowPos, float bias) {\n    vec4 clipPosNew = ApplyShadowDepthBias_Orthographic(shadowPos, bias);\n    vec3 clipPos = clipPosNew.xyz / clipPosNew.w * 0.5 + 0.5;\n    if (clipPos.x < 0.0 || clipPos.x > 1.0 ||\n        clipPos.y < 0.0 || clipPos.y > 1.0 ||\n        clipPos.z < 0.0 || clipPos.z > 1.0) { return 1.0; }\n    clipPos.xy = cc_cameraPos.w == 1.0 ? vec2(clipPos.xy.x, 1.0 - clipPos.xy.y) : clipPos.xy;\n    float offsetDepth = clipPos.z;\n    vec2 mapSize = cc_shadowWHPBInfo.xy;\n    vec2 oneTap = 1.0 / mapSize;\n    vec2 clipPos_offset = clipPos.xy + oneTap;\n    float block0, block1, block2, block3;\n    if (cc_shadowLPNNInfo.y > EPSILON) {\n      block0 = step(offsetDepth, dot(texture2D(cc_shadowMap, vec2(clipPos.x, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block1 = step(offsetDepth, dot(texture2D(cc_shadowMap, vec2(clipPos_offset.x, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block2 = step(offsetDepth, dot(texture2D(cc_shadowMap, vec2(clipPos.x, clipPos_offset.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block3 = step(offsetDepth, dot(texture2D(cc_shadowMap, vec2(clipPos_offset.x, clipPos_offset.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n    } else {\n      block0 = step(offsetDepth, texture2D(cc_shadowMap, vec2(clipPos.x, clipPos.y)).x);\n      block1 = step(offsetDepth, texture2D(cc_shadowMap, vec2(clipPos_offset.x, clipPos.y)).x);\n      block2 = step(offsetDepth, texture2D(cc_shadowMap, vec2(clipPos.x, clipPos_offset.y)).x);\n      block3 = step(offsetDepth, texture2D(cc_shadowMap, vec2(clipPos_offset.x, clipPos_offset.y)).x);\n    }\n    float coefX   = mod(clipPos.x, oneTap.x) * mapSize.x;\n    float resultX = mix(block0, block1, coefX);\n    float resultY = mix(block2, block3, coefX);\n    float coefY   = mod(clipPos.y, oneTap.y) * mapSize.y;\n    return mix(resultX, resultY, coefY);\n  }\n  float CCGetShadowFactorSoft2X (vec4 shadowPos, float bias) {\n    vec4 clipPosNew = ApplyShadowDepthBias_Orthographic(shadowPos, bias);\n    vec3 clipPos = clipPosNew.xyz / clipPosNew.w * 0.5 + 0.5;\n    if (clipPos.x < 0.0 || clipPos.x > 1.0 ||\n        clipPos.y < 0.0 || clipPos.y > 1.0 ||\n        clipPos.z < 0.0 || clipPos.z > 1.0) { return 1.0; }\n    clipPos.xy = cc_cameraPos.w == 1.0 ? vec2(clipPos.xy.x, 1.0 - clipPos.xy.y) : clipPos.xy;\n    float offsetDepth = clipPos.z;\n    vec2 mapSize = cc_shadowWHPBInfo.xy;\n    vec2 oneTap = 1.0 / mapSize;\n    float clipPos_offset_L = clipPos.x - oneTap.x;\n    float clipPos_offset_R = clipPos.x + oneTap.x;\n    float clipPos_offset_U = clipPos.y - oneTap.y;\n    float clipPos_offset_D = clipPos.y + oneTap.y;\n    float block0, block1, block2, block3, block4, block5, block6, block7, block8;\n    if (cc_shadowLPNNInfo.y > EPSILON) {\n      block0 = step(offsetDepth, dot(texture2D(cc_shadowMap, vec2(clipPos_offset_L, clipPos_offset_U)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block1 = step(offsetDepth, dot(texture2D(cc_shadowMap, vec2(clipPos.x, clipPos_offset_U)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block2 = step(offsetDepth, dot(texture2D(cc_shadowMap, vec2(clipPos_offset_R, clipPos_offset_U)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block3 = step(offsetDepth, dot(texture2D(cc_shadowMap, vec2(clipPos_offset_L, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block4 = step(offsetDepth, dot(texture2D(cc_shadowMap, vec2(clipPos.x, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block5 = step(offsetDepth, dot(texture2D(cc_shadowMap, vec2(clipPos_offset_R, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block6 = step(offsetDepth, dot(texture2D(cc_shadowMap, vec2(clipPos_offset_L, clipPos_offset_D)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block7 = step(offsetDepth, dot(texture2D(cc_shadowMap, vec2(clipPos.x, clipPos_offset_D)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block8 = step(offsetDepth, dot(texture2D(cc_shadowMap, vec2(clipPos_offset_R, clipPos_offset_D)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n    } else {\n      block0 = step(offsetDepth, texture2D(cc_shadowMap, vec2(clipPos_offset_L, clipPos_offset_U)).x);\n      block1 = step(offsetDepth, texture2D(cc_shadowMap, vec2(clipPos.x, clipPos_offset_U)).x);\n      block2 = step(offsetDepth, texture2D(cc_shadowMap, vec2(clipPos_offset_R, clipPos_offset_U)).x);\n      block3 = step(offsetDepth, texture2D(cc_shadowMap, vec2(clipPos_offset_L, clipPos.y)).x);\n      block4 = step(offsetDepth, texture2D(cc_shadowMap, vec2(clipPos.x, clipPos.y)).x);\n      block5 = step(offsetDepth, texture2D(cc_shadowMap, vec2(clipPos_offset_R, clipPos.y)).x);\n      block6 = step(offsetDepth, texture2D(cc_shadowMap, vec2(clipPos_offset_L, clipPos_offset_D)).x);\n      block7 = step(offsetDepth, texture2D(cc_shadowMap, vec2(clipPos.x, clipPos_offset_D)).x);\n      block8 = step(offsetDepth, texture2D(cc_shadowMap, vec2(clipPos_offset_R, clipPos_offset_D)).x);\n    }\n    float coefX = mod(clipPos.x, oneTap.x) * mapSize.x;\n    float coefY = mod(clipPos.y, oneTap.y) * mapSize.y;\n    float shadow = 0.0;\n    float resultX = mix(block0, block1, coefX);\n    float resultY = mix(block3, block4, coefX);\n    shadow += mix(resultX , resultY, coefY);\n    resultX = mix(block1, block2, coefX);\n    resultY = mix(block4, block5, coefX);\n    shadow += mix(resultX , resultY, coefY);\n    resultX = mix(block3, block4, coefX);\n    resultY = mix(block6, block7, coefX);\n    shadow += mix(resultX, resultY, coefY);\n    resultX = mix(block4, block5, coefX);\n    resultY = mix(block7, block8, coefX);\n    shadow += mix(resultX, resultY, coefY);\n    return shadow * 0.25;\n  }\n  float CCGetSpotLightShadowFactorHard (vec4 shadowPos, vec3 worldPos, float bias) {\n    vec4 clipPosNew = ApplyShadowDepthBias_Perspective(shadowPos, bias);\n    vec3 clipPos = clipPosNew.xyz / clipPosNew.w * 0.5 + 0.5;\n    if (clipPos.x < 0.0 || clipPos.x > 1.0 ||\n        clipPos.y < 0.0 || clipPos.y > 1.0 ||\n        clipPos.z < 0.0 || clipPos.z > 1.0) { return 1.0; }\n    clipPos.xy = cc_cameraPos.w == 1.0 ? vec2(clipPos.xy.x, 1.0 - clipPos.xy.y) : clipPos.xy;\n    float shadow = 0.0;\n    float closestDepth = 0.0;\n    float depth = clipPos.z;\n    if (cc_shadowLPNNInfo.y > EPSILON) {\n      closestDepth = dot(texture2D(cc_spotLightingMap, clipPos.xy), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0));\n    } else {\n      closestDepth = texture2D(cc_spotLightingMap, clipPos.xy).x;\n    }\n    shadow = step(depth, closestDepth);\n    return shadow;\n  }\n  float CCGetSpotLightShadowFactorSoft (vec4 shadowPos, vec3 worldPos, float bias) {\n    vec4 clipPosNew = ApplyShadowDepthBias_Perspective(shadowPos, bias);\n    vec3 clipPos = clipPosNew.xyz / clipPosNew.w * 0.5 + 0.5;\n    if (clipPos.x < 0.0 || clipPos.x > 1.0 ||\n        clipPos.y < 0.0 || clipPos.y > 1.0 ||\n        clipPos.z < 0.0 || clipPos.z > 1.0) { return 1.0; }\n    clipPos.xy = cc_cameraPos.w == 1.0 ? vec2(clipPos.xy.x, 1.0 - clipPos.xy.y) : clipPos.xy;\n    float depth = 0.0;\n    if (cc_shadowNFLSInfo.z > EPSILON) {\n      depth = CCGetLinearDepth(worldPos);\n    } else {\n      depth = clipPos.z;\n    }\n    vec2 oneTap = 1.0 / cc_shadowWHPBInfo.xy;\n    vec2 clipPos_offset = clipPos.xy + oneTap;\n    float block0, block1, block2, block3;\n    if (cc_shadowLPNNInfo.y > EPSILON) {\n      block0 = step(depth, dot(texture2D(cc_spotLightingMap, vec2(clipPos.x, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block1 = step(depth, dot(texture2D(cc_spotLightingMap, vec2(clipPos_offset.x, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block2 = step(depth, dot(texture2D(cc_spotLightingMap, vec2(clipPos.x, clipPos_offset.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block3 = step(depth, dot(texture2D(cc_spotLightingMap, vec2(clipPos_offset.x, clipPos_offset.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n    } else {\n      block0 = step(depth, texture2D(cc_spotLightingMap, vec2(clipPos.x, clipPos.y)).x);\n      block1 = step(depth, texture2D(cc_spotLightingMap, vec2(clipPos_offset.x, clipPos.y)).x);\n      block2 = step(depth, texture2D(cc_spotLightingMap, vec2(clipPos.x, clipPos_offset.y)).x);\n      block3 = step(depth, texture2D(cc_spotLightingMap, vec2(clipPos_offset.x, clipPos_offset.y)).x);\n    }\n    float coefX   = mod(clipPos.x, oneTap.x) * cc_shadowWHPBInfo.x;\n    float resultX = mix(block0, block1, coefX);\n    float resultY = mix(block2, block3, coefX);\n    float coefY   = mod(clipPos.y, oneTap.y) * cc_shadowWHPBInfo.y;\n    return mix(resultX, resultY, coefY);\n  }\n  float CCGetSpotLightShadowFactorSoft2X (vec4 shadowPos, vec3 worldPos, float bias) {\n    vec4 clipPosNew = ApplyShadowDepthBias_Perspective(shadowPos, bias);\n    vec3 clipPos = clipPosNew.xyz / clipPosNew.w * 0.5 + 0.5;\n    if (clipPos.x < 0.0 || clipPos.x > 1.0 ||\n        clipPos.y < 0.0 || clipPos.y > 1.0 ||\n        clipPos.z < 0.0 || clipPos.z > 1.0) { return 1.0; }\n    clipPos.xy = cc_cameraPos.w == 1.0 ? vec2(clipPos.xy.x, 1.0 - clipPos.xy.y) : clipPos.xy;\n    float depth = 0.0;\n    if (cc_shadowNFLSInfo.z > EPSILON) {\n      depth = CCGetLinearDepth(worldPos);\n    } else {\n      depth = clipPos.z;\n    }\n    vec2 mapSize = cc_shadowWHPBInfo.xy;\n    vec2 oneTap = 1.0 / mapSize;\n    float clipPos_offset_L = clipPos.x - oneTap.x;\n    float clipPos_offset_R = clipPos.x + oneTap.x;\n    float clipPos_offset_U = clipPos.y - oneTap.y;\n    float clipPos_offset_D = clipPos.y + oneTap.y;\n    float block0, block1, block2, block3, block4, block5, block6, block7, block8;\n    if (cc_shadowLPNNInfo.y > EPSILON) {\n      block0 = step(depth, dot(texture2D(cc_spotLightingMap, vec2(clipPos_offset_L, clipPos_offset_U)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block1 = step(depth, dot(texture2D(cc_spotLightingMap, vec2(clipPos.x, clipPos_offset_U)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block2 = step(depth, dot(texture2D(cc_spotLightingMap, vec2(clipPos_offset_R, clipPos_offset_U)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block3 = step(depth, dot(texture2D(cc_spotLightingMap, vec2(clipPos_offset_L, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block4 = step(depth, dot(texture2D(cc_spotLightingMap, vec2(clipPos.x, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block5 = step(depth, dot(texture2D(cc_spotLightingMap, vec2(clipPos_offset_R, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block6 = step(depth, dot(texture2D(cc_spotLightingMap, vec2(clipPos_offset_L, clipPos_offset_D)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block7 = step(depth, dot(texture2D(cc_spotLightingMap, vec2(clipPos.x, clipPos_offset_D)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block8 = step(depth, dot(texture2D(cc_spotLightingMap, vec2(clipPos_offset_R, clipPos_offset_D)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n    } else {\n      block0 = step(depth, texture2D(cc_spotLightingMap, vec2(clipPos_offset_L, clipPos_offset_U)).x);\n      block1 = step(depth, texture2D(cc_spotLightingMap, vec2(clipPos.x, clipPos_offset_U)).x);\n      block2 = step(depth, texture2D(cc_spotLightingMap, vec2(clipPos_offset_R, clipPos_offset_U)).x);\n      block3 = step(depth, texture2D(cc_spotLightingMap, vec2(clipPos_offset_L, clipPos.y)).x);\n      block4 = step(depth, texture2D(cc_spotLightingMap, vec2(clipPos.x, clipPos.y)).x);\n      block5 = step(depth, texture2D(cc_spotLightingMap, vec2(clipPos_offset_R, clipPos.y)).x);\n      block6 = step(depth, texture2D(cc_spotLightingMap, vec2(clipPos_offset_L, clipPos_offset_D)).x);\n      block7 = step(depth, texture2D(cc_spotLightingMap, vec2(clipPos.x, clipPos_offset_D)).x);\n      block8 = step(depth, texture2D(cc_spotLightingMap, vec2(clipPos_offset_R, clipPos_offset_D)).x);\n    }\n    float coefX = mod(clipPos.x, oneTap.x) * mapSize.x;\n    float coefY = mod(clipPos.y, oneTap.y) * mapSize.y;\n    float shadow = 0.0;\n    float resultX = mix(block0, block1, coefX);\n    float resultY = mix(block3, block4, coefX);\n    shadow += mix(resultX , resultY, coefY);\n    resultX = mix(block1, block2, coefX);\n    resultY = mix(block4, block5, coefX);\n    shadow += mix(resultX , resultY, coefY);\n    resultX = mix(block3, block4, coefX);\n    resultY = mix(block6, block7, coefX);\n    shadow += mix(resultX, resultY, coefY);\n    resultX = mix(block4, block5, coefX);\n    resultY = mix(block7, block8, coefX);\n    shadow += mix(resultX, resultY, coefY);\n    return shadow * 0.25;\n  }\nfloat CCSpotShadowFactorBase(vec4 shadowPos, vec3 worldPos, vec2 shadowBias)\n{\n  float pcf = cc_shadowWHPBInfo.z;\n  if (pcf > 1.9) {\n    return CCGetSpotLightShadowFactorSoft2X(shadowPos, worldPos, shadowBias.x);\n  }else if (pcf > 0.9) {\n    return CCGetSpotLightShadowFactorSoft(shadowPos, worldPos, shadowBias.x);\n  }else {\n    return CCGetSpotLightShadowFactorHard(shadowPos, worldPos, shadowBias.x);\n  }\n}\nfloat CCShadowFactorBase(vec4 shadowPos, vec3 N, vec2 shadowBias)\n{\n  float realtimeShadow = 1.0;\n  vec4 pos = ApplyShadowDepthBias_FaceNormal(shadowPos, N, shadowBias.y);\n  float pcf = cc_shadowWHPBInfo.z;\n  if (pcf > 1.9) {\n    realtimeShadow =  CCGetShadowFactorSoft2X(pos, shadowBias.x);\n  }else if (pcf > 0.9) {\n    realtimeShadow = CCGetShadowFactorSoft(pos, shadowBias.x);\n  }else {\n    realtimeShadow = CCGetShadowFactorHard(pos, shadowBias.x);\n  }\n  return mix(realtimeShadow, 1.0, cc_shadowNFLSInfo.w);\n}\n#endif\n#if CC_USE_IBL\n  uniform samplerCube cc_environment;\n  vec4 fragTextureLod (sampler2D tex, vec2 coord, float lod) {\n      #ifdef GL_EXT_shader_texture_lod\n        return texture2DLodEXT(tex, coord, lod);\n      #else\n        return texture2D(tex, coord, lod);\n      #endif\n  }\n  vec4 fragTextureLod (samplerCube tex, vec3 coord, float lod) {\n      #ifdef GL_EXT_shader_texture_lod\n        return textureCubeLodEXT(tex, coord, lod);\n      #else\n        return textureCube(tex, coord, lod);\n      #endif\n  }\n  vec3 unpackRGBE (vec4 rgbe) {\n    return rgbe.rgb * pow(1.1, rgbe.a * 255.0 - 128.0);\n  }\n  #if CC_USE_DIFFUSEMAP\n    uniform samplerCube cc_diffuseMap;\n  #endif\n#endif\nfloat GGXMobile (float roughness, float NoH, vec3 H, vec3 N) {\n  vec3 NxH = cross(N, H);\n  float OneMinusNoHSqr = dot(NxH, NxH);\n  float a = roughness * roughness;\n  float n = NoH * a;\n  float p = a / (OneMinusNoHSqr + n * n);\n  return p * p;\n}\nfloat CalcSpecular (float roughness, float NoH, vec3 H, vec3 N) {\n  return (roughness * 0.25 + 0.25) * GGXMobile(roughness, NoH, H, N);\n}\nvec3 BRDFApprox (vec3 specular, float roughness, float NoV) {\n  const vec4 c0 = vec4(-1.0, -0.0275, -0.572, 0.022);\n  const vec4 c1 = vec4(1.0, 0.0425, 1.04, -0.04);\n  vec4 r = roughness * c0 + c1;\n  float a004 = min(r.x * r.x, exp2(-9.28 * NoV)) * r.x + r.y;\n  vec2 AB = vec2(-1.04, 1.04) * a004 + r.zw;\n  AB.y *= clamp(50.0 * specular.g, 0.0, 1.0);\n  return specular * AB.x + AB.y;\n}\n#if USE_REFLECTION_DENOISE\n  vec3 GetEnvReflectionWithMipFiltering(vec3 R, float roughness, float mipCount, float denoiseIntensity) {\n    #if CC_USE_IBL\n    \tfloat mip = roughness * mipCount;\n    \tfloat delta = (dot(dFdx(R), dFdy(R))) * 1000.0;\n    \tfloat mipBias = mix(0.0, 5.0, clamp(delta, 0.0, 1.0));\n    \tvec4 biased = fragTextureLod(cc_environment, R, mip + mipBias);\n     \tvec4 filtered = textureCube(cc_environment, R);\n      #if CC_USE_IBL == 2\n      \tbiased.rgb = unpackRGBE(biased);\n      \tfiltered.rgb = unpackRGBE(filtered);\n      #else\n      \tbiased.rgb = SRGBToLinear(biased.rgb);\n      \tfiltered.rgb = SRGBToLinear(filtered.rgb);\n      #endif\n      return mix(biased.rgb, filtered.rgb, denoiseIntensity);\n    #else\n      return vec3(0.0, 0.0, 0.0);\n    #endif\n  }\n#endif\nstruct StandardSurface {\n  vec4 albedo;\n  #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\n  vec3 position, position_fract_part;\n  #else\n  vec3 position;\n  #endif\n  vec3 normal;\n  vec3 emissive;\n  vec3 lightmap;\n  float lightmap_test;\n  float roughness;\n  float metallic;\n  float occlusion;\n  float specularIntensity;\n  #if CC_RECEIVE_SHADOW\n    vec2 shadowBias;\n  #endif\n};\nvec4 CCStandardShadingBase (StandardSurface s, vec4 shadowPos) {\n  vec3 diffuse = s.albedo.rgb * (1.0 - s.metallic);\n  vec3 specular = mix(vec3(0.08 * s.specularIntensity), s.albedo.rgb, s.metallic);\n  vec3 position;\n  #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\n  position = unpackHighpData(s.position, s.position_fract_part);\n  #else\n  position = s.position;\n  #endif\n  vec3 N = normalize(s.normal);\n  vec3 V = normalize(cc_cameraPos.xyz - position);\n  float NV = max(abs(dot(N, V)), 0.0);\n  specular = BRDFApprox(specular, s.roughness, NV);\n  vec3 L = normalize(-cc_mainLitDir.xyz);\n  vec3 H = normalize(L + V);\n  float NH = max(dot(N, H), 0.0);\n  float NL = max(dot(N, L), 0.0);\n  vec3 finalColor = NL * cc_mainLitColor.rgb * cc_mainLitColor.w;\n  vec3 diffuseContrib = diffuse / PI;\n  vec3 specularContrib = specular * CalcSpecular(s.roughness, NH, H, N);\n  vec3 dirlightContrib = (diffuseContrib + specularContrib);\n  float shadow = 1.0;\n  #if CC_RECEIVE_SHADOW\n    if (NL > 0.0 && cc_mainLitDir.w > 0.0) {\n      shadow = CCShadowFactorBase(shadowPos, N, s.shadowBias);\n    }\n  #endif\n  dirlightContrib *= shadow;\n  finalColor *= dirlightContrib;\n  #if CC_USE_LIGHTMAP && !USE_BATCHING && !CC_FORWARD_ADD\n    if (s.lightmap_test > EPSILON_LOWP) {\n      finalColor = diffuse * s.lightmap.rgb * shadow;\n    }\n  #endif\n  float fAmb = 0.5 - N.y * 0.5;\n  vec3 ambDiff = mix(cc_ambientSky.rgb, cc_ambientGround.rgb, fAmb);\n  #if CC_USE_IBL\n    #if CC_USE_DIFFUSEMAP\n      vec4 diffuseMap = textureCube(cc_diffuseMap, N);\n      #if CC_USE_DIFFUSEMAP == 2\n        ambDiff = unpackRGBE(diffuseMap);\n      #else\n        ambDiff = SRGBToLinear(diffuseMap.rgb);\n      #endif\n    #endif\n    vec3 R = normalize(reflect(-V, N));\n    #if USE_REFLECTION_DENOISE\n      vec3 env = GetEnvReflectionWithMipFiltering(R, s.roughness, cc_ambientGround.w, 0.6);\n    #else\n      vec4 envmap = fragTextureLod(cc_environment, R, s.roughness * cc_ambientGround.w);\n      #if CC_USE_IBL == 2\n        vec3 env = unpackRGBE(envmap);\n      #else\n        vec3 env = SRGBToLinear(envmap.rgb);\n      #endif\n    #endif\n    finalColor += env * cc_ambientSky.w * specular * s.occlusion;\n  #endif\n  finalColor += ambDiff.rgb * cc_ambientSky.w * diffuse * s.occlusion;\n  finalColor += s.emissive;\n  return vec4(finalColor, s.albedo.a);\n}\nvec3 ACESToneMap (vec3 color) {\n  color = min(color, vec3(8.0));\n  const float A = 2.51;\n  const float B = 0.03;\n  const float C = 2.43;\n  const float D = 0.59;\n  const float E = 0.14;\n  return (color * (A * color + B)) / (color * (C * color + D) + E);\n}\nvec4 CCFragOutput (vec4 color) {\n  #if CC_USE_HDR\n    color.rgb = ACESToneMap(color.rgb);\n  #endif\n  color.rgb = sqrt(color.rgb);\n  return color;\n}\nvarying highp vec4 v_shadowPos;\n#if CC_RECEIVE_SHADOW\n#endif\n#if CC_USE_LIGHTMAP && !USE_BATCHING && !CC_FORWARD_ADD\n  varying vec3 v_luv;\n  uniform sampler2D cc_lightingMap;\n#endif\nvarying vec3 v_position;\nvarying vec2 v_uv;\n#if HAS_SECOND_UV\n  varying mediump vec2 v_uv1;\n#endif\nvarying mediump vec3 v_normal;\n#if CC_RECEIVE_SHADOW\n  varying mediump vec2 v_shadowBias;\n#endif\n#if USE_VERTEX_COLOR\n  varying lowp vec4 v_color;\n#endif\n#if USE_ALBEDO_MAP\n  uniform sampler2D albedoMap;\n#endif\n#if USE_NORMAL_MAP\n  varying mediump vec4 v_tangent;\n  uniform sampler2D normalMap;\n#endif\n#if USE_PBR_MAP\n  uniform sampler2D pbrMap;\n#endif\n#if USE_METALLIC_ROUGHNESS_MAP\n  uniform sampler2D metallicRoughnessMap;\n#endif\n#if USE_OCCLUSION_MAP\n  uniform sampler2D occlusionMap;\n#endif\n#if USE_EMISSIVE_MAP\n  uniform sampler2D emissiveMap;\n#endif\n#if USE_ALPHA_TEST\n#endif\nvoid surf (out StandardSurface s) {\n  vec4 baseColor = albedo;\n  #if USE_VERTEX_COLOR\n    baseColor.rgb *= SRGBToLinear(v_color.rgb);\n    baseColor.a *= v_color.a;\n  #endif\n  #if USE_ALBEDO_MAP\n    vec4 texColor = texture2D(albedoMap, ALBEDO_UV);\n    texColor.rgb = SRGBToLinear(texColor.rgb);\n    baseColor *= texColor;\n  #endif\n  s.albedo = baseColor;\n  s.albedo.rgb *= albedoScaleAndCutoff.xyz;\n  #if USE_ALPHA_TEST\n    if (s.albedo.ALPHA_TEST_CHANNEL < albedoScaleAndCutoff.w) discard;\n  #endif\n  #if CC_USE_LIGHTMAP && !USE_BATCHING && !CC_FORWARD_ADD\n    vec4 lightColor = texture2D(cc_lightingMap, v_luv.xy);\n    s.lightmap = lightColor.xyz * v_luv.z;\n    s.lightmap_test = v_luv.z;\n  #endif\n  s.normal = v_normal;\n  #if CC_RECEIVE_SHADOW\n    s.shadowBias = v_shadowBias;\n  #endif\n  #if USE_NORMAL_MAP\n    vec3 nmmp = texture2D(normalMap, NORMAL_UV).xyz - vec3(0.5);\n    vec3 bitangent = cross(v_normal, v_tangent.xyz) * v_tangent.w;\n    s.normal =\n      (nmmp.x * emissiveScaleParam.w) * normalize(v_tangent.xyz) +\n      (nmmp.y * emissiveScaleParam.w) * normalize(bitangent) +\n      nmmp.z * normalize(s.normal);\n  #endif\n  #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\n  packHighpData(s.position, s.position_fract_part, v_position);\n  #else\n  s.position = v_position;\n  #endif\n  vec4 pbr = pbrParams;\n  #if USE_PBR_MAP\n    vec4 res = texture2D(pbrMap, PBR_UV);\n    pbr.x *= res.r;\n    pbr.y *= res.g;\n    pbr.z *= res.b;\n    pbr.w *= res.a;\n  #endif\n  #if USE_METALLIC_ROUGHNESS_MAP\n    vec4 metallicRoughness = texture2D(metallicRoughnessMap, PBR_UV);\n    pbr.z *= metallicRoughness.b;\n    pbr.y *= metallicRoughness.g;\n  #endif\n  #if USE_OCCLUSION_MAP\n    pbr.x *= texture2D(occlusionMap, PBR_UV).r;\n  #endif\n  s.occlusion = pbr.x;\n  s.roughness = pbr.y;\n  s.specularIntensity = 0.5;\n  s.metallic = pbr.z;\n  s.emissive = emissive.rgb * emissiveScaleParam.xyz;\n  #if USE_EMISSIVE_MAP\n    s.emissive *= SRGBToLinear(texture2D(emissiveMap, EMISSIVE_UV).rgb);\n  #endif\n}\n#if CC_FORWARD_ADD\n  #if CC_PIPELINE_TYPE == 0\n    #define LIGHTS_PER_PASS 1\n  #else\n    #define LIGHTS_PER_PASS 10\n  #endif\n  #if CC_ENABLE_CLUSTERED_LIGHT_CULLING == 0\n  uniform highp vec4 cc_lightPos[LIGHTS_PER_PASS];\n  uniform vec4 cc_lightColor[LIGHTS_PER_PASS];\n  uniform vec4 cc_lightSizeRangeAngle[LIGHTS_PER_PASS];\n  uniform vec4 cc_lightDir[LIGHTS_PER_PASS];\n  #endif\n  float SmoothDistAtt (float distSqr, float invSqrAttRadius) {\n    float factor = distSqr * invSqrAttRadius;\n    float smoothFactor = clamp(1.0 - factor * factor, 0.0, 1.0);\n    return smoothFactor * smoothFactor;\n  }\n  float GetDistAtt (float distSqr, float invSqrAttRadius) {\n    float attenuation = 1.0 / max(distSqr, 0.01*0.01);\n    attenuation *= SmoothDistAtt(distSqr , invSqrAttRadius);\n    return attenuation;\n  }\n  float GetAngleAtt (vec3 L, vec3 litDir, float litAngleScale, float litAngleOffset) {\n    float cd = dot(litDir, L);\n    float attenuation = clamp(cd * litAngleScale + litAngleOffset, 0.0, 1.0);\n    return (attenuation * attenuation);\n  }\n  #if CC_ENABLE_CLUSTERED_LIGHT_CULLING == 0\n  vec4 CCStandardShadingAdditive (StandardSurface s, vec4 shadowPos) {\n    vec3 position;\n    #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\n    position = unpackHighpData(s.position, s.position_fract_part);\n    #else\n    position = s.position;\n    #endif\n    vec3 diffuse = s.albedo.rgb * (1.0 - s.metallic);\n    vec3 specular = mix(vec3(0.04), s.albedo.rgb, s.metallic);\n    vec3 diffuseContrib = diffuse / PI;\n    vec3 N = normalize(s.normal);\n    vec3 V = normalize(cc_cameraPos.xyz - position);\n    float NV = max(abs(dot(N, V)), 0.0);\n    specular = BRDFApprox(specular, s.roughness, NV);\n    vec3 finalColor = vec3(0.0);\n    int numLights = CC_PIPELINE_TYPE == 0 ? LIGHTS_PER_PASS : int(cc_lightDir[0].w);\n    for (int i = 0; i < LIGHTS_PER_PASS; i++) {\n      if (i >= numLights) break;\n      vec3 SLU = cc_lightPos[i].xyz - position;\n      vec3 SL = normalize(SLU);\n      vec3 SH = normalize(SL + V);\n      float SNL = max(dot(N, SL), 0.0);\n      float SNH = max(dot(N, SH), 0.0);\n      float distSqr = dot(SLU, SLU);\n      float litRadius = cc_lightSizeRangeAngle[i].x;\n      float litRadiusSqr = litRadius * litRadius;\n      float illum = litRadiusSqr / max(litRadiusSqr, distSqr);\n      float attRadiusSqrInv = 1.0 / max(cc_lightSizeRangeAngle[i].y, 0.01);\n      attRadiusSqrInv *= attRadiusSqrInv;\n      float att = GetDistAtt(distSqr, attRadiusSqrInv);\n      vec3 lspec = specular * CalcSpecular(s.roughness, SNH, SH, N);\n      if (cc_lightPos[i].w > 0.0) {\n        float cosInner = max(dot(-cc_lightDir[i].xyz, SL), 0.01);\n        float cosOuter = cc_lightSizeRangeAngle[i].z;\n        float litAngleScale = 1.0 / max(0.001, cosInner - cosOuter);\n        float litAngleOffset = -cosOuter * litAngleScale;\n        att *= GetAngleAtt(SL, -cc_lightDir[i].xyz, litAngleScale, litAngleOffset);\n      }\n      vec3 lightColor = cc_lightColor[i].rgb;\n      float shadow = 1.0;\n      #if CC_RECEIVE_SHADOW\n        if (cc_lightPos[i].w > 0.0 && cc_lightSizeRangeAngle[i].w > 0.0) {\n          shadow = CCSpotShadowFactorBase(shadowPos, position, s.shadowBias);\n        }\n      #endif\n      lightColor *= shadow;\n      finalColor += SNL * lightColor * cc_lightColor[i].w * illum * att * (diffuseContrib + lspec);\n    }\n    return vec4(finalColor, 0.0);\n  }\n  #endif\n  #if CC_ENABLE_CLUSTERED_LIGHT_CULLING == 1\n  readonly buffer b_ccLightsBuffer { vec4 b_ccLights[]; };\n  readonly buffer b_clusterLightIndicesBuffer { uint b_clusterLightIndices[]; };\n  readonly buffer b_clusterLightGridBuffer { uvec4 b_clusterLightGrid[]; };\n  struct CCLight\n  {\n    vec4 cc_lightPos;\n    vec4 cc_lightColor;\n    vec4 cc_lightSizeRangeAngle;\n    vec4 cc_lightDir;\n  };\n  struct Cluster\n  {\n    vec3 minBounds;\n    vec3 maxBounds;\n  };\n  struct LightGrid\n  {\n    uint offset;\n    uint ccLights;\n  };\n  CCLight getCCLight(uint i)\n  {\n    CCLight light;\n    light.cc_lightPos = b_ccLights[4u * i + 0u];\n    light.cc_lightColor = b_ccLights[4u * i + 1u];\n    light.cc_lightSizeRangeAngle = b_ccLights[4u * i + 2u];\n    light.cc_lightDir = b_ccLights[4u * i + 3u];\n    return light;\n  }\n  LightGrid getLightGrid(uint cluster)\n  {\n    uvec4 gridvec = b_clusterLightGrid[cluster];\n    LightGrid grid;\n    grid.offset = gridvec.x;\n    grid.ccLights = gridvec.y;\n    return grid;\n  }\n  uint getGridLightIndex(uint start, uint offset)\n  {\n    return b_clusterLightIndices[start + offset];\n  }\n  uint getClusterZIndex(vec4 worldPos)\n  {\n    float scale = float(24) / log(cc_nearFar.y / cc_nearFar.x);\n    float bias = -(float(24) * log(cc_nearFar.x) / log(cc_nearFar.y / cc_nearFar.x));\n    float eyeDepth = -(cc_matView * worldPos).z;\n    uint zIndex = uint(max(log(eyeDepth) * scale + bias, 0.0));\n    return zIndex;\n  }\n  uint getClusterIndex(vec4 fragCoord, vec4 worldPos)\n  {\n    uint zIndex = getClusterZIndex(worldPos);\n    float clusterSizeX = ceil(cc_viewPort.z / float(16));\n    float clusterSizeY = ceil(cc_viewPort.w / float(8));\n    uvec3 indices = uvec3(uvec2(fragCoord.xy / vec2(clusterSizeX, clusterSizeY)), zIndex);\n    uint cluster = (16u * 8u) * indices.z + 16u * indices.y + indices.x;\n    return cluster;\n  }\n  vec4 CCClusterShadingAdditive (StandardSurface s, vec4 shadowPos) {\n    vec3 diffuse = s.albedo.rgb * (1.0 - s.metallic);\n    vec3 specular = mix(vec3(0.04), s.albedo.rgb, s.metallic);\n    vec3 diffuseContrib = diffuse / PI;\n    vec3 position;\n    #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\n    position = unpackHighpData(s.position, s.position_fract_part);\n    #else\n    position = s.position;\n    #endif\n    vec3 N = normalize(s.normal);\n    vec3 V = normalize(cc_cameraPos.xyz - position);\n    float NV = max(abs(dot(N, V)), 0.001);\n    specular = BRDFApprox(specular, s.roughness, NV);\n    vec3 finalColor = vec3(0.0);\n    uint cluster = getClusterIndex(gl_FragCoord, vec4(position, 1.0));\n    LightGrid grid = getLightGrid(cluster);\n    uint numLights = grid.ccLights;\n    for (uint i = 0u; i < 100u; i++) {\n      if (i >= numLights) break;\n      uint lightIndex = getGridLightIndex(grid.offset, i);\n      CCLight light = getCCLight(lightIndex);\n      vec3 SLU = light.cc_lightPos.xyz - position;\n      vec3 SL = normalize(SLU);\n      vec3 SH = normalize(SL + V);\n      float SNL = max(dot(N, SL), 0.001);\n      float SNH = max(dot(N, SH), 0.0);\n      float distSqr = dot(SLU, SLU);\n      float litRadius = light.cc_lightSizeRangeAngle.x;\n      float litRadiusSqr = litRadius * litRadius;\n      float illum = PI * (litRadiusSqr / max(litRadiusSqr , distSqr));\n      float attRadiusSqrInv = 1.0 / max(light.cc_lightSizeRangeAngle.y, 0.01);\n      attRadiusSqrInv *= attRadiusSqrInv;\n      float att = GetDistAtt(distSqr, attRadiusSqrInv);\n      vec3 lspec = specular * CalcSpecular(s.roughness, SNH, SH, N);\n      if (light.cc_lightPos.w > 0.0) {\n        float cosInner = max(dot(-light.cc_lightDir.xyz, SL), 0.01);\n        float cosOuter = light.cc_lightSizeRangeAngle.z;\n        float litAngleScale = 1.0 / max(0.001, cosInner - cosOuter);\n        float litAngleOffset = -cosOuter * litAngleScale;\n        att *= GetAngleAtt(SL, -light.cc_lightDir.xyz, litAngleScale, litAngleOffset);\n      }\n      vec3 lightColor = light.cc_lightColor.rgb;\n      float shadow = 1.0;\n      #if CC_RECEIVE_SHADOW\n        if (light.cc_lightPos.w > 0.0) {\n          shadow = CCSpotShadowFactorBase(shadowPos, position, s.shadowBias);\n        }\n      #endif\n      lightColor *= shadow;\n      finalColor += SNL * lightColor * light.cc_lightColor.w * illum * att * (diffuseContrib + lspec);\n    }\n    return vec4(finalColor, 0.0);\n  }\n  #endif\n  void main () {\n    StandardSurface s; surf(s);\n    #if CC_ENABLE_CLUSTERED_LIGHT_CULLING == 1\n    vec4 color = CCClusterShadingAdditive(s, v_shadowPos);\n    #else\n    vec4 color = CCStandardShadingAdditive(s, v_shadowPos);\n    #endif\n    gl_FragData[0] = CCFragOutput(color);\n  }\n#elif (CC_PIPELINE_TYPE == 0 || CC_FORCE_FORWARD_SHADING)\n  void main () {\n    StandardSurface s; surf(s);\n    vec4 color = CCStandardShadingBase(s, v_shadowPos);\n    CC_APPLY_FOG(color, s.position.xyz);\n    gl_FragData[0] = CCFragOutput(color);\n  }\n#elif CC_PIPELINE_TYPE == 1\n  vec2 signNotZero(vec2 v) {\n    return vec2((v.x >= 0.0) ? +1.0 : -1.0, (v.y >= 0.0) ? +1.0 : -1.0);\n  }\n  vec2 float32x3_to_oct(in vec3 v) {\n    vec2 p = v.xy * (1.0 / (abs(v.x) + abs(v.y) + abs(v.z)));\n    return (v.z <= 0.0) ? ((1.0 - abs(p.yx)) * signNotZero(p)) : p;\n  }\n  void main () {\n    StandardSurface s; surf(s);\n    gl_FragData[0] = s.albedo;\n    gl_FragData[1] = vec4(float32x3_to_oct(s.normal), s.roughness, s.metallic);\n    gl_FragData[2] = vec4(s.emissive, s.occlusion);\n  }\n#endif"},"builtins":{"globals":{"blocks":[{"name":"CCGlobal","defines":[]},{"name":"CCCamera","defines":[]},{"name":"CCShadow","defines":[]}],"samplerTextures":[{"name":"cc_shadowMap","defines":["CC_RECEIVE_SHADOW"]},{"name":"cc_spotLightingMap","defines":["CC_RECEIVE_SHADOW"]},{"name":"cc_environment","defines":["CC_USE_IBL"]},{"name":"cc_diffuseMap","defines":["CC_USE_DIFFUSEMAP"]}],"buffers":[],"images":[]},"locals":{"blocks":[{"name":"CCMorph","defines":["CC_USE_MORPH"]},{"name":"CCSkinningTexture","defines":["CC_USE_SKINNING","CC_USE_BAKED_ANIMATION"]},{"name":"CCSkinningAnimation","defines":["CC_USE_SKINNING","CC_USE_BAKED_ANIMATION"]},{"name":"CCSkinning","defines":["CC_USE_SKINNING","!CC_USE_BAKED_ANIMATION"]},{"name":"CCLocalBatched","defines":["!USE_INSTANCING","USE_BATCHING"]},{"name":"CCLocal","defines":["!USE_INSTANCING","!USE_BATCHING"]},{"name":"CCForwardLight","defines":["CC_FORWARD_ADD","CC_ENABLE_CLUSTERED_LIGHT_CULLING"]}],"samplerTextures":[{"name":"cc_PositionDisplacements","defines":["CC_USE_MORPH","CC_MORPH_TARGET_HAS_POSITION"]},{"name":"cc_NormalDisplacements","defines":["CC_USE_MORPH","CC_MORPH_TARGET_HAS_NORMAL"]},{"name":"cc_TangentDisplacements","defines":["CC_USE_MORPH","CC_MORPH_TARGET_HAS_TANGENT"]},{"name":"cc_jointTexture","defines":["CC_USE_SKINNING","CC_USE_BAKED_ANIMATION"]},{"name":"cc_lightingMap","defines":["CC_USE_LIGHTMAP","!USE_BATCHING","!CC_FORWARD_ADD"]}],"buffers":[],"images":[]},"statistics":{"CC_EFFECT_USED_VERTEX_UNIFORM_VECTORS":223,"CC_EFFECT_USED_FRAGMENT_UNIFORM_VECTORS":75}},"defines":[{"name":"USE_INSTANCING","type":"boolean","defines":[],"editor":{"elevated":true}},{"name":"USE_BATCHING","type":"boolean","defines":["!USE_INSTANCING"],"editor":{"elevated":true}},{"name":"CC_USE_SKINNING","type":"boolean","defines":[]},{"name":"CC_USE_BAKED_ANIMATION","type":"boolean","defines":["USE_INSTANCING"]},{"name":"CC_USE_LIGHTMAP","type":"boolean","defines":[]},{"name":"CC_RECEIVE_SHADOW","type":"boolean","defines":[]},{"name":"CC_USE_MORPH","type":"boolean","defines":[]},{"name":"CC_MORPH_TARGET_COUNT","type":"number","defines":["CC_USE_MORPH"],"range":[2,8]},{"name":"CC_MORPH_PRECOMPUTED","type":"boolean","defines":["CC_USE_MORPH"]},{"name":"CC_MORPH_TARGET_HAS_POSITION","type":"boolean","defines":["CC_USE_MORPH"]},{"name":"CC_MORPH_TARGET_HAS_NORMAL","type":"boolean","defines":["CC_USE_MORPH"]},{"name":"CC_MORPH_TARGET_HAS_TANGENT","type":"boolean","defines":["CC_USE_MORPH"]},{"name":"CC_USE_FOG","type":"number","defines":[],"range":[0,4]},{"name":"CC_USE_ACCURATE_FOG","type":"boolean","defines":[]},{"name":"USE_VERTEX_COLOR","type":"boolean","defines":[]},{"name":"HAS_SECOND_UV","type":"boolean","defines":[]},{"name":"USE_NORMAL_MAP","type":"boolean","defines":[]},{"name":"CC_FORWARD_ADD","type":"boolean","defines":[]},{"name":"USE_TWOSIDE","type":"boolean","defines":[]},{"name":"SAMPLE_FROM_RT","type":"boolean","defines":[]},{"name":"CC_USE_IBL","type":"number","defines":[],"range":[0,2]},{"name":"CC_USE_DIFFUSEMAP","type":"number","defines":[],"range":[0,2]},{"name":"USE_REFLECTION_DENOISE","type":"boolean","defines":[]},{"name":"CC_USE_HDR","type":"boolean","defines":[]},{"name":"USE_ALBEDO_MAP","type":"boolean","defines":[]},{"name":"ALBEDO_UV","type":"string","defines":["USE_ALBEDO_MAP"],"options":["v_uv","v_uv1"]},{"name":"NORMAL_UV","type":"string","defines":["USE_NORMAL_MAP"],"options":["v_uv","v_uv1"]},{"name":"PBR_UV","type":"string","defines":[],"options":["v_uv","v_uv1"]},{"name":"USE_PBR_MAP","type":"boolean","defines":[]},{"name":"USE_METALLIC_ROUGHNESS_MAP","type":"boolean","defines":[]},{"name":"USE_OCCLUSION_MAP","type":"boolean","defines":[]},{"name":"USE_EMISSIVE_MAP","type":"boolean","defines":[]},{"name":"EMISSIVE_UV","type":"string","defines":["USE_EMISSIVE_MAP"],"options":["v_uv","v_uv1"]},{"name":"USE_ALPHA_TEST","type":"boolean","defines":[]},{"name":"ALPHA_TEST_CHANNEL","type":"string","defines":["USE_ALPHA_TEST"],"options":["a","r"]},{"name":"CC_PIPELINE_TYPE","type":"number","defines":["CC_FORWARD_ADD"],"range":[0,1]},{"name":"CC_FORCE_FORWARD_SHADING","type":"boolean","defines":["CC_FORWARD_ADD"]}]},{"hash":3928335406,"name":"builtin-standard|shadow-caster-vs:vert|shadow-caster-fs:frag","blocks":[{"name":"Constants","stageFlags":17,"binding":0,"members":[{"name":"tilingOffset","type":16,"count":1},{"name":"albedo","type":16,"count":1},{"name":"albedoScaleAndCutoff","type":16,"count":1},{"name":"pbrParams","type":16,"count":1},{"name":"emissive","type":16,"count":1},{"name":"emissiveScaleParam","type":16,"count":1}],"defines":[]}],"samplerTextures":[{"name":"albedoMap","type":28,"count":1,"stageFlags":16,"binding":1,"defines":["USE_ALBEDO_MAP"]}],"samplers":[],"textures":[],"buffers":[],"images":[],"subpassInputs":[],"attributes":[{"name":"a_position","format":32,"location":0,"defines":[]},{"name":"a_normal","format":32,"location":1,"defines":[]},{"name":"a_texCoord","format":21,"location":2,"defines":[]},{"name":"a_tangent","format":44,"location":3,"defines":[]},{"name":"a_joints","location":4,"defines":["CC_USE_SKINNING"]},{"name":"a_weights","format":44,"location":5,"defines":["CC_USE_SKINNING"]},{"name":"a_jointAnimInfo","format":44,"isInstanced":true,"location":6,"defines":["USE_INSTANCING","CC_USE_BAKED_ANIMATION"]},{"name":"a_matWorld0","format":44,"isInstanced":true,"location":7,"defines":["USE_INSTANCING"]},{"name":"a_matWorld1","format":44,"isInstanced":true,"location":8,"defines":["USE_INSTANCING"]},{"name":"a_matWorld2","format":44,"isInstanced":true,"location":9,"defines":["USE_INSTANCING"]},{"name":"a_lightingMapUVParam","format":44,"isInstanced":true,"location":10,"defines":["USE_INSTANCING","CC_USE_LIGHTMAP"]},{"name":"a_localShadowBias","format":21,"isInstanced":true,"location":11,"defines":["USE_INSTANCING","CC_RECEIVE_SHADOW"]},{"name":"a_dyn_batch_id","format":11,"location":12,"defines":["!USE_INSTANCING","USE_BATCHING"]},{"name":"a_vertexId","format":11,"location":13,"defines":["CC_USE_MORPH"]},{"name":"a_texCoord1","format":21,"location":14,"defines":[]}],"varyings":[{"name":"v_uv","type":14,"count":1,"stageFlags":17,"location":0,"defines":[]},{"name":"v_uv1","type":14,"count":1,"stageFlags":17,"location":1,"defines":["HAS_SECOND_UV"]},{"name":"v_worldPos","type":16,"count":1,"stageFlags":17,"location":2,"defines":[]},{"name":"v_clip_depth","type":13,"count":1,"stageFlags":17,"location":3,"defines":[]}],"fragColors":[{"name":"cc_FragColor","typename":"vec4","type":16,"count":1,"stageFlags":16,"location":0,"defines":[]}],"glsl4":{"vert":"#extension GL_EXT_shader_explicit_arithmetic_types_int32: require\nprecision highp float;\n#define QUATER_PI         0.78539816340\n#define HALF_PI           1.57079632679\n#define PI                3.14159265359\n#define PI2               6.28318530718\n#define PI4               12.5663706144\n#define INV_QUATER_PI     1.27323954474\n#define INV_HALF_PI       0.63661977237\n#define INV_PI            0.31830988618\n#define INV_PI2           0.15915494309\n#define INV_PI4           0.07957747155\n#define EPSILON           1e-6\n#define EPSILON_LOWP      1e-4\n#define LOG2              1.442695\n#define EXP_VALUE         2.71828183f\n#define FP_MAX            65504.0\n#define FP_SCALE          0.0009765625\n#define FP_SCALE_INV      1024.0\n#define GRAY_VECTOR       vec3(0.299, 0.587, 0.114)\nhighp float decode32 (highp vec4 rgba) {\n  rgba = rgba * 255.0;\n  highp float Sign = 1.0 - (step(128.0, (rgba[3]) + 0.5)) * 2.0;\n  highp float Exponent = 2.0 * (mod(float(int((rgba[3]) + 0.5)), 128.0)) + (step(128.0, (rgba[2]) + 0.5)) - 127.0;\n  highp float Mantissa = (mod(float(int((rgba[2]) + 0.5)), 128.0)) * 65536.0 + rgba[1] * 256.0 + rgba[0] + 8388608.0;\n  return Sign * exp2(Exponent - 23.0) * Mantissa;\n}\nstruct StandardVertInput {\n  highp vec4 position;\n  vec3 normal;\n  vec4 tangent;\n};\nlayout(location = 0) in vec3 a_position;\nlayout(location = 1) in vec3 a_normal;\nlayout(location = 2) in vec2 a_texCoord;\nlayout(location = 3) in vec4 a_tangent;\n#if CC_USE_SKINNING\n    layout(location = 4) in u32vec4 a_joints;\n  layout(location = 5) in vec4 a_weights;\n#endif\n#if USE_INSTANCING\n  #if CC_USE_BAKED_ANIMATION\n    layout(location = 6) in highp vec4 a_jointAnimInfo;\n  #endif\n  layout(location = 7) in vec4 a_matWorld0;\n  layout(location = 8) in vec4 a_matWorld1;\n  layout(location = 9) in vec4 a_matWorld2;\n  #if CC_USE_LIGHTMAP\n    layout(location = 10) in vec4 a_lightingMapUVParam;\n  #endif\n  #if CC_RECEIVE_SHADOW\n    layout(location = 11) in vec2 a_localShadowBias;\n  #endif\n#elif USE_BATCHING\n  layout(location = 12) in float a_dyn_batch_id;\n#endif\n#if CC_USE_MORPH\n    int getVertexId() {\n      return gl_VertexIndex;\n    }\n#endif\n#if CC_USE_MORPH\n  layout(set = 2, binding = 4) uniform CCMorph {\n    vec4 cc_displacementWeights[15];\n    vec4 cc_displacementTextureInfo;\n  };\n  vec2 getPixelLocation(vec2 textureResolution, int pixelIndex) {\n    float pixelIndexF = float(pixelIndex);\n    float x = mod(pixelIndexF, textureResolution.x);\n    float y = floor(pixelIndexF / textureResolution.x);\n    return vec2(x, y);\n  }\n  vec2 getPixelCoordFromLocation(vec2 location, vec2 textureResolution) {\n    return (vec2(location.x, location.y) + .5) / textureResolution;\n  }\n  #if CC_DEVICE_SUPPORT_FLOAT_TEXTURE\n      vec4 fetchVec3ArrayFromTexture(sampler2D tex, int pixelIndex) {\n        ivec2 texSize = textureSize(tex, 0);\n        return texelFetch(tex, ivec2(pixelIndex % texSize.x, pixelIndex / texSize.x), 0);\n      }\n  #else\n    vec4 fetchVec3ArrayFromTexture(sampler2D tex, int elementIndex) {\n      int pixelIndex = elementIndex * 4;\n      vec2 location = getPixelLocation(cc_displacementTextureInfo.xy, pixelIndex);\n      vec2 x = getPixelCoordFromLocation(location + vec2(0.0, 0.0), cc_displacementTextureInfo.xy);\n      vec2 y = getPixelCoordFromLocation(location + vec2(1.0, 0.0), cc_displacementTextureInfo.xy);\n      vec2 z = getPixelCoordFromLocation(location + vec2(2.0, 0.0), cc_displacementTextureInfo.xy);\n      return vec4(\n        decode32(texture(tex, x)),\n        decode32(texture(tex, y)),\n        decode32(texture(tex, z)),\n        1.0\n      );\n    }\n  #endif\n  float getDisplacementWeight(int index) {\n    int quot = index / 4;\n    int remainder = index - quot * 4;\n    if (remainder == 0) {\n      return cc_displacementWeights[quot].x;\n    } else if (remainder == 1) {\n      return cc_displacementWeights[quot].y;\n    } else if (remainder == 2) {\n      return cc_displacementWeights[quot].z;\n    } else {\n      return cc_displacementWeights[quot].w;\n    }\n  }\n  vec3 getVec3DisplacementFromTexture(sampler2D tex, int vertexIndex) {\n  #if CC_MORPH_PRECOMPUTED\n    return fetchVec3ArrayFromTexture(tex, vertexIndex).rgb;\n  #else\n    vec3 result = vec3(0, 0, 0);\n    int nVertices = int(cc_displacementTextureInfo.z);\n    for (int iTarget = 0; iTarget < CC_MORPH_TARGET_COUNT; ++iTarget) {\n      result += (fetchVec3ArrayFromTexture(tex, nVertices * iTarget + vertexIndex).rgb * getDisplacementWeight(iTarget));\n    }\n    return result;\n  #endif\n  }\n  #if CC_MORPH_TARGET_HAS_POSITION\n    layout(set = 2, binding = 7) uniform sampler2D cc_PositionDisplacements;\n    vec3 getPositionDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_PositionDisplacements, vertexId);\n    }\n  #endif\n  #if CC_MORPH_TARGET_HAS_NORMAL\n    layout(set = 2, binding = 8) uniform sampler2D cc_NormalDisplacements;\n    vec3 getNormalDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_NormalDisplacements, vertexId);\n    }\n  #endif\n  #if CC_MORPH_TARGET_HAS_TANGENT\n    layout(set = 2, binding = 9) uniform sampler2D cc_TangentDisplacements;\n    vec3 getTangentDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_TangentDisplacements, vertexId);\n    }\n  #endif\n  void applyMorph (inout vec4 position, inout vec3 normal, inout vec4 tangent) {\n    int vertexId = getVertexId();\n  #if CC_MORPH_TARGET_HAS_POSITION\n    position.xyz = position.xyz + getPositionDisplacement(vertexId);\n  #endif\n  #if CC_MORPH_TARGET_HAS_NORMAL\n    normal.xyz = normal.xyz + getNormalDisplacement(vertexId);\n  #endif\n  #if CC_MORPH_TARGET_HAS_TANGENT\n    tangent.xyz = tangent.xyz + getTangentDisplacement(vertexId);\n  #endif\n  }\n  void applyMorph (inout vec4 position) {\n  #if CC_MORPH_TARGET_HAS_POSITION\n    position.xyz = position.xyz + getPositionDisplacement(getVertexId());\n  #endif\n  }\n#endif\n#if CC_USE_SKINNING\n  #if CC_USE_BAKED_ANIMATION\n    layout(set = 2, binding = 3) uniform CCSkinningTexture {\n      highp vec4 cc_jointTextureInfo;\n    };\n    layout(set = 2, binding = 2) uniform CCSkinningAnimation {\n      highp vec4 cc_jointAnimInfo;\n    };\n    layout(set = 2, binding = 6) uniform highp sampler2D cc_jointTexture;\n    void CCGetJointTextureCoords(float pixelsPerJoint, float jointIdx, out highp float x, out highp float y, out highp float invSize)\n    {\n      #if USE_INSTANCING\n        highp float temp = pixelsPerJoint * (a_jointAnimInfo.x * a_jointAnimInfo.y + jointIdx) + a_jointAnimInfo.z;\n      #else\n        highp float temp = pixelsPerJoint * (cc_jointAnimInfo.x * cc_jointTextureInfo.y + jointIdx) + cc_jointTextureInfo.z;\n      #endif\n      invSize = cc_jointTextureInfo.w;\n      highp float tempY = floor(temp * invSize);\n      x = floor(temp - tempY * cc_jointTextureInfo.x);\n      y = (tempY + 0.5) * invSize;\n    }\n  #else\n    layout(set = 2, binding = 3) uniform CCSkinning {\n      highp vec4 cc_joints[30 * 3];\n    };\n  #endif\n  #if CC_USE_BAKED_ANIMATION\n    #if CC_DEVICE_SUPPORT_FLOAT_TEXTURE\n      mat4 getJointMatrix (float i) {\n        highp float x, y, invSize;\n        CCGetJointTextureCoords(3.0, i, x, y, invSize);\n        vec4 v1 = texture(cc_jointTexture, vec2((x + 0.5) * invSize, y));\n        vec4 v2 = texture(cc_jointTexture, vec2((x + 1.5) * invSize, y));\n        vec4 v3 = texture(cc_jointTexture, vec2((x + 2.5) * invSize, y));\n        return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n      }\n    #else\n      mat4 getJointMatrix (float i) {\n        highp float x, y, invSize;\n        CCGetJointTextureCoords(12.0, i, x, y, invSize);\n        vec4 v1 = vec4(\n          decode32(texture(cc_jointTexture, vec2((x + 0.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 1.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 2.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 3.5) * invSize, y)))\n        );\n        vec4 v2 = vec4(\n          decode32(texture(cc_jointTexture, vec2((x + 4.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 5.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 6.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 7.5) * invSize, y)))\n        );\n        vec4 v3 = vec4(\n          decode32(texture(cc_jointTexture, vec2((x + 8.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 9.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 10.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 11.5) * invSize, y)))\n        );\n        return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n      }\n    #endif\n  #else\n    mat4 getJointMatrix (float i) {\n      int idx = int(i);\n      vec4 v1 = cc_joints[idx * 3];\n      vec4 v2 = cc_joints[idx * 3 + 1];\n      vec4 v3 = cc_joints[idx * 3 + 2];\n      return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n    }\n  #endif\n  mat4 skinMatrix () {\n    vec4 joints = vec4(a_joints);\n    return getJointMatrix(joints.x) * a_weights.x\n         + getJointMatrix(joints.y) * a_weights.y\n         + getJointMatrix(joints.z) * a_weights.z\n         + getJointMatrix(joints.w) * a_weights.w;\n  }\n  void CCSkin (inout vec4 position) {\n    mat4 m = skinMatrix();\n    position = m * position;\n  }\n  void CCSkin (inout vec4 position, inout vec3 normal, inout vec4 tangent) {\n    mat4 m = skinMatrix();\n    position = m * position;\n    normal = (m * vec4(normal, 0.0)).xyz;\n    tangent.xyz = (m * vec4(tangent.xyz, 0.0)).xyz;\n  }\n#endif\nvoid CCVertInput(inout StandardVertInput In)\n{\n    In.position = vec4(a_position, 1.0);\n    In.normal = a_normal;\n    In.tangent = a_tangent;\n  #if CC_USE_MORPH\n    applyMorph(In.position, In.normal, In.tangent);\n  #endif\n  #if CC_USE_SKINNING\n    CCSkin(In.position, In.normal, In.tangent);\n  #endif\n}\n#if !USE_INSTANCING\n  #if USE_BATCHING\n    layout(set = 2, binding = 0) uniform CCLocalBatched {\n      highp mat4 cc_matWorlds[10];\n    };\n  #else\n    layout(set = 2, binding = 0) uniform CCLocal {\n      highp mat4 cc_matWorld;\n      highp mat4 cc_matWorldIT;\n      highp vec4 cc_lightingMapUVParam;\n      highp vec4 cc_localShadowBias;\n    };\n  #endif\n#endif\nvoid CCGetWorldMatrixFull(out mat4 matWorld, out mat4 matWorldIT)\n{\n  #if USE_INSTANCING\n    matWorld = mat4(\n      vec4(a_matWorld0.xyz, 0.0),\n      vec4(a_matWorld1.xyz, 0.0),\n      vec4(a_matWorld2.xyz, 0.0),\n      vec4(a_matWorld0.w, a_matWorld1.w, a_matWorld2.w, 1.0)\n    );\n    matWorldIT = matWorld;\n  #elif USE_BATCHING\n    matWorld = cc_matWorlds[int(a_dyn_batch_id)];\n    matWorldIT = matWorld;\n  #else\n    matWorld = cc_matWorld;\n    matWorldIT = cc_matWorldIT;\n  #endif\n}\nlayout(set = 1, binding = 0) uniform Constants {\n  vec4 tilingOffset;\n  vec4 albedo;\n  vec4 albedoScaleAndCutoff;\n  vec4 pbrParams;\n  vec4 emissive;\n  vec4 emissiveScaleParam;\n};\nlayout(set = 0, binding = 2) uniform CCShadow {\n  highp mat4 cc_matLightPlaneProj;\n  highp mat4 cc_matLightView;\n  highp mat4 cc_matLightViewProj;\n  highp vec4 cc_shadowInvProjDepthInfo;\n  highp vec4 cc_shadowProjDepthInfo;\n  highp vec4 cc_shadowProjInfo;\n  mediump vec4 cc_shadowNFLSInfo;\n  mediump vec4 cc_shadowWHPBInfo;\n  mediump vec4 cc_shadowLPNNInfo;\n  lowp vec4 cc_shadowColor;\n  mediump vec4 cc_planarNDInfo;\n};\n#if HAS_SECOND_UV || CC_USE_LIGHTMAP\n  layout(location = 14) in vec2 a_texCoord1;\n#endif\nlayout(location = 0) out vec2 v_uv;\n#if HAS_SECOND_UV\n  layout(location = 1) out vec2 v_uv1;\n#endif\nlayout(location = 2) out vec4 v_worldPos;\nlayout(location = 3) out float v_clip_depth;\nvec4 vert () {\n  StandardVertInput In;\n  CCVertInput(In);\n  mat4 matWorld, matWorldIT;\n  CCGetWorldMatrixFull(matWorld, matWorldIT);\n  v_worldPos = matWorld * In.position;\n  vec4 clipPos = cc_matLightViewProj * v_worldPos;\n  v_uv = a_texCoord * tilingOffset.xy + tilingOffset.zw;\n  #if HAS_SECOND_UV\n    v_uv1 = a_texCoord1 * tilingOffset.xy + tilingOffset.zw;\n  #endif\n  v_clip_depth = clipPos.z / clipPos.w * 0.5 + 0.5;\n  return clipPos;\n}\nvoid main() { gl_Position = vert(); }","frag":"\nprecision highp float;\nlayout(set = 1, binding = 0) uniform Constants {\n  vec4 tilingOffset;\n  vec4 albedo;\n  vec4 albedoScaleAndCutoff;\n  vec4 pbrParams;\n  vec4 emissive;\n  vec4 emissiveScaleParam;\n};\nvec4 packDepthToRGBA (float depth) {\n  vec4 ret = vec4(1.0, 255.0, 65025.0, 16581375.0) * depth;\n  ret = fract(ret);\n  ret -= vec4(ret.yzw, 0.0) / 255.0;\n  return ret;\n}\n#define QUATER_PI         0.78539816340\n#define HALF_PI           1.57079632679\n#define PI                3.14159265359\n#define PI2               6.28318530718\n#define PI4               12.5663706144\n#define INV_QUATER_PI     1.27323954474\n#define INV_HALF_PI       0.63661977237\n#define INV_PI            0.31830988618\n#define INV_PI2           0.15915494309\n#define INV_PI4           0.07957747155\n#define EPSILON           1e-6\n#define EPSILON_LOWP      1e-4\n#define LOG2              1.442695\n#define EXP_VALUE         2.71828183f\n#define FP_MAX            65504.0\n#define FP_SCALE          0.0009765625\n#define FP_SCALE_INV      1024.0\n#define GRAY_VECTOR       vec3(0.299, 0.587, 0.114)\nlayout(set = 0, binding = 0) uniform CCGlobal {\n  highp   vec4 cc_time;\n  mediump vec4 cc_screenSize;\n  mediump vec4 cc_nativeSize;\n};\nlayout(set = 0, binding = 1) uniform CCCamera {\n  highp   mat4 cc_matView;\n  highp   mat4 cc_matViewInv;\n  highp   mat4 cc_matProj;\n  highp   mat4 cc_matProjInv;\n  highp   mat4 cc_matViewProj;\n  highp   mat4 cc_matViewProjInv;\n  highp   vec4 cc_cameraPos;\n  mediump vec4 cc_screenScale;\n  mediump vec4 cc_exposure;\n  mediump vec4 cc_mainLitDir;\n  mediump vec4 cc_mainLitColor;\n  mediump vec4 cc_ambientSky;\n  mediump vec4 cc_ambientGround;\n  mediump vec4 cc_fogColor;\n  mediump vec4 cc_fogBase;\n  mediump vec4 cc_fogAdd;\n  mediump vec4 cc_nearFar;\n  mediump vec4 cc_viewPort;\n};\nlayout(set = 0, binding = 2) uniform CCShadow {\n  highp mat4 cc_matLightPlaneProj;\n  highp mat4 cc_matLightView;\n  highp mat4 cc_matLightViewProj;\n  highp vec4 cc_shadowInvProjDepthInfo;\n  highp vec4 cc_shadowProjDepthInfo;\n  highp vec4 cc_shadowProjInfo;\n  mediump vec4 cc_shadowNFLSInfo;\n  mediump vec4 cc_shadowWHPBInfo;\n  mediump vec4 cc_shadowLPNNInfo;\n  lowp vec4 cc_shadowColor;\n  mediump vec4 cc_planarNDInfo;\n};\nlayout(set = 2, binding = 0) uniform CCLocal {\n  highp mat4 cc_matWorld;\n  highp mat4 cc_matWorldIT;\n  highp vec4 cc_lightingMapUVParam;\n  highp vec4 cc_localShadowBias;\n};\nfloat CCGetLinearDepthFromViewSpace(vec3 viewPos) {\n  float dist = length(viewPos);\n  return (dist - cc_shadowNFLSInfo.x) / (cc_shadowNFLSInfo.y - cc_shadowNFLSInfo.x);\n}\nfloat CCGetLinearDepth(vec3 worldPos) {\n  vec4 viewStartPos = cc_matLightView * vec4(worldPos.xyz, 1.0);\n  return CCGetLinearDepthFromViewSpace(viewStartPos.xyz);\n}\n#if CC_RECEIVE_SHADOW\n  layout(set = 0, binding = 3) uniform highp sampler2D cc_shadowMap;\n  layout(set = 0, binding = 5) uniform highp sampler2D cc_spotLightingMap;\n#endif\nlayout(location = 0) in vec2 v_uv;\n#if HAS_SECOND_UV\n  layout(location = 1) in vec2 v_uv1;\n#endif\nlayout(location = 2) in vec4 v_worldPos;\nlayout(location = 3) in float v_clip_depth;\n#if USE_ALBEDO_MAP\n  layout(set = 1, binding = 1) uniform sampler2D albedoMap;\n#endif\n#if USE_ALPHA_TEST\n#endif\nvec4 frag () {\n  vec4 baseColor = albedo;\n  #if USE_ALBEDO_MAP\n    baseColor *= texture(albedoMap, ALBEDO_UV);\n  #endif\n  #if USE_ALPHA_TEST\n    if (baseColor.ALPHA_TEST_CHANNEL < albedoScaleAndCutoff.w) discard;\n  #endif\n  if(cc_shadowLPNNInfo.x > 0.000001 && cc_shadowLPNNInfo.x < 1.999999) {\n    if (cc_shadowNFLSInfo.z > 0.000001) {\n      return vec4(CCGetLinearDepth(v_worldPos.xyz), 1.0, 1.0, 1.0);\n    }\n  }\n  if (cc_shadowLPNNInfo.y > 0.000001) {\n    return packDepthToRGBA(v_clip_depth);\n  }\n  return vec4(v_clip_depth, 1.0, 1.0, 1.0);\n}\nlayout(location = 0) out vec4 cc_FragColor;\nvoid main() { cc_FragColor = frag(); }"},"glsl3":{"vert":"\nprecision highp float;\n#define QUATER_PI         0.78539816340\n#define HALF_PI           1.57079632679\n#define PI                3.14159265359\n#define PI2               6.28318530718\n#define PI4               12.5663706144\n#define INV_QUATER_PI     1.27323954474\n#define INV_HALF_PI       0.63661977237\n#define INV_PI            0.31830988618\n#define INV_PI2           0.15915494309\n#define INV_PI4           0.07957747155\n#define EPSILON           1e-6\n#define EPSILON_LOWP      1e-4\n#define LOG2              1.442695\n#define EXP_VALUE         2.71828183f\n#define FP_MAX            65504.0\n#define FP_SCALE          0.0009765625\n#define FP_SCALE_INV      1024.0\n#define GRAY_VECTOR       vec3(0.299, 0.587, 0.114)\nhighp float decode32 (highp vec4 rgba) {\n  rgba = rgba * 255.0;\n  highp float Sign = 1.0 - (step(128.0, (rgba[3]) + 0.5)) * 2.0;\n  highp float Exponent = 2.0 * (mod(float(int((rgba[3]) + 0.5)), 128.0)) + (step(128.0, (rgba[2]) + 0.5)) - 127.0;\n  highp float Mantissa = (mod(float(int((rgba[2]) + 0.5)), 128.0)) * 65536.0 + rgba[1] * 256.0 + rgba[0] + 8388608.0;\n  return Sign * exp2(Exponent - 23.0) * Mantissa;\n}\nstruct StandardVertInput {\n  highp vec4 position;\n  vec3 normal;\n  vec4 tangent;\n};\nin vec3 a_position;\nin vec3 a_normal;\nin vec2 a_texCoord;\nin vec4 a_tangent;\n#if CC_USE_SKINNING\n    in vec4 a_joints;\n  in vec4 a_weights;\n#endif\n#if USE_INSTANCING\n  #if CC_USE_BAKED_ANIMATION\n    in highp vec4 a_jointAnimInfo;\n  #endif\n  in vec4 a_matWorld0;\n  in vec4 a_matWorld1;\n  in vec4 a_matWorld2;\n  #if CC_USE_LIGHTMAP\n    in vec4 a_lightingMapUVParam;\n  #endif\n  #if CC_RECEIVE_SHADOW\n    in vec2 a_localShadowBias;\n  #endif\n#elif USE_BATCHING\n  in float a_dyn_batch_id;\n#endif\n#if CC_USE_MORPH\n    in float a_vertexId;\n    int getVertexId() {\n      return int(a_vertexId);\n    }\n#endif\n#if CC_USE_MORPH\n  layout(std140) uniform CCMorph {\n    vec4 cc_displacementWeights[15];\n    vec4 cc_displacementTextureInfo;\n  };\n  vec2 getPixelLocation(vec2 textureResolution, int pixelIndex) {\n    float pixelIndexF = float(pixelIndex);\n    float x = mod(pixelIndexF, textureResolution.x);\n    float y = floor(pixelIndexF / textureResolution.x);\n    return vec2(x, y);\n  }\n  vec2 getPixelCoordFromLocation(vec2 location, vec2 textureResolution) {\n    return (vec2(location.x, location.y) + .5) / textureResolution;\n  }\n  #if CC_DEVICE_SUPPORT_FLOAT_TEXTURE\n      vec4 fetchVec3ArrayFromTexture(sampler2D tex, int pixelIndex) {\n        ivec2 texSize = textureSize(tex, 0);\n        return texelFetch(tex, ivec2(pixelIndex % texSize.x, pixelIndex / texSize.x), 0);\n      }\n  #else\n    vec4 fetchVec3ArrayFromTexture(sampler2D tex, int elementIndex) {\n      int pixelIndex = elementIndex * 4;\n      vec2 location = getPixelLocation(cc_displacementTextureInfo.xy, pixelIndex);\n      vec2 x = getPixelCoordFromLocation(location + vec2(0.0, 0.0), cc_displacementTextureInfo.xy);\n      vec2 y = getPixelCoordFromLocation(location + vec2(1.0, 0.0), cc_displacementTextureInfo.xy);\n      vec2 z = getPixelCoordFromLocation(location + vec2(2.0, 0.0), cc_displacementTextureInfo.xy);\n      return vec4(\n        decode32(texture(tex, x)),\n        decode32(texture(tex, y)),\n        decode32(texture(tex, z)),\n        1.0\n      );\n    }\n  #endif\n  float getDisplacementWeight(int index) {\n    int quot = index / 4;\n    int remainder = index - quot * 4;\n    if (remainder == 0) {\n      return cc_displacementWeights[quot].x;\n    } else if (remainder == 1) {\n      return cc_displacementWeights[quot].y;\n    } else if (remainder == 2) {\n      return cc_displacementWeights[quot].z;\n    } else {\n      return cc_displacementWeights[quot].w;\n    }\n  }\n  vec3 getVec3DisplacementFromTexture(sampler2D tex, int vertexIndex) {\n  #if CC_MORPH_PRECOMPUTED\n    return fetchVec3ArrayFromTexture(tex, vertexIndex).rgb;\n  #else\n    vec3 result = vec3(0, 0, 0);\n    int nVertices = int(cc_displacementTextureInfo.z);\n    for (int iTarget = 0; iTarget < CC_MORPH_TARGET_COUNT; ++iTarget) {\n      result += (fetchVec3ArrayFromTexture(tex, nVertices * iTarget + vertexIndex).rgb * getDisplacementWeight(iTarget));\n    }\n    return result;\n  #endif\n  }\n  #if CC_MORPH_TARGET_HAS_POSITION\n    uniform sampler2D cc_PositionDisplacements;\n    vec3 getPositionDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_PositionDisplacements, vertexId);\n    }\n  #endif\n  #if CC_MORPH_TARGET_HAS_NORMAL\n    uniform sampler2D cc_NormalDisplacements;\n    vec3 getNormalDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_NormalDisplacements, vertexId);\n    }\n  #endif\n  #if CC_MORPH_TARGET_HAS_TANGENT\n    uniform sampler2D cc_TangentDisplacements;\n    vec3 getTangentDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_TangentDisplacements, vertexId);\n    }\n  #endif\n  void applyMorph (inout vec4 position, inout vec3 normal, inout vec4 tangent) {\n    int vertexId = getVertexId();\n  #if CC_MORPH_TARGET_HAS_POSITION\n    position.xyz = position.xyz + getPositionDisplacement(vertexId);\n  #endif\n  #if CC_MORPH_TARGET_HAS_NORMAL\n    normal.xyz = normal.xyz + getNormalDisplacement(vertexId);\n  #endif\n  #if CC_MORPH_TARGET_HAS_TANGENT\n    tangent.xyz = tangent.xyz + getTangentDisplacement(vertexId);\n  #endif\n  }\n  void applyMorph (inout vec4 position) {\n  #if CC_MORPH_TARGET_HAS_POSITION\n    position.xyz = position.xyz + getPositionDisplacement(getVertexId());\n  #endif\n  }\n#endif\n#if CC_USE_SKINNING\n  #if CC_USE_BAKED_ANIMATION\n    layout(std140) uniform CCSkinningTexture {\n      highp vec4 cc_jointTextureInfo;\n    };\n    layout(std140) uniform CCSkinningAnimation {\n      highp vec4 cc_jointAnimInfo;\n    };\n    uniform highp sampler2D cc_jointTexture;\n    void CCGetJointTextureCoords(float pixelsPerJoint, float jointIdx, out highp float x, out highp float y, out highp float invSize)\n    {\n      #if USE_INSTANCING\n        highp float temp = pixelsPerJoint * (a_jointAnimInfo.x * a_jointAnimInfo.y + jointIdx) + a_jointAnimInfo.z;\n      #else\n        highp float temp = pixelsPerJoint * (cc_jointAnimInfo.x * cc_jointTextureInfo.y + jointIdx) + cc_jointTextureInfo.z;\n      #endif\n      invSize = cc_jointTextureInfo.w;\n      highp float tempY = floor(temp * invSize);\n      x = floor(temp - tempY * cc_jointTextureInfo.x);\n      y = (tempY + 0.5) * invSize;\n    }\n  #else\n    layout(std140) uniform CCSkinning {\n      highp vec4 cc_joints[30 * 3];\n    };\n  #endif\n  #if CC_USE_BAKED_ANIMATION\n    #if CC_DEVICE_SUPPORT_FLOAT_TEXTURE\n      mat4 getJointMatrix (float i) {\n        highp float x, y, invSize;\n        CCGetJointTextureCoords(3.0, i, x, y, invSize);\n        vec4 v1 = texture(cc_jointTexture, vec2((x + 0.5) * invSize, y));\n        vec4 v2 = texture(cc_jointTexture, vec2((x + 1.5) * invSize, y));\n        vec4 v3 = texture(cc_jointTexture, vec2((x + 2.5) * invSize, y));\n        return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n      }\n    #else\n      mat4 getJointMatrix (float i) {\n        highp float x, y, invSize;\n        CCGetJointTextureCoords(12.0, i, x, y, invSize);\n        vec4 v1 = vec4(\n          decode32(texture(cc_jointTexture, vec2((x + 0.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 1.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 2.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 3.5) * invSize, y)))\n        );\n        vec4 v2 = vec4(\n          decode32(texture(cc_jointTexture, vec2((x + 4.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 5.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 6.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 7.5) * invSize, y)))\n        );\n        vec4 v3 = vec4(\n          decode32(texture(cc_jointTexture, vec2((x + 8.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 9.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 10.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 11.5) * invSize, y)))\n        );\n        return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n      }\n    #endif\n  #else\n    mat4 getJointMatrix (float i) {\n      int idx = int(i);\n      vec4 v1 = cc_joints[idx * 3];\n      vec4 v2 = cc_joints[idx * 3 + 1];\n      vec4 v3 = cc_joints[idx * 3 + 2];\n      return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n    }\n  #endif\n  mat4 skinMatrix () {\n    vec4 joints = vec4(a_joints);\n    return getJointMatrix(joints.x) * a_weights.x\n         + getJointMatrix(joints.y) * a_weights.y\n         + getJointMatrix(joints.z) * a_weights.z\n         + getJointMatrix(joints.w) * a_weights.w;\n  }\n  void CCSkin (inout vec4 position) {\n    mat4 m = skinMatrix();\n    position = m * position;\n  }\n  void CCSkin (inout vec4 position, inout vec3 normal, inout vec4 tangent) {\n    mat4 m = skinMatrix();\n    position = m * position;\n    normal = (m * vec4(normal, 0.0)).xyz;\n    tangent.xyz = (m * vec4(tangent.xyz, 0.0)).xyz;\n  }\n#endif\nvoid CCVertInput(inout StandardVertInput In)\n{\n    In.position = vec4(a_position, 1.0);\n    In.normal = a_normal;\n    In.tangent = a_tangent;\n  #if CC_USE_MORPH\n    applyMorph(In.position, In.normal, In.tangent);\n  #endif\n  #if CC_USE_SKINNING\n    CCSkin(In.position, In.normal, In.tangent);\n  #endif\n}\n#if !USE_INSTANCING\n  #if USE_BATCHING\n    layout(std140) uniform CCLocalBatched {\n      highp mat4 cc_matWorlds[10];\n    };\n  #else\n    layout(std140) uniform CCLocal {\n      highp mat4 cc_matWorld;\n      highp mat4 cc_matWorldIT;\n      highp vec4 cc_lightingMapUVParam;\n      highp vec4 cc_localShadowBias;\n    };\n  #endif\n#endif\nvoid CCGetWorldMatrixFull(out mat4 matWorld, out mat4 matWorldIT)\n{\n  #if USE_INSTANCING\n    matWorld = mat4(\n      vec4(a_matWorld0.xyz, 0.0),\n      vec4(a_matWorld1.xyz, 0.0),\n      vec4(a_matWorld2.xyz, 0.0),\n      vec4(a_matWorld0.w, a_matWorld1.w, a_matWorld2.w, 1.0)\n    );\n    matWorldIT = matWorld;\n  #elif USE_BATCHING\n    matWorld = cc_matWorlds[int(a_dyn_batch_id)];\n    matWorldIT = matWorld;\n  #else\n    matWorld = cc_matWorld;\n    matWorldIT = cc_matWorldIT;\n  #endif\n}\nlayout(std140) uniform Constants {\n  vec4 tilingOffset;\n  vec4 albedo;\n  vec4 albedoScaleAndCutoff;\n  vec4 pbrParams;\n  vec4 emissive;\n  vec4 emissiveScaleParam;\n};\nlayout(std140) uniform CCShadow {\n  highp mat4 cc_matLightPlaneProj;\n  highp mat4 cc_matLightView;\n  highp mat4 cc_matLightViewProj;\n  highp vec4 cc_shadowInvProjDepthInfo;\n  highp vec4 cc_shadowProjDepthInfo;\n  highp vec4 cc_shadowProjInfo;\n  mediump vec4 cc_shadowNFLSInfo;\n  mediump vec4 cc_shadowWHPBInfo;\n  mediump vec4 cc_shadowLPNNInfo;\n  lowp vec4 cc_shadowColor;\n  mediump vec4 cc_planarNDInfo;\n};\n#if HAS_SECOND_UV || CC_USE_LIGHTMAP\n  in vec2 a_texCoord1;\n#endif\nout vec2 v_uv;\n#if HAS_SECOND_UV\n  out vec2 v_uv1;\n#endif\nout vec4 v_worldPos;\nout float v_clip_depth;\nvec4 vert () {\n  StandardVertInput In;\n  CCVertInput(In);\n  mat4 matWorld, matWorldIT;\n  CCGetWorldMatrixFull(matWorld, matWorldIT);\n  v_worldPos = matWorld * In.position;\n  vec4 clipPos = cc_matLightViewProj * v_worldPos;\n  v_uv = a_texCoord * tilingOffset.xy + tilingOffset.zw;\n  #if HAS_SECOND_UV\n    v_uv1 = a_texCoord1 * tilingOffset.xy + tilingOffset.zw;\n  #endif\n  v_clip_depth = clipPos.z / clipPos.w * 0.5 + 0.5;\n  return clipPos;\n}\nvoid main() { gl_Position = vert(); }","frag":"\nprecision highp float;\nlayout(std140) uniform Constants {\n  vec4 tilingOffset;\n  vec4 albedo;\n  vec4 albedoScaleAndCutoff;\n  vec4 pbrParams;\n  vec4 emissive;\n  vec4 emissiveScaleParam;\n};\nvec4 packDepthToRGBA (float depth) {\n  vec4 ret = vec4(1.0, 255.0, 65025.0, 16581375.0) * depth;\n  ret = fract(ret);\n  ret -= vec4(ret.yzw, 0.0) / 255.0;\n  return ret;\n}\n#define QUATER_PI         0.78539816340\n#define HALF_PI           1.57079632679\n#define PI                3.14159265359\n#define PI2               6.28318530718\n#define PI4               12.5663706144\n#define INV_QUATER_PI     1.27323954474\n#define INV_HALF_PI       0.63661977237\n#define INV_PI            0.31830988618\n#define INV_PI2           0.15915494309\n#define INV_PI4           0.07957747155\n#define EPSILON           1e-6\n#define EPSILON_LOWP      1e-4\n#define LOG2              1.442695\n#define EXP_VALUE         2.71828183f\n#define FP_MAX            65504.0\n#define FP_SCALE          0.0009765625\n#define FP_SCALE_INV      1024.0\n#define GRAY_VECTOR       vec3(0.299, 0.587, 0.114)\nlayout(std140) uniform CCGlobal {\n  highp   vec4 cc_time;\n  mediump vec4 cc_screenSize;\n  mediump vec4 cc_nativeSize;\n};\nlayout(std140) uniform CCCamera {\n  highp   mat4 cc_matView;\n  highp   mat4 cc_matViewInv;\n  highp   mat4 cc_matProj;\n  highp   mat4 cc_matProjInv;\n  highp   mat4 cc_matViewProj;\n  highp   mat4 cc_matViewProjInv;\n  highp   vec4 cc_cameraPos;\n  mediump vec4 cc_screenScale;\n  mediump vec4 cc_exposure;\n  mediump vec4 cc_mainLitDir;\n  mediump vec4 cc_mainLitColor;\n  mediump vec4 cc_ambientSky;\n  mediump vec4 cc_ambientGround;\n  mediump vec4 cc_fogColor;\n  mediump vec4 cc_fogBase;\n  mediump vec4 cc_fogAdd;\n  mediump vec4 cc_nearFar;\n  mediump vec4 cc_viewPort;\n};\nlayout(std140) uniform CCShadow {\n  highp mat4 cc_matLightPlaneProj;\n  highp mat4 cc_matLightView;\n  highp mat4 cc_matLightViewProj;\n  highp vec4 cc_shadowInvProjDepthInfo;\n  highp vec4 cc_shadowProjDepthInfo;\n  highp vec4 cc_shadowProjInfo;\n  mediump vec4 cc_shadowNFLSInfo;\n  mediump vec4 cc_shadowWHPBInfo;\n  mediump vec4 cc_shadowLPNNInfo;\n  lowp vec4 cc_shadowColor;\n  mediump vec4 cc_planarNDInfo;\n};\nlayout(std140) uniform CCLocal {\n  highp mat4 cc_matWorld;\n  highp mat4 cc_matWorldIT;\n  highp vec4 cc_lightingMapUVParam;\n  highp vec4 cc_localShadowBias;\n};\nfloat CCGetLinearDepthFromViewSpace(vec3 viewPos) {\n  float dist = length(viewPos);\n  return (dist - cc_shadowNFLSInfo.x) / (cc_shadowNFLSInfo.y - cc_shadowNFLSInfo.x);\n}\nfloat CCGetLinearDepth(vec3 worldPos) {\n  vec4 viewStartPos = cc_matLightView * vec4(worldPos.xyz, 1.0);\n  return CCGetLinearDepthFromViewSpace(viewStartPos.xyz);\n}\n#if CC_RECEIVE_SHADOW\n  uniform highp sampler2D cc_shadowMap;\n  uniform highp sampler2D cc_spotLightingMap;\n#endif\nin vec2 v_uv;\n#if HAS_SECOND_UV\n  in vec2 v_uv1;\n#endif\nin vec4 v_worldPos;\nin float v_clip_depth;\n#if USE_ALBEDO_MAP\n  uniform sampler2D albedoMap;\n#endif\n#if USE_ALPHA_TEST\n#endif\nvec4 frag () {\n  vec4 baseColor = albedo;\n  #if USE_ALBEDO_MAP\n    baseColor *= texture(albedoMap, ALBEDO_UV);\n  #endif\n  #if USE_ALPHA_TEST\n    if (baseColor.ALPHA_TEST_CHANNEL < albedoScaleAndCutoff.w) discard;\n  #endif\n  if(cc_shadowLPNNInfo.x > 0.000001 && cc_shadowLPNNInfo.x < 1.999999) {\n    if (cc_shadowNFLSInfo.z > 0.000001) {\n      return vec4(CCGetLinearDepth(v_worldPos.xyz), 1.0, 1.0, 1.0);\n    }\n  }\n  if (cc_shadowLPNNInfo.y > 0.000001) {\n    return packDepthToRGBA(v_clip_depth);\n  }\n  return vec4(v_clip_depth, 1.0, 1.0, 1.0);\n}\nlayout(location = 0) out vec4 cc_FragColor;\nvoid main() { cc_FragColor = frag(); }"},"glsl1":{"vert":"\nprecision highp float;\n#define QUATER_PI         0.78539816340\n#define HALF_PI           1.57079632679\n#define PI                3.14159265359\n#define PI2               6.28318530718\n#define PI4               12.5663706144\n#define INV_QUATER_PI     1.27323954474\n#define INV_HALF_PI       0.63661977237\n#define INV_PI            0.31830988618\n#define INV_PI2           0.15915494309\n#define INV_PI4           0.07957747155\n#define EPSILON           1e-6\n#define EPSILON_LOWP      1e-4\n#define LOG2              1.442695\n#define EXP_VALUE         2.71828183f\n#define FP_MAX            65504.0\n#define FP_SCALE          0.0009765625\n#define FP_SCALE_INV      1024.0\n#define GRAY_VECTOR       vec3(0.299, 0.587, 0.114)\nhighp float decode32 (highp vec4 rgba) {\n  rgba = rgba * 255.0;\n  highp float Sign = 1.0 - (step(128.0, (rgba[3]) + 0.5)) * 2.0;\n  highp float Exponent = 2.0 * (mod(float(int((rgba[3]) + 0.5)), 128.0)) + (step(128.0, (rgba[2]) + 0.5)) - 127.0;\n  highp float Mantissa = (mod(float(int((rgba[2]) + 0.5)), 128.0)) * 65536.0 + rgba[1] * 256.0 + rgba[0] + 8388608.0;\n  return Sign * exp2(Exponent - 23.0) * Mantissa;\n}\nstruct StandardVertInput {\n  highp vec4 position;\n  vec3 normal;\n  vec4 tangent;\n};\nattribute vec3 a_position;\nattribute vec3 a_normal;\nattribute vec2 a_texCoord;\nattribute vec4 a_tangent;\n#if CC_USE_SKINNING\n    attribute vec4 a_joints;\n  attribute vec4 a_weights;\n#endif\n#if USE_INSTANCING\n  #if CC_USE_BAKED_ANIMATION\n    attribute highp vec4 a_jointAnimInfo;\n  #endif\n  attribute vec4 a_matWorld0;\n  attribute vec4 a_matWorld1;\n  attribute vec4 a_matWorld2;\n  #if CC_USE_LIGHTMAP\n    attribute vec4 a_lightingMapUVParam;\n  #endif\n  #if CC_RECEIVE_SHADOW\n    attribute vec2 a_localShadowBias;\n  #endif\n#elif USE_BATCHING\n  attribute float a_dyn_batch_id;\n#endif\n#if CC_USE_MORPH\n    attribute float a_vertexId;\n    int getVertexId() {\n      return int(a_vertexId);\n    }\n#endif\n#if CC_USE_MORPH\n  uniform vec4 cc_displacementWeights[15];\n  uniform vec4 cc_displacementTextureInfo;\n  vec2 getPixelLocation(vec2 textureResolution, int pixelIndex) {\n    float pixelIndexF = float(pixelIndex);\n    float x = mod(pixelIndexF, textureResolution.x);\n    float y = floor(pixelIndexF / textureResolution.x);\n    return vec2(x, y);\n  }\n  vec2 getPixelCoordFromLocation(vec2 location, vec2 textureResolution) {\n    return (vec2(location.x, location.y) + .5) / textureResolution;\n  }\n  #if CC_DEVICE_SUPPORT_FLOAT_TEXTURE\n      vec4 fetchVec3ArrayFromTexture(sampler2D tex, int elementIndex) {\n        int pixelIndex = elementIndex;\n        vec2 location = getPixelLocation(cc_displacementTextureInfo.xy, pixelIndex);\n        vec2 uv = getPixelCoordFromLocation(location, cc_displacementTextureInfo.xy);\n        return texture2D(tex, uv);\n      }\n  #else\n    vec4 fetchVec3ArrayFromTexture(sampler2D tex, int elementIndex) {\n      int pixelIndex = elementIndex * 4;\n      vec2 location = getPixelLocation(cc_displacementTextureInfo.xy, pixelIndex);\n      vec2 x = getPixelCoordFromLocation(location + vec2(0.0, 0.0), cc_displacementTextureInfo.xy);\n      vec2 y = getPixelCoordFromLocation(location + vec2(1.0, 0.0), cc_displacementTextureInfo.xy);\n      vec2 z = getPixelCoordFromLocation(location + vec2(2.0, 0.0), cc_displacementTextureInfo.xy);\n      return vec4(\n        decode32(texture2D(tex, x)),\n        decode32(texture2D(tex, y)),\n        decode32(texture2D(tex, z)),\n        1.0\n      );\n    }\n  #endif\n  float getDisplacementWeight(int index) {\n    int quot = index / 4;\n    int remainder = index - quot * 4;\n    if (remainder == 0) {\n      return cc_displacementWeights[quot].x;\n    } else if (remainder == 1) {\n      return cc_displacementWeights[quot].y;\n    } else if (remainder == 2) {\n      return cc_displacementWeights[quot].z;\n    } else {\n      return cc_displacementWeights[quot].w;\n    }\n  }\n  vec3 getVec3DisplacementFromTexture(sampler2D tex, int vertexIndex) {\n  #if CC_MORPH_PRECOMPUTED\n    return fetchVec3ArrayFromTexture(tex, vertexIndex).rgb;\n  #else\n    vec3 result = vec3(0, 0, 0);\n    int nVertices = int(cc_displacementTextureInfo.z);\n    for (int iTarget = 0; iTarget < CC_MORPH_TARGET_COUNT; ++iTarget) {\n      result += (fetchVec3ArrayFromTexture(tex, nVertices * iTarget + vertexIndex).rgb * getDisplacementWeight(iTarget));\n    }\n    return result;\n  #endif\n  }\n  #if CC_MORPH_TARGET_HAS_POSITION\n    uniform sampler2D cc_PositionDisplacements;\n    vec3 getPositionDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_PositionDisplacements, vertexId);\n    }\n  #endif\n  #if CC_MORPH_TARGET_HAS_NORMAL\n    uniform sampler2D cc_NormalDisplacements;\n    vec3 getNormalDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_NormalDisplacements, vertexId);\n    }\n  #endif\n  #if CC_MORPH_TARGET_HAS_TANGENT\n    uniform sampler2D cc_TangentDisplacements;\n    vec3 getTangentDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_TangentDisplacements, vertexId);\n    }\n  #endif\n  void applyMorph (inout vec4 position, inout vec3 normal, inout vec4 tangent) {\n    int vertexId = getVertexId();\n  #if CC_MORPH_TARGET_HAS_POSITION\n    position.xyz = position.xyz + getPositionDisplacement(vertexId);\n  #endif\n  #if CC_MORPH_TARGET_HAS_NORMAL\n    normal.xyz = normal.xyz + getNormalDisplacement(vertexId);\n  #endif\n  #if CC_MORPH_TARGET_HAS_TANGENT\n    tangent.xyz = tangent.xyz + getTangentDisplacement(vertexId);\n  #endif\n  }\n  void applyMorph (inout vec4 position) {\n  #if CC_MORPH_TARGET_HAS_POSITION\n    position.xyz = position.xyz + getPositionDisplacement(getVertexId());\n  #endif\n  }\n#endif\n#if CC_USE_SKINNING\n  #if CC_USE_BAKED_ANIMATION\n    uniform highp vec4 cc_jointTextureInfo;\n    uniform highp vec4 cc_jointAnimInfo;\n    uniform highp sampler2D cc_jointTexture;\n    void CCGetJointTextureCoords(float pixelsPerJoint, float jointIdx, out highp float x, out highp float y, out highp float invSize)\n    {\n      #if USE_INSTANCING\n        highp float temp = pixelsPerJoint * (a_jointAnimInfo.x * a_jointAnimInfo.y + jointIdx) + a_jointAnimInfo.z;\n      #else\n        highp float temp = pixelsPerJoint * (cc_jointAnimInfo.x * cc_jointTextureInfo.y + jointIdx) + cc_jointTextureInfo.z;\n      #endif\n      invSize = cc_jointTextureInfo.w;\n      highp float tempY = floor(temp * invSize);\n      x = floor(temp - tempY * cc_jointTextureInfo.x);\n      y = (tempY + 0.5) * invSize;\n    }\n  #else\n    uniform highp vec4 cc_joints[90];\n  #endif\n  #if CC_USE_BAKED_ANIMATION\n    #if CC_DEVICE_SUPPORT_FLOAT_TEXTURE\n      mat4 getJointMatrix (float i) {\n        highp float x, y, invSize;\n        CCGetJointTextureCoords(3.0, i, x, y, invSize);\n        vec4 v1 = texture2D(cc_jointTexture, vec2((x + 0.5) * invSize, y));\n        vec4 v2 = texture2D(cc_jointTexture, vec2((x + 1.5) * invSize, y));\n        vec4 v3 = texture2D(cc_jointTexture, vec2((x + 2.5) * invSize, y));\n        return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n      }\n    #else\n      mat4 getJointMatrix (float i) {\n        highp float x, y, invSize;\n        CCGetJointTextureCoords(12.0, i, x, y, invSize);\n        vec4 v1 = vec4(\n          decode32(texture2D(cc_jointTexture, vec2((x + 0.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 1.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 2.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 3.5) * invSize, y)))\n        );\n        vec4 v2 = vec4(\n          decode32(texture2D(cc_jointTexture, vec2((x + 4.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 5.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 6.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 7.5) * invSize, y)))\n        );\n        vec4 v3 = vec4(\n          decode32(texture2D(cc_jointTexture, vec2((x + 8.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 9.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 10.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 11.5) * invSize, y)))\n        );\n        return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n      }\n    #endif\n  #else\n    mat4 getJointMatrix (float i) {\n      int idx = int(i);\n      vec4 v1 = cc_joints[idx * 3];\n      vec4 v2 = cc_joints[idx * 3 + 1];\n      vec4 v3 = cc_joints[idx * 3 + 2];\n      return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n    }\n  #endif\n  mat4 skinMatrix () {\n    vec4 joints = vec4(a_joints);\n    return getJointMatrix(joints.x) * a_weights.x\n         + getJointMatrix(joints.y) * a_weights.y\n         + getJointMatrix(joints.z) * a_weights.z\n         + getJointMatrix(joints.w) * a_weights.w;\n  }\n  void CCSkin (inout vec4 position) {\n    mat4 m = skinMatrix();\n    position = m * position;\n  }\n  void CCSkin (inout vec4 position, inout vec3 normal, inout vec4 tangent) {\n    mat4 m = skinMatrix();\n    position = m * position;\n    normal = (m * vec4(normal, 0.0)).xyz;\n    tangent.xyz = (m * vec4(tangent.xyz, 0.0)).xyz;\n  }\n#endif\nvoid CCVertInput(inout StandardVertInput In)\n{\n    In.position = vec4(a_position, 1.0);\n    In.normal = a_normal;\n    In.tangent = a_tangent;\n  #if CC_USE_MORPH\n    applyMorph(In.position, In.normal, In.tangent);\n  #endif\n  #if CC_USE_SKINNING\n    CCSkin(In.position, In.normal, In.tangent);\n  #endif\n}\n#if !USE_INSTANCING\n  #if USE_BATCHING\n    uniform highp mat4 cc_matWorlds[10];\n  #else\n    uniform highp mat4 cc_matWorld;\n  uniform highp mat4 cc_matWorldIT;\n  #endif\n#endif\nvoid CCGetWorldMatrixFull(out mat4 matWorld, out mat4 matWorldIT)\n{\n  #if USE_INSTANCING\n    matWorld = mat4(\n      vec4(a_matWorld0.xyz, 0.0),\n      vec4(a_matWorld1.xyz, 0.0),\n      vec4(a_matWorld2.xyz, 0.0),\n      vec4(a_matWorld0.w, a_matWorld1.w, a_matWorld2.w, 1.0)\n    );\n    matWorldIT = matWorld;\n  #elif USE_BATCHING\n    matWorld = cc_matWorlds[int(a_dyn_batch_id)];\n    matWorldIT = matWorld;\n  #else\n    matWorld = cc_matWorld;\n    matWorldIT = cc_matWorldIT;\n  #endif\n}\n    uniform vec4 tilingOffset;\nuniform highp mat4 cc_matLightViewProj;\n#if HAS_SECOND_UV || CC_USE_LIGHTMAP\n  attribute vec2 a_texCoord1;\n#endif\nvarying vec2 v_uv;\n#if HAS_SECOND_UV\n  varying vec2 v_uv1;\n#endif\nvarying vec4 v_worldPos;\nvarying float v_clip_depth;\nvec4 vert () {\n  StandardVertInput In;\n  CCVertInput(In);\n  mat4 matWorld, matWorldIT;\n  CCGetWorldMatrixFull(matWorld, matWorldIT);\n  v_worldPos = matWorld * In.position;\n  vec4 clipPos = cc_matLightViewProj * v_worldPos;\n  v_uv = a_texCoord * tilingOffset.xy + tilingOffset.zw;\n  #if HAS_SECOND_UV\n    v_uv1 = a_texCoord1 * tilingOffset.xy + tilingOffset.zw;\n  #endif\n  v_clip_depth = clipPos.z / clipPos.w * 0.5 + 0.5;\n  return clipPos;\n}\nvoid main() { gl_Position = vert(); }","frag":"\nprecision highp float;\n   uniform vec4 albedo;\n   uniform vec4 albedoScaleAndCutoff;\nvec4 packDepthToRGBA (float depth) {\n  vec4 ret = vec4(1.0, 255.0, 65025.0, 16581375.0) * depth;\n  ret = fract(ret);\n  ret -= vec4(ret.yzw, 0.0) / 255.0;\n  return ret;\n}\n#define QUATER_PI         0.78539816340\n#define HALF_PI           1.57079632679\n#define PI                3.14159265359\n#define PI2               6.28318530718\n#define PI4               12.5663706144\n#define INV_QUATER_PI     1.27323954474\n#define INV_HALF_PI       0.63661977237\n#define INV_PI            0.31830988618\n#define INV_PI2           0.15915494309\n#define INV_PI4           0.07957747155\n#define EPSILON           1e-6\n#define EPSILON_LOWP      1e-4\n#define LOG2              1.442695\n#define EXP_VALUE         2.71828183f\n#define FP_MAX            65504.0\n#define FP_SCALE          0.0009765625\n#define FP_SCALE_INV      1024.0\n#define GRAY_VECTOR       vec3(0.299, 0.587, 0.114)\nuniform highp mat4 cc_matLightView;\n  uniform mediump vec4 cc_shadowNFLSInfo;\n  uniform mediump vec4 cc_shadowLPNNInfo;\nfloat CCGetLinearDepthFromViewSpace(vec3 viewPos) {\n  float dist = length(viewPos);\n  return (dist - cc_shadowNFLSInfo.x) / (cc_shadowNFLSInfo.y - cc_shadowNFLSInfo.x);\n}\nfloat CCGetLinearDepth(vec3 worldPos) {\n  vec4 viewStartPos = cc_matLightView * vec4(worldPos.xyz, 1.0);\n  return CCGetLinearDepthFromViewSpace(viewStartPos.xyz);\n}\n#if CC_RECEIVE_SHADOW\n  uniform highp sampler2D cc_shadowMap;\n  uniform highp sampler2D cc_spotLightingMap;\n#endif\nvarying vec2 v_uv;\n#if HAS_SECOND_UV\n  varying vec2 v_uv1;\n#endif\nvarying vec4 v_worldPos;\nvarying float v_clip_depth;\n#if USE_ALBEDO_MAP\n  uniform sampler2D albedoMap;\n#endif\n#if USE_ALPHA_TEST\n#endif\nvec4 frag () {\n  vec4 baseColor = albedo;\n  #if USE_ALBEDO_MAP\n    baseColor *= texture2D(albedoMap, ALBEDO_UV);\n  #endif\n  #if USE_ALPHA_TEST\n    if (baseColor.ALPHA_TEST_CHANNEL < albedoScaleAndCutoff.w) discard;\n  #endif\n  if(cc_shadowLPNNInfo.x > 0.000001 && cc_shadowLPNNInfo.x < 1.999999) {\n    if (cc_shadowNFLSInfo.z > 0.000001) {\n      return vec4(CCGetLinearDepth(v_worldPos.xyz), 1.0, 1.0, 1.0);\n    }\n  }\n  if (cc_shadowLPNNInfo.y > 0.000001) {\n    return packDepthToRGBA(v_clip_depth);\n  }\n  return vec4(v_clip_depth, 1.0, 1.0, 1.0);\n}\nvoid main() { gl_FragColor = frag(); }"},"builtins":{"globals":{"blocks":[{"name":"CCShadow","defines":[]},{"name":"CCGlobal","defines":[]},{"name":"CCCamera","defines":[]}],"samplerTextures":[{"name":"cc_shadowMap","defines":["CC_RECEIVE_SHADOW"]},{"name":"cc_spotLightingMap","defines":["CC_RECEIVE_SHADOW"]}],"buffers":[],"images":[]},"locals":{"blocks":[{"name":"CCMorph","defines":["CC_USE_MORPH"]},{"name":"CCSkinningTexture","defines":["CC_USE_SKINNING","CC_USE_BAKED_ANIMATION"]},{"name":"CCSkinningAnimation","defines":["CC_USE_SKINNING","CC_USE_BAKED_ANIMATION"]},{"name":"CCSkinning","defines":["CC_USE_SKINNING","!CC_USE_BAKED_ANIMATION"]},{"name":"CCLocalBatched","defines":["!USE_INSTANCING","USE_BATCHING"]},{"name":"CCLocal","defines":["!USE_INSTANCING","!USE_BATCHING"]}],"samplerTextures":[{"name":"cc_PositionDisplacements","defines":["CC_USE_MORPH","CC_MORPH_TARGET_HAS_POSITION"]},{"name":"cc_NormalDisplacements","defines":["CC_USE_MORPH","CC_MORPH_TARGET_HAS_NORMAL"]},{"name":"cc_TangentDisplacements","defines":["CC_USE_MORPH","CC_MORPH_TARGET_HAS_TANGENT"]},{"name":"cc_jointTexture","defines":["CC_USE_SKINNING","CC_USE_BAKED_ANIMATION"]}],"buffers":[],"images":[]},"statistics":{"CC_EFFECT_USED_VERTEX_UNIFORM_VECTORS":184,"CC_EFFECT_USED_FRAGMENT_UNIFORM_VECTORS":75}},"defines":[{"name":"USE_INSTANCING","type":"boolean","defines":[],"editor":{"elevated":true}},{"name":"USE_BATCHING","type":"boolean","defines":["!USE_INSTANCING"],"editor":{"elevated":true}},{"name":"CC_USE_SKINNING","type":"boolean","defines":[]},{"name":"CC_USE_BAKED_ANIMATION","type":"boolean","defines":["USE_INSTANCING"]},{"name":"CC_USE_LIGHTMAP","type":"boolean","defines":["USE_INSTANCING"]},{"name":"CC_RECEIVE_SHADOW","type":"boolean","defines":[]},{"name":"CC_USE_MORPH","type":"boolean","defines":[]},{"name":"CC_MORPH_TARGET_COUNT","type":"number","defines":["CC_USE_MORPH"],"range":[2,8]},{"name":"CC_MORPH_PRECOMPUTED","type":"boolean","defines":["CC_USE_MORPH"]},{"name":"CC_MORPH_TARGET_HAS_POSITION","type":"boolean","defines":["CC_USE_MORPH"]},{"name":"CC_MORPH_TARGET_HAS_NORMAL","type":"boolean","defines":["CC_USE_MORPH"]},{"name":"CC_MORPH_TARGET_HAS_TANGENT","type":"boolean","defines":["CC_USE_MORPH"]},{"name":"HAS_SECOND_UV","type":"boolean","defines":[]},{"name":"USE_ALBEDO_MAP","type":"boolean","defines":[]},{"name":"ALBEDO_UV","type":"string","defines":["USE_ALBEDO_MAP"],"options":["v_uv","v_uv1"]},{"name":"USE_ALPHA_TEST","type":"boolean","defines":[]},{"name":"ALPHA_TEST_CHANNEL","type":"string","defines":["USE_ALPHA_TEST"],"options":["a","r"]}]}],[{"name":"opaque","passes":[{"program":"builtin-standard|standard-vs|standard-fs","properties":{"tilingOffset":{"type":16,"value":[1,1,0,0]},"mainColor":{"linear":true,"type":16,"value":[1,1,1,1],"editor":{"displayName":"Albedo","type":"color"},"handleInfo":["albedo",0,16]},"albedoScale":{"type":15,"value":[1,1,1],"handleInfo":["albedoScaleAndCutoff",0,15]},"alphaThreshold":{"type":13,"value":[0.5],"editor":{"parent":"USE_ALPHA_TEST","slide":true,"step":0.001,"range":[0,1]},"handleInfo":["albedoScaleAndCutoff",3,13]},"occlusion":{"type":13,"value":[1],"editor":{"slide":true,"step":0.001,"range":[0,1]},"handleInfo":["pbrParams",0,13]},"roughness":{"type":13,"value":[0.8],"editor":{"slide":true,"step":0.001,"range":[0,1]},"handleInfo":["pbrParams",1,13]},"metallic":{"type":13,"value":[0.6],"editor":{"slide":true,"step":0.001,"range":[0,1]},"handleInfo":["pbrParams",2,13]},"specularIntensity":{"type":13,"value":[0.5],"editor":{"slide":true,"step":0.001,"range":[0,1]},"handleInfo":["pbrParams",3,13]},"emissive":{"linear":true,"type":16,"value":[0,0,0,1],"editor":{"type":"color"}},"emissiveScale":{"type":15,"value":[1,1,1],"handleInfo":["emissiveScaleParam",0,15]},"normalStrength":{"type":13,"value":[1],"editor":{"parent":"USE_NORMAL_MAP","slide":true,"step":0.001,"range":[0,5]},"handleInfo":["emissiveScaleParam",3,13]},"mainTexture":{"value":"grey","type":28,"editor":{"displayName":"AlbedoMap"},"handleInfo":["albedoMap",0,28]},"normalMap":{"value":"normal","type":28},"pbrMap":{"value":"grey","type":28},"metallicRoughnessMap":{"value":"grey","type":28},"occlusionMap":{"value":"white","type":28},"emissiveMap":{"value":"grey","type":28},"albedo":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,1,1,1]},"albedoScaleAndCutoff":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,1,1,0.5]},"pbrParams":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,0.8,0.6,0.5]},"emissiveScaleParam":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,1,1,1]},"albedoMap":{"type":28,"value":"grey","editor":{"visible":false,"deprecated":true}}}},{"phase":"forward-add","propertyIndex":0,"program":"builtin-standard|standard-vs|standard-fs","embeddedMacros":{"CC_FORWARD_ADD":true},"blendState":{"targets":[{"blend":true,"blendSrc":1,"blendDst":1,"blendSrcAlpha":0,"blendDstAlpha":1}]},"depthStencilState":{"depthFunc":2,"depthTest":true,"depthWrite":false}},{"phase":"shadow-caster","propertyIndex":0,"program":"builtin-standard|shadow-caster-vs:vert|shadow-caster-fs:frag","rasterizerState":{"cullMode":1},"properties":{"tilingOffset":{"type":16,"value":[1,1,0,0]},"mainColor":{"type":16,"value":[1,1,1,1],"editor":{"displayName":"Albedo","type":"color"},"handleInfo":["albedo",0,16]},"albedoScale":{"type":15,"value":[1,1,1],"handleInfo":["albedoScaleAndCutoff",0,15]},"alphaThreshold":{"type":13,"value":[0.5],"editor":{"parent":"USE_ALPHA_TEST"},"handleInfo":["albedoScaleAndCutoff",3,13]},"mainTexture":{"value":"grey","type":28,"editor":{"displayName":"AlbedoMap"},"handleInfo":["albedoMap",0,28]},"albedo":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,1,1,1]},"albedoScaleAndCutoff":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,1,1,0.5]},"albedoMap":{"type":28,"value":"grey","editor":{"visible":false,"deprecated":true}}}}]},{"name":"transparent","passes":[{"program":"builtin-standard|standard-vs|standard-fs","embeddedMacros":{"CC_FORCE_FORWARD_SHADING":true},"blendState":{"targets":[{"blend":true,"blendSrc":2,"blendDst":4,"blendDstAlpha":4}]},"depthStencilState":{"depthTest":true,"depthWrite":false},"properties":{"tilingOffset":{"type":16,"value":[1,1,0,0]},"mainColor":{"linear":true,"type":16,"value":[1,1,1,1],"editor":{"displayName":"Albedo","type":"color"},"handleInfo":["albedo",0,16]},"albedoScale":{"type":15,"value":[1,1,1],"handleInfo":["albedoScaleAndCutoff",0,15]},"alphaThreshold":{"type":13,"value":[0.5],"editor":{"parent":"USE_ALPHA_TEST","slide":true,"step":0.001,"range":[0,1]},"handleInfo":["albedoScaleAndCutoff",3,13]},"occlusion":{"type":13,"value":[1],"editor":{"slide":true,"step":0.001,"range":[0,1]},"handleInfo":["pbrParams",0,13]},"roughness":{"type":13,"value":[0.8],"editor":{"slide":true,"step":0.001,"range":[0,1]},"handleInfo":["pbrParams",1,13]},"metallic":{"type":13,"value":[0.6],"editor":{"slide":true,"step":0.001,"range":[0,1]},"handleInfo":["pbrParams",2,13]},"specularIntensity":{"type":13,"value":[0.5],"editor":{"slide":true,"step":0.001,"range":[0,1]},"handleInfo":["pbrParams",3,13]},"emissive":{"linear":true,"type":16,"value":[0,0,0,1],"editor":{"type":"color"}},"emissiveScale":{"type":15,"value":[1,1,1],"handleInfo":["emissiveScaleParam",0,15]},"normalStrength":{"type":13,"value":[1],"editor":{"parent":"USE_NORMAL_MAP","slide":true,"step":0.001,"range":[0,5]},"handleInfo":["emissiveScaleParam",3,13]},"mainTexture":{"value":"grey","type":28,"editor":{"displayName":"AlbedoMap"},"handleInfo":["albedoMap",0,28]},"normalMap":{"value":"normal","type":28},"pbrMap":{"value":"grey","type":28},"metallicRoughnessMap":{"value":"grey","type":28},"occlusionMap":{"value":"white","type":28},"emissiveMap":{"value":"grey","type":28},"albedo":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,1,1,1]},"albedoScaleAndCutoff":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,1,1,0.5]},"pbrParams":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,0.8,0.6,0.5]},"emissiveScaleParam":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,1,1,1]},"albedoMap":{"type":28,"value":"grey","editor":{"visible":false,"deprecated":true}}}},{"phase":"forward-add","propertyIndex":0,"program":"builtin-standard|standard-vs|standard-fs","embeddedMacros":{"CC_FORWARD_ADD":true},"blendState":{"targets":[{"blend":true,"blendSrc":1,"blendDst":1,"blendSrcAlpha":0,"blendDstAlpha":1}]},"depthStencilState":{"depthFunc":2,"depthTest":true,"depthWrite":false}},{"phase":"shadow-caster","propertyIndex":0,"program":"builtin-standard|shadow-caster-vs:vert|shadow-caster-fs:frag","rasterizerState":{"cullMode":1},"properties":{"tilingOffset":{"type":16,"value":[1,1,0,0]},"mainColor":{"type":16,"value":[1,1,1,1],"editor":{"displayName":"Albedo","type":"color"},"handleInfo":["albedo",0,16]},"albedoScale":{"type":15,"value":[1,1,1],"handleInfo":["albedoScaleAndCutoff",0,15]},"alphaThreshold":{"type":13,"value":[0.5],"editor":{"parent":"USE_ALPHA_TEST"},"handleInfo":["albedoScaleAndCutoff",3,13]},"mainTexture":{"value":"grey","type":28,"editor":{"displayName":"AlbedoMap"},"handleInfo":["albedoMap",0,28]},"albedo":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,1,1,1]},"albedoScaleAndCutoff":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,1,1,0.5]},"albedoMap":{"type":28,"value":"grey","editor":{"visible":false,"deprecated":true}}}}]}]]],0,0,[],[],[]],[[[7,".bin",471759908,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":81144,"length":8904,"count":2226,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":81144,"count":1449,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.7930908203125,-0.0001637267996557057,-0.47479248046875],"maxPosition",8,[1,0.7930909991264343,1.949317455291748,0.47479248046875]]],-1],0,0,[],[],[]],[[{"name":"default_btn_normal","rect":{"x":0,"y":0,"width":40,"height":40},"offset":{"x":0,"y":0},"originalSize":{"width":40,"height":40},"rotated":false,"capInsets":[12,12,12,12],"packable":true}],[1],0,[0],[9],[78]],[[[27,"electric",".mp3",1.836],-1],0,0,[],[],[]],[[[7,".bin",430465574,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":12096,"length":4416,"count":1104,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":12096,"count":216,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.06422515958547592,-0.09429916739463806,-0.00028908730018883944],"maxPosition",8,[1,0.06422515958547592,0.09429916739463806,0.041994623839855194]]],-1],0,0,[],[],[]],[[[7,".bin",2231760209,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":24528,"length":1440,"count":720,"stride":2}}],"vertexBundles":[{"view":{"offset":0,"length":24528,"count":438,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-3.7547073364257812,0.0030135344713926315,-0.5291615128517151],"maxPosition",8,[1,3.754706859588623,2.5172641277313232,0.6249632239341736]]],-1],0,0,[],[],[]],[[[7,".bin",3352632150,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":33880,"length":8088,"count":2022,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":33880,"count":605,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-2.3423492908477783,0.0003619746130425483,-1.8762857913970947],"maxPosition",8,[1,2.342348575592041,3.772461175918579,1.8762857913970947]]],-1],0,0,[],[],[]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{},{}],[{"USE_INSTANCING":true,"HAS_SECOND_UV":true,"USE_ALBEDO_MAP":true},{"USE_INSTANCING":true},{},{},{}],[[[{"roughness":1,"metallic":0},"mainTexture",6,0,"emissiveMap",6,1],[{},"rimColor",8,[4,4280414714],"outlineParams",8,[2,10,0.1,0.1,1]],{},{},{}],11,11,0,0,0]]],0,0,[0,0,0],[3,4,2],[17,58,11]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true},{},{}],[[[{"roughness":1,"metallic":0},"mainTexture",6,0,"emissiveMap",6,1],{},{}],11,0,0]]],0,0,[0,0,0],[3,4,2],[39,59,12]],[[[27,"engine",".mp3",2.844],-1],0,0,[],[],[]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true},{},{}],[[[{"roughness":1,"metallic":0},"mainTexture",6,0],{},{}],11,0,0]]],0,0,[0,0],[3,2],[79,12]],[[[44,"../resources/project/game/killer/map/effect/outlineTaskAndPipe",[{"hash":4122284663,"name":"../resources/project/game/killer/map/effect/outlineTaskAndPipe|standard-vs|standard-fs","blocks":[{"name":"Constants","stageFlags":17,"binding":0,"members":[{"name":"tilingOffset","type":16,"count":1},{"name":"albedo","type":16,"count":1},{"name":"albedoScaleAndCutoff","type":16,"count":1},{"name":"pbrParams","type":16,"count":1},{"name":"emissive","type":16,"count":1},{"name":"emissiveScaleParam","type":16,"count":1}],"defines":[]}],"samplerTextures":[{"name":"albedoMap","type":28,"count":1,"stageFlags":16,"binding":1,"defines":["USE_ALBEDO_MAP"]},{"name":"normalMap","type":28,"count":1,"stageFlags":16,"binding":2,"defines":["USE_NORMAL_MAP"]},{"name":"pbrMap","type":28,"count":1,"stageFlags":16,"binding":3,"defines":["USE_PBR_MAP"]},{"name":"metallicRoughnessMap","type":28,"count":1,"stageFlags":16,"binding":4,"defines":["USE_METALLIC_ROUGHNESS_MAP"]},{"name":"occlusionMap","type":28,"count":1,"stageFlags":16,"binding":5,"defines":["USE_OCCLUSION_MAP"]},{"name":"emissiveMap","type":28,"count":1,"stageFlags":16,"binding":6,"defines":["USE_EMISSIVE_MAP"]}],"samplers":[],"textures":[],"buffers":[{"name":"b_ccLightsBuffer","memoryAccess":1,"stageFlags":16,"binding":7,"defines":["CC_FORWARD_ADD","CC_ENABLE_CLUSTERED_LIGHT_CULLING"]},{"name":"b_clusterLightIndicesBuffer","memoryAccess":1,"stageFlags":16,"binding":8,"defines":["CC_FORWARD_ADD","CC_ENABLE_CLUSTERED_LIGHT_CULLING"]},{"name":"b_clusterLightGridBuffer","memoryAccess":1,"stageFlags":16,"binding":9,"defines":["CC_FORWARD_ADD","CC_ENABLE_CLUSTERED_LIGHT_CULLING"]}],"images":[],"subpassInputs":[],"attributes":[{"name":"a_position","format":32,"location":0,"defines":[]},{"name":"a_normal","format":32,"location":1,"defines":[]},{"name":"a_texCoord","format":21,"location":2,"defines":[]},{"name":"a_tangent","format":44,"location":3,"defines":[]},{"name":"a_joints","location":4,"defines":["CC_USE_SKINNING"]},{"name":"a_weights","format":44,"location":5,"defines":["CC_USE_SKINNING"]},{"name":"a_jointAnimInfo","format":44,"isInstanced":true,"location":6,"defines":["USE_INSTANCING","CC_USE_BAKED_ANIMATION"]},{"name":"a_matWorld0","format":44,"isInstanced":true,"location":7,"defines":["USE_INSTANCING"]},{"name":"a_matWorld1","format":44,"isInstanced":true,"location":8,"defines":["USE_INSTANCING"]},{"name":"a_matWorld2","format":44,"isInstanced":true,"location":9,"defines":["USE_INSTANCING"]},{"name":"a_lightingMapUVParam","format":44,"isInstanced":true,"location":10,"defines":["USE_INSTANCING","CC_USE_LIGHTMAP"]},{"name":"a_localShadowBias","format":21,"isInstanced":true,"location":11,"defines":["USE_INSTANCING","CC_RECEIVE_SHADOW"]},{"name":"a_dyn_batch_id","format":11,"location":12,"defines":["!USE_INSTANCING","USE_BATCHING"]},{"name":"a_vertexId","format":11,"location":13,"defines":["CC_USE_MORPH"]},{"name":"a_color","format":44,"location":14,"defines":["USE_VERTEX_COLOR"]},{"name":"a_texCoord1","format":21,"location":15,"defines":[]}],"varyings":[{"name":"v_fog_factor","type":13,"count":1,"stageFlags":17,"location":0,"defines":["!CC_USE_ACCURATE_FOG"]},{"name":"v_shadowPos","type":16,"count":1,"stageFlags":17,"location":1,"defines":[]},{"name":"v_color","type":16,"count":1,"stageFlags":17,"location":2,"defines":["USE_VERTEX_COLOR"]},{"name":"v_position","type":15,"count":1,"stageFlags":17,"location":3,"defines":[]},{"name":"v_normal","type":15,"count":1,"stageFlags":17,"location":4,"defines":[]},{"name":"v_uv","type":14,"count":1,"stageFlags":17,"location":5,"defines":[]},{"name":"v_uv1","type":14,"count":1,"stageFlags":17,"location":6,"defines":[]},{"name":"v_tangent","type":15,"count":1,"stageFlags":17,"location":7,"defines":["USE_NORMAL_MAP"]},{"name":"v_bitangent","type":15,"count":1,"stageFlags":17,"location":8,"defines":["USE_NORMAL_MAP"]},{"name":"v_luv","type":15,"count":1,"stageFlags":17,"location":9,"defines":["CC_USE_LIGHTMAP","!USE_BATCHING","!CC_FORWARD_ADD"]}],"fragColors":[{"name":"fragColorX","typename":"vec4","type":16,"count":1,"stageFlags":16,"location":0,"defines":["CC_FORWARD_ADD"]},{"name":"fragColor0","typename":"vec4","type":16,"count":1,"stageFlags":16,"location":1,"defines":["!CC_FORWARD_ADD","CC_PIPELINE_TYPE"]},{"name":"fragColor1","typename":"vec4","type":16,"count":1,"stageFlags":16,"location":2,"defines":["!CC_FORWARD_ADD","CC_PIPELINE_TYPE"]},{"name":"fragColor2","typename":"vec4","type":16,"count":1,"stageFlags":16,"location":3,"defines":["!CC_FORWARD_ADD","CC_PIPELINE_TYPE"]}],"glsl4":{"vert":"#extension GL_EXT_shader_explicit_arithmetic_types_int32: require\nprecision highp float;\n#define QUATER_PI         0.78539816340\n#define HALF_PI           1.57079632679\n#define PI                3.14159265359\n#define PI2               6.28318530718\n#define PI4               12.5663706144\n#define INV_QUATER_PI     1.27323954474\n#define INV_HALF_PI       0.63661977237\n#define INV_PI            0.31830988618\n#define INV_PI2           0.15915494309\n#define INV_PI4           0.07957747155\n#define EPSILON           1e-6\n#define EPSILON_LOWP      1e-4\n#define LOG2              1.442695\n#define EXP_VALUE         2.71828183f\n#define FP_MAX            65504.0\n#define FP_SCALE          0.0009765625\n#define FP_SCALE_INV      1024.0\n#define GRAY_VECTOR       vec3(0.299, 0.587, 0.114)\nhighp float decode32 (highp vec4 rgba) {\n  rgba = rgba * 255.0;\n  highp float Sign = 1.0 - (step(128.0, (rgba[3]) + 0.5)) * 2.0;\n  highp float Exponent = 2.0 * (mod(float(int((rgba[3]) + 0.5)), 128.0)) + (step(128.0, (rgba[2]) + 0.5)) - 127.0;\n  highp float Mantissa = (mod(float(int((rgba[2]) + 0.5)), 128.0)) * 65536.0 + rgba[1] * 256.0 + rgba[0] + 8388608.0;\n  return Sign * exp2(Exponent - 23.0) * Mantissa;\n}\nstruct StandardVertInput {\n  highp vec4 position;\n  vec3 normal;\n  vec4 tangent;\n};\nlayout(location = 0) in vec3 a_position;\nlayout(location = 1) in vec3 a_normal;\nlayout(location = 2) in vec2 a_texCoord;\nlayout(location = 3) in vec4 a_tangent;\n#if CC_USE_SKINNING\n    layout(location = 4) in u32vec4 a_joints;\n  layout(location = 5) in vec4 a_weights;\n#endif\n#if USE_INSTANCING\n  #if CC_USE_BAKED_ANIMATION\n    layout(location = 6) in highp vec4 a_jointAnimInfo;\n  #endif\n  layout(location = 7) in vec4 a_matWorld0;\n  layout(location = 8) in vec4 a_matWorld1;\n  layout(location = 9) in vec4 a_matWorld2;\n  #if CC_USE_LIGHTMAP\n    layout(location = 10) in vec4 a_lightingMapUVParam;\n  #endif\n  #if CC_RECEIVE_SHADOW\n    layout(location = 11) in vec2 a_localShadowBias;\n  #endif\n#elif USE_BATCHING\n  layout(location = 12) in float a_dyn_batch_id;\n#endif\n#if CC_USE_MORPH\n    int getVertexId() {\n      return gl_VertexIndex;\n    }\n#endif\n#if CC_USE_MORPH\n  layout(set = 2, binding = 4) uniform CCMorph {\n    vec4 cc_displacementWeights[15];\n    vec4 cc_displacementTextureInfo;\n  };\n  vec2 getPixelLocation(vec2 textureResolution, int pixelIndex) {\n    float pixelIndexF = float(pixelIndex);\n    float x = mod(pixelIndexF, textureResolution.x);\n    float y = floor(pixelIndexF / textureResolution.x);\n    return vec2(x, y);\n  }\n  vec2 getPixelCoordFromLocation(vec2 location, vec2 textureResolution) {\n    return (vec2(location.x, location.y) + .5) / textureResolution;\n  }\n  #if CC_DEVICE_SUPPORT_FLOAT_TEXTURE\n      vec4 fetchVec3ArrayFromTexture(sampler2D tex, int pixelIndex) {\n        ivec2 texSize = textureSize(tex, 0);\n        return texelFetch(tex, ivec2(pixelIndex % texSize.x, pixelIndex / texSize.x), 0);\n      }\n  #else\n    vec4 fetchVec3ArrayFromTexture(sampler2D tex, int elementIndex) {\n      int pixelIndex = elementIndex * 4;\n      vec2 location = getPixelLocation(cc_displacementTextureInfo.xy, pixelIndex);\n      vec2 x = getPixelCoordFromLocation(location + vec2(0.0, 0.0), cc_displacementTextureInfo.xy);\n      vec2 y = getPixelCoordFromLocation(location + vec2(1.0, 0.0), cc_displacementTextureInfo.xy);\n      vec2 z = getPixelCoordFromLocation(location + vec2(2.0, 0.0), cc_displacementTextureInfo.xy);\n      return vec4(\n        decode32(texture(tex, x)),\n        decode32(texture(tex, y)),\n        decode32(texture(tex, z)),\n        1.0\n      );\n    }\n  #endif\n  float getDisplacementWeight(int index) {\n    int quot = index / 4;\n    int remainder = index - quot * 4;\n    if (remainder == 0) {\n      return cc_displacementWeights[quot].x;\n    } else if (remainder == 1) {\n      return cc_displacementWeights[quot].y;\n    } else if (remainder == 2) {\n      return cc_displacementWeights[quot].z;\n    } else {\n      return cc_displacementWeights[quot].w;\n    }\n  }\n  vec3 getVec3DisplacementFromTexture(sampler2D tex, int vertexIndex) {\n  #if CC_MORPH_PRECOMPUTED\n    return fetchVec3ArrayFromTexture(tex, vertexIndex).rgb;\n  #else\n    vec3 result = vec3(0, 0, 0);\n    int nVertices = int(cc_displacementTextureInfo.z);\n    for (int iTarget = 0; iTarget < CC_MORPH_TARGET_COUNT; ++iTarget) {\n      result += (fetchVec3ArrayFromTexture(tex, nVertices * iTarget + vertexIndex).rgb * getDisplacementWeight(iTarget));\n    }\n    return result;\n  #endif\n  }\n  #if CC_MORPH_TARGET_HAS_POSITION\n    layout(set = 2, binding = 7) uniform sampler2D cc_PositionDisplacements;\n    vec3 getPositionDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_PositionDisplacements, vertexId);\n    }\n  #endif\n  #if CC_MORPH_TARGET_HAS_NORMAL\n    layout(set = 2, binding = 8) uniform sampler2D cc_NormalDisplacements;\n    vec3 getNormalDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_NormalDisplacements, vertexId);\n    }\n  #endif\n  #if CC_MORPH_TARGET_HAS_TANGENT\n    layout(set = 2, binding = 9) uniform sampler2D cc_TangentDisplacements;\n    vec3 getTangentDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_TangentDisplacements, vertexId);\n    }\n  #endif\n  void applyMorph (inout vec4 position, inout vec3 normal, inout vec4 tangent) {\n    int vertexId = getVertexId();\n  #if CC_MORPH_TARGET_HAS_POSITION\n    position.xyz = position.xyz + getPositionDisplacement(vertexId);\n  #endif\n  #if CC_MORPH_TARGET_HAS_NORMAL\n    normal.xyz = normal.xyz + getNormalDisplacement(vertexId);\n  #endif\n  #if CC_MORPH_TARGET_HAS_TANGENT\n    tangent.xyz = tangent.xyz + getTangentDisplacement(vertexId);\n  #endif\n  }\n  void applyMorph (inout vec4 position) {\n  #if CC_MORPH_TARGET_HAS_POSITION\n    position.xyz = position.xyz + getPositionDisplacement(getVertexId());\n  #endif\n  }\n#endif\n#if CC_USE_SKINNING\n  #if CC_USE_BAKED_ANIMATION\n    layout(set = 2, binding = 3) uniform CCSkinningTexture {\n      highp vec4 cc_jointTextureInfo;\n    };\n    layout(set = 2, binding = 2) uniform CCSkinningAnimation {\n      highp vec4 cc_jointAnimInfo;\n    };\n    layout(set = 2, binding = 6) uniform highp sampler2D cc_jointTexture;\n    void CCGetJointTextureCoords(float pixelsPerJoint, float jointIdx, out highp float x, out highp float y, out highp float invSize)\n    {\n      #if USE_INSTANCING\n        highp float temp = pixelsPerJoint * (a_jointAnimInfo.x * a_jointAnimInfo.y + jointIdx) + a_jointAnimInfo.z;\n      #else\n        highp float temp = pixelsPerJoint * (cc_jointAnimInfo.x * cc_jointTextureInfo.y + jointIdx) + cc_jointTextureInfo.z;\n      #endif\n      invSize = cc_jointTextureInfo.w;\n      highp float tempY = floor(temp * invSize);\n      x = floor(temp - tempY * cc_jointTextureInfo.x);\n      y = (tempY + 0.5) * invSize;\n    }\n  #else\n    layout(set = 2, binding = 3) uniform CCSkinning {\n      highp vec4 cc_joints[30 * 3];\n    };\n  #endif\n  #if CC_USE_BAKED_ANIMATION\n    #if CC_DEVICE_SUPPORT_FLOAT_TEXTURE\n      mat4 getJointMatrix (float i) {\n        highp float x, y, invSize;\n        CCGetJointTextureCoords(3.0, i, x, y, invSize);\n        vec4 v1 = texture(cc_jointTexture, vec2((x + 0.5) * invSize, y));\n        vec4 v2 = texture(cc_jointTexture, vec2((x + 1.5) * invSize, y));\n        vec4 v3 = texture(cc_jointTexture, vec2((x + 2.5) * invSize, y));\n        return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n      }\n    #else\n      mat4 getJointMatrix (float i) {\n        highp float x, y, invSize;\n        CCGetJointTextureCoords(12.0, i, x, y, invSize);\n        vec4 v1 = vec4(\n          decode32(texture(cc_jointTexture, vec2((x + 0.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 1.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 2.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 3.5) * invSize, y)))\n        );\n        vec4 v2 = vec4(\n          decode32(texture(cc_jointTexture, vec2((x + 4.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 5.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 6.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 7.5) * invSize, y)))\n        );\n        vec4 v3 = vec4(\n          decode32(texture(cc_jointTexture, vec2((x + 8.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 9.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 10.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 11.5) * invSize, y)))\n        );\n        return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n      }\n    #endif\n  #else\n    mat4 getJointMatrix (float i) {\n      int idx = int(i);\n      vec4 v1 = cc_joints[idx * 3];\n      vec4 v2 = cc_joints[idx * 3 + 1];\n      vec4 v3 = cc_joints[idx * 3 + 2];\n      return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n    }\n  #endif\n  mat4 skinMatrix () {\n    vec4 joints = vec4(a_joints);\n    return getJointMatrix(joints.x) * a_weights.x\n         + getJointMatrix(joints.y) * a_weights.y\n         + getJointMatrix(joints.z) * a_weights.z\n         + getJointMatrix(joints.w) * a_weights.w;\n  }\n  void CCSkin (inout vec4 position) {\n    mat4 m = skinMatrix();\n    position = m * position;\n  }\n  void CCSkin (inout vec4 position, inout vec3 normal, inout vec4 tangent) {\n    mat4 m = skinMatrix();\n    position = m * position;\n    normal = (m * vec4(normal, 0.0)).xyz;\n    tangent.xyz = (m * vec4(tangent.xyz, 0.0)).xyz;\n  }\n#endif\nvoid CCVertInput(inout StandardVertInput In)\n{\n    In.position = vec4(a_position, 1.0);\n    In.normal = a_normal;\n    In.tangent = a_tangent;\n  #if CC_USE_MORPH\n    applyMorph(In.position, In.normal, In.tangent);\n  #endif\n  #if CC_USE_SKINNING\n    CCSkin(In.position, In.normal, In.tangent);\n  #endif\n}\nlayout(set = 0, binding = 0) uniform CCGlobal {\n  highp   vec4 cc_time;\n  mediump vec4 cc_screenSize;\n  mediump vec4 cc_nativeSize;\n};\nlayout(set = 0, binding = 1) uniform CCCamera {\n  highp   mat4 cc_matView;\n  highp   mat4 cc_matViewInv;\n  highp   mat4 cc_matProj;\n  highp   mat4 cc_matProjInv;\n  highp   mat4 cc_matViewProj;\n  highp   mat4 cc_matViewProjInv;\n  highp   vec4 cc_cameraPos;\n  mediump vec4 cc_screenScale;\n  mediump vec4 cc_exposure;\n  mediump vec4 cc_mainLitDir;\n  mediump vec4 cc_mainLitColor;\n  mediump vec4 cc_ambientSky;\n  mediump vec4 cc_ambientGround;\n  mediump vec4 cc_fogColor;\n  mediump vec4 cc_fogBase;\n  mediump vec4 cc_fogAdd;\n  mediump vec4 cc_nearFar;\n  mediump vec4 cc_viewPort;\n};\n#if !USE_INSTANCING\n  #if USE_BATCHING\n    layout(set = 2, binding = 0) uniform CCLocalBatched {\n      highp mat4 cc_matWorlds[10];\n    };\n  #else\n    layout(set = 2, binding = 0) uniform CCLocal {\n      highp mat4 cc_matWorld;\n      highp mat4 cc_matWorldIT;\n      highp vec4 cc_lightingMapUVParam;\n      highp vec4 cc_localShadowBias;\n    };\n  #endif\n#endif\nvoid CCGetWorldMatrixFull(out mat4 matWorld, out mat4 matWorldIT)\n{\n  #if USE_INSTANCING\n    matWorld = mat4(\n      vec4(a_matWorld0.xyz, 0.0),\n      vec4(a_matWorld1.xyz, 0.0),\n      vec4(a_matWorld2.xyz, 0.0),\n      vec4(a_matWorld0.w, a_matWorld1.w, a_matWorld2.w, 1.0)\n    );\n    matWorldIT = matWorld;\n  #elif USE_BATCHING\n    matWorld = cc_matWorlds[int(a_dyn_batch_id)];\n    matWorldIT = matWorld;\n  #else\n    matWorld = cc_matWorld;\n    matWorldIT = cc_matWorldIT;\n  #endif\n}\nlayout(set = 1, binding = 0) uniform Constants {\n  vec4 tilingOffset;\n  vec4 albedo;\n  vec4 albedoScaleAndCutoff;\n  vec4 pbrParams;\n  vec4 emissive;\n  vec4 emissiveScaleParam;\n};\nfloat LinearFog(vec4 pos) {\n  vec4 wPos = pos;\n  float cam_dis = distance(cc_cameraPos, wPos);\n  float fogStart = cc_fogBase.x;\n  float fogEnd = cc_fogBase.y;\n  return clamp((fogEnd - cam_dis) / (fogEnd - fogStart), 0., 1.);\n}\nfloat ExpFog(vec4 pos) {\n  vec4 wPos = pos;\n  float fogAtten = cc_fogAdd.z;\n  float fogStart = cc_fogBase.x;\n  float fogDensity = cc_fogBase.z;\n  float cam_dis = max(distance(cc_cameraPos, wPos) - fogStart, 0.0) / fogAtten * 4.;\n  float f = exp(-cam_dis * fogDensity);\n  return f;\n}\nfloat ExpSquaredFog(vec4 pos) {\n  vec4 wPos = pos;\n  float fogAtten = cc_fogAdd.z;\n  float fogStart = cc_fogBase.x;\n  float fogDensity = cc_fogBase.z;\n  float cam_dis = max(distance(cc_cameraPos, wPos) - fogStart, 0.0) / fogAtten * 4.;\n  float f = exp(-cam_dis * cam_dis * fogDensity * fogDensity);\n  return f;\n}\nfloat LayeredFog(vec4 pos) {\n  vec4 wPos = pos;\n  float fogAtten = cc_fogAdd.z;\n  float _FogTop = cc_fogAdd.x;\n  float _FogRange = cc_fogAdd.y;\n  vec3 camWorldProj = cc_cameraPos.xyz;\n  camWorldProj.y = 0.;\n  vec3 worldPosProj = wPos.xyz;\n  worldPosProj.y = 0.;\n  float fDeltaD = distance(worldPosProj, camWorldProj) / fogAtten * 2.0;\n  float fDeltaY, fDensityIntegral;\n  if (cc_cameraPos.y > _FogTop) {\n    if (wPos.y < _FogTop) {\n      fDeltaY = (_FogTop - wPos.y) / _FogRange * 2.0;\n      fDensityIntegral = fDeltaY * fDeltaY * 0.5;\n    } else {\n      fDeltaY = 0.;\n      fDensityIntegral = 0.;\n    }\n  } else {\n    if (wPos.y < _FogTop) {\n      float fDeltaA = (_FogTop - cc_cameraPos.y) / _FogRange * 2.;\n      float fDeltaB = (_FogTop - wPos.y) / _FogRange * 2.;\n      fDeltaY = abs(fDeltaA - fDeltaB);\n      fDensityIntegral = abs((fDeltaA * fDeltaA * 0.5) - (fDeltaB * fDeltaB * 0.5));\n    } else {\n      fDeltaY = abs(_FogTop - cc_cameraPos.y) / _FogRange * 2.;\n      fDensityIntegral = abs(fDeltaY * fDeltaY * 0.5);\n    }\n  }\n  float fDensity;\n  if (fDeltaY != 0.) {\n    fDensity = (sqrt(1.0 + ((fDeltaD / fDeltaY) * (fDeltaD / fDeltaY)))) * fDensityIntegral;\n  } else {\n    fDensity = 0.;\n  }\n  float f = exp(-fDensity);\n  return f;\n}\nvoid CC_TRANSFER_FOG_BASE(vec4 pos, out float factor)\n{\n  #if CC_USE_FOG == 0\n\tfactor = LinearFog(pos);\n  #elif CC_USE_FOG == 1\n    factor = ExpFog(pos);\n  #elif CC_USE_FOG == 2\n    factor = ExpSquaredFog(pos);\n  #elif CC_USE_FOG == 3\n    factor = LayeredFog(pos);\n  #else\n    factor = 1.0;\n  #endif\n}\n#if !CC_USE_ACCURATE_FOG\nlayout(location = 0) out float v_fog_factor;\n#endif\nvoid CC_TRANSFER_FOG(vec4 pos) {\n#if !CC_USE_ACCURATE_FOG\n    CC_TRANSFER_FOG_BASE(pos, v_fog_factor);\n#endif\n}\nlayout(location = 1) out highp vec4 v_shadowPos;\nlayout(set = 0, binding = 2) uniform CCShadow {\n  highp mat4 cc_matLightPlaneProj;\n  highp mat4 cc_matLightView;\n  highp mat4 cc_matLightViewProj;\n  highp vec4 cc_shadowInvProjDepthInfo;\n  highp vec4 cc_shadowProjDepthInfo;\n  highp vec4 cc_shadowProjInfo;\n  mediump vec4 cc_shadowNFLSInfo;\n  mediump vec4 cc_shadowWHPBInfo;\n  mediump vec4 cc_shadowLPNNInfo;\n  lowp vec4 cc_shadowColor;\n  mediump vec4 cc_planarNDInfo;\n};\n#if CC_RECEIVE_SHADOW\n  layout(set = 0, binding = 3) uniform highp sampler2D cc_shadowMap;\n  layout(set = 0, binding = 5) uniform highp sampler2D cc_spotLightingMap;\n#endif\n#if CC_RECEIVE_SHADOW\n#endif\n#if USE_VERTEX_COLOR\n  layout(location = 14) in vec4 a_color;\n  layout(location = 2) out vec4 v_color;\n#endif\nlayout(location = 3) out vec3 v_position;\nlayout(location = 4) out vec3 v_normal;\nlayout(location = 5) out vec2 v_uv;\nlayout(location = 6) out vec2 v_uv1;\n#if USE_NORMAL_MAP\n  layout(location = 7) out vec3 v_tangent;\n  layout(location = 8) out vec3 v_bitangent;\n#endif\n#if HAS_SECOND_UV || CC_USE_LIGHTMAP\n  layout(location = 15) in vec2 a_texCoord1;\n#endif\n#if CC_USE_LIGHTMAP && !USE_BATCHING && !CC_FORWARD_ADD\n  layout(location = 9) out vec3 v_luv;\n  void CCLightingMapCaclUV()\n  {\n  #if !USE_INSTANCING\n    v_luv.xy = cc_lightingMapUVParam.xy + a_texCoord1 * cc_lightingMapUVParam.z;\n    v_luv.z = cc_lightingMapUVParam.w;\n  #else\n    v_luv.xy = a_lightingMapUVParam.xy + a_texCoord1 * a_lightingMapUVParam.z;\n    v_luv.z = a_lightingMapUVParam.w;\n  #endif\n  }\n#endif\nvoid main () {\n  StandardVertInput In;\n  CCVertInput(In);\n  mat4 matWorld, matWorldIT;\n  CCGetWorldMatrixFull(matWorld, matWorldIT);\n  vec4 pos = matWorld * In.position;\n  v_position = pos.xyz;\n  v_normal = normalize((matWorldIT * vec4(In.normal, 0.0)).xyz);\n  #if USE_NORMAL_MAP\n    v_tangent = normalize((matWorld * vec4(In.tangent.xyz, 0.0)).xyz);\n    v_bitangent = cross(v_normal, v_tangent) * In.tangent.w;\n  #endif\n  v_uv = a_texCoord * tilingOffset.xy + tilingOffset.zw;\n  #if SAMPLE_FROM_RT\n    v_uv = cc_cameraPos.w > 1.0 ? vec2(v_uv.x, 1.0 - v_uv.y) : v_uv;\n  #endif\n  #if HAS_SECOND_UV\n    v_uv1 = a_texCoord1 * tilingOffset.xy + tilingOffset.zw;\n    #if SAMPLE_FROM_RT\n      v_uv1 = cc_cameraPos.w > 1.0 ? vec2(v_uv1.x, 1.0 - v_uv1.y) : v_uv1;\n    #endif\n  #endif\n  #if USE_VERTEX_COLOR\n    v_color = a_color;\n  #endif\n  CC_TRANSFER_FOG(pos);\n  v_shadowPos = cc_matLightViewProj * pos;\n  #if CC_USE_LIGHTMAP && !USE_BATCHING && !CC_FORWARD_ADD\n    CCLightingMapCaclUV();\n  #endif\n  gl_Position = cc_matProj * (cc_matView * matWorld) * In.position;\n}","frag":"\nprecision highp float;\nlayout(set = 0, binding = 0) uniform CCGlobal {\n  highp   vec4 cc_time;\n  mediump vec4 cc_screenSize;\n  mediump vec4 cc_nativeSize;\n};\nlayout(set = 0, binding = 1) uniform CCCamera {\n  highp   mat4 cc_matView;\n  highp   mat4 cc_matViewInv;\n  highp   mat4 cc_matProj;\n  highp   mat4 cc_matProjInv;\n  highp   mat4 cc_matViewProj;\n  highp   mat4 cc_matViewProjInv;\n  highp   vec4 cc_cameraPos;\n  mediump vec4 cc_screenScale;\n  mediump vec4 cc_exposure;\n  mediump vec4 cc_mainLitDir;\n  mediump vec4 cc_mainLitColor;\n  mediump vec4 cc_ambientSky;\n  mediump vec4 cc_ambientGround;\n  mediump vec4 cc_fogColor;\n  mediump vec4 cc_fogBase;\n  mediump vec4 cc_fogAdd;\n  mediump vec4 cc_nearFar;\n  mediump vec4 cc_viewPort;\n};\nlayout(set = 1, binding = 0) uniform Constants {\n  vec4 tilingOffset;\n  vec4 albedo;\n  vec4 albedoScaleAndCutoff;\n  vec4 pbrParams;\n  vec4 emissive;\n  vec4 emissiveScaleParam;\n};\nfloat LinearFog(vec4 pos) {\n  vec4 wPos = pos;\n  float cam_dis = distance(cc_cameraPos, wPos);\n  float fogStart = cc_fogBase.x;\n  float fogEnd = cc_fogBase.y;\n  return clamp((fogEnd - cam_dis) / (fogEnd - fogStart), 0., 1.);\n}\nfloat ExpFog(vec4 pos) {\n  vec4 wPos = pos;\n  float fogAtten = cc_fogAdd.z;\n  float fogStart = cc_fogBase.x;\n  float fogDensity = cc_fogBase.z;\n  float cam_dis = max(distance(cc_cameraPos, wPos) - fogStart, 0.0) / fogAtten * 4.;\n  float f = exp(-cam_dis * fogDensity);\n  return f;\n}\nfloat ExpSquaredFog(vec4 pos) {\n  vec4 wPos = pos;\n  float fogAtten = cc_fogAdd.z;\n  float fogStart = cc_fogBase.x;\n  float fogDensity = cc_fogBase.z;\n  float cam_dis = max(distance(cc_cameraPos, wPos) - fogStart, 0.0) / fogAtten * 4.;\n  float f = exp(-cam_dis * cam_dis * fogDensity * fogDensity);\n  return f;\n}\nfloat LayeredFog(vec4 pos) {\n  vec4 wPos = pos;\n  float fogAtten = cc_fogAdd.z;\n  float _FogTop = cc_fogAdd.x;\n  float _FogRange = cc_fogAdd.y;\n  vec3 camWorldProj = cc_cameraPos.xyz;\n  camWorldProj.y = 0.;\n  vec3 worldPosProj = wPos.xyz;\n  worldPosProj.y = 0.;\n  float fDeltaD = distance(worldPosProj, camWorldProj) / fogAtten * 2.0;\n  float fDeltaY, fDensityIntegral;\n  if (cc_cameraPos.y > _FogTop) {\n    if (wPos.y < _FogTop) {\n      fDeltaY = (_FogTop - wPos.y) / _FogRange * 2.0;\n      fDensityIntegral = fDeltaY * fDeltaY * 0.5;\n    } else {\n      fDeltaY = 0.;\n      fDensityIntegral = 0.;\n    }\n  } else {\n    if (wPos.y < _FogTop) {\n      float fDeltaA = (_FogTop - cc_cameraPos.y) / _FogRange * 2.;\n      float fDeltaB = (_FogTop - wPos.y) / _FogRange * 2.;\n      fDeltaY = abs(fDeltaA - fDeltaB);\n      fDensityIntegral = abs((fDeltaA * fDeltaA * 0.5) - (fDeltaB * fDeltaB * 0.5));\n    } else {\n      fDeltaY = abs(_FogTop - cc_cameraPos.y) / _FogRange * 2.;\n      fDensityIntegral = abs(fDeltaY * fDeltaY * 0.5);\n    }\n  }\n  float fDensity;\n  if (fDeltaY != 0.) {\n    fDensity = (sqrt(1.0 + ((fDeltaD / fDeltaY) * (fDeltaD / fDeltaY)))) * fDensityIntegral;\n  } else {\n    fDensity = 0.;\n  }\n  float f = exp(-fDensity);\n  return f;\n}\nvoid CC_TRANSFER_FOG_BASE(vec4 pos, out float factor)\n{\n  #if CC_USE_FOG == 0\n\tfactor = LinearFog(pos);\n  #elif CC_USE_FOG == 1\n    factor = ExpFog(pos);\n  #elif CC_USE_FOG == 2\n    factor = ExpSquaredFog(pos);\n  #elif CC_USE_FOG == 3\n    factor = LayeredFog(pos);\n  #else\n    factor = 1.0;\n  #endif\n}\nvoid CC_APPLY_FOG_BASE(inout vec4 color, float factor) {\n  color = vec4(mix(cc_fogColor.rgb, color.rgb, factor), color.a);\n}\n#if !CC_USE_ACCURATE_FOG\nlayout(location = 0) in float v_fog_factor;\n#endif\nvoid CC_APPLY_FOG(inout vec4 color) {\n#if !CC_USE_ACCURATE_FOG\n    CC_APPLY_FOG_BASE(color, v_fog_factor);\n#endif\n}\nvoid CC_APPLY_FOG(inout vec4 color, vec3 worldPos) {\n#if CC_USE_ACCURATE_FOG\n    float factor;\n    CC_TRANSFER_FOG_BASE(vec4(worldPos, 1.0), factor);\n#else\n    float factor = v_fog_factor;\n#endif\n    CC_APPLY_FOG_BASE(color, factor);\n}\n#define QUATER_PI         0.78539816340\n#define HALF_PI           1.57079632679\n#define PI                3.14159265359\n#define PI2               6.28318530718\n#define PI4               12.5663706144\n#define INV_QUATER_PI     1.27323954474\n#define INV_HALF_PI       0.63661977237\n#define INV_PI            0.31830988618\n#define INV_PI2           0.15915494309\n#define INV_PI4           0.07957747155\n#define EPSILON           1e-6\n#define EPSILON_LOWP      1e-4\n#define LOG2              1.442695\n#define EXP_VALUE         2.71828183f\n#define FP_MAX            65504.0\n#define FP_SCALE          0.0009765625\n#define FP_SCALE_INV      1024.0\n#define GRAY_VECTOR       vec3(0.299, 0.587, 0.114)\nvec3 SRGBToLinear (vec3 gamma) {\n  return gamma * gamma;\n}\nlayout(set = 0, binding = 2) uniform CCShadow {\n  highp mat4 cc_matLightPlaneProj;\n  highp mat4 cc_matLightView;\n  highp mat4 cc_matLightViewProj;\n  highp vec4 cc_shadowInvProjDepthInfo;\n  highp vec4 cc_shadowProjDepthInfo;\n  highp vec4 cc_shadowProjInfo;\n  mediump vec4 cc_shadowNFLSInfo;\n  mediump vec4 cc_shadowWHPBInfo;\n  mediump vec4 cc_shadowLPNNInfo;\n  lowp vec4 cc_shadowColor;\n  mediump vec4 cc_planarNDInfo;\n};\nhighp float unpackHighpData (float mainPart, float modPart) {\n  highp float data = mainPart;\n  return data + modPart;\n}\nhighp float unpackHighpData (float mainPart, float modPart, const float modValue) {\n  highp float data = mainPart * modValue;\n  return data + modPart * modValue;\n}\nhighp vec2 unpackHighpData (vec2 mainPart, vec2 modPart) {\n  highp vec2 data = mainPart;\n  return data + modPart;\n}\nhighp vec2 unpackHighpData (vec2 mainPart, vec2 modPart, const float modValue) {\n  highp vec2 data = mainPart * modValue;\n  return data + modPart * modValue;\n}\nhighp vec3 unpackHighpData (vec3 mainPart, vec3 modPart) {\n  highp vec3 data = mainPart;\n  return data + modPart;\n}\nhighp vec3 unpackHighpData (vec3 mainPart, vec3 modPart, const float modValue) {\n  highp vec3 data = mainPart * modValue;\n  return data + modPart * modValue;\n}\nhighp vec4 unpackHighpData (vec4 mainPart, vec4 modPart) {\n  highp vec4 data = mainPart;\n  return data + modPart;\n}\nhighp vec4 unpackHighpData (vec4 mainPart, vec4 modPart, const float modValue) {\n  highp vec4 data = mainPart * modValue;\n  return data + modPart * modValue;\n}\nlayout(set = 2, binding = 0) uniform CCLocal {\n  highp mat4 cc_matWorld;\n  highp mat4 cc_matWorldIT;\n  highp vec4 cc_lightingMapUVParam;\n  highp vec4 cc_localShadowBias;\n};\nfloat CCGetLinearDepthFromViewSpace(vec3 viewPos) {\n  float dist = length(viewPos);\n  return (dist - cc_shadowNFLSInfo.x) / (cc_shadowNFLSInfo.y - cc_shadowNFLSInfo.x);\n}\nfloat CCGetLinearDepth(vec3 worldPos) {\n  vec4 viewStartPos = cc_matLightView * vec4(worldPos.xyz, 1.0);\n  return CCGetLinearDepthFromViewSpace(viewStartPos.xyz);\n}\n#if CC_RECEIVE_SHADOW\n  layout(set = 0, binding = 3) uniform highp sampler2D cc_shadowMap;\n  layout(set = 0, binding = 5) uniform highp sampler2D cc_spotLightingMap;\n  vec4 ApplyShadowDepthBias_FaceNormal(vec4 shadowPos, vec3 worldNormal, float normalBias)\n  {\n    vec4 newShadowPos = shadowPos;\n    if(normalBias > EPSILON_LOWP)\n    {\n      vec4 viewNormal = cc_matLightView * vec4(worldNormal, 0.0);\n      if(viewNormal.z < 0.1)\n        newShadowPos.xy += viewNormal.xy * cc_shadowProjInfo.xy * normalBias * clamp(viewNormal.z, 0.001, 0.1);\n    }\n    return newShadowPos;\n  }\n  vec4 ApplyShadowDepthBias_Perspective(vec4 shadowPos, float viewspaceDepthBias)\n  {\n    vec3 viewSpacePos;\n    viewSpacePos.xy = shadowPos.xy * cc_shadowProjInfo.zw;\n    viewSpacePos.z = shadowPos.z * cc_shadowInvProjDepthInfo.x + shadowPos.w * cc_shadowInvProjDepthInfo.y;\n    viewSpacePos.xyz += cc_shadowProjDepthInfo.z * normalize(viewSpacePos.xyz) * viewspaceDepthBias;\n    vec4 clipSpacePos;\n    clipSpacePos.xy = viewSpacePos.xy * cc_shadowProjInfo.xy;\n    clipSpacePos.zw = viewSpacePos.z * cc_shadowProjDepthInfo.xz + vec2(cc_shadowProjDepthInfo.y, 0.0);\n    if (cc_shadowNFLSInfo.z > EPSILON) {\n      clipSpacePos.z = CCGetLinearDepthFromViewSpace(viewSpacePos.xyz);\n      clipSpacePos.z = (clipSpacePos.z * 2.0 - 1.0) * clipSpacePos.w;\n    }\n    return clipSpacePos;\n  }\n  vec4 ApplyShadowDepthBias_Orthographic(vec4 shadowPos, float viewspaceDepthBias)\n  {\n    float coeffA = cc_shadowProjDepthInfo.x;\n    float coeffB = cc_shadowProjDepthInfo.y;\n    float viewSpacePos_z = (shadowPos.z - coeffB) / coeffA;\n    viewSpacePos_z += viewspaceDepthBias;\n    vec4 result = shadowPos;\n    result.z = viewSpacePos_z * coeffA + coeffB;\n    return result;\n  }\n  float CCGetShadowFactorHard (vec4 shadowPos, float bias) {\n    vec4 clipPosNew = ApplyShadowDepthBias_Orthographic(shadowPos, bias);\n    vec3 clipPos = clipPosNew.xyz / clipPosNew.w * 0.5 + 0.5;\n    if (clipPos.x < 0.0 || clipPos.x > 1.0 ||\n        clipPos.y < 0.0 || clipPos.y > 1.0 ||\n        clipPos.z < 0.0 || clipPos.z > 1.0) { return 1.0; }\n    clipPos.xy = cc_cameraPos.w == 1.0 ? vec2(clipPos.xy.x, 1.0 - clipPos.xy.y) : clipPos.xy;\n    float shadow = 0.0;\n    float closestDepth = 0.0;\n    if (cc_shadowLPNNInfo.y > EPSILON) {\n      closestDepth = dot(texture(cc_shadowMap, clipPos.xy), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0));\n    } else {\n      closestDepth = texture(cc_shadowMap, clipPos.xy).x;\n    }\n    shadow = step(clipPos.z, closestDepth);\n    return shadow;\n  }\n  float CCGetShadowFactorSoft (vec4 shadowPos, float bias) {\n    vec4 clipPosNew = ApplyShadowDepthBias_Orthographic(shadowPos, bias);\n    vec3 clipPos = clipPosNew.xyz / clipPosNew.w * 0.5 + 0.5;\n    if (clipPos.x < 0.0 || clipPos.x > 1.0 ||\n        clipPos.y < 0.0 || clipPos.y > 1.0 ||\n        clipPos.z < 0.0 || clipPos.z > 1.0) { return 1.0; }\n    clipPos.xy = cc_cameraPos.w == 1.0 ? vec2(clipPos.xy.x, 1.0 - clipPos.xy.y) : clipPos.xy;\n    float offsetDepth = clipPos.z;\n    vec2 mapSize = cc_shadowWHPBInfo.xy;\n    vec2 oneTap = 1.0 / mapSize;\n    vec2 clipPos_offset = clipPos.xy + oneTap;\n    float block0, block1, block2, block3;\n    if (cc_shadowLPNNInfo.y > EPSILON) {\n      block0 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos.x, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block1 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos_offset.x, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block2 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos.x, clipPos_offset.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block3 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos_offset.x, clipPos_offset.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n    } else {\n      block0 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos.x, clipPos.y)).x);\n      block1 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos_offset.x, clipPos.y)).x);\n      block2 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos.x, clipPos_offset.y)).x);\n      block3 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos_offset.x, clipPos_offset.y)).x);\n    }\n    float coefX   = mod(clipPos.x, oneTap.x) * mapSize.x;\n    float resultX = mix(block0, block1, coefX);\n    float resultY = mix(block2, block3, coefX);\n    float coefY   = mod(clipPos.y, oneTap.y) * mapSize.y;\n    return mix(resultX, resultY, coefY);\n  }\n  float CCGetShadowFactorSoft2X (vec4 shadowPos, float bias) {\n    vec4 clipPosNew = ApplyShadowDepthBias_Orthographic(shadowPos, bias);\n    vec3 clipPos = clipPosNew.xyz / clipPosNew.w * 0.5 + 0.5;\n    if (clipPos.x < 0.0 || clipPos.x > 1.0 ||\n        clipPos.y < 0.0 || clipPos.y > 1.0 ||\n        clipPos.z < 0.0 || clipPos.z > 1.0) { return 1.0; }\n    clipPos.xy = cc_cameraPos.w == 1.0 ? vec2(clipPos.xy.x, 1.0 - clipPos.xy.y) : clipPos.xy;\n    float offsetDepth = clipPos.z;\n    vec2 mapSize = cc_shadowWHPBInfo.xy;\n    vec2 oneTap = 1.0 / mapSize;\n    float clipPos_offset_L = clipPos.x - oneTap.x;\n    float clipPos_offset_R = clipPos.x + oneTap.x;\n    float clipPos_offset_U = clipPos.y - oneTap.y;\n    float clipPos_offset_D = clipPos.y + oneTap.y;\n    float block0, block1, block2, block3, block4, block5, block6, block7, block8;\n    if (cc_shadowLPNNInfo.y > EPSILON) {\n      block0 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos_offset_L, clipPos_offset_U)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block1 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos.x, clipPos_offset_U)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block2 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos_offset_R, clipPos_offset_U)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block3 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos_offset_L, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block4 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos.x, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block5 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos_offset_R, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block6 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos_offset_L, clipPos_offset_D)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block7 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos.x, clipPos_offset_D)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block8 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos_offset_R, clipPos_offset_D)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n    } else {\n      block0 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos_offset_L, clipPos_offset_U)).x);\n      block1 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos.x, clipPos_offset_U)).x);\n      block2 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos_offset_R, clipPos_offset_U)).x);\n      block3 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos_offset_L, clipPos.y)).x);\n      block4 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos.x, clipPos.y)).x);\n      block5 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos_offset_R, clipPos.y)).x);\n      block6 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos_offset_L, clipPos_offset_D)).x);\n      block7 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos.x, clipPos_offset_D)).x);\n      block8 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos_offset_R, clipPos_offset_D)).x);\n    }\n    float coefX = mod(clipPos.x, oneTap.x) * mapSize.x;\n    float coefY = mod(clipPos.y, oneTap.y) * mapSize.y;\n    float shadow = 0.0;\n    float resultX = mix(block0, block1, coefX);\n    float resultY = mix(block3, block4, coefX);\n    shadow += mix(resultX , resultY, coefY);\n    resultX = mix(block1, block2, coefX);\n    resultY = mix(block4, block5, coefX);\n    shadow += mix(resultX , resultY, coefY);\n    resultX = mix(block3, block4, coefX);\n    resultY = mix(block6, block7, coefX);\n    shadow += mix(resultX, resultY, coefY);\n    resultX = mix(block4, block5, coefX);\n    resultY = mix(block7, block8, coefX);\n    shadow += mix(resultX, resultY, coefY);\n    return shadow * 0.25;\n  }\n  float CCGetSpotLightShadowFactorHard (vec4 shadowPos, vec3 worldPos, float bias) {\n    vec4 clipPosNew = ApplyShadowDepthBias_Perspective(shadowPos, bias);\n    vec3 clipPos = clipPosNew.xyz / clipPosNew.w * 0.5 + 0.5;\n    if (clipPos.x < 0.0 || clipPos.x > 1.0 ||\n        clipPos.y < 0.0 || clipPos.y > 1.0 ||\n        clipPos.z < 0.0 || clipPos.z > 1.0) { return 1.0; }\n    clipPos.xy = cc_cameraPos.w == 1.0 ? vec2(clipPos.xy.x, 1.0 - clipPos.xy.y) : clipPos.xy;\n    float shadow = 0.0;\n    float closestDepth = 0.0;\n    float depth = clipPos.z;\n    if (cc_shadowLPNNInfo.y > EPSILON) {\n      closestDepth = dot(texture(cc_spotLightingMap, clipPos.xy), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0));\n    } else {\n      closestDepth = texture(cc_spotLightingMap, clipPos.xy).x;\n    }\n    shadow = step(depth, closestDepth);\n    return shadow;\n  }\n  float CCGetSpotLightShadowFactorSoft (vec4 shadowPos, vec3 worldPos, float bias) {\n    vec4 clipPosNew = ApplyShadowDepthBias_Perspective(shadowPos, bias);\n    vec3 clipPos = clipPosNew.xyz / clipPosNew.w * 0.5 + 0.5;\n    if (clipPos.x < 0.0 || clipPos.x > 1.0 ||\n        clipPos.y < 0.0 || clipPos.y > 1.0 ||\n        clipPos.z < 0.0 || clipPos.z > 1.0) { return 1.0; }\n    clipPos.xy = cc_cameraPos.w == 1.0 ? vec2(clipPos.xy.x, 1.0 - clipPos.xy.y) : clipPos.xy;\n    float depth = 0.0;\n    if (cc_shadowNFLSInfo.z > EPSILON) {\n      depth = CCGetLinearDepth(worldPos);\n    } else {\n      depth = clipPos.z;\n    }\n    vec2 oneTap = 1.0 / cc_shadowWHPBInfo.xy;\n    vec2 clipPos_offset = clipPos.xy + oneTap;\n    float block0, block1, block2, block3;\n    if (cc_shadowLPNNInfo.y > EPSILON) {\n      block0 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos.x, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block1 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos_offset.x, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block2 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos.x, clipPos_offset.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block3 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos_offset.x, clipPos_offset.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n    } else {\n      block0 = step(depth, texture(cc_spotLightingMap, vec2(clipPos.x, clipPos.y)).x);\n      block1 = step(depth, texture(cc_spotLightingMap, vec2(clipPos_offset.x, clipPos.y)).x);\n      block2 = step(depth, texture(cc_spotLightingMap, vec2(clipPos.x, clipPos_offset.y)).x);\n      block3 = step(depth, texture(cc_spotLightingMap, vec2(clipPos_offset.x, clipPos_offset.y)).x);\n    }\n    float coefX   = mod(clipPos.x, oneTap.x) * cc_shadowWHPBInfo.x;\n    float resultX = mix(block0, block1, coefX);\n    float resultY = mix(block2, block3, coefX);\n    float coefY   = mod(clipPos.y, oneTap.y) * cc_shadowWHPBInfo.y;\n    return mix(resultX, resultY, coefY);\n  }\n  float CCGetSpotLightShadowFactorSoft2X (vec4 shadowPos, vec3 worldPos, float bias) {\n    vec4 clipPosNew = ApplyShadowDepthBias_Perspective(shadowPos, bias);\n    vec3 clipPos = clipPosNew.xyz / clipPosNew.w * 0.5 + 0.5;\n    if (clipPos.x < 0.0 || clipPos.x > 1.0 ||\n        clipPos.y < 0.0 || clipPos.y > 1.0 ||\n        clipPos.z < 0.0 || clipPos.z > 1.0) { return 1.0; }\n    clipPos.xy = cc_cameraPos.w == 1.0 ? vec2(clipPos.xy.x, 1.0 - clipPos.xy.y) : clipPos.xy;\n    float depth = 0.0;\n    if (cc_shadowNFLSInfo.z > EPSILON) {\n      depth = CCGetLinearDepth(worldPos);\n    } else {\n      depth = clipPos.z;\n    }\n    vec2 mapSize = cc_shadowWHPBInfo.xy;\n    vec2 oneTap = 1.0 / mapSize;\n    float clipPos_offset_L = clipPos.x - oneTap.x;\n    float clipPos_offset_R = clipPos.x + oneTap.x;\n    float clipPos_offset_U = clipPos.y - oneTap.y;\n    float clipPos_offset_D = clipPos.y + oneTap.y;\n    float block0, block1, block2, block3, block4, block5, block6, block7, block8;\n    if (cc_shadowLPNNInfo.y > EPSILON) {\n      block0 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos_offset_L, clipPos_offset_U)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block1 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos.x, clipPos_offset_U)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block2 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos_offset_R, clipPos_offset_U)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block3 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos_offset_L, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block4 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos.x, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block5 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos_offset_R, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block6 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos_offset_L, clipPos_offset_D)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block7 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos.x, clipPos_offset_D)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block8 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos_offset_R, clipPos_offset_D)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n    } else {\n      block0 = step(depth, texture(cc_spotLightingMap, vec2(clipPos_offset_L, clipPos_offset_U)).x);\n      block1 = step(depth, texture(cc_spotLightingMap, vec2(clipPos.x, clipPos_offset_U)).x);\n      block2 = step(depth, texture(cc_spotLightingMap, vec2(clipPos_offset_R, clipPos_offset_U)).x);\n      block3 = step(depth, texture(cc_spotLightingMap, vec2(clipPos_offset_L, clipPos.y)).x);\n      block4 = step(depth, texture(cc_spotLightingMap, vec2(clipPos.x, clipPos.y)).x);\n      block5 = step(depth, texture(cc_spotLightingMap, vec2(clipPos_offset_R, clipPos.y)).x);\n      block6 = step(depth, texture(cc_spotLightingMap, vec2(clipPos_offset_L, clipPos_offset_D)).x);\n      block7 = step(depth, texture(cc_spotLightingMap, vec2(clipPos.x, clipPos_offset_D)).x);\n      block8 = step(depth, texture(cc_spotLightingMap, vec2(clipPos_offset_R, clipPos_offset_D)).x);\n    }\n    float coefX = mod(clipPos.x, oneTap.x) * mapSize.x;\n    float coefY = mod(clipPos.y, oneTap.y) * mapSize.y;\n    float shadow = 0.0;\n    float resultX = mix(block0, block1, coefX);\n    float resultY = mix(block3, block4, coefX);\n    shadow += mix(resultX , resultY, coefY);\n    resultX = mix(block1, block2, coefX);\n    resultY = mix(block4, block5, coefX);\n    shadow += mix(resultX , resultY, coefY);\n    resultX = mix(block3, block4, coefX);\n    resultY = mix(block6, block7, coefX);\n    shadow += mix(resultX, resultY, coefY);\n    resultX = mix(block4, block5, coefX);\n    resultY = mix(block7, block8, coefX);\n    shadow += mix(resultX, resultY, coefY);\n    return shadow * 0.25;\n  }\nfloat CCSpotShadowFactorBase(vec4 shadowPos, vec3 worldPos, vec2 shadowBias)\n{\n  float pcf = cc_shadowWHPBInfo.z;\n  if (pcf > 1.9) {\n    return CCGetSpotLightShadowFactorSoft2X(shadowPos, worldPos, shadowBias.x);\n  }else if (pcf > 0.9) {\n    return CCGetSpotLightShadowFactorSoft(shadowPos, worldPos, shadowBias.x);\n  }else {\n    return CCGetSpotLightShadowFactorHard(shadowPos, worldPos, shadowBias.x);\n  }\n}\nfloat CCShadowFactorBase(vec4 shadowPos, vec3 N, vec2 shadowBias)\n{\n  float realtimeShadow = 1.0;\n  vec4 pos = ApplyShadowDepthBias_FaceNormal(shadowPos, N, shadowBias.y);\n  float pcf = cc_shadowWHPBInfo.z;\n  if (pcf > 1.9) {\n    realtimeShadow =  CCGetShadowFactorSoft2X(pos, shadowBias.x);\n  }else if (pcf > 0.9) {\n    realtimeShadow = CCGetShadowFactorSoft(pos, shadowBias.x);\n  }else {\n    realtimeShadow = CCGetShadowFactorHard(pos, shadowBias.x);\n  }\n  return mix(realtimeShadow, 1.0, cc_shadowNFLSInfo.w);\n}\n#endif\n#if CC_USE_IBL\n  layout(set = 0, binding = 4) uniform samplerCube cc_environment;\n  vec4 fragTextureLod (sampler2D tex, vec2 coord, float lod) {\n      return textureLod(tex, coord, lod);\n  }\n  vec4 fragTextureLod (samplerCube tex, vec3 coord, float lod) {\n      return textureLod(tex, coord, lod);\n  }\n  vec3 unpackRGBE (vec4 rgbe) {\n    return rgbe.rgb * pow(1.1, rgbe.a * 255.0 - 128.0);\n  }\n  #if CC_USE_DIFFUSEMAP\n    layout(set = 0, binding = 6) uniform samplerCube cc_diffuseMap;\n  #endif\n#endif\nfloat GGXMobile (float roughness, float NoH, vec3 H, vec3 N) {\n  vec3 NxH = cross(N, H);\n  float OneMinusNoHSqr = dot(NxH, NxH);\n  float a = roughness * roughness;\n  float n = NoH * a;\n  float p = a / (OneMinusNoHSqr + n * n);\n  return p * p;\n}\nfloat CalcSpecular (float roughness, float NoH, vec3 H, vec3 N) {\n  return (roughness * 0.25 + 0.25) * GGXMobile(roughness, NoH, H, N);\n}\nvec3 BRDFApprox (vec3 specular, float roughness, float NoV) {\n  const vec4 c0 = vec4(-1.0, -0.0275, -0.572, 0.022);\n  const vec4 c1 = vec4(1.0, 0.0425, 1.04, -0.04);\n  vec4 r = roughness * c0 + c1;\n  float a004 = min(r.x * r.x, exp2(-9.28 * NoV)) * r.x + r.y;\n  vec2 AB = vec2(-1.04, 1.04) * a004 + r.zw;\n  AB.y *= clamp(50.0 * specular.g, 0.0, 1.0);\n  return specular * AB.x + AB.y;\n}\n#if USE_REFLECTION_DENOISE\n  vec3 GetEnvReflectionWithMipFiltering(vec3 R, float roughness, float mipCount, float denoiseIntensity) {\n    #if CC_USE_IBL\n    \tfloat mip = roughness * mipCount;\n    \tfloat delta = (dot(dFdx(R), dFdy(R))) * 1000.0;\n    \tfloat mipBias = mix(0.0, 5.0, clamp(delta, 0.0, 1.0));\n    \tvec4 biased = fragTextureLod(cc_environment, R, mip + mipBias);\n     \tvec4 filtered = texture(cc_environment, R);\n      #if CC_USE_IBL == 2\n      \tbiased.rgb = unpackRGBE(biased);\n      \tfiltered.rgb = unpackRGBE(filtered);\n      #else\n      \tbiased.rgb = SRGBToLinear(biased.rgb);\n      \tfiltered.rgb = SRGBToLinear(filtered.rgb);\n      #endif\n      return mix(biased.rgb, filtered.rgb, denoiseIntensity);\n    #else\n      return vec3(0.0, 0.0, 0.0);\n    #endif\n  }\n#endif\nstruct StandardSurface {\n  vec4 albedo;\n  #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\n  vec3 position, position_fract_part;\n  #else\n  vec3 position;\n  #endif\n  vec3 normal;\n  vec3 emissive;\n  vec3 lightmap;\n  float lightmap_test;\n  float roughness;\n  float metallic;\n  float occlusion;\n  float specularIntensity;\n  #if CC_RECEIVE_SHADOW\n    vec2 shadowBias;\n  #endif\n};\nvec4 CCStandardShadingBase (StandardSurface s, vec4 shadowPos) {\n  vec3 diffuse = s.albedo.rgb * (1.0 - s.metallic);\n  vec3 specular = mix(vec3(0.08 * s.specularIntensity), s.albedo.rgb, s.metallic);\n  vec3 position;\n  #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\n  position = unpackHighpData(s.position, s.position_fract_part);\n  #else\n  position = s.position;\n  #endif\n  vec3 N = normalize(s.normal);\n  vec3 V = normalize(cc_cameraPos.xyz - position);\n  float NV = max(abs(dot(N, V)), 0.0);\n  specular = BRDFApprox(specular, s.roughness, NV);\n  vec3 L = normalize(-cc_mainLitDir.xyz);\n  vec3 H = normalize(L + V);\n  float NH = max(dot(N, H), 0.0);\n  float NL = max(dot(N, L), 0.0);\n  vec3 finalColor = NL * cc_mainLitColor.rgb * cc_mainLitColor.w;\n  vec3 diffuseContrib = diffuse / PI;\n  vec3 specularContrib = specular * CalcSpecular(s.roughness, NH, H, N);\n  vec3 dirlightContrib = (diffuseContrib + specularContrib);\n  float shadow = 1.0;\n  #if CC_RECEIVE_SHADOW\n    if (NL > 0.0 && cc_mainLitDir.w > 0.0) {\n      shadow = CCShadowFactorBase(shadowPos, N, s.shadowBias);\n    }\n  #endif\n  dirlightContrib *= shadow;\n  finalColor *= dirlightContrib;\n  #if CC_USE_LIGHTMAP && !USE_BATCHING && !CC_FORWARD_ADD\n    if (s.lightmap_test > EPSILON_LOWP) {\n      finalColor = diffuse * s.lightmap.rgb * shadow;\n    }\n  #endif\n  float fAmb = 0.5 - N.y * 0.5;\n  vec3 ambDiff = mix(cc_ambientSky.rgb, cc_ambientGround.rgb, fAmb);\n  #if CC_USE_IBL\n    #if CC_USE_DIFFUSEMAP\n      vec4 diffuseMap = texture(cc_diffuseMap, N);\n      #if CC_USE_DIFFUSEMAP == 2\n        ambDiff = unpackRGBE(diffuseMap);\n      #else\n        ambDiff = SRGBToLinear(diffuseMap.rgb);\n      #endif\n    #endif\n    vec3 R = normalize(reflect(-V, N));\n    #if USE_REFLECTION_DENOISE\n      vec3 env = GetEnvReflectionWithMipFiltering(R, s.roughness, cc_ambientGround.w, 0.6);\n    #else\n      vec4 envmap = fragTextureLod(cc_environment, R, s.roughness * cc_ambientGround.w);\n      #if CC_USE_IBL == 2\n        vec3 env = unpackRGBE(envmap);\n      #else\n        vec3 env = SRGBToLinear(envmap.rgb);\n      #endif\n    #endif\n    finalColor += env * cc_ambientSky.w * specular * s.occlusion;\n  #endif\n  finalColor += ambDiff.rgb * cc_ambientSky.w * diffuse * s.occlusion;\n  finalColor += s.emissive;\n  return vec4(finalColor, s.albedo.a);\n}\nvec3 ACESToneMap (vec3 color) {\n  color = min(color, vec3(8.0));\n  const float A = 2.51;\n  const float B = 0.03;\n  const float C = 2.43;\n  const float D = 0.59;\n  const float E = 0.14;\n  return (color * (A * color + B)) / (color * (C * color + D) + E);\n}\nvec4 CCFragOutput (vec4 color) {\n  #if CC_USE_HDR\n    color.rgb = ACESToneMap(color.rgb);\n  #endif\n  color.rgb = sqrt(color.rgb);\n  return color;\n}\nlayout(location = 1) in highp vec4 v_shadowPos;\n#if CC_RECEIVE_SHADOW\n#endif\n#if CC_USE_LIGHTMAP && !USE_BATCHING && !CC_FORWARD_ADD\n  layout(location = 9) in vec3 v_luv;\n  layout(set = 2, binding = 10) uniform sampler2D cc_lightingMap;\n#endif\nlayout(location = 3) in vec3 v_position;\nlayout(location = 5) in vec2 v_uv;\nlayout(location = 6) in vec2 v_uv1;\nlayout(location = 4) in vec3 v_normal;\n#if USE_VERTEX_COLOR\n  layout(location = 2) in vec4 v_color;\n#endif\n#if USE_ALBEDO_MAP\n  layout(set = 1, binding = 1) uniform sampler2D albedoMap;\n#endif\n#if USE_NORMAL_MAP\n  layout(location = 7) in vec3 v_tangent;\n  layout(location = 8) in vec3 v_bitangent;\n  layout(set = 1, binding = 2) uniform sampler2D normalMap;\n#endif\n#if USE_PBR_MAP\n  layout(set = 1, binding = 3) uniform sampler2D pbrMap;\n#endif\n#if USE_METALLIC_ROUGHNESS_MAP\n  layout(set = 1, binding = 4) uniform sampler2D metallicRoughnessMap;\n#endif\n#if USE_OCCLUSION_MAP\n  layout(set = 1, binding = 5) uniform sampler2D occlusionMap;\n#endif\n#if USE_EMISSIVE_MAP\n  layout(set = 1, binding = 6) uniform sampler2D emissiveMap;\n#endif\n#if USE_ALPHA_TEST\n#endif\nvoid surf (out StandardSurface s) {\n  vec4 baseColor = albedo;\n  #if USE_VERTEX_COLOR\n    baseColor *= v_color;\n  #endif\n  #if USE_ALBEDO_MAP\n    vec4 texColor = texture(albedoMap, ALBEDO_UV);\n    texColor.rgb = SRGBToLinear(texColor.rgb);\n    baseColor *= texColor;\n  #endif\n  s.albedo = baseColor;\n  s.albedo.rgb *= albedoScaleAndCutoff.xyz;\n  #if USE_ALPHA_TEST\n    if (s.albedo.ALPHA_TEST_CHANNEL < albedoScaleAndCutoff.w) discard;\n  #endif\n  #if CC_USE_LIGHTMAP && !USE_BATCHING && !CC_FORWARD_ADD\n    vec4 lightColor = texture(cc_lightingMap, v_luv.xy);\n    s.lightmap = lightColor.rgb;\n    s.lightmap_test = v_luv.z;\n  #endif\n  s.normal = v_normal;\n  #if USE_NORMAL_MAP\n    vec3 nmmp = texture(normalMap, NORMAL_UV).xyz - vec3(0.5);\n    s.normal =\n      (nmmp.x * pbrParams.w) * normalize(v_tangent) +\n      (nmmp.y * pbrParams.w) * normalize(v_bitangent) +\n      nmmp.z * normalize(s.normal);\n  #endif\n  s.position = v_position;\n  vec4 pbr = pbrParams;\n  #if USE_PBR_MAP\n    vec4 res = texture(pbrMap, PBR_UV);\n    pbr.x *= res.r;\n    pbr.y *= res.g;\n    pbr.z *= res.b;\n  #endif\n  #if USE_METALLIC_ROUGHNESS_MAP\n    vec4 metallicRoughness = texture(metallicRoughnessMap, PBR_UV);\n    pbr.z *= metallicRoughness.b;\n    pbr.y *= metallicRoughness.g;\n  #endif\n  #if USE_OCCLUSION_MAP\n    pbr.x *= texture(occlusionMap, PBR_UV).r;\n  #endif\n  s.occlusion = clamp(pbr.x, 0.0, 0.96);\n  s.roughness = clamp(pbr.y, 0.04, 1.0);\n  s.specularIntensity = 0.5;\n  s.metallic = pbr.z;\n  s.emissive = emissive.rgb * emissiveScaleParam.xyz;\n  #if USE_EMISSIVE_MAP\n    s.emissive *= SRGBToLinear(texture(emissiveMap, EMISSIVE_UV).rgb);\n  #endif\n}\n#if CC_FORWARD_ADD\n  #if CC_PIPELINE_TYPE == 0\n    #define LIGHTS_PER_PASS 1\n  #else\n    #define LIGHTS_PER_PASS 10\n  #endif\n  #if CC_ENABLE_CLUSTERED_LIGHT_CULLING == 0\n  layout(set = 2, binding = 1) uniform CCForwardLight {\n    highp vec4 cc_lightPos[LIGHTS_PER_PASS];\n    vec4 cc_lightColor[LIGHTS_PER_PASS];\n    vec4 cc_lightSizeRangeAngle[LIGHTS_PER_PASS];\n    vec4 cc_lightDir[LIGHTS_PER_PASS];\n  };\n  #endif\n  float SmoothDistAtt (float distSqr, float invSqrAttRadius) {\n    float factor = distSqr * invSqrAttRadius;\n    float smoothFactor = clamp(1.0 - factor * factor, 0.0, 1.0);\n    return smoothFactor * smoothFactor;\n  }\n  float GetDistAtt (float distSqr, float invSqrAttRadius) {\n    float attenuation = 1.0 / max(distSqr, 0.01*0.01);\n    attenuation *= SmoothDistAtt(distSqr , invSqrAttRadius);\n    return attenuation;\n  }\n  float GetAngleAtt (vec3 L, vec3 litDir, float litAngleScale, float litAngleOffset) {\n    float cd = dot(litDir, L);\n    float attenuation = clamp(cd * litAngleScale + litAngleOffset, 0.0, 1.0);\n    return (attenuation * attenuation);\n  }\n  #if CC_ENABLE_CLUSTERED_LIGHT_CULLING == 0\n  vec4 CCStandardShadingAdditive (StandardSurface s, vec4 shadowPos) {\n    vec3 position;\n    #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\n    position = unpackHighpData(s.position, s.position_fract_part);\n    #else\n    position = s.position;\n    #endif\n    vec3 diffuse = s.albedo.rgb * (1.0 - s.metallic);\n    vec3 specular = mix(vec3(0.04), s.albedo.rgb, s.metallic);\n    vec3 diffuseContrib = diffuse / PI;\n    vec3 N = normalize(s.normal);\n    vec3 V = normalize(cc_cameraPos.xyz - position);\n    float NV = max(abs(dot(N, V)), 0.0);\n    specular = BRDFApprox(specular, s.roughness, NV);\n    vec3 finalColor = vec3(0.0);\n    int numLights = CC_PIPELINE_TYPE == 0 ? LIGHTS_PER_PASS : int(cc_lightDir[0].w);\n    for (int i = 0; i < LIGHTS_PER_PASS; i++) {\n      if (i >= numLights) break;\n      vec3 SLU = cc_lightPos[i].xyz - position;\n      vec3 SL = normalize(SLU);\n      vec3 SH = normalize(SL + V);\n      float SNL = max(dot(N, SL), 0.0);\n      float SNH = max(dot(N, SH), 0.0);\n      float distSqr = dot(SLU, SLU);\n      float litRadius = cc_lightSizeRangeAngle[i].x;\n      float litRadiusSqr = litRadius * litRadius;\n      float illum = litRadiusSqr / max(litRadiusSqr, distSqr);\n      float attRadiusSqrInv = 1.0 / max(cc_lightSizeRangeAngle[i].y, 0.01);\n      attRadiusSqrInv *= attRadiusSqrInv;\n      float att = GetDistAtt(distSqr, attRadiusSqrInv);\n      vec3 lspec = specular * CalcSpecular(s.roughness, SNH, SH, N);\n      if (cc_lightPos[i].w > 0.0) {\n        float cosInner = max(dot(-cc_lightDir[i].xyz, SL), 0.01);\n        float cosOuter = cc_lightSizeRangeAngle[i].z;\n        float litAngleScale = 1.0 / max(0.001, cosInner - cosOuter);\n        float litAngleOffset = -cosOuter * litAngleScale;\n        att *= GetAngleAtt(SL, -cc_lightDir[i].xyz, litAngleScale, litAngleOffset);\n      }\n      vec3 lightColor = cc_lightColor[i].rgb;\n      float shadow = 1.0;\n      #if CC_RECEIVE_SHADOW\n        if (cc_lightPos[i].w > 0.0 && cc_lightSizeRangeAngle[i].w > 0.0) {\n          shadow = CCSpotShadowFactorBase(shadowPos, position, s.shadowBias);\n        }\n      #endif\n      lightColor *= shadow;\n      finalColor += SNL * lightColor * cc_lightColor[i].w * illum * att * (diffuseContrib + lspec);\n    }\n    return vec4(finalColor, 0.0);\n  }\n  #endif\n  #if CC_ENABLE_CLUSTERED_LIGHT_CULLING == 1\n  layout(set = 1, binding = 7) readonly buffer b_ccLightsBuffer { vec4 b_ccLights[]; };\n  layout(set = 1, binding = 8) readonly buffer b_clusterLightIndicesBuffer { uint b_clusterLightIndices[]; };\n  layout(set = 1, binding = 9) readonly buffer b_clusterLightGridBuffer { uvec4 b_clusterLightGrid[]; };\n  struct CCLight\n  {\n    vec4 cc_lightPos;\n    vec4 cc_lightColor;\n    vec4 cc_lightSizeRangeAngle;\n    vec4 cc_lightDir;\n  };\n  struct Cluster\n  {\n    vec3 minBounds;\n    vec3 maxBounds;\n  };\n  struct LightGrid\n  {\n    uint offset;\n    uint ccLights;\n  };\n  CCLight getCCLight(uint i)\n  {\n    CCLight light;\n    light.cc_lightPos = b_ccLights[4u * i + 0u];\n    light.cc_lightColor = b_ccLights[4u * i + 1u];\n    light.cc_lightSizeRangeAngle = b_ccLights[4u * i + 2u];\n    light.cc_lightDir = b_ccLights[4u * i + 3u];\n    return light;\n  }\n  LightGrid getLightGrid(uint cluster)\n  {\n    uvec4 gridvec = b_clusterLightGrid[cluster];\n    LightGrid grid;\n    grid.offset = gridvec.x;\n    grid.ccLights = gridvec.y;\n    return grid;\n  }\n  uint getGridLightIndex(uint start, uint offset)\n  {\n    return b_clusterLightIndices[start + offset];\n  }\n  uint getClusterZIndex(vec4 worldPos)\n  {\n    float scale = float(24) / log(cc_nearFar.y / cc_nearFar.x);\n    float bias = -(float(24) * log(cc_nearFar.x) / log(cc_nearFar.y / cc_nearFar.x));\n    float eyeDepth = -(cc_matView * worldPos).z;\n    uint zIndex = uint(max(log(eyeDepth) * scale + bias, 0.0));\n    return zIndex;\n  }\n  uint getClusterIndex(vec4 fragCoord, vec4 worldPos)\n  {\n    uint zIndex = getClusterZIndex(worldPos);\n    float clusterSizeX = ceil(cc_viewPort.z / float(16));\n    float clusterSizeY = ceil(cc_viewPort.w / float(8));\n    uvec3 indices = uvec3(uvec2(fragCoord.xy / vec2(clusterSizeX, clusterSizeY)), zIndex);\n    uint cluster = (16u * 8u) * indices.z + 16u * indices.y + indices.x;\n    return cluster;\n  }\n  vec4 CCClusterShadingAdditive (StandardSurface s, vec4 shadowPos) {\n    vec3 diffuse = s.albedo.rgb * (1.0 - s.metallic);\n    vec3 specular = mix(vec3(0.04), s.albedo.rgb, s.metallic);\n    vec3 diffuseContrib = diffuse / PI;\n    vec3 position;\n    #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\n    position = unpackHighpData(s.position, s.position_fract_part);\n    #else\n    position = s.position;\n    #endif\n    vec3 N = normalize(s.normal);\n    vec3 V = normalize(cc_cameraPos.xyz - position);\n    float NV = max(abs(dot(N, V)), 0.001);\n    specular = BRDFApprox(specular, s.roughness, NV);\n    vec3 finalColor = vec3(0.0);\n    uint cluster = getClusterIndex(gl_FragCoord, vec4(position, 1.0));\n    LightGrid grid = getLightGrid(cluster);\n    uint numLights = grid.ccLights;\n    for (uint i = 0u; i < 100u; i++) {\n      if (i >= numLights) break;\n      uint lightIndex = getGridLightIndex(grid.offset, i);\n      CCLight light = getCCLight(lightIndex);\n      vec3 SLU = light.cc_lightPos.xyz - position;\n      vec3 SL = normalize(SLU);\n      vec3 SH = normalize(SL + V);\n      float SNL = max(dot(N, SL), 0.001);\n      float SNH = max(dot(N, SH), 0.0);\n      float distSqr = dot(SLU, SLU);\n      float litRadius = light.cc_lightSizeRangeAngle.x;\n      float litRadiusSqr = litRadius * litRadius;\n      float illum = PI * (litRadiusSqr / max(litRadiusSqr , distSqr));\n      float attRadiusSqrInv = 1.0 / max(light.cc_lightSizeRangeAngle.y, 0.01);\n      attRadiusSqrInv *= attRadiusSqrInv;\n      float att = GetDistAtt(distSqr, attRadiusSqrInv);\n      vec3 lspec = specular * CalcSpecular(s.roughness, SNH, SH, N);\n      if (light.cc_lightPos.w > 0.0) {\n        float cosInner = max(dot(-light.cc_lightDir.xyz, SL), 0.01);\n        float cosOuter = light.cc_lightSizeRangeAngle.z;\n        float litAngleScale = 1.0 / max(0.001, cosInner - cosOuter);\n        float litAngleOffset = -cosOuter * litAngleScale;\n        att *= GetAngleAtt(SL, -light.cc_lightDir.xyz, litAngleScale, litAngleOffset);\n      }\n      vec3 lightColor = light.cc_lightColor.rgb;\n      float shadow = 1.0;\n      #if CC_RECEIVE_SHADOW\n        if (light.cc_lightPos.w > 0.0) {\n          shadow = CCSpotShadowFactorBase(shadowPos, position, s.shadowBias);\n        }\n      #endif\n      lightColor *= shadow;\n      finalColor += SNL * lightColor * light.cc_lightColor.w * illum * att * (diffuseContrib + lspec);\n    }\n    return vec4(finalColor, 0.0);\n  }\n  #endif\n  layout(location = 0) out vec4 fragColorX;\n  void main () {\n    StandardSurface s; surf(s);\n    #if CC_ENABLE_CLUSTERED_LIGHT_CULLING == 1\n    vec4 color = CCClusterShadingAdditive(s, v_shadowPos);\n    #else\n    vec4 color = CCStandardShadingAdditive(s, v_shadowPos);\n    #endif\n    fragColorX = CCFragOutput(color);\n  }\n#elif (CC_PIPELINE_TYPE == 0 || CC_FORCE_FORWARD_SHADING)\n  layout(location = 0) out vec4 fragColorX;\n  void main () {\n    StandardSurface s; surf(s);\n    vec4 color = CCStandardShadingBase(s, v_shadowPos);\n    CC_APPLY_FOG(color, s.position.xyz);\n    fragColorX = CCFragOutput(color);\n  }\n#elif CC_PIPELINE_TYPE == 1\n  vec2 signNotZero(vec2 v) {\n    return vec2((v.x >= 0.0) ? +1.0 : -1.0, (v.y >= 0.0) ? +1.0 : -1.0);\n  }\n  vec2 float32x3_to_oct(in vec3 v) {\n    vec2 p = v.xy * (1.0 / (abs(v.x) + abs(v.y) + abs(v.z)));\n    return (v.z <= 0.0) ? ((1.0 - abs(p.yx)) * signNotZero(p)) : p;\n  }\n  layout(location = 0) out vec4 fragColor0;\n  layout(location = 1) out vec4 fragColor1;\n  layout(location = 2) out vec4 fragColor2;\n  void main () {\n    StandardSurface s; surf(s);\n    fragColor0 = s.albedo;\n    fragColor1 = vec4(float32x3_to_oct(s.normal), s.roughness, s.metallic);\n    fragColor2 = vec4(s.emissive, s.occlusion);\n  }\n#endif"},"glsl3":{"vert":"\nprecision highp float;\n#define QUATER_PI         0.78539816340\n#define HALF_PI           1.57079632679\n#define PI                3.14159265359\n#define PI2               6.28318530718\n#define PI4               12.5663706144\n#define INV_QUATER_PI     1.27323954474\n#define INV_HALF_PI       0.63661977237\n#define INV_PI            0.31830988618\n#define INV_PI2           0.15915494309\n#define INV_PI4           0.07957747155\n#define EPSILON           1e-6\n#define EPSILON_LOWP      1e-4\n#define LOG2              1.442695\n#define EXP_VALUE         2.71828183f\n#define FP_MAX            65504.0\n#define FP_SCALE          0.0009765625\n#define FP_SCALE_INV      1024.0\n#define GRAY_VECTOR       vec3(0.299, 0.587, 0.114)\nhighp float decode32 (highp vec4 rgba) {\n  rgba = rgba * 255.0;\n  highp float Sign = 1.0 - (step(128.0, (rgba[3]) + 0.5)) * 2.0;\n  highp float Exponent = 2.0 * (mod(float(int((rgba[3]) + 0.5)), 128.0)) + (step(128.0, (rgba[2]) + 0.5)) - 127.0;\n  highp float Mantissa = (mod(float(int((rgba[2]) + 0.5)), 128.0)) * 65536.0 + rgba[1] * 256.0 + rgba[0] + 8388608.0;\n  return Sign * exp2(Exponent - 23.0) * Mantissa;\n}\nstruct StandardVertInput {\n  highp vec4 position;\n  vec3 normal;\n  vec4 tangent;\n};\nin vec3 a_position;\nin vec3 a_normal;\nin vec2 a_texCoord;\nin vec4 a_tangent;\n#if CC_USE_SKINNING\n    in vec4 a_joints;\n  in vec4 a_weights;\n#endif\n#if USE_INSTANCING\n  #if CC_USE_BAKED_ANIMATION\n    in highp vec4 a_jointAnimInfo;\n  #endif\n  in vec4 a_matWorld0;\n  in vec4 a_matWorld1;\n  in vec4 a_matWorld2;\n  #if CC_USE_LIGHTMAP\n    in vec4 a_lightingMapUVParam;\n  #endif\n  #if CC_RECEIVE_SHADOW\n    in vec2 a_localShadowBias;\n  #endif\n#elif USE_BATCHING\n  in float a_dyn_batch_id;\n#endif\n#if CC_USE_MORPH\n    in float a_vertexId;\n    int getVertexId() {\n      return int(a_vertexId);\n    }\n#endif\n#if CC_USE_MORPH\n  layout(std140) uniform CCMorph {\n    vec4 cc_displacementWeights[15];\n    vec4 cc_displacementTextureInfo;\n  };\n  vec2 getPixelLocation(vec2 textureResolution, int pixelIndex) {\n    float pixelIndexF = float(pixelIndex);\n    float x = mod(pixelIndexF, textureResolution.x);\n    float y = floor(pixelIndexF / textureResolution.x);\n    return vec2(x, y);\n  }\n  vec2 getPixelCoordFromLocation(vec2 location, vec2 textureResolution) {\n    return (vec2(location.x, location.y) + .5) / textureResolution;\n  }\n  #if CC_DEVICE_SUPPORT_FLOAT_TEXTURE\n      vec4 fetchVec3ArrayFromTexture(sampler2D tex, int pixelIndex) {\n        ivec2 texSize = textureSize(tex, 0);\n        return texelFetch(tex, ivec2(pixelIndex % texSize.x, pixelIndex / texSize.x), 0);\n      }\n  #else\n    vec4 fetchVec3ArrayFromTexture(sampler2D tex, int elementIndex) {\n      int pixelIndex = elementIndex * 4;\n      vec2 location = getPixelLocation(cc_displacementTextureInfo.xy, pixelIndex);\n      vec2 x = getPixelCoordFromLocation(location + vec2(0.0, 0.0), cc_displacementTextureInfo.xy);\n      vec2 y = getPixelCoordFromLocation(location + vec2(1.0, 0.0), cc_displacementTextureInfo.xy);\n      vec2 z = getPixelCoordFromLocation(location + vec2(2.0, 0.0), cc_displacementTextureInfo.xy);\n      return vec4(\n        decode32(texture(tex, x)),\n        decode32(texture(tex, y)),\n        decode32(texture(tex, z)),\n        1.0\n      );\n    }\n  #endif\n  float getDisplacementWeight(int index) {\n    int quot = index / 4;\n    int remainder = index - quot * 4;\n    if (remainder == 0) {\n      return cc_displacementWeights[quot].x;\n    } else if (remainder == 1) {\n      return cc_displacementWeights[quot].y;\n    } else if (remainder == 2) {\n      return cc_displacementWeights[quot].z;\n    } else {\n      return cc_displacementWeights[quot].w;\n    }\n  }\n  vec3 getVec3DisplacementFromTexture(sampler2D tex, int vertexIndex) {\n  #if CC_MORPH_PRECOMPUTED\n    return fetchVec3ArrayFromTexture(tex, vertexIndex).rgb;\n  #else\n    vec3 result = vec3(0, 0, 0);\n    int nVertices = int(cc_displacementTextureInfo.z);\n    for (int iTarget = 0; iTarget < CC_MORPH_TARGET_COUNT; ++iTarget) {\n      result += (fetchVec3ArrayFromTexture(tex, nVertices * iTarget + vertexIndex).rgb * getDisplacementWeight(iTarget));\n    }\n    return result;\n  #endif\n  }\n  #if CC_MORPH_TARGET_HAS_POSITION\n    uniform sampler2D cc_PositionDisplacements;\n    vec3 getPositionDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_PositionDisplacements, vertexId);\n    }\n  #endif\n  #if CC_MORPH_TARGET_HAS_NORMAL\n    uniform sampler2D cc_NormalDisplacements;\n    vec3 getNormalDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_NormalDisplacements, vertexId);\n    }\n  #endif\n  #if CC_MORPH_TARGET_HAS_TANGENT\n    uniform sampler2D cc_TangentDisplacements;\n    vec3 getTangentDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_TangentDisplacements, vertexId);\n    }\n  #endif\n  void applyMorph (inout vec4 position, inout vec3 normal, inout vec4 tangent) {\n    int vertexId = getVertexId();\n  #if CC_MORPH_TARGET_HAS_POSITION\n    position.xyz = position.xyz + getPositionDisplacement(vertexId);\n  #endif\n  #if CC_MORPH_TARGET_HAS_NORMAL\n    normal.xyz = normal.xyz + getNormalDisplacement(vertexId);\n  #endif\n  #if CC_MORPH_TARGET_HAS_TANGENT\n    tangent.xyz = tangent.xyz + getTangentDisplacement(vertexId);\n  #endif\n  }\n  void applyMorph (inout vec4 position) {\n  #if CC_MORPH_TARGET_HAS_POSITION\n    position.xyz = position.xyz + getPositionDisplacement(getVertexId());\n  #endif\n  }\n#endif\n#if CC_USE_SKINNING\n  #if CC_USE_BAKED_ANIMATION\n    layout(std140) uniform CCSkinningTexture {\n      highp vec4 cc_jointTextureInfo;\n    };\n    layout(std140) uniform CCSkinningAnimation {\n      highp vec4 cc_jointAnimInfo;\n    };\n    uniform highp sampler2D cc_jointTexture;\n    void CCGetJointTextureCoords(float pixelsPerJoint, float jointIdx, out highp float x, out highp float y, out highp float invSize)\n    {\n      #if USE_INSTANCING\n        highp float temp = pixelsPerJoint * (a_jointAnimInfo.x * a_jointAnimInfo.y + jointIdx) + a_jointAnimInfo.z;\n      #else\n        highp float temp = pixelsPerJoint * (cc_jointAnimInfo.x * cc_jointTextureInfo.y + jointIdx) + cc_jointTextureInfo.z;\n      #endif\n      invSize = cc_jointTextureInfo.w;\n      highp float tempY = floor(temp * invSize);\n      x = floor(temp - tempY * cc_jointTextureInfo.x);\n      y = (tempY + 0.5) * invSize;\n    }\n  #else\n    layout(std140) uniform CCSkinning {\n      highp vec4 cc_joints[30 * 3];\n    };\n  #endif\n  #if CC_USE_BAKED_ANIMATION\n    #if CC_DEVICE_SUPPORT_FLOAT_TEXTURE\n      mat4 getJointMatrix (float i) {\n        highp float x, y, invSize;\n        CCGetJointTextureCoords(3.0, i, x, y, invSize);\n        vec4 v1 = texture(cc_jointTexture, vec2((x + 0.5) * invSize, y));\n        vec4 v2 = texture(cc_jointTexture, vec2((x + 1.5) * invSize, y));\n        vec4 v3 = texture(cc_jointTexture, vec2((x + 2.5) * invSize, y));\n        return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n      }\n    #else\n      mat4 getJointMatrix (float i) {\n        highp float x, y, invSize;\n        CCGetJointTextureCoords(12.0, i, x, y, invSize);\n        vec4 v1 = vec4(\n          decode32(texture(cc_jointTexture, vec2((x + 0.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 1.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 2.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 3.5) * invSize, y)))\n        );\n        vec4 v2 = vec4(\n          decode32(texture(cc_jointTexture, vec2((x + 4.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 5.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 6.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 7.5) * invSize, y)))\n        );\n        vec4 v3 = vec4(\n          decode32(texture(cc_jointTexture, vec2((x + 8.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 9.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 10.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 11.5) * invSize, y)))\n        );\n        return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n      }\n    #endif\n  #else\n    mat4 getJointMatrix (float i) {\n      int idx = int(i);\n      vec4 v1 = cc_joints[idx * 3];\n      vec4 v2 = cc_joints[idx * 3 + 1];\n      vec4 v3 = cc_joints[idx * 3 + 2];\n      return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n    }\n  #endif\n  mat4 skinMatrix () {\n    vec4 joints = vec4(a_joints);\n    return getJointMatrix(joints.x) * a_weights.x\n         + getJointMatrix(joints.y) * a_weights.y\n         + getJointMatrix(joints.z) * a_weights.z\n         + getJointMatrix(joints.w) * a_weights.w;\n  }\n  void CCSkin (inout vec4 position) {\n    mat4 m = skinMatrix();\n    position = m * position;\n  }\n  void CCSkin (inout vec4 position, inout vec3 normal, inout vec4 tangent) {\n    mat4 m = skinMatrix();\n    position = m * position;\n    normal = (m * vec4(normal, 0.0)).xyz;\n    tangent.xyz = (m * vec4(tangent.xyz, 0.0)).xyz;\n  }\n#endif\nvoid CCVertInput(inout StandardVertInput In)\n{\n    In.position = vec4(a_position, 1.0);\n    In.normal = a_normal;\n    In.tangent = a_tangent;\n  #if CC_USE_MORPH\n    applyMorph(In.position, In.normal, In.tangent);\n  #endif\n  #if CC_USE_SKINNING\n    CCSkin(In.position, In.normal, In.tangent);\n  #endif\n}\nlayout(std140) uniform CCGlobal {\n  highp   vec4 cc_time;\n  mediump vec4 cc_screenSize;\n  mediump vec4 cc_nativeSize;\n};\nlayout(std140) uniform CCCamera {\n  highp   mat4 cc_matView;\n  highp   mat4 cc_matViewInv;\n  highp   mat4 cc_matProj;\n  highp   mat4 cc_matProjInv;\n  highp   mat4 cc_matViewProj;\n  highp   mat4 cc_matViewProjInv;\n  highp   vec4 cc_cameraPos;\n  mediump vec4 cc_screenScale;\n  mediump vec4 cc_exposure;\n  mediump vec4 cc_mainLitDir;\n  mediump vec4 cc_mainLitColor;\n  mediump vec4 cc_ambientSky;\n  mediump vec4 cc_ambientGround;\n  mediump vec4 cc_fogColor;\n  mediump vec4 cc_fogBase;\n  mediump vec4 cc_fogAdd;\n  mediump vec4 cc_nearFar;\n  mediump vec4 cc_viewPort;\n};\n#if !USE_INSTANCING\n  #if USE_BATCHING\n    layout(std140) uniform CCLocalBatched {\n      highp mat4 cc_matWorlds[10];\n    };\n  #else\n    layout(std140) uniform CCLocal {\n      highp mat4 cc_matWorld;\n      highp mat4 cc_matWorldIT;\n      highp vec4 cc_lightingMapUVParam;\n      highp vec4 cc_localShadowBias;\n    };\n  #endif\n#endif\nvoid CCGetWorldMatrixFull(out mat4 matWorld, out mat4 matWorldIT)\n{\n  #if USE_INSTANCING\n    matWorld = mat4(\n      vec4(a_matWorld0.xyz, 0.0),\n      vec4(a_matWorld1.xyz, 0.0),\n      vec4(a_matWorld2.xyz, 0.0),\n      vec4(a_matWorld0.w, a_matWorld1.w, a_matWorld2.w, 1.0)\n    );\n    matWorldIT = matWorld;\n  #elif USE_BATCHING\n    matWorld = cc_matWorlds[int(a_dyn_batch_id)];\n    matWorldIT = matWorld;\n  #else\n    matWorld = cc_matWorld;\n    matWorldIT = cc_matWorldIT;\n  #endif\n}\nlayout(std140) uniform Constants {\n  vec4 tilingOffset;\n  vec4 albedo;\n  vec4 albedoScaleAndCutoff;\n  vec4 pbrParams;\n  vec4 emissive;\n  vec4 emissiveScaleParam;\n};\nfloat LinearFog(vec4 pos) {\n  vec4 wPos = pos;\n  float cam_dis = distance(cc_cameraPos, wPos);\n  float fogStart = cc_fogBase.x;\n  float fogEnd = cc_fogBase.y;\n  return clamp((fogEnd - cam_dis) / (fogEnd - fogStart), 0., 1.);\n}\nfloat ExpFog(vec4 pos) {\n  vec4 wPos = pos;\n  float fogAtten = cc_fogAdd.z;\n  float fogStart = cc_fogBase.x;\n  float fogDensity = cc_fogBase.z;\n  float cam_dis = max(distance(cc_cameraPos, wPos) - fogStart, 0.0) / fogAtten * 4.;\n  float f = exp(-cam_dis * fogDensity);\n  return f;\n}\nfloat ExpSquaredFog(vec4 pos) {\n  vec4 wPos = pos;\n  float fogAtten = cc_fogAdd.z;\n  float fogStart = cc_fogBase.x;\n  float fogDensity = cc_fogBase.z;\n  float cam_dis = max(distance(cc_cameraPos, wPos) - fogStart, 0.0) / fogAtten * 4.;\n  float f = exp(-cam_dis * cam_dis * fogDensity * fogDensity);\n  return f;\n}\nfloat LayeredFog(vec4 pos) {\n  vec4 wPos = pos;\n  float fogAtten = cc_fogAdd.z;\n  float _FogTop = cc_fogAdd.x;\n  float _FogRange = cc_fogAdd.y;\n  vec3 camWorldProj = cc_cameraPos.xyz;\n  camWorldProj.y = 0.;\n  vec3 worldPosProj = wPos.xyz;\n  worldPosProj.y = 0.;\n  float fDeltaD = distance(worldPosProj, camWorldProj) / fogAtten * 2.0;\n  float fDeltaY, fDensityIntegral;\n  if (cc_cameraPos.y > _FogTop) {\n    if (wPos.y < _FogTop) {\n      fDeltaY = (_FogTop - wPos.y) / _FogRange * 2.0;\n      fDensityIntegral = fDeltaY * fDeltaY * 0.5;\n    } else {\n      fDeltaY = 0.;\n      fDensityIntegral = 0.;\n    }\n  } else {\n    if (wPos.y < _FogTop) {\n      float fDeltaA = (_FogTop - cc_cameraPos.y) / _FogRange * 2.;\n      float fDeltaB = (_FogTop - wPos.y) / _FogRange * 2.;\n      fDeltaY = abs(fDeltaA - fDeltaB);\n      fDensityIntegral = abs((fDeltaA * fDeltaA * 0.5) - (fDeltaB * fDeltaB * 0.5));\n    } else {\n      fDeltaY = abs(_FogTop - cc_cameraPos.y) / _FogRange * 2.;\n      fDensityIntegral = abs(fDeltaY * fDeltaY * 0.5);\n    }\n  }\n  float fDensity;\n  if (fDeltaY != 0.) {\n    fDensity = (sqrt(1.0 + ((fDeltaD / fDeltaY) * (fDeltaD / fDeltaY)))) * fDensityIntegral;\n  } else {\n    fDensity = 0.;\n  }\n  float f = exp(-fDensity);\n  return f;\n}\nvoid CC_TRANSFER_FOG_BASE(vec4 pos, out float factor)\n{\n  #if CC_USE_FOG == 0\n\tfactor = LinearFog(pos);\n  #elif CC_USE_FOG == 1\n    factor = ExpFog(pos);\n  #elif CC_USE_FOG == 2\n    factor = ExpSquaredFog(pos);\n  #elif CC_USE_FOG == 3\n    factor = LayeredFog(pos);\n  #else\n    factor = 1.0;\n  #endif\n}\n#if !CC_USE_ACCURATE_FOG\nout float v_fog_factor;\n#endif\nvoid CC_TRANSFER_FOG(vec4 pos) {\n#if !CC_USE_ACCURATE_FOG\n    CC_TRANSFER_FOG_BASE(pos, v_fog_factor);\n#endif\n}\nout highp vec4 v_shadowPos;\nlayout(std140) uniform CCShadow {\n  highp mat4 cc_matLightPlaneProj;\n  highp mat4 cc_matLightView;\n  highp mat4 cc_matLightViewProj;\n  highp vec4 cc_shadowInvProjDepthInfo;\n  highp vec4 cc_shadowProjDepthInfo;\n  highp vec4 cc_shadowProjInfo;\n  mediump vec4 cc_shadowNFLSInfo;\n  mediump vec4 cc_shadowWHPBInfo;\n  mediump vec4 cc_shadowLPNNInfo;\n  lowp vec4 cc_shadowColor;\n  mediump vec4 cc_planarNDInfo;\n};\n#if CC_RECEIVE_SHADOW\n  uniform highp sampler2D cc_shadowMap;\n  uniform highp sampler2D cc_spotLightingMap;\n#endif\n#if CC_RECEIVE_SHADOW\n#endif\n#if USE_VERTEX_COLOR\n  in vec4 a_color;\n  out vec4 v_color;\n#endif\nout vec3 v_position;\nout vec3 v_normal;\nout vec2 v_uv;\nout vec2 v_uv1;\n#if USE_NORMAL_MAP\n  out vec3 v_tangent;\n  out vec3 v_bitangent;\n#endif\n#if HAS_SECOND_UV || CC_USE_LIGHTMAP\n  in vec2 a_texCoord1;\n#endif\n#if CC_USE_LIGHTMAP && !USE_BATCHING && !CC_FORWARD_ADD\n  out vec3 v_luv;\n  void CCLightingMapCaclUV()\n  {\n  #if !USE_INSTANCING\n    v_luv.xy = cc_lightingMapUVParam.xy + a_texCoord1 * cc_lightingMapUVParam.z;\n    v_luv.z = cc_lightingMapUVParam.w;\n  #else\n    v_luv.xy = a_lightingMapUVParam.xy + a_texCoord1 * a_lightingMapUVParam.z;\n    v_luv.z = a_lightingMapUVParam.w;\n  #endif\n  }\n#endif\nvoid main () {\n  StandardVertInput In;\n  CCVertInput(In);\n  mat4 matWorld, matWorldIT;\n  CCGetWorldMatrixFull(matWorld, matWorldIT);\n  vec4 pos = matWorld * In.position;\n  v_position = pos.xyz;\n  v_normal = normalize((matWorldIT * vec4(In.normal, 0.0)).xyz);\n  #if USE_NORMAL_MAP\n    v_tangent = normalize((matWorld * vec4(In.tangent.xyz, 0.0)).xyz);\n    v_bitangent = cross(v_normal, v_tangent) * In.tangent.w;\n  #endif\n  v_uv = a_texCoord * tilingOffset.xy + tilingOffset.zw;\n  #if SAMPLE_FROM_RT\n    v_uv = cc_cameraPos.w > 1.0 ? vec2(v_uv.x, 1.0 - v_uv.y) : v_uv;\n  #endif\n  #if HAS_SECOND_UV\n    v_uv1 = a_texCoord1 * tilingOffset.xy + tilingOffset.zw;\n    #if SAMPLE_FROM_RT\n      v_uv1 = cc_cameraPos.w > 1.0 ? vec2(v_uv1.x, 1.0 - v_uv1.y) : v_uv1;\n    #endif\n  #endif\n  #if USE_VERTEX_COLOR\n    v_color = a_color;\n  #endif\n  CC_TRANSFER_FOG(pos);\n  v_shadowPos = cc_matLightViewProj * pos;\n  #if CC_USE_LIGHTMAP && !USE_BATCHING && !CC_FORWARD_ADD\n    CCLightingMapCaclUV();\n  #endif\n  gl_Position = cc_matProj * (cc_matView * matWorld) * In.position;\n}","frag":"\nprecision highp float;\nlayout(std140) uniform CCGlobal {\n  highp   vec4 cc_time;\n  mediump vec4 cc_screenSize;\n  mediump vec4 cc_nativeSize;\n};\nlayout(std140) uniform CCCamera {\n  highp   mat4 cc_matView;\n  highp   mat4 cc_matViewInv;\n  highp   mat4 cc_matProj;\n  highp   mat4 cc_matProjInv;\n  highp   mat4 cc_matViewProj;\n  highp   mat4 cc_matViewProjInv;\n  highp   vec4 cc_cameraPos;\n  mediump vec4 cc_screenScale;\n  mediump vec4 cc_exposure;\n  mediump vec4 cc_mainLitDir;\n  mediump vec4 cc_mainLitColor;\n  mediump vec4 cc_ambientSky;\n  mediump vec4 cc_ambientGround;\n  mediump vec4 cc_fogColor;\n  mediump vec4 cc_fogBase;\n  mediump vec4 cc_fogAdd;\n  mediump vec4 cc_nearFar;\n  mediump vec4 cc_viewPort;\n};\nlayout(std140) uniform Constants {\n  vec4 tilingOffset;\n  vec4 albedo;\n  vec4 albedoScaleAndCutoff;\n  vec4 pbrParams;\n  vec4 emissive;\n  vec4 emissiveScaleParam;\n};\nfloat LinearFog(vec4 pos) {\n  vec4 wPos = pos;\n  float cam_dis = distance(cc_cameraPos, wPos);\n  float fogStart = cc_fogBase.x;\n  float fogEnd = cc_fogBase.y;\n  return clamp((fogEnd - cam_dis) / (fogEnd - fogStart), 0., 1.);\n}\nfloat ExpFog(vec4 pos) {\n  vec4 wPos = pos;\n  float fogAtten = cc_fogAdd.z;\n  float fogStart = cc_fogBase.x;\n  float fogDensity = cc_fogBase.z;\n  float cam_dis = max(distance(cc_cameraPos, wPos) - fogStart, 0.0) / fogAtten * 4.;\n  float f = exp(-cam_dis * fogDensity);\n  return f;\n}\nfloat ExpSquaredFog(vec4 pos) {\n  vec4 wPos = pos;\n  float fogAtten = cc_fogAdd.z;\n  float fogStart = cc_fogBase.x;\n  float fogDensity = cc_fogBase.z;\n  float cam_dis = max(distance(cc_cameraPos, wPos) - fogStart, 0.0) / fogAtten * 4.;\n  float f = exp(-cam_dis * cam_dis * fogDensity * fogDensity);\n  return f;\n}\nfloat LayeredFog(vec4 pos) {\n  vec4 wPos = pos;\n  float fogAtten = cc_fogAdd.z;\n  float _FogTop = cc_fogAdd.x;\n  float _FogRange = cc_fogAdd.y;\n  vec3 camWorldProj = cc_cameraPos.xyz;\n  camWorldProj.y = 0.;\n  vec3 worldPosProj = wPos.xyz;\n  worldPosProj.y = 0.;\n  float fDeltaD = distance(worldPosProj, camWorldProj) / fogAtten * 2.0;\n  float fDeltaY, fDensityIntegral;\n  if (cc_cameraPos.y > _FogTop) {\n    if (wPos.y < _FogTop) {\n      fDeltaY = (_FogTop - wPos.y) / _FogRange * 2.0;\n      fDensityIntegral = fDeltaY * fDeltaY * 0.5;\n    } else {\n      fDeltaY = 0.;\n      fDensityIntegral = 0.;\n    }\n  } else {\n    if (wPos.y < _FogTop) {\n      float fDeltaA = (_FogTop - cc_cameraPos.y) / _FogRange * 2.;\n      float fDeltaB = (_FogTop - wPos.y) / _FogRange * 2.;\n      fDeltaY = abs(fDeltaA - fDeltaB);\n      fDensityIntegral = abs((fDeltaA * fDeltaA * 0.5) - (fDeltaB * fDeltaB * 0.5));\n    } else {\n      fDeltaY = abs(_FogTop - cc_cameraPos.y) / _FogRange * 2.;\n      fDensityIntegral = abs(fDeltaY * fDeltaY * 0.5);\n    }\n  }\n  float fDensity;\n  if (fDeltaY != 0.) {\n    fDensity = (sqrt(1.0 + ((fDeltaD / fDeltaY) * (fDeltaD / fDeltaY)))) * fDensityIntegral;\n  } else {\n    fDensity = 0.;\n  }\n  float f = exp(-fDensity);\n  return f;\n}\nvoid CC_TRANSFER_FOG_BASE(vec4 pos, out float factor)\n{\n  #if CC_USE_FOG == 0\n\tfactor = LinearFog(pos);\n  #elif CC_USE_FOG == 1\n    factor = ExpFog(pos);\n  #elif CC_USE_FOG == 2\n    factor = ExpSquaredFog(pos);\n  #elif CC_USE_FOG == 3\n    factor = LayeredFog(pos);\n  #else\n    factor = 1.0;\n  #endif\n}\nvoid CC_APPLY_FOG_BASE(inout vec4 color, float factor) {\n  color = vec4(mix(cc_fogColor.rgb, color.rgb, factor), color.a);\n}\n#if !CC_USE_ACCURATE_FOG\nin float v_fog_factor;\n#endif\nvoid CC_APPLY_FOG(inout vec4 color) {\n#if !CC_USE_ACCURATE_FOG\n    CC_APPLY_FOG_BASE(color, v_fog_factor);\n#endif\n}\nvoid CC_APPLY_FOG(inout vec4 color, vec3 worldPos) {\n#if CC_USE_ACCURATE_FOG\n    float factor;\n    CC_TRANSFER_FOG_BASE(vec4(worldPos, 1.0), factor);\n#else\n    float factor = v_fog_factor;\n#endif\n    CC_APPLY_FOG_BASE(color, factor);\n}\n#define QUATER_PI         0.78539816340\n#define HALF_PI           1.57079632679\n#define PI                3.14159265359\n#define PI2               6.28318530718\n#define PI4               12.5663706144\n#define INV_QUATER_PI     1.27323954474\n#define INV_HALF_PI       0.63661977237\n#define INV_PI            0.31830988618\n#define INV_PI2           0.15915494309\n#define INV_PI4           0.07957747155\n#define EPSILON           1e-6\n#define EPSILON_LOWP      1e-4\n#define LOG2              1.442695\n#define EXP_VALUE         2.71828183f\n#define FP_MAX            65504.0\n#define FP_SCALE          0.0009765625\n#define FP_SCALE_INV      1024.0\n#define GRAY_VECTOR       vec3(0.299, 0.587, 0.114)\nvec3 SRGBToLinear (vec3 gamma) {\n  return gamma * gamma;\n}\nlayout(std140) uniform CCShadow {\n  highp mat4 cc_matLightPlaneProj;\n  highp mat4 cc_matLightView;\n  highp mat4 cc_matLightViewProj;\n  highp vec4 cc_shadowInvProjDepthInfo;\n  highp vec4 cc_shadowProjDepthInfo;\n  highp vec4 cc_shadowProjInfo;\n  mediump vec4 cc_shadowNFLSInfo;\n  mediump vec4 cc_shadowWHPBInfo;\n  mediump vec4 cc_shadowLPNNInfo;\n  lowp vec4 cc_shadowColor;\n  mediump vec4 cc_planarNDInfo;\n};\nhighp float unpackHighpData (float mainPart, float modPart) {\n  highp float data = mainPart;\n  return data + modPart;\n}\nhighp float unpackHighpData (float mainPart, float modPart, const float modValue) {\n  highp float data = mainPart * modValue;\n  return data + modPart * modValue;\n}\nhighp vec2 unpackHighpData (vec2 mainPart, vec2 modPart) {\n  highp vec2 data = mainPart;\n  return data + modPart;\n}\nhighp vec2 unpackHighpData (vec2 mainPart, vec2 modPart, const float modValue) {\n  highp vec2 data = mainPart * modValue;\n  return data + modPart * modValue;\n}\nhighp vec3 unpackHighpData (vec3 mainPart, vec3 modPart) {\n  highp vec3 data = mainPart;\n  return data + modPart;\n}\nhighp vec3 unpackHighpData (vec3 mainPart, vec3 modPart, const float modValue) {\n  highp vec3 data = mainPart * modValue;\n  return data + modPart * modValue;\n}\nhighp vec4 unpackHighpData (vec4 mainPart, vec4 modPart) {\n  highp vec4 data = mainPart;\n  return data + modPart;\n}\nhighp vec4 unpackHighpData (vec4 mainPart, vec4 modPart, const float modValue) {\n  highp vec4 data = mainPart * modValue;\n  return data + modPart * modValue;\n}\nlayout(std140) uniform CCLocal {\n  highp mat4 cc_matWorld;\n  highp mat4 cc_matWorldIT;\n  highp vec4 cc_lightingMapUVParam;\n  highp vec4 cc_localShadowBias;\n};\nfloat CCGetLinearDepthFromViewSpace(vec3 viewPos) {\n  float dist = length(viewPos);\n  return (dist - cc_shadowNFLSInfo.x) / (cc_shadowNFLSInfo.y - cc_shadowNFLSInfo.x);\n}\nfloat CCGetLinearDepth(vec3 worldPos) {\n  vec4 viewStartPos = cc_matLightView * vec4(worldPos.xyz, 1.0);\n  return CCGetLinearDepthFromViewSpace(viewStartPos.xyz);\n}\n#if CC_RECEIVE_SHADOW\n  uniform highp sampler2D cc_shadowMap;\n  uniform highp sampler2D cc_spotLightingMap;\n  vec4 ApplyShadowDepthBias_FaceNormal(vec4 shadowPos, vec3 worldNormal, float normalBias)\n  {\n    vec4 newShadowPos = shadowPos;\n    if(normalBias > EPSILON_LOWP)\n    {\n      vec4 viewNormal = cc_matLightView * vec4(worldNormal, 0.0);\n      if(viewNormal.z < 0.1)\n        newShadowPos.xy += viewNormal.xy * cc_shadowProjInfo.xy * normalBias * clamp(viewNormal.z, 0.001, 0.1);\n    }\n    return newShadowPos;\n  }\n  vec4 ApplyShadowDepthBias_Perspective(vec4 shadowPos, float viewspaceDepthBias)\n  {\n    vec3 viewSpacePos;\n    viewSpacePos.xy = shadowPos.xy * cc_shadowProjInfo.zw;\n    viewSpacePos.z = shadowPos.z * cc_shadowInvProjDepthInfo.x + shadowPos.w * cc_shadowInvProjDepthInfo.y;\n    viewSpacePos.xyz += cc_shadowProjDepthInfo.z * normalize(viewSpacePos.xyz) * viewspaceDepthBias;\n    vec4 clipSpacePos;\n    clipSpacePos.xy = viewSpacePos.xy * cc_shadowProjInfo.xy;\n    clipSpacePos.zw = viewSpacePos.z * cc_shadowProjDepthInfo.xz + vec2(cc_shadowProjDepthInfo.y, 0.0);\n    if (cc_shadowNFLSInfo.z > EPSILON) {\n      clipSpacePos.z = CCGetLinearDepthFromViewSpace(viewSpacePos.xyz);\n      clipSpacePos.z = (clipSpacePos.z * 2.0 - 1.0) * clipSpacePos.w;\n    }\n    return clipSpacePos;\n  }\n  vec4 ApplyShadowDepthBias_Orthographic(vec4 shadowPos, float viewspaceDepthBias)\n  {\n    float coeffA = cc_shadowProjDepthInfo.x;\n    float coeffB = cc_shadowProjDepthInfo.y;\n    float viewSpacePos_z = (shadowPos.z - coeffB) / coeffA;\n    viewSpacePos_z += viewspaceDepthBias;\n    vec4 result = shadowPos;\n    result.z = viewSpacePos_z * coeffA + coeffB;\n    return result;\n  }\n  float CCGetShadowFactorHard (vec4 shadowPos, float bias) {\n    vec4 clipPosNew = ApplyShadowDepthBias_Orthographic(shadowPos, bias);\n    vec3 clipPos = clipPosNew.xyz / clipPosNew.w * 0.5 + 0.5;\n    if (clipPos.x < 0.0 || clipPos.x > 1.0 ||\n        clipPos.y < 0.0 || clipPos.y > 1.0 ||\n        clipPos.z < 0.0 || clipPos.z > 1.0) { return 1.0; }\n    clipPos.xy = cc_cameraPos.w == 1.0 ? vec2(clipPos.xy.x, 1.0 - clipPos.xy.y) : clipPos.xy;\n    float shadow = 0.0;\n    float closestDepth = 0.0;\n    if (cc_shadowLPNNInfo.y > EPSILON) {\n      closestDepth = dot(texture(cc_shadowMap, clipPos.xy), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0));\n    } else {\n      closestDepth = texture(cc_shadowMap, clipPos.xy).x;\n    }\n    shadow = step(clipPos.z, closestDepth);\n    return shadow;\n  }\n  float CCGetShadowFactorSoft (vec4 shadowPos, float bias) {\n    vec4 clipPosNew = ApplyShadowDepthBias_Orthographic(shadowPos, bias);\n    vec3 clipPos = clipPosNew.xyz / clipPosNew.w * 0.5 + 0.5;\n    if (clipPos.x < 0.0 || clipPos.x > 1.0 ||\n        clipPos.y < 0.0 || clipPos.y > 1.0 ||\n        clipPos.z < 0.0 || clipPos.z > 1.0) { return 1.0; }\n    clipPos.xy = cc_cameraPos.w == 1.0 ? vec2(clipPos.xy.x, 1.0 - clipPos.xy.y) : clipPos.xy;\n    float offsetDepth = clipPos.z;\n    vec2 mapSize = cc_shadowWHPBInfo.xy;\n    vec2 oneTap = 1.0 / mapSize;\n    vec2 clipPos_offset = clipPos.xy + oneTap;\n    float block0, block1, block2, block3;\n    if (cc_shadowLPNNInfo.y > EPSILON) {\n      block0 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos.x, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block1 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos_offset.x, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block2 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos.x, clipPos_offset.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block3 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos_offset.x, clipPos_offset.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n    } else {\n      block0 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos.x, clipPos.y)).x);\n      block1 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos_offset.x, clipPos.y)).x);\n      block2 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos.x, clipPos_offset.y)).x);\n      block3 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos_offset.x, clipPos_offset.y)).x);\n    }\n    float coefX   = mod(clipPos.x, oneTap.x) * mapSize.x;\n    float resultX = mix(block0, block1, coefX);\n    float resultY = mix(block2, block3, coefX);\n    float coefY   = mod(clipPos.y, oneTap.y) * mapSize.y;\n    return mix(resultX, resultY, coefY);\n  }\n  float CCGetShadowFactorSoft2X (vec4 shadowPos, float bias) {\n    vec4 clipPosNew = ApplyShadowDepthBias_Orthographic(shadowPos, bias);\n    vec3 clipPos = clipPosNew.xyz / clipPosNew.w * 0.5 + 0.5;\n    if (clipPos.x < 0.0 || clipPos.x > 1.0 ||\n        clipPos.y < 0.0 || clipPos.y > 1.0 ||\n        clipPos.z < 0.0 || clipPos.z > 1.0) { return 1.0; }\n    clipPos.xy = cc_cameraPos.w == 1.0 ? vec2(clipPos.xy.x, 1.0 - clipPos.xy.y) : clipPos.xy;\n    float offsetDepth = clipPos.z;\n    vec2 mapSize = cc_shadowWHPBInfo.xy;\n    vec2 oneTap = 1.0 / mapSize;\n    float clipPos_offset_L = clipPos.x - oneTap.x;\n    float clipPos_offset_R = clipPos.x + oneTap.x;\n    float clipPos_offset_U = clipPos.y - oneTap.y;\n    float clipPos_offset_D = clipPos.y + oneTap.y;\n    float block0, block1, block2, block3, block4, block5, block6, block7, block8;\n    if (cc_shadowLPNNInfo.y > EPSILON) {\n      block0 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos_offset_L, clipPos_offset_U)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block1 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos.x, clipPos_offset_U)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block2 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos_offset_R, clipPos_offset_U)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block3 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos_offset_L, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block4 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos.x, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block5 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos_offset_R, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block6 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos_offset_L, clipPos_offset_D)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block7 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos.x, clipPos_offset_D)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block8 = step(offsetDepth, dot(texture(cc_shadowMap, vec2(clipPos_offset_R, clipPos_offset_D)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n    } else {\n      block0 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos_offset_L, clipPos_offset_U)).x);\n      block1 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos.x, clipPos_offset_U)).x);\n      block2 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos_offset_R, clipPos_offset_U)).x);\n      block3 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos_offset_L, clipPos.y)).x);\n      block4 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos.x, clipPos.y)).x);\n      block5 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos_offset_R, clipPos.y)).x);\n      block6 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos_offset_L, clipPos_offset_D)).x);\n      block7 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos.x, clipPos_offset_D)).x);\n      block8 = step(offsetDepth, texture(cc_shadowMap, vec2(clipPos_offset_R, clipPos_offset_D)).x);\n    }\n    float coefX = mod(clipPos.x, oneTap.x) * mapSize.x;\n    float coefY = mod(clipPos.y, oneTap.y) * mapSize.y;\n    float shadow = 0.0;\n    float resultX = mix(block0, block1, coefX);\n    float resultY = mix(block3, block4, coefX);\n    shadow += mix(resultX , resultY, coefY);\n    resultX = mix(block1, block2, coefX);\n    resultY = mix(block4, block5, coefX);\n    shadow += mix(resultX , resultY, coefY);\n    resultX = mix(block3, block4, coefX);\n    resultY = mix(block6, block7, coefX);\n    shadow += mix(resultX, resultY, coefY);\n    resultX = mix(block4, block5, coefX);\n    resultY = mix(block7, block8, coefX);\n    shadow += mix(resultX, resultY, coefY);\n    return shadow * 0.25;\n  }\n  float CCGetSpotLightShadowFactorHard (vec4 shadowPos, vec3 worldPos, float bias) {\n    vec4 clipPosNew = ApplyShadowDepthBias_Perspective(shadowPos, bias);\n    vec3 clipPos = clipPosNew.xyz / clipPosNew.w * 0.5 + 0.5;\n    if (clipPos.x < 0.0 || clipPos.x > 1.0 ||\n        clipPos.y < 0.0 || clipPos.y > 1.0 ||\n        clipPos.z < 0.0 || clipPos.z > 1.0) { return 1.0; }\n    clipPos.xy = cc_cameraPos.w == 1.0 ? vec2(clipPos.xy.x, 1.0 - clipPos.xy.y) : clipPos.xy;\n    float shadow = 0.0;\n    float closestDepth = 0.0;\n    float depth = clipPos.z;\n    if (cc_shadowLPNNInfo.y > EPSILON) {\n      closestDepth = dot(texture(cc_spotLightingMap, clipPos.xy), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0));\n    } else {\n      closestDepth = texture(cc_spotLightingMap, clipPos.xy).x;\n    }\n    shadow = step(depth, closestDepth);\n    return shadow;\n  }\n  float CCGetSpotLightShadowFactorSoft (vec4 shadowPos, vec3 worldPos, float bias) {\n    vec4 clipPosNew = ApplyShadowDepthBias_Perspective(shadowPos, bias);\n    vec3 clipPos = clipPosNew.xyz / clipPosNew.w * 0.5 + 0.5;\n    if (clipPos.x < 0.0 || clipPos.x > 1.0 ||\n        clipPos.y < 0.0 || clipPos.y > 1.0 ||\n        clipPos.z < 0.0 || clipPos.z > 1.0) { return 1.0; }\n    clipPos.xy = cc_cameraPos.w == 1.0 ? vec2(clipPos.xy.x, 1.0 - clipPos.xy.y) : clipPos.xy;\n    float depth = 0.0;\n    if (cc_shadowNFLSInfo.z > EPSILON) {\n      depth = CCGetLinearDepth(worldPos);\n    } else {\n      depth = clipPos.z;\n    }\n    vec2 oneTap = 1.0 / cc_shadowWHPBInfo.xy;\n    vec2 clipPos_offset = clipPos.xy + oneTap;\n    float block0, block1, block2, block3;\n    if (cc_shadowLPNNInfo.y > EPSILON) {\n      block0 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos.x, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block1 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos_offset.x, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block2 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos.x, clipPos_offset.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block3 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos_offset.x, clipPos_offset.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n    } else {\n      block0 = step(depth, texture(cc_spotLightingMap, vec2(clipPos.x, clipPos.y)).x);\n      block1 = step(depth, texture(cc_spotLightingMap, vec2(clipPos_offset.x, clipPos.y)).x);\n      block2 = step(depth, texture(cc_spotLightingMap, vec2(clipPos.x, clipPos_offset.y)).x);\n      block3 = step(depth, texture(cc_spotLightingMap, vec2(clipPos_offset.x, clipPos_offset.y)).x);\n    }\n    float coefX   = mod(clipPos.x, oneTap.x) * cc_shadowWHPBInfo.x;\n    float resultX = mix(block0, block1, coefX);\n    float resultY = mix(block2, block3, coefX);\n    float coefY   = mod(clipPos.y, oneTap.y) * cc_shadowWHPBInfo.y;\n    return mix(resultX, resultY, coefY);\n  }\n  float CCGetSpotLightShadowFactorSoft2X (vec4 shadowPos, vec3 worldPos, float bias) {\n    vec4 clipPosNew = ApplyShadowDepthBias_Perspective(shadowPos, bias);\n    vec3 clipPos = clipPosNew.xyz / clipPosNew.w * 0.5 + 0.5;\n    if (clipPos.x < 0.0 || clipPos.x > 1.0 ||\n        clipPos.y < 0.0 || clipPos.y > 1.0 ||\n        clipPos.z < 0.0 || clipPos.z > 1.0) { return 1.0; }\n    clipPos.xy = cc_cameraPos.w == 1.0 ? vec2(clipPos.xy.x, 1.0 - clipPos.xy.y) : clipPos.xy;\n    float depth = 0.0;\n    if (cc_shadowNFLSInfo.z > EPSILON) {\n      depth = CCGetLinearDepth(worldPos);\n    } else {\n      depth = clipPos.z;\n    }\n    vec2 mapSize = cc_shadowWHPBInfo.xy;\n    vec2 oneTap = 1.0 / mapSize;\n    float clipPos_offset_L = clipPos.x - oneTap.x;\n    float clipPos_offset_R = clipPos.x + oneTap.x;\n    float clipPos_offset_U = clipPos.y - oneTap.y;\n    float clipPos_offset_D = clipPos.y + oneTap.y;\n    float block0, block1, block2, block3, block4, block5, block6, block7, block8;\n    if (cc_shadowLPNNInfo.y > EPSILON) {\n      block0 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos_offset_L, clipPos_offset_U)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block1 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos.x, clipPos_offset_U)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block2 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos_offset_R, clipPos_offset_U)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block3 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos_offset_L, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block4 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos.x, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block5 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos_offset_R, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block6 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos_offset_L, clipPos_offset_D)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block7 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos.x, clipPos_offset_D)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block8 = step(depth, dot(texture(cc_spotLightingMap, vec2(clipPos_offset_R, clipPos_offset_D)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n    } else {\n      block0 = step(depth, texture(cc_spotLightingMap, vec2(clipPos_offset_L, clipPos_offset_U)).x);\n      block1 = step(depth, texture(cc_spotLightingMap, vec2(clipPos.x, clipPos_offset_U)).x);\n      block2 = step(depth, texture(cc_spotLightingMap, vec2(clipPos_offset_R, clipPos_offset_U)).x);\n      block3 = step(depth, texture(cc_spotLightingMap, vec2(clipPos_offset_L, clipPos.y)).x);\n      block4 = step(depth, texture(cc_spotLightingMap, vec2(clipPos.x, clipPos.y)).x);\n      block5 = step(depth, texture(cc_spotLightingMap, vec2(clipPos_offset_R, clipPos.y)).x);\n      block6 = step(depth, texture(cc_spotLightingMap, vec2(clipPos_offset_L, clipPos_offset_D)).x);\n      block7 = step(depth, texture(cc_spotLightingMap, vec2(clipPos.x, clipPos_offset_D)).x);\n      block8 = step(depth, texture(cc_spotLightingMap, vec2(clipPos_offset_R, clipPos_offset_D)).x);\n    }\n    float coefX = mod(clipPos.x, oneTap.x) * mapSize.x;\n    float coefY = mod(clipPos.y, oneTap.y) * mapSize.y;\n    float shadow = 0.0;\n    float resultX = mix(block0, block1, coefX);\n    float resultY = mix(block3, block4, coefX);\n    shadow += mix(resultX , resultY, coefY);\n    resultX = mix(block1, block2, coefX);\n    resultY = mix(block4, block5, coefX);\n    shadow += mix(resultX , resultY, coefY);\n    resultX = mix(block3, block4, coefX);\n    resultY = mix(block6, block7, coefX);\n    shadow += mix(resultX, resultY, coefY);\n    resultX = mix(block4, block5, coefX);\n    resultY = mix(block7, block8, coefX);\n    shadow += mix(resultX, resultY, coefY);\n    return shadow * 0.25;\n  }\nfloat CCSpotShadowFactorBase(vec4 shadowPos, vec3 worldPos, vec2 shadowBias)\n{\n  float pcf = cc_shadowWHPBInfo.z;\n  if (pcf > 1.9) {\n    return CCGetSpotLightShadowFactorSoft2X(shadowPos, worldPos, shadowBias.x);\n  }else if (pcf > 0.9) {\n    return CCGetSpotLightShadowFactorSoft(shadowPos, worldPos, shadowBias.x);\n  }else {\n    return CCGetSpotLightShadowFactorHard(shadowPos, worldPos, shadowBias.x);\n  }\n}\nfloat CCShadowFactorBase(vec4 shadowPos, vec3 N, vec2 shadowBias)\n{\n  float realtimeShadow = 1.0;\n  vec4 pos = ApplyShadowDepthBias_FaceNormal(shadowPos, N, shadowBias.y);\n  float pcf = cc_shadowWHPBInfo.z;\n  if (pcf > 1.9) {\n    realtimeShadow =  CCGetShadowFactorSoft2X(pos, shadowBias.x);\n  }else if (pcf > 0.9) {\n    realtimeShadow = CCGetShadowFactorSoft(pos, shadowBias.x);\n  }else {\n    realtimeShadow = CCGetShadowFactorHard(pos, shadowBias.x);\n  }\n  return mix(realtimeShadow, 1.0, cc_shadowNFLSInfo.w);\n}\n#endif\n#if CC_USE_IBL\n  uniform samplerCube cc_environment;\n  vec4 fragTextureLod (sampler2D tex, vec2 coord, float lod) {\n      return textureLod(tex, coord, lod);\n  }\n  vec4 fragTextureLod (samplerCube tex, vec3 coord, float lod) {\n      return textureLod(tex, coord, lod);\n  }\n  vec3 unpackRGBE (vec4 rgbe) {\n    return rgbe.rgb * pow(1.1, rgbe.a * 255.0 - 128.0);\n  }\n  #if CC_USE_DIFFUSEMAP\n    uniform samplerCube cc_diffuseMap;\n  #endif\n#endif\nfloat GGXMobile (float roughness, float NoH, vec3 H, vec3 N) {\n  vec3 NxH = cross(N, H);\n  float OneMinusNoHSqr = dot(NxH, NxH);\n  float a = roughness * roughness;\n  float n = NoH * a;\n  float p = a / (OneMinusNoHSqr + n * n);\n  return p * p;\n}\nfloat CalcSpecular (float roughness, float NoH, vec3 H, vec3 N) {\n  return (roughness * 0.25 + 0.25) * GGXMobile(roughness, NoH, H, N);\n}\nvec3 BRDFApprox (vec3 specular, float roughness, float NoV) {\n  const vec4 c0 = vec4(-1.0, -0.0275, -0.572, 0.022);\n  const vec4 c1 = vec4(1.0, 0.0425, 1.04, -0.04);\n  vec4 r = roughness * c0 + c1;\n  float a004 = min(r.x * r.x, exp2(-9.28 * NoV)) * r.x + r.y;\n  vec2 AB = vec2(-1.04, 1.04) * a004 + r.zw;\n  AB.y *= clamp(50.0 * specular.g, 0.0, 1.0);\n  return specular * AB.x + AB.y;\n}\n#if USE_REFLECTION_DENOISE\n  vec3 GetEnvReflectionWithMipFiltering(vec3 R, float roughness, float mipCount, float denoiseIntensity) {\n    #if CC_USE_IBL\n    \tfloat mip = roughness * mipCount;\n    \tfloat delta = (dot(dFdx(R), dFdy(R))) * 1000.0;\n    \tfloat mipBias = mix(0.0, 5.0, clamp(delta, 0.0, 1.0));\n    \tvec4 biased = fragTextureLod(cc_environment, R, mip + mipBias);\n     \tvec4 filtered = texture(cc_environment, R);\n      #if CC_USE_IBL == 2\n      \tbiased.rgb = unpackRGBE(biased);\n      \tfiltered.rgb = unpackRGBE(filtered);\n      #else\n      \tbiased.rgb = SRGBToLinear(biased.rgb);\n      \tfiltered.rgb = SRGBToLinear(filtered.rgb);\n      #endif\n      return mix(biased.rgb, filtered.rgb, denoiseIntensity);\n    #else\n      return vec3(0.0, 0.0, 0.0);\n    #endif\n  }\n#endif\nstruct StandardSurface {\n  vec4 albedo;\n  #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\n  vec3 position, position_fract_part;\n  #else\n  vec3 position;\n  #endif\n  vec3 normal;\n  vec3 emissive;\n  vec3 lightmap;\n  float lightmap_test;\n  float roughness;\n  float metallic;\n  float occlusion;\n  float specularIntensity;\n  #if CC_RECEIVE_SHADOW\n    vec2 shadowBias;\n  #endif\n};\nvec4 CCStandardShadingBase (StandardSurface s, vec4 shadowPos) {\n  vec3 diffuse = s.albedo.rgb * (1.0 - s.metallic);\n  vec3 specular = mix(vec3(0.08 * s.specularIntensity), s.albedo.rgb, s.metallic);\n  vec3 position;\n  #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\n  position = unpackHighpData(s.position, s.position_fract_part);\n  #else\n  position = s.position;\n  #endif\n  vec3 N = normalize(s.normal);\n  vec3 V = normalize(cc_cameraPos.xyz - position);\n  float NV = max(abs(dot(N, V)), 0.0);\n  specular = BRDFApprox(specular, s.roughness, NV);\n  vec3 L = normalize(-cc_mainLitDir.xyz);\n  vec3 H = normalize(L + V);\n  float NH = max(dot(N, H), 0.0);\n  float NL = max(dot(N, L), 0.0);\n  vec3 finalColor = NL * cc_mainLitColor.rgb * cc_mainLitColor.w;\n  vec3 diffuseContrib = diffuse / PI;\n  vec3 specularContrib = specular * CalcSpecular(s.roughness, NH, H, N);\n  vec3 dirlightContrib = (diffuseContrib + specularContrib);\n  float shadow = 1.0;\n  #if CC_RECEIVE_SHADOW\n    if (NL > 0.0 && cc_mainLitDir.w > 0.0) {\n      shadow = CCShadowFactorBase(shadowPos, N, s.shadowBias);\n    }\n  #endif\n  dirlightContrib *= shadow;\n  finalColor *= dirlightContrib;\n  #if CC_USE_LIGHTMAP && !USE_BATCHING && !CC_FORWARD_ADD\n    if (s.lightmap_test > EPSILON_LOWP) {\n      finalColor = diffuse * s.lightmap.rgb * shadow;\n    }\n  #endif\n  float fAmb = 0.5 - N.y * 0.5;\n  vec3 ambDiff = mix(cc_ambientSky.rgb, cc_ambientGround.rgb, fAmb);\n  #if CC_USE_IBL\n    #if CC_USE_DIFFUSEMAP\n      vec4 diffuseMap = texture(cc_diffuseMap, N);\n      #if CC_USE_DIFFUSEMAP == 2\n        ambDiff = unpackRGBE(diffuseMap);\n      #else\n        ambDiff = SRGBToLinear(diffuseMap.rgb);\n      #endif\n    #endif\n    vec3 R = normalize(reflect(-V, N));\n    #if USE_REFLECTION_DENOISE\n      vec3 env = GetEnvReflectionWithMipFiltering(R, s.roughness, cc_ambientGround.w, 0.6);\n    #else\n      vec4 envmap = fragTextureLod(cc_environment, R, s.roughness * cc_ambientGround.w);\n      #if CC_USE_IBL == 2\n        vec3 env = unpackRGBE(envmap);\n      #else\n        vec3 env = SRGBToLinear(envmap.rgb);\n      #endif\n    #endif\n    finalColor += env * cc_ambientSky.w * specular * s.occlusion;\n  #endif\n  finalColor += ambDiff.rgb * cc_ambientSky.w * diffuse * s.occlusion;\n  finalColor += s.emissive;\n  return vec4(finalColor, s.albedo.a);\n}\nvec3 ACESToneMap (vec3 color) {\n  color = min(color, vec3(8.0));\n  const float A = 2.51;\n  const float B = 0.03;\n  const float C = 2.43;\n  const float D = 0.59;\n  const float E = 0.14;\n  return (color * (A * color + B)) / (color * (C * color + D) + E);\n}\nvec4 CCFragOutput (vec4 color) {\n  #if CC_USE_HDR\n    color.rgb = ACESToneMap(color.rgb);\n  #endif\n  color.rgb = sqrt(color.rgb);\n  return color;\n}\nin highp vec4 v_shadowPos;\n#if CC_RECEIVE_SHADOW\n#endif\n#if CC_USE_LIGHTMAP && !USE_BATCHING && !CC_FORWARD_ADD\n  in vec3 v_luv;\n  uniform sampler2D cc_lightingMap;\n#endif\nin vec3 v_position;\nin vec2 v_uv;\nin vec2 v_uv1;\nin vec3 v_normal;\n#if USE_VERTEX_COLOR\n  in vec4 v_color;\n#endif\n#if USE_ALBEDO_MAP\n  uniform sampler2D albedoMap;\n#endif\n#if USE_NORMAL_MAP\n  in vec3 v_tangent;\n  in vec3 v_bitangent;\n  uniform sampler2D normalMap;\n#endif\n#if USE_PBR_MAP\n  uniform sampler2D pbrMap;\n#endif\n#if USE_METALLIC_ROUGHNESS_MAP\n  uniform sampler2D metallicRoughnessMap;\n#endif\n#if USE_OCCLUSION_MAP\n  uniform sampler2D occlusionMap;\n#endif\n#if USE_EMISSIVE_MAP\n  uniform sampler2D emissiveMap;\n#endif\n#if USE_ALPHA_TEST\n#endif\nvoid surf (out StandardSurface s) {\n  vec4 baseColor = albedo;\n  #if USE_VERTEX_COLOR\n    baseColor *= v_color;\n  #endif\n  #if USE_ALBEDO_MAP\n    vec4 texColor = texture(albedoMap, ALBEDO_UV);\n    texColor.rgb = SRGBToLinear(texColor.rgb);\n    baseColor *= texColor;\n  #endif\n  s.albedo = baseColor;\n  s.albedo.rgb *= albedoScaleAndCutoff.xyz;\n  #if USE_ALPHA_TEST\n    if (s.albedo.ALPHA_TEST_CHANNEL < albedoScaleAndCutoff.w) discard;\n  #endif\n  #if CC_USE_LIGHTMAP && !USE_BATCHING && !CC_FORWARD_ADD\n    vec4 lightColor = texture(cc_lightingMap, v_luv.xy);\n    s.lightmap = lightColor.rgb;\n    s.lightmap_test = v_luv.z;\n  #endif\n  s.normal = v_normal;\n  #if USE_NORMAL_MAP\n    vec3 nmmp = texture(normalMap, NORMAL_UV).xyz - vec3(0.5);\n    s.normal =\n      (nmmp.x * pbrParams.w) * normalize(v_tangent) +\n      (nmmp.y * pbrParams.w) * normalize(v_bitangent) +\n      nmmp.z * normalize(s.normal);\n  #endif\n  s.position = v_position;\n  vec4 pbr = pbrParams;\n  #if USE_PBR_MAP\n    vec4 res = texture(pbrMap, PBR_UV);\n    pbr.x *= res.r;\n    pbr.y *= res.g;\n    pbr.z *= res.b;\n  #endif\n  #if USE_METALLIC_ROUGHNESS_MAP\n    vec4 metallicRoughness = texture(metallicRoughnessMap, PBR_UV);\n    pbr.z *= metallicRoughness.b;\n    pbr.y *= metallicRoughness.g;\n  #endif\n  #if USE_OCCLUSION_MAP\n    pbr.x *= texture(occlusionMap, PBR_UV).r;\n  #endif\n  s.occlusion = clamp(pbr.x, 0.0, 0.96);\n  s.roughness = clamp(pbr.y, 0.04, 1.0);\n  s.specularIntensity = 0.5;\n  s.metallic = pbr.z;\n  s.emissive = emissive.rgb * emissiveScaleParam.xyz;\n  #if USE_EMISSIVE_MAP\n    s.emissive *= SRGBToLinear(texture(emissiveMap, EMISSIVE_UV).rgb);\n  #endif\n}\n#if CC_FORWARD_ADD\n  #if CC_PIPELINE_TYPE == 0\n    #define LIGHTS_PER_PASS 1\n  #else\n    #define LIGHTS_PER_PASS 10\n  #endif\n  #if CC_ENABLE_CLUSTERED_LIGHT_CULLING == 0\n  layout(std140) uniform CCForwardLight {\n    highp vec4 cc_lightPos[LIGHTS_PER_PASS];\n    vec4 cc_lightColor[LIGHTS_PER_PASS];\n    vec4 cc_lightSizeRangeAngle[LIGHTS_PER_PASS];\n    vec4 cc_lightDir[LIGHTS_PER_PASS];\n  };\n  #endif\n  float SmoothDistAtt (float distSqr, float invSqrAttRadius) {\n    float factor = distSqr * invSqrAttRadius;\n    float smoothFactor = clamp(1.0 - factor * factor, 0.0, 1.0);\n    return smoothFactor * smoothFactor;\n  }\n  float GetDistAtt (float distSqr, float invSqrAttRadius) {\n    float attenuation = 1.0 / max(distSqr, 0.01*0.01);\n    attenuation *= SmoothDistAtt(distSqr , invSqrAttRadius);\n    return attenuation;\n  }\n  float GetAngleAtt (vec3 L, vec3 litDir, float litAngleScale, float litAngleOffset) {\n    float cd = dot(litDir, L);\n    float attenuation = clamp(cd * litAngleScale + litAngleOffset, 0.0, 1.0);\n    return (attenuation * attenuation);\n  }\n  #if CC_ENABLE_CLUSTERED_LIGHT_CULLING == 0\n  vec4 CCStandardShadingAdditive (StandardSurface s, vec4 shadowPos) {\n    vec3 position;\n    #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\n    position = unpackHighpData(s.position, s.position_fract_part);\n    #else\n    position = s.position;\n    #endif\n    vec3 diffuse = s.albedo.rgb * (1.0 - s.metallic);\n    vec3 specular = mix(vec3(0.04), s.albedo.rgb, s.metallic);\n    vec3 diffuseContrib = diffuse / PI;\n    vec3 N = normalize(s.normal);\n    vec3 V = normalize(cc_cameraPos.xyz - position);\n    float NV = max(abs(dot(N, V)), 0.0);\n    specular = BRDFApprox(specular, s.roughness, NV);\n    vec3 finalColor = vec3(0.0);\n    int numLights = CC_PIPELINE_TYPE == 0 ? LIGHTS_PER_PASS : int(cc_lightDir[0].w);\n    for (int i = 0; i < LIGHTS_PER_PASS; i++) {\n      if (i >= numLights) break;\n      vec3 SLU = cc_lightPos[i].xyz - position;\n      vec3 SL = normalize(SLU);\n      vec3 SH = normalize(SL + V);\n      float SNL = max(dot(N, SL), 0.0);\n      float SNH = max(dot(N, SH), 0.0);\n      float distSqr = dot(SLU, SLU);\n      float litRadius = cc_lightSizeRangeAngle[i].x;\n      float litRadiusSqr = litRadius * litRadius;\n      float illum = litRadiusSqr / max(litRadiusSqr, distSqr);\n      float attRadiusSqrInv = 1.0 / max(cc_lightSizeRangeAngle[i].y, 0.01);\n      attRadiusSqrInv *= attRadiusSqrInv;\n      float att = GetDistAtt(distSqr, attRadiusSqrInv);\n      vec3 lspec = specular * CalcSpecular(s.roughness, SNH, SH, N);\n      if (cc_lightPos[i].w > 0.0) {\n        float cosInner = max(dot(-cc_lightDir[i].xyz, SL), 0.01);\n        float cosOuter = cc_lightSizeRangeAngle[i].z;\n        float litAngleScale = 1.0 / max(0.001, cosInner - cosOuter);\n        float litAngleOffset = -cosOuter * litAngleScale;\n        att *= GetAngleAtt(SL, -cc_lightDir[i].xyz, litAngleScale, litAngleOffset);\n      }\n      vec3 lightColor = cc_lightColor[i].rgb;\n      float shadow = 1.0;\n      #if CC_RECEIVE_SHADOW\n        if (cc_lightPos[i].w > 0.0 && cc_lightSizeRangeAngle[i].w > 0.0) {\n          shadow = CCSpotShadowFactorBase(shadowPos, position, s.shadowBias);\n        }\n      #endif\n      lightColor *= shadow;\n      finalColor += SNL * lightColor * cc_lightColor[i].w * illum * att * (diffuseContrib + lspec);\n    }\n    return vec4(finalColor, 0.0);\n  }\n  #endif\n  #if CC_ENABLE_CLUSTERED_LIGHT_CULLING == 1\n  layout(std430, binding = 4) readonly buffer b_ccLightsBuffer { vec4 b_ccLights[]; };\n  layout(std430, binding = 5) readonly buffer b_clusterLightIndicesBuffer { uint b_clusterLightIndices[]; };\n  layout(std430, binding = 6) readonly buffer b_clusterLightGridBuffer { uvec4 b_clusterLightGrid[]; };\n  struct CCLight\n  {\n    vec4 cc_lightPos;\n    vec4 cc_lightColor;\n    vec4 cc_lightSizeRangeAngle;\n    vec4 cc_lightDir;\n  };\n  struct Cluster\n  {\n    vec3 minBounds;\n    vec3 maxBounds;\n  };\n  struct LightGrid\n  {\n    uint offset;\n    uint ccLights;\n  };\n  CCLight getCCLight(uint i)\n  {\n    CCLight light;\n    light.cc_lightPos = b_ccLights[4u * i + 0u];\n    light.cc_lightColor = b_ccLights[4u * i + 1u];\n    light.cc_lightSizeRangeAngle = b_ccLights[4u * i + 2u];\n    light.cc_lightDir = b_ccLights[4u * i + 3u];\n    return light;\n  }\n  LightGrid getLightGrid(uint cluster)\n  {\n    uvec4 gridvec = b_clusterLightGrid[cluster];\n    LightGrid grid;\n    grid.offset = gridvec.x;\n    grid.ccLights = gridvec.y;\n    return grid;\n  }\n  uint getGridLightIndex(uint start, uint offset)\n  {\n    return b_clusterLightIndices[start + offset];\n  }\n  uint getClusterZIndex(vec4 worldPos)\n  {\n    float scale = float(24) / log(cc_nearFar.y / cc_nearFar.x);\n    float bias = -(float(24) * log(cc_nearFar.x) / log(cc_nearFar.y / cc_nearFar.x));\n    float eyeDepth = -(cc_matView * worldPos).z;\n    uint zIndex = uint(max(log(eyeDepth) * scale + bias, 0.0));\n    return zIndex;\n  }\n  uint getClusterIndex(vec4 fragCoord, vec4 worldPos)\n  {\n    uint zIndex = getClusterZIndex(worldPos);\n    float clusterSizeX = ceil(cc_viewPort.z / float(16));\n    float clusterSizeY = ceil(cc_viewPort.w / float(8));\n    uvec3 indices = uvec3(uvec2(fragCoord.xy / vec2(clusterSizeX, clusterSizeY)), zIndex);\n    uint cluster = (16u * 8u) * indices.z + 16u * indices.y + indices.x;\n    return cluster;\n  }\n  vec4 CCClusterShadingAdditive (StandardSurface s, vec4 shadowPos) {\n    vec3 diffuse = s.albedo.rgb * (1.0 - s.metallic);\n    vec3 specular = mix(vec3(0.04), s.albedo.rgb, s.metallic);\n    vec3 diffuseContrib = diffuse / PI;\n    vec3 position;\n    #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\n    position = unpackHighpData(s.position, s.position_fract_part);\n    #else\n    position = s.position;\n    #endif\n    vec3 N = normalize(s.normal);\n    vec3 V = normalize(cc_cameraPos.xyz - position);\n    float NV = max(abs(dot(N, V)), 0.001);\n    specular = BRDFApprox(specular, s.roughness, NV);\n    vec3 finalColor = vec3(0.0);\n    uint cluster = getClusterIndex(gl_FragCoord, vec4(position, 1.0));\n    LightGrid grid = getLightGrid(cluster);\n    uint numLights = grid.ccLights;\n    for (uint i = 0u; i < 100u; i++) {\n      if (i >= numLights) break;\n      uint lightIndex = getGridLightIndex(grid.offset, i);\n      CCLight light = getCCLight(lightIndex);\n      vec3 SLU = light.cc_lightPos.xyz - position;\n      vec3 SL = normalize(SLU);\n      vec3 SH = normalize(SL + V);\n      float SNL = max(dot(N, SL), 0.001);\n      float SNH = max(dot(N, SH), 0.0);\n      float distSqr = dot(SLU, SLU);\n      float litRadius = light.cc_lightSizeRangeAngle.x;\n      float litRadiusSqr = litRadius * litRadius;\n      float illum = PI * (litRadiusSqr / max(litRadiusSqr , distSqr));\n      float attRadiusSqrInv = 1.0 / max(light.cc_lightSizeRangeAngle.y, 0.01);\n      attRadiusSqrInv *= attRadiusSqrInv;\n      float att = GetDistAtt(distSqr, attRadiusSqrInv);\n      vec3 lspec = specular * CalcSpecular(s.roughness, SNH, SH, N);\n      if (light.cc_lightPos.w > 0.0) {\n        float cosInner = max(dot(-light.cc_lightDir.xyz, SL), 0.01);\n        float cosOuter = light.cc_lightSizeRangeAngle.z;\n        float litAngleScale = 1.0 / max(0.001, cosInner - cosOuter);\n        float litAngleOffset = -cosOuter * litAngleScale;\n        att *= GetAngleAtt(SL, -light.cc_lightDir.xyz, litAngleScale, litAngleOffset);\n      }\n      vec3 lightColor = light.cc_lightColor.rgb;\n      float shadow = 1.0;\n      #if CC_RECEIVE_SHADOW\n        if (light.cc_lightPos.w > 0.0) {\n          shadow = CCSpotShadowFactorBase(shadowPos, position, s.shadowBias);\n        }\n      #endif\n      lightColor *= shadow;\n      finalColor += SNL * lightColor * light.cc_lightColor.w * illum * att * (diffuseContrib + lspec);\n    }\n    return vec4(finalColor, 0.0);\n  }\n  #endif\n  layout(location = 0) out vec4 fragColorX;\n  void main () {\n    StandardSurface s; surf(s);\n    #if CC_ENABLE_CLUSTERED_LIGHT_CULLING == 1\n    vec4 color = CCClusterShadingAdditive(s, v_shadowPos);\n    #else\n    vec4 color = CCStandardShadingAdditive(s, v_shadowPos);\n    #endif\n    fragColorX = CCFragOutput(color);\n  }\n#elif (CC_PIPELINE_TYPE == 0 || CC_FORCE_FORWARD_SHADING)\n  layout(location = 0) out vec4 fragColorX;\n  void main () {\n    StandardSurface s; surf(s);\n    vec4 color = CCStandardShadingBase(s, v_shadowPos);\n    CC_APPLY_FOG(color, s.position.xyz);\n    fragColorX = CCFragOutput(color);\n  }\n#elif CC_PIPELINE_TYPE == 1\n  vec2 signNotZero(vec2 v) {\n    return vec2((v.x >= 0.0) ? +1.0 : -1.0, (v.y >= 0.0) ? +1.0 : -1.0);\n  }\n  vec2 float32x3_to_oct(in vec3 v) {\n    vec2 p = v.xy * (1.0 / (abs(v.x) + abs(v.y) + abs(v.z)));\n    return (v.z <= 0.0) ? ((1.0 - abs(p.yx)) * signNotZero(p)) : p;\n  }\n  layout(location = 0) out vec4 fragColor0;\n  layout(location = 1) out vec4 fragColor1;\n  layout(location = 2) out vec4 fragColor2;\n  void main () {\n    StandardSurface s; surf(s);\n    fragColor0 = s.albedo;\n    fragColor1 = vec4(float32x3_to_oct(s.normal), s.roughness, s.metallic);\n    fragColor2 = vec4(s.emissive, s.occlusion);\n  }\n#endif"},"glsl1":{"vert":"\nprecision highp float;\n#define QUATER_PI         0.78539816340\n#define HALF_PI           1.57079632679\n#define PI                3.14159265359\n#define PI2               6.28318530718\n#define PI4               12.5663706144\n#define INV_QUATER_PI     1.27323954474\n#define INV_HALF_PI       0.63661977237\n#define INV_PI            0.31830988618\n#define INV_PI2           0.15915494309\n#define INV_PI4           0.07957747155\n#define EPSILON           1e-6\n#define EPSILON_LOWP      1e-4\n#define LOG2              1.442695\n#define EXP_VALUE         2.71828183f\n#define FP_MAX            65504.0\n#define FP_SCALE          0.0009765625\n#define FP_SCALE_INV      1024.0\n#define GRAY_VECTOR       vec3(0.299, 0.587, 0.114)\nhighp float decode32 (highp vec4 rgba) {\n  rgba = rgba * 255.0;\n  highp float Sign = 1.0 - (step(128.0, (rgba[3]) + 0.5)) * 2.0;\n  highp float Exponent = 2.0 * (mod(float(int((rgba[3]) + 0.5)), 128.0)) + (step(128.0, (rgba[2]) + 0.5)) - 127.0;\n  highp float Mantissa = (mod(float(int((rgba[2]) + 0.5)), 128.0)) * 65536.0 + rgba[1] * 256.0 + rgba[0] + 8388608.0;\n  return Sign * exp2(Exponent - 23.0) * Mantissa;\n}\nstruct StandardVertInput {\n  highp vec4 position;\n  vec3 normal;\n  vec4 tangent;\n};\nattribute vec3 a_position;\nattribute vec3 a_normal;\nattribute vec2 a_texCoord;\nattribute vec4 a_tangent;\n#if CC_USE_SKINNING\n    attribute vec4 a_joints;\n  attribute vec4 a_weights;\n#endif\n#if USE_INSTANCING\n  #if CC_USE_BAKED_ANIMATION\n    attribute highp vec4 a_jointAnimInfo;\n  #endif\n  attribute vec4 a_matWorld0;\n  attribute vec4 a_matWorld1;\n  attribute vec4 a_matWorld2;\n  #if CC_USE_LIGHTMAP\n    attribute vec4 a_lightingMapUVParam;\n  #endif\n  #if CC_RECEIVE_SHADOW\n    attribute vec2 a_localShadowBias;\n  #endif\n#elif USE_BATCHING\n  attribute float a_dyn_batch_id;\n#endif\n#if CC_USE_MORPH\n    attribute float a_vertexId;\n    int getVertexId() {\n      return int(a_vertexId);\n    }\n#endif\n#if CC_USE_MORPH\n  uniform vec4 cc_displacementWeights[15];\n  uniform vec4 cc_displacementTextureInfo;\n  vec2 getPixelLocation(vec2 textureResolution, int pixelIndex) {\n    float pixelIndexF = float(pixelIndex);\n    float x = mod(pixelIndexF, textureResolution.x);\n    float y = floor(pixelIndexF / textureResolution.x);\n    return vec2(x, y);\n  }\n  vec2 getPixelCoordFromLocation(vec2 location, vec2 textureResolution) {\n    return (vec2(location.x, location.y) + .5) / textureResolution;\n  }\n  #if CC_DEVICE_SUPPORT_FLOAT_TEXTURE\n      vec4 fetchVec3ArrayFromTexture(sampler2D tex, int elementIndex) {\n        int pixelIndex = elementIndex;\n        vec2 location = getPixelLocation(cc_displacementTextureInfo.xy, pixelIndex);\n        vec2 uv = getPixelCoordFromLocation(location, cc_displacementTextureInfo.xy);\n        return texture2D(tex, uv);\n      }\n  #else\n    vec4 fetchVec3ArrayFromTexture(sampler2D tex, int elementIndex) {\n      int pixelIndex = elementIndex * 4;\n      vec2 location = getPixelLocation(cc_displacementTextureInfo.xy, pixelIndex);\n      vec2 x = getPixelCoordFromLocation(location + vec2(0.0, 0.0), cc_displacementTextureInfo.xy);\n      vec2 y = getPixelCoordFromLocation(location + vec2(1.0, 0.0), cc_displacementTextureInfo.xy);\n      vec2 z = getPixelCoordFromLocation(location + vec2(2.0, 0.0), cc_displacementTextureInfo.xy);\n      return vec4(\n        decode32(texture2D(tex, x)),\n        decode32(texture2D(tex, y)),\n        decode32(texture2D(tex, z)),\n        1.0\n      );\n    }\n  #endif\n  float getDisplacementWeight(int index) {\n    int quot = index / 4;\n    int remainder = index - quot * 4;\n    if (remainder == 0) {\n      return cc_displacementWeights[quot].x;\n    } else if (remainder == 1) {\n      return cc_displacementWeights[quot].y;\n    } else if (remainder == 2) {\n      return cc_displacementWeights[quot].z;\n    } else {\n      return cc_displacementWeights[quot].w;\n    }\n  }\n  vec3 getVec3DisplacementFromTexture(sampler2D tex, int vertexIndex) {\n  #if CC_MORPH_PRECOMPUTED\n    return fetchVec3ArrayFromTexture(tex, vertexIndex).rgb;\n  #else\n    vec3 result = vec3(0, 0, 0);\n    int nVertices = int(cc_displacementTextureInfo.z);\n    for (int iTarget = 0; iTarget < CC_MORPH_TARGET_COUNT; ++iTarget) {\n      result += (fetchVec3ArrayFromTexture(tex, nVertices * iTarget + vertexIndex).rgb * getDisplacementWeight(iTarget));\n    }\n    return result;\n  #endif\n  }\n  #if CC_MORPH_TARGET_HAS_POSITION\n    uniform sampler2D cc_PositionDisplacements;\n    vec3 getPositionDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_PositionDisplacements, vertexId);\n    }\n  #endif\n  #if CC_MORPH_TARGET_HAS_NORMAL\n    uniform sampler2D cc_NormalDisplacements;\n    vec3 getNormalDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_NormalDisplacements, vertexId);\n    }\n  #endif\n  #if CC_MORPH_TARGET_HAS_TANGENT\n    uniform sampler2D cc_TangentDisplacements;\n    vec3 getTangentDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_TangentDisplacements, vertexId);\n    }\n  #endif\n  void applyMorph (inout vec4 position, inout vec3 normal, inout vec4 tangent) {\n    int vertexId = getVertexId();\n  #if CC_MORPH_TARGET_HAS_POSITION\n    position.xyz = position.xyz + getPositionDisplacement(vertexId);\n  #endif\n  #if CC_MORPH_TARGET_HAS_NORMAL\n    normal.xyz = normal.xyz + getNormalDisplacement(vertexId);\n  #endif\n  #if CC_MORPH_TARGET_HAS_TANGENT\n    tangent.xyz = tangent.xyz + getTangentDisplacement(vertexId);\n  #endif\n  }\n  void applyMorph (inout vec4 position) {\n  #if CC_MORPH_TARGET_HAS_POSITION\n    position.xyz = position.xyz + getPositionDisplacement(getVertexId());\n  #endif\n  }\n#endif\n#if CC_USE_SKINNING\n  #if CC_USE_BAKED_ANIMATION\n    uniform highp vec4 cc_jointTextureInfo;\n    uniform highp vec4 cc_jointAnimInfo;\n    uniform highp sampler2D cc_jointTexture;\n    void CCGetJointTextureCoords(float pixelsPerJoint, float jointIdx, out highp float x, out highp float y, out highp float invSize)\n    {\n      #if USE_INSTANCING\n        highp float temp = pixelsPerJoint * (a_jointAnimInfo.x * a_jointAnimInfo.y + jointIdx) + a_jointAnimInfo.z;\n      #else\n        highp float temp = pixelsPerJoint * (cc_jointAnimInfo.x * cc_jointTextureInfo.y + jointIdx) + cc_jointTextureInfo.z;\n      #endif\n      invSize = cc_jointTextureInfo.w;\n      highp float tempY = floor(temp * invSize);\n      x = floor(temp - tempY * cc_jointTextureInfo.x);\n      y = (tempY + 0.5) * invSize;\n    }\n  #else\n    uniform highp vec4 cc_joints[90];\n  #endif\n  #if CC_USE_BAKED_ANIMATION\n    #if CC_DEVICE_SUPPORT_FLOAT_TEXTURE\n      mat4 getJointMatrix (float i) {\n        highp float x, y, invSize;\n        CCGetJointTextureCoords(3.0, i, x, y, invSize);\n        vec4 v1 = texture2D(cc_jointTexture, vec2((x + 0.5) * invSize, y));\n        vec4 v2 = texture2D(cc_jointTexture, vec2((x + 1.5) * invSize, y));\n        vec4 v3 = texture2D(cc_jointTexture, vec2((x + 2.5) * invSize, y));\n        return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n      }\n    #else\n      mat4 getJointMatrix (float i) {\n        highp float x, y, invSize;\n        CCGetJointTextureCoords(12.0, i, x, y, invSize);\n        vec4 v1 = vec4(\n          decode32(texture2D(cc_jointTexture, vec2((x + 0.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 1.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 2.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 3.5) * invSize, y)))\n        );\n        vec4 v2 = vec4(\n          decode32(texture2D(cc_jointTexture, vec2((x + 4.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 5.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 6.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 7.5) * invSize, y)))\n        );\n        vec4 v3 = vec4(\n          decode32(texture2D(cc_jointTexture, vec2((x + 8.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 9.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 10.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 11.5) * invSize, y)))\n        );\n        return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n      }\n    #endif\n  #else\n    mat4 getJointMatrix (float i) {\n      int idx = int(i);\n      vec4 v1 = cc_joints[idx * 3];\n      vec4 v2 = cc_joints[idx * 3 + 1];\n      vec4 v3 = cc_joints[idx * 3 + 2];\n      return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n    }\n  #endif\n  mat4 skinMatrix () {\n    vec4 joints = vec4(a_joints);\n    return getJointMatrix(joints.x) * a_weights.x\n         + getJointMatrix(joints.y) * a_weights.y\n         + getJointMatrix(joints.z) * a_weights.z\n         + getJointMatrix(joints.w) * a_weights.w;\n  }\n  void CCSkin (inout vec4 position) {\n    mat4 m = skinMatrix();\n    position = m * position;\n  }\n  void CCSkin (inout vec4 position, inout vec3 normal, inout vec4 tangent) {\n    mat4 m = skinMatrix();\n    position = m * position;\n    normal = (m * vec4(normal, 0.0)).xyz;\n    tangent.xyz = (m * vec4(tangent.xyz, 0.0)).xyz;\n  }\n#endif\nvoid CCVertInput(inout StandardVertInput In)\n{\n    In.position = vec4(a_position, 1.0);\n    In.normal = a_normal;\n    In.tangent = a_tangent;\n  #if CC_USE_MORPH\n    applyMorph(In.position, In.normal, In.tangent);\n  #endif\n  #if CC_USE_SKINNING\n    CCSkin(In.position, In.normal, In.tangent);\n  #endif\n}\nuniform highp mat4 cc_matView;\n  uniform highp mat4 cc_matProj;\n  uniform highp vec4 cc_cameraPos;\n  uniform mediump vec4 cc_fogBase;\n  uniform mediump vec4 cc_fogAdd;\n#if !USE_INSTANCING\n  #if USE_BATCHING\n    uniform highp mat4 cc_matWorlds[10];\n  #else\n    uniform highp mat4 cc_matWorld;\n  uniform highp mat4 cc_matWorldIT;\n  uniform highp vec4 cc_lightingMapUVParam;\n  #endif\n#endif\nvoid CCGetWorldMatrixFull(out mat4 matWorld, out mat4 matWorldIT)\n{\n  #if USE_INSTANCING\n    matWorld = mat4(\n      vec4(a_matWorld0.xyz, 0.0),\n      vec4(a_matWorld1.xyz, 0.0),\n      vec4(a_matWorld2.xyz, 0.0),\n      vec4(a_matWorld0.w, a_matWorld1.w, a_matWorld2.w, 1.0)\n    );\n    matWorldIT = matWorld;\n  #elif USE_BATCHING\n    matWorld = cc_matWorlds[int(a_dyn_batch_id)];\n    matWorldIT = matWorld;\n  #else\n    matWorld = cc_matWorld;\n    matWorldIT = cc_matWorldIT;\n  #endif\n}\n    uniform vec4 tilingOffset;\nfloat LinearFog(vec4 pos) {\n  vec4 wPos = pos;\n  float cam_dis = distance(cc_cameraPos, wPos);\n  float fogStart = cc_fogBase.x;\n  float fogEnd = cc_fogBase.y;\n  return clamp((fogEnd - cam_dis) / (fogEnd - fogStart), 0., 1.);\n}\nfloat ExpFog(vec4 pos) {\n  vec4 wPos = pos;\n  float fogAtten = cc_fogAdd.z;\n  float fogStart = cc_fogBase.x;\n  float fogDensity = cc_fogBase.z;\n  float cam_dis = max(distance(cc_cameraPos, wPos) - fogStart, 0.0) / fogAtten * 4.;\n  float f = exp(-cam_dis * fogDensity);\n  return f;\n}\nfloat ExpSquaredFog(vec4 pos) {\n  vec4 wPos = pos;\n  float fogAtten = cc_fogAdd.z;\n  float fogStart = cc_fogBase.x;\n  float fogDensity = cc_fogBase.z;\n  float cam_dis = max(distance(cc_cameraPos, wPos) - fogStart, 0.0) / fogAtten * 4.;\n  float f = exp(-cam_dis * cam_dis * fogDensity * fogDensity);\n  return f;\n}\nfloat LayeredFog(vec4 pos) {\n  vec4 wPos = pos;\n  float fogAtten = cc_fogAdd.z;\n  float _FogTop = cc_fogAdd.x;\n  float _FogRange = cc_fogAdd.y;\n  vec3 camWorldProj = cc_cameraPos.xyz;\n  camWorldProj.y = 0.;\n  vec3 worldPosProj = wPos.xyz;\n  worldPosProj.y = 0.;\n  float fDeltaD = distance(worldPosProj, camWorldProj) / fogAtten * 2.0;\n  float fDeltaY, fDensityIntegral;\n  if (cc_cameraPos.y > _FogTop) {\n    if (wPos.y < _FogTop) {\n      fDeltaY = (_FogTop - wPos.y) / _FogRange * 2.0;\n      fDensityIntegral = fDeltaY * fDeltaY * 0.5;\n    } else {\n      fDeltaY = 0.;\n      fDensityIntegral = 0.;\n    }\n  } else {\n    if (wPos.y < _FogTop) {\n      float fDeltaA = (_FogTop - cc_cameraPos.y) / _FogRange * 2.;\n      float fDeltaB = (_FogTop - wPos.y) / _FogRange * 2.;\n      fDeltaY = abs(fDeltaA - fDeltaB);\n      fDensityIntegral = abs((fDeltaA * fDeltaA * 0.5) - (fDeltaB * fDeltaB * 0.5));\n    } else {\n      fDeltaY = abs(_FogTop - cc_cameraPos.y) / _FogRange * 2.;\n      fDensityIntegral = abs(fDeltaY * fDeltaY * 0.5);\n    }\n  }\n  float fDensity;\n  if (fDeltaY != 0.) {\n    fDensity = (sqrt(1.0 + ((fDeltaD / fDeltaY) * (fDeltaD / fDeltaY)))) * fDensityIntegral;\n  } else {\n    fDensity = 0.;\n  }\n  float f = exp(-fDensity);\n  return f;\n}\nvoid CC_TRANSFER_FOG_BASE(vec4 pos, out float factor)\n{\n  #if CC_USE_FOG == 0\n\tfactor = LinearFog(pos);\n  #elif CC_USE_FOG == 1\n    factor = ExpFog(pos);\n  #elif CC_USE_FOG == 2\n    factor = ExpSquaredFog(pos);\n  #elif CC_USE_FOG == 3\n    factor = LayeredFog(pos);\n  #else\n    factor = 1.0;\n  #endif\n}\n#if !CC_USE_ACCURATE_FOG\nvarying float v_fog_factor;\n#endif\nvoid CC_TRANSFER_FOG(vec4 pos) {\n#if !CC_USE_ACCURATE_FOG\n    CC_TRANSFER_FOG_BASE(pos, v_fog_factor);\n#endif\n}\nvarying highp vec4 v_shadowPos;\nuniform highp mat4 cc_matLightViewProj;\n#if CC_RECEIVE_SHADOW\n  uniform highp sampler2D cc_shadowMap;\n  uniform highp sampler2D cc_spotLightingMap;\n#endif\n#if CC_RECEIVE_SHADOW\n#endif\n#if USE_VERTEX_COLOR\n  attribute vec4 a_color;\n  varying vec4 v_color;\n#endif\nvarying vec3 v_position;\nvarying vec3 v_normal;\nvarying vec2 v_uv;\nvarying vec2 v_uv1;\n#if USE_NORMAL_MAP\n  varying vec3 v_tangent;\n  varying vec3 v_bitangent;\n#endif\n#if HAS_SECOND_UV || CC_USE_LIGHTMAP\n  attribute vec2 a_texCoord1;\n#endif\n#if CC_USE_LIGHTMAP && !USE_BATCHING && !CC_FORWARD_ADD\n  varying vec3 v_luv;\n  void CCLightingMapCaclUV()\n  {\n  #if !USE_INSTANCING\n    v_luv.xy = cc_lightingMapUVParam.xy + a_texCoord1 * cc_lightingMapUVParam.z;\n    v_luv.z = cc_lightingMapUVParam.w;\n  #else\n    v_luv.xy = a_lightingMapUVParam.xy + a_texCoord1 * a_lightingMapUVParam.z;\n    v_luv.z = a_lightingMapUVParam.w;\n  #endif\n  }\n#endif\nvoid main () {\n  StandardVertInput In;\n  CCVertInput(In);\n  mat4 matWorld, matWorldIT;\n  CCGetWorldMatrixFull(matWorld, matWorldIT);\n  vec4 pos = matWorld * In.position;\n  v_position = pos.xyz;\n  v_normal = normalize((matWorldIT * vec4(In.normal, 0.0)).xyz);\n  #if USE_NORMAL_MAP\n    v_tangent = normalize((matWorld * vec4(In.tangent.xyz, 0.0)).xyz);\n    v_bitangent = cross(v_normal, v_tangent) * In.tangent.w;\n  #endif\n  v_uv = a_texCoord * tilingOffset.xy + tilingOffset.zw;\n  #if SAMPLE_FROM_RT\n    v_uv = cc_cameraPos.w > 1.0 ? vec2(v_uv.x, 1.0 - v_uv.y) : v_uv;\n  #endif\n  #if HAS_SECOND_UV\n    v_uv1 = a_texCoord1 * tilingOffset.xy + tilingOffset.zw;\n    #if SAMPLE_FROM_RT\n      v_uv1 = cc_cameraPos.w > 1.0 ? vec2(v_uv1.x, 1.0 - v_uv1.y) : v_uv1;\n    #endif\n  #endif\n  #if USE_VERTEX_COLOR\n    v_color = a_color;\n  #endif\n  CC_TRANSFER_FOG(pos);\n  v_shadowPos = cc_matLightViewProj * pos;\n  #if CC_USE_LIGHTMAP && !USE_BATCHING && !CC_FORWARD_ADD\n    CCLightingMapCaclUV();\n  #endif\n  gl_Position = cc_matProj * (cc_matView * matWorld) * In.position;\n}","frag":"\n#ifdef GL_EXT_draw_buffers\n#extension GL_EXT_draw_buffers: enable\n#endif\n#ifdef GL_OES_standard_derivatives\n#extension GL_OES_standard_derivatives: enable\n#endif\n#ifdef GL_EXT_shader_texture_lod\n#extension GL_EXT_shader_texture_lod: enable\n#endif\nprecision highp float;\nuniform highp mat4 cc_matView;\n  uniform highp vec4 cc_cameraPos;\n  uniform mediump vec4 cc_mainLitDir;\n  uniform mediump vec4 cc_mainLitColor;\n  uniform mediump vec4 cc_ambientSky;\n  uniform mediump vec4 cc_ambientGround;\n  uniform mediump vec4 cc_fogColor;\n  uniform mediump vec4 cc_fogBase;\n  uniform mediump vec4 cc_fogAdd;\n  uniform mediump vec4 cc_nearFar;\n  uniform mediump vec4 cc_viewPort;\n     uniform vec4 albedo;\n     uniform vec4 albedoScaleAndCutoff;\n     uniform vec4 pbrParams;\n     uniform vec4 emissive;\n     uniform vec4 emissiveScaleParam;\nfloat LinearFog(vec4 pos) {\n  vec4 wPos = pos;\n  float cam_dis = distance(cc_cameraPos, wPos);\n  float fogStart = cc_fogBase.x;\n  float fogEnd = cc_fogBase.y;\n  return clamp((fogEnd - cam_dis) / (fogEnd - fogStart), 0., 1.);\n}\nfloat ExpFog(vec4 pos) {\n  vec4 wPos = pos;\n  float fogAtten = cc_fogAdd.z;\n  float fogStart = cc_fogBase.x;\n  float fogDensity = cc_fogBase.z;\n  float cam_dis = max(distance(cc_cameraPos, wPos) - fogStart, 0.0) / fogAtten * 4.;\n  float f = exp(-cam_dis * fogDensity);\n  return f;\n}\nfloat ExpSquaredFog(vec4 pos) {\n  vec4 wPos = pos;\n  float fogAtten = cc_fogAdd.z;\n  float fogStart = cc_fogBase.x;\n  float fogDensity = cc_fogBase.z;\n  float cam_dis = max(distance(cc_cameraPos, wPos) - fogStart, 0.0) / fogAtten * 4.;\n  float f = exp(-cam_dis * cam_dis * fogDensity * fogDensity);\n  return f;\n}\nfloat LayeredFog(vec4 pos) {\n  vec4 wPos = pos;\n  float fogAtten = cc_fogAdd.z;\n  float _FogTop = cc_fogAdd.x;\n  float _FogRange = cc_fogAdd.y;\n  vec3 camWorldProj = cc_cameraPos.xyz;\n  camWorldProj.y = 0.;\n  vec3 worldPosProj = wPos.xyz;\n  worldPosProj.y = 0.;\n  float fDeltaD = distance(worldPosProj, camWorldProj) / fogAtten * 2.0;\n  float fDeltaY, fDensityIntegral;\n  if (cc_cameraPos.y > _FogTop) {\n    if (wPos.y < _FogTop) {\n      fDeltaY = (_FogTop - wPos.y) / _FogRange * 2.0;\n      fDensityIntegral = fDeltaY * fDeltaY * 0.5;\n    } else {\n      fDeltaY = 0.;\n      fDensityIntegral = 0.;\n    }\n  } else {\n    if (wPos.y < _FogTop) {\n      float fDeltaA = (_FogTop - cc_cameraPos.y) / _FogRange * 2.;\n      float fDeltaB = (_FogTop - wPos.y) / _FogRange * 2.;\n      fDeltaY = abs(fDeltaA - fDeltaB);\n      fDensityIntegral = abs((fDeltaA * fDeltaA * 0.5) - (fDeltaB * fDeltaB * 0.5));\n    } else {\n      fDeltaY = abs(_FogTop - cc_cameraPos.y) / _FogRange * 2.;\n      fDensityIntegral = abs(fDeltaY * fDeltaY * 0.5);\n    }\n  }\n  float fDensity;\n  if (fDeltaY != 0.) {\n    fDensity = (sqrt(1.0 + ((fDeltaD / fDeltaY) * (fDeltaD / fDeltaY)))) * fDensityIntegral;\n  } else {\n    fDensity = 0.;\n  }\n  float f = exp(-fDensity);\n  return f;\n}\nvoid CC_TRANSFER_FOG_BASE(vec4 pos, out float factor)\n{\n  #if CC_USE_FOG == 0\n\tfactor = LinearFog(pos);\n  #elif CC_USE_FOG == 1\n    factor = ExpFog(pos);\n  #elif CC_USE_FOG == 2\n    factor = ExpSquaredFog(pos);\n  #elif CC_USE_FOG == 3\n    factor = LayeredFog(pos);\n  #else\n    factor = 1.0;\n  #endif\n}\nvoid CC_APPLY_FOG_BASE(inout vec4 color, float factor) {\n  color = vec4(mix(cc_fogColor.rgb, color.rgb, factor), color.a);\n}\n#if !CC_USE_ACCURATE_FOG\nvarying float v_fog_factor;\n#endif\nvoid CC_APPLY_FOG(inout vec4 color) {\n#if !CC_USE_ACCURATE_FOG\n    CC_APPLY_FOG_BASE(color, v_fog_factor);\n#endif\n}\nvoid CC_APPLY_FOG(inout vec4 color, vec3 worldPos) {\n#if CC_USE_ACCURATE_FOG\n    float factor;\n    CC_TRANSFER_FOG_BASE(vec4(worldPos, 1.0), factor);\n#else\n    float factor = v_fog_factor;\n#endif\n    CC_APPLY_FOG_BASE(color, factor);\n}\n#define QUATER_PI         0.78539816340\n#define HALF_PI           1.57079632679\n#define PI                3.14159265359\n#define PI2               6.28318530718\n#define PI4               12.5663706144\n#define INV_QUATER_PI     1.27323954474\n#define INV_HALF_PI       0.63661977237\n#define INV_PI            0.31830988618\n#define INV_PI2           0.15915494309\n#define INV_PI4           0.07957747155\n#define EPSILON           1e-6\n#define EPSILON_LOWP      1e-4\n#define LOG2              1.442695\n#define EXP_VALUE         2.71828183f\n#define FP_MAX            65504.0\n#define FP_SCALE          0.0009765625\n#define FP_SCALE_INV      1024.0\n#define GRAY_VECTOR       vec3(0.299, 0.587, 0.114)\nvec3 SRGBToLinear (vec3 gamma) {\n  return gamma * gamma;\n}\nuniform highp mat4 cc_matLightView;\n  uniform highp vec4 cc_shadowInvProjDepthInfo;\n  uniform highp vec4 cc_shadowProjDepthInfo;\n  uniform highp vec4 cc_shadowProjInfo;\n  uniform mediump vec4 cc_shadowNFLSInfo;\n  uniform mediump vec4 cc_shadowWHPBInfo;\n  uniform mediump vec4 cc_shadowLPNNInfo;\nhighp float unpackHighpData (float mainPart, float modPart) {\n  highp float data = mainPart;\n  return data + modPart;\n}\nhighp float unpackHighpData (float mainPart, float modPart, const float modValue) {\n  highp float data = mainPart * modValue;\n  return data + modPart * modValue;\n}\nhighp vec2 unpackHighpData (vec2 mainPart, vec2 modPart) {\n  highp vec2 data = mainPart;\n  return data + modPart;\n}\nhighp vec2 unpackHighpData (vec2 mainPart, vec2 modPart, const float modValue) {\n  highp vec2 data = mainPart * modValue;\n  return data + modPart * modValue;\n}\nhighp vec3 unpackHighpData (vec3 mainPart, vec3 modPart) {\n  highp vec3 data = mainPart;\n  return data + modPart;\n}\nhighp vec3 unpackHighpData (vec3 mainPart, vec3 modPart, const float modValue) {\n  highp vec3 data = mainPart * modValue;\n  return data + modPart * modValue;\n}\nhighp vec4 unpackHighpData (vec4 mainPart, vec4 modPart) {\n  highp vec4 data = mainPart;\n  return data + modPart;\n}\nhighp vec4 unpackHighpData (vec4 mainPart, vec4 modPart, const float modValue) {\n  highp vec4 data = mainPart * modValue;\n  return data + modPart * modValue;\n}\nfloat CCGetLinearDepthFromViewSpace(vec3 viewPos) {\n  float dist = length(viewPos);\n  return (dist - cc_shadowNFLSInfo.x) / (cc_shadowNFLSInfo.y - cc_shadowNFLSInfo.x);\n}\nfloat CCGetLinearDepth(vec3 worldPos) {\n  vec4 viewStartPos = cc_matLightView * vec4(worldPos.xyz, 1.0);\n  return CCGetLinearDepthFromViewSpace(viewStartPos.xyz);\n}\n#if CC_RECEIVE_SHADOW\n  uniform highp sampler2D cc_shadowMap;\n  uniform highp sampler2D cc_spotLightingMap;\n  vec4 ApplyShadowDepthBias_FaceNormal(vec4 shadowPos, vec3 worldNormal, float normalBias)\n  {\n    vec4 newShadowPos = shadowPos;\n    if(normalBias > EPSILON_LOWP)\n    {\n      vec4 viewNormal = cc_matLightView * vec4(worldNormal, 0.0);\n      if(viewNormal.z < 0.1)\n        newShadowPos.xy += viewNormal.xy * cc_shadowProjInfo.xy * normalBias * clamp(viewNormal.z, 0.001, 0.1);\n    }\n    return newShadowPos;\n  }\n  vec4 ApplyShadowDepthBias_Perspective(vec4 shadowPos, float viewspaceDepthBias)\n  {\n    vec3 viewSpacePos;\n    viewSpacePos.xy = shadowPos.xy * cc_shadowProjInfo.zw;\n    viewSpacePos.z = shadowPos.z * cc_shadowInvProjDepthInfo.x + shadowPos.w * cc_shadowInvProjDepthInfo.y;\n    viewSpacePos.xyz += cc_shadowProjDepthInfo.z * normalize(viewSpacePos.xyz) * viewspaceDepthBias;\n    vec4 clipSpacePos;\n    clipSpacePos.xy = viewSpacePos.xy * cc_shadowProjInfo.xy;\n    clipSpacePos.zw = viewSpacePos.z * cc_shadowProjDepthInfo.xz + vec2(cc_shadowProjDepthInfo.y, 0.0);\n    if (cc_shadowNFLSInfo.z > EPSILON) {\n      clipSpacePos.z = CCGetLinearDepthFromViewSpace(viewSpacePos.xyz);\n      clipSpacePos.z = (clipSpacePos.z * 2.0 - 1.0) * clipSpacePos.w;\n    }\n    return clipSpacePos;\n  }\n  vec4 ApplyShadowDepthBias_Orthographic(vec4 shadowPos, float viewspaceDepthBias)\n  {\n    float coeffA = cc_shadowProjDepthInfo.x;\n    float coeffB = cc_shadowProjDepthInfo.y;\n    float viewSpacePos_z = (shadowPos.z - coeffB) / coeffA;\n    viewSpacePos_z += viewspaceDepthBias;\n    vec4 result = shadowPos;\n    result.z = viewSpacePos_z * coeffA + coeffB;\n    return result;\n  }\n  float CCGetShadowFactorHard (vec4 shadowPos, float bias) {\n    vec4 clipPosNew = ApplyShadowDepthBias_Orthographic(shadowPos, bias);\n    vec3 clipPos = clipPosNew.xyz / clipPosNew.w * 0.5 + 0.5;\n    if (clipPos.x < 0.0 || clipPos.x > 1.0 ||\n        clipPos.y < 0.0 || clipPos.y > 1.0 ||\n        clipPos.z < 0.0 || clipPos.z > 1.0) { return 1.0; }\n    clipPos.xy = cc_cameraPos.w == 1.0 ? vec2(clipPos.xy.x, 1.0 - clipPos.xy.y) : clipPos.xy;\n    float shadow = 0.0;\n    float closestDepth = 0.0;\n    if (cc_shadowLPNNInfo.y > EPSILON) {\n      closestDepth = dot(texture2D(cc_shadowMap, clipPos.xy), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0));\n    } else {\n      closestDepth = texture2D(cc_shadowMap, clipPos.xy).x;\n    }\n    shadow = step(clipPos.z, closestDepth);\n    return shadow;\n  }\n  float CCGetShadowFactorSoft (vec4 shadowPos, float bias) {\n    vec4 clipPosNew = ApplyShadowDepthBias_Orthographic(shadowPos, bias);\n    vec3 clipPos = clipPosNew.xyz / clipPosNew.w * 0.5 + 0.5;\n    if (clipPos.x < 0.0 || clipPos.x > 1.0 ||\n        clipPos.y < 0.0 || clipPos.y > 1.0 ||\n        clipPos.z < 0.0 || clipPos.z > 1.0) { return 1.0; }\n    clipPos.xy = cc_cameraPos.w == 1.0 ? vec2(clipPos.xy.x, 1.0 - clipPos.xy.y) : clipPos.xy;\n    float offsetDepth = clipPos.z;\n    vec2 mapSize = cc_shadowWHPBInfo.xy;\n    vec2 oneTap = 1.0 / mapSize;\n    vec2 clipPos_offset = clipPos.xy + oneTap;\n    float block0, block1, block2, block3;\n    if (cc_shadowLPNNInfo.y > EPSILON) {\n      block0 = step(offsetDepth, dot(texture2D(cc_shadowMap, vec2(clipPos.x, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block1 = step(offsetDepth, dot(texture2D(cc_shadowMap, vec2(clipPos_offset.x, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block2 = step(offsetDepth, dot(texture2D(cc_shadowMap, vec2(clipPos.x, clipPos_offset.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block3 = step(offsetDepth, dot(texture2D(cc_shadowMap, vec2(clipPos_offset.x, clipPos_offset.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n    } else {\n      block0 = step(offsetDepth, texture2D(cc_shadowMap, vec2(clipPos.x, clipPos.y)).x);\n      block1 = step(offsetDepth, texture2D(cc_shadowMap, vec2(clipPos_offset.x, clipPos.y)).x);\n      block2 = step(offsetDepth, texture2D(cc_shadowMap, vec2(clipPos.x, clipPos_offset.y)).x);\n      block3 = step(offsetDepth, texture2D(cc_shadowMap, vec2(clipPos_offset.x, clipPos_offset.y)).x);\n    }\n    float coefX   = mod(clipPos.x, oneTap.x) * mapSize.x;\n    float resultX = mix(block0, block1, coefX);\n    float resultY = mix(block2, block3, coefX);\n    float coefY   = mod(clipPos.y, oneTap.y) * mapSize.y;\n    return mix(resultX, resultY, coefY);\n  }\n  float CCGetShadowFactorSoft2X (vec4 shadowPos, float bias) {\n    vec4 clipPosNew = ApplyShadowDepthBias_Orthographic(shadowPos, bias);\n    vec3 clipPos = clipPosNew.xyz / clipPosNew.w * 0.5 + 0.5;\n    if (clipPos.x < 0.0 || clipPos.x > 1.0 ||\n        clipPos.y < 0.0 || clipPos.y > 1.0 ||\n        clipPos.z < 0.0 || clipPos.z > 1.0) { return 1.0; }\n    clipPos.xy = cc_cameraPos.w == 1.0 ? vec2(clipPos.xy.x, 1.0 - clipPos.xy.y) : clipPos.xy;\n    float offsetDepth = clipPos.z;\n    vec2 mapSize = cc_shadowWHPBInfo.xy;\n    vec2 oneTap = 1.0 / mapSize;\n    float clipPos_offset_L = clipPos.x - oneTap.x;\n    float clipPos_offset_R = clipPos.x + oneTap.x;\n    float clipPos_offset_U = clipPos.y - oneTap.y;\n    float clipPos_offset_D = clipPos.y + oneTap.y;\n    float block0, block1, block2, block3, block4, block5, block6, block7, block8;\n    if (cc_shadowLPNNInfo.y > EPSILON) {\n      block0 = step(offsetDepth, dot(texture2D(cc_shadowMap, vec2(clipPos_offset_L, clipPos_offset_U)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block1 = step(offsetDepth, dot(texture2D(cc_shadowMap, vec2(clipPos.x, clipPos_offset_U)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block2 = step(offsetDepth, dot(texture2D(cc_shadowMap, vec2(clipPos_offset_R, clipPos_offset_U)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block3 = step(offsetDepth, dot(texture2D(cc_shadowMap, vec2(clipPos_offset_L, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block4 = step(offsetDepth, dot(texture2D(cc_shadowMap, vec2(clipPos.x, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block5 = step(offsetDepth, dot(texture2D(cc_shadowMap, vec2(clipPos_offset_R, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block6 = step(offsetDepth, dot(texture2D(cc_shadowMap, vec2(clipPos_offset_L, clipPos_offset_D)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block7 = step(offsetDepth, dot(texture2D(cc_shadowMap, vec2(clipPos.x, clipPos_offset_D)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block8 = step(offsetDepth, dot(texture2D(cc_shadowMap, vec2(clipPos_offset_R, clipPos_offset_D)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n    } else {\n      block0 = step(offsetDepth, texture2D(cc_shadowMap, vec2(clipPos_offset_L, clipPos_offset_U)).x);\n      block1 = step(offsetDepth, texture2D(cc_shadowMap, vec2(clipPos.x, clipPos_offset_U)).x);\n      block2 = step(offsetDepth, texture2D(cc_shadowMap, vec2(clipPos_offset_R, clipPos_offset_U)).x);\n      block3 = step(offsetDepth, texture2D(cc_shadowMap, vec2(clipPos_offset_L, clipPos.y)).x);\n      block4 = step(offsetDepth, texture2D(cc_shadowMap, vec2(clipPos.x, clipPos.y)).x);\n      block5 = step(offsetDepth, texture2D(cc_shadowMap, vec2(clipPos_offset_R, clipPos.y)).x);\n      block6 = step(offsetDepth, texture2D(cc_shadowMap, vec2(clipPos_offset_L, clipPos_offset_D)).x);\n      block7 = step(offsetDepth, texture2D(cc_shadowMap, vec2(clipPos.x, clipPos_offset_D)).x);\n      block8 = step(offsetDepth, texture2D(cc_shadowMap, vec2(clipPos_offset_R, clipPos_offset_D)).x);\n    }\n    float coefX = mod(clipPos.x, oneTap.x) * mapSize.x;\n    float coefY = mod(clipPos.y, oneTap.y) * mapSize.y;\n    float shadow = 0.0;\n    float resultX = mix(block0, block1, coefX);\n    float resultY = mix(block3, block4, coefX);\n    shadow += mix(resultX , resultY, coefY);\n    resultX = mix(block1, block2, coefX);\n    resultY = mix(block4, block5, coefX);\n    shadow += mix(resultX , resultY, coefY);\n    resultX = mix(block3, block4, coefX);\n    resultY = mix(block6, block7, coefX);\n    shadow += mix(resultX, resultY, coefY);\n    resultX = mix(block4, block5, coefX);\n    resultY = mix(block7, block8, coefX);\n    shadow += mix(resultX, resultY, coefY);\n    return shadow * 0.25;\n  }\n  float CCGetSpotLightShadowFactorHard (vec4 shadowPos, vec3 worldPos, float bias) {\n    vec4 clipPosNew = ApplyShadowDepthBias_Perspective(shadowPos, bias);\n    vec3 clipPos = clipPosNew.xyz / clipPosNew.w * 0.5 + 0.5;\n    if (clipPos.x < 0.0 || clipPos.x > 1.0 ||\n        clipPos.y < 0.0 || clipPos.y > 1.0 ||\n        clipPos.z < 0.0 || clipPos.z > 1.0) { return 1.0; }\n    clipPos.xy = cc_cameraPos.w == 1.0 ? vec2(clipPos.xy.x, 1.0 - clipPos.xy.y) : clipPos.xy;\n    float shadow = 0.0;\n    float closestDepth = 0.0;\n    float depth = clipPos.z;\n    if (cc_shadowLPNNInfo.y > EPSILON) {\n      closestDepth = dot(texture2D(cc_spotLightingMap, clipPos.xy), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0));\n    } else {\n      closestDepth = texture2D(cc_spotLightingMap, clipPos.xy).x;\n    }\n    shadow = step(depth, closestDepth);\n    return shadow;\n  }\n  float CCGetSpotLightShadowFactorSoft (vec4 shadowPos, vec3 worldPos, float bias) {\n    vec4 clipPosNew = ApplyShadowDepthBias_Perspective(shadowPos, bias);\n    vec3 clipPos = clipPosNew.xyz / clipPosNew.w * 0.5 + 0.5;\n    if (clipPos.x < 0.0 || clipPos.x > 1.0 ||\n        clipPos.y < 0.0 || clipPos.y > 1.0 ||\n        clipPos.z < 0.0 || clipPos.z > 1.0) { return 1.0; }\n    clipPos.xy = cc_cameraPos.w == 1.0 ? vec2(clipPos.xy.x, 1.0 - clipPos.xy.y) : clipPos.xy;\n    float depth = 0.0;\n    if (cc_shadowNFLSInfo.z > EPSILON) {\n      depth = CCGetLinearDepth(worldPos);\n    } else {\n      depth = clipPos.z;\n    }\n    vec2 oneTap = 1.0 / cc_shadowWHPBInfo.xy;\n    vec2 clipPos_offset = clipPos.xy + oneTap;\n    float block0, block1, block2, block3;\n    if (cc_shadowLPNNInfo.y > EPSILON) {\n      block0 = step(depth, dot(texture2D(cc_spotLightingMap, vec2(clipPos.x, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block1 = step(depth, dot(texture2D(cc_spotLightingMap, vec2(clipPos_offset.x, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block2 = step(depth, dot(texture2D(cc_spotLightingMap, vec2(clipPos.x, clipPos_offset.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block3 = step(depth, dot(texture2D(cc_spotLightingMap, vec2(clipPos_offset.x, clipPos_offset.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n    } else {\n      block0 = step(depth, texture2D(cc_spotLightingMap, vec2(clipPos.x, clipPos.y)).x);\n      block1 = step(depth, texture2D(cc_spotLightingMap, vec2(clipPos_offset.x, clipPos.y)).x);\n      block2 = step(depth, texture2D(cc_spotLightingMap, vec2(clipPos.x, clipPos_offset.y)).x);\n      block3 = step(depth, texture2D(cc_spotLightingMap, vec2(clipPos_offset.x, clipPos_offset.y)).x);\n    }\n    float coefX   = mod(clipPos.x, oneTap.x) * cc_shadowWHPBInfo.x;\n    float resultX = mix(block0, block1, coefX);\n    float resultY = mix(block2, block3, coefX);\n    float coefY   = mod(clipPos.y, oneTap.y) * cc_shadowWHPBInfo.y;\n    return mix(resultX, resultY, coefY);\n  }\n  float CCGetSpotLightShadowFactorSoft2X (vec4 shadowPos, vec3 worldPos, float bias) {\n    vec4 clipPosNew = ApplyShadowDepthBias_Perspective(shadowPos, bias);\n    vec3 clipPos = clipPosNew.xyz / clipPosNew.w * 0.5 + 0.5;\n    if (clipPos.x < 0.0 || clipPos.x > 1.0 ||\n        clipPos.y < 0.0 || clipPos.y > 1.0 ||\n        clipPos.z < 0.0 || clipPos.z > 1.0) { return 1.0; }\n    clipPos.xy = cc_cameraPos.w == 1.0 ? vec2(clipPos.xy.x, 1.0 - clipPos.xy.y) : clipPos.xy;\n    float depth = 0.0;\n    if (cc_shadowNFLSInfo.z > EPSILON) {\n      depth = CCGetLinearDepth(worldPos);\n    } else {\n      depth = clipPos.z;\n    }\n    vec2 mapSize = cc_shadowWHPBInfo.xy;\n    vec2 oneTap = 1.0 / mapSize;\n    float clipPos_offset_L = clipPos.x - oneTap.x;\n    float clipPos_offset_R = clipPos.x + oneTap.x;\n    float clipPos_offset_U = clipPos.y - oneTap.y;\n    float clipPos_offset_D = clipPos.y + oneTap.y;\n    float block0, block1, block2, block3, block4, block5, block6, block7, block8;\n    if (cc_shadowLPNNInfo.y > EPSILON) {\n      block0 = step(depth, dot(texture2D(cc_spotLightingMap, vec2(clipPos_offset_L, clipPos_offset_U)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block1 = step(depth, dot(texture2D(cc_spotLightingMap, vec2(clipPos.x, clipPos_offset_U)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block2 = step(depth, dot(texture2D(cc_spotLightingMap, vec2(clipPos_offset_R, clipPos_offset_U)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block3 = step(depth, dot(texture2D(cc_spotLightingMap, vec2(clipPos_offset_L, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block4 = step(depth, dot(texture2D(cc_spotLightingMap, vec2(clipPos.x, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block5 = step(depth, dot(texture2D(cc_spotLightingMap, vec2(clipPos_offset_R, clipPos.y)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block6 = step(depth, dot(texture2D(cc_spotLightingMap, vec2(clipPos_offset_L, clipPos_offset_D)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block7 = step(depth, dot(texture2D(cc_spotLightingMap, vec2(clipPos.x, clipPos_offset_D)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n      block8 = step(depth, dot(texture2D(cc_spotLightingMap, vec2(clipPos_offset_R, clipPos_offset_D)), vec4(1.0, 1.0 / 255.0, 1.0 / 65025.0, 1.0 / 16581375.0)));\n    } else {\n      block0 = step(depth, texture2D(cc_spotLightingMap, vec2(clipPos_offset_L, clipPos_offset_U)).x);\n      block1 = step(depth, texture2D(cc_spotLightingMap, vec2(clipPos.x, clipPos_offset_U)).x);\n      block2 = step(depth, texture2D(cc_spotLightingMap, vec2(clipPos_offset_R, clipPos_offset_U)).x);\n      block3 = step(depth, texture2D(cc_spotLightingMap, vec2(clipPos_offset_L, clipPos.y)).x);\n      block4 = step(depth, texture2D(cc_spotLightingMap, vec2(clipPos.x, clipPos.y)).x);\n      block5 = step(depth, texture2D(cc_spotLightingMap, vec2(clipPos_offset_R, clipPos.y)).x);\n      block6 = step(depth, texture2D(cc_spotLightingMap, vec2(clipPos_offset_L, clipPos_offset_D)).x);\n      block7 = step(depth, texture2D(cc_spotLightingMap, vec2(clipPos.x, clipPos_offset_D)).x);\n      block8 = step(depth, texture2D(cc_spotLightingMap, vec2(clipPos_offset_R, clipPos_offset_D)).x);\n    }\n    float coefX = mod(clipPos.x, oneTap.x) * mapSize.x;\n    float coefY = mod(clipPos.y, oneTap.y) * mapSize.y;\n    float shadow = 0.0;\n    float resultX = mix(block0, block1, coefX);\n    float resultY = mix(block3, block4, coefX);\n    shadow += mix(resultX , resultY, coefY);\n    resultX = mix(block1, block2, coefX);\n    resultY = mix(block4, block5, coefX);\n    shadow += mix(resultX , resultY, coefY);\n    resultX = mix(block3, block4, coefX);\n    resultY = mix(block6, block7, coefX);\n    shadow += mix(resultX, resultY, coefY);\n    resultX = mix(block4, block5, coefX);\n    resultY = mix(block7, block8, coefX);\n    shadow += mix(resultX, resultY, coefY);\n    return shadow * 0.25;\n  }\nfloat CCSpotShadowFactorBase(vec4 shadowPos, vec3 worldPos, vec2 shadowBias)\n{\n  float pcf = cc_shadowWHPBInfo.z;\n  if (pcf > 1.9) {\n    return CCGetSpotLightShadowFactorSoft2X(shadowPos, worldPos, shadowBias.x);\n  }else if (pcf > 0.9) {\n    return CCGetSpotLightShadowFactorSoft(shadowPos, worldPos, shadowBias.x);\n  }else {\n    return CCGetSpotLightShadowFactorHard(shadowPos, worldPos, shadowBias.x);\n  }\n}\nfloat CCShadowFactorBase(vec4 shadowPos, vec3 N, vec2 shadowBias)\n{\n  float realtimeShadow = 1.0;\n  vec4 pos = ApplyShadowDepthBias_FaceNormal(shadowPos, N, shadowBias.y);\n  float pcf = cc_shadowWHPBInfo.z;\n  if (pcf > 1.9) {\n    realtimeShadow =  CCGetShadowFactorSoft2X(pos, shadowBias.x);\n  }else if (pcf > 0.9) {\n    realtimeShadow = CCGetShadowFactorSoft(pos, shadowBias.x);\n  }else {\n    realtimeShadow = CCGetShadowFactorHard(pos, shadowBias.x);\n  }\n  return mix(realtimeShadow, 1.0, cc_shadowNFLSInfo.w);\n}\n#endif\n#if CC_USE_IBL\n  uniform samplerCube cc_environment;\n  vec4 fragTextureLod (sampler2D tex, vec2 coord, float lod) {\n      #ifdef GL_EXT_shader_texture_lod\n        return texture2DLodEXT(tex, coord, lod);\n      #else\n        return texture2D(tex, coord, lod);\n      #endif\n  }\n  vec4 fragTextureLod (samplerCube tex, vec3 coord, float lod) {\n      #ifdef GL_EXT_shader_texture_lod\n        return textureCubeLodEXT(tex, coord, lod);\n      #else\n        return textureCube(tex, coord, lod);\n      #endif\n  }\n  vec3 unpackRGBE (vec4 rgbe) {\n    return rgbe.rgb * pow(1.1, rgbe.a * 255.0 - 128.0);\n  }\n  #if CC_USE_DIFFUSEMAP\n    uniform samplerCube cc_diffuseMap;\n  #endif\n#endif\nfloat GGXMobile (float roughness, float NoH, vec3 H, vec3 N) {\n  vec3 NxH = cross(N, H);\n  float OneMinusNoHSqr = dot(NxH, NxH);\n  float a = roughness * roughness;\n  float n = NoH * a;\n  float p = a / (OneMinusNoHSqr + n * n);\n  return p * p;\n}\nfloat CalcSpecular (float roughness, float NoH, vec3 H, vec3 N) {\n  return (roughness * 0.25 + 0.25) * GGXMobile(roughness, NoH, H, N);\n}\nvec3 BRDFApprox (vec3 specular, float roughness, float NoV) {\n  const vec4 c0 = vec4(-1.0, -0.0275, -0.572, 0.022);\n  const vec4 c1 = vec4(1.0, 0.0425, 1.04, -0.04);\n  vec4 r = roughness * c0 + c1;\n  float a004 = min(r.x * r.x, exp2(-9.28 * NoV)) * r.x + r.y;\n  vec2 AB = vec2(-1.04, 1.04) * a004 + r.zw;\n  AB.y *= clamp(50.0 * specular.g, 0.0, 1.0);\n  return specular * AB.x + AB.y;\n}\n#if USE_REFLECTION_DENOISE\n  vec3 GetEnvReflectionWithMipFiltering(vec3 R, float roughness, float mipCount, float denoiseIntensity) {\n    #if CC_USE_IBL\n    \tfloat mip = roughness * mipCount;\n    \tfloat delta = (dot(dFdx(R), dFdy(R))) * 1000.0;\n    \tfloat mipBias = mix(0.0, 5.0, clamp(delta, 0.0, 1.0));\n    \tvec4 biased = fragTextureLod(cc_environment, R, mip + mipBias);\n     \tvec4 filtered = textureCube(cc_environment, R);\n      #if CC_USE_IBL == 2\n      \tbiased.rgb = unpackRGBE(biased);\n      \tfiltered.rgb = unpackRGBE(filtered);\n      #else\n      \tbiased.rgb = SRGBToLinear(biased.rgb);\n      \tfiltered.rgb = SRGBToLinear(filtered.rgb);\n      #endif\n      return mix(biased.rgb, filtered.rgb, denoiseIntensity);\n    #else\n      return vec3(0.0, 0.0, 0.0);\n    #endif\n  }\n#endif\nstruct StandardSurface {\n  vec4 albedo;\n  #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\n  vec3 position, position_fract_part;\n  #else\n  vec3 position;\n  #endif\n  vec3 normal;\n  vec3 emissive;\n  vec3 lightmap;\n  float lightmap_test;\n  float roughness;\n  float metallic;\n  float occlusion;\n  float specularIntensity;\n  #if CC_RECEIVE_SHADOW\n    vec2 shadowBias;\n  #endif\n};\nvec4 CCStandardShadingBase (StandardSurface s, vec4 shadowPos) {\n  vec3 diffuse = s.albedo.rgb * (1.0 - s.metallic);\n  vec3 specular = mix(vec3(0.08 * s.specularIntensity), s.albedo.rgb, s.metallic);\n  vec3 position;\n  #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\n  position = unpackHighpData(s.position, s.position_fract_part);\n  #else\n  position = s.position;\n  #endif\n  vec3 N = normalize(s.normal);\n  vec3 V = normalize(cc_cameraPos.xyz - position);\n  float NV = max(abs(dot(N, V)), 0.0);\n  specular = BRDFApprox(specular, s.roughness, NV);\n  vec3 L = normalize(-cc_mainLitDir.xyz);\n  vec3 H = normalize(L + V);\n  float NH = max(dot(N, H), 0.0);\n  float NL = max(dot(N, L), 0.0);\n  vec3 finalColor = NL * cc_mainLitColor.rgb * cc_mainLitColor.w;\n  vec3 diffuseContrib = diffuse / PI;\n  vec3 specularContrib = specular * CalcSpecular(s.roughness, NH, H, N);\n  vec3 dirlightContrib = (diffuseContrib + specularContrib);\n  float shadow = 1.0;\n  #if CC_RECEIVE_SHADOW\n    if (NL > 0.0 && cc_mainLitDir.w > 0.0) {\n      shadow = CCShadowFactorBase(shadowPos, N, s.shadowBias);\n    }\n  #endif\n  dirlightContrib *= shadow;\n  finalColor *= dirlightContrib;\n  #if CC_USE_LIGHTMAP && !USE_BATCHING && !CC_FORWARD_ADD\n    if (s.lightmap_test > EPSILON_LOWP) {\n      finalColor = diffuse * s.lightmap.rgb * shadow;\n    }\n  #endif\n  float fAmb = 0.5 - N.y * 0.5;\n  vec3 ambDiff = mix(cc_ambientSky.rgb, cc_ambientGround.rgb, fAmb);\n  #if CC_USE_IBL\n    #if CC_USE_DIFFUSEMAP\n      vec4 diffuseMap = textureCube(cc_diffuseMap, N);\n      #if CC_USE_DIFFUSEMAP == 2\n        ambDiff = unpackRGBE(diffuseMap);\n      #else\n        ambDiff = SRGBToLinear(diffuseMap.rgb);\n      #endif\n    #endif\n    vec3 R = normalize(reflect(-V, N));\n    #if USE_REFLECTION_DENOISE\n      vec3 env = GetEnvReflectionWithMipFiltering(R, s.roughness, cc_ambientGround.w, 0.6);\n    #else\n      vec4 envmap = fragTextureLod(cc_environment, R, s.roughness * cc_ambientGround.w);\n      #if CC_USE_IBL == 2\n        vec3 env = unpackRGBE(envmap);\n      #else\n        vec3 env = SRGBToLinear(envmap.rgb);\n      #endif\n    #endif\n    finalColor += env * cc_ambientSky.w * specular * s.occlusion;\n  #endif\n  finalColor += ambDiff.rgb * cc_ambientSky.w * diffuse * s.occlusion;\n  finalColor += s.emissive;\n  return vec4(finalColor, s.albedo.a);\n}\nvec3 ACESToneMap (vec3 color) {\n  color = min(color, vec3(8.0));\n  const float A = 2.51;\n  const float B = 0.03;\n  const float C = 2.43;\n  const float D = 0.59;\n  const float E = 0.14;\n  return (color * (A * color + B)) / (color * (C * color + D) + E);\n}\nvec4 CCFragOutput (vec4 color) {\n  #if CC_USE_HDR\n    color.rgb = ACESToneMap(color.rgb);\n  #endif\n  color.rgb = sqrt(color.rgb);\n  return color;\n}\nvarying highp vec4 v_shadowPos;\n#if CC_RECEIVE_SHADOW\n#endif\n#if CC_USE_LIGHTMAP && !USE_BATCHING && !CC_FORWARD_ADD\n  varying vec3 v_luv;\n  uniform sampler2D cc_lightingMap;\n#endif\nvarying vec3 v_position;\nvarying vec2 v_uv;\nvarying vec2 v_uv1;\nvarying vec3 v_normal;\n#if USE_VERTEX_COLOR\n  varying vec4 v_color;\n#endif\n#if USE_ALBEDO_MAP\n  uniform sampler2D albedoMap;\n#endif\n#if USE_NORMAL_MAP\n  varying vec3 v_tangent;\n  varying vec3 v_bitangent;\n  uniform sampler2D normalMap;\n#endif\n#if USE_PBR_MAP\n  uniform sampler2D pbrMap;\n#endif\n#if USE_METALLIC_ROUGHNESS_MAP\n  uniform sampler2D metallicRoughnessMap;\n#endif\n#if USE_OCCLUSION_MAP\n  uniform sampler2D occlusionMap;\n#endif\n#if USE_EMISSIVE_MAP\n  uniform sampler2D emissiveMap;\n#endif\n#if USE_ALPHA_TEST\n#endif\nvoid surf (out StandardSurface s) {\n  vec4 baseColor = albedo;\n  #if USE_VERTEX_COLOR\n    baseColor *= v_color;\n  #endif\n  #if USE_ALBEDO_MAP\n    vec4 texColor = texture2D(albedoMap, ALBEDO_UV);\n    texColor.rgb = SRGBToLinear(texColor.rgb);\n    baseColor *= texColor;\n  #endif\n  s.albedo = baseColor;\n  s.albedo.rgb *= albedoScaleAndCutoff.xyz;\n  #if USE_ALPHA_TEST\n    if (s.albedo.ALPHA_TEST_CHANNEL < albedoScaleAndCutoff.w) discard;\n  #endif\n  #if CC_USE_LIGHTMAP && !USE_BATCHING && !CC_FORWARD_ADD\n    vec4 lightColor = texture2D(cc_lightingMap, v_luv.xy);\n    s.lightmap = lightColor.rgb;\n    s.lightmap_test = v_luv.z;\n  #endif\n  s.normal = v_normal;\n  #if USE_NORMAL_MAP\n    vec3 nmmp = texture2D(normalMap, NORMAL_UV).xyz - vec3(0.5);\n    s.normal =\n      (nmmp.x * pbrParams.w) * normalize(v_tangent) +\n      (nmmp.y * pbrParams.w) * normalize(v_bitangent) +\n      nmmp.z * normalize(s.normal);\n  #endif\n  s.position = v_position;\n  vec4 pbr = pbrParams;\n  #if USE_PBR_MAP\n    vec4 res = texture2D(pbrMap, PBR_UV);\n    pbr.x *= res.r;\n    pbr.y *= res.g;\n    pbr.z *= res.b;\n  #endif\n  #if USE_METALLIC_ROUGHNESS_MAP\n    vec4 metallicRoughness = texture2D(metallicRoughnessMap, PBR_UV);\n    pbr.z *= metallicRoughness.b;\n    pbr.y *= metallicRoughness.g;\n  #endif\n  #if USE_OCCLUSION_MAP\n    pbr.x *= texture2D(occlusionMap, PBR_UV).r;\n  #endif\n  s.occlusion = clamp(pbr.x, 0.0, 0.96);\n  s.roughness = clamp(pbr.y, 0.04, 1.0);\n  s.specularIntensity = 0.5;\n  s.metallic = pbr.z;\n  s.emissive = emissive.rgb * emissiveScaleParam.xyz;\n  #if USE_EMISSIVE_MAP\n    s.emissive *= SRGBToLinear(texture2D(emissiveMap, EMISSIVE_UV).rgb);\n  #endif\n}\n#if CC_FORWARD_ADD\n  #if CC_PIPELINE_TYPE == 0\n    #define LIGHTS_PER_PASS 1\n  #else\n    #define LIGHTS_PER_PASS 10\n  #endif\n  #if CC_ENABLE_CLUSTERED_LIGHT_CULLING == 0\n  uniform highp vec4 cc_lightPos[LIGHTS_PER_PASS];\n  uniform vec4 cc_lightColor[LIGHTS_PER_PASS];\n  uniform vec4 cc_lightSizeRangeAngle[LIGHTS_PER_PASS];\n  uniform vec4 cc_lightDir[LIGHTS_PER_PASS];\n  #endif\n  float SmoothDistAtt (float distSqr, float invSqrAttRadius) {\n    float factor = distSqr * invSqrAttRadius;\n    float smoothFactor = clamp(1.0 - factor * factor, 0.0, 1.0);\n    return smoothFactor * smoothFactor;\n  }\n  float GetDistAtt (float distSqr, float invSqrAttRadius) {\n    float attenuation = 1.0 / max(distSqr, 0.01*0.01);\n    attenuation *= SmoothDistAtt(distSqr , invSqrAttRadius);\n    return attenuation;\n  }\n  float GetAngleAtt (vec3 L, vec3 litDir, float litAngleScale, float litAngleOffset) {\n    float cd = dot(litDir, L);\n    float attenuation = clamp(cd * litAngleScale + litAngleOffset, 0.0, 1.0);\n    return (attenuation * attenuation);\n  }\n  #if CC_ENABLE_CLUSTERED_LIGHT_CULLING == 0\n  vec4 CCStandardShadingAdditive (StandardSurface s, vec4 shadowPos) {\n    vec3 position;\n    #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\n    position = unpackHighpData(s.position, s.position_fract_part);\n    #else\n    position = s.position;\n    #endif\n    vec3 diffuse = s.albedo.rgb * (1.0 - s.metallic);\n    vec3 specular = mix(vec3(0.04), s.albedo.rgb, s.metallic);\n    vec3 diffuseContrib = diffuse / PI;\n    vec3 N = normalize(s.normal);\n    vec3 V = normalize(cc_cameraPos.xyz - position);\n    float NV = max(abs(dot(N, V)), 0.0);\n    specular = BRDFApprox(specular, s.roughness, NV);\n    vec3 finalColor = vec3(0.0);\n    int numLights = CC_PIPELINE_TYPE == 0 ? LIGHTS_PER_PASS : int(cc_lightDir[0].w);\n    for (int i = 0; i < LIGHTS_PER_PASS; i++) {\n      if (i >= numLights) break;\n      vec3 SLU = cc_lightPos[i].xyz - position;\n      vec3 SL = normalize(SLU);\n      vec3 SH = normalize(SL + V);\n      float SNL = max(dot(N, SL), 0.0);\n      float SNH = max(dot(N, SH), 0.0);\n      float distSqr = dot(SLU, SLU);\n      float litRadius = cc_lightSizeRangeAngle[i].x;\n      float litRadiusSqr = litRadius * litRadius;\n      float illum = litRadiusSqr / max(litRadiusSqr, distSqr);\n      float attRadiusSqrInv = 1.0 / max(cc_lightSizeRangeAngle[i].y, 0.01);\n      attRadiusSqrInv *= attRadiusSqrInv;\n      float att = GetDistAtt(distSqr, attRadiusSqrInv);\n      vec3 lspec = specular * CalcSpecular(s.roughness, SNH, SH, N);\n      if (cc_lightPos[i].w > 0.0) {\n        float cosInner = max(dot(-cc_lightDir[i].xyz, SL), 0.01);\n        float cosOuter = cc_lightSizeRangeAngle[i].z;\n        float litAngleScale = 1.0 / max(0.001, cosInner - cosOuter);\n        float litAngleOffset = -cosOuter * litAngleScale;\n        att *= GetAngleAtt(SL, -cc_lightDir[i].xyz, litAngleScale, litAngleOffset);\n      }\n      vec3 lightColor = cc_lightColor[i].rgb;\n      float shadow = 1.0;\n      #if CC_RECEIVE_SHADOW\n        if (cc_lightPos[i].w > 0.0 && cc_lightSizeRangeAngle[i].w > 0.0) {\n          shadow = CCSpotShadowFactorBase(shadowPos, position, s.shadowBias);\n        }\n      #endif\n      lightColor *= shadow;\n      finalColor += SNL * lightColor * cc_lightColor[i].w * illum * att * (diffuseContrib + lspec);\n    }\n    return vec4(finalColor, 0.0);\n  }\n  #endif\n  #if CC_ENABLE_CLUSTERED_LIGHT_CULLING == 1\n  readonly buffer b_ccLightsBuffer { vec4 b_ccLights[]; };\n  readonly buffer b_clusterLightIndicesBuffer { uint b_clusterLightIndices[]; };\n  readonly buffer b_clusterLightGridBuffer { uvec4 b_clusterLightGrid[]; };\n  struct CCLight\n  {\n    vec4 cc_lightPos;\n    vec4 cc_lightColor;\n    vec4 cc_lightSizeRangeAngle;\n    vec4 cc_lightDir;\n  };\n  struct Cluster\n  {\n    vec3 minBounds;\n    vec3 maxBounds;\n  };\n  struct LightGrid\n  {\n    uint offset;\n    uint ccLights;\n  };\n  CCLight getCCLight(uint i)\n  {\n    CCLight light;\n    light.cc_lightPos = b_ccLights[4u * i + 0u];\n    light.cc_lightColor = b_ccLights[4u * i + 1u];\n    light.cc_lightSizeRangeAngle = b_ccLights[4u * i + 2u];\n    light.cc_lightDir = b_ccLights[4u * i + 3u];\n    return light;\n  }\n  LightGrid getLightGrid(uint cluster)\n  {\n    uvec4 gridvec = b_clusterLightGrid[cluster];\n    LightGrid grid;\n    grid.offset = gridvec.x;\n    grid.ccLights = gridvec.y;\n    return grid;\n  }\n  uint getGridLightIndex(uint start, uint offset)\n  {\n    return b_clusterLightIndices[start + offset];\n  }\n  uint getClusterZIndex(vec4 worldPos)\n  {\n    float scale = float(24) / log(cc_nearFar.y / cc_nearFar.x);\n    float bias = -(float(24) * log(cc_nearFar.x) / log(cc_nearFar.y / cc_nearFar.x));\n    float eyeDepth = -(cc_matView * worldPos).z;\n    uint zIndex = uint(max(log(eyeDepth) * scale + bias, 0.0));\n    return zIndex;\n  }\n  uint getClusterIndex(vec4 fragCoord, vec4 worldPos)\n  {\n    uint zIndex = getClusterZIndex(worldPos);\n    float clusterSizeX = ceil(cc_viewPort.z / float(16));\n    float clusterSizeY = ceil(cc_viewPort.w / float(8));\n    uvec3 indices = uvec3(uvec2(fragCoord.xy / vec2(clusterSizeX, clusterSizeY)), zIndex);\n    uint cluster = (16u * 8u) * indices.z + 16u * indices.y + indices.x;\n    return cluster;\n  }\n  vec4 CCClusterShadingAdditive (StandardSurface s, vec4 shadowPos) {\n    vec3 diffuse = s.albedo.rgb * (1.0 - s.metallic);\n    vec3 specular = mix(vec3(0.04), s.albedo.rgb, s.metallic);\n    vec3 diffuseContrib = diffuse / PI;\n    vec3 position;\n    #if CC_PLATFORM_ANDROID_AND_WEBGL && CC_ENABLE_WEBGL_HIGHP_STRUCT_VALUES\n    position = unpackHighpData(s.position, s.position_fract_part);\n    #else\n    position = s.position;\n    #endif\n    vec3 N = normalize(s.normal);\n    vec3 V = normalize(cc_cameraPos.xyz - position);\n    float NV = max(abs(dot(N, V)), 0.001);\n    specular = BRDFApprox(specular, s.roughness, NV);\n    vec3 finalColor = vec3(0.0);\n    uint cluster = getClusterIndex(gl_FragCoord, vec4(position, 1.0));\n    LightGrid grid = getLightGrid(cluster);\n    uint numLights = grid.ccLights;\n    for (uint i = 0u; i < 100u; i++) {\n      if (i >= numLights) break;\n      uint lightIndex = getGridLightIndex(grid.offset, i);\n      CCLight light = getCCLight(lightIndex);\n      vec3 SLU = light.cc_lightPos.xyz - position;\n      vec3 SL = normalize(SLU);\n      vec3 SH = normalize(SL + V);\n      float SNL = max(dot(N, SL), 0.001);\n      float SNH = max(dot(N, SH), 0.0);\n      float distSqr = dot(SLU, SLU);\n      float litRadius = light.cc_lightSizeRangeAngle.x;\n      float litRadiusSqr = litRadius * litRadius;\n      float illum = PI * (litRadiusSqr / max(litRadiusSqr , distSqr));\n      float attRadiusSqrInv = 1.0 / max(light.cc_lightSizeRangeAngle.y, 0.01);\n      attRadiusSqrInv *= attRadiusSqrInv;\n      float att = GetDistAtt(distSqr, attRadiusSqrInv);\n      vec3 lspec = specular * CalcSpecular(s.roughness, SNH, SH, N);\n      if (light.cc_lightPos.w > 0.0) {\n        float cosInner = max(dot(-light.cc_lightDir.xyz, SL), 0.01);\n        float cosOuter = light.cc_lightSizeRangeAngle.z;\n        float litAngleScale = 1.0 / max(0.001, cosInner - cosOuter);\n        float litAngleOffset = -cosOuter * litAngleScale;\n        att *= GetAngleAtt(SL, -light.cc_lightDir.xyz, litAngleScale, litAngleOffset);\n      }\n      vec3 lightColor = light.cc_lightColor.rgb;\n      float shadow = 1.0;\n      #if CC_RECEIVE_SHADOW\n        if (light.cc_lightPos.w > 0.0) {\n          shadow = CCSpotShadowFactorBase(shadowPos, position, s.shadowBias);\n        }\n      #endif\n      lightColor *= shadow;\n      finalColor += SNL * lightColor * light.cc_lightColor.w * illum * att * (diffuseContrib + lspec);\n    }\n    return vec4(finalColor, 0.0);\n  }\n  #endif\n  void main () {\n    StandardSurface s; surf(s);\n    #if CC_ENABLE_CLUSTERED_LIGHT_CULLING == 1\n    vec4 color = CCClusterShadingAdditive(s, v_shadowPos);\n    #else\n    vec4 color = CCStandardShadingAdditive(s, v_shadowPos);\n    #endif\n    gl_FragData[0] = CCFragOutput(color);\n  }\n#elif (CC_PIPELINE_TYPE == 0 || CC_FORCE_FORWARD_SHADING)\n  void main () {\n    StandardSurface s; surf(s);\n    vec4 color = CCStandardShadingBase(s, v_shadowPos);\n    CC_APPLY_FOG(color, s.position.xyz);\n    gl_FragData[0] = CCFragOutput(color);\n  }\n#elif CC_PIPELINE_TYPE == 1\n  vec2 signNotZero(vec2 v) {\n    return vec2((v.x >= 0.0) ? +1.0 : -1.0, (v.y >= 0.0) ? +1.0 : -1.0);\n  }\n  vec2 float32x3_to_oct(in vec3 v) {\n    vec2 p = v.xy * (1.0 / (abs(v.x) + abs(v.y) + abs(v.z)));\n    return (v.z <= 0.0) ? ((1.0 - abs(p.yx)) * signNotZero(p)) : p;\n  }\n  void main () {\n    StandardSurface s; surf(s);\n    gl_FragData[0] = s.albedo;\n    gl_FragData[1] = vec4(float32x3_to_oct(s.normal), s.roughness, s.metallic);\n    gl_FragData[2] = vec4(s.emissive, s.occlusion);\n  }\n#endif"},"builtins":{"globals":{"blocks":[{"name":"CCGlobal","defines":[]},{"name":"CCCamera","defines":[]},{"name":"CCShadow","defines":[]}],"samplerTextures":[{"name":"cc_shadowMap","defines":["CC_RECEIVE_SHADOW"]},{"name":"cc_spotLightingMap","defines":["CC_RECEIVE_SHADOW"]},{"name":"cc_environment","defines":["CC_USE_IBL"]},{"name":"cc_diffuseMap","defines":["CC_USE_DIFFUSEMAP"]}],"buffers":[],"images":[]},"locals":{"blocks":[{"name":"CCMorph","defines":["CC_USE_MORPH"]},{"name":"CCSkinningTexture","defines":["CC_USE_SKINNING","CC_USE_BAKED_ANIMATION"]},{"name":"CCSkinningAnimation","defines":["CC_USE_SKINNING","CC_USE_BAKED_ANIMATION"]},{"name":"CCSkinning","defines":["CC_USE_SKINNING","!CC_USE_BAKED_ANIMATION"]},{"name":"CCLocalBatched","defines":["!USE_INSTANCING","USE_BATCHING"]},{"name":"CCLocal","defines":["!USE_INSTANCING","!USE_BATCHING"]},{"name":"CCForwardLight","defines":["CC_FORWARD_ADD","CC_ENABLE_CLUSTERED_LIGHT_CULLING"]}],"samplerTextures":[{"name":"cc_PositionDisplacements","defines":["CC_USE_MORPH","CC_MORPH_TARGET_HAS_POSITION"]},{"name":"cc_NormalDisplacements","defines":["CC_USE_MORPH","CC_MORPH_TARGET_HAS_NORMAL"]},{"name":"cc_TangentDisplacements","defines":["CC_USE_MORPH","CC_MORPH_TARGET_HAS_TANGENT"]},{"name":"cc_jointTexture","defines":["CC_USE_SKINNING","CC_USE_BAKED_ANIMATION"]},{"name":"cc_lightingMap","defines":["CC_USE_LIGHTMAP","!USE_BATCHING","!CC_FORWARD_ADD"]}],"buffers":[],"images":[]},"statistics":{"CC_EFFECT_USED_VERTEX_UNIFORM_VECTORS":223,"CC_EFFECT_USED_FRAGMENT_UNIFORM_VECTORS":75}},"defines":[{"name":"USE_INSTANCING","type":"boolean","defines":[],"editor":{"elevated":true}},{"name":"USE_BATCHING","type":"boolean","defines":["!USE_INSTANCING"],"editor":{"elevated":true}},{"name":"CC_USE_SKINNING","type":"boolean","defines":[]},{"name":"CC_USE_BAKED_ANIMATION","type":"boolean","defines":["USE_INSTANCING"]},{"name":"CC_USE_LIGHTMAP","type":"boolean","defines":[]},{"name":"CC_RECEIVE_SHADOW","type":"boolean","defines":[]},{"name":"CC_USE_MORPH","type":"boolean","defines":[]},{"name":"CC_MORPH_TARGET_COUNT","type":"number","defines":["CC_USE_MORPH"],"range":[2,8]},{"name":"CC_MORPH_PRECOMPUTED","type":"boolean","defines":["CC_USE_MORPH"]},{"name":"CC_MORPH_TARGET_HAS_POSITION","type":"boolean","defines":["CC_USE_MORPH"]},{"name":"CC_MORPH_TARGET_HAS_NORMAL","type":"boolean","defines":["CC_USE_MORPH"]},{"name":"CC_MORPH_TARGET_HAS_TANGENT","type":"boolean","defines":["CC_USE_MORPH"]},{"name":"CC_USE_FOG","type":"number","defines":[],"range":[0,4]},{"name":"CC_USE_ACCURATE_FOG","type":"boolean","defines":[]},{"name":"USE_VERTEX_COLOR","type":"boolean","defines":[]},{"name":"USE_NORMAL_MAP","type":"boolean","defines":[]},{"name":"HAS_SECOND_UV","type":"boolean","defines":[]},{"name":"CC_FORWARD_ADD","type":"boolean","defines":[]},{"name":"SAMPLE_FROM_RT","type":"boolean","defines":[]},{"name":"CC_USE_IBL","type":"number","defines":[],"range":[0,2]},{"name":"CC_USE_DIFFUSEMAP","type":"number","defines":[],"range":[0,2]},{"name":"USE_REFLECTION_DENOISE","type":"boolean","defines":[]},{"name":"CC_USE_HDR","type":"boolean","defines":[]},{"name":"USE_ALBEDO_MAP","type":"boolean","defines":[]},{"name":"ALBEDO_UV","type":"string","defines":["USE_ALBEDO_MAP"],"options":["v_uv","v_uv1"]},{"name":"NORMAL_UV","type":"string","defines":["USE_NORMAL_MAP"],"options":["v_uv","v_uv1"]},{"name":"PBR_UV","type":"string","defines":[],"options":["v_uv","v_uv1"]},{"name":"USE_PBR_MAP","type":"boolean","defines":[]},{"name":"USE_METALLIC_ROUGHNESS_MAP","type":"boolean","defines":[]},{"name":"USE_OCCLUSION_MAP","type":"boolean","defines":[]},{"name":"USE_EMISSIVE_MAP","type":"boolean","defines":[]},{"name":"EMISSIVE_UV","type":"string","defines":["USE_EMISSIVE_MAP"],"options":["v_uv","v_uv1"]},{"name":"USE_ALPHA_TEST","type":"boolean","defines":[]},{"name":"ALPHA_TEST_CHANNEL","type":"string","defines":["USE_ALPHA_TEST"],"options":["a","r"]},{"name":"CC_PIPELINE_TYPE","type":"number","defines":["CC_FORWARD_ADD"],"range":[0,1]},{"name":"CC_FORCE_FORWARD_SHADING","type":"boolean","defines":["CC_FORWARD_ADD"]}]},{"hash":3843256285,"name":"../resources/project/game/killer/map/effect/outlineTaskAndPipe|fx-outline-vs:vert|fx-outline-fs:frag","blocks":[{"name":"outlineVert","stageFlags":1,"binding":0,"members":[{"name":"outlineParams","type":16,"count":1}],"defines":[]},{"name":"outlineFrag","stageFlags":16,"binding":1,"members":[{"name":"rimColor","type":16,"count":1}],"defines":[]}],"samplerTextures":[],"samplers":[],"textures":[],"buffers":[],"images":[],"subpassInputs":[],"attributes":[{"name":"a_position","format":32,"location":0,"defines":[]},{"name":"a_normal","format":32,"location":1,"defines":[]},{"name":"a_texCoord","format":21,"location":2,"defines":[]},{"name":"a_tangent","format":44,"location":3,"defines":[]},{"name":"a_joints","location":4,"defines":["CC_USE_SKINNING"]},{"name":"a_weights","format":44,"location":5,"defines":["CC_USE_SKINNING"]},{"name":"a_jointAnimInfo","format":44,"isInstanced":true,"location":6,"defines":["USE_INSTANCING","CC_USE_BAKED_ANIMATION"]},{"name":"a_matWorld0","format":44,"isInstanced":true,"location":7,"defines":["USE_INSTANCING"]},{"name":"a_matWorld1","format":44,"isInstanced":true,"location":8,"defines":["USE_INSTANCING"]},{"name":"a_matWorld2","format":44,"isInstanced":true,"location":9,"defines":["USE_INSTANCING"]},{"name":"a_lightingMapUVParam","format":44,"isInstanced":true,"location":10,"defines":["USE_INSTANCING","CC_USE_LIGHTMAP"]},{"name":"a_localShadowBias","format":21,"isInstanced":true,"location":11,"defines":["USE_INSTANCING","CC_RECEIVE_SHADOW"]},{"name":"a_dyn_batch_id","format":11,"location":12,"defines":["!USE_INSTANCING","USE_BATCHING"]},{"name":"a_vertexId","format":11,"location":13,"defines":["CC_USE_MORPH"]}],"varyings":[{"name":"v_fog_factor","type":13,"count":1,"stageFlags":17,"location":0,"defines":["!CC_USE_ACCURATE_FOG"]}],"fragColors":[{"name":"cc_FragColor","typename":"vec4","type":16,"count":1,"stageFlags":16,"location":0,"defines":[]}],"glsl4":{"vert":"#extension GL_EXT_shader_explicit_arithmetic_types_int32: require\nprecision highp float;\nlayout(set = 0, binding = 0) uniform CCGlobal {\n  highp   vec4 cc_time;\n  mediump vec4 cc_screenSize;\n  mediump vec4 cc_nativeSize;\n};\nlayout(set = 0, binding = 1) uniform CCCamera {\n  highp   mat4 cc_matView;\n  highp   mat4 cc_matViewInv;\n  highp   mat4 cc_matProj;\n  highp   mat4 cc_matProjInv;\n  highp   mat4 cc_matViewProj;\n  highp   mat4 cc_matViewProjInv;\n  highp   vec4 cc_cameraPos;\n  mediump vec4 cc_screenScale;\n  mediump vec4 cc_exposure;\n  mediump vec4 cc_mainLitDir;\n  mediump vec4 cc_mainLitColor;\n  mediump vec4 cc_ambientSky;\n  mediump vec4 cc_ambientGround;\n  mediump vec4 cc_fogColor;\n  mediump vec4 cc_fogBase;\n  mediump vec4 cc_fogAdd;\n  mediump vec4 cc_nearFar;\n  mediump vec4 cc_viewPort;\n};\n#define QUATER_PI         0.78539816340\n#define HALF_PI           1.57079632679\n#define PI                3.14159265359\n#define PI2               6.28318530718\n#define PI4               12.5663706144\n#define INV_QUATER_PI     1.27323954474\n#define INV_HALF_PI       0.63661977237\n#define INV_PI            0.31830988618\n#define INV_PI2           0.15915494309\n#define INV_PI4           0.07957747155\n#define EPSILON           1e-6\n#define EPSILON_LOWP      1e-4\n#define LOG2              1.442695\n#define EXP_VALUE         2.71828183f\n#define FP_MAX            65504.0\n#define FP_SCALE          0.0009765625\n#define FP_SCALE_INV      1024.0\n#define GRAY_VECTOR       vec3(0.299, 0.587, 0.114)\nhighp float decode32 (highp vec4 rgba) {\n  rgba = rgba * 255.0;\n  highp float Sign = 1.0 - (step(128.0, (rgba[3]) + 0.5)) * 2.0;\n  highp float Exponent = 2.0 * (mod(float(int((rgba[3]) + 0.5)), 128.0)) + (step(128.0, (rgba[2]) + 0.5)) - 127.0;\n  highp float Mantissa = (mod(float(int((rgba[2]) + 0.5)), 128.0)) * 65536.0 + rgba[1] * 256.0 + rgba[0] + 8388608.0;\n  return Sign * exp2(Exponent - 23.0) * Mantissa;\n}\nstruct StandardVertInput {\n  highp vec4 position;\n  vec3 normal;\n  vec4 tangent;\n};\nlayout(location = 0) in vec3 a_position;\nlayout(location = 1) in vec3 a_normal;\nlayout(location = 2) in vec2 a_texCoord;\nlayout(location = 3) in vec4 a_tangent;\n#if CC_USE_SKINNING\n    layout(location = 4) in u32vec4 a_joints;\n  layout(location = 5) in vec4 a_weights;\n#endif\n#if USE_INSTANCING\n  #if CC_USE_BAKED_ANIMATION\n    layout(location = 6) in highp vec4 a_jointAnimInfo;\n  #endif\n  layout(location = 7) in vec4 a_matWorld0;\n  layout(location = 8) in vec4 a_matWorld1;\n  layout(location = 9) in vec4 a_matWorld2;\n  #if CC_USE_LIGHTMAP\n    layout(location = 10) in vec4 a_lightingMapUVParam;\n  #endif\n  #if CC_RECEIVE_SHADOW\n    layout(location = 11) in vec2 a_localShadowBias;\n  #endif\n#elif USE_BATCHING\n  layout(location = 12) in float a_dyn_batch_id;\n#endif\n#if CC_USE_MORPH\n    int getVertexId() {\n      return gl_VertexIndex;\n    }\n#endif\n#if !USE_INSTANCING\n  #if USE_BATCHING\n    layout(set = 2, binding = 0) uniform CCLocalBatched {\n      highp mat4 cc_matWorlds[10];\n    };\n  #else\n    layout(set = 2, binding = 0) uniform CCLocal {\n      highp mat4 cc_matWorld;\n      highp mat4 cc_matWorldIT;\n      highp vec4 cc_lightingMapUVParam;\n      highp vec4 cc_localShadowBias;\n    };\n  #endif\n#endif\nvoid CCGetWorldMatrix(out mat4 matWorld)\n{\n  #if USE_INSTANCING\n    matWorld = mat4(\n      vec4(a_matWorld0.xyz, 0.0),\n      vec4(a_matWorld1.xyz, 0.0),\n      vec4(a_matWorld2.xyz, 0.0),\n      vec4(a_matWorld0.w, a_matWorld1.w, a_matWorld2.w, 1.0)\n    );\n  #elif USE_BATCHING\n    matWorld = cc_matWorlds[int(a_dyn_batch_id)];\n  #else\n    matWorld = cc_matWorld;\n  #endif\n}\n#if CC_USE_MORPH\n  layout(set = 2, binding = 4) uniform CCMorph {\n    vec4 cc_displacementWeights[15];\n    vec4 cc_displacementTextureInfo;\n  };\n  vec2 getPixelLocation(vec2 textureResolution, int pixelIndex) {\n    float pixelIndexF = float(pixelIndex);\n    float x = mod(pixelIndexF, textureResolution.x);\n    float y = floor(pixelIndexF / textureResolution.x);\n    return vec2(x, y);\n  }\n  vec2 getPixelCoordFromLocation(vec2 location, vec2 textureResolution) {\n    return (vec2(location.x, location.y) + .5) / textureResolution;\n  }\n  #if CC_DEVICE_SUPPORT_FLOAT_TEXTURE\n      vec4 fetchVec3ArrayFromTexture(sampler2D tex, int pixelIndex) {\n        ivec2 texSize = textureSize(tex, 0);\n        return texelFetch(tex, ivec2(pixelIndex % texSize.x, pixelIndex / texSize.x), 0);\n      }\n  #else\n    vec4 fetchVec3ArrayFromTexture(sampler2D tex, int elementIndex) {\n      int pixelIndex = elementIndex * 4;\n      vec2 location = getPixelLocation(cc_displacementTextureInfo.xy, pixelIndex);\n      vec2 x = getPixelCoordFromLocation(location + vec2(0.0, 0.0), cc_displacementTextureInfo.xy);\n      vec2 y = getPixelCoordFromLocation(location + vec2(1.0, 0.0), cc_displacementTextureInfo.xy);\n      vec2 z = getPixelCoordFromLocation(location + vec2(2.0, 0.0), cc_displacementTextureInfo.xy);\n      return vec4(\n        decode32(texture(tex, x)),\n        decode32(texture(tex, y)),\n        decode32(texture(tex, z)),\n        1.0\n      );\n    }\n  #endif\n  float getDisplacementWeight(int index) {\n    int quot = index / 4;\n    int remainder = index - quot * 4;\n    if (remainder == 0) {\n      return cc_displacementWeights[quot].x;\n    } else if (remainder == 1) {\n      return cc_displacementWeights[quot].y;\n    } else if (remainder == 2) {\n      return cc_displacementWeights[quot].z;\n    } else {\n      return cc_displacementWeights[quot].w;\n    }\n  }\n  vec3 getVec3DisplacementFromTexture(sampler2D tex, int vertexIndex) {\n  #if CC_MORPH_PRECOMPUTED\n    return fetchVec3ArrayFromTexture(tex, vertexIndex).rgb;\n  #else\n    vec3 result = vec3(0, 0, 0);\n    int nVertices = int(cc_displacementTextureInfo.z);\n    for (int iTarget = 0; iTarget < CC_MORPH_TARGET_COUNT; ++iTarget) {\n      result += (fetchVec3ArrayFromTexture(tex, nVertices * iTarget + vertexIndex).rgb * getDisplacementWeight(iTarget));\n    }\n    return result;\n  #endif\n  }\n  #if CC_MORPH_TARGET_HAS_POSITION\n    layout(set = 2, binding = 7) uniform sampler2D cc_PositionDisplacements;\n    vec3 getPositionDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_PositionDisplacements, vertexId);\n    }\n  #endif\n  #if CC_MORPH_TARGET_HAS_NORMAL\n    layout(set = 2, binding = 8) uniform sampler2D cc_NormalDisplacements;\n    vec3 getNormalDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_NormalDisplacements, vertexId);\n    }\n  #endif\n  #if CC_MORPH_TARGET_HAS_TANGENT\n    layout(set = 2, binding = 9) uniform sampler2D cc_TangentDisplacements;\n    vec3 getTangentDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_TangentDisplacements, vertexId);\n    }\n  #endif\n  void applyMorph (inout vec4 position, inout vec3 normal, inout vec4 tangent) {\n    int vertexId = getVertexId();\n  #if CC_MORPH_TARGET_HAS_POSITION\n    position.xyz = position.xyz + getPositionDisplacement(vertexId);\n  #endif\n  #if CC_MORPH_TARGET_HAS_NORMAL\n    normal.xyz = normal.xyz + getNormalDisplacement(vertexId);\n  #endif\n  #if CC_MORPH_TARGET_HAS_TANGENT\n    tangent.xyz = tangent.xyz + getTangentDisplacement(vertexId);\n  #endif\n  }\n  void applyMorph (inout vec4 position) {\n  #if CC_MORPH_TARGET_HAS_POSITION\n    position.xyz = position.xyz + getPositionDisplacement(getVertexId());\n  #endif\n  }\n#endif\n#if CC_USE_SKINNING\n  #if CC_USE_BAKED_ANIMATION\n    layout(set = 2, binding = 3) uniform CCSkinningTexture {\n      highp vec4 cc_jointTextureInfo;\n    };\n    layout(set = 2, binding = 2) uniform CCSkinningAnimation {\n      highp vec4 cc_jointAnimInfo;\n    };\n    layout(set = 2, binding = 6) uniform highp sampler2D cc_jointTexture;\n    void CCGetJointTextureCoords(float pixelsPerJoint, float jointIdx, out highp float x, out highp float y, out highp float invSize)\n    {\n      #if USE_INSTANCING\n        highp float temp = pixelsPerJoint * (a_jointAnimInfo.x * a_jointAnimInfo.y + jointIdx) + a_jointAnimInfo.z;\n      #else\n        highp float temp = pixelsPerJoint * (cc_jointAnimInfo.x * cc_jointTextureInfo.y + jointIdx) + cc_jointTextureInfo.z;\n      #endif\n      invSize = cc_jointTextureInfo.w;\n      highp float tempY = floor(temp * invSize);\n      x = floor(temp - tempY * cc_jointTextureInfo.x);\n      y = (tempY + 0.5) * invSize;\n    }\n  #else\n    layout(set = 2, binding = 3) uniform CCSkinning {\n      highp vec4 cc_joints[30 * 3];\n    };\n  #endif\n  #if CC_USE_BAKED_ANIMATION\n    #if CC_DEVICE_SUPPORT_FLOAT_TEXTURE\n      mat4 getJointMatrix (float i) {\n        highp float x, y, invSize;\n        CCGetJointTextureCoords(3.0, i, x, y, invSize);\n        vec4 v1 = texture(cc_jointTexture, vec2((x + 0.5) * invSize, y));\n        vec4 v2 = texture(cc_jointTexture, vec2((x + 1.5) * invSize, y));\n        vec4 v3 = texture(cc_jointTexture, vec2((x + 2.5) * invSize, y));\n        return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n      }\n    #else\n      mat4 getJointMatrix (float i) {\n        highp float x, y, invSize;\n        CCGetJointTextureCoords(12.0, i, x, y, invSize);\n        vec4 v1 = vec4(\n          decode32(texture(cc_jointTexture, vec2((x + 0.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 1.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 2.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 3.5) * invSize, y)))\n        );\n        vec4 v2 = vec4(\n          decode32(texture(cc_jointTexture, vec2((x + 4.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 5.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 6.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 7.5) * invSize, y)))\n        );\n        vec4 v3 = vec4(\n          decode32(texture(cc_jointTexture, vec2((x + 8.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 9.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 10.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 11.5) * invSize, y)))\n        );\n        return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n      }\n    #endif\n  #else\n    mat4 getJointMatrix (float i) {\n      int idx = int(i);\n      vec4 v1 = cc_joints[idx * 3];\n      vec4 v2 = cc_joints[idx * 3 + 1];\n      vec4 v3 = cc_joints[idx * 3 + 2];\n      return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n    }\n  #endif\n  mat4 skinMatrix () {\n    vec4 joints = vec4(a_joints);\n    return getJointMatrix(joints.x) * a_weights.x\n         + getJointMatrix(joints.y) * a_weights.y\n         + getJointMatrix(joints.z) * a_weights.z\n         + getJointMatrix(joints.w) * a_weights.w;\n  }\n  void CCSkin (inout vec4 position) {\n    mat4 m = skinMatrix();\n    position = m * position;\n  }\n  void CCSkin (inout vec4 position, inout vec3 normal, inout vec4 tangent) {\n    mat4 m = skinMatrix();\n    position = m * position;\n    normal = (m * vec4(normal, 0.0)).xyz;\n    tangent.xyz = (m * vec4(tangent.xyz, 0.0)).xyz;\n  }\n#endif\nvoid CCVertInput(inout StandardVertInput In)\n{\n    In.position = vec4(a_position, 1.0);\n    In.normal = a_normal;\n    In.tangent = a_tangent;\n  #if CC_USE_MORPH\n    applyMorph(In.position, In.normal, In.tangent);\n  #endif\n  #if CC_USE_SKINNING\n    CCSkin(In.position, In.normal, In.tangent);\n  #endif\n}\n#if !CC_USE_ACCURATE_FOG\nlayout(location = 0) out float v_fog_factor;\n#endif\nlayout(set = 1, binding = 0) uniform outlineVert {\n  vec4 outlineParams;\n};\nvec4 vert () {\n  StandardVertInput In;\n  CCVertInput(In);\n  mat4 matWorld;\n  CCGetWorldMatrix(matWorld);\n  float width = outlineParams.x * 0.001;\n  In.position.xyz += normalize(In.normal) * width;\n  vec4 pos = cc_matProj * (cc_matView * matWorld) * In.position;\n  pos.z -= outlineParams.y * 0.002;\n  return pos;\n}\nvoid main() { gl_Position = vert(); }","frag":"\nprecision highp float;\nlayout(set = 0, binding = 0) uniform CCGlobal {\n  highp   vec4 cc_time;\n  mediump vec4 cc_screenSize;\n  mediump vec4 cc_nativeSize;\n};\nlayout(set = 0, binding = 1) uniform CCCamera {\n  highp   mat4 cc_matView;\n  highp   mat4 cc_matViewInv;\n  highp   mat4 cc_matProj;\n  highp   mat4 cc_matProjInv;\n  highp   mat4 cc_matViewProj;\n  highp   mat4 cc_matViewProjInv;\n  highp   vec4 cc_cameraPos;\n  mediump vec4 cc_screenScale;\n  mediump vec4 cc_exposure;\n  mediump vec4 cc_mainLitDir;\n  mediump vec4 cc_mainLitColor;\n  mediump vec4 cc_ambientSky;\n  mediump vec4 cc_ambientGround;\n  mediump vec4 cc_fogColor;\n  mediump vec4 cc_fogBase;\n  mediump vec4 cc_fogAdd;\n  mediump vec4 cc_nearFar;\n  mediump vec4 cc_viewPort;\n};\nvec4 CCFragOutput (vec4 color) {\n  return color;\n}\n#if !CC_USE_ACCURATE_FOG\nlayout(location = 0) in float v_fog_factor;\n#endif\n#define QUATER_PI         0.78539816340\n#define HALF_PI           1.57079632679\n#define PI                3.14159265359\n#define PI2               6.28318530718\n#define PI4               12.5663706144\n#define INV_QUATER_PI     1.27323954474\n#define INV_HALF_PI       0.63661977237\n#define INV_PI            0.31830988618\n#define INV_PI2           0.15915494309\n#define INV_PI4           0.07957747155\n#define EPSILON           1e-6\n#define EPSILON_LOWP      1e-4\n#define LOG2              1.442695\n#define EXP_VALUE         2.71828183f\n#define FP_MAX            65504.0\n#define FP_SCALE          0.0009765625\n#define FP_SCALE_INV      1024.0\n#define GRAY_VECTOR       vec3(0.299, 0.587, 0.114)\nlayout(set = 1, binding = 1) uniform outlineFrag {\n  vec4 rimColor;\n};\nvec4 frag () {\n  vec4 color = rimColor;\n  return CCFragOutput(vec4(color.rgb, 1.0));\n}\nlayout(location = 0) out vec4 cc_FragColor;\nvoid main() { cc_FragColor = frag(); }"},"glsl3":{"vert":"\nprecision highp float;\nlayout(std140) uniform CCGlobal {\n  highp   vec4 cc_time;\n  mediump vec4 cc_screenSize;\n  mediump vec4 cc_nativeSize;\n};\nlayout(std140) uniform CCCamera {\n  highp   mat4 cc_matView;\n  highp   mat4 cc_matViewInv;\n  highp   mat4 cc_matProj;\n  highp   mat4 cc_matProjInv;\n  highp   mat4 cc_matViewProj;\n  highp   mat4 cc_matViewProjInv;\n  highp   vec4 cc_cameraPos;\n  mediump vec4 cc_screenScale;\n  mediump vec4 cc_exposure;\n  mediump vec4 cc_mainLitDir;\n  mediump vec4 cc_mainLitColor;\n  mediump vec4 cc_ambientSky;\n  mediump vec4 cc_ambientGround;\n  mediump vec4 cc_fogColor;\n  mediump vec4 cc_fogBase;\n  mediump vec4 cc_fogAdd;\n  mediump vec4 cc_nearFar;\n  mediump vec4 cc_viewPort;\n};\n#define QUATER_PI         0.78539816340\n#define HALF_PI           1.57079632679\n#define PI                3.14159265359\n#define PI2               6.28318530718\n#define PI4               12.5663706144\n#define INV_QUATER_PI     1.27323954474\n#define INV_HALF_PI       0.63661977237\n#define INV_PI            0.31830988618\n#define INV_PI2           0.15915494309\n#define INV_PI4           0.07957747155\n#define EPSILON           1e-6\n#define EPSILON_LOWP      1e-4\n#define LOG2              1.442695\n#define EXP_VALUE         2.71828183f\n#define FP_MAX            65504.0\n#define FP_SCALE          0.0009765625\n#define FP_SCALE_INV      1024.0\n#define GRAY_VECTOR       vec3(0.299, 0.587, 0.114)\nhighp float decode32 (highp vec4 rgba) {\n  rgba = rgba * 255.0;\n  highp float Sign = 1.0 - (step(128.0, (rgba[3]) + 0.5)) * 2.0;\n  highp float Exponent = 2.0 * (mod(float(int((rgba[3]) + 0.5)), 128.0)) + (step(128.0, (rgba[2]) + 0.5)) - 127.0;\n  highp float Mantissa = (mod(float(int((rgba[2]) + 0.5)), 128.0)) * 65536.0 + rgba[1] * 256.0 + rgba[0] + 8388608.0;\n  return Sign * exp2(Exponent - 23.0) * Mantissa;\n}\nstruct StandardVertInput {\n  highp vec4 position;\n  vec3 normal;\n  vec4 tangent;\n};\nin vec3 a_position;\nin vec3 a_normal;\nin vec2 a_texCoord;\nin vec4 a_tangent;\n#if CC_USE_SKINNING\n    in vec4 a_joints;\n  in vec4 a_weights;\n#endif\n#if USE_INSTANCING\n  #if CC_USE_BAKED_ANIMATION\n    in highp vec4 a_jointAnimInfo;\n  #endif\n  in vec4 a_matWorld0;\n  in vec4 a_matWorld1;\n  in vec4 a_matWorld2;\n  #if CC_USE_LIGHTMAP\n    in vec4 a_lightingMapUVParam;\n  #endif\n  #if CC_RECEIVE_SHADOW\n    in vec2 a_localShadowBias;\n  #endif\n#elif USE_BATCHING\n  in float a_dyn_batch_id;\n#endif\n#if CC_USE_MORPH\n    in float a_vertexId;\n    int getVertexId() {\n      return int(a_vertexId);\n    }\n#endif\n#if !USE_INSTANCING\n  #if USE_BATCHING\n    layout(std140) uniform CCLocalBatched {\n      highp mat4 cc_matWorlds[10];\n    };\n  #else\n    layout(std140) uniform CCLocal {\n      highp mat4 cc_matWorld;\n      highp mat4 cc_matWorldIT;\n      highp vec4 cc_lightingMapUVParam;\n      highp vec4 cc_localShadowBias;\n    };\n  #endif\n#endif\nvoid CCGetWorldMatrix(out mat4 matWorld)\n{\n  #if USE_INSTANCING\n    matWorld = mat4(\n      vec4(a_matWorld0.xyz, 0.0),\n      vec4(a_matWorld1.xyz, 0.0),\n      vec4(a_matWorld2.xyz, 0.0),\n      vec4(a_matWorld0.w, a_matWorld1.w, a_matWorld2.w, 1.0)\n    );\n  #elif USE_BATCHING\n    matWorld = cc_matWorlds[int(a_dyn_batch_id)];\n  #else\n    matWorld = cc_matWorld;\n  #endif\n}\n#if CC_USE_MORPH\n  layout(std140) uniform CCMorph {\n    vec4 cc_displacementWeights[15];\n    vec4 cc_displacementTextureInfo;\n  };\n  vec2 getPixelLocation(vec2 textureResolution, int pixelIndex) {\n    float pixelIndexF = float(pixelIndex);\n    float x = mod(pixelIndexF, textureResolution.x);\n    float y = floor(pixelIndexF / textureResolution.x);\n    return vec2(x, y);\n  }\n  vec2 getPixelCoordFromLocation(vec2 location, vec2 textureResolution) {\n    return (vec2(location.x, location.y) + .5) / textureResolution;\n  }\n  #if CC_DEVICE_SUPPORT_FLOAT_TEXTURE\n      vec4 fetchVec3ArrayFromTexture(sampler2D tex, int pixelIndex) {\n        ivec2 texSize = textureSize(tex, 0);\n        return texelFetch(tex, ivec2(pixelIndex % texSize.x, pixelIndex / texSize.x), 0);\n      }\n  #else\n    vec4 fetchVec3ArrayFromTexture(sampler2D tex, int elementIndex) {\n      int pixelIndex = elementIndex * 4;\n      vec2 location = getPixelLocation(cc_displacementTextureInfo.xy, pixelIndex);\n      vec2 x = getPixelCoordFromLocation(location + vec2(0.0, 0.0), cc_displacementTextureInfo.xy);\n      vec2 y = getPixelCoordFromLocation(location + vec2(1.0, 0.0), cc_displacementTextureInfo.xy);\n      vec2 z = getPixelCoordFromLocation(location + vec2(2.0, 0.0), cc_displacementTextureInfo.xy);\n      return vec4(\n        decode32(texture(tex, x)),\n        decode32(texture(tex, y)),\n        decode32(texture(tex, z)),\n        1.0\n      );\n    }\n  #endif\n  float getDisplacementWeight(int index) {\n    int quot = index / 4;\n    int remainder = index - quot * 4;\n    if (remainder == 0) {\n      return cc_displacementWeights[quot].x;\n    } else if (remainder == 1) {\n      return cc_displacementWeights[quot].y;\n    } else if (remainder == 2) {\n      return cc_displacementWeights[quot].z;\n    } else {\n      return cc_displacementWeights[quot].w;\n    }\n  }\n  vec3 getVec3DisplacementFromTexture(sampler2D tex, int vertexIndex) {\n  #if CC_MORPH_PRECOMPUTED\n    return fetchVec3ArrayFromTexture(tex, vertexIndex).rgb;\n  #else\n    vec3 result = vec3(0, 0, 0);\n    int nVertices = int(cc_displacementTextureInfo.z);\n    for (int iTarget = 0; iTarget < CC_MORPH_TARGET_COUNT; ++iTarget) {\n      result += (fetchVec3ArrayFromTexture(tex, nVertices * iTarget + vertexIndex).rgb * getDisplacementWeight(iTarget));\n    }\n    return result;\n  #endif\n  }\n  #if CC_MORPH_TARGET_HAS_POSITION\n    uniform sampler2D cc_PositionDisplacements;\n    vec3 getPositionDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_PositionDisplacements, vertexId);\n    }\n  #endif\n  #if CC_MORPH_TARGET_HAS_NORMAL\n    uniform sampler2D cc_NormalDisplacements;\n    vec3 getNormalDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_NormalDisplacements, vertexId);\n    }\n  #endif\n  #if CC_MORPH_TARGET_HAS_TANGENT\n    uniform sampler2D cc_TangentDisplacements;\n    vec3 getTangentDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_TangentDisplacements, vertexId);\n    }\n  #endif\n  void applyMorph (inout vec4 position, inout vec3 normal, inout vec4 tangent) {\n    int vertexId = getVertexId();\n  #if CC_MORPH_TARGET_HAS_POSITION\n    position.xyz = position.xyz + getPositionDisplacement(vertexId);\n  #endif\n  #if CC_MORPH_TARGET_HAS_NORMAL\n    normal.xyz = normal.xyz + getNormalDisplacement(vertexId);\n  #endif\n  #if CC_MORPH_TARGET_HAS_TANGENT\n    tangent.xyz = tangent.xyz + getTangentDisplacement(vertexId);\n  #endif\n  }\n  void applyMorph (inout vec4 position) {\n  #if CC_MORPH_TARGET_HAS_POSITION\n    position.xyz = position.xyz + getPositionDisplacement(getVertexId());\n  #endif\n  }\n#endif\n#if CC_USE_SKINNING\n  #if CC_USE_BAKED_ANIMATION\n    layout(std140) uniform CCSkinningTexture {\n      highp vec4 cc_jointTextureInfo;\n    };\n    layout(std140) uniform CCSkinningAnimation {\n      highp vec4 cc_jointAnimInfo;\n    };\n    uniform highp sampler2D cc_jointTexture;\n    void CCGetJointTextureCoords(float pixelsPerJoint, float jointIdx, out highp float x, out highp float y, out highp float invSize)\n    {\n      #if USE_INSTANCING\n        highp float temp = pixelsPerJoint * (a_jointAnimInfo.x * a_jointAnimInfo.y + jointIdx) + a_jointAnimInfo.z;\n      #else\n        highp float temp = pixelsPerJoint * (cc_jointAnimInfo.x * cc_jointTextureInfo.y + jointIdx) + cc_jointTextureInfo.z;\n      #endif\n      invSize = cc_jointTextureInfo.w;\n      highp float tempY = floor(temp * invSize);\n      x = floor(temp - tempY * cc_jointTextureInfo.x);\n      y = (tempY + 0.5) * invSize;\n    }\n  #else\n    layout(std140) uniform CCSkinning {\n      highp vec4 cc_joints[30 * 3];\n    };\n  #endif\n  #if CC_USE_BAKED_ANIMATION\n    #if CC_DEVICE_SUPPORT_FLOAT_TEXTURE\n      mat4 getJointMatrix (float i) {\n        highp float x, y, invSize;\n        CCGetJointTextureCoords(3.0, i, x, y, invSize);\n        vec4 v1 = texture(cc_jointTexture, vec2((x + 0.5) * invSize, y));\n        vec4 v2 = texture(cc_jointTexture, vec2((x + 1.5) * invSize, y));\n        vec4 v3 = texture(cc_jointTexture, vec2((x + 2.5) * invSize, y));\n        return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n      }\n    #else\n      mat4 getJointMatrix (float i) {\n        highp float x, y, invSize;\n        CCGetJointTextureCoords(12.0, i, x, y, invSize);\n        vec4 v1 = vec4(\n          decode32(texture(cc_jointTexture, vec2((x + 0.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 1.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 2.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 3.5) * invSize, y)))\n        );\n        vec4 v2 = vec4(\n          decode32(texture(cc_jointTexture, vec2((x + 4.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 5.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 6.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 7.5) * invSize, y)))\n        );\n        vec4 v3 = vec4(\n          decode32(texture(cc_jointTexture, vec2((x + 8.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 9.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 10.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 11.5) * invSize, y)))\n        );\n        return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n      }\n    #endif\n  #else\n    mat4 getJointMatrix (float i) {\n      int idx = int(i);\n      vec4 v1 = cc_joints[idx * 3];\n      vec4 v2 = cc_joints[idx * 3 + 1];\n      vec4 v3 = cc_joints[idx * 3 + 2];\n      return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n    }\n  #endif\n  mat4 skinMatrix () {\n    vec4 joints = vec4(a_joints);\n    return getJointMatrix(joints.x) * a_weights.x\n         + getJointMatrix(joints.y) * a_weights.y\n         + getJointMatrix(joints.z) * a_weights.z\n         + getJointMatrix(joints.w) * a_weights.w;\n  }\n  void CCSkin (inout vec4 position) {\n    mat4 m = skinMatrix();\n    position = m * position;\n  }\n  void CCSkin (inout vec4 position, inout vec3 normal, inout vec4 tangent) {\n    mat4 m = skinMatrix();\n    position = m * position;\n    normal = (m * vec4(normal, 0.0)).xyz;\n    tangent.xyz = (m * vec4(tangent.xyz, 0.0)).xyz;\n  }\n#endif\nvoid CCVertInput(inout StandardVertInput In)\n{\n    In.position = vec4(a_position, 1.0);\n    In.normal = a_normal;\n    In.tangent = a_tangent;\n  #if CC_USE_MORPH\n    applyMorph(In.position, In.normal, In.tangent);\n  #endif\n  #if CC_USE_SKINNING\n    CCSkin(In.position, In.normal, In.tangent);\n  #endif\n}\n#if !CC_USE_ACCURATE_FOG\nout float v_fog_factor;\n#endif\nlayout(std140) uniform outlineVert {\n  vec4 outlineParams;\n};\nvec4 vert () {\n  StandardVertInput In;\n  CCVertInput(In);\n  mat4 matWorld;\n  CCGetWorldMatrix(matWorld);\n  float width = outlineParams.x * 0.001;\n  In.position.xyz += normalize(In.normal) * width;\n  vec4 pos = cc_matProj * (cc_matView * matWorld) * In.position;\n  pos.z -= outlineParams.y * 0.002;\n  return pos;\n}\nvoid main() { gl_Position = vert(); }","frag":"\nprecision highp float;\nlayout(std140) uniform CCGlobal {\n  highp   vec4 cc_time;\n  mediump vec4 cc_screenSize;\n  mediump vec4 cc_nativeSize;\n};\nlayout(std140) uniform CCCamera {\n  highp   mat4 cc_matView;\n  highp   mat4 cc_matViewInv;\n  highp   mat4 cc_matProj;\n  highp   mat4 cc_matProjInv;\n  highp   mat4 cc_matViewProj;\n  highp   mat4 cc_matViewProjInv;\n  highp   vec4 cc_cameraPos;\n  mediump vec4 cc_screenScale;\n  mediump vec4 cc_exposure;\n  mediump vec4 cc_mainLitDir;\n  mediump vec4 cc_mainLitColor;\n  mediump vec4 cc_ambientSky;\n  mediump vec4 cc_ambientGround;\n  mediump vec4 cc_fogColor;\n  mediump vec4 cc_fogBase;\n  mediump vec4 cc_fogAdd;\n  mediump vec4 cc_nearFar;\n  mediump vec4 cc_viewPort;\n};\nvec4 CCFragOutput (vec4 color) {\n  return color;\n}\n#if !CC_USE_ACCURATE_FOG\nin float v_fog_factor;\n#endif\n#define QUATER_PI         0.78539816340\n#define HALF_PI           1.57079632679\n#define PI                3.14159265359\n#define PI2               6.28318530718\n#define PI4               12.5663706144\n#define INV_QUATER_PI     1.27323954474\n#define INV_HALF_PI       0.63661977237\n#define INV_PI            0.31830988618\n#define INV_PI2           0.15915494309\n#define INV_PI4           0.07957747155\n#define EPSILON           1e-6\n#define EPSILON_LOWP      1e-4\n#define LOG2              1.442695\n#define EXP_VALUE         2.71828183f\n#define FP_MAX            65504.0\n#define FP_SCALE          0.0009765625\n#define FP_SCALE_INV      1024.0\n#define GRAY_VECTOR       vec3(0.299, 0.587, 0.114)\nlayout(std140) uniform outlineFrag {\n  vec4 rimColor;\n};\nvec4 frag () {\n  vec4 color = rimColor;\n  return CCFragOutput(vec4(color.rgb, 1.0));\n}\nlayout(location = 0) out vec4 cc_FragColor;\nvoid main() { cc_FragColor = frag(); }"},"glsl1":{"vert":"\nprecision highp float;\nuniform highp mat4 cc_matView;\n  uniform highp mat4 cc_matProj;\n#define QUATER_PI         0.78539816340\n#define HALF_PI           1.57079632679\n#define PI                3.14159265359\n#define PI2               6.28318530718\n#define PI4               12.5663706144\n#define INV_QUATER_PI     1.27323954474\n#define INV_HALF_PI       0.63661977237\n#define INV_PI            0.31830988618\n#define INV_PI2           0.15915494309\n#define INV_PI4           0.07957747155\n#define EPSILON           1e-6\n#define EPSILON_LOWP      1e-4\n#define LOG2              1.442695\n#define EXP_VALUE         2.71828183f\n#define FP_MAX            65504.0\n#define FP_SCALE          0.0009765625\n#define FP_SCALE_INV      1024.0\n#define GRAY_VECTOR       vec3(0.299, 0.587, 0.114)\nhighp float decode32 (highp vec4 rgba) {\n  rgba = rgba * 255.0;\n  highp float Sign = 1.0 - (step(128.0, (rgba[3]) + 0.5)) * 2.0;\n  highp float Exponent = 2.0 * (mod(float(int((rgba[3]) + 0.5)), 128.0)) + (step(128.0, (rgba[2]) + 0.5)) - 127.0;\n  highp float Mantissa = (mod(float(int((rgba[2]) + 0.5)), 128.0)) * 65536.0 + rgba[1] * 256.0 + rgba[0] + 8388608.0;\n  return Sign * exp2(Exponent - 23.0) * Mantissa;\n}\nstruct StandardVertInput {\n  highp vec4 position;\n  vec3 normal;\n  vec4 tangent;\n};\nattribute vec3 a_position;\nattribute vec3 a_normal;\nattribute vec2 a_texCoord;\nattribute vec4 a_tangent;\n#if CC_USE_SKINNING\n    attribute vec4 a_joints;\n  attribute vec4 a_weights;\n#endif\n#if USE_INSTANCING\n  #if CC_USE_BAKED_ANIMATION\n    attribute highp vec4 a_jointAnimInfo;\n  #endif\n  attribute vec4 a_matWorld0;\n  attribute vec4 a_matWorld1;\n  attribute vec4 a_matWorld2;\n  #if CC_USE_LIGHTMAP\n    attribute vec4 a_lightingMapUVParam;\n  #endif\n  #if CC_RECEIVE_SHADOW\n    attribute vec2 a_localShadowBias;\n  #endif\n#elif USE_BATCHING\n  attribute float a_dyn_batch_id;\n#endif\n#if CC_USE_MORPH\n    attribute float a_vertexId;\n    int getVertexId() {\n      return int(a_vertexId);\n    }\n#endif\n#if !USE_INSTANCING\n  #if USE_BATCHING\n    uniform highp mat4 cc_matWorlds[10];\n  #else\n    uniform highp mat4 cc_matWorld;\n  #endif\n#endif\nvoid CCGetWorldMatrix(out mat4 matWorld)\n{\n  #if USE_INSTANCING\n    matWorld = mat4(\n      vec4(a_matWorld0.xyz, 0.0),\n      vec4(a_matWorld1.xyz, 0.0),\n      vec4(a_matWorld2.xyz, 0.0),\n      vec4(a_matWorld0.w, a_matWorld1.w, a_matWorld2.w, 1.0)\n    );\n  #elif USE_BATCHING\n    matWorld = cc_matWorlds[int(a_dyn_batch_id)];\n  #else\n    matWorld = cc_matWorld;\n  #endif\n}\n#if CC_USE_MORPH\n  uniform vec4 cc_displacementWeights[15];\n  uniform vec4 cc_displacementTextureInfo;\n  vec2 getPixelLocation(vec2 textureResolution, int pixelIndex) {\n    float pixelIndexF = float(pixelIndex);\n    float x = mod(pixelIndexF, textureResolution.x);\n    float y = floor(pixelIndexF / textureResolution.x);\n    return vec2(x, y);\n  }\n  vec2 getPixelCoordFromLocation(vec2 location, vec2 textureResolution) {\n    return (vec2(location.x, location.y) + .5) / textureResolution;\n  }\n  #if CC_DEVICE_SUPPORT_FLOAT_TEXTURE\n      vec4 fetchVec3ArrayFromTexture(sampler2D tex, int elementIndex) {\n        int pixelIndex = elementIndex;\n        vec2 location = getPixelLocation(cc_displacementTextureInfo.xy, pixelIndex);\n        vec2 uv = getPixelCoordFromLocation(location, cc_displacementTextureInfo.xy);\n        return texture2D(tex, uv);\n      }\n  #else\n    vec4 fetchVec3ArrayFromTexture(sampler2D tex, int elementIndex) {\n      int pixelIndex = elementIndex * 4;\n      vec2 location = getPixelLocation(cc_displacementTextureInfo.xy, pixelIndex);\n      vec2 x = getPixelCoordFromLocation(location + vec2(0.0, 0.0), cc_displacementTextureInfo.xy);\n      vec2 y = getPixelCoordFromLocation(location + vec2(1.0, 0.0), cc_displacementTextureInfo.xy);\n      vec2 z = getPixelCoordFromLocation(location + vec2(2.0, 0.0), cc_displacementTextureInfo.xy);\n      return vec4(\n        decode32(texture2D(tex, x)),\n        decode32(texture2D(tex, y)),\n        decode32(texture2D(tex, z)),\n        1.0\n      );\n    }\n  #endif\n  float getDisplacementWeight(int index) {\n    int quot = index / 4;\n    int remainder = index - quot * 4;\n    if (remainder == 0) {\n      return cc_displacementWeights[quot].x;\n    } else if (remainder == 1) {\n      return cc_displacementWeights[quot].y;\n    } else if (remainder == 2) {\n      return cc_displacementWeights[quot].z;\n    } else {\n      return cc_displacementWeights[quot].w;\n    }\n  }\n  vec3 getVec3DisplacementFromTexture(sampler2D tex, int vertexIndex) {\n  #if CC_MORPH_PRECOMPUTED\n    return fetchVec3ArrayFromTexture(tex, vertexIndex).rgb;\n  #else\n    vec3 result = vec3(0, 0, 0);\n    int nVertices = int(cc_displacementTextureInfo.z);\n    for (int iTarget = 0; iTarget < CC_MORPH_TARGET_COUNT; ++iTarget) {\n      result += (fetchVec3ArrayFromTexture(tex, nVertices * iTarget + vertexIndex).rgb * getDisplacementWeight(iTarget));\n    }\n    return result;\n  #endif\n  }\n  #if CC_MORPH_TARGET_HAS_POSITION\n    uniform sampler2D cc_PositionDisplacements;\n    vec3 getPositionDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_PositionDisplacements, vertexId);\n    }\n  #endif\n  #if CC_MORPH_TARGET_HAS_NORMAL\n    uniform sampler2D cc_NormalDisplacements;\n    vec3 getNormalDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_NormalDisplacements, vertexId);\n    }\n  #endif\n  #if CC_MORPH_TARGET_HAS_TANGENT\n    uniform sampler2D cc_TangentDisplacements;\n    vec3 getTangentDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_TangentDisplacements, vertexId);\n    }\n  #endif\n  void applyMorph (inout vec4 position, inout vec3 normal, inout vec4 tangent) {\n    int vertexId = getVertexId();\n  #if CC_MORPH_TARGET_HAS_POSITION\n    position.xyz = position.xyz + getPositionDisplacement(vertexId);\n  #endif\n  #if CC_MORPH_TARGET_HAS_NORMAL\n    normal.xyz = normal.xyz + getNormalDisplacement(vertexId);\n  #endif\n  #if CC_MORPH_TARGET_HAS_TANGENT\n    tangent.xyz = tangent.xyz + getTangentDisplacement(vertexId);\n  #endif\n  }\n  void applyMorph (inout vec4 position) {\n  #if CC_MORPH_TARGET_HAS_POSITION\n    position.xyz = position.xyz + getPositionDisplacement(getVertexId());\n  #endif\n  }\n#endif\n#if CC_USE_SKINNING\n  #if CC_USE_BAKED_ANIMATION\n    uniform highp vec4 cc_jointTextureInfo;\n    uniform highp vec4 cc_jointAnimInfo;\n    uniform highp sampler2D cc_jointTexture;\n    void CCGetJointTextureCoords(float pixelsPerJoint, float jointIdx, out highp float x, out highp float y, out highp float invSize)\n    {\n      #if USE_INSTANCING\n        highp float temp = pixelsPerJoint * (a_jointAnimInfo.x * a_jointAnimInfo.y + jointIdx) + a_jointAnimInfo.z;\n      #else\n        highp float temp = pixelsPerJoint * (cc_jointAnimInfo.x * cc_jointTextureInfo.y + jointIdx) + cc_jointTextureInfo.z;\n      #endif\n      invSize = cc_jointTextureInfo.w;\n      highp float tempY = floor(temp * invSize);\n      x = floor(temp - tempY * cc_jointTextureInfo.x);\n      y = (tempY + 0.5) * invSize;\n    }\n  #else\n    uniform highp vec4 cc_joints[90];\n  #endif\n  #if CC_USE_BAKED_ANIMATION\n    #if CC_DEVICE_SUPPORT_FLOAT_TEXTURE\n      mat4 getJointMatrix (float i) {\n        highp float x, y, invSize;\n        CCGetJointTextureCoords(3.0, i, x, y, invSize);\n        vec4 v1 = texture2D(cc_jointTexture, vec2((x + 0.5) * invSize, y));\n        vec4 v2 = texture2D(cc_jointTexture, vec2((x + 1.5) * invSize, y));\n        vec4 v3 = texture2D(cc_jointTexture, vec2((x + 2.5) * invSize, y));\n        return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n      }\n    #else\n      mat4 getJointMatrix (float i) {\n        highp float x, y, invSize;\n        CCGetJointTextureCoords(12.0, i, x, y, invSize);\n        vec4 v1 = vec4(\n          decode32(texture2D(cc_jointTexture, vec2((x + 0.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 1.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 2.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 3.5) * invSize, y)))\n        );\n        vec4 v2 = vec4(\n          decode32(texture2D(cc_jointTexture, vec2((x + 4.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 5.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 6.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 7.5) * invSize, y)))\n        );\n        vec4 v3 = vec4(\n          decode32(texture2D(cc_jointTexture, vec2((x + 8.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 9.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 10.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 11.5) * invSize, y)))\n        );\n        return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n      }\n    #endif\n  #else\n    mat4 getJointMatrix (float i) {\n      int idx = int(i);\n      vec4 v1 = cc_joints[idx * 3];\n      vec4 v2 = cc_joints[idx * 3 + 1];\n      vec4 v3 = cc_joints[idx * 3 + 2];\n      return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n    }\n  #endif\n  mat4 skinMatrix () {\n    vec4 joints = vec4(a_joints);\n    return getJointMatrix(joints.x) * a_weights.x\n         + getJointMatrix(joints.y) * a_weights.y\n         + getJointMatrix(joints.z) * a_weights.z\n         + getJointMatrix(joints.w) * a_weights.w;\n  }\n  void CCSkin (inout vec4 position) {\n    mat4 m = skinMatrix();\n    position = m * position;\n  }\n  void CCSkin (inout vec4 position, inout vec3 normal, inout vec4 tangent) {\n    mat4 m = skinMatrix();\n    position = m * position;\n    normal = (m * vec4(normal, 0.0)).xyz;\n    tangent.xyz = (m * vec4(tangent.xyz, 0.0)).xyz;\n  }\n#endif\nvoid CCVertInput(inout StandardVertInput In)\n{\n    In.position = vec4(a_position, 1.0);\n    In.normal = a_normal;\n    In.tangent = a_tangent;\n  #if CC_USE_MORPH\n    applyMorph(In.position, In.normal, In.tangent);\n  #endif\n  #if CC_USE_SKINNING\n    CCSkin(In.position, In.normal, In.tangent);\n  #endif\n}\n#if !CC_USE_ACCURATE_FOG\nvarying float v_fog_factor;\n#endif\n       uniform vec4 outlineParams;\nvec4 vert () {\n  StandardVertInput In;\n  CCVertInput(In);\n  mat4 matWorld;\n  CCGetWorldMatrix(matWorld);\n  float width = outlineParams.x * 0.001;\n  In.position.xyz += normalize(In.normal) * width;\n  vec4 pos = cc_matProj * (cc_matView * matWorld) * In.position;\n  pos.z -= outlineParams.y * 0.002;\n  return pos;\n}\nvoid main() { gl_Position = vert(); }","frag":"\nprecision highp float;\nvec4 CCFragOutput (vec4 color) {\n  return color;\n}\n#if !CC_USE_ACCURATE_FOG\nvarying float v_fog_factor;\n#endif\n#define QUATER_PI         0.78539816340\n#define HALF_PI           1.57079632679\n#define PI                3.14159265359\n#define PI2               6.28318530718\n#define PI4               12.5663706144\n#define INV_QUATER_PI     1.27323954474\n#define INV_HALF_PI       0.63661977237\n#define INV_PI            0.31830988618\n#define INV_PI2           0.15915494309\n#define INV_PI4           0.07957747155\n#define EPSILON           1e-6\n#define EPSILON_LOWP      1e-4\n#define LOG2              1.442695\n#define EXP_VALUE         2.71828183f\n#define FP_MAX            65504.0\n#define FP_SCALE          0.0009765625\n#define FP_SCALE_INV      1024.0\n#define GRAY_VECTOR       vec3(0.299, 0.587, 0.114)\n          uniform vec4 rimColor;\nvec4 frag () {\n  vec4 color = rimColor;\n  return CCFragOutput(vec4(color.rgb, 1.0));\n}\nvoid main() { gl_FragColor = frag(); }"},"builtins":{"globals":{"blocks":[{"name":"CCGlobal","defines":[]},{"name":"CCCamera","defines":[]}],"samplerTextures":[],"buffers":[],"images":[]},"locals":{"blocks":[{"name":"CCLocalBatched","defines":["!USE_INSTANCING","USE_BATCHING"]},{"name":"CCLocal","defines":["!USE_INSTANCING","!USE_BATCHING"]},{"name":"CCMorph","defines":["CC_USE_MORPH"]},{"name":"CCSkinningTexture","defines":["CC_USE_SKINNING","CC_USE_BAKED_ANIMATION"]},{"name":"CCSkinningAnimation","defines":["CC_USE_SKINNING","CC_USE_BAKED_ANIMATION"]},{"name":"CCSkinning","defines":["CC_USE_SKINNING","!CC_USE_BAKED_ANIMATION"]}],"samplerTextures":[{"name":"cc_PositionDisplacements","defines":["CC_USE_MORPH","CC_MORPH_TARGET_HAS_POSITION"]},{"name":"cc_NormalDisplacements","defines":["CC_USE_MORPH","CC_MORPH_TARGET_HAS_NORMAL"]},{"name":"cc_TangentDisplacements","defines":["CC_USE_MORPH","CC_MORPH_TARGET_HAS_TANGENT"]},{"name":"cc_jointTexture","defines":["CC_USE_SKINNING","CC_USE_BAKED_ANIMATION"]}],"buffers":[],"images":[]},"statistics":{"CC_EFFECT_USED_VERTEX_UNIFORM_VECTORS":198,"CC_EFFECT_USED_FRAGMENT_UNIFORM_VECTORS":40}},"defines":[{"name":"USE_INSTANCING","type":"boolean","defines":[],"editor":{"elevated":true}},{"name":"USE_BATCHING","type":"boolean","defines":["!USE_INSTANCING"],"editor":{"elevated":true}},{"name":"CC_USE_SKINNING","type":"boolean","defines":[]},{"name":"CC_USE_BAKED_ANIMATION","type":"boolean","defines":["USE_INSTANCING"]},{"name":"CC_USE_LIGHTMAP","type":"boolean","defines":["USE_INSTANCING"]},{"name":"CC_RECEIVE_SHADOW","type":"boolean","defines":["USE_INSTANCING"]},{"name":"CC_USE_MORPH","type":"boolean","defines":[]},{"name":"CC_MORPH_TARGET_COUNT","type":"number","defines":["CC_USE_MORPH"],"range":[2,8]},{"name":"CC_MORPH_PRECOMPUTED","type":"boolean","defines":["CC_USE_MORPH"]},{"name":"CC_MORPH_TARGET_HAS_POSITION","type":"boolean","defines":["CC_USE_MORPH"]},{"name":"CC_MORPH_TARGET_HAS_NORMAL","type":"boolean","defines":["CC_USE_MORPH"]},{"name":"CC_MORPH_TARGET_HAS_TANGENT","type":"boolean","defines":["CC_USE_MORPH"]},{"name":"CC_USE_FOG","type":"number","defines":[],"range":[0,4]},{"name":"CC_USE_ACCURATE_FOG","type":"boolean","defines":[]}]},{"hash":3770551951,"name":"../resources/project/game/killer/map/effect/outlineTaskAndPipe|shadow-caster-vs:vert|shadow-caster-fs:frag","blocks":[{"name":"Constants","stageFlags":17,"binding":0,"members":[{"name":"tilingOffset","type":16,"count":1},{"name":"albedo","type":16,"count":1},{"name":"albedoScaleAndCutoff","type":16,"count":1},{"name":"pbrParams","type":16,"count":1},{"name":"emissive","type":16,"count":1},{"name":"emissiveScaleParam","type":16,"count":1}],"defines":[]}],"samplerTextures":[{"name":"albedoMap","type":28,"count":1,"stageFlags":16,"binding":1,"defines":["USE_ALBEDO_MAP"]}],"samplers":[],"textures":[],"buffers":[],"images":[],"subpassInputs":[],"attributes":[{"name":"a_position","format":32,"location":0,"defines":[]},{"name":"a_normal","format":32,"location":1,"defines":[]},{"name":"a_texCoord","format":21,"location":2,"defines":[]},{"name":"a_tangent","format":44,"location":3,"defines":[]},{"name":"a_joints","location":4,"defines":["CC_USE_SKINNING"]},{"name":"a_weights","format":44,"location":5,"defines":["CC_USE_SKINNING"]},{"name":"a_jointAnimInfo","format":44,"isInstanced":true,"location":6,"defines":["USE_INSTANCING","CC_USE_BAKED_ANIMATION"]},{"name":"a_matWorld0","format":44,"isInstanced":true,"location":7,"defines":["USE_INSTANCING"]},{"name":"a_matWorld1","format":44,"isInstanced":true,"location":8,"defines":["USE_INSTANCING"]},{"name":"a_matWorld2","format":44,"isInstanced":true,"location":9,"defines":["USE_INSTANCING"]},{"name":"a_lightingMapUVParam","format":44,"isInstanced":true,"location":10,"defines":["USE_INSTANCING","CC_USE_LIGHTMAP"]},{"name":"a_localShadowBias","format":21,"isInstanced":true,"location":11,"defines":["USE_INSTANCING","CC_RECEIVE_SHADOW"]},{"name":"a_dyn_batch_id","format":11,"location":12,"defines":["!USE_INSTANCING","USE_BATCHING"]},{"name":"a_vertexId","format":11,"location":13,"defines":["CC_USE_MORPH"]},{"name":"a_texCoord1","format":21,"location":14,"defines":[]}],"varyings":[{"name":"v_uv","type":14,"count":1,"stageFlags":17,"location":0,"defines":[]},{"name":"v_uv1","type":14,"count":1,"stageFlags":17,"location":1,"defines":[]},{"name":"v_worldPos","type":16,"count":1,"stageFlags":17,"location":2,"defines":[]},{"name":"v_clip_depth","type":13,"count":1,"stageFlags":17,"location":3,"defines":[]}],"fragColors":[{"name":"cc_FragColor","typename":"vec4","type":16,"count":1,"stageFlags":16,"location":0,"defines":[]}],"glsl4":{"vert":"#extension GL_EXT_shader_explicit_arithmetic_types_int32: require\nprecision highp float;\n#define QUATER_PI         0.78539816340\n#define HALF_PI           1.57079632679\n#define PI                3.14159265359\n#define PI2               6.28318530718\n#define PI4               12.5663706144\n#define INV_QUATER_PI     1.27323954474\n#define INV_HALF_PI       0.63661977237\n#define INV_PI            0.31830988618\n#define INV_PI2           0.15915494309\n#define INV_PI4           0.07957747155\n#define EPSILON           1e-6\n#define EPSILON_LOWP      1e-4\n#define LOG2              1.442695\n#define EXP_VALUE         2.71828183f\n#define FP_MAX            65504.0\n#define FP_SCALE          0.0009765625\n#define FP_SCALE_INV      1024.0\n#define GRAY_VECTOR       vec3(0.299, 0.587, 0.114)\nhighp float decode32 (highp vec4 rgba) {\n  rgba = rgba * 255.0;\n  highp float Sign = 1.0 - (step(128.0, (rgba[3]) + 0.5)) * 2.0;\n  highp float Exponent = 2.0 * (mod(float(int((rgba[3]) + 0.5)), 128.0)) + (step(128.0, (rgba[2]) + 0.5)) - 127.0;\n  highp float Mantissa = (mod(float(int((rgba[2]) + 0.5)), 128.0)) * 65536.0 + rgba[1] * 256.0 + rgba[0] + 8388608.0;\n  return Sign * exp2(Exponent - 23.0) * Mantissa;\n}\nstruct StandardVertInput {\n  highp vec4 position;\n  vec3 normal;\n  vec4 tangent;\n};\nlayout(location = 0) in vec3 a_position;\nlayout(location = 1) in vec3 a_normal;\nlayout(location = 2) in vec2 a_texCoord;\nlayout(location = 3) in vec4 a_tangent;\n#if CC_USE_SKINNING\n    layout(location = 4) in u32vec4 a_joints;\n  layout(location = 5) in vec4 a_weights;\n#endif\n#if USE_INSTANCING\n  #if CC_USE_BAKED_ANIMATION\n    layout(location = 6) in highp vec4 a_jointAnimInfo;\n  #endif\n  layout(location = 7) in vec4 a_matWorld0;\n  layout(location = 8) in vec4 a_matWorld1;\n  layout(location = 9) in vec4 a_matWorld2;\n  #if CC_USE_LIGHTMAP\n    layout(location = 10) in vec4 a_lightingMapUVParam;\n  #endif\n  #if CC_RECEIVE_SHADOW\n    layout(location = 11) in vec2 a_localShadowBias;\n  #endif\n#elif USE_BATCHING\n  layout(location = 12) in float a_dyn_batch_id;\n#endif\n#if CC_USE_MORPH\n    int getVertexId() {\n      return gl_VertexIndex;\n    }\n#endif\n#if CC_USE_MORPH\n  layout(set = 2, binding = 4) uniform CCMorph {\n    vec4 cc_displacementWeights[15];\n    vec4 cc_displacementTextureInfo;\n  };\n  vec2 getPixelLocation(vec2 textureResolution, int pixelIndex) {\n    float pixelIndexF = float(pixelIndex);\n    float x = mod(pixelIndexF, textureResolution.x);\n    float y = floor(pixelIndexF / textureResolution.x);\n    return vec2(x, y);\n  }\n  vec2 getPixelCoordFromLocation(vec2 location, vec2 textureResolution) {\n    return (vec2(location.x, location.y) + .5) / textureResolution;\n  }\n  #if CC_DEVICE_SUPPORT_FLOAT_TEXTURE\n      vec4 fetchVec3ArrayFromTexture(sampler2D tex, int pixelIndex) {\n        ivec2 texSize = textureSize(tex, 0);\n        return texelFetch(tex, ivec2(pixelIndex % texSize.x, pixelIndex / texSize.x), 0);\n      }\n  #else\n    vec4 fetchVec3ArrayFromTexture(sampler2D tex, int elementIndex) {\n      int pixelIndex = elementIndex * 4;\n      vec2 location = getPixelLocation(cc_displacementTextureInfo.xy, pixelIndex);\n      vec2 x = getPixelCoordFromLocation(location + vec2(0.0, 0.0), cc_displacementTextureInfo.xy);\n      vec2 y = getPixelCoordFromLocation(location + vec2(1.0, 0.0), cc_displacementTextureInfo.xy);\n      vec2 z = getPixelCoordFromLocation(location + vec2(2.0, 0.0), cc_displacementTextureInfo.xy);\n      return vec4(\n        decode32(texture(tex, x)),\n        decode32(texture(tex, y)),\n        decode32(texture(tex, z)),\n        1.0\n      );\n    }\n  #endif\n  float getDisplacementWeight(int index) {\n    int quot = index / 4;\n    int remainder = index - quot * 4;\n    if (remainder == 0) {\n      return cc_displacementWeights[quot].x;\n    } else if (remainder == 1) {\n      return cc_displacementWeights[quot].y;\n    } else if (remainder == 2) {\n      return cc_displacementWeights[quot].z;\n    } else {\n      return cc_displacementWeights[quot].w;\n    }\n  }\n  vec3 getVec3DisplacementFromTexture(sampler2D tex, int vertexIndex) {\n  #if CC_MORPH_PRECOMPUTED\n    return fetchVec3ArrayFromTexture(tex, vertexIndex).rgb;\n  #else\n    vec3 result = vec3(0, 0, 0);\n    int nVertices = int(cc_displacementTextureInfo.z);\n    for (int iTarget = 0; iTarget < CC_MORPH_TARGET_COUNT; ++iTarget) {\n      result += (fetchVec3ArrayFromTexture(tex, nVertices * iTarget + vertexIndex).rgb * getDisplacementWeight(iTarget));\n    }\n    return result;\n  #endif\n  }\n  #if CC_MORPH_TARGET_HAS_POSITION\n    layout(set = 2, binding = 7) uniform sampler2D cc_PositionDisplacements;\n    vec3 getPositionDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_PositionDisplacements, vertexId);\n    }\n  #endif\n  #if CC_MORPH_TARGET_HAS_NORMAL\n    layout(set = 2, binding = 8) uniform sampler2D cc_NormalDisplacements;\n    vec3 getNormalDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_NormalDisplacements, vertexId);\n    }\n  #endif\n  #if CC_MORPH_TARGET_HAS_TANGENT\n    layout(set = 2, binding = 9) uniform sampler2D cc_TangentDisplacements;\n    vec3 getTangentDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_TangentDisplacements, vertexId);\n    }\n  #endif\n  void applyMorph (inout vec4 position, inout vec3 normal, inout vec4 tangent) {\n    int vertexId = getVertexId();\n  #if CC_MORPH_TARGET_HAS_POSITION\n    position.xyz = position.xyz + getPositionDisplacement(vertexId);\n  #endif\n  #if CC_MORPH_TARGET_HAS_NORMAL\n    normal.xyz = normal.xyz + getNormalDisplacement(vertexId);\n  #endif\n  #if CC_MORPH_TARGET_HAS_TANGENT\n    tangent.xyz = tangent.xyz + getTangentDisplacement(vertexId);\n  #endif\n  }\n  void applyMorph (inout vec4 position) {\n  #if CC_MORPH_TARGET_HAS_POSITION\n    position.xyz = position.xyz + getPositionDisplacement(getVertexId());\n  #endif\n  }\n#endif\n#if CC_USE_SKINNING\n  #if CC_USE_BAKED_ANIMATION\n    layout(set = 2, binding = 3) uniform CCSkinningTexture {\n      highp vec4 cc_jointTextureInfo;\n    };\n    layout(set = 2, binding = 2) uniform CCSkinningAnimation {\n      highp vec4 cc_jointAnimInfo;\n    };\n    layout(set = 2, binding = 6) uniform highp sampler2D cc_jointTexture;\n    void CCGetJointTextureCoords(float pixelsPerJoint, float jointIdx, out highp float x, out highp float y, out highp float invSize)\n    {\n      #if USE_INSTANCING\n        highp float temp = pixelsPerJoint * (a_jointAnimInfo.x * a_jointAnimInfo.y + jointIdx) + a_jointAnimInfo.z;\n      #else\n        highp float temp = pixelsPerJoint * (cc_jointAnimInfo.x * cc_jointTextureInfo.y + jointIdx) + cc_jointTextureInfo.z;\n      #endif\n      invSize = cc_jointTextureInfo.w;\n      highp float tempY = floor(temp * invSize);\n      x = floor(temp - tempY * cc_jointTextureInfo.x);\n      y = (tempY + 0.5) * invSize;\n    }\n  #else\n    layout(set = 2, binding = 3) uniform CCSkinning {\n      highp vec4 cc_joints[30 * 3];\n    };\n  #endif\n  #if CC_USE_BAKED_ANIMATION\n    #if CC_DEVICE_SUPPORT_FLOAT_TEXTURE\n      mat4 getJointMatrix (float i) {\n        highp float x, y, invSize;\n        CCGetJointTextureCoords(3.0, i, x, y, invSize);\n        vec4 v1 = texture(cc_jointTexture, vec2((x + 0.5) * invSize, y));\n        vec4 v2 = texture(cc_jointTexture, vec2((x + 1.5) * invSize, y));\n        vec4 v3 = texture(cc_jointTexture, vec2((x + 2.5) * invSize, y));\n        return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n      }\n    #else\n      mat4 getJointMatrix (float i) {\n        highp float x, y, invSize;\n        CCGetJointTextureCoords(12.0, i, x, y, invSize);\n        vec4 v1 = vec4(\n          decode32(texture(cc_jointTexture, vec2((x + 0.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 1.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 2.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 3.5) * invSize, y)))\n        );\n        vec4 v2 = vec4(\n          decode32(texture(cc_jointTexture, vec2((x + 4.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 5.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 6.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 7.5) * invSize, y)))\n        );\n        vec4 v3 = vec4(\n          decode32(texture(cc_jointTexture, vec2((x + 8.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 9.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 10.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 11.5) * invSize, y)))\n        );\n        return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n      }\n    #endif\n  #else\n    mat4 getJointMatrix (float i) {\n      int idx = int(i);\n      vec4 v1 = cc_joints[idx * 3];\n      vec4 v2 = cc_joints[idx * 3 + 1];\n      vec4 v3 = cc_joints[idx * 3 + 2];\n      return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n    }\n  #endif\n  mat4 skinMatrix () {\n    vec4 joints = vec4(a_joints);\n    return getJointMatrix(joints.x) * a_weights.x\n         + getJointMatrix(joints.y) * a_weights.y\n         + getJointMatrix(joints.z) * a_weights.z\n         + getJointMatrix(joints.w) * a_weights.w;\n  }\n  void CCSkin (inout vec4 position) {\n    mat4 m = skinMatrix();\n    position = m * position;\n  }\n  void CCSkin (inout vec4 position, inout vec3 normal, inout vec4 tangent) {\n    mat4 m = skinMatrix();\n    position = m * position;\n    normal = (m * vec4(normal, 0.0)).xyz;\n    tangent.xyz = (m * vec4(tangent.xyz, 0.0)).xyz;\n  }\n#endif\nvoid CCVertInput(inout StandardVertInput In)\n{\n    In.position = vec4(a_position, 1.0);\n    In.normal = a_normal;\n    In.tangent = a_tangent;\n  #if CC_USE_MORPH\n    applyMorph(In.position, In.normal, In.tangent);\n  #endif\n  #if CC_USE_SKINNING\n    CCSkin(In.position, In.normal, In.tangent);\n  #endif\n}\n#if !USE_INSTANCING\n  #if USE_BATCHING\n    layout(set = 2, binding = 0) uniform CCLocalBatched {\n      highp mat4 cc_matWorlds[10];\n    };\n  #else\n    layout(set = 2, binding = 0) uniform CCLocal {\n      highp mat4 cc_matWorld;\n      highp mat4 cc_matWorldIT;\n      highp vec4 cc_lightingMapUVParam;\n      highp vec4 cc_localShadowBias;\n    };\n  #endif\n#endif\nvoid CCGetWorldMatrixFull(out mat4 matWorld, out mat4 matWorldIT)\n{\n  #if USE_INSTANCING\n    matWorld = mat4(\n      vec4(a_matWorld0.xyz, 0.0),\n      vec4(a_matWorld1.xyz, 0.0),\n      vec4(a_matWorld2.xyz, 0.0),\n      vec4(a_matWorld0.w, a_matWorld1.w, a_matWorld2.w, 1.0)\n    );\n    matWorldIT = matWorld;\n  #elif USE_BATCHING\n    matWorld = cc_matWorlds[int(a_dyn_batch_id)];\n    matWorldIT = matWorld;\n  #else\n    matWorld = cc_matWorld;\n    matWorldIT = cc_matWorldIT;\n  #endif\n}\nlayout(set = 1, binding = 0) uniform Constants {\n  vec4 tilingOffset;\n  vec4 albedo;\n  vec4 albedoScaleAndCutoff;\n  vec4 pbrParams;\n  vec4 emissive;\n  vec4 emissiveScaleParam;\n};\nlayout(set = 0, binding = 2) uniform CCShadow {\n  highp mat4 cc_matLightPlaneProj;\n  highp mat4 cc_matLightView;\n  highp mat4 cc_matLightViewProj;\n  highp vec4 cc_shadowInvProjDepthInfo;\n  highp vec4 cc_shadowProjDepthInfo;\n  highp vec4 cc_shadowProjInfo;\n  mediump vec4 cc_shadowNFLSInfo;\n  mediump vec4 cc_shadowWHPBInfo;\n  mediump vec4 cc_shadowLPNNInfo;\n  lowp vec4 cc_shadowColor;\n  mediump vec4 cc_planarNDInfo;\n};\n#if HAS_SECOND_UV || CC_USE_LIGHTMAP\n  layout(location = 14) in vec2 a_texCoord1;\n#endif\nlayout(location = 0) out vec2 v_uv;\nlayout(location = 1) out vec2 v_uv1;\nlayout(location = 2) out vec4 v_worldPos;\nlayout(location = 3) out float v_clip_depth;\nvec4 vert () {\n  StandardVertInput In;\n  CCVertInput(In);\n  mat4 matWorld, matWorldIT;\n  CCGetWorldMatrixFull(matWorld, matWorldIT);\n  v_worldPos = matWorld * In.position;\n  vec4 clipPos = cc_matLightViewProj * v_worldPos;\n  v_uv = a_texCoord * tilingOffset.xy + tilingOffset.zw;\n  #if HAS_SECOND_UV\n    v_uv1 = a_texCoord1 * tilingOffset.xy + tilingOffset.zw;\n  #endif\n  v_clip_depth = clipPos.z / clipPos.w * 0.5 + 0.5;\n  return clipPos;\n}\nvoid main() { gl_Position = vert(); }","frag":"\nprecision highp float;\nlayout(set = 1, binding = 0) uniform Constants {\n  vec4 tilingOffset;\n  vec4 albedo;\n  vec4 albedoScaleAndCutoff;\n  vec4 pbrParams;\n  vec4 emissive;\n  vec4 emissiveScaleParam;\n};\nvec4 packDepthToRGBA (float depth) {\n  vec4 ret = vec4(1.0, 255.0, 65025.0, 16581375.0) * depth;\n  ret = fract(ret);\n  ret -= vec4(ret.yzw, 0.0) / 255.0;\n  return ret;\n}\nlayout(set = 0, binding = 2) uniform CCShadow {\n  highp mat4 cc_matLightPlaneProj;\n  highp mat4 cc_matLightView;\n  highp mat4 cc_matLightViewProj;\n  highp vec4 cc_shadowInvProjDepthInfo;\n  highp vec4 cc_shadowProjDepthInfo;\n  highp vec4 cc_shadowProjInfo;\n  mediump vec4 cc_shadowNFLSInfo;\n  mediump vec4 cc_shadowWHPBInfo;\n  mediump vec4 cc_shadowLPNNInfo;\n  lowp vec4 cc_shadowColor;\n  mediump vec4 cc_planarNDInfo;\n};\nlayout(location = 0) in vec2 v_uv;\nlayout(location = 1) in vec2 v_uv1;\nlayout(location = 2) in vec4 v_worldPos;\nlayout(location = 3) in float v_clip_depth;\n#if USE_ALBEDO_MAP\n  layout(set = 1, binding = 1) uniform sampler2D albedoMap;\n#endif\n#if USE_ALPHA_TEST\n#endif\nvec4 frag () {\n  vec4 baseColor = albedo;\n  #if USE_ALBEDO_MAP\n    baseColor *= texture(albedoMap, ALBEDO_UV);\n  #endif\n  #if USE_ALPHA_TEST\n    if (baseColor.ALPHA_TEST_CHANNEL < albedoScaleAndCutoff.w) discard;\n  #endif\n  if(cc_shadowLPNNInfo.x > 0.000001 && cc_shadowLPNNInfo.x < 1.999999) {\n    if (cc_shadowNFLSInfo.z > 0.000001) {\n      vec4 viewStartPos = cc_matLightView * v_worldPos;\n      float dist = length(viewStartPos.xyz);\n      float linearDepth = cc_shadowNFLSInfo.x + (-dist / (cc_shadowNFLSInfo.y - cc_shadowNFLSInfo.x));\n      return vec4(linearDepth, 1.0, 1.0, 1.0);\n    }\n  }\n  if (cc_shadowLPNNInfo.y > 0.000001) {\n    return packDepthToRGBA(v_clip_depth);\n  }\n  return vec4(v_clip_depth, 1.0, 1.0, 1.0);\n}\nlayout(location = 0) out vec4 cc_FragColor;\nvoid main() { cc_FragColor = frag(); }"},"glsl3":{"vert":"\nprecision highp float;\n#define QUATER_PI         0.78539816340\n#define HALF_PI           1.57079632679\n#define PI                3.14159265359\n#define PI2               6.28318530718\n#define PI4               12.5663706144\n#define INV_QUATER_PI     1.27323954474\n#define INV_HALF_PI       0.63661977237\n#define INV_PI            0.31830988618\n#define INV_PI2           0.15915494309\n#define INV_PI4           0.07957747155\n#define EPSILON           1e-6\n#define EPSILON_LOWP      1e-4\n#define LOG2              1.442695\n#define EXP_VALUE         2.71828183f\n#define FP_MAX            65504.0\n#define FP_SCALE          0.0009765625\n#define FP_SCALE_INV      1024.0\n#define GRAY_VECTOR       vec3(0.299, 0.587, 0.114)\nhighp float decode32 (highp vec4 rgba) {\n  rgba = rgba * 255.0;\n  highp float Sign = 1.0 - (step(128.0, (rgba[3]) + 0.5)) * 2.0;\n  highp float Exponent = 2.0 * (mod(float(int((rgba[3]) + 0.5)), 128.0)) + (step(128.0, (rgba[2]) + 0.5)) - 127.0;\n  highp float Mantissa = (mod(float(int((rgba[2]) + 0.5)), 128.0)) * 65536.0 + rgba[1] * 256.0 + rgba[0] + 8388608.0;\n  return Sign * exp2(Exponent - 23.0) * Mantissa;\n}\nstruct StandardVertInput {\n  highp vec4 position;\n  vec3 normal;\n  vec4 tangent;\n};\nin vec3 a_position;\nin vec3 a_normal;\nin vec2 a_texCoord;\nin vec4 a_tangent;\n#if CC_USE_SKINNING\n    in vec4 a_joints;\n  in vec4 a_weights;\n#endif\n#if USE_INSTANCING\n  #if CC_USE_BAKED_ANIMATION\n    in highp vec4 a_jointAnimInfo;\n  #endif\n  in vec4 a_matWorld0;\n  in vec4 a_matWorld1;\n  in vec4 a_matWorld2;\n  #if CC_USE_LIGHTMAP\n    in vec4 a_lightingMapUVParam;\n  #endif\n  #if CC_RECEIVE_SHADOW\n    in vec2 a_localShadowBias;\n  #endif\n#elif USE_BATCHING\n  in float a_dyn_batch_id;\n#endif\n#if CC_USE_MORPH\n    in float a_vertexId;\n    int getVertexId() {\n      return int(a_vertexId);\n    }\n#endif\n#if CC_USE_MORPH\n  layout(std140) uniform CCMorph {\n    vec4 cc_displacementWeights[15];\n    vec4 cc_displacementTextureInfo;\n  };\n  vec2 getPixelLocation(vec2 textureResolution, int pixelIndex) {\n    float pixelIndexF = float(pixelIndex);\n    float x = mod(pixelIndexF, textureResolution.x);\n    float y = floor(pixelIndexF / textureResolution.x);\n    return vec2(x, y);\n  }\n  vec2 getPixelCoordFromLocation(vec2 location, vec2 textureResolution) {\n    return (vec2(location.x, location.y) + .5) / textureResolution;\n  }\n  #if CC_DEVICE_SUPPORT_FLOAT_TEXTURE\n      vec4 fetchVec3ArrayFromTexture(sampler2D tex, int pixelIndex) {\n        ivec2 texSize = textureSize(tex, 0);\n        return texelFetch(tex, ivec2(pixelIndex % texSize.x, pixelIndex / texSize.x), 0);\n      }\n  #else\n    vec4 fetchVec3ArrayFromTexture(sampler2D tex, int elementIndex) {\n      int pixelIndex = elementIndex * 4;\n      vec2 location = getPixelLocation(cc_displacementTextureInfo.xy, pixelIndex);\n      vec2 x = getPixelCoordFromLocation(location + vec2(0.0, 0.0), cc_displacementTextureInfo.xy);\n      vec2 y = getPixelCoordFromLocation(location + vec2(1.0, 0.0), cc_displacementTextureInfo.xy);\n      vec2 z = getPixelCoordFromLocation(location + vec2(2.0, 0.0), cc_displacementTextureInfo.xy);\n      return vec4(\n        decode32(texture(tex, x)),\n        decode32(texture(tex, y)),\n        decode32(texture(tex, z)),\n        1.0\n      );\n    }\n  #endif\n  float getDisplacementWeight(int index) {\n    int quot = index / 4;\n    int remainder = index - quot * 4;\n    if (remainder == 0) {\n      return cc_displacementWeights[quot].x;\n    } else if (remainder == 1) {\n      return cc_displacementWeights[quot].y;\n    } else if (remainder == 2) {\n      return cc_displacementWeights[quot].z;\n    } else {\n      return cc_displacementWeights[quot].w;\n    }\n  }\n  vec3 getVec3DisplacementFromTexture(sampler2D tex, int vertexIndex) {\n  #if CC_MORPH_PRECOMPUTED\n    return fetchVec3ArrayFromTexture(tex, vertexIndex).rgb;\n  #else\n    vec3 result = vec3(0, 0, 0);\n    int nVertices = int(cc_displacementTextureInfo.z);\n    for (int iTarget = 0; iTarget < CC_MORPH_TARGET_COUNT; ++iTarget) {\n      result += (fetchVec3ArrayFromTexture(tex, nVertices * iTarget + vertexIndex).rgb * getDisplacementWeight(iTarget));\n    }\n    return result;\n  #endif\n  }\n  #if CC_MORPH_TARGET_HAS_POSITION\n    uniform sampler2D cc_PositionDisplacements;\n    vec3 getPositionDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_PositionDisplacements, vertexId);\n    }\n  #endif\n  #if CC_MORPH_TARGET_HAS_NORMAL\n    uniform sampler2D cc_NormalDisplacements;\n    vec3 getNormalDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_NormalDisplacements, vertexId);\n    }\n  #endif\n  #if CC_MORPH_TARGET_HAS_TANGENT\n    uniform sampler2D cc_TangentDisplacements;\n    vec3 getTangentDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_TangentDisplacements, vertexId);\n    }\n  #endif\n  void applyMorph (inout vec4 position, inout vec3 normal, inout vec4 tangent) {\n    int vertexId = getVertexId();\n  #if CC_MORPH_TARGET_HAS_POSITION\n    position.xyz = position.xyz + getPositionDisplacement(vertexId);\n  #endif\n  #if CC_MORPH_TARGET_HAS_NORMAL\n    normal.xyz = normal.xyz + getNormalDisplacement(vertexId);\n  #endif\n  #if CC_MORPH_TARGET_HAS_TANGENT\n    tangent.xyz = tangent.xyz + getTangentDisplacement(vertexId);\n  #endif\n  }\n  void applyMorph (inout vec4 position) {\n  #if CC_MORPH_TARGET_HAS_POSITION\n    position.xyz = position.xyz + getPositionDisplacement(getVertexId());\n  #endif\n  }\n#endif\n#if CC_USE_SKINNING\n  #if CC_USE_BAKED_ANIMATION\n    layout(std140) uniform CCSkinningTexture {\n      highp vec4 cc_jointTextureInfo;\n    };\n    layout(std140) uniform CCSkinningAnimation {\n      highp vec4 cc_jointAnimInfo;\n    };\n    uniform highp sampler2D cc_jointTexture;\n    void CCGetJointTextureCoords(float pixelsPerJoint, float jointIdx, out highp float x, out highp float y, out highp float invSize)\n    {\n      #if USE_INSTANCING\n        highp float temp = pixelsPerJoint * (a_jointAnimInfo.x * a_jointAnimInfo.y + jointIdx) + a_jointAnimInfo.z;\n      #else\n        highp float temp = pixelsPerJoint * (cc_jointAnimInfo.x * cc_jointTextureInfo.y + jointIdx) + cc_jointTextureInfo.z;\n      #endif\n      invSize = cc_jointTextureInfo.w;\n      highp float tempY = floor(temp * invSize);\n      x = floor(temp - tempY * cc_jointTextureInfo.x);\n      y = (tempY + 0.5) * invSize;\n    }\n  #else\n    layout(std140) uniform CCSkinning {\n      highp vec4 cc_joints[30 * 3];\n    };\n  #endif\n  #if CC_USE_BAKED_ANIMATION\n    #if CC_DEVICE_SUPPORT_FLOAT_TEXTURE\n      mat4 getJointMatrix (float i) {\n        highp float x, y, invSize;\n        CCGetJointTextureCoords(3.0, i, x, y, invSize);\n        vec4 v1 = texture(cc_jointTexture, vec2((x + 0.5) * invSize, y));\n        vec4 v2 = texture(cc_jointTexture, vec2((x + 1.5) * invSize, y));\n        vec4 v3 = texture(cc_jointTexture, vec2((x + 2.5) * invSize, y));\n        return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n      }\n    #else\n      mat4 getJointMatrix (float i) {\n        highp float x, y, invSize;\n        CCGetJointTextureCoords(12.0, i, x, y, invSize);\n        vec4 v1 = vec4(\n          decode32(texture(cc_jointTexture, vec2((x + 0.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 1.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 2.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 3.5) * invSize, y)))\n        );\n        vec4 v2 = vec4(\n          decode32(texture(cc_jointTexture, vec2((x + 4.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 5.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 6.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 7.5) * invSize, y)))\n        );\n        vec4 v3 = vec4(\n          decode32(texture(cc_jointTexture, vec2((x + 8.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 9.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 10.5) * invSize, y))),\n          decode32(texture(cc_jointTexture, vec2((x + 11.5) * invSize, y)))\n        );\n        return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n      }\n    #endif\n  #else\n    mat4 getJointMatrix (float i) {\n      int idx = int(i);\n      vec4 v1 = cc_joints[idx * 3];\n      vec4 v2 = cc_joints[idx * 3 + 1];\n      vec4 v3 = cc_joints[idx * 3 + 2];\n      return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n    }\n  #endif\n  mat4 skinMatrix () {\n    vec4 joints = vec4(a_joints);\n    return getJointMatrix(joints.x) * a_weights.x\n         + getJointMatrix(joints.y) * a_weights.y\n         + getJointMatrix(joints.z) * a_weights.z\n         + getJointMatrix(joints.w) * a_weights.w;\n  }\n  void CCSkin (inout vec4 position) {\n    mat4 m = skinMatrix();\n    position = m * position;\n  }\n  void CCSkin (inout vec4 position, inout vec3 normal, inout vec4 tangent) {\n    mat4 m = skinMatrix();\n    position = m * position;\n    normal = (m * vec4(normal, 0.0)).xyz;\n    tangent.xyz = (m * vec4(tangent.xyz, 0.0)).xyz;\n  }\n#endif\nvoid CCVertInput(inout StandardVertInput In)\n{\n    In.position = vec4(a_position, 1.0);\n    In.normal = a_normal;\n    In.tangent = a_tangent;\n  #if CC_USE_MORPH\n    applyMorph(In.position, In.normal, In.tangent);\n  #endif\n  #if CC_USE_SKINNING\n    CCSkin(In.position, In.normal, In.tangent);\n  #endif\n}\n#if !USE_INSTANCING\n  #if USE_BATCHING\n    layout(std140) uniform CCLocalBatched {\n      highp mat4 cc_matWorlds[10];\n    };\n  #else\n    layout(std140) uniform CCLocal {\n      highp mat4 cc_matWorld;\n      highp mat4 cc_matWorldIT;\n      highp vec4 cc_lightingMapUVParam;\n      highp vec4 cc_localShadowBias;\n    };\n  #endif\n#endif\nvoid CCGetWorldMatrixFull(out mat4 matWorld, out mat4 matWorldIT)\n{\n  #if USE_INSTANCING\n    matWorld = mat4(\n      vec4(a_matWorld0.xyz, 0.0),\n      vec4(a_matWorld1.xyz, 0.0),\n      vec4(a_matWorld2.xyz, 0.0),\n      vec4(a_matWorld0.w, a_matWorld1.w, a_matWorld2.w, 1.0)\n    );\n    matWorldIT = matWorld;\n  #elif USE_BATCHING\n    matWorld = cc_matWorlds[int(a_dyn_batch_id)];\n    matWorldIT = matWorld;\n  #else\n    matWorld = cc_matWorld;\n    matWorldIT = cc_matWorldIT;\n  #endif\n}\nlayout(std140) uniform Constants {\n  vec4 tilingOffset;\n  vec4 albedo;\n  vec4 albedoScaleAndCutoff;\n  vec4 pbrParams;\n  vec4 emissive;\n  vec4 emissiveScaleParam;\n};\nlayout(std140) uniform CCShadow {\n  highp mat4 cc_matLightPlaneProj;\n  highp mat4 cc_matLightView;\n  highp mat4 cc_matLightViewProj;\n  highp vec4 cc_shadowInvProjDepthInfo;\n  highp vec4 cc_shadowProjDepthInfo;\n  highp vec4 cc_shadowProjInfo;\n  mediump vec4 cc_shadowNFLSInfo;\n  mediump vec4 cc_shadowWHPBInfo;\n  mediump vec4 cc_shadowLPNNInfo;\n  lowp vec4 cc_shadowColor;\n  mediump vec4 cc_planarNDInfo;\n};\n#if HAS_SECOND_UV || CC_USE_LIGHTMAP\n  in vec2 a_texCoord1;\n#endif\nout vec2 v_uv;\nout vec2 v_uv1;\nout vec4 v_worldPos;\nout float v_clip_depth;\nvec4 vert () {\n  StandardVertInput In;\n  CCVertInput(In);\n  mat4 matWorld, matWorldIT;\n  CCGetWorldMatrixFull(matWorld, matWorldIT);\n  v_worldPos = matWorld * In.position;\n  vec4 clipPos = cc_matLightViewProj * v_worldPos;\n  v_uv = a_texCoord * tilingOffset.xy + tilingOffset.zw;\n  #if HAS_SECOND_UV\n    v_uv1 = a_texCoord1 * tilingOffset.xy + tilingOffset.zw;\n  #endif\n  v_clip_depth = clipPos.z / clipPos.w * 0.5 + 0.5;\n  return clipPos;\n}\nvoid main() { gl_Position = vert(); }","frag":"\nprecision highp float;\nlayout(std140) uniform Constants {\n  vec4 tilingOffset;\n  vec4 albedo;\n  vec4 albedoScaleAndCutoff;\n  vec4 pbrParams;\n  vec4 emissive;\n  vec4 emissiveScaleParam;\n};\nvec4 packDepthToRGBA (float depth) {\n  vec4 ret = vec4(1.0, 255.0, 65025.0, 16581375.0) * depth;\n  ret = fract(ret);\n  ret -= vec4(ret.yzw, 0.0) / 255.0;\n  return ret;\n}\nlayout(std140) uniform CCShadow {\n  highp mat4 cc_matLightPlaneProj;\n  highp mat4 cc_matLightView;\n  highp mat4 cc_matLightViewProj;\n  highp vec4 cc_shadowInvProjDepthInfo;\n  highp vec4 cc_shadowProjDepthInfo;\n  highp vec4 cc_shadowProjInfo;\n  mediump vec4 cc_shadowNFLSInfo;\n  mediump vec4 cc_shadowWHPBInfo;\n  mediump vec4 cc_shadowLPNNInfo;\n  lowp vec4 cc_shadowColor;\n  mediump vec4 cc_planarNDInfo;\n};\nin vec2 v_uv;\nin vec2 v_uv1;\nin vec4 v_worldPos;\nin float v_clip_depth;\n#if USE_ALBEDO_MAP\n  uniform sampler2D albedoMap;\n#endif\n#if USE_ALPHA_TEST\n#endif\nvec4 frag () {\n  vec4 baseColor = albedo;\n  #if USE_ALBEDO_MAP\n    baseColor *= texture(albedoMap, ALBEDO_UV);\n  #endif\n  #if USE_ALPHA_TEST\n    if (baseColor.ALPHA_TEST_CHANNEL < albedoScaleAndCutoff.w) discard;\n  #endif\n  if(cc_shadowLPNNInfo.x > 0.000001 && cc_shadowLPNNInfo.x < 1.999999) {\n    if (cc_shadowNFLSInfo.z > 0.000001) {\n      vec4 viewStartPos = cc_matLightView * v_worldPos;\n      float dist = length(viewStartPos.xyz);\n      float linearDepth = cc_shadowNFLSInfo.x + (-dist / (cc_shadowNFLSInfo.y - cc_shadowNFLSInfo.x));\n      return vec4(linearDepth, 1.0, 1.0, 1.0);\n    }\n  }\n  if (cc_shadowLPNNInfo.y > 0.000001) {\n    return packDepthToRGBA(v_clip_depth);\n  }\n  return vec4(v_clip_depth, 1.0, 1.0, 1.0);\n}\nlayout(location = 0) out vec4 cc_FragColor;\nvoid main() { cc_FragColor = frag(); }"},"glsl1":{"vert":"\nprecision highp float;\n#define QUATER_PI         0.78539816340\n#define HALF_PI           1.57079632679\n#define PI                3.14159265359\n#define PI2               6.28318530718\n#define PI4               12.5663706144\n#define INV_QUATER_PI     1.27323954474\n#define INV_HALF_PI       0.63661977237\n#define INV_PI            0.31830988618\n#define INV_PI2           0.15915494309\n#define INV_PI4           0.07957747155\n#define EPSILON           1e-6\n#define EPSILON_LOWP      1e-4\n#define LOG2              1.442695\n#define EXP_VALUE         2.71828183f\n#define FP_MAX            65504.0\n#define FP_SCALE          0.0009765625\n#define FP_SCALE_INV      1024.0\n#define GRAY_VECTOR       vec3(0.299, 0.587, 0.114)\nhighp float decode32 (highp vec4 rgba) {\n  rgba = rgba * 255.0;\n  highp float Sign = 1.0 - (step(128.0, (rgba[3]) + 0.5)) * 2.0;\n  highp float Exponent = 2.0 * (mod(float(int((rgba[3]) + 0.5)), 128.0)) + (step(128.0, (rgba[2]) + 0.5)) - 127.0;\n  highp float Mantissa = (mod(float(int((rgba[2]) + 0.5)), 128.0)) * 65536.0 + rgba[1] * 256.0 + rgba[0] + 8388608.0;\n  return Sign * exp2(Exponent - 23.0) * Mantissa;\n}\nstruct StandardVertInput {\n  highp vec4 position;\n  vec3 normal;\n  vec4 tangent;\n};\nattribute vec3 a_position;\nattribute vec3 a_normal;\nattribute vec2 a_texCoord;\nattribute vec4 a_tangent;\n#if CC_USE_SKINNING\n    attribute vec4 a_joints;\n  attribute vec4 a_weights;\n#endif\n#if USE_INSTANCING\n  #if CC_USE_BAKED_ANIMATION\n    attribute highp vec4 a_jointAnimInfo;\n  #endif\n  attribute vec4 a_matWorld0;\n  attribute vec4 a_matWorld1;\n  attribute vec4 a_matWorld2;\n  #if CC_USE_LIGHTMAP\n    attribute vec4 a_lightingMapUVParam;\n  #endif\n  #if CC_RECEIVE_SHADOW\n    attribute vec2 a_localShadowBias;\n  #endif\n#elif USE_BATCHING\n  attribute float a_dyn_batch_id;\n#endif\n#if CC_USE_MORPH\n    attribute float a_vertexId;\n    int getVertexId() {\n      return int(a_vertexId);\n    }\n#endif\n#if CC_USE_MORPH\n  uniform vec4 cc_displacementWeights[15];\n  uniform vec4 cc_displacementTextureInfo;\n  vec2 getPixelLocation(vec2 textureResolution, int pixelIndex) {\n    float pixelIndexF = float(pixelIndex);\n    float x = mod(pixelIndexF, textureResolution.x);\n    float y = floor(pixelIndexF / textureResolution.x);\n    return vec2(x, y);\n  }\n  vec2 getPixelCoordFromLocation(vec2 location, vec2 textureResolution) {\n    return (vec2(location.x, location.y) + .5) / textureResolution;\n  }\n  #if CC_DEVICE_SUPPORT_FLOAT_TEXTURE\n      vec4 fetchVec3ArrayFromTexture(sampler2D tex, int elementIndex) {\n        int pixelIndex = elementIndex;\n        vec2 location = getPixelLocation(cc_displacementTextureInfo.xy, pixelIndex);\n        vec2 uv = getPixelCoordFromLocation(location, cc_displacementTextureInfo.xy);\n        return texture2D(tex, uv);\n      }\n  #else\n    vec4 fetchVec3ArrayFromTexture(sampler2D tex, int elementIndex) {\n      int pixelIndex = elementIndex * 4;\n      vec2 location = getPixelLocation(cc_displacementTextureInfo.xy, pixelIndex);\n      vec2 x = getPixelCoordFromLocation(location + vec2(0.0, 0.0), cc_displacementTextureInfo.xy);\n      vec2 y = getPixelCoordFromLocation(location + vec2(1.0, 0.0), cc_displacementTextureInfo.xy);\n      vec2 z = getPixelCoordFromLocation(location + vec2(2.0, 0.0), cc_displacementTextureInfo.xy);\n      return vec4(\n        decode32(texture2D(tex, x)),\n        decode32(texture2D(tex, y)),\n        decode32(texture2D(tex, z)),\n        1.0\n      );\n    }\n  #endif\n  float getDisplacementWeight(int index) {\n    int quot = index / 4;\n    int remainder = index - quot * 4;\n    if (remainder == 0) {\n      return cc_displacementWeights[quot].x;\n    } else if (remainder == 1) {\n      return cc_displacementWeights[quot].y;\n    } else if (remainder == 2) {\n      return cc_displacementWeights[quot].z;\n    } else {\n      return cc_displacementWeights[quot].w;\n    }\n  }\n  vec3 getVec3DisplacementFromTexture(sampler2D tex, int vertexIndex) {\n  #if CC_MORPH_PRECOMPUTED\n    return fetchVec3ArrayFromTexture(tex, vertexIndex).rgb;\n  #else\n    vec3 result = vec3(0, 0, 0);\n    int nVertices = int(cc_displacementTextureInfo.z);\n    for (int iTarget = 0; iTarget < CC_MORPH_TARGET_COUNT; ++iTarget) {\n      result += (fetchVec3ArrayFromTexture(tex, nVertices * iTarget + vertexIndex).rgb * getDisplacementWeight(iTarget));\n    }\n    return result;\n  #endif\n  }\n  #if CC_MORPH_TARGET_HAS_POSITION\n    uniform sampler2D cc_PositionDisplacements;\n    vec3 getPositionDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_PositionDisplacements, vertexId);\n    }\n  #endif\n  #if CC_MORPH_TARGET_HAS_NORMAL\n    uniform sampler2D cc_NormalDisplacements;\n    vec3 getNormalDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_NormalDisplacements, vertexId);\n    }\n  #endif\n  #if CC_MORPH_TARGET_HAS_TANGENT\n    uniform sampler2D cc_TangentDisplacements;\n    vec3 getTangentDisplacement(int vertexId) {\n      return getVec3DisplacementFromTexture(cc_TangentDisplacements, vertexId);\n    }\n  #endif\n  void applyMorph (inout vec4 position, inout vec3 normal, inout vec4 tangent) {\n    int vertexId = getVertexId();\n  #if CC_MORPH_TARGET_HAS_POSITION\n    position.xyz = position.xyz + getPositionDisplacement(vertexId);\n  #endif\n  #if CC_MORPH_TARGET_HAS_NORMAL\n    normal.xyz = normal.xyz + getNormalDisplacement(vertexId);\n  #endif\n  #if CC_MORPH_TARGET_HAS_TANGENT\n    tangent.xyz = tangent.xyz + getTangentDisplacement(vertexId);\n  #endif\n  }\n  void applyMorph (inout vec4 position) {\n  #if CC_MORPH_TARGET_HAS_POSITION\n    position.xyz = position.xyz + getPositionDisplacement(getVertexId());\n  #endif\n  }\n#endif\n#if CC_USE_SKINNING\n  #if CC_USE_BAKED_ANIMATION\n    uniform highp vec4 cc_jointTextureInfo;\n    uniform highp vec4 cc_jointAnimInfo;\n    uniform highp sampler2D cc_jointTexture;\n    void CCGetJointTextureCoords(float pixelsPerJoint, float jointIdx, out highp float x, out highp float y, out highp float invSize)\n    {\n      #if USE_INSTANCING\n        highp float temp = pixelsPerJoint * (a_jointAnimInfo.x * a_jointAnimInfo.y + jointIdx) + a_jointAnimInfo.z;\n      #else\n        highp float temp = pixelsPerJoint * (cc_jointAnimInfo.x * cc_jointTextureInfo.y + jointIdx) + cc_jointTextureInfo.z;\n      #endif\n      invSize = cc_jointTextureInfo.w;\n      highp float tempY = floor(temp * invSize);\n      x = floor(temp - tempY * cc_jointTextureInfo.x);\n      y = (tempY + 0.5) * invSize;\n    }\n  #else\n    uniform highp vec4 cc_joints[90];\n  #endif\n  #if CC_USE_BAKED_ANIMATION\n    #if CC_DEVICE_SUPPORT_FLOAT_TEXTURE\n      mat4 getJointMatrix (float i) {\n        highp float x, y, invSize;\n        CCGetJointTextureCoords(3.0, i, x, y, invSize);\n        vec4 v1 = texture2D(cc_jointTexture, vec2((x + 0.5) * invSize, y));\n        vec4 v2 = texture2D(cc_jointTexture, vec2((x + 1.5) * invSize, y));\n        vec4 v3 = texture2D(cc_jointTexture, vec2((x + 2.5) * invSize, y));\n        return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n      }\n    #else\n      mat4 getJointMatrix (float i) {\n        highp float x, y, invSize;\n        CCGetJointTextureCoords(12.0, i, x, y, invSize);\n        vec4 v1 = vec4(\n          decode32(texture2D(cc_jointTexture, vec2((x + 0.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 1.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 2.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 3.5) * invSize, y)))\n        );\n        vec4 v2 = vec4(\n          decode32(texture2D(cc_jointTexture, vec2((x + 4.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 5.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 6.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 7.5) * invSize, y)))\n        );\n        vec4 v3 = vec4(\n          decode32(texture2D(cc_jointTexture, vec2((x + 8.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 9.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 10.5) * invSize, y))),\n          decode32(texture2D(cc_jointTexture, vec2((x + 11.5) * invSize, y)))\n        );\n        return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n      }\n    #endif\n  #else\n    mat4 getJointMatrix (float i) {\n      int idx = int(i);\n      vec4 v1 = cc_joints[idx * 3];\n      vec4 v2 = cc_joints[idx * 3 + 1];\n      vec4 v3 = cc_joints[idx * 3 + 2];\n      return mat4(vec4(v1.xyz, 0.0), vec4(v2.xyz, 0.0), vec4(v3.xyz, 0.0), vec4(v1.w, v2.w, v3.w, 1.0));\n    }\n  #endif\n  mat4 skinMatrix () {\n    vec4 joints = vec4(a_joints);\n    return getJointMatrix(joints.x) * a_weights.x\n         + getJointMatrix(joints.y) * a_weights.y\n         + getJointMatrix(joints.z) * a_weights.z\n         + getJointMatrix(joints.w) * a_weights.w;\n  }\n  void CCSkin (inout vec4 position) {\n    mat4 m = skinMatrix();\n    position = m * position;\n  }\n  void CCSkin (inout vec4 position, inout vec3 normal, inout vec4 tangent) {\n    mat4 m = skinMatrix();\n    position = m * position;\n    normal = (m * vec4(normal, 0.0)).xyz;\n    tangent.xyz = (m * vec4(tangent.xyz, 0.0)).xyz;\n  }\n#endif\nvoid CCVertInput(inout StandardVertInput In)\n{\n    In.position = vec4(a_position, 1.0);\n    In.normal = a_normal;\n    In.tangent = a_tangent;\n  #if CC_USE_MORPH\n    applyMorph(In.position, In.normal, In.tangent);\n  #endif\n  #if CC_USE_SKINNING\n    CCSkin(In.position, In.normal, In.tangent);\n  #endif\n}\n#if !USE_INSTANCING\n  #if USE_BATCHING\n    uniform highp mat4 cc_matWorlds[10];\n  #else\n    uniform highp mat4 cc_matWorld;\n  uniform highp mat4 cc_matWorldIT;\n  #endif\n#endif\nvoid CCGetWorldMatrixFull(out mat4 matWorld, out mat4 matWorldIT)\n{\n  #if USE_INSTANCING\n    matWorld = mat4(\n      vec4(a_matWorld0.xyz, 0.0),\n      vec4(a_matWorld1.xyz, 0.0),\n      vec4(a_matWorld2.xyz, 0.0),\n      vec4(a_matWorld0.w, a_matWorld1.w, a_matWorld2.w, 1.0)\n    );\n    matWorldIT = matWorld;\n  #elif USE_BATCHING\n    matWorld = cc_matWorlds[int(a_dyn_batch_id)];\n    matWorldIT = matWorld;\n  #else\n    matWorld = cc_matWorld;\n    matWorldIT = cc_matWorldIT;\n  #endif\n}\n    uniform vec4 tilingOffset;\nuniform highp mat4 cc_matLightViewProj;\n#if HAS_SECOND_UV || CC_USE_LIGHTMAP\n  attribute vec2 a_texCoord1;\n#endif\nvarying vec2 v_uv;\nvarying vec2 v_uv1;\nvarying vec4 v_worldPos;\nvarying float v_clip_depth;\nvec4 vert () {\n  StandardVertInput In;\n  CCVertInput(In);\n  mat4 matWorld, matWorldIT;\n  CCGetWorldMatrixFull(matWorld, matWorldIT);\n  v_worldPos = matWorld * In.position;\n  vec4 clipPos = cc_matLightViewProj * v_worldPos;\n  v_uv = a_texCoord * tilingOffset.xy + tilingOffset.zw;\n  #if HAS_SECOND_UV\n    v_uv1 = a_texCoord1 * tilingOffset.xy + tilingOffset.zw;\n  #endif\n  v_clip_depth = clipPos.z / clipPos.w * 0.5 + 0.5;\n  return clipPos;\n}\nvoid main() { gl_Position = vert(); }","frag":"\nprecision highp float;\n   uniform vec4 albedo;\n   uniform vec4 albedoScaleAndCutoff;\nvec4 packDepthToRGBA (float depth) {\n  vec4 ret = vec4(1.0, 255.0, 65025.0, 16581375.0) * depth;\n  ret = fract(ret);\n  ret -= vec4(ret.yzw, 0.0) / 255.0;\n  return ret;\n}\nuniform highp mat4 cc_matLightView;\n  uniform mediump vec4 cc_shadowNFLSInfo;\n  uniform mediump vec4 cc_shadowLPNNInfo;\nvarying vec2 v_uv;\nvarying vec2 v_uv1;\nvarying vec4 v_worldPos;\nvarying float v_clip_depth;\n#if USE_ALBEDO_MAP\n  uniform sampler2D albedoMap;\n#endif\n#if USE_ALPHA_TEST\n#endif\nvec4 frag () {\n  vec4 baseColor = albedo;\n  #if USE_ALBEDO_MAP\n    baseColor *= texture2D(albedoMap, ALBEDO_UV);\n  #endif\n  #if USE_ALPHA_TEST\n    if (baseColor.ALPHA_TEST_CHANNEL < albedoScaleAndCutoff.w) discard;\n  #endif\n  if(cc_shadowLPNNInfo.x > 0.000001 && cc_shadowLPNNInfo.x < 1.999999) {\n    if (cc_shadowNFLSInfo.z > 0.000001) {\n      vec4 viewStartPos = cc_matLightView * v_worldPos;\n      float dist = length(viewStartPos.xyz);\n      float linearDepth = cc_shadowNFLSInfo.x + (-dist / (cc_shadowNFLSInfo.y - cc_shadowNFLSInfo.x));\n      return vec4(linearDepth, 1.0, 1.0, 1.0);\n    }\n  }\n  if (cc_shadowLPNNInfo.y > 0.000001) {\n    return packDepthToRGBA(v_clip_depth);\n  }\n  return vec4(v_clip_depth, 1.0, 1.0, 1.0);\n}\nvoid main() { gl_FragColor = frag(); }"},"builtins":{"globals":{"blocks":[{"name":"CCShadow","defines":[]}],"samplerTextures":[],"buffers":[],"images":[]},"locals":{"blocks":[{"name":"CCMorph","defines":["CC_USE_MORPH"]},{"name":"CCSkinningTexture","defines":["CC_USE_SKINNING","CC_USE_BAKED_ANIMATION"]},{"name":"CCSkinningAnimation","defines":["CC_USE_SKINNING","CC_USE_BAKED_ANIMATION"]},{"name":"CCSkinning","defines":["CC_USE_SKINNING","!CC_USE_BAKED_ANIMATION"]},{"name":"CCLocalBatched","defines":["!USE_INSTANCING","USE_BATCHING"]},{"name":"CCLocal","defines":["!USE_INSTANCING","!USE_BATCHING"]}],"samplerTextures":[{"name":"cc_PositionDisplacements","defines":["CC_USE_MORPH","CC_MORPH_TARGET_HAS_POSITION"]},{"name":"cc_NormalDisplacements","defines":["CC_USE_MORPH","CC_MORPH_TARGET_HAS_NORMAL"]},{"name":"cc_TangentDisplacements","defines":["CC_USE_MORPH","CC_MORPH_TARGET_HAS_TANGENT"]},{"name":"cc_jointTexture","defines":["CC_USE_SKINNING","CC_USE_BAKED_ANIMATION"]}],"buffers":[],"images":[]},"statistics":{"CC_EFFECT_USED_VERTEX_UNIFORM_VECTORS":184,"CC_EFFECT_USED_FRAGMENT_UNIFORM_VECTORS":26}},"defines":[{"name":"USE_INSTANCING","type":"boolean","defines":[],"editor":{"elevated":true}},{"name":"USE_BATCHING","type":"boolean","defines":["!USE_INSTANCING"],"editor":{"elevated":true}},{"name":"CC_USE_SKINNING","type":"boolean","defines":[]},{"name":"CC_USE_BAKED_ANIMATION","type":"boolean","defines":["USE_INSTANCING"]},{"name":"CC_USE_LIGHTMAP","type":"boolean","defines":["USE_INSTANCING"]},{"name":"CC_RECEIVE_SHADOW","type":"boolean","defines":["USE_INSTANCING"]},{"name":"CC_USE_MORPH","type":"boolean","defines":[]},{"name":"CC_MORPH_TARGET_COUNT","type":"number","defines":["CC_USE_MORPH"],"range":[2,8]},{"name":"CC_MORPH_PRECOMPUTED","type":"boolean","defines":["CC_USE_MORPH"]},{"name":"CC_MORPH_TARGET_HAS_POSITION","type":"boolean","defines":["CC_USE_MORPH"]},{"name":"CC_MORPH_TARGET_HAS_NORMAL","type":"boolean","defines":["CC_USE_MORPH"]},{"name":"CC_MORPH_TARGET_HAS_TANGENT","type":"boolean","defines":["CC_USE_MORPH"]},{"name":"HAS_SECOND_UV","type":"boolean","defines":[]},{"name":"USE_ALBEDO_MAP","type":"boolean","defines":[]},{"name":"ALBEDO_UV","type":"string","defines":["USE_ALBEDO_MAP"],"options":["v_uv","v_uv1"]},{"name":"USE_ALPHA_TEST","type":"boolean","defines":[]},{"name":"ALPHA_TEST_CHANNEL","type":"string","defines":["USE_ALPHA_TEST"],"options":["a","r"]}]}],[{"name":"opaque","passes":[{"program":"../resources/project/game/killer/map/effect/outlineTaskAndPipe|standard-vs|standard-fs","properties":{"tilingOffset":{"type":16,"value":[1,1,0,0]},"mainColor":{"type":16,"value":[1,1,1,1],"editor":{"displayName":"Albedo","type":"color"},"handleInfo":["albedo",0,16]},"albedoScale":{"type":15,"value":[1,1,1],"handleInfo":["albedoScaleAndCutoff",0,15]},"alphaThreshold":{"type":13,"value":[0.5],"editor":{"parent":"USE_ALPHA_TEST","slide":true,"step":0.001,"range":[0,1]},"handleInfo":["albedoScaleAndCutoff",3,13]},"occlusion":{"type":13,"value":[1],"editor":{"slide":true,"step":0.001,"range":[0,1]},"handleInfo":["pbrParams",0,13]},"roughness":{"type":13,"value":[0.8],"editor":{"slide":true,"step":0.001,"range":[0,1]},"handleInfo":["pbrParams",1,13]},"metallic":{"type":13,"value":[0.6],"editor":{"slide":true,"step":0.001,"range":[0,1]},"handleInfo":["pbrParams",2,13]},"normalStrenth":{"type":13,"value":[1],"editor":{"parent":"USE_NORMAL_MAP","slide":true,"step":0.001,"range":[0,1]},"handleInfo":["pbrParams",3,13]},"emissive":{"type":16,"value":[0,0,0,1],"editor":{"type":"color"}},"emissiveScale":{"type":15,"value":[1,1,1],"handleInfo":["emissiveScaleParam",0,15]},"mainTexture":{"value":"grey","type":28,"editor":{"displayName":"AlbedoMap"},"handleInfo":["albedoMap",0,28]},"normalMap":{"value":"normal","type":28},"pbrMap":{"value":"grey","type":28},"metallicRoughnessMap":{"value":"grey","type":28},"occlusionMap":{"value":"white","type":28},"emissiveMap":{"value":"grey","type":28},"albedo":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,1,1,1]},"albedoScaleAndCutoff":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,1,1,0.5]},"pbrParams":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,0.8,0.6,1]},"emissiveScaleParam":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,1,1,0]},"albedoMap":{"type":28,"value":"grey","editor":{"visible":false,"deprecated":true}}},"migrations":{"properties":{"pbrParams":{"removeImmediately":true}}}},{"program":"../resources/project/game/killer/map/effect/outlineTaskAndPipe|fx-outline-vs:vert|fx-outline-fs:frag","rasterizerState":{"cullMode":1},"blendState":{"targets":[{"blend":true,"blendSrc":2,"blendDst":4,"blendSrcAlpha":2,"blendDstAlpha":4}]},"properties":{"rimColor":{"type":16,"value":[1,0,0,1],"editor":{"type":"color"}},"outlineParams":{"type":16,"value":[0.1,0.8,0.1,1],"editor":{"type":"vec4"}}}},{"phase":"deferred","propertyIndex":0,"program":"../resources/project/game/killer/map/effect/outlineTaskAndPipe|standard-vs|standard-fs","blendState":{"targets":[{"blend":false},{"blend":false},{"blend":false},{"blend":false}]},"properties":{"tilingOffset":{"type":16,"value":[1,1,0,0]},"mainColor":{"type":16,"value":[1,1,1,1],"editor":{"displayName":"Albedo","type":"color"},"handleInfo":["albedo",0,16]},"albedoScale":{"type":15,"value":[1,1,1],"handleInfo":["albedoScaleAndCutoff",0,15]},"alphaThreshold":{"type":13,"value":[0.5],"editor":{"parent":"USE_ALPHA_TEST","slide":true,"step":0.001,"range":[0,1]},"handleInfo":["albedoScaleAndCutoff",3,13]},"occlusion":{"type":13,"value":[1],"editor":{"slide":true,"step":0.001,"range":[0,1]},"handleInfo":["pbrParams",0,13]},"roughness":{"type":13,"value":[0.8],"editor":{"slide":true,"step":0.001,"range":[0,1]},"handleInfo":["pbrParams",1,13]},"metallic":{"type":13,"value":[0.6],"editor":{"slide":true,"step":0.001,"range":[0,1]},"handleInfo":["pbrParams",2,13]},"normalStrenth":{"type":13,"value":[1],"editor":{"parent":"USE_NORMAL_MAP","slide":true,"step":0.001,"range":[0,1]},"handleInfo":["pbrParams",3,13]},"emissive":{"type":16,"value":[0,0,0,1],"editor":{"type":"color"}},"emissiveScale":{"type":15,"value":[1,1,1],"handleInfo":["emissiveScaleParam",0,15]},"mainTexture":{"value":"grey","type":28,"editor":{"displayName":"AlbedoMap"},"handleInfo":["albedoMap",0,28]},"normalMap":{"value":"normal","type":28},"pbrMap":{"value":"grey","type":28},"metallicRoughnessMap":{"value":"grey","type":28},"occlusionMap":{"value":"white","type":28},"emissiveMap":{"value":"grey","type":28},"albedo":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,1,1,1]},"albedoScaleAndCutoff":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,1,1,0.5]},"pbrParams":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,0.8,0.6,1]},"emissiveScaleParam":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,1,1,0]},"albedoMap":{"type":28,"value":"grey","editor":{"visible":false,"deprecated":true}}}},{"phase":"forward-add","propertyIndex":0,"program":"../resources/project/game/killer/map/effect/outlineTaskAndPipe|standard-vs|standard-fs","embeddedMacros":{"CC_FORWARD_ADD":true},"blendState":{"targets":[{"blend":true,"blendSrc":1,"blendDst":1,"blendSrcAlpha":0,"blendDstAlpha":1}]},"depthStencilState":{"depthFunc":2,"depthTest":true,"depthWrite":false},"properties":{"tilingOffset":{"type":16,"value":[1,1,0,0]},"mainColor":{"type":16,"value":[1,1,1,1],"editor":{"displayName":"Albedo","type":"color"},"handleInfo":["albedo",0,16]},"albedoScale":{"type":15,"value":[1,1,1],"handleInfo":["albedoScaleAndCutoff",0,15]},"alphaThreshold":{"type":13,"value":[0.5],"editor":{"parent":"USE_ALPHA_TEST","slide":true,"step":0.001,"range":[0,1]},"handleInfo":["albedoScaleAndCutoff",3,13]},"occlusion":{"type":13,"value":[1],"editor":{"slide":true,"step":0.001,"range":[0,1]},"handleInfo":["pbrParams",0,13]},"roughness":{"type":13,"value":[0.8],"editor":{"slide":true,"step":0.001,"range":[0,1]},"handleInfo":["pbrParams",1,13]},"metallic":{"type":13,"value":[0.6],"editor":{"slide":true,"step":0.001,"range":[0,1]},"handleInfo":["pbrParams",2,13]},"normalStrenth":{"type":13,"value":[1],"editor":{"parent":"USE_NORMAL_MAP","slide":true,"step":0.001,"range":[0,1]},"handleInfo":["pbrParams",3,13]},"emissive":{"type":16,"value":[0,0,0,1],"editor":{"type":"color"}},"emissiveScale":{"type":15,"value":[1,1,1],"handleInfo":["emissiveScaleParam",0,15]},"mainTexture":{"value":"grey","type":28,"editor":{"displayName":"AlbedoMap"},"handleInfo":["albedoMap",0,28]},"normalMap":{"value":"normal","type":28},"pbrMap":{"value":"grey","type":28},"metallicRoughnessMap":{"value":"grey","type":28},"occlusionMap":{"value":"white","type":28},"emissiveMap":{"value":"grey","type":28},"albedo":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,1,1,1]},"albedoScaleAndCutoff":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,1,1,0.5]},"pbrParams":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,0.8,0.6,1]},"emissiveScaleParam":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,1,1,0]},"albedoMap":{"type":28,"value":"grey","editor":{"visible":false,"deprecated":true}}}},{"phase":"shadow-caster","propertyIndex":0,"program":"../resources/project/game/killer/map/effect/outlineTaskAndPipe|shadow-caster-vs:vert|shadow-caster-fs:frag","rasterizerState":{"cullMode":1},"properties":{"tilingOffset":{"type":16,"value":[1,1,0,0]},"mainColor":{"type":16,"value":[1,1,1,1],"editor":{"displayName":"Albedo","type":"color"},"handleInfo":["albedo",0,16]},"albedoScale":{"type":15,"value":[1,1,1],"handleInfo":["albedoScaleAndCutoff",0,15]},"alphaThreshold":{"type":13,"value":[0.5],"editor":{"parent":"USE_ALPHA_TEST"},"handleInfo":["albedoScaleAndCutoff",3,13]},"occlusion":{"type":13,"value":[1],"handleInfo":["pbrParams",0,13]},"roughness":{"type":13,"value":[0.8],"handleInfo":["pbrParams",1,13]},"metallic":{"type":13,"value":[0.6],"handleInfo":["pbrParams",2,13]},"normalStrenth":{"type":13,"value":[1],"editor":{"parent":"USE_NORMAL_MAP"},"handleInfo":["pbrParams",3,13]},"emissive":{"type":16,"value":[0,0,0,1],"editor":{"type":"color"}},"emissiveScale":{"type":15,"value":[1,1,1],"handleInfo":["emissiveScaleParam",0,15]},"mainTexture":{"value":"grey","type":28,"editor":{"displayName":"AlbedoMap"},"handleInfo":["albedoMap",0,28]},"albedo":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,1,1,1]},"albedoScaleAndCutoff":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,1,1,0.5]},"pbrParams":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,0.8,0.6,1]},"emissiveScaleParam":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,1,1,0]},"albedoMap":{"type":28,"value":"grey","editor":{"visible":false,"deprecated":true}}}}]},{"name":"transparent","passes":[{"program":"../resources/project/game/killer/map/effect/outlineTaskAndPipe|fx-outline-vs:vert|fx-outline-fs:frag","rasterizerState":{"cullMode":1},"blendState":{"targets":[{"blend":true,"blendSrc":2,"blendDst":4,"blendSrcAlpha":2,"blendDstAlpha":4}]},"properties":{"rimColor":{"type":16,"value":[1,0,0,1],"editor":{"type":"color"}},"outlineParams":{"type":16,"value":[0.1,0.8,0.1,1],"editor":{"type":"vec4"}}}},{"program":"../resources/project/game/killer/map/effect/outlineTaskAndPipe|standard-vs|standard-fs","blendState":{"targets":[{"blend":true,"blendSrc":2,"blendDst":4,"blendDstAlpha":4}]},"depthStencilState":{"depthTest":true,"depthWrite":false},"properties":{"tilingOffset":{"type":16,"value":[1,1,0,0]},"mainColor":{"type":16,"value":[1,1,1,1],"editor":{"displayName":"Albedo","type":"color"},"handleInfo":["albedo",0,16]},"albedoScale":{"type":15,"value":[1,1,1],"handleInfo":["albedoScaleAndCutoff",0,15]},"alphaThreshold":{"type":13,"value":[0.5],"editor":{"parent":"USE_ALPHA_TEST","slide":true,"step":0.001,"range":[0,1]},"handleInfo":["albedoScaleAndCutoff",3,13]},"occlusion":{"type":13,"value":[1],"editor":{"slide":true,"step":0.001,"range":[0,1]},"handleInfo":["pbrParams",0,13]},"roughness":{"type":13,"value":[0.8],"editor":{"slide":true,"step":0.001,"range":[0,1]},"handleInfo":["pbrParams",1,13]},"metallic":{"type":13,"value":[0.6],"editor":{"slide":true,"step":0.001,"range":[0,1]},"handleInfo":["pbrParams",2,13]},"normalStrenth":{"type":13,"value":[1],"editor":{"parent":"USE_NORMAL_MAP","slide":true,"step":0.001,"range":[0,1]},"handleInfo":["pbrParams",3,13]},"emissive":{"type":16,"value":[0,0,0,1],"editor":{"type":"color"}},"emissiveScale":{"type":15,"value":[1,1,1],"handleInfo":["emissiveScaleParam",0,15]},"mainTexture":{"value":"grey","type":28,"editor":{"displayName":"AlbedoMap"},"handleInfo":["albedoMap",0,28]},"normalMap":{"value":"normal","type":28},"pbrMap":{"value":"grey","type":28},"metallicRoughnessMap":{"value":"grey","type":28},"occlusionMap":{"value":"white","type":28},"emissiveMap":{"value":"grey","type":28},"albedo":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,1,1,1]},"albedoScaleAndCutoff":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,1,1,0.5]},"pbrParams":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,0.8,0.6,1]},"emissiveScaleParam":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,1,1,0]},"albedoMap":{"type":28,"value":"grey","editor":{"visible":false,"deprecated":true}}}},{"phase":"forward-add","propertyIndex":0,"program":"../resources/project/game/killer/map/effect/outlineTaskAndPipe|standard-vs|standard-fs","embeddedMacros":{"CC_FORWARD_ADD":true},"blendState":{"targets":[{"blend":true,"blendSrc":1,"blendDst":1,"blendSrcAlpha":0,"blendDstAlpha":1}]},"depthStencilState":{"depthFunc":2,"depthTest":true,"depthWrite":false},"properties":{"tilingOffset":{"type":16,"value":[1,1,0,0]},"mainColor":{"type":16,"value":[1,1,1,1],"editor":{"displayName":"Albedo","type":"color"},"handleInfo":["albedo",0,16]},"albedoScale":{"type":15,"value":[1,1,1],"handleInfo":["albedoScaleAndCutoff",0,15]},"alphaThreshold":{"type":13,"value":[0.5],"editor":{"parent":"USE_ALPHA_TEST","slide":true,"step":0.001,"range":[0,1]},"handleInfo":["albedoScaleAndCutoff",3,13]},"occlusion":{"type":13,"value":[1],"editor":{"slide":true,"step":0.001,"range":[0,1]},"handleInfo":["pbrParams",0,13]},"roughness":{"type":13,"value":[0.8],"editor":{"slide":true,"step":0.001,"range":[0,1]},"handleInfo":["pbrParams",1,13]},"metallic":{"type":13,"value":[0.6],"editor":{"slide":true,"step":0.001,"range":[0,1]},"handleInfo":["pbrParams",2,13]},"normalStrenth":{"type":13,"value":[1],"editor":{"parent":"USE_NORMAL_MAP","slide":true,"step":0.001,"range":[0,1]},"handleInfo":["pbrParams",3,13]},"emissive":{"type":16,"value":[0,0,0,1],"editor":{"type":"color"}},"emissiveScale":{"type":15,"value":[1,1,1],"handleInfo":["emissiveScaleParam",0,15]},"mainTexture":{"value":"grey","type":28,"editor":{"displayName":"AlbedoMap"},"handleInfo":["albedoMap",0,28]},"normalMap":{"value":"normal","type":28},"pbrMap":{"value":"grey","type":28},"metallicRoughnessMap":{"value":"grey","type":28},"occlusionMap":{"value":"white","type":28},"emissiveMap":{"value":"grey","type":28},"albedo":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,1,1,1]},"albedoScaleAndCutoff":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,1,1,0.5]},"pbrParams":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,0.8,0.6,1]},"emissiveScaleParam":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,1,1,0]},"albedoMap":{"type":28,"value":"grey","editor":{"visible":false,"deprecated":true}}}},{"phase":"shadow-caster","propertyIndex":0,"program":"../resources/project/game/killer/map/effect/outlineTaskAndPipe|shadow-caster-vs:vert|shadow-caster-fs:frag","rasterizerState":{"cullMode":1},"properties":{"tilingOffset":{"type":16,"value":[1,1,0,0]},"mainColor":{"type":16,"value":[1,1,1,1],"editor":{"displayName":"Albedo","type":"color"},"handleInfo":["albedo",0,16]},"albedoScale":{"type":15,"value":[1,1,1],"handleInfo":["albedoScaleAndCutoff",0,15]},"alphaThreshold":{"type":13,"value":[0.5],"editor":{"parent":"USE_ALPHA_TEST"},"handleInfo":["albedoScaleAndCutoff",3,13]},"occlusion":{"type":13,"value":[1],"handleInfo":["pbrParams",0,13]},"roughness":{"type":13,"value":[0.8],"handleInfo":["pbrParams",1,13]},"metallic":{"type":13,"value":[0.6],"handleInfo":["pbrParams",2,13]},"normalStrenth":{"type":13,"value":[1],"editor":{"parent":"USE_NORMAL_MAP"},"handleInfo":["pbrParams",3,13]},"emissive":{"type":16,"value":[0,0,0,1],"editor":{"type":"color"}},"emissiveScale":{"type":15,"value":[1,1,1],"handleInfo":["emissiveScaleParam",0,15]},"mainTexture":{"value":"grey","type":28,"editor":{"displayName":"AlbedoMap"},"handleInfo":["albedoMap",0,28]},"albedo":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,1,1,1]},"albedoScaleAndCutoff":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,1,1,0.5]},"pbrParams":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,0.8,0.6,1]},"emissiveScaleParam":{"type":16,"editor":{"visible":false,"deprecated":true},"value":[1,1,1,0]},"albedoMap":{"type":28,"value":"grey","editor":{"visible":false,"deprecated":true}}}}]}]]],0,0,[],[],[]],[[[7,".bin",2914787157,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":13832,"length":3648,"count":912,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":13832,"count":247,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.9532141089439392,-0.9532138109207153,0.002295532263815403],"maxPosition",8,[1,0.9532141089439392,0.9532144069671631,6.465857982635498]]],-1],0,0,[],[],[]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true},{},{}],[[[{"roughness":1,"metallic":0},"mainTexture",6,0],{},{}],11,0,0]]],0,0,[0,0],[3,2],[80,12]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true,"USE_EMISSIVE_MAP":true},{},{}],[[[{"roughness":1,"metallic":0},"emissive",8,[4,4293190884],"mainTexture",6,0,"emissiveMap",6,1],{},{}],11,0,0]]],0,0,[0,0,0],[3,4,2],[81,82,12]],[[[7,".bin",2530832961,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":5040,"length":264,"count":132,"stride":2}}],"vertexBundles":[{"view":{"offset":0,"length":5040,"count":90,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.06366706639528275,-0.018395690247416496,0.00008667176734888926],"maxPosition",8,[1,0.06366705149412155,0.01839565299451351,0.11058032512664795]]],-1],0,0,[],[],[]],[[[7,".bin",1496063254,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":3920,"length":516,"count":129,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":3920,"count":70,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.029103927314281464,-0.03261302784085274,0.00036050734343007207],"maxPosition",8,[1,0.02910389006137848,0.03261295333504677,0.11240368336439133]]],-1],0,0,[],[],[]],[[[7,".bin",1428466255,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":129024,"length":18696,"count":4674,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":129024,"count":2304,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-1.8877270221710205,-1.885624885559082,-0.31393006443977356],"maxPosition",8,[1,1.8877270221710205,1.8856250047683716,0.3139302134513855]]],-1],0,0,[],[],[]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true},{"USE_INSTANCING":true},{},{},{}],[[[{},"mainTexture",6,0],[{},"rimColor",8,[4,4280414714],"outlineParams",8,[2,10,0.1,0.1,1]],{},{},{}],11,11,0,0,0]]],0,0,[0,0],[3,2],[49,11]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true,"USE_EMISSIVE_MAP":true},{},{}],[[[{"roughness":1,"metallic":0},"emissive",8,[4,4282532418],"mainTexture",6,0,"emissiveMap",6,1],{},{}],11,0,0]]],0,0,[0,0,0],[3,4,2],[60,60,12]],[[[7,".bin",3799860776,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":74032,"length":13392,"count":3348,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":74032,"count":1322,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.675585150718689,-7.10542746348012e-16,-0.8344590067863464],"maxPosition",8,[1,0.9388008117675781,3.913865089416504,0.9861000180244446]]],-1],0,0,[],[],[]],[[[7,".bin",2571731526,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":35840,"length":5424,"count":1356,"stride":4}},{"primitiveMode":7,"vertexBundelIndices":[1],"indexView":{"offset":57840,"length":2352,"count":588,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":35840,"count":640,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]},{"view":{"offset":41264,"length":16576,"count":296,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-2.754448175430298,0.0030134583357721567,-1.5807780027389526],"maxPosition",8,[1,2.754448175430298,2.5172643661499023,1.580777645111084]]],-1],0,0,[],[],[]],[[[7,".bin",624575286,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":23520,"length":2448,"count":612,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":23520,"count":420,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-1.9314488172531128,-1.9314488172531128,0.003482208354398608],"maxPosition",8,[1,1.9314486980438232,1.9314488172531128,1.0509517192840576]]],-1],0,0,[],[],[]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true,"USE_EMISSIVE_MAP":true},{"USE_INSTANCING":true},{},{},{}],[[[{"roughness":1,"metallic":0},"emissive",8,[4,4294967295],"mainTexture",6,0,"emissiveMap",6,1],[{},"rimColor",8,[4,4280414714],"outlineParams",8,[2,10,0.1,0.1,1]],{},{},{}],11,11,0,0,0]]],0,0,[0,0,0],[3,4,2],[29,58,11]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true},{"USE_INSTANCING":true},{},{},{}],[[[{},"mainTexture",6,0],[{},"rimColor",8,[4,4280414714],"outlineParams",8,[2,10,0.2,0.1,1]],{},{},{}],11,11,0,0,0]]],0,0,[0,0],[3,2],[48,11]],[[[7,".bin",2592231360,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":48776,"length":10368,"count":2592,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":48776,"count":871,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.9149932861328125,-0.8983999490737915,0.0009595489245839417],"maxPosition",8,[1,0.9149938821792603,0.8983999490737915,0.3249657154083252]]],-1],0,0,[],[],[]],[[[27,"gear",".mp3",12.24],-1],0,0,[],[],[]],[[[7,".bin",589555146,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":15792,"length":2472,"count":618,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":15792,"count":282,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.13887916505336761,-0.2975754737854004,0.00043972014100290835],"maxPosition",8,[1,0.13887657225131989,0.29757460951805115,0.6296008229255676]]],-1],0,0,[],[],[]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true},{"USE_INSTANCING":true},{},{},{}],[[[{},"mainTexture",6,0],[{},"rimColor",8,[4,4280414714],"outlineParams",8,[2,10,0.1,0.1,1]],{},{},{}],11,11,0,0,0]]],0,0,[0,0],[3,2],[34,11]],[[[7,".bin",117778115,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":147336,"length":33768,"count":8442,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":147336,"count":2631,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-2.7626678943634033,-0.00270843505859375,-2.7206974029541016],"maxPosition",8,[1,2.7626678943634033,4.954355716705322,2.7206966876983643]]],-1],0,0,[],[],[]],[[[7,".bin",3915240958,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":1568,"length":168,"count":42,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":1568,"count":28,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.014577055349946022,-0.0232376866042614,-0.00004844013528781943],"maxPosition",8,[1,0.014577017165720463,0.023237647488713264,0.11106739193201065]]],-1],0,0,[],[],[]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true},{},{}],[[[{"roughness":1,"metallic":0},"mainTexture",6,0,"emissiveMap",6,1],{},{}],11,0,0]]],0,0,[0,0,0],[3,4,2],[49,40,12]],[[{"name":"default_btn_pressed","rect":{"x":0,"y":0,"width":40,"height":40},"offset":{"x":0,"y":0},"originalSize":{"width":40,"height":40},"rotated":false,"capInsets":[12,12,12,12],"packable":true}],[1],0,[0],[9],[83]],[[[7,".bin",2829926234,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":151032,"length":15936,"count":3984,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":151032,"count":2697,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-2.3138980865478516,0.00047295569675043225,-0.7653818726539612],"maxPosition",8,[1,2.3138980865478516,0.7311407327651978,0.7653817534446716]]],-1],0,0,[],[],[]],[[[27,"music_ship01",".mp3",57.132],-1],0,0,[],[],[]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{}],[{"USE_INSTANCING":true},{},{}],[[[{"roughness":1,"metallic":0},"mainColor",8,[4,1610612991],"emissive",8,[4,4280427042]],{},{}],11,0,0]]],0,0,[0],[2],[12]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true,"USE_EMISSIVE_MAP":true},{},{}],[[[{"roughness":1,"metallic":0},"emissive",8,[4,4294967295],"mainTexture",6,0,"emissiveMap",6,1],{},{}],11,0,0]]],0,0,[0,0,0],[3,4,2],[50,84,12]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true,"USE_EMISSIVE_MAP":true},{},{}],[[[{"roughness":1,"metallic":0},"emissive",8,[4,4294967295],"mainTexture",6,0,"emissiveMap",6,1],{},{}],11,0,0]]],0,0,[0,0,0],[3,4,2],[51,40,12]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{},{}],[{"USE_INSTANCING":true},{"USE_INSTANCING":true},{},{},{}],[[[{"roughness":1,"metallic":0},"mainColor",8,[4,4280230693]],[{},"rimColor",8,[4,4280414714],"outlineParams",8,[2,10,0.1,0.1,1]],{},{},{}],11,11,0,0,0]]],0,0,[0],[2],[11]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true,"USE_EMISSIVE_MAP":true},{},{}],[[[{"roughness":1,"metallic":0},"emissive",8,[4,4294967295],"mainTexture",6,0,"emissiveMap",6,1],{},{}],11,0,0]]],0,0,[0,0,0],[3,4,2],[85,86,12]],[[[7,".bin",1733658211,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":8008,"length":1584,"count":396,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":8008,"count":143,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.07064376771450043,-0.07064574956893921,-0.00010528564598644152],"maxPosition",8,[1,0.070648193359375,0.07064574956893921,0.17490249872207642]]],-1],0,0,[],[],[]],[[[7,".bin",2098862396,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":53648,"length":6912,"count":1728,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":53648,"count":958,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-1.5800073146820068,0.0014538621762767434,-0.46045631170272827],"maxPosition",8,[1,1.5800071954727173,1.5963687896728516,0.46045613288879395]]],-1],0,0,[],[],[]],[[[7,".bin",2274498902,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":13832,"length":4992,"count":1248,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":13832,"count":247,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.09519828855991364,-0.17566390335559845,0.000005040168616687879],"maxPosition",8,[1,0.09519828855991364,0.17566406726837158,0.042666930705308914]]],-1],0,0,[],[],[]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true,"USE_EMISSIVE_MAP":true},{"USE_INSTANCING":true},{},{},{}],[[[{},"emissive",8,[4,4279966491],"mainTexture",6,0,"emissiveMap",6,1],[{},"rimColor",8,[4,4280414714],"outlineParams",8,[2,10,0.1,0.1,1]],{},{},{}],11,11,0,0,0]]],0,0,[0,0,0],[3,4,2],[17,17,11]],[[[7,".bin",1049450266,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":79632,"length":8580,"count":2145,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":79632,"count":1422,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-1.044569730758667,-0.0001490879076300189,-0.6049425005912781],"maxPosition",8,[1,1.0445693731307983,0.7374928593635559,0.6049425601959229]]],-1],0,0,[],[],[]],[[[7,".bin",1783154558,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":36400,"length":12960,"count":3240,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":36400,"count":650,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.6616911292076111,0.0000369405752280727,-1.8438386917114258],"maxPosition",8,[1,2.478518009185791,0.11409328132867813,0.5747822523117065]]],-1],0,0,[],[],[]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true,"USE_EMISSIVE_MAP":true},{"USE_INSTANCING":true},{},{},{}],[[[{},"mainTexture",6,0,"emissiveMap",6,1],[{},"rimColor",8,[4,4280414714],"outlineParams",8,[2,10,0.1,0.1,1]],{},{},{}],11,11,0,0,0]]],0,0,[0,0,0],[3,4,2],[29,29,11]],[[[7,".bin",3159696645,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":5376,"length":528,"count":132,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":5376,"count":96,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.39921873807907104,0.0014484405983239412,-0.3992176949977875],"maxPosition",8,[1,0.3992190659046173,0.7998853921890259,0.3992185890674591]]],-1],0,0,[],[],[]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true},{"USE_INSTANCING":true},{},{},{}],[[[{"roughness":1,"metallic":0},"mainTexture",6,0],[{},"rimColor",8,[4,4280414714],"outlineParams",8,[2,10,0.1,0.1,1]],{},{},{}],11,11,0,0,0]]],0,0,[0,0],[3,2],[39,11]],[[{"name":"default_sprite_splash","rect":{"x":0,"y":0,"width":2,"height":2},"offset":{"x":0,"y":0},"originalSize":{"width":2,"height":2},"rotated":false,"capInsets":[0,0,0,0],"packable":true}],[1],0,[0],[9],[87]],[[[7,".bin",1823187911,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":4648,"length":504,"count":126,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":4648,"count":83,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.010178565979003906,-0.025342904031276703,0.0005392450257204473],"maxPosition",8,[1,0.010178604163229465,0.025342941284179688,0.1118052676320076]]],-1],0,0,[],[],[]],[[[7,".bin",418501086,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":10640,"length":630,"count":315,"stride":2}}],"vertexBundles":[{"view":{"offset":0,"length":10640,"count":190,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.5241674184799194,-1.35023832321167,0.007362899836152792],"maxPosition",8,[1,0.524167537689209,1.35023832321167,2.495443105697632]]],-1],0,0,[],[],[]],[[[10,[{"rasterizerState":{"cullMode":0},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true,"USE_EMISSIVE_MAP":true},{},{}],[[[{"roughness":1,"metallic":0},"mainColor",8,[4,4293651438],"emissive",8,[4,4279966491],"mainTexture",6,0,"emissiveMap",6,1],{},{}],11,0,0]]],0,0,[0,0,0],[3,4,2],[17,17,12]],[[[7,".bin",2453552692,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":104272,"length":12504,"count":3126,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":104272,"count":1862,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.5230441689491272,0.005576181225478649,-0.5097548961639404],"maxPosition",8,[1,0.5230441689491272,1.013079285621643,0.50975501537323]]],-1],0,0,[],[],[]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true,"USE_EMISSIVE_MAP":true},{"USE_INSTANCING":true},{},{},{}],[[[{"roughness":1,"metallic":0},"emissive",8,[4,4279966491],"mainTexture",6,0,"emissiveMap",6,1],[{},"rimColor",8,[4,4280414714],"outlineParams",8,[2,10,0.1,0.1,1]],{},{},{}],11,11,0,0,0]]],0,0,[0,0,0],[3,4,2],[17,17,11]],[[[7,".bin",4072917976,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":672,"length":72,"count":18,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":672,"count":12,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.1323796957731247,-0.014560661278665066,0.000004835352228838019],"maxPosition",8,[1,0.1323797106742859,0.014560661278665066,0.001798907178454101]]],-1],0,0,[],[],[]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true,"USE_EMISSIVE_MAP":true},{"USE_INSTANCING":true},{},{},{}],[[[{"roughness":1,"metallic":0},"emissive",8,[4,4294967295],"mainTexture",6,0,"emissiveMap",6,1],[{},"rimColor",8,[4,4280414714],"outlineParams",8,[2,10,0.1,0.1,1]],{},{},{}],11,11,0,0,0]]],0,0,[0,0,0],[3,4,2],[34,41,11]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true,"USE_EMISSIVE_MAP":true},{"USE_INSTANCING":true},{},{},{}],[[[{},"mainTexture",6,0,"emissiveMap",6,1],[{},"rimColor",8,[4,4280414714],"outlineParams",8,[2,10,0.2,0.1,1]],{},{},{}],11,11,0,0,0]]],0,0,[0,0,0],[3,4,2],[51,40,11]],[[[7,".bin",2833924743,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":8232,"length":1056,"count":264,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":8232,"count":147,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.38068726658821106,-0.4239722490310669,-0.43105360865592957],"maxPosition",8,[1,0.38068723678588867,0.0005066681187599897,0.43105360865592957]]],-1],0,0,[],[],[]],[[{"name":"default_btn_disabled","rect":{"x":0,"y":0,"width":40,"height":40},"offset":{"x":0,"y":0},"originalSize":{"width":40,"height":40},"rotated":false,"capInsets":[12,12,12,12],"packable":true}],[1],0,[0],[9],[88]],[[[7,".bin",1965167388,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":840,"length":168,"count":42,"stride":4}},{"primitiveMode":7,"vertexBundelIndices":[1],"indexView":{"offset":10192,"length":1296,"count":324,"stride":4}},{"primitiveMode":7,"vertexBundelIndices":[2],"indexView":{"offset":12776,"length":228,"count":57,"stride":4}},{"primitiveMode":7,"vertexBundelIndices":[3],"indexView":{"offset":14348,"length":252,"count":63,"stride":4}},{"primitiveMode":7,"vertexBundelIndices":[4],"indexView":{"offset":18296,"length":504,"count":126,"stride":4}},{"primitiveMode":7,"vertexBundelIndices":[5],"indexView":{"offset":20144,"length":216,"count":54,"stride":4}},{"primitiveMode":7,"vertexBundelIndices":[6],"indexView":{"offset":27024,"length":984,"count":246,"stride":4}},{"primitiveMode":7,"vertexBundelIndices":[7],"indexView":{"offset":33160,"length":804,"count":201,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":840,"count":15,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]},{"view":{"offset":1008,"length":9184,"count":164,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]},{"view":{"offset":11488,"length":1288,"count":23,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]},{"view":{"offset":13004,"length":1344,"count":24,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]},{"view":{"offset":14600,"length":3696,"count":66,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]},{"view":{"offset":18800,"length":1344,"count":24,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]},{"view":{"offset":20360,"length":6664,"count":119,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]},{"view":{"offset":28008,"length":5152,"count":92,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-2.2881007194519043,-1.3721741437911987,-0.1770733892917633],"maxPosition",8,[1,2.2881007194519043,1.3721741437911987,-0.00003772873606067151]]],-1],0,0,[],[],[]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true},{"USE_INSTANCING":true},{},{},{}],[[[{"roughness":1,"metallic":0},"mainTexture",6,0],[{},"rimColor",8,[4,4284871165],"outlineParams",8,[2,10,0.1,0.1,1]],{},{},{}],11,11,0,0,0]]],0,0,[0,0],[3,2],[39,11]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true},{},{}],[[[{"roughness":1,"metallic":0},"mainTexture",6,0],{},{}],11,0,0]]],0,0,[0,0],[3,2],[89,12]],[[[7,".bin",3021378532,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":3360,"length":408,"count":102,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":3360,"count":60,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.12832611799240112,-0.1914808601140976,-0.01781570352613926],"maxPosition",8,[1,0.1283276379108429,0.1914808601140976,0.06425819545984268]]],-1],0,0,[],[],[]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true,"USE_EMISSIVE_MAP":true},{"USE_INSTANCING":true},{},{},{}],[[[{"roughness":1,"metallic":0},"emissive",8,[4,4279966491],"mainTexture",6,0,"emissiveMap",6,1],[{},"rimColor",8,[4,4280414714],"outlineParams",8,[2,10,0.1,0.1,1]],{},{},{}],11,11,0,0,0]]],0,0,[0,0,0],[3,4,2],[17,17,11]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true,"USE_EMISSIVE_MAP":true},{"USE_INSTANCING":true},{},{},{}],[[[{},"emissive",8,[4,4285558896],"mainTexture",6,0,"emissiveMap",6,1],[{},"rimColor",8,[4,4280414714],"outlineParams",8,[2,10,0.1,0.1,1]],{},{},{}],11,11,0,0,0]]],0,0,[0,0,0],[3,4,2],[29,29,11]],[[[7,".bin",1420076220,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":8176,"length":2016,"count":504,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":8176,"count":146,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.38155487179756165,0.002327644731849432,-0.3815537989139557],"maxPosition",8,[1,0.3815539479255676,1.4311844110488892,0.3815547227859497]]],-1],0,0,[],[],[]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true,"USE_EMISSIVE_MAP":true},{},{},{}],[[[{"roughness":1,"metallic":0},"emissive",8,[4,4291348735],"mainTexture",6,0,"emissiveMap",6,1],{},{},{}],11,0,0,0]]],0,0,[0,0,0],[3,4,2],[50,50,12]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true,"USE_EMISSIVE_MAP":true},{"USE_INSTANCING":true},{},{},{}],[[[{"roughness":1,"metallic":0},"emissive",8,[4,4294967295],"mainTexture",6,0,"emissiveMap",6,1],[{},"rimColor",8,[4,4280414714],"outlineParams",8,[2,10,0.1,0.1,1]],{},{},{}],11,11,0,0,0]]],0,0,[0,0,0],[3,4,2],[17,17,11]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true},{"USE_INSTANCING":true},{},{},{}],[[[{"roughness":0.636},"mainTexture",6,0],[{},"outlineParams",8,[2,10,0.1,0.1,1]],{},{},{}],11,11,0,0,0]]],0,0,[0,0],[3,2],[49,11]],[[[7,".bin",2572364934,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":51856,"length":9360,"count":2340,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":51856,"count":926,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-2.4485549926757812,-2.4523370265960693,-0.3430306911468506],"maxPosition",8,[1,2.448554277420044,2.4523377418518066,0.3430306911468506]]],-1],0,0,[],[],[]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true,"USE_EMISSIVE_MAP":true},{},{}],[[[{"roughness":1,"metallic":0,"SpecularIntensity":0.644},"emissive",8,[4,4294967295],"mainTexture",6,0,"emissiveMap",6,1],{},{}],11,0,0]]],0,0,[0,0,0],[3,4,2],[90,91,12]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true,"USE_EMISSIVE_MAP":true},{"USE_INSTANCING":true},{},{},{}],[[[{"roughness":1,"metallic":0},"mainTexture",6,0,"emissiveMap",6,1],[{},"rimColor",8,[4,4280414714],"outlineParams",8,[2,10,0.1,0.1,1]],{},{},{}],11,11,0,0,0]]],0,0,[0,0,0],[3,4,2],[17,17,11]],[[[58,"0",[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true,"USE_EMISSIVE_MAP":true},{},{},{}],[[[{"roughness":0.195,"metallic":0,"SpecularIntensity":0.746},"emissive",8,[4,4294961874],"mainTexture",6,0,"emissiveMap",6,1],{},{},{}],11,0,0,0]]],0,0,[0,0,0],[3,4,2],[39,59,12]],[[[38,"World"],[59,"World",[-11,-12,-13,-14,-15,-16,-17,-18],[[75,-9,[0,"05X4K9D3tJZKCJk5ltEAGs"],-8,-7,-6,-5,-4,-3,-2,1364],[76,true,-10,[0,"e4e/UMPlZEz6hgSaqtxW4O"],1365]],[1,"a0p8ELc7dCD5llV6D69nlw",-1,0]],[26,"wall_02",[-19,-20,-21,-22,-23,-24,-25,-26,-27,-28,-29,-30,-31,-32,-33,-34,-35,-36,-37,-38,-39,-40,-41,-42,-43,-44,-45,-46,-47,-48,-49,-50,-51,-52,-53,-54,-55,-56,-57,-58,-59,-60,-61,-62,-63,-64,-65,-66,-67,-68,-69,-70,-71,-72,-73,-74,-75,-76,-77,-78,-79,-80,-81,-82,-83,-84,-85,-86,-87,-88,-89,-90,-91,-92,-93,-94,-95,-96,-97,-98,-99,-100,-101,-102,-103,-104,-105,-106,-107,-108,-109,-110,-111,-112,-113,-114,-115,-116,-117,-118,-119,-120,-121,-122,-123,-124,-125,-126,-127,-128,-129,-130,-131,-132,-133,-134,-135,-136,-137,-138,-139,-140,-141,-142,-143,-144,-145,-146,-147,-148,-149,-150,-151,-152,-153,-154,-155,-156,-157,-158,-159,-160,-161,-162,-163,-164,-165,-166,-167,-168,-169,-170,-171,-172,-173,-174,-175,-176,-177,-178,-179,-180,-181,-182,-183,-184,-185,-186,-187,-188,-189,-190,-191,-192,-193,-194,-195,-196,-197,-198,-199,-200,-201,-202,-203,-204,-205,-206,-207,-208,-209,-210,-211,-212,-213,-214,-215,-216,-217,-218,-219,-220,-221,-222,-223,-224,-225,-226,-227,-228,-229,-230,-231,-232,-233,-234,-235,-236,-237,-238,-239,-240,-241,-242,-243,-244,-245,-246,-247,-248,-249,-250,-251],[1,"b16DfI7m9CpLLfCLigyMVu",1,0],[1,6.767,0,-15.772]],[51,"prop",512,1,[[-252,[60,"Emergencybutton",-253,[1,"890YuENTlB95mX8hHx1KY2",1,0],[1,5.066,0.85,-17.773],[1,1.8,1,1.8]],[45,"ConferencTable",-254,[1,"9bRMfittRNOZceyqY8DpNt",1,0],[1,8.916,-0.181,-23.955]],-255,-256,-257,-258,-259,-260,-261,-262,-263,-264,-265,-266,-267,-268,-269,-270,-271,-272,-273,-274,-275,-276,-277,-278,-279,-280,-281,-282,-283,-284,-285,-286,-287,-288,-289,-290,-291,-292,-293,-294,-295,-296,-297,-298,-299,-300,[45,"RootNode",-301,[1,"c3mHJ/0yxHILLC+SXICDO8",1,0],[1,-7.582,0,3.497]],-302,-303,-304,-305,-306,-307,-308,-309,-310,-311,-312,-313,-314],1,4,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,"02sJEViDREjaU9R0cEM7yf",1,0]],[28,"events",1,[-315,-316,-317,-318,-319,-320,-321,-322,-323,-324,-325,-326,-327,-328,-329,-330,-331,-332,-333,-334,-335,-336,-337,-338,-339,-340,-341,-342,-343,-344,-345,-346,-347,-348,-349,-350,-351,-352,-353,-354,-355,-356,-357,-358,-359,-360,-361,-362,-363,-364,-365,-366,-367,-368,-369,-370,-371,-372,-373,-374],[1,"f7vETH4xlFxq7JsxhQRzq4",1,0]],[26,"corner_01",[-375,-376,-377,-378,-379,-380,-381,-382,-383,-384,-385,-386,-387,-388,-389,-390,-391,-392,-393,-394,-395,-396,-397,-398,-399,-400,-401,-402,-403,-404,-405,-406,-407,-408,-409,-410,-411,-412,-413,-414,-415,-416,-417,-418,-419,-420,-421,-422,-423,-424,-425,-426,-427,-428,-429,-430,-431,-432,-433,-434],[1,"97i06H8eZNF496/R4vjYOA",1,0],[1,7.909,0,-14.546]],[26,"corner_02",[-435,-436,-437,-438,-439,-440,-441,-442,-443,-444,-445,-446,-447,-448,-449,-450,-451,-452,-453,-454,-455,-456,-457,-458,-459,-460,-461,-462,-463,-464,-465,-466,-467,-468,-469,-470],[1,"98aBSC+kRLUbmzMYQzjziO",1,0],[1,3.77,0,-10.547]],[26,"partition_02",[-471,-472,-473,-474,-475,-476,-477,-478,-479,-480,-481,-482,-483,-484,-485,-486,-487,-488,-489,-490,-491,-492,-493,-494,-495,-496,-497,-498,-499,-500,-501,-502,-503],[1,"71P/hS0C9PCaSBD4onCoCd",1,0],[1,0,0,-13.222]],[51,"wall",512,1,[[5,6,-504,-505,-506,7,[61,"partition_03",false,-507,[1,"6bsJ9iAQpD9YvNNp2dtpKY",1,0],[1,11.375,0,-15.54]],-508,2,-509,-510,-511,-512,-513,-514,-515,-516,-517,-518,-519,-520,-521,-522,-523,-524,-525,-526,-527,-528],1,1,1,1,1,1,4,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1],[1,"40k098+glKR6XJ6udw1tuv",1,0]],[28,"task",3,[-529,-530,-531,-532,-533,-534,-535,-536,-537,-538,-539,-540,-541,-542,-543,-544,-545,-546,-547,-548,-549,-550,-551,-552],[1,"deQAngq+dDd5/SCG8swxtD",1,0]],[26,"threshold_01",[-553,-554,-555,-556,-557,-558,-559,-560,-561,-562,-563,-564,-565,-566,-567,-568,-569,-570,-571],[1,"22CObSYfJNlJhxF/HXCV0A",1,0],[1,4.296,0,-1.54]],[29,"wall_01",8,[-572,-573,-574,-575,-576,-577,-578,-579,-580,-581,-582,-583,-584,-585,-586,-587,-588,-589],[1,"f3IDLACZdErI/55ZPbIl/b",1,0],[1,-1.455,0,-28.379]],[26,"threshold_02",[-590,-591,-592,-593,-594,-595,-596,-597,-598,-599,-600,-601,-602,-603,-604,-605,-606],[1,"c21Cf3BtFB56uWpGUPuiP4",1,0],[1,4.269,0,4.86]],[46,"door_L",false,8,[-607,-608,-609,-610,-611,-612,-613,-614,-615,-616,-617,-618,-619,-620,-621,-622],[1,"acHaoq/xpJzok2j00zjsdv",1,0],[1,13.51,0,-19.226]],[46,"door_R",false,8,[-623,-624,-625,-626,-627,-628,-629,-630,-631,-632,-633,-634,-635,-636,-637,-638],[1,"f4PdAF5fdPG7ODLVkXBNPW",1,0],[1,2.317,0,-21.261]],[29,"partition_01",8,[-639,-640,-641,-642,-643,-644,-645,-646,-647,-648,-649,-650,-651,-652,-653,-654],[1,"fdXtr8Br9KEplCS5pBXaKJ",1,0],[1,-2.939,0,-16.091]],[29,"cover",3,[-655,-656,-657,-658,-659,-660,-661,-662,-663,-664,-665,-666,-667,-668],[1,"717z+BwM1FyJeQvqN/hk+b",1,0],[1,8.934,0,24.908]],[28,"cctvs",1,[-669,-670,-671,-672,-673,-674,-675,-676,-677,-678,-679,-680,-681,-682],[1,"73EQvZlndI1ZigH+yF+ohT",1,0]],[62,"CAMR_W",3,[-683,-684,-685,-686,-687,-688,-689,-690,-691,-692,-693,-694,-695,-696],[1,"0f5nGtVQ1M8qiqjQQWuXG6",1,0],[1,1.233,2.643,8.668],[1,0.65,0.65,0.65]],[28,"ground",1,[10,12,-697,-698,-699,-700,-701,-702,-703,-704,-705],[1,"f0/oT1vqtD766AIGDiSdZ5",1,0]],[29,"wall_03",8,[-706,-707,-708,-709,-710,-711,-712,-713],[1,"c7uyT+tFZDhYEvbJ1OEqKv",1,0],[1,-1.629,0,-20.834]],[29,"prop_caseS02",3,[-714,-715,-716,-717],[1,"23OXJSCrlLc73QrFNAzJpq",1,0],[1,4.981,0,17.659]],[15,"door_1",8,[-719,-720],[[14,-718,[0,"0fB3kcQSlDhpCIOE5EBzeM"],[974,975]]],[1,"efuMCtqDNDJZVQDuh5VTSH",1,0],[1,4.344,-0.03,-4.445]],[15,"door_2",8,[-722,-723],[[14,-721,[0,"5b51Iwv4RIKI8hCyB01sO4"],[980,981]]],[1,"d1LRB+bgJPoJT+lDKrPABW",1,0],[1,30.954,-0.03,-11.315]],[15,"door_3",8,[-725,-726],[[14,-724,[0,"17GFHizxBNO5lsyC6bKnxV"],[986,987]]],[1,"28KaIFV4hOFpQyQhTJR/LE",1,0],[1,31.167,-0.03,13.411]],[15,"door_4",8,[-728,-729],[[14,-727,[0,"08xkdVHhlKLYzRZvK9TlyD"],[992,993]]],[1,"32UlbjUYBP3ba1k+XkYnfy",1,0],[1,20.747,-0.03,20.995]],[15,"door_5",8,[-731,-732],[[14,-730,[0,"00rctRqSpDjLVbENdzcR36"],[998,999]]],[1,"10oEigq9dF1qL6dBg/+jMT",1,0],[1,4.531,-0.03,6.74]],[15,"door_6",8,[-734,-735],[[14,-733,[0,"c959uOD1RPbbzW8NR922qI"],[1004,1005]]],[1,"2eQlCBV95Ar5QNuMyNC2+4",1,0],[1,-14.526,-0.03,-13.357]],[15,"door_7",8,[-737,-738],[[14,-736,[0,"acGvv9cOxJX7kGguAmCuc+"],[1010,1011]]],[1,"2eLJEH5z1PQJ1w4sA9PyLQ",1,0],[1,-34.496,-0.03,-11.232]],[15,"door_8",8,[-740,-741],[[14,-739,[0,"73Dp0QFY5Lv7YHrImyQSoO"],[1016,1017]]],[1,"5fcKBsuS9Oy7LWtncFPN/A",1,0],[1,-34.496,-0.03,6.272]],[17,"door_9",8,[-743,-744],[[14,-742,[0,"6bXi6oMhpCrI/cey+LWx12"],[1022,1023]]],[1,"61DhxKyQZJ+JAFvWakUNjb",1,0],[1,-8.507,-0.03,-18.374],[3,0,0.7071067811865475,0,0.7071067811865476],[1,0,90,0]],[17,"door_10",8,[-746,-747],[[14,-745,[0,"42wADNvnNOmKuEh6RTTyLB"],[1028,1029]]],[1,"a3Av7M7EJKoIsq1CKbC0b0",1,0],[1,16.871,-0.03,-18.374],[3,0,0.7071067811865475,0,0.7071067811865476],[1,0,90,0]],[17,"door_11",8,[-749,-750],[[14,-748,[0,"e8BpA6/GhO84HkrlcbRwnW"],[1034,1035]]],[1,"50pql7g0ZOX4CZfGFe+TrA",1,0],[1,22.732,-0.03,-18.374],[3,0,0.7071067811865475,0,0.7071067811865476],[1,0,90,0]],[17,"door_12",8,[-752,-753],[[14,-751,[0,"71PqxL2QBIRajcHzJxI2H6"],[1040,1041]]],[1,"a7fZ6kPUNEnY23bCwBlQ33",1,0],[1,-29.522,-0.03,-2.426],[3,0,0.7071067811865475,0,0.7071067811865476],[1,0,90,0]],[17,"door_13",8,[-755,-756],[[14,-754,[0,"35aCu8ra1JDLnpIinTKuxB"],[1046,1047]]],[1,"693n7ML7RM/56uZsFPZAMm",1,0],[1,39.626,-0.03,-1.702],[3,0,0.7071067811865475,0,0.7071067811865476],[1,0,90,0]],[17,"door_14",8,[-758,-759],[[14,-757,[0,"ddDFSF7+dJqoefScnr/1Fi"],[1052,1053]]],[1,"adZwAbUbZMWJg1+KVXaj5O",1,0],[1,26.009,-0.03,18.502],[3,0,0.7071067811865475,0,0.7071067811865476],[1,0,90,0]],[17,"door_15",8,[-761,-762],[[14,-760,[0,"16LyTrIWRENbmYw5bRRkcW"],[1058,1059]]],[1,"2bpz+ZPw5FOaowDHWNwMSQ",1,0],[1,11.376,-0.03,18.502],[3,0,0.7071067811865475,0,0.7071067811865476],[1,0,90,0]],[17,"door_16",8,[-764,-765],[[14,-763,[0,"d3W0L9W+5JBJRUTZXiXcbk"],[1064,1065]]],[1,"3e1Il/MKZKgb1ZbgiqoSdt",1,0],[1,-4.91,-0.03,19.992],[3,0,0.7071067811865475,0,0.7071067811865476],[1,0,90,0]],[17,"door_17",8,[-767,-768],[[14,-766,[0,"15TgVNpF1DaYIDm2cQEYK4"],[1070,1071]]],[1,"73dGBn1OpF9ZWiFJQToaSX",1,0],[1,-27.958,-0.03,13.339],[3,0,0.7071067811865475,0,0.7071067811865476],[1,0,90,0]],[17,"door_18",8,[-770,-771],[[14,-769,[0,"4c8uPnhIpI+oEfqjhy6XM+"],[1076,1077]]],[1,"f8cGEBZIVNxK5IPrcxaFJf",1,0],[1,-27.733,-0.03,-18.393],[3,0,0.7071067811865475,0,0.7071067811865476],[1,0,90,0]],[17,"door_19",8,[-773,-774],[[14,-772,[0,"949xyBNYNDl6YVrgGphyA+"],[1082,1083]]],[1,"1flK8v5FRLSZ2CPYS7hC40",1,0],[1,12.562,-0.03,2.437],[3,0,0.7071067811865475,0,0.7071067811865476],[1,0,90,0]],[15,"gear_B",3,[-776,-777],[[39,true,-775,[0,"d5yF8FbzFECKO4YohT+6sv"],[1180],1181]],[1,"63UqBBbG9DeKwh6LJY8aPb",1,0],[1,33.933,-0.621,-16.496]],[15,"gear_S",3,[-779,-780],[[39,true,-778,[0,"80ENWEotFDf6oQqChXPZ3B"],[1186],1187]],[1,"75EIXMbHNM4LIqxpdMgdFk",1,0],[1,27.879,0,-15.934]],[15,"gear_S-001",3,[-782,-783],[[39,true,-781,[0,"e1XgTyPjpPNZx6dxkS2Vrm"],[1192],1193]],[1,"96f5wtv4pKQLLfi7ERh9HV",1,0],[1,34.104,-0.046,-18.697]],[63,"book",3,[-784,-785,-786],[1,"d8QMZB+S9I9oDtAFJEmMF1",1,0],[1,32.909,1.164,-24.651],[3,0,-0.3935969801979423,0,0.9192830995830722],[1,0,-46.357,0]],[6,"meeting",4,[[9,-787,[0,"f7JH+bY/lF4I01ykF4XSsX"],[1,1.5,1,1.45]],[79,-788,[0,"06BXx5zTpGLJLwuMpo/0EO"]],[8,8,2,-789,[0,"casgDKpo9LHp/ZT3RyD97t"]]],[1,"fdx3jxF3JMSbxRDm5z2Q3j",1,0],[1,4.9,0,-18.619],[1,6,0.5,6]],[6,"sceneEvent1001",4,[[30,-790,[0,"2eGPd4pK5FWbk3QswdRdTq"]],[8,32,2,-791,[0,"e4Ym75GZdPyJytQeAfy74p"]],[52,1001,-792,[0,"acKvOnLRZBFpSZHvA5E7n5"]]],[1,"77CczGXmRJV6ylZrc5Nl5N",1,0],[1,-24.907,0,-7.335],[1,5,0.4,5.3]],[6,"sceneEvent1002",4,[[9,-793,[0,"aeZTYDqiBA1pdpQqcSqTFb"],[1,0.411,1,0.549]],[8,32,2,-794,[0,"e9xRuX/VZKSqAGGA7eW2D5"]],[52,1002,-795,[0,"0aXcQdgzpBebN5jdLvHzFj"]]],[1,"5ev/NL5KNPD6VjQn+uLBKw",1,0],[1,16.08,0,5.93],[1,5,0.4,5.3]],[6,"floor1001",4,[[9,-796,[0,"69SOR/+9RAmIljCt3i4e0E"],[1,1.201,1,1.258]],[19,1001,1,-797,[0,"a0p5PIDfxM/JxdGW61y8mA"]],[8,16,2,-798,[0,"820ZFLe61NTJvIfhDOhDWk"]]],[1,"a6hbeVbhFKsq10N55+Hzwp",1,0],[1,4.108,0,-18.304],[1,20,0.4,20]],[6,"floor1002",4,[[9,-799,[0,"00sYZLiJNDFoPHKAViygKN"],[1,0.593,1,0.865]],[19,1002,1,-800,[0,"9axfYhI6tOm5593HaBpLEn"]],[8,16,2,-801,[0,"73ofx45LJDvYXzo1+RyuLN"]]],[1,"393M5lFylHO49eWl54MP69",1,0],[1,46.37,0,-1.729],[1,20,0.4,20]],[6,"floor1003",4,[[9,-802,[0,"bffdhsVDlK05RTTUnNrgaw"],[1,0.766,1,0.776]],[19,1003,1,-803,[0,"aaMJrlL1JGTpkvyr7oDGK5"]],[8,16,2,-804,[0,"cbRZfrObxIOKYKOeTNjk55"]]],[1,"406LMvZzpN/ovk2ychDp3y",1,0],[1,31.417,0,-20.171],[1,20,0.4,20]],[6,"floor1005",4,[[9,-805,[0,"73YYYADDpIMaHcAIBL63uK"],[1,0.529,1,0.62]],[19,1005,1,-806,[0,"839uWszVxMBL3kQXlExC4j"]],[8,16,2,-807,[0,"aajPCMk7NG14sEiL2hsWlX"]]],[1,"3b+y5cAQpP0Y7tKGRxkOZD",1,0],[1,31.842,0,20.079],[1,20,0.4,20]],[6,"floor1011",4,[[9,-808,[0,"28nhODwqdNtqF7xztAer8+"],[1,0.553,1,0.356]],[19,1011,1,-809,[0,"c1Es5/EXFMOLhe90Q7+gl1"]],[8,16,2,-810,[0,"91yeV/P/tIiYDnUs+4xLpJ"]]],[1,"0dnEnIKYRG2ZTom3XkQqje",1,0],[1,19.848,0,-4.875],[1,20,0.4,20]],[6,"floor1006",4,[[9,-811,[0,"47i3imj8VEI6aJ3O7NWusP"],[1,0.798,1,1.109]],[19,1006,1,-812,[0,"73MRDsFGBDubS3onzSDuxA"]],[8,16,2,-813,[0,"35+z+ztdVG3pqECM/BYD0L"]]],[1,"510WSchQJLkq6rs81BfSui",1,0],[1,3.697,0,17.598],[1,20,0.4,20]],[6,"floor1007",4,[[9,-814,[0,"432fr93DVC0JvspXe43VpK"],[1,0.671,1,0.557]],[19,1007,1,-815,[0,"50FMXvAR5HkIHxCZ00yVPD"]],[8,16,2,-816,[0,"f5v0TGDnNCW72o95Wdi1KE"]]],[1,"8acq2+p5RPUrkBmBkTMMrE",1,0],[1,19.928,0,5.432],[1,20,0.4,20]],[6,"floor1008",4,[[9,-817,[0,"09BAtyLCZIpI7u1McFfhS0"],[1,0.692,1,0.543]],[19,1008,1,-818,[0,"14mxjfppxLN6OE3J1j2IXF"]],[8,16,2,-819,[0,"fbC/UvJG1JKaPrWARysGp4"]]],[1,"29r8HJy35BaZxK5h3woY5O",1,0],[1,19.379,0,26.301],[1,20,0.4,20]],[6,"floor1009",4,[[9,-820,[0,"3fjUO6VZ5LO6civYTp0tT6"],[1,0.659,1,0.706]],[19,1009,1,-821,[0,"feMySllDBNHZx45K7W+Qe+"]],[8,16,2,-822,[0,"22ZDc8qglIdrrdD0GDHzZg"]]],[1,"91eE//lVNNjaTfpkdMBpx3",1,0],[1,-14.444,0,-6.418],[1,20,0.4,20]],[6,"floor1010",4,[[9,-823,[0,"d5uxOtJ/5FKLK1tpixdBhM"],[1,0.659,1,0.903]],[19,1010,1,-824,[0,"4bs1jAqZtGGoNT8lBJ7DbO"]],[8,16,2,-825,[0,"7f040JrwtJALK/WIeSehgK"]]],[1,"3bnhDVBYRF/piVo6tWlEyE",1,0],[1,-9.853,0,8.285],[1,20,0.4,20]],[6,"floor1004",4,[[9,-826,[0,"78Rr218XJIpLxIf5vtl5Cz"],[1,0.41,1,0.763]],[19,1004,1,-827,[0,"3cZkR2x+NBl4WOC5s2cv6/"]],[8,16,2,-828,[0,"8052TsmBZIZacZJde2YSDM"]]],[1,"aelbr3IvBNKa5t7/OS4Zmm",1,0],[1,-25.111,0,-3.573],[1,20,0.4,20]],[6,"floor1012",4,[[9,-829,[0,"bcMKzWrRNNabZe/R8wzVm+"],[1,0.659,1,0.782]],[19,1012,1,-830,[0,"facp97IB1H1qImJaCUe2HT"]],[8,16,2,-831,[0,"eeZrEIQrlJEJv3pkds0Hes"]]],[1,"beVkh62FlCMbZtEHXDeD5Q",1,0],[1,-35.195,0,-20.167],[1,20,0.4,20]],[6,"floor1013",4,[[9,-832,[0,"76tblrF/FJWZX1Yf8A6c6X"],[1,0.659,1,0.686]],[19,1013,1,-833,[0,"07XhYzM9dJf7/HwUlOXSqZ"]],[8,16,2,-834,[0,"a93h+C1VhKTqKvjvYCC44X"]]],[1,"4aLXzONtRII4Pfjlk8rC50",1,0],[1,-35.384,0,13.316],[1,20,0.4,20]],[6,"floor1014",4,[[9,-835,[0,"9e6R72PAZGgq6LAxRZ2MQF"],[1,0.726,1,1.038]],[19,1014,1,-836,[0,"99gNPsgtNLcpyGhlINUlhv"]],[8,16,2,-837,[0,"740jD9lP5G7akVsa4NhZ8z"]]],[1,"adE4mY475BCLd3A/xOvViZ",1,0],[1,-47.546,0,-2.34],[1,20,0.4,20]],[6,"pipeline1001",4,[[9,-838,[0,"69B20tTA1MJKDP+qbJ//WD"],[1,0.432,1,0.322]],[8,4,2,-839,[0,"75oYhmd7BGzKiRQMNq+JDw"]],[20,1001,-840,[0,"eafQ2CuDVDQpLumJbHg4HS"]]],[1,"9fqmbgh7hDlq9qZ4HQPGo3",1,0],[1,-43.242,0,1.146],[1,5,0.4,5.3]],[6,"pipeline1002",4,[[9,-841,[0,"4dUXzkpSRIp5/1Y8ZqtkHL"],[1,0.432,1,0.322]],[8,4,2,-842,[0,"6a3ZA8GiRELqjf3Nx2525G"]],[20,1002,-843,[0,"6b8O8vQaFL7qH9Bf18zBJT"]]],[1,"2fn08HRvlL4a1JvrODrxhK",1,0],[1,-30.996,0,-22.868],[1,5,0.4,5.3]],[6,"pipeline1003",4,[[9,-844,[0,"06KHytcF5FtLhCPRx4Uk+i"],[1,0.432,1,0.322]],[8,4,2,-845,[0,"d81Xkh+o1AJpaNHC/nQCRb"]],[20,1003,-846,[0,"ed6POJ1o5Mv4IaFvUgHex0"]]],[1,"63avmr0EdIRpbipLe+D8DO",1,0],[1,-30.798,0,16.701],[1,5,0.4,5.3]],[6,"pipeline1004",4,[[9,-847,[0,"18rMVVAsxHfpkJPzDISn3I"],[1,0.432,1,0.322]],[8,4,2,-848,[0,"427L56VmFITI9TvAO6mtCG"]],[20,1004,-849,[0,"b5k/L9yo5Ae5jgetG3pWhT"]]],[1,"c7mC+Jb1lOAK3B4K1Pjpsh",1,0],[1,-26.679,0,1.631],[1,5,0.4,5.3]],[6,"pipeline1005",4,[[9,-850,[0,"bdKdOpFgVNboDfz7oPaiu1"],[1,0.432,1,0.322]],[8,4,2,-851,[0,"ad02qSe19J/58OIyUaRrol"]],[20,1005,-852,[0,"b6pKlnRyZH+7q0YDlzEvev"]]],[1,"74zf1l6RxJ2JihiAJU1Hcd",1,0],[1,-18.003,0,-4.734],[1,5,0.4,5.3]],[6,"pipeline1006",4,[[9,-853,[0,"e9AR0nDT5JL7AmMcLeLUMX"],[1,0.432,1,0.322]],[8,4,2,-854,[0,"041YGIlWRBGpXiNECFbw5B"]],[20,1006,-855,[0,"930aa8gTFItYd+v6BP1P63"]]],[1,"1dJQUSpoBGcoDF9Ewe35oz",1,0],[1,-6.519,0,4.816],[1,5,0.4,5.3]],[6,"pipeline1007",4,[[9,-856,[0,"82luDriYZFiZveZvfbfLFj"],[1,0.432,1,0.322]],[8,4,2,-857,[0,"aaslzixpJBdKrEJ9Lx5Ks4"]],[20,1007,-858,[0,"117tzbJ05NWqwKYd1GJ8m8"]]],[1,"53KK9Wbj9APbPMh5lHEIST",1,0],[1,8.899,0,24.421],[1,5,0.4,5.3]],[6,"pipeline1008",4,[[9,-859,[0,"10EX4zu19CsYAcLZYnABdi"],[1,0.432,1,0.322]],[8,4,2,-860,[0,"edAla1W35B76xyb2Qh3Dt2"]],[20,1008,-861,[0,"1biLkVo4ZD0IRMdZrwyY/s"]]],[1,"3axY5EhuhGOpa8uQYe2B1K",1,0],[1,24.876,0,2.466],[1,5,0.4,5.3]],[6,"pipeline1009",4,[[9,-862,[0,"a7HkGz2v5JUb9BQeeT6QOk"],[1,0.432,1,0.322]],[8,4,2,-863,[0,"98QT8NpnxH6Yx6pzrPkm/c"]],[20,1009,-864,[0,"ebsAWvjrZKUpsV3UkSTPDa"]]],[1,"b9uCUoIUBNnri8EldLSkIv",1,0],[1,1.576,0,-28.639],[1,5,0.4,5.3]],[6,"pipeline1010",4,[[9,-865,[0,"820t3q9U5AnZy4UC1LFxYf"],[1,0.432,1,0.322]],[8,4,2,-866,[0,"fdpNsMIXBAnL7sOBRxSbsx"]],[20,1010,-867,[0,"cd/IUQCzpI/ZFpQfHiVbDr"]]],[1,"1fs+IDUCRGRLDvZJLnryUU",1,0],[1,18.934,0,-4.288],[1,5,0.4,5.3]],[6,"pipeline1011",4,[[9,-868,[0,"40tWsIFtRJ5YiKQNhOd5s8"],[1,0.432,1,0.322]],[8,4,2,-869,[0,"eao4wCu+5LVrQQzpxn1VSo"]],[20,1011,-870,[0,"f4Zw8t4pxNwoa/2wzbaahM"]]],[1,"4235bYB7dALq9Uw43xQnQL",1,0],[1,22.154,0,27.803],[1,5,0.4,5.3]],[6,"pipeline1012",4,[[9,-871,[0,"73rBcSWLZA1rX7MiELJc9t"],[1,0.432,1,0.322]],[8,4,2,-872,[0,"3eBZ3/b9RHKZulh6sqbpEs"]],[20,1012,-873,[0,"61yrFeVx5BqamKiHZGtIQo"]]],[1,"a26LR+cM9EErAdRp4WbJ9X",1,0],[1,29.916,0,-24.012],[1,5,0.4,5.3]],[6,"pipeline1013",4,[[9,-874,[0,"15bB+L4lJAtJDy+Ws1SdCP"],[1,0.432,1,0.322]],[8,4,2,-875,[0,"832y8sKZdGyZkc7blcpKtI"]],[20,1013,-876,[0,"a3r63F0ZtOE7Vj8otKzLYJ"]]],[1,"1d3whnwnBMr5zXYWSpYs9E",1,0],[1,31.331,0,22.943],[1,5,0.4,5.3]],[6,"pipeline1014",4,[[9,-877,[0,"16IPmHwWhFmb2Sin5M6mVf"],[1,0.432,1,0.322]],[8,4,2,-878,[0,"d4OP9UIphG66vS6nn02kJo"]],[20,1014,-879,[0,"baZoaQRUtJT7VczRfrw6jq"]]],[1,"76AYZmH8hMub9SAraeUXx4",1,0],[1,42.73,0,3.902],[1,5,0.4,5.3]],[6,"task01",4,[[9,-880,[0,"a6HHh9x8hGmoKy+0ZK/d8n"],[1,0.589,1,0.641]],[8,4,2,-881,[0,"76sTLKU+VN6pRZNp3gmxRu"]],[13,1,-882,[0,"6b3XqniqRDUYJ+h1t1wHoN"]]],[1,"58YusVxlBABItr5CNuZagy",1,0],[1,30.178,0,-20.769],[1,5,0.4,5.3]],[6,"task02",4,[[9,-883,[0,"84v9v0VyFJe6m6Mw92NSG2"],[1,0.496,1,0.453]],[8,4,2,-884,[0,"4aRpgUy/ZJsIiGXK+WlkWR"]],[13,2,-885,[0,"0eWKVCtIFEyY+b6ysqg6zH"]]],[1,"06DpIESj5CZpZve0UZgkk1",1,0],[1,49.555,0,-2.106],[1,5,0.4,5.3]],[6,"task03",4,[[9,-886,[0,"b2rNpqi85LJqRf7uQvI63M"],[1,0.496,1,0.453]],[8,4,2,-887,[0,"38SsWfH6NM26IhS5nGeo4E"]],[13,3,-888,[0,"93ivKLzhBAyq2WjEhaeCN0"]]],[1,"1asFEESrtOPYR7Qx4+HM1J",1,0],[1,14.824,0,0.361],[1,5,0.4,5.3]],[6,"task04",4,[[9,-889,[0,"78lOn9+RpGLLmDlrXV5aqS"],[1,0.496,1,0.453]],[8,4,2,-890,[0,"b8W/dN291O2Yf2r1gQi8EN"]],[13,4,-891,[0,"acJ+VWdxVB/75YQR5gyJ4Z"]]],[1,"f2Jh4qQ7FDpqTSprCyycKF",1,0],[1,19.35,0,7.641],[1,5,0.4,5.3]],[6,"task05",4,[[9,-892,[0,"f4zWPvgKRFGoU0xvQGI8LP"],[1,0.755,1,0.453]],[8,4,2,-893,[0,"a7bsSzKfFD17F1JZExLmYs"]],[13,5,-894,[0,"08la8C4rZEsIkaPBWrTNuy"]]],[1,"6131VX4EpHSJwc0US74Om/",1,0],[1,-12.64,0,8.536],[1,5,0.4,5.3]],[6,"task06",4,[[9,-895,[0,"ceO8A8v3xA3behvgfIYCjI"],[1,0.865,1,0.497]],[8,4,2,-896,[0,"33UzLVHsxA8YjlK3eVCgbu"]],[13,6,-897,[0,"12LWP6wNRA/KevbyZMcD+b"]]],[1,"20RO1HHjJLZLuJYlDEa+NH",1,0],[1,-17.603,0,-7.369],[1,5,0.4,5.3]],[6,"task07",4,[[9,-898,[0,"883VWjsNRC3qRw5MXLsZA4"],[1,0.496,1,0.453]],[8,4,2,-899,[0,"625tUzYahND4kzle+cs1rF"]],[13,7,-900,[0,"51tflMpoJAV44gKOYRfy/Y"]]],[1,"3a9Ui/gKhIWIud7qRVSRJE",1,0],[1,46.46,0,-6.121],[1,5,0.4,5.3]],[6,"task08",4,[[9,-901,[0,"62CHhAfkREfbgjcL4ix0j1"],[1,0.496,1,0.453]],[8,4,2,-902,[0,"eaIhcDyUFLYbD+vDXlD1Fv"]],[13,8,-903,[0,"c7rtLfoEtM5pV/RqZDwaLt"]]],[1,"8cZRL55O9P+Z/VpM96qKr0",1,0],[1,-7.305,0,3.108],[1,5,0.4,5.3]],[3,"task10",4,[[9,-904,[0,"f3La3zO/lLPaIMP+h9qBH2"],[1,0.496,1,0.453]],[8,4,2,-905,[0,"c4XqV8Sa9OT4bKNnn2v7Vf"]],[13,10,-906,[0,"b9LuvtW+JIv7vqhdEMajo7"]]],[1,"2fG0Sp8dZNy7FpmGGzGsnf",1,0],[1,16.223,0,26.487],[3,0,-0.02319334585106821,0,0.9997309981731249],[1,5,0.4,5.3],[1,0,-2.658,0]],[6,"task09",4,[[9,-907,[0,"e6S9fiQcBOgL0CqZuRT7CU"],[1,0.496,1,0.453]],[8,4,2,-908,[0,"b8jsQkKmJCiq33Q3vohuKo"]],[13,9,-909,[0,"aeMSWeh3JJ6Y9jvdweP3cr"]]],[1,"42ZH7Li9tM3r9ht7j/D9zj",1,0],[1,18.065,0,21.896],[1,5,0.4,5.3]],[6,"task11",4,[[9,-910,[0,"2djBM0V7lPPoJEDmRxBzQo"],[1,0.496,1,0.453]],[8,4,2,-911,[0,"d2gpInbeZDX6ROQdokoAco"]],[13,11,-912,[0,"3amkOulglN5oHQrEF8GppW"]]],[1,"d58XAYBIhBv6IlQODKwVuO",1,0],[1,13.632,0,-28.92],[1,5,0.4,5.3]],[6,"task12",4,[[9,-913,[0,"01YGlGCZBBLZcmzPIJsFj3"],[1,0.496,1,0.453]],[8,4,2,-914,[0,"3d8SPMtV5GWK10yFs43GGE"]],[13,12,-915,[0,"5avgqeMZxHFY8t4SYJGyy6"]]],[1,"1cV4M8WlVDloTZa7SDJvmb",1,0],[1,1.825,0,15.792],[1,5,0.4,5.3]],[6,"task13",4,[[9,-916,[0,"eeKrb8JYJG+r6SWh95N7h0"],[1,0.496,1,0.453]],[8,4,2,-917,[0,"5a7SflGbZP4qRyM2iy/9pd"]],[13,13,-918,[0,"88xVmqQAxPHq30F9n+7Dfk"]]],[1,"75eB+YqyNHdpXskbI6CyT0",1,0],[1,-7.382,0,17.576],[1,5,0.4,5.3]],[6,"task14",4,[[9,-919,[0,"0eNSgwy6lPMIMHwgy2i8+0"],[1,0.496,1,0.453]],[8,4,2,-920,[0,"6dRj/t8/1O65ZdQrkPO5Gd"]],[13,14,-921,[0,"97zszYHshJAJUHk2oblzxJ"]]],[1,"b5DJD0VKxHjYKmYvBPZW01",1,0],[1,-13.114,0,3.353],[1,5,0.4,5.3]],[6,"task15",4,[[9,-922,[0,"e9J3Cc8QtIkZ2Teg5wLMCv"],[1,0.777,1,0.453]],[8,4,2,-923,[0,"9fgYt971pByrS38ogjzb18"]],[13,15,-924,[0,"b7X1U4p8pMUZjXu4q+fXdC"]]],[1,"d2wM0jQKxMhqpiLbuk67R6",1,0],[1,21.085,0.064,-6.96],[1,5,0.4,5.3]],[6,"task16",4,[[9,-925,[0,"66Z+T6FWhLRZWb/Qojd+im"],[1,0.496,1,0.453]],[8,4,2,-926,[0,"58EwbPr8NLc54m8asBRWqD"]],[13,16,-927,[0,"18PfzGQH5PsLnDo417D8n5"]]],[1,"1aeYlyChFA5JtGH6AhaPaW",1,0],[1,-43.204,0.064,-3.389],[1,5,0.4,5.3]],[3,"task17",4,[[9,-928,[0,"2ct0f6a+1Gup7ZKuXcQJdC"],[1,0.496,1,0.69]],[8,4,2,-929,[0,"3f3SidthJEy7sh2qI11K+2"]],[13,17,-930,[0,"a8V9huGUpHgbD9bU7i/E+I"]]],[1,"1ar92Zh0tLppnB5TYPlrDE",1,0],[1,33.847,-0.3,-23.855],[3,0,0.33989537696812483,0,0.9404632543144343],[1,5,0.4,5.3],[1,0,39.741,0]],[6,"task18",4,[[9,-931,[0,"93z32LJMFHRZOhTn5J1hN2"],[1,0.752,1,0.453]],[8,4,2,-932,[0,"ddKkzoYUlHOKSykZgTyMU6"]],[13,18,-933,[0,"c5tVD9XQtF350+aUlWYgbH"]]],[1,"38GsygOEVGsIMT3RWfS2wz",1,0],[1,-36.544,0.064,-21.264],[1,5,0.4,5.3]],[6,"task19",4,[[9,-934,[0,"808Aati/5G57ZbO3CN0T/j"],[1,0.496,1,0.453]],[8,4,2,-935,[0,"6bG2EqEBZM7KyLOLOZhGwF"]],[13,19,-936,[0,"fbaFLW33FPDL+AwX6yk8IG"]]],[1,"399BapeZ5J/bXqdfGc1SK7",1,0],[1,1.47,0.064,15.808],[1,5,0.4,5.3]],[6,"task20",4,[[9,-937,[0,"64DW5g4/dCd59FBKOV8BRD"],[1,0.753,1,0.453]],[8,4,2,-938,[0,"92gCDQf99GMooQ1ro9tFmz"]],[13,20,-939,[0,"7au0Ybn4dOG7nV0uDETT7A"]]],[1,"6e/xdYBiFFjJisprkCXZ74",1,0],[1,-36.687,0.064,16.329],[1,5,0.4,5.3]],[6,"task21",4,[[9,-940,[0,"bdbRbyLFZLU7FKTMfXLQLy"],[1,0.327,1,0.453]],[8,4,2,-941,[0,"10QWlij+VIAIW5RRqbn0q8"]],[13,21,-942,[0,"a3iQkqQlRDQbX50+fYYBpN"]]],[1,"968Fd6gbFLmqB6VPgU5xsA",1,0],[1,-0.228,0.064,7.55],[1,5,0.4,5.3]],[6,"task22",4,[[9,-943,[0,"00qoPemGRFvK3Ca5kBpKuq"],[1,0.327,1,0.453]],[8,4,2,-944,[0,"0esK4wrqRETaJONrFURDR2"]],[13,22,-945,[0,"bcxEmU8HNGKI3hRVPC1zEV"]]],[1,"24FkLWVapGdZQ9eM7jwNNm",1,0],[1,23.655,0,22.793],[1,5,0.4,5.3]],[6,"task23",4,[[9,-946,[0,"7dHcXRhH1Is6htvXxYjctl"],[1,0.327,1,0.453]],[8,4,2,-947,[0,"e3UfvDV4FD6bCbXDbM21OM"]],[13,23,-948,[0,"c7sQnTSZ9DzZCeqXNWUpPj"]]],[1,"d23Nww9LxAkrWbk2gPBqxY",1,0],[1,10.319,0.064,0.589],[1,5,0.4,5.3]],[6,"task24",4,[[9,-949,[0,"51m0SX2/BJ3JCVhBLv6PBc"],[1,0.327,1,0.453]],[8,4,2,-950,[0,"74U736WOdEeZGdLRNn6lyV"]],[13,24,-951,[0,"58JrN8+qVGZrHfdn75hXa+"]]],[1,"38q9P9ullKQaY7KbwIKOJY",1,0],[1,8.3,0.064,8.011],[1,5,0.4,5.3]],[15,"soundGear",4,[-954],[[53,15,-952,[0,"7eDg0t6mpCwo4a+D6ijbsL"]],[41,true,false,0.8,-953,[0,"44MTDBYb9BjK1vQL5t1089"],1359]],[1,"58U0+Fj/FNRLi9MqIrL2Ug",1,0],[1,31.404,0,19.322]],[15,"soundGear-001",4,[-957],[[53,15,-955,[0,"a9JgE44fFIiav+j+SA3fpf"]],[41,true,false,0.8,-956,[0,"b2p4yjAWJJFobuBZmNfTUi"],1360]],[1,"a4qHMk9WBJ5Ih3eP8KEwgr",1,0],[1,30.466,0,-19.442]],[15,"soundElectric",4,[-960],[[40,15,false,-958,[0,"22Zjb2PSNBF4qohFEVBt+Q"]],[41,true,false,0.4,-959,[0,"2aBvUTWlxJUrhuH0OhvPNb"],1361]],[1,"46Xf7A+/dHSpQfvn+gCbZ2",1,0],[1,-12.198,0,7.661]],[15,"soundEngine",4,[-963],[[40,15,false,-961,[0,"4eYgBF85VJXKqEr1K1KgNR"]],[54,true,false,-962,[0,"0aMJ7P+jRL5Ks7v7O00fuz"],1362]],[1,"a552peudFIebFfFAc5Xkyn",1,0],[1,-35.954,0,13.845]],[15,"soundEngine-001",4,[-966],[[40,15,false,-964,[0,"ebOyvcAflOaIC76HPiEzrr"]],[54,true,false,-965,[0,"25/rbuw/lPA6jmN20tTz7w"],1363]],[1,"848GktS39BwL35JvTScNwW",1,0],[1,-35.954,0,-19.037]],[17,"cover",16,[-968],[[4,1,-967,[0,"08hLw6c7lG2ZVCuIrMxqqA"],[1140],[2,256,[2,0,0,1,1]],1141]],[1,"adFBvnHjhAtp0RrPWqCqQ+",1,0],[1,-0.061,0,-0.5],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,-90.00000000000003,0,0]],[17,"cover-004",16,[-970],[[4,1,-969,[0,"1fXWNygc1NDJjx0+lWrCBm"],[1148],[2,256,[2,0,0,1,1]],1149]],[1,"71YbUm5ABGdI9yd2SH9KBG",1,0],[1,-7.382,0,-53.524],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,-90.00000000000003,0,0]],[17,"cover-006",16,[-972],[[4,1,-971,[0,"34AECWcH5LTJ6qWYnGs7r6"],[1152],[2,256,[2,0,0,1,1]],1153]],[1,"9bnF7IFdpMfIdgwh0x/1RI",1,0],[1,-40.024,0,-47.752],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,-90.00000000000003,0,0]],[17,"cover-012",16,[-974],[[4,1,-973,[0,"4aJ8FQglRD+ap+mE1ertKy"],[1164],[2,256,[2,0,0,1,1]],1165]],[1,"4esv65WvNK/a5+rMGyShws",1,0],[1,21.019,0,-48.913],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,-90.00000000000003,0,0]],[47,"Emergencybutton",3,[-976],[[4,1,-975,[0,"346vSyCzxKRquzkPjkUcy5"],[1264,1265,1266],[2,256,[2,0,0,1,1]],1267]],[1,"e0qLGi1nhNsLbnCqgXq0ss",1,0],[1,4.923,0.622,-18.487],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,2.9,2.9,2.9],[1,-90.00000000000003,0,0]],[6,"engine",3,[[4,1,-977,[0,"d6o47uatNBYqgOEnaCKd9k"],[1270],[2,256,[2,0,0,1,1]],1271],[78,-978,[0,"bdKdJ1aKpNpJ+IW6xxSanl"],[1272],1273]],[1,"66bGonhcBF9Kq7iI+w3lFv",1,0],[1,-36.268,-0.85,13.588],[1,1.5025229454040527,1.5025229454040527,1.5025229454040527]],[64,"MonitoringConsole",3,[-980],[[4,1,-979,[0,"92cnrT4plCtbhqL/rMZtjy"],[1282],[2,256,[2,0,0,1,1]],1283]],[1,"3c/Sywv+RD8L5pIKwaKLlO",1,0],[1,-24.982,0,-8.165],[1,1.5025229454040527,1.5025229454040527,1.5025229454040527]],[47,"prop_map",3,[-982],[[5,-981,[0,"115BgTvxtEwIUYLENXij8p"],[1341],[16,[2,0,0,1,1]],1342]],[1,"91DZRxTzJKzqk3hDxVdxne",1,0],[1,16.212,1.232,5.8950000000000005],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,0.8,0.8,0.8],[1,-90.00000000000004,0,0]],[6,"collider",100,[[30,-983,[0,"f7TlZ7WmpHF6Drt/D8N3Lq"]],[8,32,2,-984,[0,"3a66y303VKTKbeCq3DodQl"]]],[1,"c951/heJtHbY7KI/rsxz9z",1,0],[1,-0.009,0,0.826],[1,18,0.4,10]],[6,"collider",101,[[30,-985,[0,"2a2FpbnYJEKbHga4XZvO1N"]],[8,32,2,-986,[0,"136nju9rVL/IN0lNz4eDLF"]]],[1,"4cKhJOIwNKUa758gpFsGIq",1,0],[1,-1.519,0,-0.156],[1,18,0.4,10]],[6,"collider",102,[[9,-987,[0,"1ap54hvNZDCbAPm077FhO+"],[1,0.581,1,1]],[8,32,2,-988,[0,"5fRlLu0zlAPbs8HbfPE6gj"]]],[1,"eeShHHlONMTJ0Pd3izs/qz",1,0],[1,0.298,0,0.66],[1,18,0.4,10]],[6,"collider",103,[[30,-989,[0,"39rdsZj2lDAJ+Q9h8jHNZz"]],[8,32,2,-990,[0,"73UEDXVcJF/6s7fmGQj+Jr"]]],[1,"aejeMJARhF15voylJA96gN",1,0],[1,-1.946,0,-0.047],[1,18,0.4,10]],[6,"collider",104,[[30,-991,[0,"cfBCTEktBINq1J+8mg7yf/"]],[8,32,2,-992,[0,"6cutU2ib9MUKHlABPG+wAg"]]],[1,"6c5v+uipBChKeq79m+8KUR",1,0],[1,-0.464,0,0.405],[1,18,0.4,10]],[3,"threshold_01",10,[[5,-993,[0,"1753Ah8nlBBZVu/K2jh7QY"],[0],[2,256,[2,0,0,1,1]],1]],[1,"895tS53v9PUYWhad1sf433",1,0],[1,0,0,-2.889],[3,-0.7071067811865476,0,0,0.7071067811865476],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"threshold_03",10,[[5,-994,[0,"52WdUmm79FEIip/1+lUk6h"],[2],[2,256,[2,0,0,1,1]],3]],[1,"cdO7F0Wv1FU6wg1RJlTF2N",1,0],[1,0,-0.012,8.08],[3,-0.7071067811865476,0,0,0.7071067811865476],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"threshold_04",10,[[5,-995,[0,"a1asPMspZDmo2hovSesaBb"],[4],[2,256,[2,0,0,1,1]],5]],[1,"aeWSCVOSFCZLsxBlOlE/U+",1,0],[1,-38.642,-0.012,-9.678],[3,-0.7071067811865476,0,0,0.7071067811865476],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"threshold_05",10,[[5,-996,[0,"6apgE5qIZLVZ7TTaAiFpO5"],[6],[2,256,[2,0,0,1,1]],7]],[1,"61C3QG1cZLYZVD3Va7GLUG",1,0],[1,-38.642,-0.012,7.927],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"threshold_06",10,[[5,-997,[0,"9f08jisslB35D3p+jfasgK"],[8],[2,256,[2,0,0,1,1]],9]],[1,"18c+V2fNJMtJUnv+1iHor+",1,0],[1,-38.642,-0.012,7.927],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"threshold_07",10,[[5,-998,[0,"6aWjYKirtEy4qYYS+sfmJF"],[10],[2,256,[2,0,0,1,1]],11]],[1,"25dzaPfaNGVoT3/zb+d54T",1,0],[1,-18.455,-0.012,-11.586],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"threshold_08",10,[[5,-999,[0,"5fjnVkZaRMMIMQRxoljdiR"],[12],[2,256,[2,0,0,1,1]],13]],[1,"99EiWSz/FIe4jrD695JArh",1,0],[1,27.115,-0.012,15.17],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"threshold_09",10,[[5,-1000,[0,"24KnxoHqlG7r+3HCCaQhoN"],[14],[2,256,[2,0,0,1,1]],15]],[1,"f5xzCxdgdK/JaY7DA1EAyQ",1,0],[1,26.938,-0.012,-9.866],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"threshold_10",10,[[5,-1001,[0,"c041ea509Ge7auS5OPIB/h"],[16],[2,256,[2,0,0,1,1]],17]],[1,"61D4LhCQhF1KOO+jCnQMHt",1,0],[1,16.837,-0.012,22.708],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"threshold_11",10,[[5,-1002,[0,"02z91rcZxANpnSvVnh+1nM"],[18],[2,256,[2,0,0,1,1]],19]],[1,"c9JORlYMFOUYEAlz/5xrmN",1,0],[1,12.648,-0.012,-16.905],[3,-0.5,0.5,0.4999999999999999,0.5000000000000001],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,90,0]],[3,"threshold_12",10,[[5,-1003,[0,"5cz4QtmApGtZTOandDrw79"],[20],[2,256,[2,0,0,1,1]],21]],[1,"42M3TW+7VMFLSabB3qmNWi",1,0],[1,8.518,-0.012,3.971],[3,-0.5,0.5,0.4999999999999999,0.5000000000000001],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,90,0]],[3,"threshold_13",10,[[5,-1004,[0,"7dFuxrxuZECb1NLMhr1c4A"],[22],[2,256,[2,0,0,1,1]],23]],[1,"23Yoo3zMpIdaZSr+2dcZma",1,0],[1,-12.766,0,-16.662],[3,-0.5,0.5,0.4999999999999999,0.5000000000000001],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,90,0]],[3,"threshold_14",10,[[5,-1005,[0,"021D4NReFESbBKLTHyc7m7"],[24],[2,256,[2,0,0,1,1]],25]],[1,"08gmNcsxtN67gXSI6s8G8a",1,0],[1,-32.2,0,-16.662],[3,-0.5,0.5,0.4999999999999999,0.5000000000000001],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,90,0]],[3,"threshold_15",10,[[5,-1006,[0,"2c1IlwYcNJFLjOW7THJlan"],[26],[2,256,[2,0,0,1,1]],27]],[1,"9eLkfbH3tGDoVgDngwa1Yy",1,0],[1,-32.413,0,15.319],[3,-0.5,0.5,0.4999999999999999,0.5000000000000001],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,90,0]],[3,"threshold_16",10,[[5,-1007,[0,"6fl12SLm5KkqCdzGPUYzd6"],[28],[2,256,[2,0,0,1,1]],29]],[1,"fbmOtPDRJB46Ew+rXT9sii",1,0],[1,-9.269,0,21.929],[3,-0.5,0.5,0.4999999999999999,0.5000000000000001],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,90,0]],[3,"threshold_17",10,[[5,-1008,[0,"ebJZEqZMxL+Jinglcytdu6"],[30],[2,256,[2,0,0,1,1]],31]],[1,"f1WaJPxJlJxJ03ASTYmzc7",1,0],[1,6.901,0,20.22],[3,-0.5,0.5,0.4999999999999999,0.5000000000000001],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,90,0]],[3,"threshold_18",10,[[5,-1009,[0,"9ePF1pC3RGzqlbnUrwWqjR"],[32],[2,256,[2,0,0,1,1]],33]],[1,"16OydNLBRLGqz8zN7+fMQO",1,0],[1,21.69,0,20.22],[3,-0.5,0.5,0.4999999999999999,0.5000000000000001],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,90,0]],[3,"threshold_19",10,[[5,-1010,[0,"d8J/NoYkVCSZ+FJRV6wBrI"],[34],[2,256,[2,0,0,1,1]],35]],[1,"024WhYt49MjZRmACCme/wM",1,0],[1,35.54,0,0.019],[3,-0.5,0.5,0.4999999999999999,0.5000000000000001],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,90,0]],[3,"threshold_20",10,[[5,-1011,[0,"8f7Wt68zlDvL+vUORz1E6l"],[36],[2,256,[2,0,0,1,1]],37]],[1,"d93xo60BBIo6r86j4cumZt",1,0],[1,18.654,-0.012,-16.905],[3,-0.5,0.5,0.4999999999999999,0.5000000000000001],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,90,0]],[3,"threshold_02",12,[[5,-1012,[0,"c9gvzBYRtGLZ4UBIQrcpG4"],[38],[2,256,[2,0,0,1,1]],39]],[1,"e9Cl28R6xMPbC/xMtWGTvD",1,0],[1,0,0,0.082],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"threshold_03",12,[[5,-1013,[0,"b2ednrjU5A9bg2tjy/XNdI"],[40],[2,256,[2,0,0,1,1]],41]],[1,"9dhr/V+spORYocx7m7/NdC",1,0],[1,0.181,0,-10.431],[3,-0.7070913113196142,-0.004677334316497165,-0.004677334316497164,0.7070913113196143],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,-0.758,0]],[3,"threshold_04",12,[[5,-1014,[0,"079ReF8L1KgIR4amG7JxOe"],[42],[2,256,[2,0,0,1,1]],43]],[1,"0140IxyBpBM6vTYhX8eGJB",1,0],[1,0,0,-6.484],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"threshold_05",12,[[5,-1015,[0,"d8tFxbcwxJDbRvsVzX7iI0"],[44],[2,256,[2,0,0,1,1]],45]],[1,"5fqO5tKzZLGLDI4pXfrVRG",1,0],[1,26.744,0,-17.028],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"threshold_06",12,[[5,-1016,[0,"b3E/xdp01M9qsQaaUxQ1H9"],[46],[2,256,[2,0,0,1,1]],47]],[1,"5dHNMCjwdJ+L/EuhSKncSL",1,0],[1,30.999,0,-9.218],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"threshold_07",12,[[5,-1017,[0,"e7QfGX25pMNKHmmCoTTPxM"],[48],[2,256,[2,0,0,1,1]],49]],[1,"85TUtIDUZP7rAH1hwNXEv8",1,0],[1,26.93,0,-0.28],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"threshold_08",12,[[5,-1018,[0,"83mg6lypRPb4XP1BMQaLem"],[50],[2,256,[2,0,0,1,1]],51]],[1,"6fJr4o4CRDsaec0ln42Cxh",1,0],[1,26.93,0,6.508],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"threshold_09",12,[[5,-1019,[0,"69gTf8s3NOzro+wrp22Qvc"],[52],[2,256,[2,0,0,1,1]],53]],[1,"c0KdYgLlRI2bm9ZHqtS2Mv",1,0],[1,-27.952,0,11.264],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"threshold_10",12,[[5,-1020,[0,"48OYMzA6dGJb3wtxkYzTL5"],[54],[2,256,[2,0,0,1,1]],55]],[1,"a6+veXHulGYYyX0RvlOvx3",1,0],[1,-39.678,0,-4.058],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"threshold_11",12,[[5,-1021,[0,"52lBDvP41O4JNCN3RiLJzp"],[56],[2,256,[2,0,0,1,1]],57]],[1,"b9ZIXhPedCzrION22cfw9H",1,0],[1,-39.678,0,-10.7],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"threshold_12",12,[[5,-1022,[0,"15XsuQutxNgqWbgD5qqRdK"],[58],[2,256,[2,0,0,1,1]],59]],[1,"6aTZREZdxMnKIo3XxaEcIg",1,0],[1,-39.678,0,-17.071],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"threshold_13",12,[[5,-1023,[0,"5czAuqoqxNba86ZNt/rhfz"],[60],[2,256,[2,0,0,1,1]],61]],[1,"91D4NB3UdDo4vFNyk4xrgX",1,0],[1,-18.791,0,-16.961],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"threshold_14",12,[[5,-1024,[0,"a1WEkuVvtOsZXcEcxcS/kS"],[62],[2,256,[2,0,0,1,1]],63]],[1,"f6k0v9UDxHwbljF4rZ9h7x",1,0],[1,15.62,0,-22.738],[3,-0.5000000000000001,0.49999999999999983,0.5000000000000001,0.4999999999999999],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,90,0]],[3,"threshold_15",12,[[5,-1025,[0,"94UlEWAT1GFY0YNpV4/Clk"],[64],[2,256,[2,0,0,1,1]],65]],[1,"23XhPGNJtArY+2DHeeutAn",1,0],[1,19.619,0,-22.738],[3,-0.5000000000000001,0.49999999999999983,0.5000000000000001,0.4999999999999999],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,90,0]],[3,"threshold_16",12,[[5,-1026,[0,"84KlrcGlxAOqaYzz5Ztya0"],[66],[2,256,[2,0,0,1,1]],67]],[1,"25PR6UpytBWoCPtqkp5nFX",1,0],[1,36.845,0,-6.841],[3,-0.5000000000000001,0.49999999999999983,0.5000000000000001,0.4999999999999999],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,90,0]],[3,"threshold_17",12,[[5,-1027,[0,"d1NFQW/uhGg5beV8bdNyIZ"],[68],[2,256,[2,0,0,1,1]],69]],[1,"f9ZOimYsVAwIwyisdM8fc+",1,0],[1,19.903,0,-11.11],[3,-0.5000000000000001,0.49999999999999983,0.5000000000000001,0.4999999999999999],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,90,0]],[3,"threshold_18",12,[[5,-1028,[0,"5fhxyQyV1J9661HeD3u4zY"],[70],[2,256,[2,0,0,1,1]],71]],[1,"c0kjgdfltGWJIaxhrf23wn",1,0],[1,-33.145,0,8.113],[3,-0.5000000000000001,0.49999999999999983,0.5000000000000001,0.4999999999999999],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,90,0]],[48,"ceiling",19,[[4,1,-1029,[0,"21NQkcLBJKKqALIdXGkPV9"],[72,73],[2,256,[2,0,0,1,1]],74]],[1,"5bvWpoLNlMMLLl16DdZdcP",1,0],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,-90.00000000000003,0,0]],[65,"ground_01",19,[[5,-1030,[0,"28Zz6wTn1MDoJZt9XeFmSe"],[75,76,77,78,79,80,81,82],[2,256,[2,0,0,1,1]],83]],[1,"a9v39ejipJ5LjUNrgQHWPh",1,0],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000004,0,0]],[3,"Railing_01",19,[[5,-1031,[0,"e8w4WyPdRB5bP4iWqI/NKR"],[84],[2,256,[2,0,0,1,1]],85]],[1,"91LO7vLyZD2JnUetkBZkKn",1,0],[1,26.531,0.028000000000000025,-22.924999999999997],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.823,21.926000000000002,22.823000000000004],[1,-90.00000000000003,0,0]],[3,"Railing_02",19,[[5,-1032,[0,"394NYaqk5Nmr8AObtciTxt"],[86],[2,256,[2,0,0,1,1]],87]],[1,"a7XgC5bDpHYJIYECZ+f1f5",1,0],[1,26.87,0,-14.793],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"Railing_03",19,[[5,-1033,[0,"a8+X2lrYROr4IgrpZOkFRc"],[88],[2,256,[2,0,0,1,1]],89]],[1,"c1GSDgmQ9C8J2wbnjKDFwt",1,0],[1,34.577,0,-16.803],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"Railing_04",19,[[5,-1034,[0,"dc5fTP5BNPTY7Co0IAk4xd"],[90],[2,256,[2,0,0,1,1]],91]],[1,"8c8SCE5vROmLT2/A4HbL7A",1,0],[1,28.349999999999998,0,16.004],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"Railing_05",19,[[5,-1035,[0,"fbSGhBYbpA8bDN/PyIInGq"],[92],[2,256,[2,0,0,1,1]],93]],[1,"bds3ySP1JPhoObNamKJJzL",1,0],[1,28.33,0,22.158],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"Railing_06",19,[[5,-1036,[0,"fdHORPA/pHQpRrDGuaNlji"],[94],[2,256,[2,0,0,1,1]],95]],[1,"c6wkxnqyZItrSTt/6L4BHp",1,0],[1,34.671,0,20.377],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"Railing_07",19,[[5,-1037,[0,"16xE307J1Dr5qx9muqtNFX"],[96],[2,256,[2,0,0,1,1]],97]],[1,"edjy3MuSZJM6RFzx/OjxbO",1,0],[1,27.629,0,-16.533],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"corner_01",5,[[4,1,-1038,[0,"a78N4vXw1I/J78fhfcWCP1"],[98],[2,256,[2,0,0,1,1]],99]],[1,"55Zugno2xNzJD8D1kO3sV3",1,0],[1,8.066,0,-1.556],[3,0.5000000000000001,0.4999999999999999,0.5,-0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,-89.99999999999999,0]],[3,"corner_01",5,[[4,1,-1039,[0,"90/CbHJBVMD7IUNsIutKuk"],[100],[2,256,[2,0,0,1,1]],101]],[1,"b9iuVy275LW7yAAMmtlxRj",1,0],[1,25.560000000000002,0.083,2.283999999999999],[3,-0.5000000000000002,-0.49999999999999983,-0.5000000000000001,0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,-89.99999999999999,0]],[3,"corner_02",5,[[4,1,-1040,[0,"7bM3AxI+tKjaIGwaLynIGD"],[102],[2,256,[2,0,0,1,1]],103]],[1,"c8fSWU/iFL1rShLqArnLg0",1,0],[1,8.101,0,-6.095],[3,-0.7071067811865476,0,0,0.7071067811865476],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"corner_03",5,[[4,1,-1041,[0,"61xa01mK1AUb0D5voJtnUO"],[104],[2,256,[2,0,0,1,1]],105]],[1,"0dGDNXJ59EupChb5ysNmS5",1,0],[1,25.529,0,5.912],[3,-0.7071067811865476,0,0,0.7071067811865476],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"corner_04",5,[[4,1,-1042,[0,"f2WxXXXPpHLbOBMwn+m6av"],[106],[2,256,[2,0,0,1,1]],107]],[1,"f6bG4RE+5PHaU05LxXbXVX",1,0],[1,25.399,0,29.062],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"corner_05",5,[[4,1,-1043,[0,"06ZFyQ5vZLt7dpFIVpCcd8"],[108],[2,256,[2,0,0,1,1]],109]],[1,"d8MUe/KClOP67sotdgjN3Q",1,0],[1,2.568,0,30.713],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"corner_06",5,[[4,1,-1044,[0,"692P74BjVAY7Al+/upSWvE"],[110],[2,256,[2,0,0,1,1]],111]],[1,"9928wT+S1INr4lBzF98YFT",1,0],[1,-15.907,0,32.286],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"corner_07",5,[[4,1,-1045,[0,"d9DW6UnPdGO5j9vId0nm47"],[112],[2,256,[2,0,0,1,1]],113]],[1,"9eD/drr1tGO4D7uGZQ1ics",1,0],[1,-29.006,0,32.258],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"corner_08",5,[[4,1,-1046,[0,"1dw/NaAZtHVbyDEU2RXW0q"],[114],[2,256,[2,0,0,1,1]],115]],[1,"943OznSJBMUY8+rcb8xxKp",1,0],[1,-36.887,0,25.697],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"corner_09",5,[[4,1,-1047,[0,"b7b6rPthVEbIeULdp2WkVG"],[116],[2,256,[2,0,0,1,1]],117]],[1,"937/k+pCJK+Zl6eWuCqE5S",1,0],[1,-40.617,0,21.807],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"corner_10",5,[[4,1,-1048,[0,"8cCsaALtRK2ZbwlvFSOn7X"],[118],[2,256,[2,0,0,1,1]],119]],[1,"01pS5TjOBKGav2xI/vOo+p",1,0],[1,-40.437,0,9.437],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"corner_11",5,[[4,1,-1049,[0,"46J8HFGFJNCaZLWKyA+L4V"],[120],[2,256,[2,0,0,1,1]],121]],[1,"a7dY9/syJPDpxPl/5k8YDa",1,0],[1,-48.309,0,9.588],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"corner_12",5,[[4,1,-1050,[0,"22RAWMHmpHyKoIuK+KJWYs"],[122],[2,256,[2,0,0,1,1]],123]],[1,"45Ne2TOX1HFZ0LUo34SEP1",1,0],[1,-52.076,0,5.724],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"corner_13",5,[[4,1,-1051,[0,"0bcoCVUltNRZtSWJMSmAwY"],[124],[2,256,[2,0,0,1,1]],125]],[1,"9bsAXFiXpDD61jA/yGkPxt",1,0],[1,-36.569,0,-6.036],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"corner_14",5,[[4,1,-1052,[0,"0aYyd38u5PX65RqjqsCt51"],[126],[2,256,[2,0,0,1,1]],127]],[1,"75V3M6ztNDNbr4pzRPZ2Gm",1,0],[1,-20.237,0,2.316],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"corner_15",5,[[4,1,-1053,[0,"21i4wVIzxG8JC5wo4urG7A"],[128],[2,256,[2,0,0,1,1]],129]],[1,"27btFJ+MRNl7ua5cyuEfB0",1,0],[1,-6.657,0,9.192],[3,-4.3297802811774677e-17,0.7071067811865474,0.7071067811865477,4.329780281177465e-17],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,180,0]],[3,"corner_16",5,[[4,1,-1054,[0,"1bsubPJwBD9KDtJnklyJ0P"],[130],[2,256,[2,0,0,1,1]],131]],[1,"6cmUtx2zNEDYfWHS9FBbkr",1,0],[1,-11.886,0,37.107],[3,-4.3297802811774677e-17,0.7071067811865474,0.7071067811865477,4.329780281177465e-17],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,180,0]],[3,"corner_17",5,[[4,1,-1055,[0,"7am8BgmZRJTqbRKeVgTdj3"],[132],[2,256,[2,0,0,1,1]],133]],[1,"c9CSXA8MZNmrQRLA2PRcfO",1,0],[1,-33.285,0,30.405],[3,-4.3297802811774677e-17,0.7071067811865474,0.7071067811865477,4.329780281177465e-17],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,180,0]],[3,"corner_18",5,[[4,1,-1056,[0,"82/OTZ8T1LHqJQB/HQe2H3"],[134],[2,256,[2,0,0,1,1]],135]],[1,"74+BUUfIFKRJLPBdlg0C8s",1,0],[1,-44.552,0,14.935],[3,-4.3297802811774677e-17,0.7071067811865474,0.7071067811865477,4.329780281177465e-17],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,180,0]],[3,"corner_19",5,[[4,1,-1057,[0,"ef0/WUTRxIy5zuo2QtK5a9"],[136],[2,256,[2,0,0,1,1]],137]],[1,"adGz4QUiNIGoqKBIE1PvOJ",1,0],[1,-44.644,0,2.448],[3,-4.3297802811774677e-17,0.7071067811865474,0.7071067811865477,4.329780281177465e-17],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,180,0]],[3,"corner_20",5,[[4,1,-1058,[0,"ediGI7pHlI3p1csgzCBcOT"],[138],[2,256,[2,0,0,1,1]],139]],[1,"aeX/0HrcVMZJ3ZTyg9hRid",1,0],[1,-24.591,0,-1.319],[3,-4.3297802811774677e-17,0.7071067811865474,0.7071067811865477,4.329780281177465e-17],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,180,0]],[3,"corner_21",5,[[4,1,-1059,[0,"7bnpBAD+JMOKy4vBLWAUL1"],[140],[2,256,[2,0,0,1,1]],141]],[1,"40l3qT/0BFgajjUsNOt58D",1,0],[1,-15.637,0,-1.433],[3,-4.3297802811774677e-17,0.7071067811865474,0.7071067811865477,4.329780281177465e-17],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,180,0]],[3,"corner_22",5,[[4,1,-1060,[0,"91TIaJAHZNRKYFKlJC6j53"],[142],[2,256,[2,0,0,1,1]],143]],[1,"f2ye3uLwdPpbFbSNbZjuM2",1,0],[1,15.783,0,-1.609],[3,-4.3297802811774677e-17,0.7071067811865474,0.7071067811865477,4.329780281177465e-17],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,180,0]],[3,"corner_23",5,[[4,1,-1061,[0,"e5Js30aVxP34ndIo+zEIvh"],[144],[2,256,[2,0,0,1,1]],145]],[1,"3d0UwfghNAxIwfWTnWbY+3",1,0],[1,20.483,0,2.289],[3,-4.3297802811774677e-17,0.7071067811865474,0.7071067811865477,4.329780281177465e-17],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,180,0]],[3,"corner_24",5,[[4,1,-1062,[0,"c7sqav54JEg5FFbbeDeUQg"],[146],[2,256,[2,0,0,1,1]],147]],[1,"8ctIg2oAJAHaaCUpSRgMfU",1,0],[1,24.998,0,9.955],[3,-4.3297802811774677e-17,0.7071067811865474,0.7071067811865477,4.329780281177465e-17],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,180,0]],[3,"corner_25",5,[[4,1,-1063,[0,"0eyUu6o6dKjbb4dS/9AdaQ"],[148],[2,256,[2,0,0,1,1]],149]],[1,"e40KEoTvVM4qokXGBzQFNc",1,0],[1,32.92,0,15.178],[3,-4.3297802811774677e-17,0.7071067811865474,0.7071067811865477,4.329780281177465e-17],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,180,0]],[3,"corner_26",5,[[4,1,-1064,[0,"60BuZKmgFIO58z8KKyOywI"],[150],[2,256,[2,0,0,1,1]],151]],[1,"fefGUee05I6bil1J97fHcz",1,0],[1,19.078,0,35.519],[3,-4.3297802811774677e-17,0.7071067811865474,0.7071067811865477,4.329780281177465e-17],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,180,0]],[3,"corner_27",5,[[4,1,-1065,[0,"fdx6ZbhqRLFZp56z3qQ5qa"],[152],[2,256,[2,0,0,1,1]],153]],[1,"26FlPnw05A2LxmfDyuFgYO",1,0],[1,-19.885,0,-1.469],[3,-0.5000000000000002,-0.49999999999999983,-0.5000000000000001,0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,-89.99999999999999,0]],[3,"corner_28",5,[[4,1,-1066,[0,"62WbzrdvhKvbVte8aJ1ziw"],[154],[2,256,[2,0,0,1,1]],155]],[1,"791uxdpktPs7CSyrkITbxa",1,0],[1,-36.579,0,-1.3],[3,-0.5000000000000002,-0.49999999999999983,-0.5000000000000001,0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,-89.99999999999999,0]],[3,"corner_29",5,[[4,1,-1067,[0,"33SLg6ykFAEq8sQo1rTV6c"],[156],[2,256,[2,0,0,1,1]],157]],[1,"75U0wbJTpC8bdZ+/wnvAz4",1,0],[1,-40.446,0,2.464],[3,-0.5000000000000002,-0.49999999999999983,-0.5000000000000001,0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,-89.99999999999999,0]],[3,"corner_30",5,[[4,1,-1068,[0,"59RQ5HvIJGAKPQIjKoPrGU"],[158],[2,256,[2,0,0,1,1]],159]],[1,"devOMC3YZAl4reHZGsJOdE",1,0],[1,-40.63,0,14.809],[3,-0.5000000000000002,-0.49999999999999983,-0.5000000000000001,0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,-89.99999999999999,0]],[3,"corner_31",5,[[4,1,-1069,[0,"adraZxUgBKzba7nZQNMUjL"],[160],[2,256,[2,0,0,1,1]],161]],[1,"68aLyzeJVLMoqMkLLXPMTs",1,0],[1,-36.789,0,30.387],[3,-0.5000000000000002,-0.49999999999999983,-0.5000000000000001,0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,-89.99999999999999,0]],[3,"corner_32",5,[[4,1,-1070,[0,"47au/I2/hDyaAgEx2VK5f0"],[162],[2,256,[2,0,0,1,1]],163]],[1,"361uqlI+hGipL5umFoFVxS",1,0],[1,-36.962,0,14.746],[3,-4.3297802811774677e-17,0.7071067811865474,0.7071067811865477,4.329780281177465e-17],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,180,0]],[3,"corner_33",5,[[4,1,-1071,[0,"dd/TMu+3dDOpF+HEflXl8J"],[164],[2,256,[2,0,0,1,1]],165]],[1,"e0ZDasi6NDM5Ur9JVeGsO0",1,0],[1,-48.374,0,14.827],[3,-0.5000000000000002,-0.49999999999999983,-0.5000000000000001,0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,-89.99999999999999,0]],[3,"corner_34",5,[[4,1,-1072,[0,"e61+tTNW5CsIaaiufc5FNM"],[166],[2,256,[2,0,0,1,1]],167]],[1,"b6NXJHOBFNxaWvizxeI58d",1,0],[1,-52.116,0,18.397],[3,-0.5000000000000002,-0.49999999999999983,-0.5000000000000001,0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,-89.99999999999999,0]],[3,"corner_36",5,[[4,1,-1073,[0,"0fASRxXR1HbY9dMpF43rQs"],[168],[2,256,[2,0,0,1,1]],169]],[1,"e8VsSuGB9MXYVrd8n/R4p4",1,0],[1,-0.579,0.067,9.15],[3,-0.5000000000000002,-0.49999999999999983,-0.5000000000000001,0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,-89.99999999999999,0]],[3,"corner_37",5,[[4,1,-1074,[0,"78+QnnvVdHl6yokHBVUyg2"],[170],[2,256,[2,0,0,1,1]],171]],[1,"2cINFUbLVFc4tkUbJNS0xu",1,0],[1,25.569,0,19.373],[3,-0.5000000000000002,-0.49999999999999983,-0.5000000000000001,0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,-89.99999999999999,0]],[23,"corner_38",false,5,[[4,1,-1075,[0,"e6a4I69v1Kj5zWwpUNy3C5"],[172],[25,256],173]],[1,"91HXuP1mBOpKEMpr8CENRh",1,0],[1,14.903,0,35.565],[3,-0.5000000000000002,-0.49999999999999983,-0.5000000000000001,0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,-89.99999999999999,0]],[3,"corner_39",5,[[4,1,-1076,[0,"150cmKhDdDTJLD4nObAqWf"],[174],[2,256,[2,0,0,1,1]],175]],[1,"0fWWdp5m5DnIhIAQ3kkJnn",1,0],[1,2.511,0,35.519],[3,-0.5000000000000002,-0.49999999999999983,-0.5000000000000001,0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,-89.99999999999999,0]],[3,"corner_40",5,[[4,1,-1077,[0,"5bVDHhyrJKgY3ZgqZ4Guyq"],[176],[2,256,[2,0,0,1,1]],177]],[1,"a2uCPkf+pB3oSQzQs2nS6/",1,0],[1,-15.609,0,-6.062],[3,-0.5000000000000001,0.49999999999999983,0.5000000000000001,0.4999999999999999],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,90,0]],[3,"corner_41",5,[[4,1,-1078,[0,"dfdDgHEKBPCp1hFXeVv7Oo"],[178],[2,256,[2,0,0,1,1]],179]],[1,"1e4TogxWlOxb/0kyz6DT6H",1,0],[1,-24.567,0,2.33],[3,-0.5000000000000001,0.49999999999999983,0.5000000000000001,0.4999999999999999],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,90,0]],[3,"corner_42",5,[[4,1,-1079,[0,"15MhpjRoREBKzEMOSqa0uE"],[180],[2,256,[2,0,0,1,1]],181]],[1,"f3eGm1ZLdIo4Zz6pBFclRY",1,0],[1,-36.876,0,9.506],[3,-0.5000000000000001,0.49999999999999983,0.5000000000000001,0.4999999999999999],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,90,0]],[3,"corner_43",5,[[4,1,-1080,[0,"63JiVnpBJOkKYSMPXBXnUy"],[182],[2,256,[2,0,0,1,1]],183]],[1,"23GWpHg8pPXoziRJOPuSoB",1,0],[1,-44.679,0,9.406],[3,-0.5000000000000001,0.49999999999999983,0.5000000000000001,0.4999999999999999],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,90,0]],[3,"corner_44",5,[[4,1,-1081,[0,"19mlg5aPZKzLibJPgjHAIR"],[184],[2,256,[2,0,0,1,1]],185]],[1,"81BADiahVCsrhjgtKR/mlc",1,0],[1,-44.688,0,21.539],[3,-0.5000000000000001,0.49999999999999983,0.5000000000000001,0.4999999999999999],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,90,0]],[3,"corner_45",5,[[4,1,-1082,[0,"7c8M1v+0xAvIgeJUb4XsxC"],[186],[2,256,[2,0,0,1,1]],187]],[1,"3c0s0+a7lGHZMaJowhHvuM",1,0],[1,-22.699,0,32.35],[3,-0.5000000000000001,0.49999999999999983,0.5000000000000001,0.4999999999999999],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,90,0]],[3,"corner_46",5,[[4,1,-1083,[0,"d2o7fAnu5L+adcFGeRNF6Y"],[188],[2,256,[2,0,0,1,1]],189]],[1,"030tw9smxBLZH1IDgNfTfj",1,0],[1,-11.846,0,32.267],[3,-0.5000000000000001,0.49999999999999983,0.5000000000000001,0.4999999999999999],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,90,0]],[3,"corner_47",5,[[4,1,-1084,[0,"ff8XELR6ZHtaxuPbxyX40c"],[190],[2,256,[2,0,0,1,1]],191]],[1,"b3lB+RYI5AIr71+zw/xHfJ",1,0],[1,-6.523,0,22.198],[3,-0.5000000000000001,0.49999999999999983,0.5000000000000001,0.4999999999999999],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,90,0]],[3,"corner_48",5,[[4,1,-1085,[0,"94pK39AptKroqW/z/3ivni"],[192],[2,256,[2,0,0,1,1]],193]],[1,"62fMKd7vxIJrBX2vUYbbzd",1,0],[1,21.072,0,29.145],[3,-0.5000000000000001,0.49999999999999983,0.5000000000000001,0.4999999999999999],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,90,0]],[3,"corner_49",5,[[4,1,-1086,[0,"5dGTgH5KJNubgCdCYqUVdC"],[194],[2,256,[2,0,0,1,1]],195]],[1,"adhyKNuA5Hs6mgsnyG1PXM",1,0],[1,24.939,0,15.164],[3,-0.5000000000000001,0.49999999999999983,0.5000000000000001,0.4999999999999999],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,90,0]],[3,"corner_50",5,[[4,1,-1087,[0,"82ThxBSrNPsrxR7UwMB+mG"],[196],[2,256,[2,0,0,1,1]],197]],[1,"6alF3SuxZF1bwyL/cZQr1V",1,0],[1,32.95,0,10.584],[3,-0.5000000000000001,0.49999999999999983,0.5000000000000001,0.4999999999999999],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,90,0]],[3,"corner_51",5,[[4,1,-1088,[0,"0fDZVgP+pJ6qeGbpPIqMmR"],[198],[2,256,[2,0,0,1,1]],199]],[1,"c5CKiVA21HIoAMOZxnHIMK",1,0],[1,15.794,0,-6.005],[3,-0.5000000000000001,0.49999999999999983,0.5000000000000001,0.4999999999999999],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,90,0]],[3,"corner_52",5,[[4,1,-1089,[0,"055sNPTOVJh7fI1HIwy+RN"],[200],[2,256,[2,0,0,1,1]],201]],[1,"9ehtcoMchFQ6pwwHJRqHZ1",1,0],[1,5.645,0,19.306],[3,-4.3297802811774677e-17,0.7071067811865474,0.7071067811865477,4.329780281177465e-17],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,180,0]],[3,"corner_53",5,[[4,1,-1090,[0,"4dE9KNg3lEkatqid0jV8PD"],[202],[2,256,[2,0,0,1,1]],203]],[1,"75IxyCW5BEsq39gPJut/2U",1,0],[1,15.964,0,9.972],[3,-0.5000000000000002,-0.49999999999999983,-0.5000000000000001,0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,-89.99999999999999,0]],[3,"corner_54",5,[[4,1,-1091,[0,"67NEh6E2FBA6DloQ+8kOUr"],[204],[2,256,[2,0,0,1,1]],205]],[1,"21/VHXJS5FsqvgVQdN0s6K",1,0],[1,-0.712,0,22.23],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"corner_55",5,[[4,1,-1092,[0,"1aNJ9tU15G94hThc9fLeGT"],[206],[2,256,[2,0,0,1,1]],207]],[1,"97eivI4w5BBqeB2EtfsCxc",1,0],[1,29.457,0,15.171],[3,-0.5000000000000002,-0.49999999999999983,-0.5000000000000001,0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,-89.99999999999999,0]],[3,"corner_56",5,[[4,1,-1093,[0,"f97FpvrwRAio+WfCuV+W70"],[208],[2,256,[2,0,0,1,1]],209]],[1,"53CZ+2cxhJsbKB1m4czdMr",1,0],[1,19.097,0,30.712],[3,-0.5000000000000001,0.49999999999999983,0.5000000000000001,0.4999999999999999],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,90,0]],[3,"corner_57",5,[[4,1,-1094,[0,"45aPtfJHBDQ5ZGQlPt3adn"],[210],[2,256,[2,0,0,1,1]],211]],[1,"8aYpevzl9LKoiVAcN4tZio",1,0],[1,20.471,0,5.882],[3,-0.5000000000000001,0.49999999999999983,0.5000000000000001,0.4999999999999999],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,90,0]],[3,"corner_58",5,[[4,1,-1095,[0,"51hboHaAZPL7DPjXB2tZ8r"],[212],[2,256,[2,0,0,1,1]],213]],[1,"d1yjTuokxGxLHAdPpkSZNG",1,0],[1,29.722,0,10.703],[3,-0.7071067811865476,0,0,0.7071067811865476],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"corner_59",5,[[4,1,-1096,[0,"b8XDK+O69NAK16EEDH8tRy"],[214],[2,256,[2,0,0,1,1]],215]],[1,"393/Jt+RpIhIYH5liYkQCD",1,0],[1,-0.584,0,14.949],[3,-0.7071067811865476,0,0,0.7071067811865476],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"corner_60",5,[[4,1,-1097,[0,"a1/fmrimRKOIw2dOgEhxcc"],[216],[2,256,[2,0,0,1,1]],217]],[1,"eehaTH+g1OP7h8jw0zv8yk",1,0],[1,-0.712,0,19.329],[3,-0.5000000000000001,-0.49999999999999983,-0.5000000000000001,0.4999999999999999],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,-90,0]],[3,"corner_02",6,[[4,1,-1098,[0,"9egnJA5TVK+aRU1j20xuN0"],[218],[2,256,[2,0,0,1,1]],219]],[1,"a8lRFJYn1Bepa73wPH9F2A",1,0],[1,33.803,0,-1.858],[3,-0.2705980500730985,-0.6532814824381883,-0.6532814824381882,0.27059805007309856],[1,22.823186874389652,22.823186874389656,22.823186874389652],[1,-90,-135,0]],[3,"corner_03",6,[[4,1,-1099,[0,"a7ANQRVQdGjrvKuiRudTb3"],[220],[2,256,[2,0,0,1,1]],221]],[1,"a9Xjv9d+ZPeKoX0qBY57YE",1,0],[1,-25.032,0,21.969],[3,-0.6532814824381884,-0.27059805007309845,-0.27059805007309856,0.6532814824381881],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,-45,0]],[3,"corner_04",6,[[4,1,-1100,[0,"b8QOqHlTdD0I71vg0+V5Zs"],[222],[2,256,[2,0,0,1,1]],223]],[1,"12LDhsWrBNdoY1LUXKXfIx",1,0],[1,-44.358,0,2.057],[3,-0.6532814824381884,-0.27059805007309845,-0.27059805007309856,0.6532814824381881],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,-45,0]],[3,"corner_05",6,[[4,1,-1101,[0,"0ayPJyXv9EbantzmkqDRzv"],[224],[2,256,[2,0,0,1,1]],225]],[1,"c6KTYo5xhMx5CC+D6q19lO",1,0],[1,-48.193,0,-2.075],[3,-0.6532814824381884,-0.27059805007309845,-0.27059805007309856,0.6532814824381881],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,-45,0]],[3,"corner_06",6,[[4,1,-1102,[0,"2dZUwakYNMJKiPIhVJAXh0"],[226],[2,256,[2,0,0,1,1]],227]],[1,"3cMwRIL3JO3JvRyhLZMml5",1,0],[1,-32.614,0,-13.722],[3,-0.6532814824381884,-0.27059805007309845,-0.27059805007309856,0.6532814824381881],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,-45,0]],[3,"corner_07",6,[[4,1,-1103,[0,"48FyiyUsVAY4PCly+rJMb2"],[228],[2,256,[2,0,0,1,1]],229]],[1,"e3f1qKK5JAnL67cvIHgyRw",1,0],[1,-28.879,0,32.806],[3,-0.2705980500730986,0.6532814824381881,0.6532814824381884,0.27059805007309845],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,135,0]],[3,"corner_08",6,[[4,1,-1104,[0,"7fblpQQBxNuZT1NnfnjKvE"],[230],[2,256,[2,0,0,1,1]],231]],[1,"8fEwHpKlBKRLN1J1ACTT5p",1,0],[1,-44.153,0,-1.864],[3,-0.2705980500730986,0.6532814824381881,0.6532814824381884,0.27059805007309845],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,135,0]],[3,"corner_09",6,[[4,1,-1105,[0,"f6bRTR4PxL7YXKxWSUgK9w"],[232],[2,256,[2,0,0,1,1]],233]],[1,"34J3AGbX9J+KYiNO/4pHsK",1,0],[1,-23.509,0.025,10.653],[3,-0.2705980500730986,0.6532814824381881,0.6532814824381884,0.27059805007309845],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,135,0]],[3,"corner_10",6,[[4,1,-1106,[0,"7440SJT39K3raT6sbOL7D8"],[234],[2,256,[2,0,0,1,1]],235]],[1,"78lABGinFGMaaA6x9GA5d/",1,0],[1,10.514,0,8.701],[3,-0.2705980500730986,0.6532814824381881,0.6532814824381884,0.27059805007309845],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,135,0]],[3,"corner_11",6,[[4,1,-1107,[0,"931yf5lHBBYY9Ljk8ugIZJ"],[236],[2,256,[2,0,0,1,1]],237]],[1,"3fSYme835O1p5VEd+gZ+EO",1,0],[1,9.394,0,41.642],[3,-0.2705980500730986,0.6532814824381881,0.6532814824381884,0.27059805007309845],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,135,0]],[3,"corner_12",6,[[4,1,-1108,[0,"85Ths7M4BBKo2e5j/haCpv"],[238],[2,256,[2,0,0,1,1]],239]],[1,"b7SPdvWDxGKoAzi5N0Pi0I",1,0],[1,37.18,0,17.2],[3,-0.2705980500730986,0.6532814824381881,0.6532814824381884,0.27059805007309845],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,135,0]],[3,"corner_13",6,[[4,1,-1109,[0,"60C+prrXFBqau6hV/k1sVL"],[240],[2,256,[2,0,0,1,1]],241]],[1,"556Cy/PgJAI6yF2ogg2aUm",1,0],[1,33.596,0,2.107],[3,-0.6532814824381884,-0.27059805007309845,-0.27059805007309856,0.6532814824381881],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,-45,0]],[3,"corner_14",6,[[4,1,-1110,[0,"c4U42hQl1GJ5np7m/KszWI"],[242],[2,256,[2,0,0,1,1]],243]],[1,"41vjvTIPNF2Z3nmJ8K1POs",1,0],[1,33.265,0,25.2],[3,-0.6532814824381884,-0.27059805007309845,-0.27059805007309856,0.6532814824381881],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,-45,0]],[3,"corner_15",6,[[4,1,-1111,[0,"bbB/Q3llVHY5qmwMMiSQlc"],[244],[2,256,[2,0,0,1,1]],245]],[1,"8c90bVrn9NN4HxXQ5ViO9n",1,0],[1,21.782,0,32.389],[3,-0.6532814824381884,-0.27059805007309845,-0.27059805007309856,0.6532814824381881],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,-45,0]],[3,"corner_16",6,[[4,1,-1112,[0,"94VvPy2ZVDM4H31bJm/Rt1"],[246],[2,256,[2,0,0,1,1]],247]],[1,"43JK5oLaRJvLt3t4MvvmwQ",1,0],[1,22.634,0,11.034],[3,-0.6532814824381884,-0.27059805007309845,-0.27059805007309856,0.6532814824381881],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,-45,0]],[3,"corner_18",6,[[4,1,-1113,[0,"73UPGMD0VBH6PbNZfO6oFQ"],[248],[2,256,[2,0,0,1,1]],249]],[1,"4e/yeO4PpDQpyhvz+ECmES",1,0],[1,-7.472,0,13.31],[3,-0.6532814824381884,-0.27059805007309845,-0.27059805007309856,0.6532814824381881],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,-45,0]],[3,"corner_19",6,[[4,1,-1114,[0,"6aL//GKlVNcYeqm52JpVHi"],[250],[2,256,[2,0,0,1,1]],251]],[1,"49/wt/nXRMWY4E52CI7nqM",1,0],[1,-32.833,0,18.028],[3,-0.6532814824381884,-0.27059805007309845,-0.27059805007309856,0.6532814824381881],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,-45,0]],[3,"corner_20",6,[[4,1,-1115,[0,"f88SwN/zhIHo55CxENGWd3"],[252],[2,256,[2,0,0,1,1]],253]],[1,"fboiSVysFBuJj8kWJmr80s",1,0],[1,-8.249,0,10.79],[3,-0.2705980500730986,-0.6532814824381881,-0.6532814824381884,0.27059805007309845],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,-135,0]],[3,"corner_21",6,[[4,1,-1116,[0,"fbZLv5MtNMEbEf1nfdwWT+"],[254],[2,256,[2,0,0,1,1]],255]],[1,"5dmsH3dzlOZ6FPT2brQdFz",1,0],[1,-32.875,0,29.878],[3,-0.2705980500730986,-0.6532814824381881,-0.6532814824381884,0.27059805007309845],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,-135,0]],[3,"corner_22",6,[[4,1,-1117,[0,"55eGRJlKRFApkzLEMOOSYl"],[256],[2,256,[2,0,0,1,1]],257]],[1,"94QIvzLDZJYaATN73UOEzr",1,0],[1,-44.305,0,14.299],[3,-0.2705980500730986,-0.6532814824381881,-0.6532814824381884,0.27059805007309845],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,-135,0]],[3,"corner_23",6,[[4,1,-1118,[0,"15hkzEe0lF+Y0YKeXPcOqY"],[258],[2,256,[2,0,0,1,1]],259]],[1,"82PHgRHUNFmIOPVIRc6QfU",1,0],[1,-48.061,0,18.016],[3,-0.2705980500730986,-0.6532814824381881,-0.6532814824381884,0.27059805007309845],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,-135,0]],[3,"corner_24",6,[[4,1,-1119,[0,"14fpiKbiJBBIfgx9jLqR5I"],[260],[2,256,[2,0,0,1,1]],261]],[1,"23p4gMT4FN3YvvaKUQX7+d",1,0],[1,-32.613,0,-1.757],[3,-0.2705980500730986,-0.6532814824381881,-0.6532814824381884,0.27059805007309845],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,-135,0]],[3,"corner_25",6,[[4,1,-1120,[0,"9cajYRhFBEkp9FtCTpc8Hs"],[262],[2,256,[2,0,0,1,1]],263]],[1,"96IX/u76NA7L5MPPUC3Int",1,0],[1,6.562,0,38.078],[3,-0.2705980500730986,-0.6532814824381881,-0.6532814824381884,0.27059805007309845],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,-135,0]],[3,"corner_26",6,[[4,1,-1121,[0,"6bCNiVqbxPrZUoZHi+AQqL"],[264],[2,256,[2,0,0,1,1]],265]],[1,"3dQCbeKfVEn4a0ox5WnxLe",1,0],[1,33.387,0,15.102],[3,-0.2705980500730986,-0.6532814824381881,-0.6532814824381884,0.27059805007309845],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,-135,0]],[3,"corner_27",6,[[4,1,-1122,[0,"17RH7VLJtADLKuDpyU5d5l"],[266],[2,256,[2,0,0,1,1]],267]],[1,"f4noo4aAVMq7KDyD+VUD/A",1,0],[1,19.941,0,8.854],[3,-0.2705980500730986,-0.6532814824381881,-0.6532814824381884,0.27059805007309845],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,-135,0]],[3,"corner_28",6,[[4,1,-1123,[0,"76DK9OpOlLmr51pH46Dvkr"],[268],[2,256,[2,0,0,1,1]],269]],[1,"02/1UXmDtEsqwEitlNe5qu",1,0],[1,10.525,0,5.787],[3,-0.6532814824381884,0.27059805007309845,0.27059805007309856,0.6532814824381881],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,45,0]],[3,"corner_29",6,[[4,1,-1124,[0,"20pEVSctpN5KG7zPN/XDIO"],[270],[2,256,[2,0,0,1,1]],271]],[1,"95AzvTmmtGApio0Dc1qHVc",1,0],[1,20.163,0,-15.92],[3,-0.6532814824381884,0.27059805007309845,0.27059805007309856,0.6532814824381881],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,45,0]],[3,"corner_30",6,[[4,1,-1125,[0,"b0oubK1V9GfL55lSh8Zojx"],[272],[2,256,[2,0,0,1,1]],273]],[1,"d9XQYb7bVMlrz+graHA6Uv",1,0],[1,37.237,0,0.917],[3,-0.6532814824381884,0.27059805007309845,0.27059805007309856,0.6532814824381881],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,45,0]],[3,"corner_31",6,[[4,1,-1126,[0,"faHWRp1vJBNpoP+DbhZpEw"],[274],[2,256,[2,0,0,1,1]],275]],[1,"daLErsnwpCiI5trAGeWI71",1,0],[1,25.427,0,11.337],[3,-0.6532814824381884,0.27059805007309845,0.27059805007309856,0.6532814824381881],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,45,0]],[3,"corner_32",6,[[4,1,-1127,[0,"9102d3m9xKsodYKmI2sxgN"],[276],[2,256,[2,0,0,1,1]],277]],[1,"f0SOpwbp5Pv6ywiWLRouLq",1,0],[1,9.292,-0.05,32.293],[3,-0.6532814824381884,0.27059805007309845,0.27059805007309856,0.6532814824381881],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,45,0]],[3,"corner_33",6,[[4,1,-1128,[0,"5efGyxX6hGAqlBnBXC0xvQ"],[278],[2,256,[2,0,0,1,1]],279]],[1,"53QZPXSWJIW7qMMy9jDOMh",1,0],[1,-18.342,0,13.293],[3,-0.6532814824381884,0.27059805007309845,0.27059805007309856,0.6532814824381881],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,45,0]],[3,"corner_35",6,[[4,1,-1129,[0,"1290ZYfU9BX6klcQeNa4p+"],[280],[2,256,[2,0,0,1,1]],281]],[1,"db2mCTUztGs6soBGH1H5Ho",1,0],[1,-23.644,0,-1.422],[3,-0.6532814824381884,0.27059805007309845,0.27059805007309856,0.6532814824381881],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,45,0]],[3,"corner_37",6,[[4,1,-1130,[0,"a2mFv7zK1HMIMGY4Ca9WHQ"],[282],[2,256,[2,0,0,1,1]],283]],[1,"80tCdVWzhJrrnnRVnMO4Rc",1,0],[1,-25.199,0,14.36],[3,-0.2705980500730986,-0.6532814824381881,-0.6532814824381884,0.27059805007309845],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,-135,0]],[3,"corner_38",6,[[4,1,-1131,[0,"4557gOXr5Cz4qQ/jctmSWt"],[284],[2,256,[2,0,0,1,1]],285]],[1,"635vFLnBlPnKut4LFAJpv8",1,0],[1,-32.636,0,14.298],[3,-0.2705980500730986,0.6532814824381881,0.6532814824381884,0.27059805007309845],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,135,0]],[3,"corner_39",6,[[4,1,-1132,[0,"82Pt5ZAq5Lzqhy+J4n5UEt"],[286],[2,256,[2,0,0,1,1]],287]],[1,"87PzCMoYJP0JXTeLijMRxM",1,0],[1,-44.21,0,17.791],[3,-0.6532814824381884,0.27059805007309845,0.27059805007309856,0.6532814824381881],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,45,0]],[3,"corner_17",6,[[4,1,-1133,[0,"76ArNR4f9Ffb5yZRXEj8Uw"],[288],[2,256,[2,0,0,1,1]],289]],[1,"55Ux5xwRZGaZx1eng3NXy6",1,0],[1,10.024,0,21.222],[3,-0.2705980500730986,0.6532814824381881,0.6532814824381884,0.27059805007309845],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,135,0]],[3,"door_L_03",13,[[5,-1134,[0,"393g8asOdGu7uFNURltnHb"],[290],[12],291]],[1,"95alcij/9JLLkXbCMzUUl7",1,0],[1,-50.759,0,25.555],[3,-0.5000000447034803,-0.49999995529651575,-0.4999999552965157,0.5000000447034803],[1,0.8045459985733032,1,1],[1,-90,-89.99998975471655,0]],[3,"door_L_04",13,[[5,-1135,[0,"c8Qe8LC4VGRbube7BwIz0j"],[292],[12],293]],[1,"62/SVP2kdKKKYdNxa51GXY",1,0],[1,-30.572,0,6.113],[3,-0.5000000447034803,-0.49999995529651575,-0.4999999552965157,0.5000000447034803],[1,0.8045459985733032,1,1],[1,-90,-89.99998975471655,0]],[3,"door_L_05",13,[[5,-1136,[0,"18881uaHpO7pmj8qovJuFk"],[294],[12],295]],[1,"f1dbCKBA9BJo+WoBmb9vdd",1,0],[1,14.998,0,32.913],[3,-0.5000000447034803,-0.49999995529651575,-0.4999999552965157,0.5000000447034803],[1,0.8045459985733032,1,1],[1,-90,-89.99998975471655,0]],[3,"door_L_06",13,[[5,-1137,[0,"e5F0pzec9By45KgmlHRgez"],[296],[12],297]],[1,"86LiX/XWFBuJ4s0n+liTKX",1,0],[1,14.821,0,7.877],[3,-0.5000000447034803,-0.49999995529651575,-0.4999999552965157,0.5000000447034803],[1,0.8045459985733032,1,1],[1,-90,-89.99998975471655,0]],[3,"door_L_07",13,[[5,-1138,[0,"dbbQcZ9BhJLLftg0M2iRA7"],[298],[12],299]],[1,"2e1hd5bxpHMIEvIbAM5AMJ",1,0],[1,4.72,0,40.451],[3,-0.5000000447034803,-0.49999995529651575,-0.4999999552965157,0.5000000447034803],[1,0.8045459985733032,1,1],[1,-90,-89.99998975471655,0]],[3,"door_L_08",13,[[5,-1139,[0,"30M1JW4SFFs4Q7pW9EJli1"],[300],[12],301]],[1,"d3uBV9z5REmpo4WbOAyxlo",1,0],[1,3.337,0,-1.777],[3,-4.329780281177466e-17,-0.7071067811865476,-0.7071067811865475,4.329780281177467e-17],[1,0.8045459985733032,1,1],[1,-90,-180,0]],[3,"door_L_09",13,[[5,-1140,[0,"b0LEyDphdHU5i4ING1jqQL"],[302],[12],303]],[1,"91yEJ6Pg5Ij6pLrvJbX7dF",1,0],[1,-0.784,0,19.202],[3,-4.329780281177466e-17,-0.7071067811865476,-0.7071067811865475,4.329780281177467e-17],[1,0.8045459985733032,1,1],[1,-90,-180,0]],[3,"door_L_10",13,[[5,-1141,[0,"87l7IGVOlK0YAuZ7zLSMuv"],[304],[12],305]],[1,"26s+1T+oRMzKfZzvL9oK3A",1,0],[1,-22.094,0,-1.827],[3,-4.329780281177466e-17,-0.7071067811865476,-0.7071067811865475,4.329780281177467e-17],[1,0.8045459985733032,1,1],[1,-90,-180,0]],[3,"door_L_11",13,[[5,-1142,[0,"670OeBS/BN6ZFTaKgBr8Pj"],[306],[12],307]],[1,"81+cUKEkFC6aHFzNyiFyvi",1,0],[1,-41.283,0,-1.827],[3,-4.329780281177466e-17,-0.7071067811865476,-0.7071067811865475,4.329780281177467e-17],[1,0.8045459985733032,1,1],[1,-90,-180,0]],[3,"door_L_12",13,[[5,-1143,[0,"e10VXHjyZFmoNASDDRh+7O"],[308],[12],309]],[1,"44JKl7JJ1CL5VGVTREeVsq",1,0],[1,-41.496,0,30.154],[3,-4.329780281177466e-17,-0.7071067811865476,-0.7071067811865475,4.329780281177467e-17],[1,0.8045459985733032,1,1],[1,-90,-180,0]],[3,"door_L_13",13,[[5,-1144,[0,"3d2zUfaKlEqbc7sSucjTIX"],[310],[12],311]],[1,"98m/llO1NETrBoAY9jiGQf",1,0],[1,-41.496,0,30.154],[3,-4.329780281177466e-17,-0.7071067811865476,-0.7071067811865475,4.329780281177467e-17],[1,0.8045459985733032,1,1],[1,-90,-180,0]],[3,"door_L_14",13,[[5,-1145,[0,"94u3ht2uBCZod4f5Uheglr"],[312],[12],313]],[1,"30tJ23y3xDeKUu+D29NG8i",1,0],[1,-18.352,0,36.764],[3,-4.329780281177466e-17,-0.7071067811865476,-0.7071067811865475,4.329780281177467e-17],[1,0.8045459985733032,1,1],[1,-90,-180,0]],[3,"door_L_15",13,[[5,-1146,[0,"1cAnuVPKBFmYKVhDYuA5hj"],[314],[12],315]],[1,"00AUVmZpNK8IDjMP7vIVSu",1,0],[1,-2.182,0,35.055],[3,-4.329780281177466e-17,-0.7071067811865476,-0.7071067811865475,4.329780281177467e-17],[1,0.8045459985733032,1,1],[1,-90,-180,0]],[3,"door_L_16",13,[[5,-1147,[0,"a7+SvWjwlB0LqMKfc7D5S7"],[316],[12],317]],[1,"79GDX4VWhIXpMx6eIEV/OU",1,0],[1,12.607,0,35.055],[3,-4.329780281177466e-17,-0.7071067811865476,-0.7071067811865475,4.329780281177467e-17],[1,0.8045459985733032,1,1],[1,-90,-180,0]],[3,"door_L_17",13,[[5,-1148,[0,"a141jLGnpITZtAhFWfu2NN"],[318],[12],319]],[1,"16B0iD/OtB/K4PQTbo5Hta",1,0],[1,26.457,0,14.854],[3,-4.329780281177466e-17,-0.7071067811865476,-0.7071067811865475,4.329780281177467e-17],[1,0.8045459985733032,1,1],[1,-90,-180,0]],[3,"door_L_18",13,[[5,-1149,[0,"2f5pF4jqBCnK9EsNGhoMoa"],[320],[12],321]],[1,"ea8fD9TzRFb4ShZpvdAHfh",1,0],[1,9.343,0,-1.777],[3,-4.329780281177466e-17,-0.7071067811865476,-0.7071067811865475,4.329780281177467e-17],[1,0.8045459985733032,1,1],[1,-90,-180,0]],[3,"door_R_03",14,[[5,-1150,[0,"65GCflOIlOJZXBPORUIl3W"],[322],[12],323]],[1,"3bJ/z9sp1GX5IdC28FUY+5",1,0],[1,-34.16,0,27.651],[3,-0.5000000447034803,-0.49999995529651575,-0.4999999552965157,0.5000000447034803],[1,0.8045459985733032,1,1],[1,-90,-89.99998975471655,0]],[3,"door_R_04",14,[[5,-1151,[0,"94/bBN62xFWoDTsTNPbkDV"],[324],[12],325]],[1,"93+K0lDCNO7r2fXLXLk31J",1,0],[1,-13.973,0,8.138],[3,-0.5000000447034803,-0.49999995529651575,-0.4999999552965157,0.5000000447034803],[1,0.8045459985733032,1,1],[1,-90,-89.99998975471655,0]],[3,"door_R_05",14,[[5,-1152,[0,"72d5E4UPFOtLTt+YX6I4vx"],[326],[12],327]],[1,"9b04txG3VIkKPiXRzEwJHl",1,0],[1,31.597,0,34.894],[3,-0.5000000447034803,-0.49999995529651575,-0.4999999552965157,0.5000000447034803],[1,0.8045459985733032,1,1],[1,-90,-89.99998975471655,0]],[3,"door_R_06",14,[[5,-1153,[0,"75N1OsMEVPTKVA+UdySju1"],[328],[12],329]],[1,"27z9pHajhMYrIVNlmdeR4D",1,0],[1,31.42,0,9.858],[3,-0.5000000447034803,-0.49999995529651575,-0.4999999552965157,0.5000000447034803],[1,0.8045459985733032,1,1],[1,-90,-89.99998975471655,0]],[3,"door_R_07",14,[[5,-1154,[0,"ceid7haZRA14G64USeD8lO"],[330],[12],331]],[1,"03LDr8m2lEuLtqrixS99Ia",1,0],[1,21.319,0,42.432],[3,-0.5000000447034803,-0.49999995529651575,-0.4999999552965157,0.5000000447034803],[1,0.8045459985733032,1,1],[1,-90,-89.99998975471655,0]],[3,"door_R_08",14,[[5,-1155,[0,"63waI+FUxNqqf3V7+wVvZA"],[332],[12],333]],[1,"8dNoy6n7lCq5nwwgPJGPWk",1,0],[1,14.515,0,5.725],[3,-4.329780281177466e-17,-0.7071067811865476,-0.7071067811865475,4.329780281177467e-17],[1,0.8045459985733032,1,1],[1,-90,-180,0]],[3,"door_R_09",14,[[5,-1156,[0,"5bDI8kj4VMDKHxjKZXwZKT"],[334],[12],335]],[1,"be5aP/TcJIcJas3R25XtKi",1,0],[1,10.394,0,26.685],[3,-4.329780281177466e-17,-0.7071067811865476,-0.7071067811865475,4.329780281177467e-17],[1,0.8045459985733032,1,1],[1,-90,-180,0]],[3,"door_R_10",14,[[5,-1157,[0,"f1IaOmT0ZBzLEiQhgvEHxg"],[336],[12],337]],[1,"6b8YB9r3RJBpR3Zi6ZHpT3",1,0],[1,-10.916,0,5.948],[3,-4.329780281177466e-17,-0.7071067811865476,-0.7071067811865475,4.329780281177467e-17],[1,0.8045459985733032,1,1],[1,-90,-180,0]],[3,"door_R_11",14,[[5,-1158,[0,"f5iWAz2VNHSKBCdILeRqSB"],[338],[12],339]],[1,"6cZEWelnFAt7ypDOqQE6fC",1,0],[1,-30.105,0,5.948],[3,-4.329780281177466e-17,-0.7071067811865476,-0.7071067811865475,4.329780281177467e-17],[1,0.8045459985733032,1,1],[1,-90,-180,0]],[3,"door_R_12",14,[[5,-1159,[0,"5bT/DNozxJ2atJTMSVpX99"],[340],[12],341]],[1,"6el8C6xf9FYJ81mPNaN/JR",1,0],[1,-30.318,0,37.929],[3,-4.329780281177466e-17,-0.7071067811865476,-0.7071067811865475,4.329780281177467e-17],[1,0.8045459985733032,1,1],[1,-90,-180,0]],[3,"door_R_13",14,[[5,-1160,[0,"0doM6LNRZMa5kRYGEX2W8s"],[342],[12],343]],[1,"659jguBTNDCp+qaoshwt4Y",1,0],[1,-30.318,0,37.929],[3,-4.329780281177466e-17,-0.7071067811865476,-0.7071067811865475,4.329780281177467e-17],[1,0.8045459985733032,1,1],[1,-90,-180,0]],[3,"door_R_14",14,[[5,-1161,[0,"7cRqJVVF9CTpl0HbX3ikps"],[344],[12],345]],[1,"c5tUT+iIhKmZIJ9jEwntES",1,0],[1,-7.174,0,44.539],[3,-4.329780281177466e-17,-0.7071067811865476,-0.7071067811865475,4.329780281177467e-17],[1,0.8045459985733032,1,1],[1,-90,-180,0]],[3,"door_R_15",14,[[5,-1162,[0,"1cmt46EEFI0rgN3eDyh3l6"],[346],[12],347]],[1,"cbdNH8nOFJBohWFNyqo9RQ",1,0],[1,8.996,0,42.83],[3,-4.329780281177466e-17,-0.7071067811865476,-0.7071067811865475,4.329780281177467e-17],[1,0.8045459985733032,1,1],[1,-90,-180,0]],[3,"door_R_16",14,[[5,-1163,[0,"4b7o1lzNhETLH2dUmgpzGF"],[348],[12],349]],[1,"e2VVLXAxJL5K2v0UzdlEMh",1,0],[1,23.785,0,42.83],[3,-4.329780281177466e-17,-0.7071067811865476,-0.7071067811865475,4.329780281177467e-17],[1,0.8045459985733032,1,1],[1,-90,-180,0]],[3,"door_R_17",14,[[5,-1164,[0,"7aSLI6lpxGAr/jCrIEeAYh"],[350],[12],351]],[1,"31fr2MVNxKeKH63mK7rUon",1,0],[1,37.635,0,22.629],[3,-4.329780281177466e-17,-0.7071067811865476,-0.7071067811865475,4.329780281177467e-17],[1,0.8045459985733032,1,1],[1,-90,-180,0]],[3,"door_R_18",14,[[5,-1165,[0,"14jDfOta9FWoz1P4Yk8kIm"],[352],[12],353]],[1,"a3WKGgooBByL6IEfF7W3Sp",1,0],[1,20.521,0,5.725],[3,-4.329780281177466e-17,-0.7071067811865476,-0.7071067811865475,4.329780281177467e-17],[1,0.8045459985733032,1,1],[1,-90,-180,0]],[3,"partition_01",15,[[4,1,-1166,[0,"73XAWLYkxBa6etJlePdG7L"],[354],[2,256,[2,0,0,1,1]],355]],[1,"dcfilBCAZF9INbeczkWTLb",1,0],[1,18.683,0,6.063],[3,0.2876062384759508,0.645974188021251,0.6459741880212511,-0.2876062384759508],[1,22.823186874389645,22.82318687438965,22.823186874389652],[1,-90.00000000000003,-131.99999999999997,-3.1805546814635168e-15]],[3,"partition_01",15,[[4,1,-1167,[0,"29VP8xRixH2pi5he1ZfG/8"],[356],[2,256,[2,0,0,1,1]],357]],[1,"d23IDQ/otLP54OCMU6bEW8",1,0],[1,35.407398747734604,0,-10.527254517895148],[3,-0.7040893834851061,-0.06525442562434633,-0.06525442562434633,0.704089383485106],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,-10.590000000000002,7.951386703658792e-16]],[3,"partition_01",15,[[4,1,-1168,[0,"c4juyodaFC3JQQjHaJnjn8"],[358],[2,256,[2,0,0,1,1]],359]],[1,"f52QtQGm9GKY7cdo1S84QJ",1,0],[1,40.669,0,-5.675],[3,-0.5101223154387166,-0.4896684830489324,-0.4896684830489324,0.5101223154387166],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000001,-87.656,0]],[23,"partition_02",false,15,[[4,1,-1169,[0,"562hjJLaJFiq9hUq9WoLut"],[360],[25,256],361]],[1,"48fshGuPFLarXXw4oBWOtk",1,0],[1,13.728,0,-11.16],[3,-0.7071067811865476,0,0,0.7071067811865476],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"partition_03",15,[[4,1,-1170,[0,"52PnZQlWFLFLUuZ0xwimN5"],[362],[2,256,[2,0,0,1,1]],363]],[1,"2djCOy+gtA9pG6d2lbw5ux",1,0],[1,14.479,0,-15.111],[3,-0.7071067811865476,0,0,0.7071067811865476],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"partition_04",15,[[4,1,-1171,[0,"1dl/3w7kpIbY49Dsz42Jar"],[364],[2,256,[2,0,0,1,1]],365]],[1,"3b68/Jx4xAJJgRJmHNoG7I",1,0],[1,18.85,0,-10.775],[3,-0.6008543032365045,-0.3727923098484928,-0.37279230984849276,0.6008543032365046],[1,22.823186874389645,22.82318687438965,22.823186874389652],[1,-90,-63.634,0]],[3,"partition_05",15,[[4,1,-1172,[0,"bbx/h9e2ZJJIEAMBoy8G+G"],[366],[2,256,[2,0,0,1,1]],367]],[1,"70/0mORvRPXrb+EMZe80xD",1,0],[1,-0.205,-0.037,-15.166],[3,-0.7071067811865476,0,0,0.7071067811865476],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90.00000000000003,0,0]],[3,"partition_06",15,[[4,1,-1173,[0,"41hU4ETdtMGaMbnJwZevmt"],[368],[2,256,[2,0,0,1,1]],369]],[1,"a8Px2gbbdBfLU8s+6U+dQx",1,0],[1,-4.598,0.059,-10.713],[3,-0.6419266669677433,0.2965301911031726,0.2965301911031725,0.6419266669677434],[1,22.823186874389645,22.82318687438965,22.823186874389652],[1,-90,49.588,0]],[3,"partition_07",15,[[4,1,-1174,[0,"63/hUM3exKNriR0En0Pm/z"],[370],[2,256,[2,0,0,1,1]],371]],[1,"717r42WXVGlJQJw2zEQl/z",1,0],[1,35.94,0,41.221],[3,0.014463043584069309,0.7069588533785296,0.7069588533785296,-0.014463043584069314],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90,-177.656,-3.975693351829396e-16]],[3,"partition_08",15,[[4,1,-1175,[0,"e8cYj30AdHCrZvKohDk3kY"],[372],[2,256,[2,0,0,1,1]],373]],[1,"c8E5+6mwBB/asdICfnU0bu",1,0],[1,40.05,0,36.85],[3,0.2876062384759508,0.645974188021251,0.6459741880212511,-0.2876062384759508],[1,22.823186874389645,22.82318687438965,22.823186874389652],[1,-90.00000000000003,-131.99999999999997,-3.1805546814635168e-15]],[3,"partition_09",15,[[4,1,-1176,[0,"d726sXzaZDkrmI1pQJZL4P"],[374],[2,256,[2,0,0,1,1]],375]],[1,"f6o3W6D3lBM6kBgmHqPPwd",1,0],[1,-4.443,0,6.197],[3,-0.28788807050051984,0.6458486346377824,0.6458486346377823,0.2878880705005199],[1,22.823186874389645,22.82318687438965,22.823186874389652],[1,-90,131.95,0]],[3,"partition_10",15,[[4,1,-1177,[0,"19RgJrViFFjIVXC9B2uGhs"],[376],[2,256,[2,0,0,1,1]],377]],[1,"90HpVanr9PyqUyxB2v+98J",1,0],[1,22.446,0.059,7.689],[3,-0.6701124312105498,0.22571958164298933,0.2257195816429893,0.6701124312105499],[1,22.823186874389645,22.82318687438965,22.823186874389652],[1,-90,37.231,0]],[3,"partition_13",15,[[4,1,-1178,[0,"5fSpk0Ck5MHKgqE3ipwCL/"],[378],[2,256,[2,0,0,1,1]],379]],[1,"24F9fEFptHNoUga3QbS4pI",1,0],[1,-5.024,0,26.565],[3,0.2876062384759508,0.645974188021251,0.6459741880212511,-0.2876062384759508],[1,22.823186874389645,22.82318687438965,22.823186874389652],[1,-90.00000000000003,-131.99999999999997,-3.1805546814635168e-15]],[3,"partition_11",15,[[4,1,-1179,[0,"c5DLM1tYtDH6Cllol+88Zw"],[380],[2,256,[2,0,0,1,1]],381]],[1,"06aLzZxkhJW7Qx3NkFgJII",1,0],[1,19.308,0.059,16.664],[3,-0.7071067811865475,0,0,0.7071067811865476],[1,22.823186874389645,22.82318687438965,22.823186874389652],[1,-90,0,0]],[3,"partition_12",15,[[4,1,-1180,[0,"efWBNVD1FMtJx7Hf4BeLN6"],[382],[2,256,[2,0,0,1,1]],383]],[1,"4fbaYeQcJHqZHy66E4DahT",1,0],[1,21.773,0.059,16.664],[3,-0.7071067811865475,0,0,0.7071067811865476],[1,22.823186874389645,22.82318687438965,22.823186874389652],[1,-90,0,0]],[3,"partition_14",15,[[4,1,-1181,[0,"b3AMJBLEBCErrq8QhlvMLC"],[384],[2,256,[2,0,0,1,1]],385]],[1,"c4OEzZ/JBHtrzz8Lbx4x82",1,0],[1,24.427,0.059,16.664],[3,-0.7071067811865475,0,0,0.7071067811865476],[1,22.823186874389645,22.82318687438965,22.823186874389652],[1,-90,0,0]],[3,"partition_03",7,[[4,1,-1182,[0,"aeLy79YTlHfoQI2WghbOr4"],[386],[2,256,[2,0,0,1,1]],387]],[1,"2beLpQC+ZBzpVDQKrdkg+m",1,0],[1,-3.796,0,19.27],[3,-0.39376027396862645,-0.5873268652497962,-0.587326865249796,0.3937602739686265],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,-112.322,0]],[3,"partition_04",7,[[4,1,-1183,[0,"28Bypi0z5IKqzQmonic9Fy"],[388],[2,256,[2,0,0,1,1]],389]],[1,"e8lTXrsohEMLbf1rF/IK+a",1,0],[1,25.55,0,41.006],[3,-0.39376027396862645,-0.5873268652497962,-0.587326865249796,0.3937602739686265],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,-112.322,0]],[3,"partition_05",7,[[4,1,-1184,[0,"30+aiyhYxKirQdFT0RFu8/"],[390],[2,256,[2,0,0,1,1]],391]],[1,"19lBl0OqdJEJwGSwfaN/7/",1,0],[1,21.922,0,44.557],[3,-0.10462688768568144,-0.6993233975588175,-0.6993233975588173,0.10462688768568146],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,-162.982,0]],[3,"partition_06",7,[[4,1,-1185,[0,"24hfPeWfBDZJXsrYO+OOZ5"],[392],[2,256,[2,0,0,1,1]],393]],[1,"b2LG5zdHdHwY/hMW2D9/cE",1,0],[1,-0.296,0,40.751],[3,0.11369870058560835,-0.697905871507859,-0.6979058715078589,-0.11369870058560837],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,-198.506,0]],[3,"partition_07",7,[[4,1,-1186,[0,"a42rKIPL5KhIkN8Silz9mG"],[394],[2,256,[2,0,0,1,1]],395]],[1,"9bNzEZQAtDALUBH8ihXV6X",1,0],[1,-3.753,0,38.568],[3,0.36136379058759555,-0.6077961918704036,-0.6077961918704035,-0.3613637905875956],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,-241.467,0]],[3,"partition_08",7,[[4,1,-1187,[0,"b317qfcqxKVpgUvM89MB9Q"],[396],[2,256,[2,0,0,1,1]],397]],[1,"60ukOTlw9OzrnCW2Rcm193",1,0],[1,-3.58,0,24.055],[3,0.6105533173116221,-0.3566856413142722,-0.35668564131427216,-0.6105533173116221],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,-299.413,0]],[3,"partition_09",7,[[4,1,-1188,[0,"80ot7HnNBNcrMi3HNWSNJg"],[398],[2,256,[2,0,0,1,1]],399]],[1,"75h/Bbi59GSJdwKOhENCVs",1,0],[1,-1.146,0,21.113],[3,0.6880859775090891,-0.1629039212399789,-0.1629039212399789,-0.6880859775090892],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,-333.361,0]],[3,"partition_10",7,[[4,1,-1189,[0,"8b+o7M20pFJ7z9NkL0LH/G"],[400],[2,256,[2,0,0,1,1]],401]],[1,"51rUeQqyZBibX0DPSKiCRH",1,0],[1,9.311,0,21.026],[3,0.6695787323532434,0.22729786884223863,0.2272978688422386,-0.6695787323532435],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,-397.501,0]],[3,"partition_11",7,[[4,1,-1190,[0,"58a5EIk05KN6GEUSFenQV0"],[402],[2,256,[2,0,0,1,1]],403]],[1,"b4ekb+jHpHj6aKz/WhHfZ8",1,0],[1,10.285,0,23.039],[3,0.557173554406396,0.43538216576950284,0.4353821657695028,-0.5571735544063962],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,-436.009,0]],[3,"partition_12",7,[[4,1,-1191,[0,"7ac9i8PIxEy7ZGge+PWgyL"],[404],[2,256,[2,0,0,1,1]],405]],[1,"77wmUEzllLwpbrvPXgBRu4",1,0],[1,-21.423,0,5.252],[3,0.557173554406396,0.43538216576950284,0.4353821657695028,-0.5571735544063962],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,-436.009,0]],[3,"partition_13",7,[[4,1,-1192,[0,"97GZ/zyLpAx79DQvUowc7X"],[406],[2,256,[2,0,0,1,1]],407]],[1,"1deplONnxMv5W9ScQ74K4D",1,0],[1,-23.441,0,2.558],[3,0.7010105796713405,0.0926507808323873,0.09265078083238729,-0.7010105796713406],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,-375.058,0]],[3,"partition_14",7,[[4,1,-1193,[0,"63v0XKs1tE7YY3gVZ3FvTS"],[408],[2,256,[2,0,0,1,1]],409]],[1,"0ahfbMn8VCBYIJN4FCQXk2",1,0],[1,-26.577,0,2.582],[3,0.7000993147517441,-0.09930231358905134,-0.09930231358905132,-0.7000993147517443],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,-343.854,0]],[3,"partition_15",7,[[4,1,-1194,[0,"02Qirso+NOPaTzhJpwUSC+"],[410],[2,256,[2,0,0,1,1]],411]],[1,"adds+s/aJGNYcXajtbwqM/",1,0],[1,-28.839,0,5.067],[3,0.6374170126844126,-0.3061038254260788,-0.3061038254260787,-0.6374170126844126],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,-308.697,0]],[3,"partition_16",7,[[4,1,-1195,[0,"72wFb33upO/5wQRNg0QLkc"],[412],[2,256,[2,0,0,1,1]],413]],[1,"0arTF/rGpH4q7+a87+nAoe",1,0],[1,-47.836,0,0.611],[3,0.6943636629342667,-0.13363795716976493,-0.13363795716976493,-0.6943636629342668],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,-338.212,0]],[3,"partition_17",7,[[4,1,-1196,[0,"97nRE7Jw9DH78eQnz+Pi0g"],[414],[2,256,[2,0,0,1,1]],415]],[1,"a6betxCDVMea+Ljz2A437e",1,0],[1,-52.329,0,5.136],[3,0.6183417977406674,-0.343006444789073,-0.34300644478907294,-0.6183417977406676],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,-301.964,0]],[3,"partition_18",7,[[4,1,-1197,[0,"26Cs328s5Mio4YQEnOPbAI"],[416],[2,256,[2,0,0,1,1]],417]],[1,"18acX3PAlLb484R+M/k26U",1,0],[1,-52.331,0,16.304],[3,0.40793192595418015,-0.5775738427139108,-0.5775738427139107,-0.4079319259541802],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,-250.466,0]],[3,"partition_19",7,[[4,1,-1198,[0,"11QdId3XZAnrWtTRr53BBz"],[418],[2,256,[2,0,0,1,1]],419]],[1,"4cI+jwmJJD2Y1KDVCM8+vf",1,0],[1,-47.991,0,20.669],[3,0.22958705971783047,-0.6687972652531717,-0.6687972652531716,-0.2295870597178305],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,-217.893,0]],[3,"partition_20",7,[[4,1,-1199,[0,"66yoxkAJNHMLMIY9yImPvR"],[420],[2,256,[2,0,0,1,1]],421]],[1,"02+H6PGSVIN7G41swfMrKb",1,0],[1,-37.726,0,-11.014],[3,0.6943636629342667,-0.13363795716976493,-0.13363795716976493,-0.6943636629342668],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,-338.212,0]],[3,"partition_21",7,[[4,1,-1200,[0,"73RIgLLGxHE6etkMKD5Wbu"],[422],[2,256,[2,0,0,1,1]],423]],[1,"18tssw9NxPNqoRRK67p+Hh",1,0],[1,-40.379,0,-8.406],[3,0.6183417977406674,-0.343006444789073,-0.34300644478907294,-0.6183417977406676],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,-301.964,0]],[3,"partition_22",7,[[4,1,-1201,[0,"d3FbS4DWhInoHjphSCJgV0"],[424],[2,256,[2,0,0,1,1]],425]],[1,"74tmwJj/NNv5ISeuvdKY0F",1,0],[1,-37.579,0,32.586],[3,0.1440025045256972,-0.6922884360512797,-0.6922884360512795,-0.14400250452569724],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,-203.501,0]],[3,"partition_23",7,[[4,1,-1202,[0,"866RiFZ8RDwa9ZI3lWYJ1q"],[426],[2,256,[2,0,0,1,1]],427]],[1,"16CaxXcSpFeqkTCVPjmXDM",1,0],[1,-40.413,0,30.407],[3,0.3644196175618044,-0.6059689285236565,-0.6059689285236564,-0.36441961756180447],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,-242.044,0]],[3,"partition_24",7,[[4,1,-1203,[0,"274SYbZydAP6CHRs4vb7tC"],[428],[2,256,[2,0,0,1,1]],429]],[1,"c1DQl4LFZKxaLc/oY5q4yq",1,0],[1,-4.463,0,10.19],[3,0.557173554406396,0.43538216576950284,0.4353821657695028,-0.5571735544063962],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,-436.009,0]],[3,"partition_25",7,[[4,1,-1204,[0,"9d/g02gWpJsZfaPR8OboI3"],[430],[2,256,[2,0,0,1,1]],431]],[1,"b8RfwIlu1BWIWKNEjrhpRQ",1,0],[1,-9.059,0,6.731],[3,0.557173554406396,0.43538216576950284,0.4353821657695028,-0.5571735544063962],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,-436.009,0]],[3,"partition_26",7,[[4,1,-1205,[0,"3ew7CxJmVBwbYqdiEQaHa1"],[432],[2,256,[2,0,0,1,1]],433]],[1,"62VQEE1pFDw7kCGS2V63kD",1,0],[1,26.475,0,20.275],[3,-0.39376027396862645,-0.5873268652497962,-0.587326865249796,0.3937602739686265],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,-112.322,0]],[3,"partition_27",7,[[4,1,-1206,[0,"317bkbo8pNE5J2iO4ePcvt"],[434],[2,256,[2,0,0,1,1]],435]],[1,"72PXWFAkFI6LMAc/Km9xrG",1,0],[1,22.321,0,23.928],[3,-0.11967520340243996,-0.6969059087786419,-0.6969059087786418,0.11967520340243999],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,-160.512,0]],[3,"partition_28",7,[[4,1,-1207,[0,"47uPW025lDc5ELZL0ym76s"],[436],[2,256,[2,0,0,1,1]],437]],[1,"d4N4fl0KRFS6Z6wG3OSQ0T",1,0],[1,47.807,0,19.723],[3,-0.14436496614706018,-0.6922129416222715,-0.6922129416222714,0.1443649661470602],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,-156.439,0]],[3,"partition_29",7,[[4,1,-1208,[0,"07ngTVHQZOML2VYswEOqNG"],[438],[2,256,[2,0,0,1,1]],439]],[1,"1alExWG8pDYZEal5/BuHDh",1,0],[1,48.668,0,3.551],[3,-0.6956277761769456,-0.12689364448670074,-0.1268936444867007,0.6956277761769457],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,-20.676,0]],[3,"partition_30",7,[[4,1,-1209,[0,"36GljnFKtNlJHHcSGKtL9w"],[440],[2,256,[2,0,0,1,1]],441]],[1,"30XTi7UU9EYI0rrzSo5DWk",1,0],[1,23.904,0,-0.364],[3,0.39569041296453156,-0.5860282391557241,-0.586028239155724,-0.3956904129645316],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,-248.055,0]],[3,"partition_31",7,[[4,1,-1210,[0,"e67WZCth9OpIXwLg4EhNFn"],[442],[2,256,[2,0,0,1,1]],443]],[1,"80TJAFEjFPlaGKhNcKARQP",1,0],[1,25.739,0,0.964],[3,0.16236945538029546,-0.688212292798891,-0.6882122927988908,-0.16236945538029549],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,-206.55,0]],[3,"partition_32",7,[[4,1,-1211,[0,"feByramINA36wBJiS3m/jR"],[444],[2,256,[2,0,0,1,1]],445]],[1,"3fJq2Ev21OFr2vGMws1lZJ",1,0],[1,11.347,0,7.687],[3,-0.16459674683399608,-0.6876830017760113,-0.6876830017760112,0.1645967468339961],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,-153.079,0]],[3,"partition_33",7,[[4,1,-1212,[0,"ac80uP5sBBELcNo/mCPyzl"],[446],[2,256,[2,0,0,1,1]],447]],[1,"4e7Vdxkz5H+7mMYAbz6ZBp",1,0],[1,-3.107,0,7.708],[3,0.2279288308864873,-0.6693642118090264,-0.6693642118090263,-0.22792883088648733],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,-217.609,0]],[3,"partition_34",7,[[4,1,-1213,[0,"2fOkju7ypOor2oVPINg3Pl"],[448],[2,256,[2,0,0,1,1]],449]],[1,"77FdwoLAdBa6tPLIxkswwR",1,0],[1,52.161,0,7.276],[3,-0.6081711298552689,-0.36073241718837196,-0.3607324171883719,0.608171129855269],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,-61.348,0]],[3,"partition_35",7,[[4,1,-1214,[0,"5fwA97rTNJDq6EPlAJevPx"],[450],[2,256,[2,0,0,1,1]],451]],[1,"f4+zwPSvlBPJ2UPtcgn8ak",1,0],[1,52.136,0,15.667],[3,-0.36812498587232645,-0.6037250986802681,-0.603725098680268,0.3681249858723265],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-90,-117.254,0]],[3,"wall_01",11,[[4,1,-1215,[0,"387ihrf9pMcb3i7gptEsRK"],[452],[2,256,[2,0,0,1,1]],453]],[1,"63YcVobQdJt50QmaLjwSu4",1,0],[1,17.357,0,14.169],[3,-0.5,-0.5,-0.49999999999999994,0.5000000000000001],[1,22.823187,22.823187000000004,22.823186874389652],[1,-90,-90,-6.3611093629270335e-15]],[3,"wall_01",11,[[4,1,-1216,[0,"c9wgGibTlBibyXb7nK+cBg"],[454],[2,256,[2,0,0,1,1]],455]],[1,"f05bAalDhJepmO32xYt55O",1,0],[1,17.343,0,17.063],[3,-0.4999999999999999,-0.5000000000000001,-0.4999999999999997,0.5000000000000002],[1,22.823187,22.823187,22.823186874389645],[1,-89.99999999999996,-90,9.54166404439055e-15]],[3,"wall_01",11,[[4,1,-1217,[0,"21mWq0suRF1aLTlpTzs5l5"],[456],[2,256,[2,0,0,1,1]],457]],[1,"68TujEW51GUYoDjHHmbgdb",1,0],[1,26.628,3.0517577442878974e-7,1.6870000000000012],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_01",11,[[4,1,-1218,[0,"f5UrwRzaJA0LWT+akFtFic"],[458],[2,256,[2,0,0,1,1]],459]],[1,"0dknlJuxNKzYFS+yQLcyZk",1,0],[1,29.466,3.0517577442878974e-7,1.6870000000000012],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_01",11,[[4,1,-1219,[0,"a6G/v/cohOELzZf2gq6XP0"],[460],[2,256,[2,0,0,1,1]],461]],[1,"c14IBCYFZCF4fjC0Tng5qv",1,0],[1,32.316,3.0517577442878974e-7,1.6870000000000012],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_01",11,[[4,1,-1220,[0,"3a9jcO7yFGmbEu1vICk9+K"],[462],[2,256,[2,0,0,1,1]],463]],[1,"42qqYgQ/VOV4r10YaWyftl",1,0],[1,39.161,0,8.385],[3,0.5000000000000001,0.4999999999999999,0.5,-0.5],[1,24.055,22.823,22.823],[1,-90.00000000000003,-89.99999999999999,0]],[3,"wall_01",11,[[4,1,-1221,[0,"ddvv/3B4pOOq+fn1ZNVrgD"],[464],[2,256,[2,0,0,1,1]],465]],[1,"92DKBhNjNBR6X5MthFkaRk",1,0],[1,39.161,0,11.417],[3,0.5000000000000001,0.4999999999999999,0.5,-0.5],[1,24.27,22.823,22.823],[1,-90.00000000000003,-89.99999999999999,0]],[3,"wall_01",11,[[4,1,-1222,[0,"6aLRmM/BRLDoxXydXccrM3"],[466],[2,256,[2,0,0,1,1]],467]],[1,"736nCJDXZOuqJPtq5Dyy3q",1,0],[1,39.161,0,14.326],[3,0.5000000000000001,0.4999999999999999,0.5,-0.5],[1,23.895,22.823,22.823],[1,-90.00000000000003,-89.99999999999999,0]],[3,"wall_01",11,[[4,1,-1223,[0,"2d3umFK1VGnrzrf3H6ehYh"],[468],[2,256,[2,0,0,1,1]],469]],[1,"014zIkCNhJF7KHXpAtoG3m",1,0],[1,37.092,0,16.047],[3,-4.329780281177467e-17,0.7071067811865475,0.7071067811865476,4.3297802811774664e-17],[1,27.565,22.823,22.823],[1,-90.00000000000003,180,0]],[3,"wall_01",11,[[4,1,-1224,[0,"91a04VYMVCuZz5DwifnoAB"],[470],[2,256,[2,0,0,1,1]],471]],[1,"87TjsOFM9H/qn4jq4IEHEZ",1,0],[1,-25.165,0,39.694],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,30.127,22.823,22.823],[1,-90.00000000000003,0,0]],[3,"wall_01",11,[[4,1,-1225,[0,"a862iTzilGb6cG6UZreJ0i"],[472],[2,256,[2,0,0,1,1]],473]],[1,"05ybg96K1Fja82W/KI3Vg1",1,0],[1,-21.728,0,39.701],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,24.31,22.823,22.823],[1,-90.00000000000003,0,0]],[3,"wall_01",11,[[4,1,-1226,[0,"11nsN/H8BKj6Vo/O/Cxod4"],[474],[2,256,[2,0,0,1,1]],475]],[1,"04JLN52nxB+bNitCuW7JKM",1,0],[1,-29.364,0,35.777],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_01",11,[[4,1,-1227,[0,"1bpI4vwPRCWZEEBumJaT2z"],[476],[2,256,[2,0,0,1,1]],477]],[1,"aeZvAsXFZFipXx0TeBKb2H",1,0],[1,-37.43,0,35.517],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,27.477,22.823,22.823],[1,-90.00000000000003,0,0]],[3,"wall_01",11,[[4,1,-1228,[0,"ednTUB47tH+L2T9PYI5KSx"],[478],[2,256,[2,0,0,1,1]],479]],[1,"18t0RKUtNCAbyjcjwnuq1Z",1,0],[1,-37.046,0,23.517],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_01",11,[[4,1,-1229,[0,"ddLjvvYlxD4IDMDQYOH13w"],[480],[2,256,[2,0,0,1,1]],481]],[1,"73RNBf8DlAN7uxQ7InCMgg",1,0],[1,-40.838,0,19.734],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_01",11,[[4,1,-1230,[0,"343GM06fpOnqITA3wFie4L"],[482],[2,256,[2,0,0,1,1]],483]],[1,"130Igpf7ZDob3xlCiMDXGj",1,0],[1,-44.798,0,15.667],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,27.602,22.823,22.823],[1,-90.00000000000003,0,0]],[3,"wall_02",11,[[4,1,-1231,[0,"35U9jswU9CrKa0W4tDYu3Y"],[484],[2,256,[2,0,0,1,1]],485]],[1,"8fXAQGeMVDxqVp2qc3O6vb",1,0],[1,17.404,0,2.84],[3,-0.5,-0.5,-0.49999999999999994,0.5000000000000001],[1,23.841,22.823,22.823],[1,-90,-90,-6.3611093629270335e-15]],[3,"wall_03",11,[[4,1,-1232,[0,"0d3y9TOVhLpaeQAqtmi07f"],[486],[2,256,[2,0,0,1,1]],487]],[1,"0978alCUpMgJstVYPdULsv",1,0],[1,17.39,0,5.766],[3,-0.4999999999999999,-0.5000000000000001,-0.4999999999999997,0.5000000000000002],[1,24.385,22.823,22.823],[1,-89.99999999999996,-90,9.54166404439055e-15]],[3,"wall_02",2,[[4,1,-1233,[0,"dcneIezIdGar5S4m8yFB9K"],[488],[2,256,[2,0,0,1,1]],489]],[1,"62CHjI4K5GsZcvqjG7ZmgX",1,0],[1,2.824,0,10.348],[3,-4.3297802811774664e-17,0.7071067811865476,0.7071067811865475,4.329780281177467e-17],[1,28.524,22.823,22.823],[1,-89.99999999999999,180,0]],[3,"wall_02",2,[[4,1,-1234,[0,"05CjzOjlhJEpaktSi0yYIc"],[490],[2,256,[2,0,0,1,1]],491]],[1,"cffAQHTt1Hhq0L51pkU1J4",1,0],[1,7.922,0,7.075],[3,-0.2705980500730985,-0.6532814824381885,-0.653281482438188,0.27059805007309856],[1,23.966,22.823,22.823],[1,-89.99999999999996,-135,6.3611093629270335e-15]],[3,"wall_02",2,[[4,1,-1235,[0,"cdSIkwIZxAMZb2umg39awK"],[492],[2,256,[2,0,0,1,1]],493]],[1,"b13R8x1u5Bq7GVQPfrSNwi",1,0],[1,5.732,0,9.255],[3,-0.2705980500730985,-0.6532814824381885,-0.653281482438188,0.27059805007309856],[1,25.109,22.823,22.823],[1,-89.99999999999996,-135,6.3611093629270335e-15]],[3,"wall_02",2,[[4,1,-1236,[0,"24LUdaXdFBSY+d7le1wTNE"],[494],[2,256,[2,0,0,1,1]],495]],[1,"52cdETRQFAtYWfF8baG3tx",1,0],[1,26.61,0,5.281],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,22.823186874389652,22.823186874389645,22.823186874389645],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_02",2,[[4,1,-1237,[0,"cfrGpp5LtBkIOV7iO+t3rV"],[496],[2,256,[2,0,0,1,1]],497]],[1,"b5voAgVK9ESqtjxAweZJPi",1,0],[1,30.745,0,9.438],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,32.176,22.823,22.823],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_02",2,[[4,1,-1238,[0,"6dNUHq6l5Cf4ncwN4Iqmgs"],[498],[2,256,[2,0,0,1,1]],499]],[1,"253vWkF6JJyactl6MpCcAS",1,0],[1,30.488,0,18.815],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,31.188,22.823,22.823],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_02",2,[[4,1,-1239,[0,"9c4n/fDmVGfZIHbviKZgp9"],[500],[2,256,[2,0,0,1,1]],501]],[1,"2fmX4w/P5L1alo9WPUkIGm",1,0],[1,28.64,0,20.45],[3,-4.575107227846807e-17,-0.7071067811865475,-0.7071067811865476,4.084453334508126e-17],[1,24.101,22.823,22.823],[1,-90.00000000000001,-180,3.975693351829396e-16]],[3,"wall_02",2,[[4,1,-1240,[0,"59k0RTa3BGpKoIk/sDGEvV"],[502],[2,256,[2,0,0,1,1]],503]],[1,"d0wjk27XRNDYF7HcB8qAbx",1,0],[1,-16.31,0,-4.751],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.554,22.823,22.823],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1241,[0,"e6SYSfbUJJOK04cHN5NqjM"],[504],[2,256,[2,0,0,1,1]],505]],[1,"0fzwzkOChHEpEPkk7ZjPOQ",1,0],[1,-19.198,0,-4.751],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,23.198,22.823,22.823],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1242,[0,"632G9B8wZCoK/KQn6kUgJU"],[506],[2,256,[2,0,0,1,1]],507]],[1,"5bVoHkKq1Dk6N+8Wo+ehsY",1,0],[1,-22.041,0,-4.751],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,21.694,22.823,22.823],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1243,[0,"a1JdqJd25GxYu6s8+4kgUI"],[508],[2,256,[2,0,0,1,1]],509]],[1,"c4xZYSUbtOgrGCXlqEPShf",1,0],[1,-24.859,0,-4.751],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1244,[0,"e2Gfs6TY5HUY2gbw/KtERt"],[510],[2,256,[2,0,0,1,1]],511]],[1,"1c3oF4lZBJUrDzq0+EZDCO",1,0],[1,-27.742,0,-4.751],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1245,[0,"1c8wFw13lJEKrnA14yw+/D"],[512],[2,256,[2,0,0,1,1]],513]],[1,"043YFbKBFNP7m8DBeBZiSZ",1,0],[1,-30.631,0,-4.751],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1246,[0,"90GfiXB1FOfp5jMEf1UlJt"],[514],[2,256,[2,0,0,1,1]],515]],[1,"dfwM+6avdMs5mQn6i2zAQs",1,0],[1,-33.52,0,-4.751],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1247,[0,"528bggFQxA7K/y9on68em7"],[516],[2,256,[2,0,0,1,1]],517]],[1,"8eeynPROJIRL/U63Iccirj",1,0],[1,-42.975,0,-8.578000000000001],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1248,[0,"3c+3gNI4xJHbR2MsGevF/T"],[518],[2,256,[2,0,0,1,1]],519]],[1,"3d5LkGZNdJlbgR5N5/HeH0",1,0],[1,-40.134,0,-8.578000000000001],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1249,[0,"8bBsgubxdJD5Yzy9gq76O+"],[520],[2,256,[2,0,0,1,1]],521]],[1,"32NkF9YolN7oC58llmJql6",1,0],[1,-37.29,0,-8.578000000000001],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1250,[0,"d2w0dpHlZKbrTc9yM4rVBu"],[522],[2,256,[2,0,0,1,1]],523]],[1,"d47XoFfBFA+7D36rluYPW0",1,0],[1,-20.183,0,18.395],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1251,[0,"c6c2QcOKND3YAoqwrehTrj"],[524],[2,256,[2,0,0,1,1]],525]],[1,"40bhsnUVdBpK5cV0KRykzS",1,0],[1,-17.342000000000002,0,18.395],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1252,[0,"ddxZSOdYZEk4u4JJquL1vV"],[526],[2,256,[2,0,0,1,1]],527]],[1,"f06cursmVIMLlGTBlqEzkh",1,0],[1,5.578,0,32.001],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1253,[0,"b4SwOVQxxFJqAz5FVL+zCH"],[528],[2,256,[2,0,0,1,1]],529]],[1,"60aJAI/YBNcJeFVCD+akdf",1,0],[1,8.446,0,32.001],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1254,[0,"10rOGV445P6qZAGo81+LqY"],[530],[2,256,[2,0,0,1,1]],531]],[1,"a3mtBvj41PjpfTMvJCI4qe",1,0],[1,11.515,0,32.001],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,25.911,22.823,22.823],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1255,[0,"a1Lqf8YSZDSZQwim7UiRuB"],[532],[2,256,[2,0,0,1,1]],533]],[1,"a2yAkQ4SNEF4xlEFav1Pxj",1,0],[1,14.793,0,32.001],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,26.27,22.823,22.823],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1256,[0,"284LyJOVtDi46BHHki5/7s"],[534],[2,256,[2,0,0,1,1]],535]],[1,"10jP0sp/5Nz70jWN160xpb",1,0],[1,18.112,0,32.001],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,26.474,22.823,22.823],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1257,[0,"ccF4Y8ZnxKeKq7qYCdsZge"],[536],[2,256,[2,0,0,1,1]],537]],[1,"e4YzYD1ZFAuY7aCf6mfS1e",1,0],[1,35.049,0,5.954],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,17.812,22.823,22.823],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1258,[0,"7a12wbn2FI9IY7vX2soxc0"],[538],[2,256,[2,0,0,1,1]],539]],[1,"c4SKm/eAFLvYf+/IqMJ6eV",1,0],[1,37.57599999999999,0,5.954000000000001],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1259,[0,"6ePPMozqRJ3LGcRZdCtmZH"],[540],[2,256,[2,0,0,1,1]],541]],[1,"e7ubNyYRtDaLhglTL47frR",1,0],[1,40.455999999999996,0,5.954000000000001],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1260,[0,"3cSG47uw9ESKdaCvlejF/u"],[542],[2,256,[2,0,0,1,1]],543]],[1,"c88+BpONpAao9dzIJDclsm",1,0],[1,28.746,0,7.227],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,25.676,22.823,22.823],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1261,[0,"015BzTRkpIhYdnKwnfGsow"],[544],[2,256,[2,0,0,1,1]],545]],[1,"05LJ2AAUZCrJWb4YesDzVu",1,0],[1,19.728,0,7.204000000000001],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1262,[0,"35A7gDPfpNPpBOSRZMuEFn"],[546],[2,256,[2,0,0,1,1]],547]],[1,"37bssx80BP9oL+Uleend8S",1,0],[1,16.848,0,7.204000000000001],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1263,[0,"d3PJhR+D9DLqAqz6k4BZFi"],[548],[2,256,[2,0,0,1,1]],549]],[1,"00RrWhVeNB66DdQ8J8dAkO",1,0],[1,14.033999999999999,0,7.204000000000001],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1264,[0,"32iU18YcFEraG4yDkgolGK"],[550],[2,256,[2,0,0,1,1]],551]],[1,"9fQTk9ILRMO6TnfBoPuZRJ",1,0],[1,8.58,0,16.141],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,24.295,22.823,22.823],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1265,[0,"27INow66tIHIlx48/971A2"],[552],[2,256,[2,0,0,1,1]],553]],[1,"76x5Ci5DlPN7ImZaEE9FFo",1,0],[1,5.506,0,16.141],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,24.314,22.823,22.823],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1266,[0,"9bkbymB8FFaY4HGyzDgcrW"],[554],[2,256,[2,0,0,1,1]],555]],[1,"54M8UV/C9CkI1DHJ7xrbzU",1,0],[1,2.482,0,16.141],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,23.588,22.823,22.823],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1267,[0,"64n2q05DFG05OmbXSmD8Z4"],[556],[2,256,[2,0,0,1,1]],557]],[1,"e4RDcueSpH2omzxv1EBJVQ",1,0],[1,17.829,0,16.141],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,24.352,22.823,22.823],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1268,[0,"d6XroLUdxDTo0JnRy7c+ev"],[558],[2,256,[2,0,0,1,1]],559]],[1,"e36ETTmGVFVbJE60M1RRiY",1,0],[1,14.811,0,16.141],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,24.113,22.823,22.823],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1269,[0,"80DNn4dcBCNZHWtxiXP9PD"],[560],[2,256,[2,0,0,1,1]],561]],[1,"caRiw3Yr5Kyr5gf/hULoBk",1,0],[1,11.694,0,16.141],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,25.203,22.823,22.823],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1270,[0,"8cfVJe281ETLX6kuUEjs4p"],[562],[2,256,[2,0,0,1,1]],563]],[1,"e1r2nibJtHUbciLFN69gea",1,0],[1,-26.278,0,33.612],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1271,[0,"0aswjgxcNK/4/eELQ568+X"],[564],[2,256,[2,0,0,1,1]],565]],[1,"fbnBixj9tCWJitN2zjLpsi",1,0],[1,-23.437,0,33.612],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1272,[0,"cbod42Ky1GdZjfc9E5V9cz"],[566],[2,256,[2,0,0,1,1]],567]],[1,"2cUJW9FTlBp5+QgRDyCWvu",1,0],[1,-12.702,0,33.612],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,25.719,22.823,22.823],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1273,[0,"7eWQi6WO1Ap68WH+Gddgcf"],[568],[2,256,[2,0,0,1,1]],569]],[1,"80910X74RIz6eTR4TIRJSg",1,0],[1,-37.456,0,10.787],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1274,[0,"e9a+KB3DZH46lAgNn3U1ze"],[570],[2,256,[2,0,0,1,1]],571]],[1,"144tUx3qVDVqnXYCUT2DK4",1,0],[1,-31.792,0,5.041],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,27.944,22.823,22.823],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1275,[0,"18xCnsIaRGV7wUeyrdoI5m"],[572],[2,256,[2,0,0,1,1]],573]],[1,"b2SaRSOOhN2rPuZK7iTZ7J",1,0],[1,28.393,0,30.313],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1276,[0,"a3LckESbxD9JG+hcZ2L3eg"],[574],[2,256,[2,0,0,1,1]],575]],[1,"b53XW1PiFHW5YFjlMz5VHu",1,0],[1,24.25,0,16.483],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1277,[0,"972tdyhfxOPKl7WjU0rjS8"],[576],[2,256,[2,0,0,1,1]],577]],[1,"0cEBVOpBtGEL/iFe9+4BF0",1,0],[1,32.21,0,11.915],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_02",2,[[4,1,-1278,[0,"a0m4OQaL5Ob7ixfACKMI9k"],[578],[2,256,[2,0,0,1,1]],579]],[1,"55L4s4jo9OrIplLQmH9iaD",1,0],[1,34.193,0,9.902],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1279,[0,"e3GsFAfURNB6B+K2wL9ndo"],[580],[2,256,[2,0,0,1,1]],581]],[1,"1eDNUa2htIX5Fr7kBib9qm",1,0],[1,34.193,0,7.018],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1280,[0,"edMirCNYVJBrHGHozEsDzm"],[582],[2,256,[2,0,0,1,1]],583]],[1,"48L8wDfwREkp1jYNPCxKdN",1,0],[1,34.156,0,21.164],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1281,[0,"46p3HK7cpLZodRXgqKilDH"],[584],[2,256,[2,0,0,1,1]],585]],[1,"39wWZCGy1Elb3nxcSPM2mG",1,0],[1,34.156,0,18.275],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1282,[0,"9dGVVLGCtFXqshO8A3cwY4"],[586],[2,256,[2,0,0,1,1]],587]],[1,"02WxLMHz9JX6yEYyMDSoWE",1,0],[1,26.215,0,13.842],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,35.217,22.823,22.823],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1283,[0,"5fTerWgBVEWIm2M/NgRvHQ"],[588],[2,256,[2,0,0,1,1]],589]],[1,"27R76j8B9LDqRvqAJ9/9ny",1,0],[1,22.364,0,20.726],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1284,[0,"cdB8koVEVDlZPQJMXDF8fU"],[590],[2,256,[2,0,0,1,1]],591]],[1,"56fD5PZttH2bihs3JdqDI2",1,0],[1,22.364,0,17.837],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1285,[0,"fdEB/NefBIPph/LXOV57Kc"],[592],[2,256,[2,0,0,1,1]],593]],[1,"9bPmhPCN5BbZ9J/CSvBWSh",1,0],[1,22.364,0,26.494],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1286,[0,"3eO4E3a3BEdLXIkQR8W7iM"],[594],[2,256,[2,0,0,1,1]],595]],[1,"15pprsx65DIL/Ez0HtucEj",1,0],[1,22.364,0,23.605],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1287,[0,"9eQ9Jyx3tBd4ZmIHa8IbLD"],[596],[2,256,[2,0,0,1,1]],597]],[1,"1dybeEHjRJQrtwDhyoc4ie",1,0],[1,22.364,0,28.559],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1288,[0,"5c40wkRMBHRY9TL1GlNC4O"],[598],[2,256,[2,0,0,1,1]],599]],[1,"81CuI7xZ1NBI5CoxYHu2XX",1,0],[1,21.733,0,5.401],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1289,[0,"24l61Jg8tAv7042hDm3+pk"],[600],[2,256,[2,0,0,1,1]],601]],[1,"21cLJaRiRKjL9kFiGyZ8yN",1,0],[1,17.037,0,1.266],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,20.249,22.823,22.823],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1290,[0,"ec089ch3VAq4aninNjWEdR"],[602],[2,256,[2,0,0,1,1]],603]],[1,"efJVinDbhGP5P3AhEraBQ6",1,0],[1,7.442,0,12.594],[3,-0.5000000000000002,0.49999999999999983,0.5000000000000001,0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1291,[0,"0aZtQkIXJOZ5COhjWpZLFF"],[604],[2,256,[2,0,0,1,1]],605]],[1,"27MwIs/o9JXrWNJcGYxs60",1,0],[1,6.208,0,45.285],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,24.291,22.823,22.823],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1292,[0,"e08ERYfB5EK6Ec32BB9/DY"],[606],[2,256,[2,0,0,1,1]],607]],[1,"1fZKfOgYxKkKyL+Vn4D2G7",1,0],[1,6.208,0,42.193],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,25.011,22.823,22.823],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1293,[0,"1cpv37ZjNFlbEGclz+6QmM"],[608],[2,256,[2,0,0,1,1]],609]],[1,"33WFVRO3lKxorYekR7h0Xv",1,0],[1,6.208,0,38.967],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,25.932,22.823,22.823],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1294,[0,"8css2EqA9GAow5GvgUzCJX"],[610],[2,256,[2,0,0,1,1]],611]],[1,"ccIeMcD2BPlYD5iaGd7l2y",1,0],[1,-10.615,0,39.978],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1295,[0,"ecVe0uy9dFJbC7kDXU4+32"],[612],[2,256,[2,0,0,1,1]],613]],[1,"e82i40qflF1Iiya8YfQbfk",1,0],[1,-10.548,0,31.411],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,26.48,22.823,22.823],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1296,[0,"7crBU9DrFEaqGGjgWXJebe"],[614],[2,256,[2,0,0,1,1]],615]],[1,"1fpzP0cnRCQqrf7Y+wKgKR",1,0],[1,-10.548,0,28.135],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,26.881,22.823,22.823],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1297,[0,"cfr8syp75L65WCrblatJG8"],[616],[2,256,[2,0,0,1,1]],617]],[1,"a0uCvZy4RM7Lm1/FER3gNY",1,0],[1,-5.406,0,18.181],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,24.47,22.823,22.823],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1298,[0,"8fv9emMw1CSIZZTDnFSHZo"],[618],[2,256,[2,0,0,1,1]],619]],[1,"33A0ZHI0dHS6n84azra7+i",1,0],[1,-5.406,0,21.328],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,25.818,22.823,22.823],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1299,[0,"89GHdHebFOH7phBUg3Wlvk"],[620],[2,256,[2,0,0,1,1]],621]],[1,"8aJ6g21VFHV60hiPxLgYyQ",1,0],[1,-5.406,0,12.335],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,25.019,22.823,22.823],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1300,[0,"ddgEXpnlFHHLWvRGYY1fdw"],[622],[2,256,[2,0,0,1,1]],623]],[1,"200lmypyNBrqXTUAjS4Ixv",1,0],[1,-5.406,0,15.078],[3,-0.5000000000000002,0.49999999999999983,0.5000000000000001,0.5],[1,24.833,22.823,22.823],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1301,[0,"dfHM7nqCZINpUAhjH158LJ"],[624],[2,256,[2,0,0,1,1]],625]],[1,"b1zqBE3s1AdY5x1mO+EpKN",1,0],[1,-21.436,0,28.897],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1302,[0,"1eOzW1fSZPxqdIruZmMdNm"],[626],[2,256,[2,0,0,1,1]],627]],[1,"3d6OR25AdCB4oBPiUzGe9T",1,0],[1,-21.436,0,31.705],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1303,[0,"d6gr5JgDtKxoJ/Dk0zpeD2"],[628],[2,256,[2,0,0,1,1]],629]],[1,"44cihseYZChaKpS2jR0Uo4",1,0],[1,-21.436,0,23.22],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1304,[0,"29lM73nb9M4JoSSbjrVnV5"],[630],[2,256,[2,0,0,1,1]],631]],[1,"35jAlpuOtJnYWz+x1mQN3r",1,0],[1,-21.436,0,26.028],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1305,[0,"ba5HLN22ZDsofhG8GgGsdV"],[632],[2,256,[2,0,0,1,1]],633]],[1,"e2s/36AIpLxKuVNKoL7idi",1,0],[1,-21.436,0,20.408],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1306,[0,"7bUb1LfpVOaLkt6j+V0YP3"],[634],[2,256,[2,0,0,1,1]],635]],[1,"9dvhXxvelMqZHR470+ehx6",1,0],[1,-32.032,0,33.484],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1307,[0,"66a1y3CClBpaA5ivxVKP9T"],[636],[2,256,[2,0,0,1,1]],637]],[1,"e1tq5d6eZIv4I2px/dgcpP",1,0],[1,-32.032,0,36.355],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1308,[0,"50GZm0XGxFgr1oGNgVOAcq"],[638],[2,256,[2,0,0,1,1]],639]],[1,"13qwMCPb1BwJMFU6g3n+r/",1,0],[1,-47.299,0,25.038],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,25.206,22.823,22.823],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1309,[0,"4fiifgZ8RFnZf2zSqy2Nia"],[640],[2,256,[2,0,0,1,1]],641]],[1,"06ENDBbA9JJadtJ4krKUri",1,0],[1,-47.299,0,28.242],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,25.203,22.823,22.823],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1310,[0,"ddHuKfVwNB2IfiogGb8h7B"],[642],[2,256,[2,0,0,1,1]],643]],[1,"97s2gbTvFNuL+F+LD0Qs/C",1,0],[1,-47.302,0,31.486],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,25.919,22.823,22.823],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1311,[0,"7aG8pRqXhHHq0RR4OLiBCF"],[644],[2,256,[2,0,0,1,1]],645]],[1,"bcqmTbGg9NypYE78KR7jra",1,0],[1,-43.433,0,20.873],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1312,[0,"268e1TnLhGUKIRoRsrhL4p"],[646],[2,256,[2,0,0,1,1]],647]],[1,"abbu3ueuRDDbyHEYn/MugL",1,0],[1,-43.433,0,18.059],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1313,[0,"edCSYAlFNJu4D1qo+qLfDW"],[648],[2,256,[2,0,0,1,1]],649]],[1,"11bku9NEVBZIDyjvVyDOVX",1,0],[1,-59.228,0,17.62],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1314,[0,"4bIHlLb5pOl4cN53Pm9eI2"],[650],[2,256,[2,0,0,1,1]],651]],[1,"f60woR7KlJU7s+UTSJOeaX",1,0],[1,-59.228,0,14.726],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1315,[0,"40uNp+QlpJuK0W9IfX22Gf"],[652],[2,256,[2,0,0,1,1]],653]],[1,"1fbgHo5jtKuYXXDSLvU18I",1,0],[1,-59.228,0,11.86],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1316,[0,"0bajcLomlKmKek2gfA1Z9L"],[654],[2,256,[2,0,0,1,1]],655]],[1,"d0Oti4Ye1GB7cr8tNNyUqq",1,0],[1,-59.228,0,8.966],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1317,[0,"0ao7XfapVDT5wURJeMKsZ9"],[656],[2,256,[2,0,0,1,1]],657]],[1,"05Fl7cE9dM34Nhc4kTRIP7",1,0],[1,-43.437,0,8.623],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,24.428,22.823,22.823],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1318,[0,"673DJX0O5AFop54mPaL4NJ"],[658],[2,256,[2,0,0,1,1]],659]],[1,"dcueMRjd1Ezo2mISesygPI",1,0],[1,-43.437,0,5.61],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,22.985,22.823,22.823],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1319,[0,"41kHy2ZiJJaZ7wa5fQvyd4"],[660],[2,256,[2,0,0,1,1]],661]],[1,"0bVBfBi+JMWp9c7sLBQKKh",1,0],[1,-47.327,0,1.735],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1320,[0,"41cdV55rNF4JnFotQxqfr2"],[662],[2,256,[2,0,0,1,1]],663]],[1,"59v+ZVsQpPrpTz4Li51TuL",1,0],[1,-47.308,0,-1.154],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1321,[0,"353JimnOJGGIpi1BfJMocC"],[664],[2,256,[2,0,0,1,1]],665]],[1,"a73U76vjVFPpbigEww7yOj",1,0],[1,-47.327,0,-4.186],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,26.485,22.823,22.823],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1322,[0,"31CU1aoz9Nu6rPIXkZjX1i"],[666],[2,256,[2,0,0,1,1]],667]],[1,"13nJXNNAdEWLRCZ3Jrxrbv",1,0],[1,-35.747,0,17.776],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1323,[0,"51fSLNBxpNLb6o+REES6Q8"],[668],[2,256,[2,0,0,1,1]],669]],[1,"f5y3LYFTFM+6aLtZLGHs00",1,0],[1,-35.728,0,8.948],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,26.448,22.823,22.823],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_02",2,[[4,1,-1324,[0,"6cK2uAxbxMqJk1Xmvlp8Wc"],[670],[2,256,[2,0,0,1,1]],671]],[1,"a25erktQ5C24g0TUGpT+Xh",1,0],[1,13.18,0,-0.493],[3,-4.3297802811774664e-17,0.7071067811865476,0.7071067811865475,4.329780281177467e-17],[1,55.681,22.823,22.823],[1,-89.99999999999999,180,0]],[3,"wall_02",2,[[4,1,-1325,[0,"10ldyUAsNGrpyIOjPazk/M"],[672],[2,256,[2,0,0,1,1]],673]],[1,"59Cyq1W+NHI7avjVBOqMm7",1,0],[1,20.128,0,3.604],[3,-4.575107227846807e-17,-0.7071067811865475,-0.7071067811865476,4.084453334508126e-17],[1,22.823186874389652,22.823186874389645,22.823186874389645],[1,-90.00000000000001,-180,3.975693351829396e-16]],[3,"wall_02",2,[[4,1,-1326,[0,"05/TVWWTFJhq6Toa47oDte"],[674],[2,256,[2,0,0,1,1]],675]],[1,"9f6Y4CoJVH44wI1DPzmNoN",1,0],[1,32.176,0,16.31],[3,-4.575107227846807e-17,-0.7071067811865475,-0.7071067811865476,4.084453334508126e-17],[1,22.823186874389652,22.823186874389645,22.823186874389645],[1,-90.00000000000001,-180,3.975693351829396e-16]],[3,"wall_02",2,[[4,1,-1327,[0,"476ZEY5HVIAIi9WnQHIucR"],[676],[2,256,[2,0,0,1,1]],677]],[1,"89/e0VZbtIDJy6D5jXPhGt",1,0],[1,37.762,0,22.472],[3,-4.575107227846807e-17,-0.7071067811865475,-0.7071067811865476,4.084453334508126e-17],[1,53.905,22.823,22.823],[1,-90.00000000000001,-180,3.975693351829396e-16]],[3,"wall_02",2,[[4,1,-1328,[0,"601I4WfeFENIIZr89WxBoG"],[678],[2,256,[2,0,0,1,1]],679]],[1,"78iOOFTE9E+4s81zZXzZts",1,0],[1,-16.463,0,-0.347],[3,-4.3297802811774664e-17,0.7071067811865476,0.7071067811865475,4.329780281177467e-17],[1,28.889,22.823,22.823],[1,-89.99999999999999,180,0]],[3,"wall_02",2,[[4,1,-1329,[0,"305Zj8qDxHObaV4MEQaYI1"],[680],[2,256,[2,0,0,1,1]],681]],[1,"b25LqGPi5OCJXZSNHbMhFu",1,0],[1,-18.503,0,-15.997],[3,-4.3297802811774664e-17,0.7071067811865476,0.7071067811865475,4.329780281177467e-17],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-89.99999999999999,180,0]],[3,"wall_02",2,[[4,1,-1330,[0,"00kSW9WdxOcL/FExf5QaZC"],[682],[2,256,[2,0,0,1,1]],683]],[1,"7cl4I8oUNDE5mtT/1MQdts",1,0],[1,-21.226,0,-15.997],[3,-4.3297802811774664e-17,0.7071067811865476,0.7071067811865475,4.329780281177467e-17],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-89.99999999999999,180,0]],[3,"wall_02",2,[[4,1,-1331,[0,"0enXQ8Wi9NhLR+ornCNzkr"],[684],[2,256,[2,0,0,1,1]],685]],[1,"91eAdatzVPgLwJ6e58vd06",1,0],[1,-24.019000000000002,0,-15.997],[3,-4.3297802811774664e-17,0.7071067811865476,0.7071067811865475,4.329780281177467e-17],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-89.99999999999999,180,0]],[3,"wall_02",2,[[4,1,-1332,[0,"b3BGoeIGNL3IjRoGPGYW28"],[686],[2,256,[2,0,0,1,1]],687]],[1,"a8d74jcvNKFKz2f7dMYY9S",1,0],[1,-29.493,0,-0.225],[3,-4.329780281177466e-17,0.7071067811865477,0.7071067811865475,4.3297802811774677e-17],[1,87.956,22.823,22.823],[1,-89.99999999999999,180,0]],[3,"wall_02",2,[[4,1,-1333,[0,"e1eyVIJ9xLbZOwERakxZjo"],[688],[2,256,[2,0,0,1,1]],689]],[1,"17qdvamVZKkLcBqs7XHQe5",1,0],[1,-19.113,0,16.124],[3,-4.3297802811774664e-17,0.7071067811865476,0.7071067811865475,4.329780281177467e-17],[1,120.689,22.823,22.823],[1,-89.99999999999999,180,0]],[3,"wall_02",2,[[4,1,-1334,[0,"aepLc6b0BGq7WJN06lFKCd"],[690],[2,256,[2,0,0,1,1]],691]],[1,"53gwVhwwdH5bqQkKRRc6GP",1,0],[1,-32.107,0,19.6],[3,-4.329780281177466e-17,0.7071067811865477,0.7071067811865475,4.3297802811774677e-17],[1,56.06,22.823,22.823],[1,-89.99999999999999,180,0]],[3,"wall_02",2,[[4,1,-1335,[0,"92J7h2PBRDT6jy48kNEVo9"],[692],[2,256,[2,0,0,1,1]],693]],[1,"68zyv2HJlLKrkgvrdMTMki",1,0],[1,-37.71,0,15.92],[3,-4.3297802811774664e-17,0.7071067811865476,0.7071067811865475,4.329780281177467e-17],[1,22.82318687438965,22.82318687438965,22.82318687438965],[1,-89.99999999999999,180,0]],[3,"wall_02",2,[[4,1,-1336,[0,"90WTFYYQJGBqGqNzCQnAdg"],[694],[2,256,[2,0,0,1,1]],695]],[1,"fcx+jGR6lBW4L87tnYLAFe",1,0],[1,-45.315,0,15.991],[3,-4.3297802811774664e-17,0.7071067811865476,0.7071067811865475,4.329780281177467e-17],[1,23.255,22.823,22.823],[1,-89.99999999999999,180,0]],[3,"wall_02",2,[[4,1,-1337,[0,"05Zq905iVB5pN2UhiQNvc8"],[696],[2,256,[2,0,0,1,1]],697]],[1,"77jIlBJxpLXapEAw2y9Qdd",1,0],[1,-49.069,0,19.632],[3,-4.3297802811774664e-17,0.7071067811865476,0.7071067811865475,4.329780281177467e-17],[1,23.033,22.823,22.823],[1,-89.99999999999999,180,0]],[3,"wall_02",2,[[4,1,-1338,[0,"25yFV8RD5LmJTfTdbe+xOm"],[698],[2,256,[2,0,0,1,1]],699]],[1,"31sGntR8VClK8Xky4SmOyD",1,0],[1,-52.894,0,23.324],[3,-4.3297802811774664e-17,0.7071067811865476,0.7071067811865475,4.329780281177467e-17],[1,32.6,22.823,22.823],[1,-89.99999999999999,180,0]],[3,"wall_03",2,[[4,1,-1339,[0,"446j+/D7RJPLn/lzzcfnFE"],[700],[2,256,[2,0,0,1,1]],701]],[1,"06K4MlOeZJeb5wZuPq547a",1,0],[1,-14.36,0,-9.645],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,24.045,22.823,22.823],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_04",2,[[4,1,-1340,[0,"df3dQTRiBGS6eVZUcyngds"],[702],[2,256,[2,0,0,1,1]],703]],[1,"d53DVKXH9MeJ1VzVN1dsby",1,0],[1,-14.36,0,-6.707],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_05",2,[[4,1,-1341,[0,"d8+Dcfd45D7otMlrNZ4NvS"],[704],[2,256,[2,0,0,1,1]],705]],[1,"cbzzdFjnBO1bMvPEjnqu+U",1,0],[1,14.597,0,-4.746],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,29.873,22.823,22.823],[1,-90.00000000000003,0,0]],[3,"wall_06",2,[[4,1,-1342,[0,"86CPIKAshMbZVVkJ99buq5"],[706],[2,256,[2,0,0,1,1]],707]],[1,"a2bTagDmtBpI/ENEZ5yY5i",1,0],[1,11.35,0,-4.746],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,27.202,22.823,22.823],[1,-90.00000000000003,0,0]],[3,"wall_07",2,[[4,1,-1343,[0,"b5YX+0ubFK15BasQDd1fJD"],[708],[2,256,[2,0,0,1,1]],709]],[1,"07iFwuEeROj4LEoxHOaOH0",1,0],[1,8.242,0,-12.289],[3,-0.653281482438188,-0.2705980500730987,-0.27059805007309834,0.6532814824381885],[1,25.124,22.823,22.823],[1,-89.99999999999996,-45,6.3611093629270335e-15]],[3,"wall_08",2,[[4,1,-1344,[0,"aeYPBjtktNlLVgnQwZ+6LJ"],[710],[2,256,[2,0,0,1,1]],711]],[1,"0bI4tUWF1Ds5u9owTtNmQC",1,0],[1,5.946,0,-14.571],[3,-0.653281482438188,-0.2705980500730987,-0.27059805007309834,0.6532814824381885],[1,26.627,22.823,22.823],[1,-89.99999999999996,-45,6.3611093629270335e-15]],[3,"wall_09",2,[[4,1,-1345,[0,"723ZDeGhBD5Kc3oUDeuHiK"],[712],[2,256,[2,0,0,1,1]],713]],[1,"717Fjd9rZCgYByjRJHZRt3",1,0],[1,-13.191,0,-12.441],[3,-0.653281482438188,0.27059805007309856,0.27059805007309845,0.6532814824381885],[1,25.298,22.823,22.823],[1,-89.99999999999996,45,6.3611093629270335e-15]],[3,"wall_10",2,[[4,1,-1346,[0,"e8frpXNPFIzoKPsH5eOcB3"],[714],[2,256,[2,0,0,1,1]],715]],[1,"a6K49HZeFDjKguSxYymGIp",1,0],[1,-11.028,0,-14.613],[3,-0.653281482438188,0.27059805007309856,0.27059805007309845,0.6532814824381885],[1,25.595,22.823,22.823],[1,-89.99999999999996,45,6.3611093629270335e-15]],[3,"wall_11",2,[[4,1,-1347,[0,"57K5GKN5xE9aWN/FdtiPTO"],[716],[2,256,[2,0,0,1,1]],717]],[1,"21VmTBtbRJ1LszJIfL73t9",1,0],[1,17.001,0,-6.633],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_12",2,[[4,1,-1348,[0,"a0BdJfXzRFq5vJC8yNTbXs"],[718],[2,256,[2,0,0,1,1]],719]],[1,"a3S6VSf0FHbrEsDDnSO9jw",1,0],[1,17.001,0,-9.468],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_13",2,[[4,1,-1349,[0,"6bqOXqNPlNHaTJBA1DMlYb"],[720],[2,256,[2,0,0,1,1]],721]],[1,"85sJ2tJa1KHrrQ14AJfOmN",1,0],[1,-14.395,0,1.667],[3,-0.5000000000000002,0.49999999999999983,0.5000000000000001,0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_14",2,[[4,1,-1350,[0,"baOFDGeRJLM7hwIk3gzlZ2"],[722],[2,256,[2,0,0,1,1]],723]],[1,"a7/b9phKNE3IQ5y0UbobVJ",1,0],[1,-14.395,0,4.592],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,23.89,22.823,22.823],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_15",2,[[4,1,-1351,[0,"40AuHAtWRP+JGQ+LnUW1gZ"],[724],[2,256,[2,0,0,1,1]],725]],[1,"11QRh3TApJhLHjd7SjPdxv",1,0],[1,-8.084,0,10.381],[3,-4.3297802811774664e-17,0.7071067811865476,0.7071067811865475,4.329780281177467e-17],[1,33.705,22.823,22.823],[1,-89.99999999999999,180,0]],[3,"wall_16",2,[[4,1,-1352,[0,"dc6MeaGFtIuZ+blxIa/5W4"],[726],[2,256,[2,0,0,1,1]],727]],[1,"46EqJFQNdLEKVW30UzAkc8",1,0],[1,12.386,0.064,14.052],[3,-4.3297802811774664e-17,0.7071067811865476,0.7071067811865475,4.329780281177467e-17],[1,70.539,22.823,22.823],[1,-89.99999999999999,180,0]],[3,"wall_19",2,[[4,1,-1353,[0,"2cIESK6eNH+Ky6+vB97Klv"],[728],[2,256,[2,0,0,1,1]],729]],[1,"d5SuwHKTRBTLaB/gCY3mui",1,0],[1,21.706,0,11.069],[3,-4.3297802811774664e-17,0.7071067811865476,0.7071067811865475,4.329780281177467e-17],[1,65.409,22.823,22.823],[1,-89.99999999999999,180,0]],[3,"wall_22",2,[[4,1,-1354,[0,"20QzoGPGRGxLPJ6xTA0CU+"],[730],[2,256,[2,0,0,1,1]],731]],[1,"78viuUZ5JIQKBPzQX/fTAx",1,0],[1,23.172,0,41.159],[3,-4.575107227846807e-17,-0.7071067811865475,-0.7071067811865476,4.084453334508126e-17],[1,46.015,22.823,22.823],[1,-90.00000000000001,-180,3.975693351829396e-16]],[3,"wall_26",2,[[4,1,-1355,[0,"f7gI5JNjFMLLkp4p/B4fka"],[732],[2,256,[2,0,0,1,1]],733]],[1,"67YNwHPQJLbobHEza70wXt",1,0],[1,10.688,0,47.196],[3,-4.575107227846807e-17,-0.7071067811865475,-0.7071067811865476,4.084453334508126e-17],[1,70.493,22.823,22.823],[1,-90.00000000000001,-180,3.975693351829396e-16]],[3,"wall_27",2,[[4,1,-1356,[0,"36zOiLBpFK2ZR/IIgOcnRm"],[734],[2,256,[2,0,0,1,1]],735]],[1,"0eNx0JyWlJY5NJ/N2wuQE+",1,0],[1,-1.693,0,43.478],[3,-4.575107227846807e-17,-0.7071067811865475,-0.7071067811865476,4.084453334508126e-17],[1,85.993,22.823,22.823],[1,-90.00000000000003,-180,3.975693351829403e-16]],[23,"wall_30",false,2,[[4,1,-1357,[0,"3b7tZ7RRFM0qNkSIEg7Fec"],[736],[25,256],737]],[1,"66xipholtGtZXk7hNQvtzk",1,0],[1,-18.379,0,38.25],[3,-4.575107227846807e-17,-0.7071067811865475,-0.7071067811865476,4.084453334508126e-17],[1,22.823186874389652,22.823186874389645,22.823186874389645],[1,-90.00000000000001,-180,3.975693351829396e-16]],[3,"wall_31",2,[[4,1,-1358,[0,"76TLdQtyNIoIZ/B2EeikHK"],[738],[2,256,[2,0,0,1,1]],739]],[1,"85kF23UV5NM4Nfpnfr3fGR",1,0],[1,-21.414,0,38.25],[3,-4.575107227846807e-17,-0.7071067811865475,-0.7071067811865476,4.084453334508126e-17],[1,163.84,22.833,22.823],[1,-90.00000000000001,-180,3.975693351829396e-16]],[23,"wall_32",false,2,[[4,1,-1359,[0,"8ei8gdWCdLhqaJbotJMokw"],[740],[25,256],741]],[1,"97mmy5FgJOgZb7yPphG5VR",1,0],[1,-15.544,0,38.25],[3,-4.575107227846807e-17,-0.7071067811865475,-0.7071067811865476,4.084453334508126e-17],[1,22.823186874389652,22.823186874389645,22.823186874389645],[1,-90.00000000000001,-180,3.975693351829396e-16]],[23,"wall_33",false,2,[[4,1,-1360,[0,"37fuHBtidMMZWxnyEtqKhL"],[742],[25,256],743]],[1,"99nLcl68ZKxpDy5XS29MBt",1,0],[1,-26.988,0,38.25],[3,-4.575107227846807e-17,-0.7071067811865475,-0.7071067811865476,4.084453334508126e-17],[1,22.823186874389652,22.823186874389645,22.823186874389645],[1,-90.00000000000001,-180,3.975693351829396e-16]],[23,"wall_34",false,2,[[4,1,-1361,[0,"92wjhmPj1ABp98qNvcDvGX"],[744],[25,256],745]],[1,"19H4XbaY1EK6w4d+f5wJzY",1,0],[1,-21.236,0,38.25],[3,-4.575107227846807e-17,-0.7071067811865475,-0.7071067811865476,4.084453334508126e-17],[1,22.823186874389652,22.823186874389645,22.823186874389645],[1,-90.00000000000001,-180,3.975693351829396e-16]],[23,"wall_35",false,2,[[4,1,-1362,[0,"3bv/J3SmpKMqwstl3qNe9d"],[746],[25,256],747]],[1,"0aL6K9ZtdOoIewP/L/JJYj",1,0],[1,-24.153,0,38.25],[3,-4.575107227846807e-17,-0.7071067811865475,-0.7071067811865476,4.084453334508126e-17],[1,22.823186874389652,22.823186874389645,22.823186874389645],[1,-90.00000000000001,-180,3.975693351829396e-16]],[23,"wall_36",false,2,[[4,1,-1363,[0,"36D/QwN5NOt7RsI/vQ29lw"],[748],[25,256],749]],[1,"0elvUQ0uNJoaHXP/01E/Cz",1,0],[1,-29.979,0,38.25],[3,-4.575107227846807e-17,-0.7071067811865475,-0.7071067811865476,4.084453334508126e-17],[1,24.29,22.823,22.823],[1,-90.00000000000001,-180,3.975693351829396e-16]],[3,"wall_37",2,[[4,1,-1364,[0,"a5eqoJKoRAbq7Dg0oENPGt"],[750],[2,256,[2,0,0,1,1]],751]],[1,"313+p+UhtECIbtentWlqBm",1,0],[1,-33.829,0,31.502],[3,-4.575107227846807e-17,-0.7071067811865475,-0.7071067811865476,4.084453334508126e-17],[1,22.823186874389652,22.823186874389645,22.823186874389645],[1,-90.00000000000001,-180,3.975693351829396e-16]],[3,"wall_38",2,[[4,1,-1365,[0,"f4x4aKIDZM4pFX+AZ1rznb"],[752],[2,256,[2,0,0,1,1]],753]],[1,"f82Dd8GRhHjrSPED2SwTl+",1,0],[1,-40.201,0,35.212],[3,-4.575107227846807e-17,-0.7071067811865475,-0.7071067811865476,4.084453334508126e-17],[1,63.12,22.823,22.823],[1,-90.00000000000001,-180,3.975693351829396e-16]],[3,"wall_41",2,[[4,1,-1366,[0,"73d1ZcGtlK9a1ToJVm6Ia8"],[754],[2,256,[2,0,0,1,1]],755]],[1,"708fGqyLVFrqaCr/ROpsLy",1,0],[1,-45.457,0,3.481],[3,-4.329780281177466e-17,0.7071067811865477,0.7071067811865475,4.3297802811774677e-17],[1,24.155,22.823,22.823],[1,-89.99999999999999,180,0]],[3,"wall_42",2,[[4,1,-1367,[0,"69d8kQeTFH0LOjnSzni0z7"],[756],[2,256,[2,0,0,1,1]],757]],[1,"f6hBsWf4VHZZ8C5enCL/sC",1,0],[1,-37.192,0,3.578],[3,-4.329780281177466e-17,0.7071067811865477,0.7071067811865475,4.3297802811774677e-17],[1,26.255,22.823,22.823],[1,-89.99999999999999,180,0]],[3,"wall_43",2,[[4,1,-1368,[0,"9bj8XecSxFYrMoxQWcIdFn"],[758],[2,256,[2,0,0,1,1]],759]],[1,"3ffDAmnC1MM5EK39xLOJBQ",1,0],[1,45.667,0,11.112],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,23.916,22.823,22.823],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_44",2,[[4,1,-1369,[0,"27ZXSUwGpF+bKnkUHi5QUz"],[760],[2,256,[2,0,0,1,1]],761]],[1,"6997U0w6VA8rCfpO8TnDhH",1,0],[1,45.667,0,14.068],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,23.29,22.823,22.823],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_45",2,[[4,1,-1370,[0,"b8EAeCV6tKOorySzIm0upR"],[762],[2,256,[2,0,0,1,1]],763]],[1,"bdF9sJmfhD1YNgtKlLVwF1",1,0],[1,45.667,0,16.905],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,23.29,22.823,22.823],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_46",2,[[4,1,-1371,[0,"5fUxfYpShFMIEFfFrAc7S2"],[764],[2,256,[2,0,0,1,1]],765]],[1,"04LhfIMLxI6KrMSwhgmdnq",1,0],[1,26.542,0,25.391],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,23.602,22.823,22.823],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_47",2,[[4,1,-1372,[0,"eaUeYK4y9KfJPXhfnf9v63"],[766],[2,256,[2,0,0,1,1]],767]],[1,"76DBt4KAhBMYxvxO5V+koF",1,0],[1,26.542,0,22.462],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,22.823186874389652,22.823186874389645,22.823186874389645],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_48",2,[[4,1,-1373,[0,"d7+yD1IYlIbbKvSstfu5vg"],[768],[2,256,[2,0,0,1,1]],769]],[1,"01/XBefthCJ6/oKgCbL07n",1,0],[1,26.542,0,28.328],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,23.184,22.823,22.823],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_49",2,[[4,1,-1374,[0,"51468JqA9FMYpSnTEvtzal"],[770],[2,256,[2,0,0,1,1]],771]],[1,"74RIk4LzhBj6XSQdvbl0q1",1,0],[1,30.386,0,35.039],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,22.823186874389652,22.823186874389645,22.823186874389645],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_50",2,[[4,1,-1375,[0,"a4cdZ7YVVH8Y8aJJ7u7Iqj"],[772],[2,256,[2,0,0,1,1]],773]],[1,"0eXGZB3HBGBLzBS2Ww+Kb2",1,0],[1,30.386,0,32.174],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,22.823186874389652,22.823186874389645,22.823186874389645],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_51",2,[[4,1,-1376,[0,"bcMQnF4K1O5oQsRJf1by1i"],[774],[2,256,[2,0,0,1,1]],775]],[1,"53eCFesJlAVaGCZ3CIpiot",1,0],[1,18.86,0,42.284],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,22.823186874389652,22.823186874389645,22.823186874389645],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_52",2,[[4,1,-1377,[0,"f6KhBoVqNO4Kh+WOOxj1Hl"],[776],[2,256,[2,0,0,1,1]],777]],[1,"27/IBkFC9BSZJHd3CcK01f",1,0],[1,18.86,0,39.419],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,22.823186874389652,22.823186874389645,22.823186874389645],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_53",2,[[4,1,-1378,[0,"bc98wmY+5CG7Pf2HaZochE"],[778],[2,256,[2,0,0,1,1]],779]],[1,"2dgo6onGxOkoa0B4tEylA3",1,0],[1,3.651,0,41.655],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,23.634,22.823,22.823],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_54",2,[[4,1,-1379,[0,"9ePYuKIHFMfa2EP+xPvuf7"],[780],[2,256,[2,0,0,1,1]],781]],[1,"dfe0W5e5dL076n/KNS56K0",1,0],[1,3.636,0,38.688],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,24.211,22.823,22.823],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_55",2,[[4,1,-1380,[0,"00jmvKtTJNiq6iZq5ItMxI"],[782],[2,256,[2,0,0,1,1]],783]],[1,"784bY4V8RK3aQmzzqS/XKU",1,0],[1,3.622,0,29.924],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,24.721,22.823,22.823],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_56",2,[[4,1,-1381,[0,"e0mLTLe7ROeJBGdXHK0dFP"],[784],[2,256,[2,0,0,1,1]],785]],[1,"cecS7MqP9LdLnJEZn4rVH7",1,0],[1,3.632,0,27.007],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,23.713,22.823,22.823],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_57",2,[[4,1,-1382,[0,"28l9lmI9NFkaMefVPxwewV"],[786],[2,256,[2,0,0,1,1]],787]],[1,"1dlJgDjahLHbVz0Q+1X/D4",1,0],[1,0.307,0,22.016],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,15.921,22.823,22.823],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_58",2,[[4,1,-1383,[0,"adVLZfmMJHGbFp9A35fkIi"],[788],[2,256,[2,0,0,1,1]],789]],[1,"cc29UuB1dO0ZCtWwER2yjU",1,0],[1,19.767,0,21.309],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,25.437,22.823,22.823],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_59",2,[[4,1,-1384,[0,"5emjlfmTFOla6cmzbz7isM"],[790],[2,256,[2,0,0,1,1]],791]],[1,"44GNhb7rZP4YplkpqBvEH9",1,0],[1,19.767,0,18.035],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,26.547,22.823,22.823],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_61",2,[[4,1,-1385,[0,"e6kU2BU/hMaJ8oWRHCP0Pn"],[792],[2,256,[2,0,0,1,1]],793]],[1,"2090cDCxhAyJISxVLroClE",1,0],[1,0.453,0,12.279],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,24.304,22.823,22.823],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_62",2,[[4,1,-1386,[0,"a8HbtLiTNOcbockfIYVMYx"],[794],[2,256,[2,0,0,1,1]],795]],[1,"cezSJEQQlPxbVDRHWYKlLh",1,0],[1,0.453,0,14.587],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,20.66,22.823,22.823],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_63",2,[[4,1,-1387,[0,"bfsmiOE8VAo57VLlf8PhtK"],[796],[2,256,[2,0,0,1,1]],797]],[1,"fcBKJ2EGVBtrV3EIfSLAjZ",1,0],[1,-14.866,0,28.052],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,29.09,22.823,22.823],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_64",2,[[4,1,-1388,[0,"4032gSxzJP54NwqaPcTxgi"],[798],[2,256,[2,0,0,1,1]],799]],[1,"308z5/jxtGA657C06ArLUO",1,0],[1,-14.866,0,31.501],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,24.882,22.823,22.823],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_65",2,[[4,1,-1389,[0,"453ux06LNOsIUMGSBqbuAT"],[800],[2,256,[2,0,0,1,1]],801]],[1,"89L0H/bnxF0KzSS9G1Fapr",1,0],[1,-10.446,0,20.32],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,26.559,22.823,22.823],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_66",2,[[4,1,-1390,[0,"23i33f1sxHyaM62bh9oZaj"],[802],[2,256,[2,0,0,1,1]],803]],[1,"84HBA9g1FH8rbS2kPwDiYZ",1,0],[1,-27.918,0,31.715],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,22.823186874389652,22.823186874389645,22.823186874389645],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_67",2,[[4,1,-1391,[0,"09ZTWtOttMbKlDt2P16Rva"],[804],[2,256,[2,0,0,1,1]],805]],[1,"16BJu1kVJJKLvTDRwCx574",1,0],[1,-27.918,0,28.85],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,22.823186874389652,22.823186874389645,22.823186874389645],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_68",2,[[4,1,-1392,[0,"23mOL13YRH3IKk01pl6Nbv"],[806],[2,256,[2,0,0,1,1]],807]],[1,"6aEujXe/9AaIDklJ1hHNNQ",1,0],[1,-35.74,0,33.518],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,22.823186874389652,22.823186874389645,22.823186874389645],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_69",2,[[4,1,-1393,[0,"34k4EOhp5BPYaD5Wyej6RA"],[808],[2,256,[2,0,0,1,1]],809]],[1,"accCL7jWBL3awuxe7ajQ8o",1,0],[1,-35.728,0,25.056],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,22.823186874389652,22.823186874389645,22.823186874389645],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_70",2,[[4,1,-1394,[0,"96C8OagrNK9bxGIfP1X45x"],[810],[2,256,[2,0,0,1,1]],811]],[1,"c1+gsZE7ZNsos7qOY2S3lm",1,0],[1,-28.085,0,12.048],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,22.823186874389652,22.823186874389645,22.823186874389645],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_71",2,[[4,1,-1395,[0,"91iaM5BMxCQqe7bin8JRKn"],[812],[2,256,[2,0,0,1,1]],813]],[1,"bfNZnEtT1PvJAemzzCSzFD",1,0],[1,-28.085,0,9.183],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,22.823186874389652,22.823186874389645,22.823186874389645],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_72",2,[[4,1,-1396,[0,"d5hpTf/kRO8YqbNDt/9Dwi"],[814],[2,256,[2,0,0,1,1]],815]],[1,"df1g3ZhNNBk7gltN4UwUln",1,0],[1,-28.077,0,17.742],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,22.823186874389652,22.823186874389645,22.823186874389645],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_73",2,[[4,1,-1397,[0,"75GWjYZy9KxYhKXdaOGhi6"],[816],[2,256,[2,0,0,1,1]],817]],[1,"4bYtU/+BlOhrbLYUrhjBy6",1,0],[1,-28.096,0,14.946],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,22.823186874389652,22.823186874389645,22.823186874389645],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_74",2,[[4,1,-1398,[0,"12nDCKlbZCt582bmmdVuME"],[818],[2,256,[2,0,0,1,1]],819]],[1,"c3o5ulaSVKE6o2Xh53gpol",1,0],[1,-11.074,0,14.165],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,27.639,22.823,22.823],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_75",2,[[4,1,-1399,[0,"5bD/ViBa1PEq4+0D+3XjqR"],[820],[2,256,[2,0,0,1,1]],821]],[1,"55HtrNTV9BkpmmNuxloomQ",1,0],[1,-15.761,0,4.714],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,22.823186874389652,22.823186874389645,22.823186874389645],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_76",2,[[4,1,-1400,[0,"8dVB9JCxVF9bEkT8QzVQ1V"],[822],[2,256,[2,0,0,1,1]],823]],[1,"8ckiS3hIBHLpU0tTaCmiSh",1,0],[1,-15.761,0,7.579],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,25.853,22.823,22.823],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_77",2,[[4,1,-1401,[0,"3bpeq7FONPprZ3W8wWO+Ge"],[824],[2,256,[2,0,0,1,1]],825]],[1,"c5SZsm1y1DQbcPpItjtodQ",1,0],[1,-39.269,0,5.613],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,23.565,22.823,22.823],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_78",2,[[4,1,-1402,[0,"18K1QE/3dFkIXsSTd3GTJt"],[826],[2,256,[2,0,0,1,1]],827]],[1,"01KiZBpR1KkYFzh/BzvqQK",1,0],[1,-39.276,0,8.63],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,24.849,22.823,22.823],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_79",2,[[4,1,-1403,[0,"e1gvHSyCFKDrIMuEp3NgWv"],[828],[2,256,[2,0,0,1,1]],829]],[1,"f4XZBYmWFLLamnhQNhsUuJ",1,0],[1,-39.468,-0.019,18.14],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,26.727,22.823,22.823],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_80",2,[[4,1,-1404,[0,"4fHyViQCxAFrf0lB1b+jsX"],[830],[2,256,[2,0,0,1,1]],831]],[1,"16wyfS2TZJZrkgFwd62+sh",1,0],[1,-39.462,0,21.219],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,23.988,22.823,22.823],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_81",2,[[4,1,-1405,[0,"3dFxqu3NBNQoxVT/sY3CVL"],[832],[2,256,[2,0,0,1,1]],833]],[1,"b5l7V9yC1PcIlXAjOM9itY",1,0],[1,-47.205,0,17.936],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,22.823186874389652,22.823186874389645,22.823186874389645],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_82",2,[[4,1,-1406,[0,"18zbI3fy5FqJZHu84ZvaeY"],[834],[2,256,[2,0,0,1,1]],835]],[1,"aaVbX8dElImLJM0cRdV5Kz",1,0],[1,-47.252,0,8.913],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,22.823186874389652,22.823186874389645,22.823186874389645],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_83",2,[[4,1,-1407,[0,"56SuUXhL9BjK6fJDMJyB1F"],[836],[2,256,[2,0,0,1,1]],837]],[1,"5cWW20fQ9NDpVzFGAvy4kc",1,0],[1,-51.058,0,5.006],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,23.857,22.823,22.823],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_84",2,[[4,1,-1408,[0,"06QzV+MoZDkJtHFhMzfk5c"],[838],[2,256,[2,0,0,1,1]],839]],[1,"dfyEBT74hK64AMvCWdjc0q",1,0],[1,-50.953,0,21.477],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,22.823186874389652,22.823186874389645,22.823186874389645],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_85",2,[[4,1,-1409,[0,"d38r0IP/xFspAT7ipxmoq2"],[840],[2,256,[2,0,0,1,1]],841]],[1,"cfmaC+jmlM4b2G1RZfD34P",1,0],[1,-35.503,0,1.877],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,23.86,22.823,22.823],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_86",2,[[4,1,-1410,[0,"efo2X2dvRCybJPNi2b2Rh2"],[842],[2,256,[2,0,0,1,1]],843]],[1,"3ag2SnKplNubt8zVuPDF0H",1,0],[1,-35.478,0,-6.681],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,22.823186874389652,22.823186874389645,22.823186874389645],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_87",2,[[4,1,-1411,[0,"5cyM4ovbtLwZOorlZMwVEG"],[844],[2,256,[2,0,0,1,1]],845]],[1,"40/kX2wApOKrMo1GGf8vTS",1,0],[1,-19.202,0,1.646],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,22.823186874389652,22.823186874389645,22.823186874389645],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_88",2,[[4,1,-1412,[0,"8fcx3w/dpGAIgacFDWA7jA"],[846],[2,256,[2,0,0,1,1]],847]],[1,"d3z7eLHG5EsIwPp4/31y35",1,0],[1,11.459,0,26.553],[3,-4.3297802811774664e-17,0.7071067811865476,0.7071067811865475,4.329780281177467e-17],[1,64.228,22.823,22.823],[1,-89.99999999999999,180,0]],[3,"wall_91",2,[[4,1,-1413,[0,"a3M1P+2nFGUKqePN44o+Xg"],[848],[2,256,[2,0,0,1,1]],849]],[1,"ed3J6WIOJD9oXkLEGjPH9e",1,0],[1,3.584,0,20.441],[3,-4.3297802811774664e-17,0.7071067811865476,0.7071067811865475,4.329780281177467e-17],[1,43.629,22.823,22.823],[1,-89.99999999999999,180,0]],[3,"wall_93",2,[[4,1,-1414,[0,"22AYhrLEBCHospTGMaNXGU"],[850],[2,256,[2,0,0,1,1]],851]],[1,"73115488BIvLNnAU5SCQkk",1,0],[1,29.345,0,37.87],[3,-0.2705980500730985,-0.6532814824381885,-0.653281482438188,0.27059805007309856],[1,22.823186874389645,22.82318687438964,22.823186874389645],[1,-89.99999999999996,-135,6.3611093629270335e-15]],[3,"wall_94",2,[[4,1,-1415,[0,"ddTQr3l2pIibojwwMl+ybx"],[852],[2,256,[2,0,0,1,1]],853]],[1,"95Hxce3xROE6XADCisKLMS",1,0],[1,27.296,0,39.909],[3,-0.2705980500730985,-0.6532814824381885,-0.653281482438188,0.27059805007309856],[1,22.823186874389645,22.82318687438964,22.823186874389645],[1,-89.99999999999996,-135,6.3611093629270335e-15]],[3,"wall_95",2,[[4,1,-1416,[0,"8a8AFURiZJ8ZRowR3Ku5w+"],[854],[2,256,[2,0,0,1,1]],855]],[1,"4doNghZ3ZMkKwbtgDpdDpo",1,0],[1,17.923,0,44.488],[3,-0.2705980500730985,-0.6532814824381885,-0.653281482438188,0.27059805007309856],[1,22.823186874389645,22.82318687438964,22.823186874389645],[1,-89.99999999999996,-135,6.3611093629270335e-15]],[3,"wall_96",2,[[4,1,-1417,[0,"64vDvwP5FLh7+qlJCeUhH2"],[856],[2,256,[2,0,0,1,1]],857]],[1,"0fuD4rytJJ16u1LKD756jk",1,0],[1,16.093,0,46.318],[3,-0.2705980500730985,-0.6532814824381885,-0.653281482438188,0.27059805007309856],[1,22.823186874389645,22.82318687438964,22.823186874389645],[1,-89.99999999999996,-135,6.3611093629270335e-15]],[3,"wall_97",2,[[4,1,-1418,[0,"e64ZXUg1JPXLJB0WQUrZan"],[858],[2,256,[2,0,0,1,1]],859]],[1,"f0jDOfZuhM97+UY3r7OiUZ",1,0],[1,-13.616,0,25.057],[3,-0.2705980500730985,-0.6532814824381885,-0.653281482438188,0.27059805007309856],[1,26.775,22.823,22.823],[1,-89.99999999999996,-135,6.3611093629270335e-15]],[3,"wall_98",2,[[4,1,-1419,[0,"77HTT8LSdCIaJg28fBP9W+"],[860],[2,256,[2,0,0,1,1]],861]],[1,"19Dq25FvRLiK9zaJlh2m2K",1,0],[1,-11.413,0,22.854],[3,-0.2705980500730985,-0.6532814824381885,-0.653281482438188,0.27059805007309856],[1,24.946,22.823,22.823],[1,-89.99999999999996,-135,6.3611093629270335e-15]],[3,"wall_99",2,[[4,1,-1420,[0,"ddNhtRTG9MIpNDTpvtNu48"],[862],[2,256,[2,0,0,1,1]],863]],[1,"92KoRwjGhEpaziM90URCIc",1,0],[1,16.997,0,13.084],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,22.823186874389652,22.823186874389645,22.823186874389645],[1,-90,-90,-3.1805546814635168e-15]],[3,"wall_100",2,[[4,1,-1421,[0,"dcSw2NtG9KBo3IgRTeeDPl"],[864],[2,256,[2,0,0,1,1]],865]],[1,"f3JF2gvYJNz4vqt74nhgzH",1,0],[1,16.591,0,25.719],[3,-0.25014647845257404,-0.6613824455772741,-0.661382445577274,0.2501464784525741],[1,23.655,22.823,22.823],[1,-90,-138.565,0]],[3,"wall_102",2,[[4,1,-1422,[0,"a3/C3GctBGIIkuKzTiZvIY"],[866],[2,256,[2,0,0,1,1]],867]],[1,"d1Uc38sjFIoar8bWtFnIEU",1,0],[1,42.365,0,21.758],[3,-0.2705980500730985,-0.6532814824381885,-0.653281482438188,0.27059805007309856],[1,26.35,23.598,22.823],[1,-89.99999999999996,-135,6.3611093629270335e-15]],[3,"wall_103",2,[[4,1,-1423,[0,"ff7cFOQZpPa6Lxcb/0jBvh"],[868],[2,256,[2,0,0,1,1]],869]],[1,"c7mBz7LJlJiImDQ9fSSP6G",1,0],[1,44.687,0,19.446],[3,-0.2705980500730985,-0.6532814824381885,-0.653281482438188,0.27059805007309856],[1,26.469,23.339,22.823],[1,-89.99999999999996,-135,6.3611093629270335e-15]],[3,"wall_104",2,[[4,1,-1424,[0,"305ZuNNYxGwKdgOBRhSBVm"],[870],[2,256,[2,0,0,1,1]],871]],[1,"aedJ8DbA9MJqrebAwko1RN",1,0],[1,-10.971,0,9.28],[3,-0.2705980500730984,0.6532814824381885,0.653281482438188,0.2705980500730987],[1,24.857,22.823,22.823],[1,-89.99999999999996,135,6.3611093629270335e-15]],[3,"wall_105",2,[[4,1,-1425,[0,"44wzGLHbdMX6L3HFOuvkWh"],[872],[2,256,[2,0,0,1,1]],873]],[1,"f3l43TmxhPC475OiJ8PKhc",1,0],[1,-13.091,0,7.16],[3,-0.2705980500730984,0.6532814824381885,0.653281482438188,0.2705980500730987],[1,22.823186874389645,22.82318687438964,22.823186874389645],[1,-89.99999999999996,135,6.3611093629270335e-15]],[3,"wall_107",2,[[4,1,-1426,[0,"94HHeH8PdK8JykTbBu/EF4"],[874],[2,256,[2,0,0,1,1]],875]],[1,"9002EP3N9HfLFSmMUFPqCC",1,0],[1,-58.109,0,19.996],[3,-0.2705980500730984,0.6532814824381885,0.653281482438188,0.2705980500730987],[1,26.529,22.823,22.823],[1,-89.99999999999996,135,6.3611093629270335e-15]],[3,"wall_109",2,[[4,1,-1427,[0,"53jcJhfO9CaKd/Lw+Js6bE"],[876],[2,256,[2,0,0,1,1]],877]],[1,"20MbD50rFAfbTLmjH3RoTb",1,0],[1,-8.892,0,42.324],[3,-0.1993910014344216,0.6784122850796398,0.6784122850796397,0.19939100143442165],[1,35.606,22.823,22.823],[1,-90,147.243,0]],[3,"wall_110",2,[[4,1,-1428,[0,"d9KYXqtahIOpbv2036h44J"],[878],[2,256,[2,0,0,1,1]],879]],[1,"882xgQI1ZI6KXlVhrTf/XR",1,0],[1,8.183,0,36.544],[3,-4.575107227846807e-17,-0.7071067811865475,-0.7071067811865476,4.084453334508126e-17],[1,67.901,24,22.823],[1,-90.00000000000001,-180,3.975693351829396e-16]],[3,"wall_112",2,[[4,1,-1429,[0,"515q28ZeVPfY8/Vw++pGKQ"],[880],[2,256,[2,0,0,1,1]],881]],[1,"1d9C4GIZ1NTKZ41l4iNhHd",1,0],[1,18.125,-4.971,36.653],[3,-4.575107227846807e-17,-0.7071067811865475,-0.7071067811865476,4.084453334508126e-17],[1,25.755,25,22.823],[1,-90.00000000000001,-180,3.975693351829396e-16]],[3,"wall_113",2,[[4,1,-1430,[0,"ee70w38alGSZ4NoT9ggEFD"],[882],[2,256,[2,0,0,1,1]],883]],[1,"7fsQZpqBZFgI3F3l25dhGB",1,0],[1,44.729,0,8.786],[3,-0.653281482438188,-0.2705980500730987,-0.27059805007309834,0.6532814824381885],[1,23.516,22.823,22.823],[1,-89.99999999999996,-45,6.3611093629270335e-15]],[3,"wall_114",2,[[4,1,-1431,[0,"2fAUuyQz9HKZLzCL1+LOOm"],[884],[2,256,[2,0,0,1,1]],885]],[1,"2fDWshgXlKxbJOOkVEQI0l",1,0],[1,42.674,0,6.729],[3,-0.653281482438188,-0.2705980500730987,-0.27059805007309834,0.6532814824381885],[1,23.054,22.823,22.823],[1,-89.99999999999996,-45,6.3611093629270335e-15]],[3,"wall_115",2,[[4,1,-1432,[0,"85tEn4PjtNXZyl/JY/o2f9"],[886],[2,256,[2,0,0,1,1]],887]],[1,"54B7pxrVtAsJeFdZ/YDkcn",1,0],[1,3.106,0,24.46],[3,-0.5963678105290181,-0.3799281965909153,-0.37992819659091526,0.5963678105290182],[1,20.573,22.823,22.823],[1,-90,-65,0]],[3,"wall_118",2,[[4,1,-1433,[0,"0dAhYghi1LdoFVrvjVPXF3"],[888],[2,256,[2,0,0,1,1]],889]],[1,"37UZqYKs5DkL+2VfIRQSUL",1,0],[1,-14.574,0,10.26],[3,-0.6758966929167257,-0.20775865927617398,-0.20775865927617396,0.6758966929167258],[1,25.196,22.823,22.823],[1,-90,-34.173,0]],[3,"wall_116",2,[[4,1,-1434,[0,"91Jb6x8FpGW75zyAw1wU+S"],[890],[2,256,[2,0,0,1,1]],891]],[1,"eaq6WIjNlL+Z9r5KDNKnrA",1,0],[1,-17.236,0,3.672],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_119",2,[[4,1,-1435,[0,"afS7kjnJlHU5tarneF01Hp"],[892],[2,256,[2,0,0,1,1]],893]],[1,"dbfi20XSJCBr3slGM+Nc5U",1,0],[1,-25.083,0,3.672],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_120",2,[[4,1,-1436,[0,"8aCuuXtwZOvYW+15+3oFvL"],[894],[2,256,[2,0,0,1,1]],895]],[1,"e7YilmctpAtYTNhVCVVkSB",1,0],[1,-26.789,0,5.503],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,24.455,22.823,22.823],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_121",2,[[4,1,-1437,[0,"42jNO6aGZDE75UwC0VT0nb"],[896],[2,256,[2,0,0,1,1]],897]],[1,"7bQiY4IsJK+4roN0GxOi4j",1,0],[1,-26.789,0,11.567],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,23.889,22.823,22.823],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_122",2,[[4,1,-1438,[0,"b0F2lWcnxFLb76gBcYVeMY"],[898],[2,256,[2,0,0,1,1]],899]],[1,"dbEM9xwpdNg5xiAM54N74J",1,0],[1,-26.789,0,8.553],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,23.708,22.823,22.823],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_123",2,[[4,1,-1439,[0,"ecV/IyX+xOPqhtsGLa+oU8"],[900],[2,256,[2,0,0,1,1]],901]],[1,"55vKX1eC9PsarE5w4aRl0T",1,0],[1,-26.789,0,14.583],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,24.455,22.823,22.823],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_124",2,[[4,1,-1440,[0,"4eznCrf1BOzZ+ZBfToqEJ5"],[902],[2,256,[2,0,0,1,1]],903]],[1,"99LTt6sWVK25ZoYZ94GlMz",1,0],[1,-34.466,0,6.214],[3,-0.653281482438188,0.27059805007309856,0.27059805007309845,0.6532814824381885],[1,29.157,22.823,22.823],[1,-89.99999999999996,45,6.3611093629270335e-15]],[3,"wall_125",2,[[4,1,-1441,[0,"7dZV7ldZNHobZgsw6ouenS"],[904],[2,256,[2,0,0,1,1]],905]],[1,"cfyHUex+xKypBfbd6QHAZq",1,0],[1,-58.133,0,6.549],[3,-0.653281482438188,0.27059805007309856,0.27059805007309845,0.6532814824381885],[1,26.712,22.823,22.823],[1,-89.99999999999996,45,6.3611093629270335e-15]],[3,"wall_127",2,[[4,1,-1442,[0,"72iqbANTZCkqK1pJvVJNYQ"],[906],[2,256,[2,0,0,1,1]],907]],[1,"60ELggJlRBl63vdtGG+F6L",1,0],[1,-45.861,0,-7.277],[3,-0.653281482438188,0.27059805007309856,0.27059805007309845,0.6532814824381885],[1,27.176,22.823,22.823],[1,-89.99999999999996,45,6.3611093629270335e-15]],[3,"wall_128",2,[[4,1,-1443,[0,"20jn76eLBLD7f8NqV3w3+Z"],[908],[2,256,[2,0,0,1,1]],909]],[1,"a1pw6NrW1Ngr8mj14E9COp",1,0],[1,8.888,0,9.865],[3,-0.6725785541610512,0.21826151397493312,0.2182615139749331,0.6725785541610513],[1,24.218,22.823,22.823],[1,-90,35.958,0]],[3,"wall_129",2,[[4,1,-1444,[0,"93Dq7QpftDVahT/fJumU5q"],[910],[2,256,[2,0,0,1,1]],911]],[1,"1b0wkjXqpBCoEgniY3uCkt",1,0],[1,11.359,0,8.072],[3,-0.6725785541610512,0.21826151397493312,0.2182615139749331,0.6725785541610513],[1,24.224,22.823,22.823],[1,-90,35.958,0]],[3,"wall_130",2,[[4,1,-1445,[0,"9agwGRllBBLrjlGfFhGFw8"],[912],[2,256,[2,0,0,1,1]],913]],[1,"5c67MmdQpJRoNU3kLp8Qw+",1,0],[1,-9.245,0,25.074],[3,-0.6446573549227566,0.2905458565252566,0.2905458565252566,0.6446573549227567],[1,33.63,22.823,22.823],[1,-90,48.522,0]],[3,"wall_131",2,[[4,1,-1446,[0,"a9HlTj3uFAia77hkDCjuNV"],[914],[2,256,[2,0,0,1,1]],915]],[1,"1bbaFmf4NIVZ141ffYUAL4",1,0],[1,-6.955,0,23.538],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,18.165,22.823,22.823],[1,-90.00000000000003,0,0]],[3,"wall_132",2,[[4,1,-1447,[0,"85R/wjQTlGUrVL+ENfwKPY"],[916],[2,256,[2,0,0,1,1]],917]],[1,"f8BN4dhG9Grp+EBbpj6Noh",1,0],[1,20.653,0,30.485],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,17.657,22.823,22.823],[1,-90.00000000000003,0,0]],[3,"wall_133",2,[[4,1,-1448,[0,"7483hZiZVGrpK3LQPvD6NH"],[918],[2,256,[2,0,0,1,1]],919]],[1,"85E3Vo+DxMGYg8ZpNogj0l",1,0],[1,1.844,0,23.567],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,15.125,22.823,22.823],[1,-90.00000000000003,0,0]],[3,"wall_134",2,[[4,1,-1449,[0,"2eCtOen9RM85PCt01MIJT0"],[920],[2,256,[2,0,0,1,1]],921]],[1,"d1BXTXNV9FoJWL1H7qtCmw",1,0],[1,6.899,0,25.17],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,22.647,22.823,22.823],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_135",2,[[4,1,-1450,[0,"adnsZCGUZEZ4Tfl6sO6TZ7"],[922],[2,256,[2,0,0,1,1]],923]],[1,"1fRUNpGt9HpazLFaMEyiyT",1,0],[1,6.899,0,22.379],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,22.118,22.823,22.823],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_136",2,[[4,1,-1451,[0,"d5qVkz1GFMVZNbAx0lbKR5"],[924],[2,256,[2,0,0,1,1]],925]],[1,"07Pz8nJQJGnLjgzjNW5Ozk",1,0],[1,-23.339,0,1.714],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,22.284,22.823,22.823],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_137",2,[[4,1,-1452,[0,"fbaqCKy8VIGY4vsD0Ok24C"],[926],[2,256,[2,0,0,1,1]],927]],[1,"43umZbzw9Fxa/jYa19MSZf",1,0],[1,18.001,0,2.942],[3,-0.23021144975504482,0.6685825965441222,0.6685825965441221,0.23021144975504487],[1,20.602,22.823,22.823],[1,-90,142,0]],[3,"wall_138",2,[[4,1,-1453,[0,"4dSPHL4VRH55eRs0BrKdS0"],[928],[2,256,[2,0,0,1,1]],929]],[1,"b4IrHHq7xD4rXjo9aZzUHb",1,0],[1,20.227,0,38.6],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_139",2,[[4,1,-1454,[0,"81/tSauJ9F96Mbp6om5b77"],[930],[2,256,[2,0,0,1,1]],931]],[1,"99+BObKlZOJ5ij7MypS7/N",1,0],[1,20.227,0,41.468],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_140",2,[[4,1,-1455,[0,"e8ZJIitlhJ8ZYaJwt/kvUw"],[932],[2,256,[2,0,0,1,1]],933]],[1,"a22srRmcJI36iMuh90GGZu",1,0],[1,-29.156,0,6.368],[3,-0.6336818039711184,-0.3137632408614958,-0.31376324086149576,0.6336818039711185],[1,30.608,22.823,22.823],[1,-90,-52.684,0]],[3,"wall_142",2,[[4,1,-1456,[0,"29pZZyVnhIobs5DHVIKwMC"],[934],[2,256,[2,0,0,1,1]],935]],[1,"bfii9wgvNLQJFLinaMwPbD",1,0],[1,-55.839,0,22.266],[3,-0.2705980500730984,0.6532814824381885,0.653281482438188,0.2705980500730987],[1,26.529,22.823,22.823],[1,-89.99999999999996,135,6.3611093629270335e-15]],[3,"wall_126",2,[[4,1,-1457,[0,"d0iW6oRnNLw4qY9sgKNrX9"],[936],[2,256,[2,0,0,1,1]],937]],[1,"0e1b7AMM1FRYrP5XV9+bz6",1,0],[1,-55.742,0,4.158],[3,-0.653281482438188,0.27059805007309856,0.27059805007309845,0.6532814824381885],[1,26.712,22.823,22.823],[1,-89.99999999999996,45,6.3611093629270335e-15]],[3,"wall_106",2,[[4,1,-1458,[0,"82OT6ZrVtLAK/965R9Dl3V"],[938],[2,256,[2,0,0,1,1]],939]],[1,"007gadsIRE9qqbp5syIqVd",1,0],[1,-45.808,0,34.091],[3,-0.24629257171157223,0.6628272543579511,0.662827254357951,0.24629257171157226],[1,31.111,22.823,22.823],[1,-90,139.232,0]],[3,"wall_143",2,[[4,1,-1459,[0,"6fF8+C5xhJIo7QGc1e1uE0"],[940],[2,256,[2,0,0,1,1]],941]],[1,"86SXACiTZPo5/d3MnOXCLq",1,0],[1,11.038,0,37.387],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,25,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_144",2,[[4,1,-1460,[0,"24G809Uy5JGZgZ0ePcvH0o"],[942],[2,256,[2,0,0,1,1]],943]],[1,"27YNHcEZxA1oPKLs6kxHqq",1,0],[1,8.166,0,37.387],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,25,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_146",2,[[4,1,-1461,[0,"55QvnApbRMB4H9+Rf9DeZK"],[944],[2,256,[2,0,0,1,1]],945]],[1,"9fUqXsbNVPaLYmK6Xsiw1r",1,0],[1,20.227,0,30.598],[3,0.5000000000000001,-0.4999999999999999,-0.5,-0.5],[1,14.022,22.823,22.823],[1,-90.00000000000003,89.99999999999999,0]],[3,"wall_101",2,[[4,1,-1462,[0,"fc9gka0FpBLay+r2KQqRqL"],[946],[2,256,[2,0,0,1,1]],947]],[1,"4eG8uDZ31HkarQxoAvDg7q",1,0],[1,18.832,0,23.741],[3,-0.25014647845257404,-0.6613824455772741,-0.661382445577274,0.2501464784525741],[1,24.335,22.823,22.823],[1,-90,-138.565,0]],[3,"wall_141",2,[[4,1,-1463,[0,"d0wJqE6I5FMIYFQ00N/4bZ"],[948],[2,256,[2,0,0,1,1]],949]],[1,"efVNcXEVZNHbmOldsyV/wR",1,0],[1,-11.942,0,12.046],[3,-0.6758966929167257,-0.20775865927617398,-0.20775865927617396,0.6758966929167258],[1,25.196,22.823,22.823],[1,-90,-34.173,0]],[3,"wall_147",2,[[4,1,-1464,[0,"cex/ShhuNFPZSkGFQlAOXQ"],[950],[2,256,[2,0,0,1,1]],951]],[1,"154AvZlT9LHJZK6aM7rN+K",1,0],[1,17.368,0,37.347],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,22.82318687438965,25,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_117",2,[[4,1,-1465,[0,"8a8c9matxNoZAvgXQwNuba"],[952],[2,256,[2,0,0,1,1]],953]],[1,"93T6dTxrRPka3jobPAiXFK",1,0],[1,17.36,0,36.45],[3,4.575107227846807e-17,0.7071067811865475,0.7071067811865476,-4.084453334508125e-17],[1,23,25,22.823186874389645],[1,-90.00000000000003,-180,3.975693351829403e-16]],[3,"wall_04",20,[[4,1,-1466,[0,"91wz6VnT5L/ZkxHR6zfnnU"],[954],[2,256,[2,0,0,1,1]],955]],[1,"ffKx7nkcRF6aTPJcqAPFQh",1,0],[1,0.124,0,-10.665],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_04",20,[[4,1,-1467,[0,"64qI0JoGtI5r57S/EApScj"],[956],[2,256,[2,0,0,1,1]],957]],[1,"d1Ez5F3hBAi4c5nKnjHy9I",1,0],[1,2.97,0,-10.665],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_04",20,[[4,1,-1468,[0,"b8LZl/L25Jr60yQsvOy1sS"],[958],[2,256,[2,0,0,1,1]],959]],[1,"38KOBvNcJHPq4EIR/qUk56",1,0],[1,5.836,0,-10.665],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_04",20,[[4,1,-1469,[0,"ccQ9gh3DFAuJGqKuOnz1qO"],[960],[2,256,[2,0,0,1,1]],961]],[1,"3cyhT875dD8bLBjoMotk/y",1,0],[1,8.698,0,-10.665],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_04",20,[[4,1,-1470,[0,"8dzcH4pUFGl4358dSEXx+/"],[962],[2,256,[2,0,0,1,1]],963]],[1,"6btsjXjxdFJp3I/sB9+kzx",1,0],[1,11.533,0,-10.665],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,22.82318687438965,22.823186874389652,22.823186874389652],[1,-90.00000000000003,0,0]],[3,"wall_03",20,[[4,1,-1471,[0,"86a8JKSc5KN7atbfK8Q7eb"],[964],[2,256,[2,0,0,1,1]],965]],[1,"eeOv9LW3hB8rw1cEV6jLcp",1,0],[1,35.037,0,-5.245],[3,-0.6592747942523933,-0.25564965414305657,-0.25564965414305657,0.6592747942523934],[1,18.564,22.823,22.823],[1,-90,-42.39,0]],[3,"wall_05",20,[[4,1,-1472,[0,"cd9baw071FVKIx2clJhqsZ"],[966],[2,256,[2,0,0,1,1]],967]],[1,"20ZPstQl5OhJdI9Grwr/x7",1,0],[1,36.859,0,-3.582],[3,-0.6592747942523933,-0.25564965414305657,-0.25564965414305657,0.6592747942523934],[1,21.261,22.823,22.823],[1,-90,-42.39,0]],[3,"wall_06",20,[[4,1,-1473,[0,"depq7jXpNISZ7KfW0K2UeC"],[968],[2,256,[2,0,0,1,1]],969]],[1,"1f7Mo4+f9MGJ9wde1CwoIG",1,0],[1,38.78,0,-1.827],[3,-0.6592747942523933,-0.25564965414305657,-0.25564965414305657,0.6592747942523934],[1,20.331,22.823,22.823],[1,-90,-42.39,0]],[3,"door_L",22,[[4,1,-1474,[0,"587UGI0uVG16EwKcrdhFTr"],[970],[2,256,[2,0,0,1,1]],971]],[1,"33CRkLAH1GcYj3Y9HSSuzJ",1,0],[1,-3.632,0,0.019],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,1,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_R",22,[[4,1,-1475,[0,"02Za7wGldIg4ec9DmqezmH"],[972],[2,256,[2,0,0,1,1]],973]],[1,"55JIXSZ79AI5M6cAzXmWzB",1,0],[1,3.632,0,0.019],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,1,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_L",23,[[4,1,-1476,[0,"15G8WErnNPrY8Z/ipCgHPT"],[976],[2,256,[2,0,0,1,1]],977]],[1,"96rJcKAb5B/IbBiIEPsX2f",1,0],[1,-3.259,0,0.019],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,1,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_R",23,[[4,1,-1477,[0,"048hnQkR5JbKZU+Oe8pu5g"],[978],[2,256,[2,0,0,1,1]],979]],[1,"45QIeYinlMDrEjsp2zUBAB",1,0],[1,3.416,0,0.019],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,1,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_L",24,[[4,1,-1478,[0,"0973zm22JOKoG+462shdSb"],[982],[2,256,[2,0,0,1,1]],983]],[1,"4d82hERAZJV77Qd9zmTgYP",1,0],[1,-3.083,0,0.019],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,1,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_R",24,[[4,1,-1479,[0,"62xAOSLhJFvZEKulNP7XoU"],[984],[2,256,[2,0,0,1,1]],985]],[1,"cb65wHFDxJb421DSSBCJd3",1,0],[1,3.297,0,0.019],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,1,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_L",25,[[4,1,-1480,[0,"a8yEvkaq5B5qbSE5Y6AYGF"],[988],[2,256,[2,0,0,1,1]],989]],[1,"8cKmIAW59LYpyZY65z0baI",1,0],[1,-2.644,0,0.228],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,0.8,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_R",25,[[4,1,-1481,[0,"c7Es0CLPFJ2qeHwc9i0mrj"],[990],[2,256,[2,0,0,1,1]],991]],[1,"27fM2fRhBC36vj+pMvUUzC",1,0],[1,3.044,0,0.156],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,0.8,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_L",26,[[4,1,-1482,[0,"ed2kSG0ENPaq7dufBWfbsO"],[994],[2,256,[2,0,0,1,1]],995]],[1,"a8bTW0LeBIZKqoP60KsVb7",1,0],[1,-3.688,0,0.019],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,1,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_R",26,[[4,1,-1483,[0,"cedNQnRcREaL9ZeNTRkl37"],[996],[2,256,[2,0,0,1,1]],997]],[1,"4f9FxdUfFF/ZGyD2ZLUP1O",1,0],[1,3.357,0,0.019],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,1,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_L",27,[[4,1,-1484,[0,"f2jh20NCdPEqNmB6VK0iX/"],[1000],[2,256,[2,0,0,1,1]],1001]],[1,"549Vz4OkFEArUjc86VwHj0",1,0],[1,-2.829,0,0.019],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,1,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_R",27,[[4,1,-1485,[0,"0355B4kGVCz6xaYpUbYPgs"],[1002],[2,256,[2,0,0,1,1]],1003]],[1,"4bfsFHBTNIuKpNH1ZjbbsU",1,0],[1,3.142,0,0.019],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,1,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_L",28,[[4,1,-1486,[0,"89o4XuNfVDN79oLvEIxH5j"],[1006],[2,256,[2,0,0,1,1]],1007]],[1,"4febloOwZJV5H5kpkNouU0",1,0],[1,-2.829,0,0.019],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,1,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_R",28,[[4,1,-1487,[0,"b5v3XwA+VEfqibC9PYb50z"],[1008],[2,256,[2,0,0,1,1]],1009]],[1,"4dfFsMfkJBTL3Heacw3K23",1,0],[1,3.142,0,0.019],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,1,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_L",29,[[4,1,-1488,[0,"a6d1aoLqdLrIJH+ENnDDjj"],[1012],[2,256,[2,0,0,1,1]],1013]],[1,"b8/UEEZ5lPmJnd5rWsJs+w",1,0],[1,-2.956,0,0.019],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,1,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_R",29,[[4,1,-1489,[0,"9bQ4TDMKBOH6Q14QAYG+Qj"],[1014],[2,256,[2,0,0,1,1]],1015]],[1,"f7hrGRA81Kv6ADAKeMyrZZ",1,0],[1,2.88,0,0.019],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,1,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_L",30,[[4,1,-1490,[0,"7df/uwbRlMIp7yh4l81+1X"],[1018],[2,256,[2,0,0,1,1]],1019]],[1,"34QNOSoA9I1bGk8MUAXv6i",1,0],[1,-2.956,0,0.019],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,1,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_R",30,[[4,1,-1491,[0,"b1rdnGzD1D0Leed/0ENcZp"],[1020],[2,256,[2,0,0,1,1]],1021]],[1,"5aINFoo79M6Zg+wQcte1Zf",1,0],[1,2.88,0,0.019],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,1,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_L",31,[[4,1,-1492,[0,"f44486bJNJHJQ04BUZkGFx"],[1024],[2,256,[2,0,0,1,1]],1025]],[1,"7foFrbMzJIC43y2FGnoU2l",1,0],[1,-2.956,0,0.019],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,1,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_R",31,[[4,1,-1493,[0,"cdNseHll1HE7rnxJHSDHpX"],[1026],[2,256,[2,0,0,1,1]],1027]],[1,"0fthX5HINPVanZFmH9dX3D",1,0],[1,2.88,0,0.019],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,1,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_L",32,[[4,1,-1494,[0,"6aIajGQT1OxbVP3CXQHcb5"],[1030],[2,256,[2,0,0,1,1]],1031]],[1,"305U6bteRBnI5PzJXFySD3",1,0],[1,-2.956,0,0.019],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,1,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_R",32,[[4,1,-1495,[0,"d5Lgex5IFEjpY/lHAvenoO"],[1032],[2,256,[2,0,0,1,1]],1033]],[1,"333FRZed9Ot5c5nu54Qu5i",1,0],[1,2.88,0,0.019],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,1,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_L",33,[[4,1,-1496,[0,"05jyuqgkxAiaXRn84DLUAX"],[1036],[2,256,[2,0,0,1,1]],1037]],[1,"13XawrTDVAl6fRG5GkjxVu",1,0],[1,-2.956,0,0.019],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,1,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_R",33,[[4,1,-1497,[0,"a5tXNN12FHU6duHWP7R5C3"],[1038],[2,256,[2,0,0,1,1]],1039]],[1,"8aaPCx4d9BxZc0gXYgbMEk",1,0],[1,2.88,0,0.019],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,1,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_L",34,[[4,1,-1498,[0,"06+ue0jLNKxYCHTE9Mvc8l"],[1042],[2,256,[2,0,0,1,1]],1043]],[1,"89mVIGWGhIira1CekbvnQw",1,0],[1,-2.956,0,0.019],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,1,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_R",34,[[4,1,-1499,[0,"84isKmr6tEprO4gB4rMzrw"],[1044],[2,256,[2,0,0,1,1]],1045]],[1,"79dn73sj5NOK+cjlaSkXfh",1,0],[1,2.88,0,0.019],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,1,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_L",35,[[4,1,-1500,[0,"59O2F+oJtEs6FFCh9/Cfan"],[1048],[2,256,[2,0,0,1,1]],1049]],[1,"d9REaBLT5Ba4S3deEt42iM",1,0],[1,-2.956,0,0.019],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,1,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_R",35,[[4,1,-1501,[0,"44kpzIO41DGb4KtQiX1gsv"],[1050],[2,256,[2,0,0,1,1]],1051]],[1,"0aWUfsd+RO5JRlsm0Oyp0m",1,0],[1,2.88,0,0.019],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,1,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_L",36,[[4,1,-1502,[0,"b8IkmuZ8NE8qRryUYUQ4+C"],[1054],[2,256,[2,0,0,1,1]],1055]],[1,"33dVYJLRdJ/aEyTc8IWpzP",1,0],[1,-2.956,0,0.019],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,1,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_R",36,[[4,1,-1503,[0,"78zePHsOJLqoNeGlfGCujD"],[1056],[2,256,[2,0,0,1,1]],1057]],[1,"d1pbiGvuNNtJhxPy3dYwar",1,0],[1,2.88,0,0.019],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,1,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_L",37,[[4,1,-1504,[0,"361iFvx21CTYIe71oB3i55"],[1060],[2,256,[2,0,0,1,1]],1061]],[1,"7b1O+lEnlPWJMO8cqdO9yG",1,0],[1,-2.956,0,0.019],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,1,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_R",37,[[4,1,-1505,[0,"88hyMCG0dCr4g8XedfZfwC"],[1062],[2,256,[2,0,0,1,1]],1063]],[1,"54iQLdIwxPtILc/yk8MlGA",1,0],[1,2.88,0,0.019],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,1,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_L",38,[[4,1,-1506,[0,"804Djjk4xKvKFNO0Y/MCsn"],[1066],[2,256,[2,0,0,1,1]],1067]],[1,"b1sfAkZXpDALuHsi5/g+G7",1,0],[1,-2.956,0,0.019],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,1,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_R",38,[[4,1,-1507,[0,"3dVP5qjGhDfafkQGpYgy8H"],[1068],[2,256,[2,0,0,1,1]],1069]],[1,"c3oIt2rcpM+4R/QiNQXygn",1,0],[1,2.88,0,0.019],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,1,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_L",39,[[4,1,-1508,[0,"75hWqxWphPWpYzhNL9Nxp4"],[1072],[2,256,[2,0,0,1,1]],1073]],[1,"deKdhjsYxLsZnGgFtIH64/",1,0],[1,-2.956,0,0.019],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,1,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_R",39,[[4,1,-1509,[0,"20PSDFmOFPOptZwgZTeUyv"],[1074],[2,256,[2,0,0,1,1]],1075]],[1,"17I5x3jF1C/5V3urmtC8Kt",1,0],[1,2.88,0,0.019],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,1,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_L",40,[[4,1,-1510,[0,"2aU7nmIsRGL6AT3iJwLv5U"],[1078],[2,256,[2,0,0,1,1]],1079]],[1,"40jSJ0+HdHg7/EzOV7oIQn",1,0],[1,-2.956,0,0.019],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,1,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[3,"door_R",40,[[4,1,-1511,[0,"65eq+jRrxL4pBbMynbERLP"],[1080],[2,256,[2,0,0,1,1]],1081]],[1,"34D6uySKVDgYOOgx7hNlgU",1,0],[1,2.88,0,0.019],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,1,1.2,1],[1,-90,-90,3.1805546814635168e-15]],[11,"CAMR_W",18,[[4,1,-1512,[0,"39J3XhAOtERrN5X1sVOiT4"],[1084,1085,1086],[2,256,[2,0,0,1,1]],1087]],[1,"58zUzSWS5P0pf1kOS6B1cd",1,0],[1,0,0,-0.589],[3,-0.6375345011241361,-0.3058590523041599,-0.30585905230415983,0.6375345011241362],[1,-90,-51.259,0]],[11,"CAMR_W-001",18,[[4,1,-1513,[0,"e6GaGtXI9PVZrQn1MCxv1U"],[1088,1089,1090],[2,256,[2,0,0,1,1]],1091]],[1,"edaU2mHVpOUYvTXuzQAOpw",1,0],[1,19.98,-0.057,-12.408],[3,-0.6415898511265656,-0.2972582428317022,-0.2972582428317022,0.6415898511265657],[1,-90,-49.718,0]],[11,"CAMR_W-002",18,[[4,1,-1514,[0,"f471017yNAEYRICnkG/ucl"],[1092,1093,1094],[2,256,[2,0,0,1,1]],1095]],[1,"11Q9MA4CZBaKjIVzMsDT/D",1,0],[1,66.357,-0.057,-28.078],[3,-0.4323563260645517,-0.5595248049121353,-0.5595248049121352,0.43235632606455177],[1,-90,-104.612,0]],[11,"CAMR_W-003",18,[[4,1,-1515,[0,"dccr8i1kpMuaVHEUvI4a0y"],[1096,1097,1098],[2,256,[2,0,0,1,1]],1099]],[1,"7fkSSwM5ZAQKHddEBW9cbP",1,0],[1,43.738,-0.057,-54.032],[3,-0.49963771305504523,-0.5003620246312906,-0.5003620246312905,0.4996377130550453],[1,-90,-90.083,0]],[11,"CAMR_W-004",18,[[4,1,-1516,[0,"84fQEk/+FOO62WzFnBXujF"],[1100,1101,1102],[2,256,[2,0,0,1,1]],1103]],[1,"7anGUuYZ1LbqefNURyM4M9",1,0],[1,52.225,-0.057,9.432],[3,-0.2976221252893082,-0.6414211335295052,-0.6414211335295051,0.29762212528930826],[1,-90,-130.217,0]],[11,"CAMR_W-005",18,[[4,1,-1517,[0,"f1HfWpyedEV5aaIdh2dEp7"],[1104,1105,1106],[2,256,[2,0,0,1,1]],1107]],[1,"b0BeMYfUtHQoNGFbiAI4uo",1,0],[1,21.658,-0.057,20.205],[3,-0.5910423164955912,-0.38816102343167497,-0.3881610234316749,0.5910423164955914],[1,-90,-66.589,0]],[11,"CAMR_W-006",18,[[4,1,-1518,[0,"6etv2FulhOZ5JhQDyyypDt"],[1108,1109,1110],[2,256,[2,0,0,1,1]],1111]],[1,"02I4k8jIpCIYbad8oCqmyx",1,0],[1,-20.488,0,-8.9],[3,-0.6375345011241361,-0.3058590523041599,-0.30585905230415983,0.6375345011241362],[1,-90,-51.259,0]],[11,"CAMR_W-007",18,[[4,1,-1519,[0,"4c+IVX5ZxNbaPM/+Vfc0o+"],[1112,1113,1114],[2,256,[2,0,0,1,1]],1115]],[1,"b2xeU4X6tMgZLrqibf2YEz",1,0],[1,-37.482,-0.057,-7.928],[3,-0.37704059063047207,0.5981976203705802,0.5981976203705801,0.3770405906304721],[1,-90,115.554,0]],[11,"CAMR_W-008",18,[[4,1,-1520,[0,"1aE4R62X5OhKgLd5eOmJBd"],[1116,1117,1118],[2,256,[2,0,0,1,1]],1119]],[1,"a5+ooYG7lA4Kii4JrLSc2s",1,0],[1,-16.952,-0.097,-12.911],[3,-0.37704059063047207,0.5981976203705802,0.5981976203705801,0.3770405906304721],[1,-90,115.554,0]],[11,"CAMR_W-009",18,[[4,1,-1521,[0,"5aicDSzMlHCppT67AlZg9o"],[1120,1121,1122],[2,256,[2,0,0,1,1]],1123]],[1,"e6IntacVlO7p0wTg99tiu8",1,0],[1,-48.898,-0.097,16.211],[3,-0.37704059063047207,0.5981976203705802,0.5981976203705801,0.3770405906304721],[1,-90,115.554,0]],[11,"CAMR_W-010",18,[[4,1,-1522,[0,"1dWjuz9YhDsY7s8TKDjQqp"],[1124,1125,1126],[2,256,[2,0,0,1,1]],1127]],[1,"bfGP4Kir9I/pnR46AvVlLx",1,0],[1,-66.691,-0.097,-7.782],[3,-0.37704059063047207,0.5981976203705802,0.5981976203705801,0.3770405906304721],[1,-90,115.554,0]],[11,"CAMR_W-011",18,[[4,1,-1523,[0,"4b40Xyr0lExrismS6U2bqU"],[1128,1129,1130],[2,256,[2,0,0,1,1]],1131]],[1,"d01n6ZtuBPS5hZtg9oFAFZ",1,0],[1,-48.414,-0.097,-50.46],[3,0.39154844928927207,0.5888037125045718,0.5888037125045716,-0.3915484492892721],[1,-90,247.247,0]],[11,"CAMR_W-012",18,[[4,1,-1524,[0,"8dlT1XLbhBHKz61EtK77Im"],[1132,1133,1134],[2,256,[2,0,0,1,1]],1135]],[1,"f9TW0EXupNdY4/axCcoRM8",1,0],[1,6.282,-0.097,-61.174],[3,0.39154844928927207,0.5888037125045718,0.5888037125045716,-0.3915484492892721],[1,-90,247.247,0]],[11,"CAMR_W-013",18,[[4,1,-1525,[0,"4bKxxP3cNJhbwCpz/agAXX"],[1136,1137,1138],[2,256,[2,0,0,1,1]],1139]],[1,"b6HIeYL8dGoqToQsy2p423",1,0],[1,35.531,-0.097,-26.177],[3,0.28237121131941745,0.6482796456915835,0.6482796456915834,-0.2823712113194175],[1,-90,227.073,0]],[24,"tips",105,[[33,7,true,-1526,[0,"d2eN38EXxE+pU/GHlAJPif"]]],[1,"0dpZnDHoZMUpyDTz6bqr9d",1,0],[1,0,0.458,0]],[11,"cover-001",16,[[4,1,-1527,[0,"18mGFoPsdEPa5rzYWPgrHR"],[1142],[2,256,[2,0,0,1,1]],1143]],[1,"07yklut9lGKakMlXGkYYI7",1,0],[1,13.184,0,2.946],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,-90.00000000000003,0,0]],[11,"cover-002",16,[[4,1,-1528,[0,"6adp+yKGZDOJCWAJ4q6Z9Q"],[1144],[2,256,[2,0,0,1,1]],1145]],[1,"02b5CLhd9H8Z3IU/toBYIB",1,0],[1,33.836,0,-20.891],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,-90.00000000000003,0,0]],[11,"cover-003",16,[[4,1,-1529,[0,"06XkXm9YlHQ65UAp4RFgaX"],[1146],[2,256,[2,0,0,1,1]],1147]],[1,"904zS4wHhASb6mnkGEpsBz",1,0],[1,9.98,0,-29.095],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,-90.00000000000003,0,0]],[24,"tips",106,[[33,4,true,-1530,[0,"09hGHIg5VIl7XifhfDVJ94"]]],[1,"fbJkWajipCPJ43Wi0vGr5z",1,0],[1,0,0.694,0]],[11,"cover-005",16,[[4,1,-1531,[0,"a9RaTsuS1E5omR04eL2i+j"],[1150],[2,256,[2,0,0,1,1]],1151]],[1,"2fq96AKzRD6L78GvjsRA4J",1,0],[1,-26.973,0,-29.62],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,-90.00000000000003,0,0]],[11,"tips",107,[[33,5,true,-1532,[0,"c8sUomDKlCj4Px1M6RrvoF"]]],[1,"07fzl+ridDj7hfp0SKs56H",1,0],[1,0,0.412,0.437],[3,0.7071067811865477,0,0,0.7071067811865474],[1,90.00000000000004,0,0]],[11,"cover-007",16,[[4,1,-1533,[0,"5aO6INy1BLU5pi1N7N/3VP"],[1154],[2,256,[2,0,0,1,1]],1155]],[1,"b6NeYN6u5MSY/CA0RAV9/1",1,0],[1,-35.599,0,-23.256],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,-90.00000000000003,0,0]],[11,"cover-008",16,[[4,1,-1534,[0,"1eNtsqLNlD3LocAycRysWW"],[1156],[2,256,[2,0,0,1,1]],1157]],[1,"88VSxGjWZOpKpXciQ/uNIp",1,0],[1,-52.205,0,-23.737],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,-90.00000000000003,0,0]],[11,"cover-009",16,[[4,1,-1535,[0,"e7j23nJ4pKIYPY12Gxq2iB"],[1158],[2,256,[2,0,0,1,1]],1159]],[1,"5dkiKmQNRF64IPipCs3vnX",1,0],[1,-39.723,0,-8.191],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,-90.00000000000003,0,0]],[11,"cover-010",16,[[4,1,-1536,[0,"a0anTk5QJPgInuzs0WPJC/"],[1160],[2,256,[2,0,0,1,1]],1161]],[1,"0csWu7HixNJK6me5e08/5c",1,0],[1,-15.53,0,-20.1],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,-90.00000000000003,0,0]],[11,"cover-011",16,[[4,1,-1537,[0,"48eXu9JSRKArFkgIAEQyFy"],[1162],[2,256,[2,0,0,1,1]],1163]],[1,"09X8wr8UJPorCCCMM0bLgM",1,0],[1,15.966,0,-22.375],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,-90.00000000000003,0,0]],[24,"tips",108,[[33,6,true,-1538,[0,"dc4zM2S1JBJIkz2TgnOUX8"]]],[1,"57GXavoHpObJYmP/vIWt/a",1,0],[1,0,0.788,0]],[11,"cover-013",16,[[4,1,-1539,[0,"320PoI5ERCQJwlvCpLH3yf"],[1166],[2,256,[2,0,0,1,1]],1167]],[1,"2e3sVVaeNCUYZL7imvYlVi",1,0],[1,22.405,0,-2.012],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,-90.00000000000003,0,0]],[6,"prop_caseS02",21,[[4,1,-1540,[0,"d9htlj0HRLW732c14b4Hq8"],[1168],[2,256,[2,0,0,1,1]],1169]],[1,"7cPzeTdwVG8q0npJMYXKuK",1,0],[1,-2.453,0,-1.291],[1,2,2,2]],[6,"prop_caseS03",21,[[4,1,-1541,[0,"19mwMLzJZKwbk4dWLsb/Mt"],[1170],[2,256,[2,0,0,1,1]],1171]],[1,"f8qegtObVLq5wKLENCRMxQ",1,0],[1,-2.461,0.016,-2.942],[1,2,2,2]],[6,"prop_caseS04",21,[[4,1,-1542,[0,"2ahKJTzjdERrPnf2r0WXO6"],[1172],[2,256,[2,0,0,1,1]],1173]],[1,"7cc4ctK0FM2KMZASq48QB5",1,0],[1,-2.509,1.628,-1.532],[1,2,2,2]],[3,"prop_caseS08",21,[[4,1,-1543,[0,"2c5tOE2ulEsas2a+w/YwR1"],[1174],[2,256,[2,0,0,1,1]],1175]],[1,"03cFqaeURJzLGj2j2p+2Ym",1,0],[1,19.44,0,5.021],[3,0,-1,0,6.123233995736766e-17],[1,2,2,2],[1,0,-180,0]],[3,"gear_B",41,[[4,1,-1544,[0,"66V1ohOuZCn4pZ3BYtZpD6"],[1176],[2,256,[2,0,0,1,1]],1177]],[1,"2dDwfJOxZFdo0cl/viqjO6",1,0],[1,-0.235,-0.218,0.702],[3,-0.7071067811865476,0,0,0.7071067811865476],[1,1.2896219491958618,1.2896219491958618,1.0773999691009521],[1,-90.00000000000003,0,0]],[3,"gear_B-001",41,[[4,1,-1545,[0,"02lxGSNjhK076FGojtXanu"],[1178],[2,256,[2,0,0,1,1]],1179]],[1,"b1+zTg4fJNcK/ob/DhElnq",1,0],[1,-0.235,-0.218,38.705],[3,-0.7071067811865476,0,0,0.7071067811865476],[1,1.2896219491958618,1.2896219491958618,1.0773999691009521],[1,-90.00000000000003,0,0]],[3,"gear_S",42,[[4,1,-1546,[0,"99Z/XkPI1BUpBf/zvcI4gF"],[1182],[2,256,[2,0,0,1,1]],1183]],[1,"49IknTJApEiZ5+tfvHG9TH",1,0],[1,-0.353,-0.878,0],[3,-0.7071067811865476,0,0,0.7071067811865476],[1,1.2896219491958618,1.2896219491958618,1.0773999691009521],[1,-90.00000000000003,0,0]],[3,"gear_S-001",42,[[4,1,-1547,[0,"59oDg1oiRM3a0XZZd1SG0q"],[1184],[2,256,[2,0,0,1,1]],1185]],[1,"b1bA8Bz6BEDboLP3g7lMPL",1,0],[1,-0.353,-0.878,38.003],[3,-0.7071067811865476,0,0,0.7071067811865476],[1,1.2896219491958618,1.2896219491958618,1.0773999691009521],[1,-90.00000000000003,0,0]],[3,"gear_S",43,[[4,1,-1548,[0,"18QgJLJBdMWLkJJn3xoeMC"],[1188],[2,256,[2,0,0,1,1]],1189]],[1,"55/uwzaFRDW661+FCEXp/v",1,0],[1,-0.067,-1.452,-1.067],[3,-0.7071067811865476,0,0,0.7071067811865476],[1,1.2896219491958618,1.2896219491958618,1.0773999691009521],[1,-90.00000000000003,0,0]],[3,"gear_S-001",43,[[4,1,-1549,[0,"ceoaaWAWNC9rLXAsXAczxk"],[1190],[2,256,[2,0,0,1,1]],1191]],[1,"659JabPKlI6Jm3yrL5PKA2",1,0],[1,-0.067,-1.452,36.936],[3,-0.7071067811865476,0,0,0.7071067811865476],[1,1.2896219491958618,1.2896219491958618,1.0773999691009521],[1,-90.00000000000003,0,0]],[3,"task4",3,[[4,1,-1550,[0,"d7XUtdi5hAcq3M70QnON2F"],[1194],[2,256,[2,0,0,1,1]],1195]],[1,"64NUe8M2ZK7JdIw8IVI/Xy",1,0],[1,19.22,0,5.957],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,1.2896219491958618,1.289621949195862,1.0773999691009524],[1,-90.00000000000003,0,0]],[11,"task6",3,[[4,1,-1551,[0,"e7XSWAoztFMbR3al8uWzDM"],[1196],[2,256,[2,0,0,1,1]],1197]],[1,"5aTu5KkXpDAKqrW3DkEYbm",1,0],[1,-17.813,0,-7.247999999999999],[3,-0.5000000000000001,0.5000000000000001,0.4999999999999999,0.5000000000000002],[1,-89.99999999999999,89.99999999999999,0]],[3,"task17",3,[[4,1,-1552,[0,"a5ebF2n9BF5bmM7YG/aYp3"],[1198],[2,256,[2,0,0,1,1]],1199]],[1,"4fEec5e4NANqO4f0Zya/mL",1,0],[1,25.802999999999997,-3.526,-25.356],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,1.2896219491958618,1.289621949195862,1.0773999691009524],[1,-90.00000000000003,0,0]],[11,"task15",3,[[4,1,-1553,[0,"d5ART5gMxNhpDYS+wtbueW"],[1200,1201],[2,256,[2,0,0,1,1]],1202]],[1,"77u9By2EpFIoiVUCy+ftus",1,0],[1,17.471,0,-5.912],[3,0,0.3007057995042731,0,0.9537169507482269],[1,0,35,0]],[11,"task15",3,[[5,-1554,[0,"44R2bacPxO+qx2hCRSuSLI"],[1203],[16,[2,0,0,1,1]],1204]],[1,"dc+02T8hRIa5GpCz8BsRnm",1,0],[1,21.111,-0.062,-6.843],[3,-0.5000000447034803,-0.49999995529651575,-0.49999995529651575,0.5000000447034803],[1,-90,-89.99998975471655,0]],[3,"task2",3,[[4,1,-1555,[0,"05Ge005YhMc5+azBK6UnW6"],[1205],[2,256,[2,0,0,1,1]],1206]],[1,"9b3uTFEGRC8bEUprU9Mv4t",1,0],[1,50.095,0,-1.86],[3,0,-0.7071067811865475,0,0.7071067811865476],[1,1.7546499967575073,1.7546499967575073,1.7546499967575073],[1,0,-89.99999999999999,0]],[11,"chair",3,[[4,1,-1556,[0,"daFvyVWOJHKovneh79qiLq"],[1207],[16,[2,0,0,1,1]],1208]],[1,"3fnnGpdNROdIBd4PLnFKz2",1,0],[1,29.718,0,-20.296],[3,-4.610056004154084e-17,0.9585764911222813,2.8015332728868583e-16,0.28483523424551077],[1,-3.2278088153858225e-14,146.902,4.080218729944885e-15]],[48,"book",44,[[4,1,-1557,[0,"b2q7Ee4pBBnaBBlOsl8VUD"],[1209],[16,[2,0,0,1,1]],1210]],[1,"98mxbWV0lIPrMov04eTNrP",1,0],[3,-0.5000001043081144,0.49999989569186387,0.49999989569186387,0.5000001043081144],[1,-90,89.99997609433862,0]],[11,"bigfile",44,[[4,1,-1558,[0,"fb8sUJvvdGUKfc0n/JsQ1l"],[1211],[16,[2,0,0,1,1]],1212]],[1,"dcf31BTAFGQIszECi+peTB",1,0],[1,0.0049999999999954525,0.05400000000000005,-0.02300000000000324],[3,-0.5000000447034803,-0.49999995529651575,-0.49999995529651575,0.5000000447034803],[1,-90,-89.99998975471655,0]],[11,"cup",44,[[4,1,-1559,[0,"4bJnHNdQxO4YIIzJVv8Mnz"],[1213],[16,[2,0,0,1,1]],1214]],[1,"e8g84uV8hK27aNosLsDSHX",1,0],[1,1.522,-0.008,-0.001],[3,-0.5000000447034803,-0.49999995529651575,-0.49999995529651575,0.5000000447034803],[1,-90,-89.99998975471655,0]],[11,"task1",9,[[4,1,-1560,[0,"64QmlR/4FFx42TUFrFY5h1"],[1215],[16,[2,0,0,1,1]],1216]],[1,"2ffHQlGRFJLYukKLbKoZK4",1,0],[1,30.211,0,-20.997],[3,0,-0.30124672987888124,0,0.9535462273729997],[1,0,-35.065,0]],[3,"task2",9,[[5,-1561,[0,"d94rAOKzdGrI2/Ol/gBcym"],[1217],[16,[2,0,0,1,1]],1218]],[1,"bbwqmCBmFB15gmThs+CjWa",1,0],[1,49.236,0.641,-1.932],[3,0,-0.5845116809823289,0,0.8113852936769388],[1,1.7,1.7,1.7],[1,0,-71.537,0]],[3,"task3",9,[[5,-1562,[0,"f9144nYhpBiYXJ9fsoJVoC"],[1219],[16,[2,0,0,1,1]],1220]],[1,"7cxrLkw3RJ7Kob8H5EybCB",1,0],[1,14.521,1.001,0.429],[3,-0.7071067811865475,0,0,0.7071067811865476],[1,0.8,0.8,0.8],[1,-90,0,0]],[3,"task4",9,[[5,-1563,[0,"c5veIfFuJPL5dwgJQd6+or"],[1221],[16,[2,0,0,1,1]],1222]],[1,"b3P2bS2glCWKOWXeznTl64",1,0],[1,19.257,1.112,7.451],[3,-0.7071067811865475,0,0,0.7071067811865476],[1,1.663124771847734,1.3894386482155316,1.3894386482155316],[1,-90,0,0]],[6,"task5",9,[[4,1,-1564,[0,"c7kFreS5BLD68YDu0A4TCr"],[1223,1224],[2,256,[2,0,0,1,1]],1225]],[1,"f0P9u9+clBeKY6qgW+hTex",1,0],[1,-12.96,0,7.935],[1,0.6,1,0.6]],[11,"task6",9,[[5,-1565,[0,"9by5HZwTFNCIfVBmtDGR4Q"],[1226],[16,[2,0,0,1,1]],1227]],[1,"fb5sTzLf1BC6xiLOOzFs7D",1,0],[1,-17.332,0.844,-7.182],[3,-0.5000000447034803,-0.49999995529651575,-0.4999999552965157,0.5000000447034803],[1,-90,-89.99998975471655,0]],[3,"task7",9,[[4,1,-1566,[0,"2bDpYcyjVKQZAsQwJrZvvw"],[1228],[2,256,[2,0,0,1,1]],1229]],[1,"70NlSXnBpJo40ZOwMSGZag",1,0],[1,46.756,0,-7.148000000000001],[3,0,-0.7071067811865475,0,0.7071067811865476],[1,1.7546499967575073,1.7546499967575073,1.7546499967575073],[1,0,-89.99999999999999,0]],[66,"task8",9,[[4,1,-1567,[0,"655fZG2aFOjJMsQiGSWHy/"],[1230],[2,256,[2,0,0,1,1]],1231]],[1,"22s3KMB1BFfYT8E3KjF8EJ",1,0],[1,-7.582,0,2.8499999999999996],[1,0.000009334667642611398,0,0]],[6,"task9",9,[[4,1,-1568,[0,"49JwVtRRpO6K8fk0XQkyJx"],[1232],[2,256,[2,0,0,1,1]],1233]],[1,"d3w1TwifNKLI5P3C6X8u4F",1,0],[1,17.829,1.215,21.673],[1,1.8,1.8,1.8]],[3,"task10",9,[[4,1,-1569,[0,"b108fPxgBJZbYFzH6aKa1V"],[1234],[2,256,[2,0,0,1,1]],1235]],[1,"c3MFBsG4RGFqXRa5TrGB7T",1,0],[1,14.499494341904544,0,26.542937695364884],[3,0,0.7046527862405606,0,0.709552289012878],[1,1.5025229454040525,1.5025229454040527,1.5025229454040525],[1,0,89.60299999999998,0]],[11,"task11",9,[[4,1,-1570,[0,"902SAjiShB476is52XJSeg"],[1236],[2,256,[2,0,0,1,1]],1237]],[1,"25jB7kXb9K37SAGrFduulG",1,0],[1,13.737014537562413,0.43900000000000006,-29.120429300549166],[3,-0.6467798044626386,-0.28578993078705667,-0.28578993078705667,0.646779804462639],[1,-89.99999999999996,-47.67800000000001,-1.5902773407317584e-14]],[3,"task12",9,[[5,-1571,[0,"80RtxqxJBCaqjgMfhIqwPx"],[1238],[16,[2,0,0,1,1]],1239]],[1,"74Ke8ZoZZJh6Gu3agyD80O",1,0],[1,1.3159999999999994,0,15.798],[3,-0.025127850297592735,-0.7066601666568039,-0.7066601666568038,0.02512785029759274],[1,1.2,1.2,1.2],[1,-90,-175.927,0]],[6,"task13",9,[[4,1,-1572,[0,"07wAvuhURFOpyz4NNIg0oC"],[1240],[2,256,[2,0,0,1,1]],1241]],[1,"46CuhqARtMppN//IP3QknD",1,0],[1,-6.712,1.193,17.986],[1,2.2,2.2,2.2]],[11,"task14",9,[[4,1,-1573,[0,"30nCMferZFybauoln1/JbR"],[1242],[2,256,[2,0,0,1,1]],1243]],[1,"03kVhW0O9EKLgfoqm3VH3z",1,0],[1,-13.16,1.61,3.166],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,-90.00000000000004,0,0]],[18,"task15",false,9,[[5,-1574,[0,"3fh10Om2pErqFco49MAPvP"],[1244],[12],1245]],[1,"3b/6FHFtVFW7UVjfFvqedi",1,0],[1,21.111,0.023,-6.843],[3,-0.5000000447034803,-0.49999995529651575,-0.4999999552965157,0.5000000447034803],[1,-90,-89.99998975471655,0]],[3,"task16",9,[[4,1,-1575,[0,"953SdPhwBFl6sRkxjizZeH"],[1246],[2,256,[2,0,0,1,1]],1247]],[1,"26pDBQjHhF07wQ0bQgezai",1,0],[1,-43.495,0,-3.179],[3,0,0.7071067811865475,0,0.7071067811865476],[1,1.506816029548645,1.506816029548645,1.506816029548645],[1,0,89.99999999999999,0]],[11,"task17",9,[[5,-1576,[0,"d0mx9ABdxGhZzzBStZMQur"],[1248],[16,[2,0,0,1,1]],1249]],[1,"22jp2h/pNPd4Zza8TEd3Zv",1,0],[1,33.777,-0.018,-23.982],[3,0.2553447630946423,0.6593929420005503,0.6593929420005502,-0.2553447630946423],[1,-90,-137.66298975471653,3.1805546814635168e-15]],[3,"task18",9,[[5,-1577,[0,"bdkKK74ndDZZ0YB1+MxDaF"],[1250],[16,[2,0,0,1,1]],1251]],[1,"4eUeczW2lPw6t4QTLF9Jf+",1,0],[1,-37.837,2.159,-19.544],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,1.5,1.5,1.0000000000000002],[1,-90.00000000000003,0,0]],[3,"task19",9,[[5,-1578,[0,"154wMP2A5OmowukrX4wHbL"],[1252],[16,[2,0,0,1,1]],1253]],[1,"9dvmn+QGpIi6ZWSAvCxBii",1,0],[1,1.3159999999999994,0,15.798],[3,-0.025127850297592735,-0.7066601666568039,-0.7066601666568038,0.02512785029759274],[1,1.2,1.2,1.2],[1,-90,-175.927,0]],[3,"task20",9,[[5,-1579,[0,"ecEDOHA1FHXZB8Ptrc+ytC"],[1254],[16,[2,0,0,1,1]],1255]],[1,"98vvawXRNLYLz0Dte087H/",1,0],[1,-37.831,2.159,15.047],[3,0.5,0.5,0.5,-0.5],[1,1.506816029548645,1.506816029548645,1.506816029548645],[1,-90,-90,0]],[6,"task21",9,[[4,1,-1580,[0,"edtcNpFLRN/KTVLAyJfob+"],[1256],[2,256,[2,0,0,1,1]],1257]],[1,"afp9x+X/JLyaz+aPac6lYK",1,0],[1,-0.223,1.235,7.907],[1,2.2,2.2,2.2]],[6,"task22",9,[[4,1,-1581,[0,"af8tEyAHZM/YvA9xYFi7wF"],[1258],[2,256,[2,0,0,1,1]],1259]],[1,"bfLrjXEoxJp7+Xtm7vvu7y",1,0],[1,23.19,1.353,21.762],[1,2.2,2.2,2.2]],[11,"task23",9,[[4,1,-1582,[0,"e93J5ul/pMXpoTTdYD8o8f"],[1260],[2,256,[2,0,0,1,1]],1261]],[1,"b4Y7FITBdIkJ3LU88gMl3H",1,0],[1,10.290693033683793,0.42300000000000004,0.49673486302166125],[3,-0.7070697351302508,-0.007238070380767201,-0.007238070380767192,0.7070697351302508],[1,-90.00000000000001,-1.1730000000000043,6.957463365701443e-16]],[11,"task24",9,[[4,1,-1583,[0,"58JfCL9/BI7oEhUGUZaZU6"],[1262],[2,256,[2,0,0,1,1]],1263]],[1,"f9jCOHLRhFu6oyTMgD3mw0",1,0],[1,8.304956413626577,0.49500000000000005,7.977953151226046],[3,-0.7070697351302508,-0.007238070380767201,-0.007238070380767192,0.7070697351302508],[1,-90.00000000000001,-1.1730000000000043,6.957463365701443e-16]],[24,"tips",109,[[80,-1584,[0,"aeadhfaQRK0L060PK0choS"]]],[1,"13dkeFLeNKkqcF5yBrmLXN",1,0],[1,0,0.424,0]],[3,"ConferencTable",3,[[4,1,-1585,[0,"955MIfaB5FB4Z5GhZzBGMP"],[1268],[2,256,[2,0,0,1,1]],1269]],[1,"62/YDafsVBVJiCaRFGn5Jo",1,0],[1,4.908,-0.056,-18.451],[3,-0.7071067811865478,0,0,0.7071067811865472],[1,1.7,1.7,1],[1,-90.00000000000004,0,0]],[11,"MedicalBed",3,[[4,1,-1586,[0,"714N6urKZI2YwgzyQiE6IV"],[1274],[2,256,[2,0,0,1,1]],1275]],[1,"cbm6ue5xVEv47ha3sDTr7e",1,0],[1,-17.813,0,-9.748],[3,-0.5,0.5,0.4999999999999999,0.5000000000000001],[1,-89.99999999999999,89.99999999999999,0]],[11,"MedicalBed-002",3,[[4,1,-1587,[0,"23ygRJw3BOyqoeJEVwkav3"],[1276],[2,256,[2,0,0,1,1]],1277]],[1,"20iXYgG6lJPZBDkQOHkzGo",1,0],[1,-10.991999999999999,0,-7.247999999999999],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,-89.99999999999999,-89.99999999999999,0]],[11,"MedicalBed-003",3,[[4,1,-1588,[0,"b9M2MMHTBFKoGYPnJ/3vNc"],[1278],[2,256,[2,0,0,1,1]],1279]],[1,"fblVJ3Fy9Aw6qFVopjZjRI",1,0],[1,-10.991999999999999,0,-9.928999999999998],[3,-0.5,-0.5,-0.4999999999999999,0.5000000000000001],[1,-89.99999999999999,-89.99999999999999,0]],[3,"MedicalPC",3,[[4,1,-1589,[0,"ab7jEHvpdDw4PSckrgjsWz"],[1280],[2,256,[2,0,0,1,1]],1281]],[1,"bePMapqvdFNbNDJnDkbTLc",1,0],[1,-9.01392745289172,0,-4.100948880916529],[3,0,-0.3215551522437525,0,0.946890851189036],[1,1.5025229454040525,1.5025229454040527,1.5025229454040525],[1,0,-37.514,0]],[24,"tips",111,[[55,3,-1590,[0,"8fMUhCN0lGloqtvFXSz4T4"]]],[1,"70tFucYORAyLN0JL+5Irv2",1,0],[1,0,0,-1.349]],[3,"platform",3,[[4,1,-1591,[0,"4eEdQkmdFLPK3YwHcVHLIV"],[1284],[2,256,[2,0,0,1,1]],1285]],[1,"22jU3ZsjJKc7cjp8ageeY+",1,0],[1,-17.851,0,-1.9380000000000002],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,1.5700620412826538,1.5700620412826538,1.5700620412826538],[1,-90.00000000000004,0,0]],[6,"prop_bucket01",3,[[4,1,-1592,[0,"a7jeWwuf1ECrd7tyD/R/Ns"],[1286],[2,256,[2,0,0,1,1]],1287]],[1,"d2jJxdnpJKvLnusvB3u+Wa",1,0],[1,-2.539,0,10.382],[1,0.8610680103302002,0.8610680103302002,0.8610680103302002]],[6,"prop_bucket02",3,[[4,1,-1593,[0,"07wiTGN3RMjqa4KJF1+qaC"],[1288],[2,256,[2,0,0,1,1]],1289]],[1,"a0gv257DZB1JZO9181BQ5v",1,0],[1,-1.9589999999999996,0,9.738],[1,0.8610680103302002,0.8610680103302002,0.8610680103302002]],[6,"prop_bucket03",3,[[4,1,-1594,[0,"30nHYTbwdAeK5cngA6knTR"],[1290],[2,256,[2,0,0,1,1]],1291]],[1,"9a9E10YpxO8ICfUw12m0Di",1,0],[1,-1.3810000000000002,0,8.983],[1,0.8610680103302002,0.8610680103302002,0.8610680103302002]],[6,"prop_caseB",3,[[4,1,-1595,[0,"2f1f/c1zlDYYgOg0rxg2oC"],[1292],[2,256,[2,0,0,1,1]],1293]],[1,"018GJjUHtGDowtVMy2VABm",1,0],[1,5.042,0,17.439999999999998],[1,2,2,2]],[6,"prop_caseB-001",3,[[4,1,-1596,[0,"d5+NCcqJhPpa60uOuzWX1h"],[1294],[2,256,[2,0,0,1,1]],1295]],[1,"5chuwLl4JM9Kaof8FzHKJ3",1,0],[1,2.249,0,19.733999999999998],[1,2,2,2]],[6,"prop_caseS01",3,[[4,1,-1597,[0,"878n9sH+hHt5R9pl01LgKC"],[1296],[2,256,[2,0,0,1,1]],1297]],[1,"64g0wy0blBMr0pkDis/nYz",1,0],[1,4.808,0,21.348],[1,2,2,2]],[6,"prop_caseS02",3,[[4,1,-1598,[0,"2bdWD2cvNFHJgQ22BwmCjU"],[1298],[2,256,[2,0,0,1,1]],1299]],[1,"48KjJeXOhB/IJF9KRluzRj",1,0],[1,4.574,0,13.799],[1,2,2,2]],[6,"engine",3,[[4,1,-1599,[0,"67+WgcbjpC3qEi5rxyZWra"],[1300],[2,256,[2,0,0,1,1]],1301]],[1,"90l4v29RZINKHOw2xLIpTI",1,0],[1,-36.268,-0.85,-18.293],[1,1.5025229454040527,1.5025229454040527,1.5025229454040527]],[3,"chair",3,[[4,1,-1600,[0,"72uT4YP7ZGbZFZ6C3z5pJJ"],[1302],[2,256,[2,0,0,1,1]],1303]],[1,"7fmDc7rpBPzK1D7u1jDG80",1,0],[1,47.766,0,-1.867],[3,5.7601157998232624e-8,0.7071068120951637,-5.7601163120481414e-8,0.7071067502779254],[1,1.5025229454040532,1.5025229454040527,1.5025229454040532],[1,0.000009334667642611397,90.00000500895615,-7.016691405431131e-15]],[3,"chair-001",3,[[4,1,-1601,[0,"dedeHadrFHyptENH3SeHRO"],[1304],[2,256,[2,0,0,1,1]],1305]],[1,"beFrIaMbFLiLRQFW3OuJUr",1,0],[1,16.305000000000007,0,26.56500000000001],[3,0,-0.7172147350578707,0,0.6968522252356437],[1,1.5025229454040527,1.5025229454040527,1.5025229454040527],[1,0,-91.65,0]],[3,"chair",3,[[4,1,-1602,[0,"d1Ky2f0LdDyJWDFqPvhlu3"],[1306],[2,256,[2,0,0,1,1]],1307]],[1,"58uHbhc0lGW5eEGfBZeveN",1,0],[1,45.041,0,3.9670000000000005],[3,5.7601157998232624e-8,0.7071068120951637,-5.7601163120481414e-8,0.7071067502779254],[1,1.5025229454040532,1.5025229454040527,1.5025229454040532],[1,0.000009334667642611397,90.00000500895615,-7.016691405431131e-15]],[3,"chair-001",3,[[4,1,-1603,[0,"b2WmQQuEBJSKuac6m22Yyp"],[1308],[2,256,[2,0,0,1,1]],1309]],[1,"cbxOIWqzNECafWZucstkL1",1,0],[1,-24.951,0,-6.535999999999984],[3,-6.12321737056891e-17,1,1.2961112731629469e-32,-2.220446049250313e-16],[1,1.5025229454040527,1.5025229454040527,1.5025229454040527],[1,7.278409925524157e-32,-179.99999999999997,-7.01669024749584e-15]],[3,"Console_03",3,[[4,1,-1604,[0,"21FukBhhdKELhEuBCekvoB"],[1310],[2,256,[2,0,0,1,1]],1311]],[1,"b3ny2erMBG/aHlhy2tifAF",1,0],[1,46.756,0,3.802999999999999],[3,0,-0.7071067811865475,0,0.7071067811865476],[1,1.7546499967575073,1.7546499967575073,1.7546499967575073],[1,0,-89.99999999999999,0]],[6,"Console_04",3,[[4,1,-1605,[0,"11zn7nrNdHgbuDH5CwlN5J"],[1312],[2,256,[2,0,0,1,1]],1313]],[1,"782YhPRkNB94y3I+izxvFz",1,0],[1,17.482,1.289,0.41],[1,1.7546499967575073,1.7546499967575073,1.7546499967575073]],[6,"Console_05",3,[[4,1,-1606,[0,"7f9wtpOPNCR5avND2vWytC"],[1314],[2,256,[2,0,0,1,1]],1315]],[1,"e9BiqjTBVPUJFMqPFMPmH0",1,0],[1,20.092,1.289,0.41],[1,1.7546499967575073,1.7546499967575073,1.7546499967575073]],[6,"Console_06",3,[[4,1,-1607,[0,"f22cdYAWhFwoBuaInn6k98"],[1316],[2,256,[2,0,0,1,1]],1317]],[1,"c18fwQXyxL3JxaZuiQfeXa",1,0],[1,22.741999999999997,1.289,0.41],[1,1.7546499967575073,1.7546499967575073,1.7546499967575073]],[3,"SubstationBox",3,[[4,1,-1608,[0,"e6DcqvMvtNaKXWYxhBl2yy"],[1318],[2,256,[2,0,0,1,1]],1319]],[1,"fc0MksYFVHPZDeQP0RaFP5",1,0],[1,-12.02,0,3.504],[3,5.7601163936306405e-8,-0.7071067811865451,5.7601160383592646e-8,0.7071067811865452],[1,0.6739680171012877,0.6739680171012878,0.6739680171012877],[1,0.000009334667901998506,-90,-2.8787095393882163e-13]],[3,"pipeline_B01",3,[[4,1,-1609,[0,"5ek4XQb9pBi6Uen3AcLC6p"],[1320],[2,256,[2,0,0,1,1]],1321]],[1,"78Jf99l2VKpYAdwjAHbpOD",1,0],[1,25.025,-2.878,-26.599],[3,-0.7071067811865476,0,0,0.7071067811865475],[1,1.2896219491958618,1.289621949195862,1.0773999691009524],[1,-90.00000000000003,0,0]],[3,"pipeline_B02",3,[[4,1,-1610,[0,"f6nLU6j0dM66spiNdpiUPo"],[1322],[2,256,[2,0,0,1,1]],1323]],[1,"7c1AKhL6BP7oczcE107vSN",1,0],[1,27.968999999999998,-2.878,12.867],[3,-0.7071067811865477,0,0,0.7071067811865474],[1,1.2896219491958618,1.2896219491958618,1.0773999691009521],[1,-90.00000000000004,0,0]],[3,"pipeline_B02",3,[[4,1,-1611,[0,"c4dhtusmRIi44NNMrDASAa"],[1324],[2,256,[2,0,0,1,1]],1325]],[1,"fcz+IV7K9KUpb0Gut772nm",1,0],[1,36.31099999999999,-3.574,-14.058000000000002],[3,-8.715763992105246e-33,0.7071067811865475,0.7071067811865476,-8.65956075162862e-17],[1,1.2896219491958625,1.289621949195862,1.0773999691009524],[1,-90.00000000000003,-180,-7.016709451900446e-15]],[3,"pipeline_B03",3,[[4,1,-1612,[0,"e94PIFlqZOUqEBaJ8rQdZk"],[1326],[2,256,[2,0,0,1,1]],1327]],[1,"e7d5IGHiNAT7oISKQ5OnEC",1,0],[1,36.31099999999999,-3.574,21.781000000000002],[3,-8.715763992105246e-33,0.7071067811865475,0.7071067811865476,-8.65956075162862e-17],[1,1.2896219491958625,1.289621949195862,1.0773999691009524],[1,-90.00000000000003,-180,-7.016709451900446e-15]],[24,"pipeline_L",3,[[4,1,-1613,[0,"e7bkmnnOdOOoVkbE9Kwlmu"],[1328],[2,256,[2,0,0,1,1]],1329]],[1,"a9/DakJE5OoYIL3meaY7Cn",1,0],[1,-50.886,0,-2.357]],[24,"MainEngine",3,[[4,1,-1614,[0,"6afMD97T9McJqTCsNCQ9n8"],[1330,1331],[2,256,[2,0,0,1,1]],1332]],[1,"afKlctkxtMIr0qh0f5EAL3",1,0],[1,-47.393,0,-3.558]],[11,"wire_short",3,[[4,1,-1615,[0,"2cf0559V5Nw4bh01V6Q5+n"],[1333],[2,256,[2,0,0,1,1]],1334]],[1,"6fNiVrp7pOXLsVSOAKJyXZ",1,0],[1,-12.104000000000001,0,6.561],[3,5.7601163936306405e-8,0.7071067811865451,-5.760116038359265e-8,0.7071067811865452],[1,0.000009334667901998506,90,2.878709531805183e-13]],[11,"wire_short-001",3,[[4,1,-1616,[0,"2eS/ZsenxDjqaxqsp1U0vt"],[1335],[2,256,[2,0,0,1,1]],1336]],[1,"cfLJGmCOVOXJx6V2hLPP5l",1,0],[1,-13.68,0,11.053],[3,5.7601163936306405e-8,0.7071067811865451,-5.760116038359265e-8,0.7071067811865452],[1,0.000009334667901998506,90,2.878709531805183e-13]],[3,"wire_L",3,[[4,1,-1617,[0,"2fftrcsflKDKJDI7zVFaRt"],[1337],[2,256,[2,0,0,1,1]],1338]],[1,"f2H/j5HgxMgarMFI7lQulb",1,0],[1,-8.855,0,5.805999999999999],[3,0,-0.7071067811865475,0,0.7071067811865476],[1,-1,1,1],[1,0,-89.99999999999999,0]],[6,"wire_L-001",3,[[4,1,-1618,[0,"52EigczHhMNKMB6ws+cj+n"],[1339],[2,256,[2,0,0,1,1]],1340]],[1,"87RIiotyZETYjJaPg8Md9O",1,0],[1,-11.923,0,14.344999999999999],[1,1.21,1,1]],[24,"tips",112,[[55,2,-1619,[0,"eaSYZN7tBJ97WDjLDwuhn1"]]],[1,"5dDR60fd5CVpDEQtNZv5Jn",1,0],[1,0,0.572,0]],[3,"chair",3,[[4,1,-1620,[0,"37cEBJAC5L5LYjVXZOOjH8"],[1343],[2,256,[2,0,0,1,1]],1344]],[1,"25PofGAFRLj6KYLzVIRulY",1,0],[1,17.526,0,1.6620000000000001],[3,-3.621976833446892e-15,0.9999999999999957,-8.146034247147292e-8,-4.371138828673774e-8],[1,1.5025229454040532,1.5025229454040527,1.5025229454040532],[1,0.000009334667642611397,-179.99999499104388,-7.016690247495931e-15]],[3,"chair",3,[[4,1,-1621,[0,"39WPeiJ+pPT6N7KxiUXbXP"],[1345],[2,256,[2,0,0,1,1]],1346]],[1,"34zwAjCjNDRJU5UW7Uttuf",1,0],[1,20.162000000000003,0,1.6620000000000001],[3,-3.621976833446892e-15,0.9999999999999957,-8.146034247147292e-8,-4.371138828673774e-8],[1,1.5025229454040532,1.5025229454040527,1.5025229454040532],[1,0.000009334667642611397,-179.99999499104388,-7.016690247495931e-15]],[3,"chair",3,[[4,1,-1622,[0,"85Uvt5napG6Zzr2hZZKAQ4"],[1347],[2,256,[2,0,0,1,1]],1348]],[1,"d0yVdOe8VCI4r/RKXA5TDw",1,0],[1,22.814,0,1.6620000000000001],[3,-3.621976833446892e-15,0.9999999999999957,-8.146034247147292e-8,-4.371138828673774e-8],[1,1.5025229454040532,1.5025229454040527,1.5025229454040532],[1,0.000009334667642611397,-179.99999499104388,-7.016690247495931e-15]],[3,"chair",3,[[4,1,-1623,[0,"17nnxZ7edJfZsgNMGQSbM5"],[1349],[2,256,[2,0,0,1,1]],1350]],[1,"5bSn95tVJKf7YdbBFuFBXC",1,0],[1,44.866,0,-7.161],[3,5.7601157998232624e-8,0.7071068120951637,-5.7601163120481414e-8,0.7071067502779254],[1,1.5025229454040532,1.5025229454040527,1.5025229454040532],[1,0.000009334667642611397,90.00000500895615,-7.016691405431131e-15]],[11,"ConferencTable-001",3,[[4,1,-1624,[0,"89yzX/3npFq4uhUsbhKoQC"],[1351],[2,256,[2,0,0,1,1]],1352]],[1,"e1y8QOMytCGpXFAvNNJdMF",1,0],[1,-1.817,-0.056,-11.001],[3,-0.7071067811865478,0,0,0.7071067811865472],[1,-90.00000000000004,0,0]],[11,"ConferencTable-002",3,[[4,1,-1625,[0,"1cGnn4XYdOeaEzVTGW+CC8"],[1353],[2,256,[2,0,0,1,1]],1354]],[1,"8c33tXjLNMOofLRS1Dih5W",1,0],[1,10.656,-0.056,-11.001],[3,-0.7071067811865478,0,0,0.7071067811865472],[1,-90.00000000000004,0,0]],[11,"ConferencTable-003",3,[[4,1,-1626,[0,"273oMunWdI04bMuZXXvyzg"],[1355],[2,256,[2,0,0,1,1]],1356]],[1,"45QR6KNIVANrZLKxcw20Am",1,0],[1,10.896,-0.056,-26.233],[3,-0.7071067811865478,0,0,0.7071067811865472],[1,-90.00000000000004,0,0]],[11,"ConferencTable-004",3,[[4,1,-1627,[0,"6a8w1cq6xGh64kFf5TAlf0"],[1357],[2,256,[2,0,0,1,1]],1358]],[1,"822DbLVdZKvIzE/zYBKT3o",1,0],[1,-1.757,-0.056,-26.233],[3,-0.7071067811865478,0,0,0.7071067811865472],[1,-90.00000000000004,0,0]],[67,"bodys",1,[1,"35jW7OB3lLWrDq2s3bCdTL",1,0]],[68,"players",512,1,[1,"e7Mlv7TQVEzo+1BvFxkwo0",1,0]],[18,"cctvCamera1005",false,17,[[21,14,1820327937,-1628,[0,"a4ypK3UsVJg59IVMpo8m7A"]]],[1,"1bBvigDE5Ny7xiBI7td/3G",1,0],[1,5.016,5.522,-30.757],[3,-0.06698729810778066,0.9330127018922194,0.24999999999999997,0.24999999999999997],[1,-30,150,0]],[18,"cctvCamera1012",false,17,[[21,14,1820327937,-1629,[0,"4aYwsPNoFNMZD4c2W/hSgy"]]],[1,"b1qZPg3ERGYaMnxwvK7g1S",1,0],[1,44.463,4.192,-9.954],[3,-0.0449434555275478,0.9512512425641977,0.25488700224417876,0.1677312594965207],[1,-30,160,0]],[18,"cctvCamera1002",false,17,[[21,14,1820327937,-1630,[0,"adrI3+WstMf5mUb/13h4E2"]]],[1,"61O/HOcd1Nt7FakR7Lcps6",1,0],[1,28.585,4.147,-26.464],[3,-0.1274664638467389,-0.9469632219156883,-0.22868184008155906,0.1863265224018827],[1,-29.116,-155.399,8.986]],[18,"cctvCamera1014",false,17,[[21,14,1820327937,-1631,[0,"dfcECZrdxD7IjCTF0ma//Q"]]],[1,"c8TJJ91tVDx6VxpLp5LoCS",1,0],[1,-22.992,4.389,4.055],[3,-0.25488700224417876,0.16773125949652062,0.044943455527547777,0.9512512425641977],[1,-30,20,0]],[18,"cctvCamera1006",false,17,[[21,14,1820327937,-1632,[0,"24x6rxo5dJ84H3nl+ao8gF"]]],[1,"75gRVVpu5CJaKiV47E///O",1,0],[1,35.527,3.772,14.488],[3,0.014585023811953438,0.9236239791560409,0.2708376102098509,0.2708376102098509],[1,-30,150,10]],[18,"cctvCamera1001",false,17,[[21,14,1820327937,-1633,[0,"4fsycknytE2aJhZSDED007"]]],[1,"addQAABxpGbYAjwps0zBb/",1,0],[1,0.093,6.6,7.015],[3,-0.08126390461236285,-0.918404403365463,-0.2809381414183142,0.26646442611069815],[1,-34.01,-147.649,-0.026]],[18,"cctvCamera1013",false,17,[[21,14,1820327937,-1634,[0,"6dT1wl4bBOuooXGNJZ36yY"]]],[1,"5ba+34oj9Piau1eBgzVa2v",1,0],[1,13.13,5.171,0.12],[3,-0.109381654946615,-0.875426098065593,-0.23456971600980447,0.40821789367673483],[1,-30,-130,0]],[18,"cctvCamera1007",false,17,[[21,14,1820327937,-1635,[0,"21g+2T7RJJTr816ifPNLTr"]]],[1,"5aIDI6dQlAbbMcUBDhaWlG",1,0],[1,15.22,3.89,21.331],[3,-0.06698729810778066,-0.9330127018922194,-0.24999999999999997,0.24999999999999997],[1,-30,-150,0]],[18,"cctvCamera1003",false,17,[[21,14,1820327937,-1636,[0,"07Gztwf/NCh4EH83Lr1gXF"]]],[1,"e2rqJ+m1tM+Ih6/9ycIuyU",1,0],[1,-9.4,7.907,-0.111],[3,-0.3196250222735643,0.3518152838216483,0.15139926033035567,0.8666857072650602],[1,-41.378,45,2.151]],[18,"cctvCamera1008",false,17,[[21,14,1820327937,-1637,[0,"e85sDx7YVPraSZTqVRHlV7"]]],[1,"e4zYTHs4lHdbUcUYclbH0k",1,0],[1,-12.442,4.123,2.411],[3,-0.06698729810778066,-0.9330127018922194,-0.24999999999999997,0.24999999999999997],[1,-30,-150,0]],[18,"cctvCamera1011",false,17,[[21,14,1820327937,-1638,[0,"b5f/gA5iBPpqwlO5nmXpeR"]]],[1,"3bYVEpx09FcYplPhWqU8/4",1,0],[1,24.097,3.36,-8.092],[3,-0.06698729810778066,0.9330127018922194,0.24999999999999997,0.24999999999999997],[1,-30,150,0]],[18,"cctvCamera1004",false,17,[[21,14,1820327937,-1639,[0,"9cWdMGGU5NjrClJU10bFSe"]]],[1,"c2nkuhb7VK4aOjyrN82XmL",1,0],[1,-29.111,5.141,-24.987],[3,-0.03669259802637291,0.8975098735387531,0.27317932171593945,0.344242266924539],[1,-31.3,140,7.02]],[18,"cctvCamera1009",false,17,[[21,14,1820327937,-1640,[0,"e3+KsYavxG0JXTpec83QDZ"]]],[1,"2b74XZLmVEe61VrUvlRai7",1,0],[1,-29.857,5.7,20.482],[3,-0.24999999999999997,0.24999999999999997,0.06698729810778066,0.9330127018922194],[1,-30,30,0]],[18,"cctvCamera1010",false,17,[[21,14,1820327937,-1641,[0,"f4KC7OBvJMQZoX8DUSIvmQ"]]],[1,"a0qzSaa5FHeJ5EGF6YBmYD",1,0],[1,-41.915,4.589,3.896],[3,-0.24999999999999997,0.24999999999999997,0.06698729810778066,0.9330127018922194],[1,-30,30,0]],[28,"meettingCamere",1,[-1642],[1,"eck3vFuwtMBLE/HEf7SFIA",1,0]],[73,"Camera",769,[-1643],[1,"d06jxtxr5OGYT227ze2OTp",1,0],[1,5.105,10.233,-9.366],[3,-0.3611689075579024,0,0,0.9325004129829817],[1,-42.344,0,0]],[81,"Camera<CameraComponent>",1822425087,770,[0,"68NjrbGQ9HgbT23G7bZMXk"],[4,4286073907]]],0,[0,14,1,0,16,16,0,17,9,0,18,4,0,19,753,0,20,771,0,21,17,0,22,754,0,0,1,0,0,1,0,-1,19,0,-2,8,0,-3,3,0,-4,753,0,-5,754,0,-6,4,0,-7,17,0,-8,769,0,-1,358,0,-2,359,0,-3,360,0,-4,361,0,-5,362,0,-6,363,0,-7,364,0,-8,365,0,-9,366,0,-10,367,0,-11,368,0,-12,369,0,-13,370,0,-14,371,0,-15,372,0,-16,373,0,-17,374,0,-18,375,0,-19,376,0,-20,377,0,-21,378,0,-22,379,0,-23,380,0,-24,381,0,-25,382,0,-26,383,0,-27,384,0,-28,385,0,-29,386,0,-30,387,0,-31,388,0,-32,389,0,-33,390,0,-34,391,0,-35,392,0,-36,393,0,-37,394,0,-38,395,0,-39,396,0,-40,397,0,-41,398,0,-42,399,0,-43,400,0,-44,401,0,-45,402,0,-46,403,0,-47,404,0,-48,405,0,-49,406,0,-50,407,0,-51,408,0,-52,409,0,-53,410,0,-54,411,0,-55,412,0,-56,413,0,-57,414,0,-58,415,0,-59,416,0,-60,417,0,-61,418,0,-62,419,0,-63,420,0,-64,421,0,-65,422,0,-66,423,0,-67,424,0,-68,425,0,-69,426,0,-70,427,0,-71,428,0,-72,429,0,-73,430,0,-74,431,0,-75,432,0,-76,433,0,-77,434,0,-78,435,0,-79,436,0,-80,437,0,-81,438,0,-82,439,0,-83,440,0,-84,441,0,-85,442,0,-86,443,0,-87,444,0,-88,445,0,-89,446,0,-90,447,0,-91,448,0,-92,449,0,-93,450,0,-94,451,0,-95,452,0,-96,453,0,-97,454,0,-98,455,0,-99,456,0,-100,457,0,-101,458,0,-102,459,0,-103,460,0,-104,461,0,-105,462,0,-106,463,0,-107,464,0,-108,465,0,-109,466,0,-110,467,0,-111,468,0,-112,469,0,-113,470,0,-114,471,0,-115,472,0,-116,473,0,-117,474,0,-118,475,0,-119,476,0,-120,477,0,-121,478,0,-122,479,0,-123,480,0,-124,481,0,-125,482,0,-126,483,0,-127,484,0,-128,485,0,-129,486,0,-130,487,0,-131,488,0,-132,489,0,-133,490,0,-134,491,0,-135,492,0,-136,493,0,-137,494,0,-138,495,0,-139,496,0,-140,497,0,-141,498,0,-142,499,0,-143,500,0,-144,501,0,-145,502,0,-146,503,0,-147,504,0,-148,505,0,-149,506,0,-150,507,0,-151,508,0,-152,509,0,-153,510,0,-154,511,0,-155,512,0,-156,513,0,-157,514,0,-158,515,0,-159,516,0,-160,517,0,-161,518,0,-162,519,0,-163,520,0,-164,521,0,-165,522,0,-166,523,0,-167,524,0,-168,525,0,-169,526,0,-170,527,0,-171,528,0,-172,529,0,-173,530,0,-174,531,0,-175,532,0,-176,533,0,-177,534,0,-178,535,0,-179,536,0,-180,537,0,-181,538,0,-182,539,0,-183,540,0,-184,541,0,-185,542,0,-186,543,0,-187,544,0,-188,545,0,-189,546,0,-190,547,0,-191,548,0,-192,549,0,-193,550,0,-194,551,0,-195,552,0,-196,553,0,-197,554,0,-198,555,0,-199,556,0,-200,557,0,-201,558,0,-202,559,0,-203,560,0,-204,561,0,-205,562,0,-206,563,0,-207,564,0,-208,565,0,-209,566,0,-210,567,0,-211,568,0,-212,569,0,-213,570,0,-214,571,0,-215,572,0,-216,573,0,-217,574,0,-218,575,0,-219,576,0,-220,577,0,-221,578,0,-222,579,0,-223,580,0,-224,581,0,-225,582,0,-226,583,0,-227,584,0,-228,585,0,-229,586,0,-230,587,0,-231,588,0,-232,589,0,-233,590,0,-1,18,0,5,3,0,5,3,0,-4,16,0,-5,21,0,-6,41,0,-7,42,0,-8,43,0,-9,675,0,-10,676,0,-11,677,0,-12,678,0,-13,679,0,-14,680,0,-15,681,0,-16,44,0,-17,9,0,-18,109,0,-19,710,0,-20,110,0,-21,711,0,-22,712,0,-23,713,0,-24,714,0,-25,111,0,-26,716,0,-27,717,0,-28,718,0,-29,719,0,-30,720,0,-31,721,0,-32,722,0,-33,723,0,-34,724,0,-35,725,0,-36,726,0,-37,727,0,-38,728,0,-39,729,0,-40,730,0,-41,731,0,-42,732,0,-43,733,0,-44,734,0,-45,735,0,-46,736,0,-47,737,0,-48,738,0,-49,739,0,5,3,0,-51,740,0,-52,741,0,-53,742,0,-54,743,0,-55,112,0,-56,745,0,-57,746,0,-58,747,0,-59,748,0,-60,749,0,-61,750,0,-62,751,0,-63,752,0,-1,45,0,-2,46,0,-3,47,0,-4,48,0,-5,49,0,-6,50,0,-7,51,0,-8,52,0,-9,53,0,-10,54,0,-11,55,0,-12,56,0,-13,57,0,-14,58,0,-15,59,0,-16,60,0,-17,61,0,-18,62,0,-19,63,0,-20,64,0,-21,65,0,-22,66,0,-23,67,0,-24,68,0,-25,69,0,-26,70,0,-27,71,0,-28,72,0,-29,73,0,-30,74,0,-31,75,0,-32,76,0,-33,77,0,-34,78,0,-35,79,0,-36,80,0,-37,81,0,-38,82,0,-39,83,0,-40,84,0,-41,85,0,-42,86,0,-43,87,0,-44,88,0,-45,89,0,-46,90,0,-47,91,0,-48,92,0,-49,93,0,-50,94,0,-51,95,0,-52,96,0,-53,97,0,-54,98,0,-55,99,0,-56,100,0,-57,101,0,-58,102,0,-59,103,0,-60,104,0,-1,163,0,-2,164,0,-3,165,0,-4,166,0,-5,167,0,-6,168,0,-7,169,0,-8,170,0,-9,171,0,-10,172,0,-11,173,0,-12,174,0,-13,175,0,-14,176,0,-15,177,0,-16,178,0,-17,179,0,-18,180,0,-19,181,0,-20,182,0,-21,183,0,-22,184,0,-23,185,0,-24,186,0,-25,187,0,-26,188,0,-27,189,0,-28,190,0,-29,191,0,-30,192,0,-31,193,0,-32,194,0,-33,195,0,-34,196,0,-35,197,0,-36,198,0,-37,199,0,-38,200,0,-39,201,0,-40,202,0,-41,203,0,-42,204,0,-43,205,0,-44,206,0,-45,207,0,-46,208,0,-47,209,0,-48,210,0,-49,211,0,-50,212,0,-51,213,0,-52,214,0,-53,215,0,-54,216,0,-55,217,0,-56,218,0,-57,219,0,-58,220,0,-59,221,0,-60,222,0,-1,223,0,-2,224,0,-3,225,0,-4,226,0,-5,227,0,-6,228,0,-7,229,0,-8,230,0,-9,231,0,-10,232,0,-11,233,0,-12,234,0,-13,235,0,-14,236,0,-15,237,0,-16,238,0,-17,239,0,-18,240,0,-19,241,0,-20,242,0,-21,243,0,-22,244,0,-23,245,0,-24,246,0,-25,247,0,-26,248,0,-27,249,0,-28,250,0,-29,251,0,-30,252,0,-31,253,0,-32,254,0,-33,255,0,-34,256,0,-35,257,0,-36,258,0,-1,307,0,-2,308,0,-3,309,0,-4,310,0,-5,311,0,-6,312,0,-7,313,0,-8,314,0,-9,315,0,-10,316,0,-11,317,0,-12,318,0,-13,319,0,-14,320,0,-15,321,0,-16,322,0,-17,323,0,-18,324,0,-19,325,0,-20,326,0,-21,327,0,-22,328,0,-23,329,0,-24,330,0,-25,331,0,-26,332,0,-27,333,0,-28,334,0,-29,335,0,-30,336,0,-31,337,0,-32,338,0,-33,339,0,-3,13,0,-4,14,0,-5,15,0,5,8,0,-8,11,0,-10,20,0,-11,22,0,-12,23,0,-13,24,0,-14,25,0,-15,26,0,-16,27,0,-17,28,0,-18,29,0,-19,30,0,-20,31,0,-21,32,0,-22,33,0,-23,34,0,-24,35,0,-25,36,0,-26,37,0,-27,38,0,-28,39,0,-29,40,0,-1,685,0,-2,686,0,-3,687,0,-4,688,0,-5,689,0,-6,690,0,-7,691,0,-8,692,0,-9,693,0,-10,694,0,-11,695,0,-12,696,0,-13,697,0,-14,698,0,-15,699,0,-16,700,0,-17,701,0,-18,702,0,-19,703,0,-20,704,0,-21,705,0,-22,706,0,-23,707,0,-24,708,0,-1,118,0,-2,119,0,-3,120,0,-4,121,0,-5,122,0,-6,123,0,-7,124,0,-8,125,0,-9,126,0,-10,127,0,-11,128,0,-12,129,0,-13,130,0,-14,131,0,-15,132,0,-16,133,0,-17,134,0,-18,135,0,-19,136,0,-1,340,0,-2,341,0,-3,342,0,-4,343,0,-5,344,0,-6,345,0,-7,346,0,-8,347,0,-9,348,0,-10,349,0,-11,350,0,-12,351,0,-13,352,0,-14,353,0,-15,354,0,-16,355,0,-17,356,0,-18,357,0,-1,137,0,-2,138,0,-3,139,0,-4,140,0,-5,141,0,-6,142,0,-7,143,0,-8,144,0,-9,145,0,-10,146,0,-11,147,0,-12,148,0,-13,149,0,-14,150,0,-15,151,0,-16,152,0,-17,153,0,-1,259,0,-2,260,0,-3,261,0,-4,262,0,-5,263,0,-6,264,0,-7,265,0,-8,266,0,-9,267,0,-10,268,0,-11,269,0,-12,270,0,-13,271,0,-14,272,0,-15,273,0,-16,274,0,-1,275,0,-2,276,0,-3,277,0,-4,278,0,-5,279,0,-6,280,0,-7,281,0,-8,282,0,-9,283,0,-10,284,0,-11,285,0,-12,286,0,-13,287,0,-14,288,0,-15,289,0,-16,290,0,-1,291,0,-2,292,0,-3,293,0,-4,294,0,-5,295,0,-6,296,0,-7,297,0,-8,298,0,-9,299,0,-10,300,0,-11,301,0,-12,302,0,-13,303,0,-14,304,0,-15,305,0,-16,306,0,-1,105,0,-2,652,0,-3,653,0,-4,654,0,-5,106,0,-6,656,0,-7,107,0,-8,658,0,-9,659,0,-10,660,0,-11,661,0,-12,662,0,-13,108,0,-14,664,0,-1,755,0,-2,756,0,-3,757,0,-4,758,0,-5,759,0,-6,760,0,-7,761,0,-8,762,0,-9,763,0,-10,764,0,-11,765,0,-12,766,0,-13,767,0,-14,768,0,-1,637,0,-2,638,0,-3,639,0,-4,640,0,-5,641,0,-6,642,0,-7,643,0,-8,644,0,-9,645,0,-10,646,0,-11,647,0,-12,648,0,-13,649,0,-14,650,0,-3,154,0,-4,155,0,-5,156,0,-6,157,0,-7,158,0,-8,159,0,-9,160,0,-10,161,0,-11,162,0,-1,591,0,-2,592,0,-3,593,0,-4,594,0,-5,595,0,-6,596,0,-7,597,0,-8,598,0,-1,665,0,-2,666,0,-3,667,0,-4,668,0,0,22,0,-1,599,0,-2,600,0,0,23,0,-1,601,0,-2,602,0,0,24,0,-1,603,0,-2,604,0,0,25,0,-1,605,0,-2,606,0,0,26,0,-1,607,0,-2,608,0,0,27,0,-1,609,0,-2,610,0,0,28,0,-1,611,0,-2,612,0,0,29,0,-1,613,0,-2,614,0,0,30,0,-1,615,0,-2,616,0,0,31,0,-1,617,0,-2,618,0,0,32,0,-1,619,0,-2,620,0,0,33,0,-1,621,0,-2,622,0,0,34,0,-1,623,0,-2,624,0,0,35,0,-1,625,0,-2,626,0,0,36,0,-1,627,0,-2,628,0,0,37,0,-1,629,0,-2,630,0,0,38,0,-1,631,0,-2,632,0,0,39,0,-1,633,0,-2,634,0,0,40,0,-1,635,0,-2,636,0,0,41,0,-1,669,0,-2,670,0,0,42,0,-1,671,0,-2,672,0,0,43,0,-1,673,0,-2,674,0,-1,682,0,-2,683,0,-3,684,0,0,45,0,0,45,0,0,45,0,0,46,0,0,46,0,0,46,0,0,47,0,0,47,0,0,47,0,0,48,0,0,48,0,0,48,0,0,49,0,0,49,0,0,49,0,0,50,0,0,50,0,0,50,0,0,51,0,0,51,0,0,51,0,0,52,0,0,52,0,0,52,0,0,53,0,0,53,0,0,53,0,0,54,0,0,54,0,0,54,0,0,55,0,0,55,0,0,55,0,0,56,0,0,56,0,0,56,0,0,57,0,0,57,0,0,57,0,0,58,0,0,58,0,0,58,0,0,59,0,0,59,0,0,59,0,0,60,0,0,60,0,0,60,0,0,61,0,0,61,0,0,61,0,0,62,0,0,62,0,0,62,0,0,63,0,0,63,0,0,63,0,0,64,0,0,64,0,0,64,0,0,65,0,0,65,0,0,65,0,0,66,0,0,66,0,0,66,0,0,67,0,0,67,0,0,67,0,0,68,0,0,68,0,0,68,0,0,69,0,0,69,0,0,69,0,0,70,0,0,70,0,0,70,0,0,71,0,0,71,0,0,71,0,0,72,0,0,72,0,0,72,0,0,73,0,0,73,0,0,73,0,0,74,0,0,74,0,0,74,0,0,75,0,0,75,0,0,75,0,0,76,0,0,76,0,0,76,0,0,77,0,0,77,0,0,77,0,0,78,0,0,78,0,0,78,0,0,79,0,0,79,0,0,79,0,0,80,0,0,80,0,0,80,0,0,81,0,0,81,0,0,81,0,0,82,0,0,82,0,0,82,0,0,83,0,0,83,0,0,83,0,0,84,0,0,84,0,0,84,0,0,85,0,0,85,0,0,85,0,0,86,0,0,86,0,0,86,0,0,87,0,0,87,0,0,87,0,0,88,0,0,88,0,0,88,0,0,89,0,0,89,0,0,89,0,0,90,0,0,90,0,0,90,0,0,91,0,0,91,0,0,91,0,0,92,0,0,92,0,0,92,0,0,93,0,0,93,0,0,93,0,0,94,0,0,94,0,0,94,0,0,95,0,0,95,0,0,95,0,0,96,0,0,96,0,0,96,0,0,97,0,0,97,0,0,97,0,0,98,0,0,98,0,0,98,0,0,99,0,0,99,0,0,99,0,0,100,0,0,100,0,-1,113,0,0,101,0,0,101,0,-1,114,0,0,102,0,0,102,0,-1,115,0,0,103,0,0,103,0,-1,116,0,0,104,0,0,104,0,-1,117,0,0,105,0,-1,651,0,0,106,0,-1,655,0,0,107,0,-1,657,0,0,108,0,-1,663,0,0,109,0,-1,709,0,0,110,0,0,110,0,0,111,0,-1,715,0,0,112,0,-1,744,0,0,113,0,0,113,0,0,114,0,0,114,0,0,115,0,0,115,0,0,116,0,0,116,0,0,117,0,0,117,0,0,118,0,0,119,0,0,120,0,0,121,0,0,122,0,0,123,0,0,124,0,0,125,0,0,126,0,0,127,0,0,128,0,0,129,0,0,130,0,0,131,0,0,132,0,0,133,0,0,134,0,0,135,0,0,136,0,0,137,0,0,138,0,0,139,0,0,140,0,0,141,0,0,142,0,0,143,0,0,144,0,0,145,0,0,146,0,0,147,0,0,148,0,0,149,0,0,150,0,0,151,0,0,152,0,0,153,0,0,154,0,0,155,0,0,156,0,0,157,0,0,158,0,0,159,0,0,160,0,0,161,0,0,162,0,0,163,0,0,164,0,0,165,0,0,166,0,0,167,0,0,168,0,0,169,0,0,170,0,0,171,0,0,172,0,0,173,0,0,174,0,0,175,0,0,176,0,0,177,0,0,178,0,0,179,0,0,180,0,0,181,0,0,182,0,0,183,0,0,184,0,0,185,0,0,186,0,0,187,0,0,188,0,0,189,0,0,190,0,0,191,0,0,192,0,0,193,0,0,194,0,0,195,0,0,196,0,0,197,0,0,198,0,0,199,0,0,200,0,0,201,0,0,202,0,0,203,0,0,204,0,0,205,0,0,206,0,0,207,0,0,208,0,0,209,0,0,210,0,0,211,0,0,212,0,0,213,0,0,214,0,0,215,0,0,216,0,0,217,0,0,218,0,0,219,0,0,220,0,0,221,0,0,222,0,0,223,0,0,224,0,0,225,0,0,226,0,0,227,0,0,228,0,0,229,0,0,230,0,0,231,0,0,232,0,0,233,0,0,234,0,0,235,0,0,236,0,0,237,0,0,238,0,0,239,0,0,240,0,0,241,0,0,242,0,0,243,0,0,244,0,0,245,0,0,246,0,0,247,0,0,248,0,0,249,0,0,250,0,0,251,0,0,252,0,0,253,0,0,254,0,0,255,0,0,256,0,0,257,0,0,258,0,0,259,0,0,260,0,0,261,0,0,262,0,0,263,0,0,264,0,0,265,0,0,266,0,0,267,0,0,268,0,0,269,0,0,270,0,0,271,0,0,272,0,0,273,0,0,274,0,0,275,0,0,276,0,0,277,0,0,278,0,0,279,0,0,280,0,0,281,0,0,282,0,0,283,0,0,284,0,0,285,0,0,286,0,0,287,0,0,288,0,0,289,0,0,290,0,0,291,0,0,292,0,0,293,0,0,294,0,0,295,0,0,296,0,0,297,0,0,298,0,0,299,0,0,300,0,0,301,0,0,302,0,0,303,0,0,304,0,0,305,0,0,306,0,0,307,0,0,308,0,0,309,0,0,310,0,0,311,0,0,312,0,0,313,0,0,314,0,0,315,0,0,316,0,0,317,0,0,318,0,0,319,0,0,320,0,0,321,0,0,322,0,0,323,0,0,324,0,0,325,0,0,326,0,0,327,0,0,328,0,0,329,0,0,330,0,0,331,0,0,332,0,0,333,0,0,334,0,0,335,0,0,336,0,0,337,0,0,338,0,0,339,0,0,340,0,0,341,0,0,342,0,0,343,0,0,344,0,0,345,0,0,346,0,0,347,0,0,348,0,0,349,0,0,350,0,0,351,0,0,352,0,0,353,0,0,354,0,0,355,0,0,356,0,0,357,0,0,358,0,0,359,0,0,360,0,0,361,0,0,362,0,0,363,0,0,364,0,0,365,0,0,366,0,0,367,0,0,368,0,0,369,0,0,370,0,0,371,0,0,372,0,0,373,0,0,374,0,0,375,0,0,376,0,0,377,0,0,378,0,0,379,0,0,380,0,0,381,0,0,382,0,0,383,0,0,384,0,0,385,0,0,386,0,0,387,0,0,388,0,0,389,0,0,390,0,0,391,0,0,392,0,0,393,0,0,394,0,0,395,0,0,396,0,0,397,0,0,398,0,0,399,0,0,400,0,0,401,0,0,402,0,0,403,0,0,404,0,0,405,0,0,406,0,0,407,0,0,408,0,0,409,0,0,410,0,0,411,0,0,412,0,0,413,0,0,414,0,0,415,0,0,416,0,0,417,0,0,418,0,0,419,0,0,420,0,0,421,0,0,422,0,0,423,0,0,424,0,0,425,0,0,426,0,0,427,0,0,428,0,0,429,0,0,430,0,0,431,0,0,432,0,0,433,0,0,434,0,0,435,0,0,436,0,0,437,0,0,438,0,0,439,0,0,440,0,0,441,0,0,442,0,0,443,0,0,444,0,0,445,0,0,446,0,0,447,0,0,448,0,0,449,0,0,450,0,0,451,0,0,452,0,0,453,0,0,454,0,0,455,0,0,456,0,0,457,0,0,458,0,0,459,0,0,460,0,0,461,0,0,462,0,0,463,0,0,464,0,0,465,0,0,466,0,0,467,0,0,468,0,0,469,0,0,470,0,0,471,0,0,472,0,0,473,0,0,474,0,0,475,0,0,476,0,0,477,0,0,478,0,0,479,0,0,480,0,0,481,0,0,482,0,0,483,0,0,484,0,0,485,0,0,486,0,0,487,0,0,488,0,0,489,0,0,490,0,0,491,0,0,492,0,0,493,0,0,494,0,0,495,0,0,496,0,0,497,0,0,498,0,0,499,0,0,500,0,0,501,0,0,502,0,0,503,0,0,504,0,0,505,0,0,506,0,0,507,0,0,508,0,0,509,0,0,510,0,0,511,0,0,512,0,0,513,0,0,514,0,0,515,0,0,516,0,0,517,0,0,518,0,0,519,0,0,520,0,0,521,0,0,522,0,0,523,0,0,524,0,0,525,0,0,526,0,0,527,0,0,528,0,0,529,0,0,530,0,0,531,0,0,532,0,0,533,0,0,534,0,0,535,0,0,536,0,0,537,0,0,538,0,0,539,0,0,540,0,0,541,0,0,542,0,0,543,0,0,544,0,0,545,0,0,546,0,0,547,0,0,548,0,0,549,0,0,550,0,0,551,0,0,552,0,0,553,0,0,554,0,0,555,0,0,556,0,0,557,0,0,558,0,0,559,0,0,560,0,0,561,0,0,562,0,0,563,0,0,564,0,0,565,0,0,566,0,0,567,0,0,568,0,0,569,0,0,570,0,0,571,0,0,572,0,0,573,0,0,574,0,0,575,0,0,576,0,0,577,0,0,578,0,0,579,0,0,580,0,0,581,0,0,582,0,0,583,0,0,584,0,0,585,0,0,586,0,0,587,0,0,588,0,0,589,0,0,590,0,0,591,0,0,592,0,0,593,0,0,594,0,0,595,0,0,596,0,0,597,0,0,598,0,0,599,0,0,600,0,0,601,0,0,602,0,0,603,0,0,604,0,0,605,0,0,606,0,0,607,0,0,608,0,0,609,0,0,610,0,0,611,0,0,612,0,0,613,0,0,614,0,0,615,0,0,616,0,0,617,0,0,618,0,0,619,0,0,620,0,0,621,0,0,622,0,0,623,0,0,624,0,0,625,0,0,626,0,0,627,0,0,628,0,0,629,0,0,630,0,0,631,0,0,632,0,0,633,0,0,634,0,0,635,0,0,636,0,0,637,0,0,638,0,0,639,0,0,640,0,0,641,0,0,642,0,0,643,0,0,644,0,0,645,0,0,646,0,0,647,0,0,648,0,0,649,0,0,650,0,0,651,0,0,652,0,0,653,0,0,654,0,0,655,0,0,656,0,0,657,0,0,658,0,0,659,0,0,660,0,0,661,0,0,662,0,0,663,0,0,664,0,0,665,0,0,666,0,0,667,0,0,668,0,0,669,0,0,670,0,0,671,0,0,672,0,0,673,0,0,674,0,0,675,0,0,676,0,0,677,0,0,678,0,0,679,0,0,680,0,0,681,0,0,682,0,0,683,0,0,684,0,0,685,0,0,686,0,0,687,0,0,688,0,0,689,0,0,690,0,0,691,0,0,692,0,0,693,0,0,694,0,0,695,0,0,696,0,0,697,0,0,698,0,0,699,0,0,700,0,0,701,0,0,702,0,0,703,0,0,704,0,0,705,0,0,706,0,0,707,0,0,708,0,0,709,0,0,710,0,0,711,0,0,712,0,0,713,0,0,714,0,0,715,0,0,716,0,0,717,0,0,718,0,0,719,0,0,720,0,0,721,0,0,722,0,0,723,0,0,724,0,0,725,0,0,726,0,0,727,0,0,728,0,0,729,0,0,730,0,0,731,0,0,732,0,0,733,0,0,734,0,0,735,0,0,736,0,0,737,0,0,738,0,0,739,0,0,740,0,0,741,0,0,742,0,0,743,0,0,744,0,0,745,0,0,746,0,0,747,0,0,748,0,0,749,0,0,750,0,0,751,0,0,752,0,0,755,0,0,756,0,0,757,0,0,758,0,0,759,0,0,760,0,0,761,0,0,762,0,0,763,0,0,764,0,0,765,0,0,766,0,0,767,0,0,768,0,-1,770,0,-1,771,0,15,1,2,5,8,5,5,8,6,5,8,7,5,8,10,5,19,12,5,19,1643],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-2,1,-1,-2,-3,-4,-5,-6,-7,-8,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-2,-1,1,-1,1,-1,-2,-1,1,-1,1,-1,-2,-1,1,-1,1,-1,-2,-1,1,-1,1,-1,-2,-1,1,-1,1,-1,-2,-1,1,-1,1,-1,-2,-1,1,-1,1,-1,-2,-1,1,-1,1,-1,-2,-1,1,-1,1,-1,-2,-1,1,-1,1,-1,-2,-1,1,-1,1,-1,-2,-1,1,-1,1,-1,-2,-1,1,-1,1,-1,-2,-1,1,-1,1,-1,-2,-1,1,-1,1,-1,-2,-1,1,-1,1,-1,-2,-1,1,-1,1,-1,-2,-1,1,-1,1,-1,-2,-1,-2,-3,1,-1,-2,-3,1,-1,-2,-3,1,-1,-2,-3,1,-1,-2,-3,1,-1,-2,-3,1,-1,-2,-3,1,-1,-2,-3,1,-1,-2,-3,1,-1,-2,-3,1,-1,-2,-3,1,-1,-2,-3,1,-1,-2,-3,1,-1,-2,-3,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,10,-1,1,-1,1,-1,10,-1,1,-1,1,-1,10,-1,1,-1,1,-1,1,-1,-2,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-2,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-2,-3,1,-1,1,-1,1,-1,10,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,-2,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,7,7,7,7,7,23,24],[5,13,5,13,5,13,5,13,5,13,5,13,5,13,5,13,5,13,5,13,5,13,5,13,5,13,5,13,5,13,5,13,5,13,5,13,5,13,5,18,5,18,5,18,5,18,5,18,5,18,5,18,5,18,5,18,5,18,5,18,5,18,5,18,5,18,5,18,5,18,5,18,92,93,94,95,61,96,97,98,99,100,31,101,31,102,31,103,31,104,31,105,31,106,31,107,31,108,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,2,4,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,0,6,3,7,3,7,3,7,3,7,3,7,3,7,3,7,3,7,3,7,3,7,3,7,3,7,3,7,3,7,3,7,3,7,3,8,3,8,3,8,3,8,3,8,3,8,3,8,3,8,3,8,3,8,3,8,3,8,3,8,3,8,3,8,3,8,0,19,0,19,0,19,0,19,0,19,0,19,0,19,0,19,0,19,0,19,0,19,0,19,2,19,0,19,0,19,0,19,2,9,2,9,2,9,2,9,2,9,2,9,2,9,2,9,2,9,2,9,2,9,2,9,2,9,2,9,2,9,2,9,2,9,2,9,2,9,2,9,2,9,2,9,2,9,2,9,2,9,2,9,2,9,2,9,2,9,2,9,2,9,2,9,2,9,2,16,2,16,0,16,0,16,0,16,0,16,0,16,0,16,0,16,2,16,2,16,0,16,0,16,0,16,2,16,0,16,2,16,2,16,0,1,0,1,0,1,0,1,0,1,0,1,0,1,2,1,2,1,2,1,2,1,2,1,2,1,2,1,0,1,0,1,0,1,0,1,0,1,2,1,2,1,2,1,2,1,2,1,0,1,0,1,0,1,0,1,0,1,2,1,0,1,2,1,2,1,0,1,2,1,2,1,2,1,2,1,2,1,2,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,2,1,2,1,2,1,0,1,2,1,2,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,2,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,2,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,2,20,2,20,2,20,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,2,1,2,1,0,1,0,1,0,1,0,1,0,1,0,1,2,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,2,20,2,20,0,1,0,1,0,1,0,1,0,1,0,1,2,20,2,20,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,2,1,0,1,2,1,2,1,0,1,2,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,2,1,2,1,0,1,0,1,0,1,2,1,0,1,0,20,0,20,0,20,0,20,0,20,2,20,2,20,2,109,3,7,3,8,14,15,3,7,3,8,14,15,3,7,3,8,14,15,3,7,3,8,14,15,3,7,3,8,14,15,3,7,3,8,14,15,3,7,3,8,14,15,3,7,3,8,14,15,3,7,3,8,14,15,3,7,3,8,14,15,3,7,3,8,14,15,3,7,3,8,14,15,3,7,3,8,14,15,3,7,3,8,14,15,3,7,3,8,14,15,3,7,3,8,14,15,3,7,3,8,14,15,3,7,3,8,14,15,3,7,3,8,14,15,21,10,10,22,21,10,10,22,21,10,10,22,21,10,10,22,21,10,10,22,21,10,10,22,21,10,10,22,21,10,10,22,21,10,10,22,21,10,10,22,21,10,10,22,21,10,10,22,21,10,10,22,21,10,10,22,23,24,23,24,23,24,23,24,23,24,23,24,23,24,23,24,23,24,23,24,23,24,23,24,23,24,23,24,28,35,28,35,28,35,28,35,25,62,25,62,63,63,25,42,25,42,64,64,25,42,25,42,65,65,25,110,36,43,25,111,44,44,112,45,113,32,114,26,30,45,115,45,116,45,117,118,66,119,120,121,122,123,124,125,32,126,127,128,129,67,130,131,132,133,134,68,135,52,136,69,137,53,138,139,140,141,142,66,143,144,145,146,147,69,148,149,150,53,151,53,152,52,153,52,61,154,155,156,37,38,26,70,71,71,36,43,36,43,36,43,26,68,157,158,36,159,28,160,28,72,28,72,28,73,28,73,28,161,28,35,26,70,26,30,26,30,26,30,26,30,32,67,32,54,32,54,32,54,33,162,25,163,25,55,25,55,25,55,33,164,44,44,165,33,74,33,74,33,75,33,75,166,167,26,30,26,30,26,30,26,30,37,38,37,38,37,38,37,38,76,76,168,77,77,169,170]],[[[7,".bin",3887601249,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":8176,"length":2016,"count":504,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":8176,"count":146,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.3815542459487915,0.0008280110196210444,-0.3815537989139557],"maxPosition",8,[1,0.38155457377433777,1.4296848773956299,0.3815547227859497]]],-1],0,0,[],[],[]],[[[7,".bin",766854118,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":23184,"length":4896,"count":1224,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":23184,"count":414,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.20960646867752075,-0.034520264714956284,-0.21005544066429138],"maxPosition",8,[1,1.3885505199432373,1.32533597946167,0.2100556492805481]]],-1],0,0,[],[],[]],[[[7,".bin",2479076229,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":16184,"length":2652,"count":663,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":16184,"count":289,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.397676557302475,-0.2834802269935608,0.00021759033552370965],"maxPosition",8,[1,0.39767563343048096,0.28348013758659363,0.24894195795059204]]],-1],0,0,[],[],[]],[[[7,".bin",1573441429,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":14112,"length":4896,"count":1224,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":14112,"count":252,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.8186498880386353,0.0014357375912368298,-9.963736534118652],"maxPosition",8,[1,4.62232780456543,1.6394388675689697,9.963736534118652]]],-1],0,0,[],[],[]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true,"USE_EMISSIVE_MAP":true},{"USE_INSTANCING":true},{},{},{}],[[[{"roughness":1,"metallic":0},"emissive",8,[4,4294967295],"mainTexture",6,0,"emissiveMap",6,1],[{},"rimColor",8,[4,4280414714],"outlineParams",8,[2,10,0.1,0.1,1]],{},{},{}],11,11,0,0,0]]],0,0,[0,0,0],[3,4,2],[51,40,11]],[[[7,".bin",1248280929,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":4424,"length":576,"count":144,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":4424,"count":79,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.8917431831359863,0.00011126518074888736,-0.8474597334861755],"maxPosition",8,[1,0.8917431831359863,0.2451583743095398,0.8474597334861755]]],-1],0,0,[],[],[]],[[[7,".bin",3436739155,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":3808,"length":408,"count":102,"stride":4}},{"primitiveMode":7,"vertexBundelIndices":[1],"indexView":{"offset":9592,"length":1920,"count":480,"stride":4}},{"primitiveMode":7,"vertexBundelIndices":[2],"indexView":{"offset":16048,"length":1728,"count":432,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":3808,"count":68,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]},{"view":{"offset":4216,"length":5376,"count":96,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]},{"view":{"offset":11512,"length":4536,"count":81,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.30000001192092896,-0.30000001192092896,0],"maxPosition",8,[1,0.30000001192092896,0.30000001192092896,0.18137149512767792]]],-1],0,0,[],[],[]],[[[38,"blockNode"],[49,"blockNode",33554432,[[56,-2,[0,"2bEPS6wshJsIeXkVgHbx7R"],[5,1,1],[0,0,1]],[57,0,-3,[0,"7cDzc9sylIFK0VcZBfCwDY"],[4,2019845220],0],[86,-4,[0,"6doN28a7VLCpu5LONxYnY6"],1],[87,-5,[0,"63IhyxFvZJw4lxO34nH+Q5"]]],[1,"8cXHSoOjZKDJHMN4uM2L70",-1,0],[1,1,-1,0]]],0,[0,14,1,0,0,1,0,0,1,0,0,1,0,0,1,0,15,1,5],[0,0],[6,8],[56,56]],[[[7,".bin",2782255913,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":331688,"length":47736,"count":11934,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":331688,"count":5923,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-1.748907446861267,-0.06305219978094101,-0.9725958704948425],"maxPosition",8,[1,1.7489078044891357,1.3199330568313599,0.9725956916809082]]],-1],0,0,[],[],[]],[[[7,".bin",3735911807,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":896,"length":96,"count":24,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":896,"count":16,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.06290000677108765,-0.01332450844347477,0.00013632130867335945],"maxPosition",8,[1,0.06289996951818466,0.01332447025924921,0.11053075641393661]]],-1],0,0,[],[],[]],[[[7,".bin",1821199189,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":1120,"length":120,"count":30,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":1120,"count":20,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.14979885518550873,-0.10032898187637329,0.0001163482666015625],"maxPosition",8,[1,0.14979587495326996,0.10032959282398224,0.05474594235420227]]],-1],0,0,[],[],[]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true},{},{}],[[[{"roughness":1,"metallic":0},"mainTexture",6,0],{},{}],11,0,0]]],0,0,[0,0],[3,2],[171,12]],[[[7,".bin",350053123,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":41552,"length":7872,"count":1968,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":41552,"count":742,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.4522102475166321,0,-0.5241198539733887],"maxPosition",8,[1,0.45051878690719604,1.5948572158813477,0.37096133828163147]]],-1],0,0,[],[],[]],[[[88,"aStarMapEdit"],[69,"Canvas",512,"197IHMMCJFy7vkaMKpBDln",[-14,-15,-16,-17,-18,-19,-20,-21],[[22,-1,[5,1280,720]],[89,-3,-2],[90,45,-4],[91,-13,-12,-11,-10,-9,-8,-7,-6,-5,6,7,8]],[1,640,360,0]],[32,"saveJson",33554432,1,[-26],[[[22,-22,[5,120,40]],[34,1,0,-23,2],-24,[36,8,9.033999999999992,-25]],4,4,1,4],[1,-570.966,299.148,0]],[32,"gameMode",33554432,1,[-31],[[[22,-27,[5,120,40]],[34,1,0,-28,3],-29,[36,8,7.048999999999978,-30]],4,4,1,4],[1,-572.951,217.693,0]],[32,"reset",33554432,1,[-36],[[[22,-32,[5,120,40]],[34,1,0,-33,4],-34,[36,8,4.6159999999999854,-35]],4,4,1,4],[1,-575.384,141.281,0]],[32,"downliad",33554432,1,[-41],[[[22,-37,[5,120,40]],[34,1,0,-38,5],-39,[36,8,4.6159999999999854,-40]],4,4,1,4],[1,-575.384,64.94600000000003,0]],[92,"aStarMapEdit",[-42,-43,1],[77,"bc0172ab-cd8c-4962-a217-52f884e5d4a2"],[93,[94,0.78125,[2,0.2,0.5019607843137255,0.8,0.520833125],[2,0.2,0.5019607843137255,0.8,0.520833125]],[95,[4,4283190348]],[96],[97,[4,4292993505]],[98]]],[70,"searchPath",1,[[42,-44,[5,106,64],[0,0,1]],[84,false,0,-45,0]],[1,-53,-32,2.2115642650533136e-13],[3,0.7071067811865475,0,0,0.7071067811865476],[1,90,0,0]],[50,"p1",33554432,1,[[42,-46,[5,1,1],[0,0,1]],[85,0,-47,1]],[1,-35,-2,-4.700684286262907e-15],[3,0.7071067811865475,0,0,0.7071067811865476],[1,90,0,0]],[82,0,1073741824,360,2000,6,4294967295,[4,4278190080]],[50,"bg",33554432,1,[[42,-48,[5,106,64],[0,0,1]]],[1,-53,-32,7.327471962526033e-14],[3,0.7071067811865475,0,0,0.7071067811865476],[1,90,0,0]],[31,"Label",33554432,2,[[22,-49,[5,93.34,50.4]],[37,"保存JSON",20,20,-50,[4,4278190080]]]],[31,"Label",33554432,3,[[22,-51,[5,80,50.4]],[37,"寻路测试",20,20,-52,[4,4278190080]]]],[31,"Label",33554432,4,[[22,-53,[5,40,50.4]],[37,"重置",20,20,-54,[4,4278190080]]]],[31,"Label",33554432,5,[[22,-55,[5,93.34,50.4]],[37,"下载JSON",20,20,-56,[4,4278190080]]]],[71,"Main Light","c0y6F5f+pAvI805TdmxIjx",6,[[99,0.75,-57,[100]]],[3,-0.24999999999999997,-0.24999999999999997,-0.06698729810778066,0.9330127018922194],[1,-30,-30,0]],[72,"Main Camera","c9DMICJLFO5IeO07EPon7U",6,[[83,1822425087,-58]],[1,-10,10,10],[3,-0.27781593346944056,-0.36497167621709875,-0.11507512748638377,0.8811195706053617],[1,-35,-45,0]],[74,"Camera",1,[9],[1,0,0,1000]],[35,3,2,[4,4292269782],2],[35,3,3,[4,4292269782],3],[35,3,4,[4,4292269782],4],[35,3,5,[4,4292269782],5]],0,[0,0,1,0,25,9,0,0,1,0,0,1,0,26,8,0,27,10,0,28,7,0,29,9,0,30,21,0,31,19,0,32,20,0,33,18,0,0,1,0,-1,17,0,-2,7,0,-3,10,0,-4,8,0,-5,2,0,-6,3,0,-7,4,0,-8,5,0,0,2,0,0,2,0,-3,18,0,0,2,0,-1,11,0,0,3,0,0,3,0,-3,19,0,0,3,0,-1,12,0,0,4,0,0,4,0,-3,20,0,0,4,0,-1,13,0,0,5,0,0,5,0,-3,21,0,0,5,0,-1,14,0,-1,15,0,-2,16,0,0,7,0,0,7,0,0,8,0,0,8,0,0,10,0,0,11,0,0,11,0,0,12,0,0,12,0,0,13,0,0,13,0,0,14,0,0,14,0,0,15,0,0,16,0,34,6,1,5,6,9,0,17,58],[0,0,0,0,0,0,0,0,0,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21],[6,6,6,6,6,6,35,36,37,8,11,12,13,8,11,12,13,8,11,12,13,8,11,12,13],[172,173,27,27,27,27,174,175,176,27,27,46,47,27,27,46,47,27,27,46,47,27,27,46,47]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true,"USE_EMISSIVE_MAP":true},{},{}],[[[{"roughness":1,"metallic":0},"mainTexture",6,0],{},{}],11,0,0]]],0,0,[0,0],[3,2],[177,12]],[[[7,".bin",1011065623,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":896,"length":48,"count":24,"stride":2}}],"vertexBundles":[{"view":{"offset":0,"length":896,"count":16,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.06289999186992645,-0.01332450844347477,0.0003115552826784551],"maxPosition",8,[1,0.06289999186992645,0.01332447025924921,0.11070598661899567]]],-1],0,0,[],[],[]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true,"USE_EMISSIVE_MAP":true},{},{}],[[[{"roughness":1,"metallic":0},"mainColor",8,[4,4293651438],"emissive",8,[4,4279966491],"mainTexture",6,0,"emissiveMap",6,1],{},{}],11,0,0]]],0,0,[0,0,0],[3,4,2],[48,57,12]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true,"USE_EMISSIVE_MAP":true},{},{}],[[[{"roughness":1,"metallic":0},"mainTexture",6,0],{},{}],11,0,0]]],0,0,[0,0],[3,2],[178,12]],[[[7,".bin",759518562,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":12040,"length":1320,"count":330,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":12040,"count":215,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.29184502363204956,-0.20687370002269745,-0.22125473618507385],"maxPosition",8,[1,0.29184046387672424,0.20686942338943481,0.22120119631290436]]],-1],0,0,[],[],[]],[[[7,".bin",1430774915,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":39200,"length":4368,"count":1092,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":39200,"count":700,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.29713523387908936,-0.36298587918281555,0.00028726577875204384],"maxPosition",8,[1,0.2971377670764923,0.3629859387874603,0.33493566513061523]]],-1],0,0,[],[],[]],[[[7,".bin",3822345140,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":19040,"length":6336,"count":1584,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":19040,"count":340,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.08633628487586975,-0.18619613349437714,0.0003013873065356165],"maxPosition",8,[1,0.08633628487586975,0.18619567155838013,0.042585134506225586]]],-1],0,0,[],[],[]],[[[38,"blockNodeSp"],[49,"blockNodeSp",33554432,[[56,-2,[0,"2bEPS6wshJsIeXkVgHbx7R"],[5,1,1],[0,0,1]],[57,0,-3,[0,"7cDzc9sylIFK0VcZBfCwDY"],[4,4278190080],0]],[1,"8cXHSoOjZKDJHMN4uM2L70",-1,0],[1,1,-1,0]]],0,[0,14,1,0,0,1,0,0,1,0,15,1,3],[0],[6],[56]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true,"USE_EMISSIVE_MAP":true},{"USE_INSTANCING":true},{},{},{}],[[[{"roughness":1,"metallic":0},"emissive",8,[4,4294967295],"mainTexture",6,0,"emissiveMap",6,1],[{},"rimColor",8,[4,4280414714],"outlineParams",8,[2,10,0.1,0.1,1]],{},{},{}],11,11,0,0,0]]],0,0,[0,0,0],[3,4,2],[34,41,11]],[[[7,".bin",1607323220,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":79072,"length":13200,"count":3300,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":79072,"count":1412,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.7261914014816284,-10.604714393615723,-0.001465759240090847],"maxPosition",8,[1,4.212759971618652,0.7340289354324341,1.5127153396606445]]],-1],0,0,[],[],[]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true,"USE_EMISSIVE_MAP":true},{},{}],[[[{"roughness":1,"metallic":0},"emissive",8,[4,4294967295],"mainTexture",6,0,"emissiveMap",6,1],{},{}],11,0,0]]],0,0,[0,0,0],[3,4,2],[179,180,12]],[[[7,".bin",524416370,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":8512,"length":864,"count":216,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":8512,"count":152,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.7505772113800049,-1.312156319618225,0.004842300433665514],"maxPosition",8,[1,0.7505740523338318,1.3121570348739624,0.19087299704551697]]],-1],0,0,[],[],[]],[[[7,".bin",1173447671,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":70752,"length":19416,"count":4854,"stride":4}},{"primitiveMode":7,"vertexBundelIndices":[1],"indexView":{"offset":97320,"length":1680,"count":420,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":70752,"count":1474,"stride":48},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false}]},{"view":{"offset":90168,"length":7152,"count":149,"stride":48},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false}]}]},"minPosition",8,[1,-0.2237720489501953,-0.5368871688842773,-0.7244116067886353],"maxPosition",8,[1,1.5805026292800903,0.3240506052970886,0.03414344787597656]]],-1],0,0,[],[],[]],[[[7,".bin",1093888024,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":10080,"length":3648,"count":912,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":10080,"count":180,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.06372657418251038,-0.045223694294691086,-0.0004993438487872481],"maxPosition",8,[1,0.06372642517089844,0.04522338882088661,0.04179475083947182]]],-1],0,0,[],[],[]],[[[7,".bin",154618002,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":9240,"length":1344,"count":336,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":9240,"count":165,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.6130566596984863,-0.36358073353767395,-0.027796555310487747],"maxPosition",8,[1,0.6130566596984863,0.36357587575912476,0.027796555310487747]]],-1],0,0,[],[],[]],[[[43,"09 - Default",[{"rasterizerState":{},"blendState":{"targets":[{}]},"depthStencilState":{}}],[{"HAS_SECOND_UV":true}],[[[{"metallic":0.4000000059604645,"roughness":0.7071067690849304},"albedoScale",8,[1,0.019607843831181526,0.019607843831181526,0.019607843831181526]]],11]]],0,0,[0],[2],[12]],[[[43,"08 - Default",[{"rasterizerState":{},"blendState":{"targets":[{}]},"depthStencilState":{}}],[{"HAS_SECOND_UV":true}],[[[{"metallic":0.4000000059604645,"roughness":0.7071067690849304},"albedoScale",8,[1,0.38823530077934265,0,0]]],11]]],0,0,[0],[2],[12]],[[[7,".bin",1670324997,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":1176,"length":192,"count":48,"stride":4}},{"primitiveMode":7,"vertexBundelIndices":[1],"indexView":{"offset":22312,"length":2592,"count":648,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":1176,"count":21,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]},{"view":{"offset":1368,"length":20944,"count":374,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-79.66519165039062,-33.91775894165039,-9.55679702758789],"maxPosition",8,[1,62.62726974487305,35.454315185546875,2.496403694152832]]],-1],0,0,[],[],[]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true,"USE_EMISSIVE_MAP":true},{"USE_INSTANCING":true},{},{},{}],[[[{"roughness":1,"metallic":0},"emissive",8,[4,4294967295],"mainTexture",6,0,"emissiveMap",6,1],[{},"rimColor",8,[4,4280414714],"outlineParams",8,[2,10,0.1,0.1,1]],{},{},{}],11,11,0,0,0]]],0,0,[0,0,0],[3,4,2],[34,41,11]],[[[7,".bin",4220577756,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":11648,"length":1296,"count":324,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":11648,"count":208,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.6569099426269531,0.0027438735123723745,-1.3138201236724854],"maxPosition",8,[1,0.6569099426269531,0.9881091117858887,1.3138197660446167]]],-1],0,0,[],[],[]],[[[7,".bin",491586515,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":5040,"length":264,"count":132,"stride":2}}],"vertexBundles":[{"view":{"offset":0,"length":5040,"count":90,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.06366706639528275,-0.018395690247416496,0.0002044743741862476],"maxPosition",8,[1,0.06366705149412155,0.01839565299451351,0.11069812625646591]]],-1],0,0,[],[],[]],[[[7,".bin",449333990,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":53928,"length":11040,"count":2760,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":53928,"count":963,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.40135374665260315,-0.033627815544605255,-0.2829330861568451],"maxPosition",8,[1,0.40135467052459717,0.33803465962409973,0.4393978714942932]]],-1],0,0,[],[],[]],[[[27,"sfx_door",".mp3",1.404],-1],0,0,[],[],[]],[[[7,".bin",2903921200,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":45136,"length":7080,"count":1770,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":45136,"count":806,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.5572705268859863,-0.4266248941421509,-0.4634547531604767],"maxPosition",8,[1,0.5572705268859863,0.42662450671195984,0.8017584085464478]]],-1],0,0,[],[],[]],[[[7,".bin",3520226258,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":12320,"length":4032,"count":1008,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":12320,"count":220,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.11016845703125,-0.08460037410259247,-0.0004354882112238556],"maxPosition",8,[1,0.11016838252544403,0.08460021764039993,0.041858576238155365]]],-1],0,0,[],[],[]],[[[7,".bin",4048669237,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":35336,"length":10248,"count":2562,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":35336,"count":631,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.5039432048797607,-0.4862048625946045,-0.2050619125366211],"maxPosition",8,[1,0.5039436221122742,0.4861995577812195,0.20506204664707184]]],-1],0,0,[],[],[]],[[[7,".bin",2894870363,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":672,"length":72,"count":18,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":672,"count":12,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.13185541331768036,-0.014560661278665066,0.000005975141903036274],"maxPosition",8,[1,0.13290400803089142,0.014560661278665066,0.0018000470008701086]]],-1],0,0,[],[],[]],[[[7,".bin",1825168680,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":36400,"length":12960,"count":3240,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":36400,"count":650,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.6175282001495361,-0.0003618097398430109,-5.734411239624023],"maxPosition",8,[1,2.94289493560791,0.1136951744556427,0.6188642978668213]]],-1],0,0,[],[],[]],[[[7,".bin",243393690,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":19152,"length":2640,"count":660,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":19152,"count":342,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.5675475597381592,-1.5352221727371216,0.014175338670611382],"maxPosition",8,[1,0.5675458312034607,1.535223364830017,1.1878867149353027]]],-1],0,0,[],[],[]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{}],[{"USE_INSTANCING":true},{},{}],[[[{"roughness":1,"metallic":0},"mainColor",8,[4,1610663423]],{},{}],11,0,0]]],0,0,[0],[2],[12]],[[[7,".bin",357636230,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":55328,"length":14040,"count":3510,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":55328,"count":988,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.9173374176025391,-1.4018996953964233,0.0005857085925526917],"maxPosition",8,[1,0.9148359894752502,1.4018996953964233,0.9336037635803223]]],-1],0,0,[],[],[]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true,"USE_EMISSIVE_MAP":true},{"USE_INSTANCING":true},{},{},{}],[[[{"roughness":1,"metallic":0},"emissive",8,[4,4279966491],"mainTexture",6,0,"emissiveMap",6,1],[{},"rimColor",8,[4,4280414714],"outlineParams",8,[2,10,0.1,0.1,1]],{},{},{}],11,11,0,0,0]]],0,0,[0,0,0],[3,4,2],[17,17,11]],[[[7,".bin",3135730628,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":7672,"length":864,"count":216,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":7672,"count":137,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.7505775690078735,-1.312155842781067,-0.0009612655849196017],"maxPosition",8,[1,0.7505736947059631,1.312157154083252,0.2075108289718628]]],-1],0,0,[],[],[]],[[[7,".bin",1889976553,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":1120,"length":120,"count":30,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":1120,"count":20,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-0.12498699128627777,-0.09111938625574112,-0.0000782012939453125],"maxPosition",8,[1,0.12498527765274048,0.09112182259559631,0.031238632276654243]]],-1],0,0,[],[],[]],[[[7,".bin",435466683,[{"primitives":[{"primitiveMode":7,"vertexBundelIndices":[0],"indexView":{"offset":47488,"length":8544,"count":2136,"stride":4}}],"vertexBundles":[{"view":{"offset":0,"length":47488,"count":848,"stride":56},"attributes":[{"name":"a_position","format":32,"isNormalized":false},{"name":"a_normal","format":32,"isNormalized":false},{"name":"a_texCoord","format":21,"isNormalized":false},{"name":"a_tangent","format":44,"isNormalized":false},{"name":"a_texCoord1","format":21,"isNormalized":false}]}]},"minPosition",8,[1,-2.234006404876709,-1.11862051486969,-0.0010303497547283769],"maxPosition",8,[1,2.2238645553588867,1.1300134658813477,1.2605289220809937]]],-1],0,0,[],[],[]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{}],[{"USE_INSTANCING":true,"USE_ALBEDO_MAP":true,"USE_EMISSIVE_MAP":true},{},{}],[[[{"roughness":1,"metallic":0},"emissive",8,[4,4294967295],"mainTexture",6,0,"emissiveMap",6,1],{},{}],11,0,0]]],0,0,[0,0,0],[3,4,2],[34,41,12]],[[[10,[{"rasterizerState":{},"depthStencilState":{},"blendState":{"targets":[{}]}},{},{}],[{"USE_INSTANCING":true},{},{}],[[[{"roughness":1,"metallic":0},"mainColor",8,[4,1610612736]],{},{}],11,0,0]]],0,0,[0],[2],[12]]]]
